aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/message/fusion/mptscsih.c
diff options
context:
space:
mode:
authorkashyap.desai@lsi.com <kashyap.desai@lsi.com>2011-08-05 01:34:37 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-08-27 10:35:53 -0400
commit98cbe371fd373f13806595835b79da07f3a2f934 (patch)
treefee917c26c396b1e8358ec91e3b50bb21e1a2558 /drivers/message/fusion/mptscsih.c
parent55a3a35dd4fe616301450c85a77e2d5b5f4bb7bf (diff)
[SCSI] mptfusion: Fix for device offline while doing aggressive HBA reset
[Resend patch as per Bernd Schubert comment ] Issue: Device goes offline while doing aggressive HBA reset along with IO using some utility. Root cause: FW goes into bad state due to aggressive reset. Softreset does not help to recover FW. And also aggressive reset open up the window for Error handling thread to kicked off at the same time HBA will be in constant RESET loop as part of aggressive reset test case can lead Device to goes offline. Changes: 1. Added extra check as below inside eh_timed_out call back as below. if(ioc->ioc_reset_in_progress) Rc = EH_TIMER_RESET 2. Removed " DOORBELL_ACTIVE" check for SAS controller from task management context. Since SAS controller uses high priority queue for task management. This check is not required for SAS controller. 3. Moved SoftReset call to HardReset from Task Mgmt context. Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/message/fusion/mptscsih.c')
-rw-r--r--drivers/message/fusion/mptscsih.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c
index de8cf92d8614..ced6e4dc0847 100644
--- a/drivers/message/fusion/mptscsih.c
+++ b/drivers/message/fusion/mptscsih.c
@@ -1630,7 +1630,13 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun,
1630 return 0; 1630 return 0;
1631 } 1631 }
1632 1632
1633 if (ioc_raw_state & MPI_DOORBELL_ACTIVE) { 1633 /* DOORBELL ACTIVE check is not required if
1634 * MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q is supported.
1635 */
1636
1637 if (!((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q)
1638 && (ioc->facts.MsgVersion >= MPI_VERSION_01_05)) &&
1639 (ioc_raw_state & MPI_DOORBELL_ACTIVE)) {
1634 printk(MYIOC_s_WARN_FMT 1640 printk(MYIOC_s_WARN_FMT
1635 "TaskMgmt type=%x: ioc_state: " 1641 "TaskMgmt type=%x: ioc_state: "
1636 "DOORBELL_ACTIVE (0x%x)!\n", 1642 "DOORBELL_ACTIVE (0x%x)!\n",
@@ -1729,7 +1735,9 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun,
1729 printk(MYIOC_s_WARN_FMT 1735 printk(MYIOC_s_WARN_FMT
1730 "Issuing Reset from %s!! doorbell=0x%08x\n", 1736 "Issuing Reset from %s!! doorbell=0x%08x\n",
1731 ioc->name, __func__, mpt_GetIocState(ioc, 0)); 1737 ioc->name, __func__, mpt_GetIocState(ioc, 0));
1732 retval = mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP); 1738 retval = (ioc->bus_type == SAS) ?
1739 mpt_HardResetHandler(ioc, CAN_SLEEP) :
1740 mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
1733 mpt_free_msg_frame(ioc, mf); 1741 mpt_free_msg_frame(ioc, mf);
1734 } 1742 }
1735 1743