isa_device.h: Added flag for sensitive HW. ed# seems to break if anything

else has been probed.  This feature could go away again, if we can curb the
problem another way.

if_ed.c, syscons.c:  Set the above flag.  ed# because it needs it, syscons
because it looks stupid to "detect" the display you have already filled up
with text :-)

bt742a.c: Check bt_cmd() return-val during probe, thus failing on adaptec's.
Also silenced various printf's during the probe.

isa.c:  Probe devices with the above flag set before the rest.  Reduce the
number of "conflict" messages per device to one.

***
Please test the GENERIC-kernel now, if nobody can make it fail, GENERICAH
and GENERICBT has a finite and short life-expectancy...
***
This commit is contained in:
Poul-Henning Kamp 1994-10-17 21:16:41 +00:00
parent 161e7c8d87
commit 3595e6807d
9 changed files with 127 additions and 51 deletions

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)isa.c 7.2 (Berkeley) 5/13/91
* $Id: isa.c,v 1.26 1994/09/30 05:35:55 swallace Exp $
* $Id: isa.c,v 1.27 1994/10/01 02:56:14 davidg Exp $
*/
/*
@ -162,8 +162,6 @@ haveseen(dvp, tmpdvp, checkbits)
struct isa_device *tmpdvp;
u_int checkbits;
{
int status = 0;
/*
* Only check against devices that have already been found
*/
@ -183,7 +181,7 @@ haveseen(dvp, tmpdvp, checkbits)
(tmpdvp->id_iobase + tmpdvp->id_alive - 1))) {
conflict(dvp, tmpdvp, dvp->id_iobase, whatnot,
"I/O address", "0x%x");
status = 1;
return 1;
}
}
/*
@ -202,7 +200,7 @@ haveseen(dvp, tmpdvp, checkbits)
(tmpdvp->id_maddr + tmpdvp->id_msize - 1))) {
conflict(dvp, tmpdvp, (int)dvp->id_maddr,
whatnot, "maddr", "0x%x");
status = 1;
return 1;
}
}
/*
@ -212,7 +210,7 @@ haveseen(dvp, tmpdvp, checkbits)
if (tmpdvp->id_irq == dvp->id_irq) {
conflict(dvp, tmpdvp, ffs(dvp->id_irq) - 1,
whatnot, "irq", "%d");
status = 1;
return 1;
}
}
/*
@ -222,11 +220,11 @@ haveseen(dvp, tmpdvp, checkbits)
if (tmpdvp->id_drq == dvp->id_drq) {
conflict(dvp, tmpdvp, dvp->id_drq, whatnot,
"drq", "%d");
status = 1;
return 1;
}
}
}
return (status);
return 0;
}
/*
@ -241,14 +239,26 @@ haveseen_isadev(dvp, checkbits)
struct isa_device *tmpdvp;
int status = 0;
for (tmpdvp = isa_devtab_tty; tmpdvp->id_driver; tmpdvp++)
for (tmpdvp = isa_devtab_tty; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
for (tmpdvp = isa_devtab_bio; tmpdvp->id_driver; tmpdvp++)
if (status)
return status;
}
for (tmpdvp = isa_devtab_bio; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
for (tmpdvp = isa_devtab_net; tmpdvp->id_driver; tmpdvp++)
if (status)
return status;
}
for (tmpdvp = isa_devtab_net; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
for (tmpdvp = isa_devtab_null; tmpdvp->id_driver; tmpdvp++)
if (status)
return status;
}
for (tmpdvp = isa_devtab_null; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
if (status)
return status;
}
return(status);
}
@ -263,14 +273,34 @@ isa_configure() {
enable_intr();
INTREN(IRQ_SLAVE);
printf("Probing for devices on the ISA bus:\n");
/* First probe all the sensitive probes */
for (dvp = isa_devtab_tty; dvp->id_driver; dvp++)
config_isadev(dvp, &tty_imask);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, &tty_imask);
for (dvp = isa_devtab_bio; dvp->id_driver; dvp++)
config_isadev(dvp, &bio_imask);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, &bio_imask);
for (dvp = isa_devtab_net; dvp->id_driver; dvp++)
config_isadev(dvp, &net_imask);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, &net_imask);
for (dvp = isa_devtab_null; dvp->id_driver; dvp++)
config_isadev(dvp, (u_int *)NULL);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, (u_int *)NULL);
/* Then all the bad ones */
for (dvp = isa_devtab_tty; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, &tty_imask);
for (dvp = isa_devtab_bio; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, &bio_imask);
for (dvp = isa_devtab_net; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, &net_imask);
for (dvp = isa_devtab_null; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, (u_int *)NULL);
bio_imask |= SWI_CLOCK_MASK;
net_imask |= SWI_NET_MASK;
tty_imask |= SWI_TTY_MASK;

View File

