qla2xxx: Add diagnostic port functionality.
authorJoe Carnuccio <joe.carnuccio@qlogic.com>
Thu, 25 Sep 2014 09:16:48 +0000 (05:16 -0400)
committerChristoph Hellwig <hch@lst.de>
Thu, 25 Sep 2014 12:25:03 +0000 (14:25 +0200)
Add support for the D-port (diagnostic port) fabric switch feature.

(Fabric Switch initiates loopback style port testing)

Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_fw.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mbx.c

index 868f4e5bd86305f662a99c63701c43147bc4df0e..677239f41ea52b54c0682968a5efa602e99c50d3 100644 (file)
@@ -1440,7 +1440,7 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
 {
        scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
        int rval = QLA_FUNCTION_FAILED;
-       uint16_t state[5];
+       uint16_t state[6];
        uint32_t pstate;
 
        if (IS_QLAFX00(vha->hw)) {
@@ -1456,8 +1456,8 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
        if (rval != QLA_SUCCESS)
                memset(state, -1, sizeof(state));
 
-       return scnprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x\n", state[0],
-           state[1], state[2], state[3], state[4]);
+       return scnprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
+           state[0], state[1], state[2], state[3], state[4], state[5]);
 }
 
 static ssize_t
index b33eec01d6dc92f3f1e9bee17c3773d37ebc75c4..2d5610be2d70f6abe42bc5a58498f5fe3295c655 100644 (file)
@@ -28,7 +28,7 @@
  * |                              |                    | 0x303a                |
  * | DPC Thread                   |       0x4023       | 0x4002,0x4013  |
  * | Async Events                 |       0x5087       | 0x502b-0x502f  |
- * |                              |                    | 0x5047,0x5052  |
+ * |                              |                    | 0x5047                |
  * |                              |                    | 0x5084,0x5075 |
  * |                              |                    | 0x503d,0x5044  |
  * |                              |                    | 0x507b,0x505f |
index e5baead2369ab111ba90ea7272496225ae8b069f..c161d60759e90266145b452345957fa89047bd47 100644 (file)
@@ -803,6 +803,7 @@ struct mbx_cmd_32 {
 #define MBA_FW_RESTART_CMPLT   0x8060  /* Firmware restart complete */
 #define MBA_INIT_REQUIRED      0x8061  /* Initialization required */
 #define MBA_SHUTDOWN_REQUESTED 0x8062  /* Shutdown Requested */
+#define MBA_DPORT_DIAGNOSTICS  0x8080  /* D-port Diagnostics */
 #define MBA_FW_INIT_FAILURE    0x8401  /* Firmware initialization failure */
 #define MBA_MIRROR_LUN_CHANGE  0x8402  /* Mirror LUN State Change
                                           Notification */
@@ -948,6 +949,7 @@ struct mbx_cmd_32 {
 #define MBC_WRITE_SFP                  0x30    /* Write SFP Data. */
 #define MBC_READ_SFP                   0x31    /* Read SFP Data. */
 #define MBC_SET_TIMEOUT_PARAMS         0x32    /* Set FW timeouts. */
+#define MBC_DPORT_DIAGNOSTICS          0x47    /* D-Port Diagnostics */
 #define MBC_MID_INITIALIZE_FIRMWARE    0x48    /* MID Initialize firmware. */
 #define MBC_MID_GET_VP_DATABASE                0x49    /* MID Get VP Database. */
 #define MBC_MID_GET_VP_ENTRY           0x4a    /* MID Get VP Entry. */
index e8669aa7e0024c5ed92a53722dba14a8ea4fbf34..7f2e1c71cc3174b728eec878226d40b7819d7af8 100644 (file)
@@ -318,7 +318,7 @@ struct init_cb_24xx {
         * BIT 4  = Enable Target Mode
         * BIT 5  = Disable Initiator Mode
         * BIT 6  = Acquire FA-WWN
-        * BIT 7  = Reserved
+        * BIT 7  = Enable D-port Diagnostics
         *
         * BIT 8  = Reserved
         * BIT 9  = Non Participating LIP
index 748bd90936804eca14f73cd5489f9bf97766109e..d5b10ecde4a03e4a9b312839b577bf43442c7627 100644 (file)
@@ -2224,7 +2224,7 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)
        unsigned long   wtime, mtime, cs84xx_time;
        uint16_t        min_wait;       /* Minimum wait time if loop is down */
        uint16_t        wait_time;      /* Wait time if loop is coming ready */
-       uint16_t        state[5];
+       uint16_t        state[6];
        struct qla_hw_data *ha = vha->hw;
 
        if (IS_QLAFX00(vha->hw))
@@ -2329,8 +2329,8 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)
        } while (1);
 
        ql_dbg(ql_dbg_taskm, vha, 0x803a,
-           "fw_state=%x (%x, %x, %x, %x) " "curr time=%lx.\n", state[0],
-           state[1], state[2], state[3], state[4], jiffies);
+           "fw_state=%x (%x, %x, %x, %x %x) curr time=%lx.\n", state[0],
+           state[1], state[2], state[3], state[4], state[5], jiffies);
 
        if (rval && !(vha->device_flags & DFLG_NO_CABLE)) {
                ql_log(ql_log_warn, vha, 0x803b,
index 223c1a89af5cb3acb66c0a5d95b7905af9183a0e..550ffdf0bf17d5493297e3d39f729aaf0950eecb 100644 (file)
@@ -1086,6 +1086,14 @@ skip_rio:
                qla83xx_handle_8200_aen(vha, mb);
                break;
 
+       case MBA_DPORT_DIAGNOSTICS:
+               ql_dbg(ql_dbg_async, vha, 0x5052,
+                   "D-Port Diagnostics: %04x %04x=%s\n", mb[0], mb[1],
+                   mb[1] == 0 ? "start" :
+                   mb[1] == 1 ? "done (ok)" :
+                   mb[1] == 2 ? "done (error)" : "other");
+               break;
+
        default:
                ql_dbg(ql_dbg_async, vha, 0x5057,
                    "Unknown AEN:%04x %04x %04x %04x\n",
index 2de901bf87aba32b15e9af495570e0ef2952fd41..72971daa25520a6f9b2f897e2105ed7419129841 100644 (file)
@@ -1564,7 +1564,7 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states)
        mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
        mcp->out_mb = MBX_0;
        if (IS_FWI2_CAPABLE(vha->hw))
-               mcp->in_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+               mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
        else
                mcp->in_mb = MBX_1|MBX_0;
        mcp->tov = MBX_TOV_SECONDS;
@@ -1578,6 +1578,7 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states)
                states[2] = mcp->mb[3];
                states[3] = mcp->mb[4];
                states[4] = mcp->mb[5];
+               states[5] = mcp->mb[6];  /* DPORT status */
        }
 
        if (rval != QLA_SUCCESS) {