Use bus_get_resource() instead of bus_get_resource_start() as the latter

returns "0" on failure, which is indistinguishable from (say) irq 0.  This
should stop a couple of stray messages that turn up.

Also, if a BUS_SETUP_INTR() fails with INTR_TYPE_FAST, try falling back to
a normal interrupt.  This might help pccard folks with a shared slot
interrupt.  This whole thing needs to be revisited.
This commit is contained in:
peter 1999-12-06 06:47:02 +00:00
parent f2b4828a2c
commit 079c00a536
2 changed files with 48 additions and 34 deletions

View File

@ -610,8 +610,9 @@ sioprobe(dev)
devclass_get_devices(sio_devclass, &devs, &count);
for (i = 0; i < count; i++) {
xdev = devs[i];
xioport = bus_get_resource_start(xdev, SYS_RES_IOPORT, 0);
if (device_is_enabled(xdev) && xioport > 0)
if (device_is_enabled(xdev) &&
bus_get_resource(xdev, SYS_RES_IOPORT, 0, &xioport,
NULL) == 0)
outb(xioport + com_mcr, 0);
}
free(devs, M_TEMP);
@ -643,15 +644,17 @@ sioprobe(dev)
device_get_unit(dev), COM_MPMASTER(flags));
idev = dev;
}
xiobase = bus_get_resource_start(idev, SYS_RES_IOPORT, 0);
if (xiobase > 0) {
xirq = bus_get_resource_start(idev, SYS_RES_IRQ, 0);
outb(xiobase + com_scr, xirq >= 0 ? 0x80 : 0);
if (bus_get_resource(idev, SYS_RES_IOPORT, 0, &xiobase,
NULL) == 0) {
if (bus_get_resource(idev, SYS_RES_IRQ, 0, NULL, NULL))
outb(xiobase + com_scr, 0x80); /* no irq */
else
outb(xiobase + com_scr, 0);
}
mcr_image = 0;
}
#endif /* COM_MULTIPORT */
if (bus_get_resource_start(idev, SYS_RES_IRQ, 0) <= 0)
if (bus_get_resource(idev, SYS_RES_IRQ, 0, NULL, NULL) != 0)
mcr_image = 0;
bzero(failures, sizeof failures);
@ -803,8 +806,8 @@ sioprobe(dev)
enable_intr();
irqs = irqmap[1] & ~irqmap[0];
xirq = bus_get_resource_start(idev, SYS_RES_IRQ, 0);
if (xirq >= 0 && ((1 << xirq) & irqs) == 0)
if (bus_get_resource(idev, SYS_RES_IRQ, 0, &xirq, NULL) == 0 &&
((1 << xirq) & irqs) == 0)
printf(
"sio%d: configured irq %d not in bitmap of probed irqs %#x\n",
device_get_unit(dev), xirq, irqs);
@ -913,7 +916,6 @@ sioattach(dev)
Port_t *espp;
#endif
Port_t iobase;
int irq;
int unit;
void *ih;
u_int flags;
@ -928,7 +930,6 @@ sioattach(dev)
return ENXIO;
iobase = rman_get_start(port);
irq = bus_get_resource_start(dev, SYS_RES_IRQ, 0);
unit = device_get_unit(dev);
com = device_get_softc(dev);
flags = device_get_flags(dev);
@ -953,7 +954,7 @@ sioattach(dev)
com->cfcr_image = CFCR_8BITS;
com->dtr_wait = 3 * hz;
com->loses_outints = COM_LOSESOUTINTS(flags) != 0;
com->no_irq = irq < 0;
com->no_irq = bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL);
com->tx_fifo_size = 1;
com->obufs[0].l_head = com->obuf1;
com->obufs[1].l_head = com->obuf2;
@ -1098,7 +1099,6 @@ determined_type: ;
#ifdef COM_MULTIPORT
if (COM_ISMULTIPORT(flags)) {
device_t masterdev;
int irq;
com->multiport = TRUE;
printf(" (multiport");
@ -1107,8 +1107,8 @@ determined_type: ;
printf(")");
masterdev = devclass_get_device(sio_devclass,
COM_MPMASTER(flags));
irq = bus_get_resource_start(masterdev, SYS_RES_IRQ, 0);
com->no_irq = irq < 0;
com->no_irq = bus_get_resource(masterdev, SYS_RES_IRQ, 0, NULL,
NULL);
}
#endif /* COM_MULTIPORT */
if (unit == comconsole)
@ -1142,8 +1142,15 @@ determined_type: ;
RF_ACTIVE);
if (com->irqres) {
ret = BUS_SETUP_INTR(device_get_parent(dev), dev, com->irqres,
INTR_TYPE_TTY | INTR_TYPE_FAST,
siointr, com, &ih);
INTR_TYPE_TTY | INTR_TYPE_FAST,
siointr, com, &ih);
if (ret) {
ret = BUS_SETUP_INTR(device_get_parent(dev), dev,
com->irqres, INTR_TYPE_TTY,
siointr, com, &ih);
if (ret == 0)
device_printf(dev, "unable to activate interrupt in fast mode - using normal mode");
}
if (ret)
device_printf(dev, "could not activate interrupt\n");
}

