qla2xxx: Add support for Private link statistics counters.
Signed-off-by: Harish Zunjarrao <harish.zunjarrao@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Родитель
969a619966
Коммит
243de6768d
|
@ -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, &stats_dma);
|
||||
stats = dma_alloc_coherent(&ha->pdev->dev,
|
||||
sizeof(struct link_statistics), &stats_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(&ha->pdev->dev, sizeof(struct link_statistics),
|
||||
stats, stats_dma);
|
||||
done:
|
||||
return pfc_host_stat;
|
||||
}
|
||||
|
|
|
@ -2232,6 +2232,64 @@ qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job)
|
|||
return 0;
|
||||
}
|
||||
|
||||
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, &vha->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(&ha->pdev->dev,
|
||||
sizeof(struct link_statistics), &stats_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(&ha->pdev->dev, sizeof(struct link_statistics),
|
||||
stats, stats_dma);
|
||||
done:
|
||||
return rval;
|
||||
}
|
||||
|
||||
static int
|
||||
qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#define QL_VND_GET_FLASH_UPDATE_CAPS 0x15
|
||||
#define QL_VND_SET_FLASH_UPDATE_CAPS 0x16
|
||||
#define QL_VND_GET_BBCR_DATA 0x17
|
||||
#define QL_VND_GET_PRIV_STATS 0x18
|
||||
|
||||
/* BSG Vendor specific subcode returns */
|
||||
#define EXT_STATUS_OK 0
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
* | | | 0x503d,0x5044 |
|
||||
* | | | 0x507b,0x505f |
|
||||
* | Timer Routines | 0x6012 | |
|
||||
* | User Space Interactions | 0x70e65 | 0x7018,0x702e |
|
||||
* | User Space Interactions | 0x70e3 | 0x7018,0x702e |
|
||||
* | | | 0x7020,0x7024 |
|
||||
* | | | 0x7039,0x7045 |
|
||||
* | | | 0x7073-0x7075 |
|
||||
|
|
|
@ -1254,13 +1254,41 @@ struct link_statistics {
|
|||
uint32_t inval_xmit_word_cnt;
|
||||
uint32_t inval_crc_cnt;
|
||||
uint32_t lip_cnt;
|
||||
uint32_t unused1[0x1a];
|
||||
uint32_t link_up_cnt;
|
||||
uint32_t link_down_loop_init_tmo;
|
||||
uint32_t link_down_los;
|
||||
uint32_t link_down_loss_rcv_clk;
|
||||
uint32_t reserved0[5];
|
||||
uint32_t port_cfg_chg;
|
||||
uint32_t reserved1[11];
|
||||
uint32_t rsp_q_full;
|
||||
uint32_t atio_q_full;
|
||||
uint32_t drop_ae;
|
||||
uint32_t els_proto_err;
|
||||
uint32_t reserved2;
|
||||
uint32_t tx_frames;
|
||||
uint32_t rx_frames;
|
||||
uint32_t discarded_frames;
|
||||
uint32_t dropped_frames;
|
||||
uint32_t unused2[1];
|
||||
uint32_t reserved3;
|
||||
uint32_t nos_rcvd;
|
||||
uint32_t reserved4[4];
|
||||
uint32_t tx_prjt;
|
||||
uint32_t rcv_exfail;
|
||||
uint32_t rcv_abts;
|
||||
uint32_t seq_frm_miss;
|
||||
uint32_t corr_err;
|
||||
uint32_t mb_rqst;
|
||||
uint32_t nport_full;
|
||||
uint32_t eofa;
|
||||
uint32_t reserved5;
|
||||
uint32_t fpm_recv_word_cnt_lo;
|
||||
uint32_t fpm_recv_word_cnt_hi;
|
||||
uint32_t fpm_disc_word_cnt_lo;
|
||||
uint32_t fpm_disc_word_cnt_hi;
|
||||
uint32_t fpm_xmit_word_cnt_lo;
|
||||
uint32_t fpm_xmit_word_cnt_hi;
|
||||
uint32_t reserved6[70];
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -2799,7 +2799,8 @@ qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id,
|
|||
/* Copy over data -- firmware data is LE. */
|
||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1086,
|
||||
"Done %s.\n", __func__);
|
||||
dwords = offsetof(struct link_statistics, unused1) / 4;
|
||||
dwords = offsetof(struct link_statistics,
|
||||
link_up_cnt) / 4;
|
||||
siter = diter = &stats->link_fail_cnt;
|
||||
while (dwords--)
|
||||
*diter++ = le32_to_cpu(*siter++);
|
||||
|
|
Загрузка…
Ссылка в новой задаче