mptsas suspend not working?
Subsystems (2)
Hi Eric, et. al.:
I tried to put a mptsas controller into D3 suspend state while preparing to put a system into standby mode. When I went out of standby, I got these errors in dmesg and all disk I/O ceased. Any idea what's going on here? Kernel is 2.6.19-rc1, btw.
--D
[514076.973779] mptsas 0000:01:00.0: suspend [514076.973786] mptbase: ioc0: pci-suspend: pdev=0xffff8100bb13c800, slot=0000:01:00.0, Entering operating state [D3] [514077.361178] mptsas 0000:01:00.0: LATE suspend [514129.109268] mptsas 0000:01:00.0: EARLY resume [514129.388680] mptsas 0000:01:00.0: resuming [514129.388684] mptbase: ioc0: pci-resume: pdev=0xffff8100bb13c800, slot=0000:01:00.0, Previous operating state [D3] [514129.512441] mptbase: ioc0: pci-resume: ioc-state=0x1,doorbell=0x10000000 [514129.512443] mptbase: Initiating ioc0 recovery [514132.364805] mptbase: ioc0: ERROR - Invalid IOC facts reply, msgLength=0 offsetof=6! [514132.420725] mptbase: ioc0: ERROR - Invalid IOC facts reply, msgLength=0 offsetof=6! [514132.476662] mptbase: ioc0: ERROR - Invalid IOC facts reply, msgLength=0 offsetof=6! [514132.484649] mptbase: ioc0: pci-resume: Cannot recover, error:[fffffffe]
PATCH 1/1 mptbase: Reset ioc initiator after PCI resume
It appears that the LSI SAS 1064E chip needs to be reset after a suspend/resume cycle before the driver attempts further communications with the chip. This patch gets rid of these error messages:
mptbase: ioc0: ERROR - Invalid IOC facts reply, msgLength=0 offsetof=6!
after a system wakes up from sleep. I've also tested it on a 53c1030 chip with no observable regressions.
Signed-off-by Darrick J. Wong <[email protected]>
---
drivers/message/fusion/mptbase.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/message/fusion/mptbase.c +6 -0
@@ -1545,6 +1545,12 @@ mpt_resume(struct pci_dev *pdev) (mpt_GetIocState (ioc,1 ) >>MPI_IOC_STATE_SHIFT ), CHIPREG_READ32(&ioc->chip->Doorbell)); +/* put ioc into READY_STATE */ +if (SendIocReset (ioc,MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET ,CAN_SLEEP )) { +printk (MYIOC_s_ERR_FMT +"pci-resume: IOC msg unit reset failed!\n" , ioc->name); + } +/* bring ioc to operational state */ if ((recovery_state =mpt_do_ioc_recovery (ioc,MPT_HOSTEVENT_IOC_RECOVER ,CAN_SLEEP )) !=0 ) {