Re: device_suspend() levels [was Re: [patch] ACPI work on aic7xxx]

Nathan Bryant
2004-07-20T20:50:26Z

Benjamin Herrenschmidt wrote:

> Note regarding aix7xxx, we also need proper hooks in the SCSI stack to
> block the queue correctly etc... in the same way we do on IDE. I didn't
> have time to look into this yet.

Here's what we currently do, aic7xxx_core.c - looks like it attempts to
quiesce, and then refuse to suspend if we happen to be busy. This is a
little messy because it's done in the suspend call rather than the
save_state call, therefore resume will still be called if this routine
returns an error code, which will reinitialize the device when we didn't
really need to.

int
ahc_suspend(struct ahc_softc *ahc)
{

ahc_pause_and_flushwork(ahc);

if (LIST_FIRST(&ahc->pending_scbs) != NULL) {
ahc_unpause(ahc);
return (EBUSY);
}

#ifdef AHC_TARGET_MODE
/*
* XXX What about ATIOs that have not yet been serviced?
* Perhaps we should just refuse to be suspended if we
* are acting in a target role.
*/
if (ahc->pending_device != NULL) {
ahc_unpause(ahc);
return (EBUSY);
}
#endif
ahc_shutdown(ahc);
return (0);
}