]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Properly reset firmware statistics.
authorJoe Carnuccio <joe.carnuccio@qlogic.com>
Fri, 1 Apr 2016 19:35:55 +0000 (12:35 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 13 Jul 2016 07:41:34 +0000 (00:41 -0700)
Orabug: 23755773

Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Ethan Zhao <ethan.zhao@oracle.com>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_bsg.c
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_mbx.c

index a737e9b916c8a2b1292e20c9cf40e34cdd4c65f8..9335474971ab82071b83f124d4c3cefef3d81563 100644 (file)
@@ -1792,17 +1792,17 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
                goto done;
 
        stats = dma_alloc_coherent(&ha->pdev->dev,
-           sizeof(struct link_statistics), &stats_dma, GFP_KERNEL);
-       if (stats == NULL) {
+           sizeof(*stats), &stats_dma, GFP_KERNEL);
+       if (!stats) {
                ql_log(ql_log_warn, vha, 0x707d,
                    "Failed to allocate memory for stats.\n");
                goto done;
        }
-       memset(stats, 0, DMA_POOL_SIZE);
+       memset(stats, 0, sizeof(*stats));
 
        rval = QLA_FUNCTION_FAILED;
        if (IS_FWI2_CAPABLE(ha)) {
-               rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma);
+               rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, 0);
        } else if (atomic_read(&base_vha->loop_state) == LOOP_READY &&
            !ha->dpc_active) {
                /* Must be in a 'READY' state for statistics retrieval. */
@@ -1850,11 +1850,31 @@ static void
 qla2x00_reset_host_stats(struct Scsi_Host *shost)
 {
        scsi_qla_host_t *vha = shost_priv(shost);
+       struct qla_hw_data *ha = vha->hw;
+       struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
+       struct link_statistics *stats;
+       dma_addr_t stats_dma;
 
        memset(&vha->qla_stats, 0, sizeof(vha->qla_stats));
        memset(&vha->fc_host_stat, 0, sizeof(vha->fc_host_stat));
 
        vha->qla_stats.jiffies_at_last_reset = get_jiffies_64();
+
+       if (IS_FWI2_CAPABLE(ha)) {
+               stats = dma_alloc_coherent(&ha->pdev->dev,
+                   sizeof(*stats), &stats_dma, GFP_KERNEL);
+               if (!stats) {
+                       ql_log(ql_log_warn, vha, 0x70d7,
+                           "Failed to allocate memory for stats.\n");
+                       return;
+               }
+
+               /* reset firmware statistics */
+               qla24xx_get_isp_stats(base_vha, stats, stats_dma, BIT_0);
+
+               dma_free_coherent(&ha->pdev->dev, sizeof(*stats),
+                   stats, stats_dma);
+       }
 }
 
 static void
index 392c147d5793e4345d06b78c698b63cc9251282f..8cadc4da7d5977141349a606c40cfd46beb48391 100644 (file)
@@ -2270,7 +2270,7 @@ qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job)
 
        memset(stats, 0, sizeof(struct link_statistics));
 
-       rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma);
+       rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, 0);
 
        if (rval != QLA_SUCCESS)
                goto done_free;
index 8a4e22d6b7296eff04d91f64b20e34dd7d647c86..4ecdd330a81ef8a624660e5f071cfc6549fc80ae 100644 (file)
@@ -40,7 +40,7 @@
  * |                              |                    | 0x70ad-0x70ae  |
  * |                              |                    | 0x70d0-0x70d6 |
  * |                              |                    | 0x70d7-0x70db  |
- * |                              |                    | 0x70de-0x70df  |
+ * |                              |                    | 0x70db                |
  * | Task Management              |       0x803d       | 0x8000,0x800b  |
  * |                              |                    | 0x8019         |
  * |                              |                    | 0x8025,0x8026  |
index bfd2d8dd4d7eb990b36fd57a1562264803996a50..8ef678a30eff0a56f3adbf701f9b3b14f50c25d7 100644 (file)
@@ -337,7 +337,7 @@ qla2x00_get_link_status(scsi_qla_host_t *, uint16_t, struct link_statistics *,
 
 extern int
 qla24xx_get_isp_stats(scsi_qla_host_t *, struct link_statistics *,
-    dma_addr_t);
+    dma_addr_t, uint);
 
 extern int qla24xx_abort_command(srb_t *);
 extern int qla24xx_async_abort_command(srb_t *);
index 9c543f2c94669f6445dbe2d5450f044aa0c38e09..1a8b867465b733a1513b40f14437fc16a3594779 100644 (file)
@@ -2528,15 +2528,16 @@ qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id,
        int rval;
        mbx_cmd_t mc;
        mbx_cmd_t *mcp = &mc;
-       uint32_t *iter, dwords;
+       uint32_t *iter = (void *)stats;
+       ushort dwords = offsetof(typeof(*stats), link_up_cnt)/sizeof(*iter);
        struct qla_hw_data *ha = vha->hw;
 
        ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1084,
            "Entered %s.\n", __func__);
 
        mcp->mb[0] = MBC_GET_LINK_STATUS;
-       mcp->mb[2] = MSW(stats_dma);
-       mcp->mb[3] = LSW(stats_dma);
+       mcp->mb[2] = MSW(LSD(stats_dma));
+       mcp->mb[3] = LSW(LSD(stats_dma));
        mcp->mb[6] = MSW(MSD(stats_dma));
        mcp->mb[7] = LSW(MSD(stats_dma));
        mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
@@ -2565,12 +2566,9 @@ qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id,
                            "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
                        rval = QLA_FUNCTION_FAILED;
                } else {
-                       /* Copy over data -- firmware data is LE. */
+                       /* Re-endianize - firmware data is le32. */
                        ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1086,
                            "Done %s.\n", __func__);
-                       dwords = offsetof(struct link_statistics,
-                                       link_up_cnt) / 4;
-                       iter = &stats->link_fail_cnt;
                        for ( ; dwords--; iter++)
                                le32_to_cpus(iter);
                }
@@ -2584,7 +2582,7 @@ qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id,
 
 int
 qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats,
-    dma_addr_t stats_dma)
+    dma_addr_t stats_dma, uint options)
 {
        int rval;
        mbx_cmd_t mc;
@@ -2601,7 +2599,7 @@ qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats,
        mcp->mb[7] = LSW(MSD(stats_dma));
        mcp->mb[8] = sizeof(struct link_statistics) / 4;
        mcp->mb[9] = vha->vp_idx;
-       mcp->mb[10] = 0;
+       mcp->mb[10] = options;
        mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
        mcp->in_mb = MBX_2|MBX_1|MBX_0;
        mcp->tov = MBX_TOV_SECONDS;
@@ -2616,7 +2614,7 @@ qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats,
                } else {
                        ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x108a,
                            "Done %s.\n", __func__);
-                       /* Copy over data -- firmware data is LE. */
+                       /* Re-endianize - firmware data is le32. */
                        dwords = sizeof(struct link_statistics) / 4;
                        iter = &stats->link_fail_cnt;
                        for ( ; dwords--; iter++)