Re: [PATCH 06/11] qla2xxx: Add support for Private link statistics counters.

2016-01-27 Thread Hannes Reinecke
On 01/26/2016 06:10 PM, Himanshu Madhani wrote:
> From: Harish Zunjarrao 
> 
> Signed-off-by: Harish Zunjarrao 
> Signed-off-by: Himanshu Madhani 
> ---
>  drivers/scsi/qla2xxx/qla_attr.c |6 ++-
>  drivers/scsi/qla2xxx/qla_bsg.c  |   61 
> +++
>  drivers/scsi/qla2xxx/qla_bsg.h  |1 +
>  drivers/scsi/qla2xxx/qla_dbg.c  |2 +-
>  drivers/scsi/qla2xxx/qla_def.h  |   32 +++-
>  drivers/scsi/qla2xxx/qla_mbx.c  |3 +-
>  6 files changed, 99 insertions(+), 6 deletions(-)
> 
Reviewed-by: Hannes Reinecke 

Cheers,

Hannes
-- 
Dr. Hannes ReineckeTeamlead Storage & Networking
h...@suse.de   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 06/11] qla2xxx: Add support for Private link statistics counters.

2016-01-26 Thread Himanshu Madhani
From: Harish Zunjarrao 

Signed-off-by: Harish Zunjarrao 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |6 ++-
 drivers/scsi/qla2xxx/qla_bsg.c  |   61 +++
 drivers/scsi/qla2xxx/qla_bsg.h  |1 +
 drivers/scsi/qla2xxx/qla_dbg.c  |2 +-
 drivers/scsi/qla2xxx/qla_def.h  |   32 +++-
 drivers/scsi/qla2xxx/qla_mbx.c  |3 +-
 6 files changed, 99 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index fef659a..fadce04 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1917,7 +1917,8 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
if (qla2x00_reset_active(vha))
goto done;
 
-   stats = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, _dma);
+   stats = dma_alloc_coherent(>pdev->dev,
+   sizeof(struct link_statistics), _dma, GFP_KERNEL);
if (stats == NULL) {
ql_log(ql_log_warn, vha, 0x707d,
"Failed to allocate memory for stats.\n");
@@ -1965,7 +1966,8 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
do_div(pfc_host_stat->seconds_since_last_reset, HZ);
 
 done_free:
-dma_pool_free(ha->s_dma_pool, stats, stats_dma);
+   dma_free_coherent(>pdev->dev, sizeof(struct link_statistics),
+   stats, stats_dma);
 done:
return pfc_host_stat;
 }
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index d135d6a..913fef2 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2233,6 +2233,64 @@ qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job)
 }
 
 static int
+qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job)
+{
+   struct Scsi_Host *host = bsg_job->shost;
+   scsi_qla_host_t *vha = shost_priv(host);
+   struct qla_hw_data *ha = vha->hw;
+   struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
+   struct link_statistics *stats = NULL;
+   dma_addr_t stats_dma;
+   int rval = QLA_FUNCTION_FAILED;
+
+   if (test_bit(UNLOADING, >dpc_flags))
+   goto done;
+
+   if (unlikely(pci_channel_offline(ha->pdev)))
+   goto done;
+
+   if (qla2x00_reset_active(vha))
+   goto done;
+
+   if (!IS_FWI2_CAPABLE(ha))
+   goto done;
+
+   stats = dma_alloc_coherent(>pdev->dev,
+   sizeof(struct link_statistics), _dma, GFP_KERNEL);
+   if (!stats) {
+   ql_log(ql_log_warn, vha, 0x70e2,
+   "Failed to allocate memory for stats.\n");
+   goto done;
+   }
+
+   memset(stats, 0, sizeof(struct link_statistics));
+
+   rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma);
+
+   if (rval != QLA_SUCCESS)
+   goto done_free;
+
+   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e3,
+   (uint8_t *)stats, sizeof(struct link_statistics));
+
+   sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
+   bsg_job->reply_payload.sg_cnt, stats, sizeof(struct link_statistics));
+   bsg_job->reply->reply_payload_rcv_len = sizeof(struct link_statistics);
+
+   bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = EXT_STATUS_OK;
+
+   bsg_job->reply_len = sizeof(struct fc_bsg_reply);
+   bsg_job->reply->result = DID_OK << 16;
+   bsg_job->job_done(bsg_job);
+
+done_free:
+   dma_free_coherent(>pdev->dev, sizeof(struct link_statistics),
+   stats, stats_dma);
+done:
+   return rval;
+}
+
+static int
 qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
 {
switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) {
@@ -2296,6 +2354,9 @@ qla2x00_process_vendor_specific(struct fc_bsg_job 
*bsg_job)
case QL_VND_GET_BBCR_DATA:
return qla27xx_get_bbcr_data(bsg_job);
 
+   case QL_VND_GET_PRIV_STATS:
+   return qla2x00_get_priv_stats(bsg_job);
+
default:
return -ENOSYS;
}
diff --git a/drivers/scsi/qla2xxx/qla_bsg.h b/drivers/scsi/qla2xxx/qla_bsg.h
index 4275177..c40dd8b 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.h
+++ b/drivers/scsi/qla2xxx/qla_bsg.h
@@ -28,6 +28,7 @@
 #define QL_VND_GET_FLASH_UPDATE_CAPS0x15
 #define QL_VND_SET_FLASH_UPDATE_CAPS0x16
 #define QL_VND_GET_BBCR_DATA0x17
+#define QL_VND_GET_PRIV_STATS  0x18
 
 /* BSG Vendor specific subcode returns */
 #define EXT_STATUS_OK  0
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 493a3ea81..aa6694b 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -32,7 +32,7 @@
  * |  || 0x503d,0x5044  |
  * |  || 0x507b,0x505f |
  * | Timer Routines   |