@ -13,7 +13,7 @@
* the SMC Elite Ultra (8216), the 3Com 3c503, the NE1000 and NE2000,
* and a variety of similar clones.
*
* $Id: if_ed.c,v 1.49 1994/10/08 09:24:20 davidg Exp $
* $Id: if_ed.c,v 1.50 1994/10/14 11:56:36 davidg Exp $
*/
#include "ed.h"
@ -128,7 +128,8 @@ void ed_setrcr(struct ifnet *, struct ed_softc *);
struct isa_driver eddriver = {
ed_probe,
ed_attach,
"ed"
"ed",
1 /* We are ultra sensitive */
};
/*

View File

@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: syscons.c,v 1.65 1994/10/15 21:33:58 ache Exp $
* $Id: syscons.c,v 1.66 1994/10/17 12:44:02 ache Exp $
*/
#include "sc.h"
@ -286,7 +286,7 @@ extern char *video_mode_ptr;
int color_display = -1;
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
pcprobe, pcattach, "sc", 1
};
int

View File

@ -12,7 +12,7 @@
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
* $Id: bt742a.c,v 1.26 1994/10/10 00:46:09 jkh Exp $
* $Id: bt742a.c,v 1.27 1994/10/12 04:15:30 phk Exp $
*/
/*
@ -403,6 +403,7 @@ struct bt_ccb *bt_get_ccb();
struct bt_ccb *bt_ccb_phys_kv();
static int btunit = 0;
static int btprobing = 0;
struct isa_driver btdriver =
{
@ -500,7 +501,9 @@ bt_cmd(unit, icnt, ocnt, wait, retval, opcode, args)
DELAY(10);
}
if (i == 0) {
printf("bt%d: bt_cmd, host not idle(0x%x)\n", unit, sts);
if(!btprobing)
printf("bt%d: bt_cmd, host not idle(0x%x)\n",
unit, sts);
return (ENXIO);
}
}
@ -527,7 +530,9 @@ bt_cmd(unit, icnt, ocnt, wait, retval, opcode, args)
DELAY(10);
}
if (i == 0) {
printf("bt%d: bt_cmd, cmd/data port full\n", unit);
if(!btprobing)
printf("bt%d: bt_cmd, cmd/data port full\n",
unit);
outb(BT_CTRL_STAT_PORT, BT_SRST);
return (ENXIO);
}
@ -546,8 +551,9 @@ bt_cmd(unit, icnt, ocnt, wait, retval, opcode, args)
DELAY(10);
}
if (i == 0) {
printf("bt%d: bt_cmd, cmd/data port empty %d\n",
unit, ocnt);
if(!btprobing)
printf("bt%d: bt_cmd, cmd/data port empty %d\n",
unit, ocnt);
return (ENXIO);
}
oc = inb(BT_CMD_DATA_PORT);
@ -566,7 +572,9 @@ bt_cmd(unit, icnt, ocnt, wait, retval, opcode, args)
DELAY(10);
}
if (i == 0) {
printf("bt%d: bt_cmd, host not finished(0x%x)\n", unit, sts);
if(!btprobing)
printf("bt%d: bt_cmd, host not finished(0x%x)\n",
unit, sts);
return (ENXIO);
}
outb(BT_CTRL_STAT_PORT, BT_IRST);
@ -589,6 +597,7 @@ btprobe(dev)
int unit = btunit;
struct bt_data *bt;
btprobing = 1;
if (unit >= NBT) {
printf("bt%d: unit number too high\n", unit);
return 0;
@ -638,7 +647,8 @@ btattach(dev)
{
int unit = dev->id_unit;
struct bt_data *bt = btdata[unit];
btprobing = 0;
/*
* fill in the prototype scsi_link.
*/
@ -1075,7 +1085,10 @@ bt_init(unit)
* Displaying Board ID and Hardware Revision
* 94/05/18 amurai@spec.co.jp
*/
bt_cmd(unit, 1, sizeof(binfo),0,&binfo,BT_GET_BOARD_INFO,sizeof(binfo));
i = bt_cmd(unit, 1, sizeof(binfo),0,
&binfo,BT_GET_BOARD_INFO,sizeof(binfo));
if(i)
return i;
printf("bt%d: Bt%c%c%c%c/%c%d-", unit,
binfo.id[0],
binfo.id[1],

View File

@ -13,7 +13,7 @@
* the SMC Elite Ultra (8216), the 3Com 3c503, the NE1000 and NE2000,
* and a variety of similar clones.
*
* $Id: if_ed.c,v 1.49 1994/10/08 09:24:20 davidg Exp $
* $Id: if_ed.c,v 1.50 1994/10/14 11:56:36 davidg Exp $
*/
#include "ed.h"
@ -128,7 +128,8 @@ void ed_setrcr(struct ifnet *, struct ed_softc *);
struct isa_driver eddriver = {
ed_probe,
ed_attach,
"ed"
"ed",
1 /* We are ultra sensitive */
};
/*

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)isa.c 7.2 (Berkeley) 5/13/91
* $Id: isa.c,v 1.26 1994/09/30 05:35:55 swallace Exp $
* $Id: isa.c,v 1.27 1994/10/01 02:56:14 davidg Exp $
*/
/*
@ -162,8 +162,6 @@ haveseen(dvp, tmpdvp, checkbits)
struct isa_device *tmpdvp;
u_int checkbits;
{
int status = 0;
/*
* Only check against devices that have already been found
*/
@ -183,7 +181,7 @@ haveseen(dvp, tmpdvp, checkbits)
(tmpdvp->id_iobase + tmpdvp->id_alive - 1))) {
conflict(dvp, tmpdvp, dvp->id_iobase, whatnot,
"I/O address", "0x%x");
status = 1;
return 1;
}
}
/*
@ -202,7 +200,7 @@ haveseen(dvp, tmpdvp, checkbits)
(tmpdvp->id_maddr + tmpdvp->id_msize - 1))) {
conflict(dvp, tmpdvp, (int)dvp->id_maddr,
whatnot, "maddr", "0x%x");
status = 1;
return 1;
}
}
/*
@ -212,7 +210,7 @@ haveseen(dvp, tmpdvp, checkbits)
if (tmpdvp->id_irq == dvp->id_irq) {
conflict(dvp, tmpdvp, ffs(dvp->id_irq) - 1,
whatnot, "irq", "%d");
status = 1;
return 1;
}
}
/*
@ -222,11 +220,11 @@ haveseen(dvp, tmpdvp, checkbits)
if (tmpdvp->id_drq == dvp->id_drq) {
conflict(dvp, tmpdvp, dvp->id_drq, whatnot,
"drq", "%d");
status = 1;
return 1;
}
}
}
return (status);
return 0;
}
/*
@ -241,14 +239,26 @@ haveseen_isadev(dvp, checkbits)
struct isa_device *tmpdvp;
int status = 0;
for (tmpdvp = isa_devtab_tty; tmpdvp->id_driver; tmpdvp++)
for (tmpdvp = isa_devtab_tty; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
for (tmpdvp = isa_devtab_bio; tmpdvp->id_driver; tmpdvp++)
if (status)
return status;
}
for (tmpdvp = isa_devtab_bio; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
for (tmpdvp = isa_devtab_net; tmpdvp->id_driver; tmpdvp++)
if (status)
return status;
}
for (tmpdvp = isa_devtab_net; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
for (tmpdvp = isa_devtab_null; tmpdvp->id_driver; tmpdvp++)
if (status)
return status;
}
for (tmpdvp = isa_devtab_null; tmpdvp->id_driver; tmpdvp++) {
status |= haveseen(dvp, tmpdvp, checkbits);
if (status)
return status;
}
return(status);
}
@ -263,14 +273,34 @@ isa_configure() {
enable_intr();
INTREN(IRQ_SLAVE);
printf("Probing for devices on the ISA bus:\n");
/* First probe all the sensitive probes */
for (dvp = isa_devtab_tty; dvp->id_driver; dvp++)
config_isadev(dvp, &tty_imask);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, &tty_imask);
for (dvp = isa_devtab_bio; dvp->id_driver; dvp++)
config_isadev(dvp, &bio_imask);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, &bio_imask);
for (dvp = isa_devtab_net; dvp->id_driver; dvp++)
config_isadev(dvp, &net_imask);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, &net_imask);
for (dvp = isa_devtab_null; dvp->id_driver; dvp++)
config_isadev(dvp, (u_int *)NULL);
if (dvp->id_driver->sensitive_hw)
config_isadev(dvp, (u_int *)NULL);
/* Then all the bad ones */
for (dvp = isa_devtab_tty; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, &tty_imask);
for (dvp = isa_devtab_bio; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, &bio_imask);
for (dvp = isa_devtab_net; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, &net_imask);
for (dvp = isa_devtab_null; dvp->id_driver; dvp++)
if (!dvp->id_driver->sensitive_hw)
config_isadev(dvp, (u_int *)NULL);
bio_imask |= SWI_CLOCK_MASK;
net_imask |= SWI_NET_MASK;
tty_imask |= SWI_TTY_MASK;

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* from: @(#)isa_device.h 7.1 (Berkeley) 5/9/91
* $Id: isa_device.h,v 1.10 1994/09/03 16:03:09 csgr Exp $
* $Id: isa_device.h,v 1.11 1994/10/01 02:56:16 davidg Exp $
*/
#ifndef _I386_ISA_ISA_DEVICE_H_
@ -89,6 +89,7 @@ struct isa_driver {
int (*attach) __P((struct isa_device *idp));
/* setup driver for a device */
char *name; /* device name */
int sensitive_hw; /* true if other probes confuse us */
};
extern char eintrnames[]; /* end of intrnames[] */

View File

@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: syscons.c,v 1.65 1994/10/15 21:33:58 ache Exp $
* $Id: syscons.c,v 1.66 1994/10/17 12:44:02 ache Exp $
*/
#include "sc.h"
@ -286,7 +286,7 @@ extern char *video_mode_ptr;
int color_display = -1;
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
pcprobe, pcattach, "sc", 1
};
int

View File

@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: syscons.c,v 1.65 1994/10/15 21:33:58 ache Exp $
* $Id: syscons.c,v 1.66 1994/10/17 12:44:02 ache Exp $
*/
#include "sc.h"
@ -286,7 +286,7 @@ extern char *video_mode_ptr;
int color_display = -1;
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
pcprobe, pcattach, "sc", 1
};
int