aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_isr.c
diff options
context:
space:
mode:
authorChad Dupuis <chad.dupuis@qlogic.com>2013-02-08 01:57:51 -0500
committerJames Bottomley <JBottomley@Parallels.com>2013-02-22 07:39:56 -0500
commit67b2a31f517a43631af218d146e39f4e502b3e83 (patch)
tree03f9e03ce629a9eb896b285260d7baaa447e383b /drivers/scsi/qla2xxx/qla_isr.c
parentb00ee7d770abbe1e63df74eada0376c75ceb2daf (diff)
[SCSI] qla2xxx: Extra loopback error handling for ISP83xx.
Add the following error handling for loopback diagnostic mode with ISP83xx: 1. If we do not receive an MBA_DCBX_COMPLETE after our initial set port configuration command, try to reset the port back into normal operation. If that fails, take a FCoE dump and then reset the chip. 2. After completing the loopback diagnostic operation, if the reset of the port back into normal operation fails then reset the port so we take a FCoE dump and then reset the chip. 3. When we receive an IDC notification and the requested operation is loopback extend the loop down timer so the link does not appear to down for an extended period of time. [jejb: fix checkpatch issue] Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_isr.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 26a3086a7e3a..9380d961616c 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -985,13 +985,21 @@ skip_rio:
985 mb[1], mb[2], mb[3]); 985 mb[1], mb[2], mb[3]);
986 break; 986 break;
987 case MBA_IDC_NOTIFY: 987 case MBA_IDC_NOTIFY:
988 /* See if we need to quiesce any I/O */ 988 if (IS_QLA8031(vha->hw)) {
989 if (IS_QLA8031(vha->hw)) 989 mb[4] = RD_REG_WORD(&reg24->mailbox4);
990 if ((mb[2] & 0x7fff) == MBC_PORT_RESET || 990 if (((mb[2] & 0x7fff) == MBC_PORT_RESET ||
991 (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) { 991 (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) &&
992 (mb[4] & INTERNAL_LOOPBACK_MASK) != 0) {
992 set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags); 993 set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
994 /*
995 * Extend loop down timer since port is active.
996 */
997 if (atomic_read(&vha->loop_state) == LOOP_DOWN)
998 atomic_set(&vha->loop_down_timer,
999 LOOP_DOWN_TIME);
993 qla2xxx_wake_dpc(vha); 1000 qla2xxx_wake_dpc(vha);
994 } 1001 }
1002 }
995 case MBA_IDC_COMPLETE: 1003 case MBA_IDC_COMPLETE:
996 case MBA_IDC_TIME_EXT: 1004 case MBA_IDC_TIME_EXT:
997 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw)) 1005 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw))