diff options
author | gibbs <gibbs@FreeBSD.org> | 1998-11-10 06:44:54 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 1998-11-10 06:44:54 +0000 |
commit | 12c10932ccb801caf51fe0c36160a63c47c30821 (patch) | |
tree | e1da86a46f5875e7efd3c258990c3555b79207b4 /sys | |
parent | de6b8e170af7d1f2104bda47abec30de3677cabc (diff) | |
download | FreeBSD-src-12c10932ccb801caf51fe0c36160a63c47c30821.zip FreeBSD-src-12c10932ccb801caf51fe0c36160a63c47c30821.tar.gz |
Fix probes when a port address is specified.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/advansys/adv_isa.c | 4 | ||||
-rw-r--r-- | sys/dev/aha/aha_isa.c | 36 | ||||
-rw-r--r-- | sys/dev/buslogic/bt.c | 121 | ||||
-rw-r--r-- | sys/dev/buslogic/bt_isa.c | 29 | ||||
-rw-r--r-- | sys/dev/buslogic/btreg.h | 12 | ||||
-rw-r--r-- | sys/i386/isa/adv_isa.c | 4 | ||||
-rw-r--r-- | sys/i386/isa/aha_isa.c | 36 | ||||
-rw-r--r-- | sys/i386/isa/bt_isa.c | 29 | ||||
-rw-r--r-- | sys/isa/bt_isa.c | 29 |
9 files changed, 157 insertions, 143 deletions
diff --git a/sys/dev/advansys/adv_isa.c b/sys/dev/advansys/adv_isa.c index 09fe9f2..d0c2d4a 100644 --- a/sys/dev/advansys/adv_isa.c +++ b/sys/dev/advansys/adv_isa.c @@ -44,7 +44,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: adv_isa.c,v 1.5 1998/10/10 00:44:12 imp Exp $ + * $Id: adv_isa.c,v 1.6 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -122,7 +122,7 @@ advisaprobe(struct isa_device *id) if (id->id_iobase > 0) { for (;port_index <= max_port_index; port_index++) - if (id->id_iobase >= adv_isa_ioports[port_index]) + if (id->id_iobase <= adv_isa_ioports[port_index]) break; if ((port_index > max_port_index) || (id->id_iobase != adv_isa_ioports[port_index])) { diff --git a/sys/dev/aha/aha_isa.c b/sys/dev/aha/aha_isa.c index 5f81ea1..f718330 100644 --- a/sys/dev/aha/aha_isa.c +++ b/sys/dev/aha/aha_isa.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: aha_isa.c,v 1.3 1998/10/10 00:44:12 imp Exp $ + * $Id: aha_isa.c,v 1.4 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -68,7 +68,7 @@ aha_isa_probe(dev) */ struct aha_softc *aha; int port_index; - int max_port_index; + int max_port_index; /* * We ignore the unit number assigned by config to allow @@ -79,30 +79,15 @@ aha_isa_probe(dev) dev->id_unit = aha_unit; aha = NULL; - port_index = 0; - max_port_index = AHA_NUM_ISAPORTS - 1; + /* * Bound our board search if the user has * specified an exact port. */ - if (dev->id_iobase > 0) { - for (;port_index <= max_port_index; port_index++) - if (dev->id_iobase >= aha_isa_ports[port_index].addr) - break; - if ((port_index > max_port_index) - || (dev->id_iobase != aha_isa_ports[port_index].addr)) { - printf(" -aha_isa_probe: Invalid baseport of 0x%x specified. -aha_isa_probe: Nearest valid baseport is 0x%x. -aha_isa_probe: Failing probe.\n", - dev->id_iobase, - (port_index <= max_port_index) - ? aha_isa_ports[port_index].addr - : aha_isa_ports[max_port_index].addr); - return 0; - } - max_port_index = port_index; - } + aha_find_probe_range(dev->id_iobase, &port_index, &max_port_index); + + if (port_index < 0) + return 0; /* Attempt to find an adapter */ for (;port_index <= max_port_index; port_index++) { @@ -110,7 +95,7 @@ aha_isa_probe: Failing probe.\n", u_int ioport; int error; - ioport = aha_isa_ports[port_index].addr; + ioport = aha_iop_from_bio(port_index); /* * Ensure this port has not already been claimed already @@ -118,7 +103,7 @@ aha_isa_probe: Failing probe.\n", */ if (aha_check_probed_iop(ioport) != 0) continue; - dev->id_iobase = aha_isa_ports[port_index].addr; + dev->id_iobase = ioport; if (haveseen_isadev(dev, CC_IOADDR | CC_QUIET)) continue; @@ -141,7 +126,7 @@ aha_isa_probe: Failing probe.\n", * Determine our IRQ, and DMA settings and * export them to the configuration system. */ - error = aha_cmd(aha, BOP_INQUIRE_CONFIG, NULL, /*parmlen*/0, + error = aha_cmd(aha, AOP_INQUIRE_CONFIG, NULL, /*parmlen*/0, (u_int8_t*)&config_data, sizeof(config_data), DEFAULT_CMD_TIMEOUT); if (error != 0) { @@ -166,6 +151,7 @@ aha_isa_probe: Failing probe.\n", printf("aha_isa_probe: Invalid DMA setting " "detected for adapter at 0x%x. " "Failing probe\n", ioport); + return (0); } dev->id_irq = (config_data.irq << 9); dev->id_intr = aha_isa_intr; diff --git a/sys/dev/buslogic/bt.c b/sys/dev/buslogic/bt.c index 8c4b3e2..57a885b 100644 --- a/sys/dev/buslogic/bt.c +++ b/sys/dev/buslogic/bt.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bt.c,v 1.7 1998/10/15 23:46:28 gibbs Exp $ + * $Id: bt.c,v 1.8 1998/10/30 02:06:44 gibbs Exp $ */ /* @@ -181,12 +181,26 @@ u_long bt_unit = 0; */ struct bt_isa_port bt_isa_ports[] = { - { 0x330, 0 }, - { 0x334, 0 }, - { 0x230, 0 }, - { 0x234, 0 }, - { 0x130, 0 }, - { 0x134, 0 } + { 0x130, 0, 4 }, + { 0x134, 0, 5 }, + { 0x230, 0, 2 }, + { 0x234, 0, 3 }, + { 0x330, 0, 0 }, + { 0x334, 0, 1 } +}; + +/* + * I/O ports listed in the order enumerated by the + * card for certain op codes. + */ +u_int16_t bt_board_ports[] = +{ + 0x330, + 0x334, + 0x230, + 0x234, + 0x130, + 0x134 }; /* Exported functions */ @@ -814,7 +828,7 @@ bt_check_probed_iop(u_int ioport) { u_int i; - for (i=0; i < BT_NUM_ISAPORTS; i++) { + for (i = 0; i < BT_NUM_ISAPORTS; i++) { if (bt_isa_ports[i].addr == ioport) { if (bt_isa_ports[i].probed != 0) return (1); @@ -826,17 +840,11 @@ bt_check_probed_iop(u_int ioport) return (1); } -u_int -bt_fetch_isa_iop(isa_compat_io_t port) -{ - return (bt_isa_ports[port].addr); -} - void bt_mark_probed_bio(isa_compat_io_t port) { if (port < BIO_DISABLED) - bt_isa_ports[port].probed = 1; + bt_mark_probed_iop(bt_board_ports[port]); } void @@ -852,6 +860,44 @@ bt_mark_probed_iop(u_int ioport) } } +void +bt_find_probe_range(int ioport, int *port_index, int *max_port_index) +{ + if (ioport > 0) { + int i; + + for (i = 0;i < BT_NUM_ISAPORTS; i++) + if (ioport <= bt_isa_ports[i].addr) + break; + if ((i >= BT_NUM_ISAPORTS) + || (ioport != bt_isa_ports[i].addr)) { + printf(" +bt_isa_probe: Invalid baseport of 0x%x specified. +bt_isa_probe: Nearest valid baseport is 0x%x. +bt_isa_probe: Failing probe.\n", + ioport, + (i < BT_NUM_ISAPORTS) + ? bt_isa_ports[i].addr + : bt_isa_ports[BT_NUM_ISAPORTS - 1].addr); + *port_index = *max_port_index = -1; + return; + } + *port_index = *max_port_index = bt_isa_ports[i].bio; + } else { + *port_index = 0; + *max_port_index = BT_NUM_ISAPORTS - 1; + } +} + +int +bt_iop_from_bio(isa_compat_io_t bio_index) +{ + if (bio_index >= 0 && bio_index < BT_NUM_ISAPORTS) + return (bt_board_ports[bio_index]); + return (-1); +} + + static void btallocccbs(struct bt_softc *bt) { @@ -924,6 +970,7 @@ btfreeccb(struct bt_softc *bt, struct bt_ccb *bccb) } bccb->flags = BCCB_FREE; SLIST_INSERT_HEAD(&bt->free_bt_ccbs, bccb, links); + bt->active_ccbs--; splx(s); } @@ -936,13 +983,16 @@ btgetccb(struct bt_softc *bt) s = splcam(); if ((bccb = SLIST_FIRST(&bt->free_bt_ccbs)) != NULL) { SLIST_REMOVE_HEAD(&bt->free_bt_ccbs, links); + bt->active_ccbs++; } else if (bt->num_ccbs < bt->max_ccbs) { btallocccbs(bt); bccb = SLIST_FIRST(&bt->free_bt_ccbs); if (bccb == NULL) printf("%s: Can't malloc BCCB\n", bt_name(bt)); - else + else { SLIST_REMOVE_HEAD(&bt->free_bt_ccbs, links); + bt->active_ccbs++; + } } splx(s); @@ -1347,8 +1397,27 @@ btexecuteccb(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) /* Tell the adapter about this command */ bt->cur_outbox->ccb_addr = btccbvtop(bt, bccb); - if (bt->cur_outbox->action_code != BMBO_FREE) - panic("%s: Too few mailboxes or to many ccbs???", bt_name(bt)); + if (bt->cur_outbox->action_code != BMBO_FREE) { + /* + * We should never encounter a busy mailbox. + * If we do, warn the user, and treat it as + * a resource shortage. If the controller is + * hung, one of the pending transactions will + * timeout causing us to start recovery operations. + */ + printf("%s: Encountered busy mailbox with %d out of %d " + "commands active!!!", bt_name(bt), bt->active_ccbs, + bt->max_ccbs); + untimeout(bttimeout, bccb, ccb->ccb_h.timeout_ch); + if (nseg != 0) + bus_dmamap_unload(bt->buffer_dmat, bccb->dmamap); + btfreeccb(bt, bccb); + bt->resource_shortage = TRUE; + xpt_freeze_simq(bt->sim, /*count*/1); + ccb->ccb_h.status = CAM_REQUEUE_REQ; + xpt_done(ccb); + return; + } bt->cur_outbox->action_code = BMBO_START; bt_outb(bt, COMMAND_REG, BOP_START_MBOX); btnextoutbox(bt); @@ -1469,14 +1538,20 @@ btdone(struct bt_softc *bt, struct bt_ccb *bccb, bt_mbi_comp_code_t comp_code) break; case BMBI_ABORT: case BMBI_ERROR: -#if 0 - printf("bt: ccb %x - error %x occured. btstat = %x, sdstat = %x\n", - bccb, comp_code, bccb->hccb.btstat, bccb->hccb.sdstat); -#endif + printf("bt: ccb %p - error %x occured. " + "btstat = %x, sdstat = %x\n", + (void *)bccb, comp_code, bccb->hccb.btstat, + bccb->hccb.sdstat); /* An error occured */ switch(bccb->hccb.btstat) { case BTSTAT_DATARUN_ERROR: - if (bccb->hccb.data_len <= 0) { + if (bccb->hccb.data_len == 0) { + /* + * At least firmware 4.22, does this + * for a QUEUE FULL condition. + */ + bccb->hccb.sdstat = SCSI_STATUS_QUEUE_FULL; + } else if (bccb->hccb.data_len < 0) { csio->ccb_h.status = CAM_DATA_RUN_ERR; break; } diff --git a/sys/dev/buslogic/bt_isa.c b/sys/dev/buslogic/bt_isa.c index 8009a36..f646f85 100644 --- a/sys/dev/buslogic/bt_isa.c +++ b/sys/dev/buslogic/bt_isa.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bt_isa.c,v 1.3 1998/10/10 00:44:12 imp Exp $ + * $Id: bt_isa.c,v 1.4 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -86,24 +86,10 @@ bt_isa_probe(dev) * Bound our board search if the user has * specified an exact port. */ - if (dev->id_iobase > 0) { - for (;port_index <= max_port_index; port_index++) - if (dev->id_iobase >= bt_isa_ports[port_index].addr) - break; - if ((port_index > max_port_index) - || (dev->id_iobase != bt_isa_ports[port_index].addr)) { - printf(" -bt_isa_probe: Invalid baseport of 0x%x specified. -bt_isa_probe: Nearest valid baseport is 0x%x. -bt_isa_probe: Failing probe.\n", - dev->id_iobase, - (port_index <= max_port_index) - ? bt_isa_ports[port_index].addr - : bt_isa_ports[max_port_index].addr); - return 0; - } - max_port_index = port_index; - } + bt_find_probe_range(dev->id_iobase, &port_index, &max_port_index); + + if (port_index < 0) + return 0; /* Attempt to find an adapter */ for (;port_index <= max_port_index; port_index++) { @@ -111,7 +97,7 @@ bt_isa_probe: Failing probe.\n", u_int ioport; int error; - ioport = bt_isa_ports[port_index].addr; + ioport = bt_iop_from_bio(port_index); /* * Ensure this port has not already been claimed already @@ -119,7 +105,7 @@ bt_isa_probe: Failing probe.\n", */ if (bt_check_probed_iop(ioport) != 0) continue; - dev->id_iobase = bt_isa_ports[port_index].addr; + dev->id_iobase = ioport; if (haveseen_isadev(dev, CC_IOADDR | CC_QUIET)) continue; @@ -169,6 +155,7 @@ bt_isa_probe: Failing probe.\n", printf("bt_isa_probe: Invalid DMA setting " "detected for adapter at 0x%x. " "Failing probe\n", ioport); + return (0); } } else { /* VL DMA */ diff --git a/sys/dev/buslogic/btreg.h b/sys/dev/buslogic/btreg.h index 2dc3cf5..fa049bc 100644 --- a/sys/dev/buslogic/btreg.h +++ b/sys/dev/buslogic/btreg.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: btreg.h,v 1.1 1998/09/15 07:32:49 gibbs Exp $ + * $Id: btreg.h,v 1.2 1998/10/30 02:06:44 gibbs Exp $ */ #ifndef _BTREG_H_ @@ -408,6 +408,7 @@ typedef struct { struct bt_isa_port { u_int16_t addr; u_int8_t probed; + u_int8_t bio; }; extern struct bt_isa_port bt_isa_ports[]; @@ -549,7 +550,7 @@ struct bt_hccb { wide_tag_type :2; /* Wide Lun CCB format */ u_int8_t cmd_len; u_int8_t sense_len; - u_int32_t data_len; + int32_t data_len; /* residuals can be negative */ u_int32_t data_addr; u_int8_t reserved[2]; u_int8_t btstat; @@ -599,6 +600,7 @@ struct bt_softc { struct bt_ccb *bt_ccb_array; SLIST_HEAD(,bt_ccb) free_bt_ccbs; LIST_HEAD(,ccb_hdr) pending_ccbs; + u_int active_ccbs; u_int32_t bt_ccb_physbase; bt_mbox_in_t *in_boxes; bt_mbox_out_t *out_boxes; @@ -664,9 +666,13 @@ int bt_attach(struct bt_softc *bt); void bt_intr(void *arg); char * bt_name(struct bt_softc *bt); int bt_check_probed_iop(u_int ioport); -u_int bt_fetch_isa_iop(isa_compat_io_t port); void bt_mark_probed_bio(isa_compat_io_t port); void bt_mark_probed_iop(u_int ioport); +void bt_find_probe_range(int ioport, + int *port_index, + int *max_port_index); + +int bt_iop_from_bio(isa_compat_io_t bio_index); #define DEFAULT_CMD_TIMEOUT 10000 /* 1 sec */ int bt_cmd(struct bt_softc *bt, bt_op_t opcode, diff --git a/sys/i386/isa/adv_isa.c b/sys/i386/isa/adv_isa.c index 09fe9f2..d0c2d4a 100644 --- a/sys/i386/isa/adv_isa.c +++ b/sys/i386/isa/adv_isa.c @@ -44,7 +44,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: adv_isa.c,v 1.5 1998/10/10 00:44:12 imp Exp $ + * $Id: adv_isa.c,v 1.6 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -122,7 +122,7 @@ advisaprobe(struct isa_device *id) if (id->id_iobase > 0) { for (;port_index <= max_port_index; port_index++) - if (id->id_iobase >= adv_isa_ioports[port_index]) + if (id->id_iobase <= adv_isa_ioports[port_index]) break; if ((port_index > max_port_index) || (id->id_iobase != adv_isa_ioports[port_index])) { diff --git a/sys/i386/isa/aha_isa.c b/sys/i386/isa/aha_isa.c index 5f81ea1..f718330 100644 --- a/sys/i386/isa/aha_isa.c +++ b/sys/i386/isa/aha_isa.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: aha_isa.c,v 1.3 1998/10/10 00:44:12 imp Exp $ + * $Id: aha_isa.c,v 1.4 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -68,7 +68,7 @@ aha_isa_probe(dev) */ struct aha_softc *aha; int port_index; - int max_port_index; + int max_port_index; /* * We ignore the unit number assigned by config to allow @@ -79,30 +79,15 @@ aha_isa_probe(dev) dev->id_unit = aha_unit; aha = NULL; - port_index = 0; - max_port_index = AHA_NUM_ISAPORTS - 1; + /* * Bound our board search if the user has * specified an exact port. */ - if (dev->id_iobase > 0) { - for (;port_index <= max_port_index; port_index++) - if (dev->id_iobase >= aha_isa_ports[port_index].addr) - break; - if ((port_index > max_port_index) - || (dev->id_iobase != aha_isa_ports[port_index].addr)) { - printf(" -aha_isa_probe: Invalid baseport of 0x%x specified. -aha_isa_probe: Nearest valid baseport is 0x%x. -aha_isa_probe: Failing probe.\n", - dev->id_iobase, - (port_index <= max_port_index) - ? aha_isa_ports[port_index].addr - : aha_isa_ports[max_port_index].addr); - return 0; - } - max_port_index = port_index; - } + aha_find_probe_range(dev->id_iobase, &port_index, &max_port_index); + + if (port_index < 0) + return 0; /* Attempt to find an adapter */ for (;port_index <= max_port_index; port_index++) { @@ -110,7 +95,7 @@ aha_isa_probe: Failing probe.\n", u_int ioport; int error; - ioport = aha_isa_ports[port_index].addr; + ioport = aha_iop_from_bio(port_index); /* * Ensure this port has not already been claimed already @@ -118,7 +103,7 @@ aha_isa_probe: Failing probe.\n", */ if (aha_check_probed_iop(ioport) != 0) continue; - dev->id_iobase = aha_isa_ports[port_index].addr; + dev->id_iobase = ioport; if (haveseen_isadev(dev, CC_IOADDR | CC_QUIET)) continue; @@ -141,7 +126,7 @@ aha_isa_probe: Failing probe.\n", * Determine our IRQ, and DMA settings and * export them to the configuration system. */ - error = aha_cmd(aha, BOP_INQUIRE_CONFIG, NULL, /*parmlen*/0, + error = aha_cmd(aha, AOP_INQUIRE_CONFIG, NULL, /*parmlen*/0, (u_int8_t*)&config_data, sizeof(config_data), DEFAULT_CMD_TIMEOUT); if (error != 0) { @@ -166,6 +151,7 @@ aha_isa_probe: Failing probe.\n", printf("aha_isa_probe: Invalid DMA setting " "detected for adapter at 0x%x. " "Failing probe\n", ioport); + return (0); } dev->id_irq = (config_data.irq << 9); dev->id_intr = aha_isa_intr; diff --git a/sys/i386/isa/bt_isa.c b/sys/i386/isa/bt_isa.c index 8009a36..f646f85 100644 --- a/sys/i386/isa/bt_isa.c +++ b/sys/i386/isa/bt_isa.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bt_isa.c,v 1.3 1998/10/10 00:44:12 imp Exp $ + * $Id: bt_isa.c,v 1.4 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -86,24 +86,10 @@ bt_isa_probe(dev) * Bound our board search if the user has * specified an exact port. */ - if (dev->id_iobase > 0) { - for (;port_index <= max_port_index; port_index++) - if (dev->id_iobase >= bt_isa_ports[port_index].addr) - break; - if ((port_index > max_port_index) - || (dev->id_iobase != bt_isa_ports[port_index].addr)) { - printf(" -bt_isa_probe: Invalid baseport of 0x%x specified. -bt_isa_probe: Nearest valid baseport is 0x%x. -bt_isa_probe: Failing probe.\n", - dev->id_iobase, - (port_index <= max_port_index) - ? bt_isa_ports[port_index].addr - : bt_isa_ports[max_port_index].addr); - return 0; - } - max_port_index = port_index; - } + bt_find_probe_range(dev->id_iobase, &port_index, &max_port_index); + + if (port_index < 0) + return 0; /* Attempt to find an adapter */ for (;port_index <= max_port_index; port_index++) { @@ -111,7 +97,7 @@ bt_isa_probe: Failing probe.\n", u_int ioport; int error; - ioport = bt_isa_ports[port_index].addr; + ioport = bt_iop_from_bio(port_index); /* * Ensure this port has not already been claimed already @@ -119,7 +105,7 @@ bt_isa_probe: Failing probe.\n", */ if (bt_check_probed_iop(ioport) != 0) continue; - dev->id_iobase = bt_isa_ports[port_index].addr; + dev->id_iobase = ioport; if (haveseen_isadev(dev, CC_IOADDR | CC_QUIET)) continue; @@ -169,6 +155,7 @@ bt_isa_probe: Failing probe.\n", printf("bt_isa_probe: Invalid DMA setting " "detected for adapter at 0x%x. " "Failing probe\n", ioport); + return (0); } } else { /* VL DMA */ diff --git a/sys/isa/bt_isa.c b/sys/isa/bt_isa.c index 8009a36..f646f85 100644 --- a/sys/isa/bt_isa.c +++ b/sys/isa/bt_isa.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bt_isa.c,v 1.3 1998/10/10 00:44:12 imp Exp $ + * $Id: bt_isa.c,v 1.4 1998/10/12 18:53:33 imp Exp $ */ #include <sys/param.h> @@ -86,24 +86,10 @@ bt_isa_probe(dev) * Bound our board search if the user has * specified an exact port. */ - if (dev->id_iobase > 0) { - for (;port_index <= max_port_index; port_index++) - if (dev->id_iobase >= bt_isa_ports[port_index].addr) - break; - if ((port_index > max_port_index) - || (dev->id_iobase != bt_isa_ports[port_index].addr)) { - printf(" -bt_isa_probe: Invalid baseport of 0x%x specified. -bt_isa_probe: Nearest valid baseport is 0x%x. -bt_isa_probe: Failing probe.\n", - dev->id_iobase, - (port_index <= max_port_index) - ? bt_isa_ports[port_index].addr - : bt_isa_ports[max_port_index].addr); - return 0; - } - max_port_index = port_index; - } + bt_find_probe_range(dev->id_iobase, &port_index, &max_port_index); + + if (port_index < 0) + return 0; /* Attempt to find an adapter */ for (;port_index <= max_port_index; port_index++) { @@ -111,7 +97,7 @@ bt_isa_probe: Failing probe.\n", u_int ioport; int error; - ioport = bt_isa_ports[port_index].addr; + ioport = bt_iop_from_bio(port_index); /* * Ensure this port has not already been claimed already @@ -119,7 +105,7 @@ bt_isa_probe: Failing probe.\n", */ if (bt_check_probed_iop(ioport) != 0) continue; - dev->id_iobase = bt_isa_ports[port_index].addr; + dev->id_iobase = ioport; if (haveseen_isadev(dev, CC_IOADDR | CC_QUIET)) continue; @@ -169,6 +155,7 @@ bt_isa_probe: Failing probe.\n", printf("bt_isa_probe: Invalid DMA setting " "detected for adapter at 0x%x. " "Failing probe\n", ioport); + return (0); } } else { /* VL DMA */ |