]> Pileus Git - ~andy/linux/commitdiff
[SCSI] qla2xxx: Do link initialization on get loop id failure.
authorJoe Carnuccio <joe.carnuccio@qlogic.com>
Fri, 8 Feb 2013 06:57:48 +0000 (01:57 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 22 Feb 2013 12:31:36 +0000 (12:31 +0000)
To avoid continually doing ISP resets when get loop id fails to
obtain the adapter loop id, first try to do a link initialization.

Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_mbx.c

index c1d2310c615e87f2813dea173653d83d0feb9f1e..65e95bdce704ff792876e7e46b2b66e7da6ab88c 100644 (file)
@@ -12,7 +12,7 @@
  * |             Level            |   Last Value Used  |     Holes     |
  * ----------------------------------------------------------------------
  * | Module Init and Probe        |       0x0126       | 0x4b,0xba,0xfa |
- * | Mailbox commands             |       0x1150       | 0x111a-0x111b  |
+ * | Mailbox commands             |       0x1154       | 0x111a-0x111b  |
  * |                              |                    | 0x112c-0x112e  |
  * |                              |                    | 0x113a         |
  * | Device Discovery             |       0x2087       | 0x2020-0x2022, |
index 5c42c9162026c8eca2ed764b4ab4e75508d2db6d..e96abfc069e65c27216986f80f705712a9944a51 100644 (file)
@@ -814,6 +814,7 @@ typedef struct {
 #define MBC_HOST_MEMORY_COPY           0x53    /* Host Memory Copy. */
 #define MBC_SEND_RNFT_ELS              0x5e    /* Send RNFT ELS request */
 #define MBC_GET_LINK_PRIV_STATS                0x6d    /* Get link & private data. */
+#define MBC_LINK_INITIALIZATION                0x72    /* Do link initialization. */
 #define MBC_SET_VENDOR_ID              0x76    /* Set Vendor ID. */
 #define MBC_PORT_RESET                 0x120   /* Port Reset */
 #define MBC_SET_PORT_CONFIG            0x122   /* Set port configuration */
index 1732713e80cc0ec37762c08abb473a62878f1879..ee8ea952ed241120be62e5ceff437e2a0b2d1e48 100644 (file)
@@ -281,6 +281,9 @@ qla2x00_get_firmware_state(scsi_qla_host_t *, uint16_t *);
 extern int
 qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t);
 
+extern int
+qla24xx_link_initialize(scsi_qla_host_t *);
+
 extern int
 qla2x00_lip_reset(scsi_qla_host_t *);
 
index bbf5688885f1e898fd80a3f7c99f36909297e0fa..97f268433b9f8100fc543d3259cfb19a6acbf4cb 100644 (file)
@@ -2207,6 +2207,7 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
        char            connect_type[22];
        struct qla_hw_data *ha = vha->hw;
        unsigned long flags;
+       scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
 
        /* Get host addresses. */
        rval = qla2x00_get_adapter_id(vha,
@@ -2220,6 +2221,13 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
                } else {
                        ql_log(ql_log_warn, vha, 0x2009,
                            "Unable to get host loop ID.\n");
+                       if (IS_FWI2_CAPABLE(ha) && (vha == base_vha) &&
+                           (rval == QLA_COMMAND_ERROR && loop_id == 0x1b)) {
+                               ql_log(ql_log_warn, vha, 0x1151,
+                                   "Doing link init.\n");
+                               if (qla24xx_link_initialize(vha) == QLA_SUCCESS)
+                                       return rval;
+                       }
                        set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
                }
                return (rval);
index 92d51fc78c08b8fa32abbc2461c1cfd27968edae..550f75a3269b08c225557ca4786e07c5b3c6d2a0 100644 (file)
@@ -1632,6 +1632,54 @@ qla2x00_get_port_name(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t *name,
        return rval;
 }
 
+/*
+ * qla24xx_link_initialization
+ *     Issue link initialization mailbox command.
+ *
+ * Input:
+ *     ha = adapter block pointer.
+ *     TARGET_QUEUE_LOCK must be released.
+ *     ADAPTER_STATE_LOCK must be released.
+ *
+ * Returns:
+ *     qla2x00 local function return status code.
+ *
+ * Context:
+ *     Kernel context.
+ */
+int
+qla24xx_link_initialize(scsi_qla_host_t *vha)
+{
+       int rval;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1152,
+           "Entered %s.\n", __func__);
+
+       if (!IS_FWI2_CAPABLE(vha->hw) || IS_CNA_CAPABLE(vha->hw))
+               return QLA_FUNCTION_FAILED;
+
+       mcp->mb[0] = MBC_LINK_INITIALIZATION;
+       mcp->mb[1] = BIT_6|BIT_4;
+       mcp->mb[2] = 0;
+       mcp->mb[3] = 0;
+       mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
+       mcp->in_mb = MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (rval != QLA_SUCCESS) {
+               ql_dbg(ql_dbg_mbx, vha, 0x1153, "Failed=%x.\n", rval);
+       } else {
+               ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1154,
+                   "Done %s.\n", __func__);
+       }
+
+       return rval;
+}
+
 /*
  * qla2x00_lip_reset
  *     Issue LIP reset mailbox command.