Skip to contentSkip to conversation

mptsas suspend not working?

PATCH New Darrick J. Wong 1 participant 2 messages Oct 11, 2006 – Jan 11, 2007

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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]
#1 lore raw

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.

---

 drivers/message/fusion/mptbase.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/message/fusion/mptbase.c +6 -0
index b3f28a0..b228e4c 100644
@@ -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) {