Commit 243de676 authored by Harish Zunjarrao's avatar Harish Zunjarrao Committed by Martin K. Petersen
Browse files

qla2xxx: Add support for Private link statistics counters.

parent 969a6199
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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;
}
+61 −0
Original line number Diff line number Diff line
@@ -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;
	}
+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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  |
+30 −2
Original line number Diff line number Diff line
@@ -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];
};

/*
Loading