summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>1998-10-10 00:44:12 +0000
committerimp <imp@FreeBSD.org>1998-10-10 00:44:12 +0000
commit13f2ddfc616e06287947cc9ce1552192ec1cf779 (patch)
tree35f0ad87905fdcd19e8e7809c680b3a7ad67977f
parent3e75936c6c42230ab8fefae122340215c88acb84 (diff)
downloadFreeBSD-src-13f2ddfc616e06287947cc9ce1552192ec1cf779.zip
FreeBSD-src-13f2ddfc616e06287947cc9ce1552192ec1cf779.tar.gz
Fix conficts in probe:
o For bt and aha only probe the one I/O range if a specific I/O is specified in the config file. o Don't even try to probe I/O ranges that have been seen already. o If we conflict with an IRQ or DRQ, then fail the probe. Requested by: bde, gibbs Approved by: jkh
-rw-r--r--sys/dev/advansys/adv_isa.c22
-rw-r--r--sys/dev/aha/aha_isa.c29
-rw-r--r--sys/dev/buslogic/bt_isa.c29
-rw-r--r--sys/i386/isa/adv_isa.c22
-rw-r--r--sys/i386/isa/aha_isa.c29
-rw-r--r--sys/i386/isa/bt_isa.c29
-rw-r--r--sys/isa/bt_isa.c29
7 files changed, 182 insertions, 7 deletions
diff --git a/sys/dev/advansys/adv_isa.c b/sys/dev/advansys/adv_isa.c
index aa311d6..37f534e 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.3 1997/02/22 09:35:51 peter Exp $
+ * $Id: adv_isa.c,v 1.4 1998/09/15 07:03:39 gibbs Exp $
*/
#include <sys/param.h>
@@ -149,6 +149,13 @@ advisaprobe(struct isa_device *id)
if (port_addr == 0)
/* Already been attached */
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(id, CC_IOADDR))
+ continue;
+
if (adv_find_signature(I386_BUS_SPACE_IO, port_addr)) {
/*
* Got one. Now allocate our softc
@@ -263,6 +270,18 @@ advisaprobe(struct isa_device *id)
adv->overrun_physbase = overrun_physbase;
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(id, CC_DRQ)) {
+ printf("advisaprobe: Aha card at I/O 0x%x's "
+ "drq %d conflicts, ignoring card.\n",
+ id->id_iobase, id->id_drq);
+ adv_free(adv);
+ return 0;
+ }
+
if (adv_init(adv) != 0) {
adv_free(adv);
return (0);
@@ -295,6 +314,7 @@ advisaprobe(struct isa_device *id)
id->id_irq = 1 << adv_get_chip_irq(adv);
else
adv_set_chip_irq(adv, ffs(id->id_irq) - 1);
+
id->id_intr = adv_isa_intr;
/* Mark as probed */
diff --git a/sys/dev/aha/aha_isa.c b/sys/dev/aha/aha_isa.c
index d1e75c4..c83ab58 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.1 1998/09/15 07:39:55 gibbs Exp $
+ * $Id: aha_isa.c,v 1.2 1998/09/24 10:43:42 bde Exp $
*/
#include <sys/param.h>
@@ -101,6 +101,7 @@ aha_isa_probe: Failing probe.\n",
: aha_isa_ports[max_port_index].addr);
return 0;
}
+ max_port_index = port_index;
}
/* Attempt to find an adapter */
@@ -118,6 +119,13 @@ aha_isa_probe: Failing probe.\n",
if (aha_check_probed_iop(ioport) != 0)
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(dev, CC_IOADDR))
+ continue;
+
/* Allocate a softc for use during probing */
aha = aha_alloc(dev->id_unit, I386_BUS_SPACE_IO, ioport);
@@ -166,6 +174,25 @@ aha_isa_probe: Failing probe.\n",
dev->id_iobase = aha_isa_ports[port_index].addr;
dev->id_irq = (config_data.irq << 9);
dev->id_intr = aha_isa_intr;
+
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(dev, CC_DRQ)) {
+ printf("aha_isa_probe: Aha card at I/O 0x%x's drq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ dev->id_drq);
+ aha_free(aha);
+ return 0;
+ }
+ if (haveseen_isadev(dev, CC_IRQ)) {
+ printf("aha_isa_probe: Aha card at I/O 0x%x's irq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ config_data.irq + 9);
+ aha_free(aha);
+ return 0;
+ }
aha_unit++;
return (AHA_NREGS);
}
diff --git a/sys/dev/buslogic/bt_isa.c b/sys/dev/buslogic/bt_isa.c
index b74752a..5473bf2 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.1 1998/09/15 07:32:54 gibbs Exp $
+ * $Id: bt_isa.c,v 1.2 1998/09/24 10:43:42 bde Exp $
*/
#include <sys/param.h>
@@ -102,6 +102,7 @@ bt_isa_probe: Failing probe.\n",
: bt_isa_ports[max_port_index].addr);
return 0;
}
+ max_port_index = port_index;
}
/* Attempt to find an adapter */
@@ -119,6 +120,13 @@ bt_isa_probe: Failing probe.\n",
if (bt_check_probed_iop(ioport) != 0)
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(dev, CC_IOADDR))
+ continue;
+
/* Allocate a softc for use during probing */
bt = bt_alloc(dev->id_unit, I386_BUS_SPACE_IO, ioport);
@@ -173,6 +181,25 @@ bt_isa_probe: Failing probe.\n",
dev->id_iobase = bt_isa_ports[port_index].addr;
dev->id_irq = (config_data.irq << 9);
dev->id_intr = bt_isa_intr;
+
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(dev, CC_DRQ)) {
+ printf("bt_isa_probe: Bt card at I/O 0x%x's drq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ dev->id_drq);
+ bt_free(bt);
+ return 0;
+ }
+ if (haveseen_isadev(dev, CC_IRQ)) {
+ printf("bt_isa_probe: Bt card at I/O 0x%x's irq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ config_data.irq + 9);
+ bt_free(bt);
+ return 0;
+ }
bt_unit++;
return (BT_NREGS);
}
diff --git a/sys/i386/isa/adv_isa.c b/sys/i386/isa/adv_isa.c
index aa311d6..37f534e 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.3 1997/02/22 09:35:51 peter Exp $
+ * $Id: adv_isa.c,v 1.4 1998/09/15 07:03:39 gibbs Exp $
*/
#include <sys/param.h>
@@ -149,6 +149,13 @@ advisaprobe(struct isa_device *id)
if (port_addr == 0)
/* Already been attached */
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(id, CC_IOADDR))
+ continue;
+
if (adv_find_signature(I386_BUS_SPACE_IO, port_addr)) {
/*
* Got one. Now allocate our softc
@@ -263,6 +270,18 @@ advisaprobe(struct isa_device *id)
adv->overrun_physbase = overrun_physbase;
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(id, CC_DRQ)) {
+ printf("advisaprobe: Aha card at I/O 0x%x's "
+ "drq %d conflicts, ignoring card.\n",
+ id->id_iobase, id->id_drq);
+ adv_free(adv);
+ return 0;
+ }
+
if (adv_init(adv) != 0) {
adv_free(adv);
return (0);
@@ -295,6 +314,7 @@ advisaprobe(struct isa_device *id)
id->id_irq = 1 << adv_get_chip_irq(adv);
else
adv_set_chip_irq(adv, ffs(id->id_irq) - 1);
+
id->id_intr = adv_isa_intr;
/* Mark as probed */
diff --git a/sys/i386/isa/aha_isa.c b/sys/i386/isa/aha_isa.c
index d1e75c4..c83ab58 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.1 1998/09/15 07:39:55 gibbs Exp $
+ * $Id: aha_isa.c,v 1.2 1998/09/24 10:43:42 bde Exp $
*/
#include <sys/param.h>
@@ -101,6 +101,7 @@ aha_isa_probe: Failing probe.\n",
: aha_isa_ports[max_port_index].addr);
return 0;
}
+ max_port_index = port_index;
}
/* Attempt to find an adapter */
@@ -118,6 +119,13 @@ aha_isa_probe: Failing probe.\n",
if (aha_check_probed_iop(ioport) != 0)
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(dev, CC_IOADDR))
+ continue;
+
/* Allocate a softc for use during probing */
aha = aha_alloc(dev->id_unit, I386_BUS_SPACE_IO, ioport);
@@ -166,6 +174,25 @@ aha_isa_probe: Failing probe.\n",
dev->id_iobase = aha_isa_ports[port_index].addr;
dev->id_irq = (config_data.irq << 9);
dev->id_intr = aha_isa_intr;
+
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(dev, CC_DRQ)) {
+ printf("aha_isa_probe: Aha card at I/O 0x%x's drq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ dev->id_drq);
+ aha_free(aha);
+ return 0;
+ }
+ if (haveseen_isadev(dev, CC_IRQ)) {
+ printf("aha_isa_probe: Aha card at I/O 0x%x's irq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ config_data.irq + 9);
+ aha_free(aha);
+ return 0;
+ }
aha_unit++;
return (AHA_NREGS);
}
diff --git a/sys/i386/isa/bt_isa.c b/sys/i386/isa/bt_isa.c
index b74752a..5473bf2 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.1 1998/09/15 07:32:54 gibbs Exp $
+ * $Id: bt_isa.c,v 1.2 1998/09/24 10:43:42 bde Exp $
*/
#include <sys/param.h>
@@ -102,6 +102,7 @@ bt_isa_probe: Failing probe.\n",
: bt_isa_ports[max_port_index].addr);
return 0;
}
+ max_port_index = port_index;
}
/* Attempt to find an adapter */
@@ -119,6 +120,13 @@ bt_isa_probe: Failing probe.\n",
if (bt_check_probed_iop(ioport) != 0)
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(dev, CC_IOADDR))
+ continue;
+
/* Allocate a softc for use during probing */
bt = bt_alloc(dev->id_unit, I386_BUS_SPACE_IO, ioport);
@@ -173,6 +181,25 @@ bt_isa_probe: Failing probe.\n",
dev->id_iobase = bt_isa_ports[port_index].addr;
dev->id_irq = (config_data.irq << 9);
dev->id_intr = bt_isa_intr;
+
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(dev, CC_DRQ)) {
+ printf("bt_isa_probe: Bt card at I/O 0x%x's drq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ dev->id_drq);
+ bt_free(bt);
+ return 0;
+ }
+ if (haveseen_isadev(dev, CC_IRQ)) {
+ printf("bt_isa_probe: Bt card at I/O 0x%x's irq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ config_data.irq + 9);
+ bt_free(bt);
+ return 0;
+ }
bt_unit++;
return (BT_NREGS);
}
diff --git a/sys/isa/bt_isa.c b/sys/isa/bt_isa.c
index b74752a..5473bf2 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.1 1998/09/15 07:32:54 gibbs Exp $
+ * $Id: bt_isa.c,v 1.2 1998/09/24 10:43:42 bde Exp $
*/
#include <sys/param.h>
@@ -102,6 +102,7 @@ bt_isa_probe: Failing probe.\n",
: bt_isa_ports[max_port_index].addr);
return 0;
}
+ max_port_index = port_index;
}
/* Attempt to find an adapter */
@@ -119,6 +120,13 @@ bt_isa_probe: Failing probe.\n",
if (bt_check_probed_iop(ioport) != 0)
continue;
+ /*
+ * Make sure that we do not conflict with another device's
+ * I/O address.
+ */
+ if (haveseen_isadev(dev, CC_IOADDR))
+ continue;
+
/* Allocate a softc for use during probing */
bt = bt_alloc(dev->id_unit, I386_BUS_SPACE_IO, ioport);
@@ -173,6 +181,25 @@ bt_isa_probe: Failing probe.\n",
dev->id_iobase = bt_isa_ports[port_index].addr;
dev->id_irq = (config_data.irq << 9);
dev->id_intr = bt_isa_intr;
+
+ /*
+ * OK, check to make sure that we're not stepping on
+ * someone else's IRQ or DRQ
+ */
+ if (haveseen_isadev(dev, CC_DRQ)) {
+ printf("bt_isa_probe: Bt card at I/O 0x%x's drq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ dev->id_drq);
+ bt_free(bt);
+ return 0;
+ }
+ if (haveseen_isadev(dev, CC_IRQ)) {
+ printf("bt_isa_probe: Bt card at I/O 0x%x's irq %d "
+ "conflicts, ignoring card.\n", dev->id_iobase,
+ config_data.irq + 9);
+ bt_free(bt);
+ return 0;
+ }
bt_unit++;
return (BT_NREGS);
}
OpenPOWER on IntegriCloud