o Use INTR_TYPE_AV (the highest possible) rather than INTR_TYPE_BIO
o Don't allow INTR_TYPE_FAST. Since we are sharing the interrupt between CSC and the functions, they can't be FAST because fast interrupts can't be shared. o Add the same workaround for resume that we have in OLDCARD. o Also, return the error from bus_generic_resume rather than ignoring it.
This commit is contained in:
parent
d63e76cc21
commit
cebd67fba3
@ -547,8 +547,7 @@ pccbb_attach(device_t brdev)
|
||||
return (ENOMEM);
|
||||
}
|
||||
|
||||
/* XXX INTR_TYPE_BIO IS WRONG here */
|
||||
if (bus_setup_intr(brdev, sc->sc_irq_res, INTR_TYPE_BIO, pccbb_intr, sc,
|
||||
if (bus_setup_intr(brdev, sc->sc_irq_res, INTR_TYPE_AV, pccbb_intr, sc,
|
||||
&sc->sc_intrhand)) {
|
||||
device_printf(brdev, "couldn't establish interrupt");
|
||||
bus_release_resource(brdev, SYS_RES_IRQ, 0, sc->sc_irq_res);
|
||||
@ -653,6 +652,38 @@ pccbb_shutdown(device_t brdev)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
pccbb_setup_intr(device_t dev, device_t child, struct resource *irq,
|
||||
int flags, driver_intr_t *intr, void *arg, void **cookiep)
|
||||
{
|
||||
int err;
|
||||
|
||||
/*
|
||||
* You aren't allowed to have fast interrupts for pccard/cardbus
|
||||
* things since those interrupts are PCI and shared. Since we use
|
||||
* the PCI interrupt for the status change interrupts, it can't be
|
||||
* free for use by the driver. Fast interrupts must not be shared.
|
||||
*/
|
||||
if ((flags & INTR_FAST) != 0)
|
||||
return (EINVAL);
|
||||
err = bus_generic_setup_intr(dev, child, irq, flags, intr, arg,
|
||||
cookiep);
|
||||
/*
|
||||
* XXX need to turn on ISA interrupts, if we ever support them, but
|
||||
* XXX for now that's all we need to do.
|
||||
*/
|
||||
return (err);
|
||||
}
|
||||
|
||||
static int
|
||||
pccbb_teardown_intr(device_t dev, device_t child, struct resource *irq,
|
||||
void *cookie)
|
||||
{
|
||||
/* XXX Need to do different things for ISA interrupts. */
|
||||
return (bus_generic_teardown_intr(dev, child, irq, cookie));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pccbb_driver_added(device_t brdev, driver_t *driver)
|
||||
{
|
||||
@ -1721,8 +1752,7 @@ pccbb_resume(device_t self)
|
||||
pccbb_set(sc, PCCBB_SOCKET_EVENT, tmp);
|
||||
|
||||
/* re-establish the interrupt. */
|
||||
/* XXX INTR_TYPE_BIOS IS WRONG here */
|
||||
if (bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO, pccbb_intr, sc,
|
||||
if (bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_AV, pccbb_intr, sc,
|
||||
&sc->sc_intrhand)) {
|
||||
device_printf(self, "couldn't re-establish interrupt");
|
||||
bus_release_resource(self, SYS_RES_IRQ, 0, sc->sc_irq_res);
|
||||
@ -1731,7 +1761,21 @@ pccbb_resume(device_t self)
|
||||
mtx_destroy(&sc->sc_mtx);
|
||||
error = ENOMEM;
|
||||
}
|
||||
bus_generic_resume(self);
|
||||
|
||||
/*
|
||||
* Some BIOSes will not save the BARs for the pci chips, so we
|
||||
* must do it ourselves. If the BAR is reset to 0 for an I/O
|
||||
* device, it will read back as 0x1, so no explicit test for
|
||||
* memory devices are needed.
|
||||
*
|
||||
* Note: The PCI bus code should do this automatically for us on
|
||||
* suspend/resume, but until it does, we have to cope.
|
||||
*/
|
||||
if (pci_read_config(self, PCCBBR_SOCKBASE, 4) == 0)
|
||||
pci_write_config(self, PCCBBR_SOCKBASE,
|
||||
rman_get_start(sc->sc_base_res), 4);
|
||||
|
||||
error = bus_generic_resume(self);
|
||||
|
||||
/* wakeup thread */
|
||||
if (!error) {
|
||||
@ -1761,8 +1805,8 @@ static device_method_t pccbb_methods[] = {
|
||||
DEVMETHOD(bus_deactivate_resource, pccbb_deactivate_resource),
|
||||
DEVMETHOD(bus_driver_added, pccbb_driver_added),
|
||||
DEVMETHOD(bus_child_detached, pccbb_child_detached),
|
||||
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
|
||||
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
|
||||
DEVMETHOD(bus_setup_intr, pccbb_setup_intr),
|
||||
DEVMETHOD(bus_teardown_intr, pccbb_teardown_intr),
|
||||
|
||||
/* 16-bit card interface */
|
||||
DEVMETHOD(card_set_res_flags, pccbb_pcic_set_res_flags),
|
||||
|
Loading…
Reference in New Issue
Block a user