View File

@ -610,8 +610,9 @@ sioprobe(dev)
devclass_get_devices(sio_devclass, &devs, &count);
for (i = 0; i < count; i++) {
xdev = devs[i];
xioport = bus_get_resource_start(xdev, SYS_RES_IOPORT, 0);
if (device_is_enabled(xdev) && xioport > 0)
if (device_is_enabled(xdev) &&
bus_get_resource(xdev, SYS_RES_IOPORT, 0, &xioport,
NULL) == 0)
outb(xioport + com_mcr, 0);
}
free(devs, M_TEMP);
@ -643,15 +644,17 @@ sioprobe(dev)
device_get_unit(dev), COM_MPMASTER(flags));
idev = dev;
}
xiobase = bus_get_resource_start(idev, SYS_RES_IOPORT, 0);
if (xiobase > 0) {
xirq = bus_get_resource_start(idev, SYS_RES_IRQ, 0);
outb(xiobase + com_scr, xirq >= 0 ? 0x80 : 0);
if (bus_get_resource(idev, SYS_RES_IOPORT, 0, &xiobase,
NULL) == 0) {
if (bus_get_resource(idev, SYS_RES_IRQ, 0, NULL, NULL))
outb(xiobase + com_scr, 0x80); /* no irq */
else
outb(xiobase + com_scr, 0);
}
mcr_image = 0;
}
#endif /* COM_MULTIPORT */
if (bus_get_resource_start(idev, SYS_RES_IRQ, 0) <= 0)
if (bus_get_resource(idev, SYS_RES_IRQ, 0, NULL, NULL) != 0)
mcr_image = 0;
bzero(failures, sizeof failures);
@ -803,8 +806,8 @@ sioprobe(dev)
enable_intr();
irqs = irqmap[1] & ~irqmap[0];
xirq = bus_get_resource_start(idev, SYS_RES_IRQ, 0);
if (xirq >= 0 && ((1 << xirq) & irqs) == 0)
if (bus_get_resource(idev, SYS_RES_IRQ, 0, &xirq, NULL) == 0 &&
((1 << xirq) & irqs) == 0)
printf(
"sio%d: configured irq %d not in bitmap of probed irqs %#x\n",
device_get_unit(dev), xirq, irqs);
@ -913,7 +916,6 @@ sioattach(dev)
Port_t *espp;
#endif
Port_t iobase;
int irq;
int unit;
void *ih;
u_int flags;
@ -928,7 +930,6 @@ sioattach(dev)
return ENXIO;
iobase = rman_get_start(port);
irq = bus_get_resource_start(dev, SYS_RES_IRQ, 0);
unit = device_get_unit(dev);
com = device_get_softc(dev);
flags = device_get_flags(dev);
@ -953,7 +954,7 @@ sioattach(dev)
com->cfcr_image = CFCR_8BITS;
com->dtr_wait = 3 * hz;
com->loses_outints = COM_LOSESOUTINTS(flags) != 0;
com->no_irq = irq < 0;
com->no_irq = bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL);
com->tx_fifo_size = 1;
com->obufs[0].l_head = com->obuf1;
com->obufs[1].l_head = com->obuf2;
@ -1098,7 +1099,6 @@ determined_type: ;
#ifdef COM_MULTIPORT
if (COM_ISMULTIPORT(flags)) {
device_t masterdev;
int irq;
com->multiport = TRUE;
printf(" (multiport");
@ -1107,8 +1107,8 @@ determined_type: ;
printf(")");
masterdev = devclass_get_device(sio_devclass,
COM_MPMASTER(flags));
irq = bus_get_resource_start(masterdev, SYS_RES_IRQ, 0);
com->no_irq = irq < 0;
com->no_irq = bus_get_resource(masterdev, SYS_RES_IRQ, 0, NULL,
NULL);
}
#endif /* COM_MULTIPORT */
if (unit == comconsole)
@ -1142,8 +1142,15 @@ determined_type: ;
RF_ACTIVE);
if (com->irqres) {
ret = BUS_SETUP_INTR(device_get_parent(dev), dev, com->irqres,
INTR_TYPE_TTY | INTR_TYPE_FAST,
siointr, com, &ih);
INTR_TYPE_TTY | INTR_TYPE_FAST,
siointr, com, &ih);
if (ret) {
ret = BUS_SETUP_INTR(device_get_parent(dev), dev,
com->irqres, INTR_TYPE_TTY,
siointr, com, &ih);
if (ret == 0)
device_printf(dev, "unable to activate interrupt in fast mode - using normal mode");
}
if (ret)
device_printf(dev, "could not activate interrupt\n");
}