mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
[SCSI] bnx2fc: Tx/Rx byte counts reset to 0 when exceeding 32 bit values
Since the FW counters are 32-bit, accumulate the stats in the driver. [jejb: fix checkpatch warning] Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
e7f4fed5fa
commit
f246fe2a56
2 changed files with 34 additions and 5 deletions
|
@ -156,6 +156,18 @@
|
|||
#define BNX2FC_RELOGIN_WAIT_TIME 200
|
||||
#define BNX2FC_RELOGIN_WAIT_CNT 10
|
||||
|
||||
#define BNX2FC_STATS(hba, stat, cnt) \
|
||||
do { \
|
||||
u32 val; \
|
||||
\
|
||||
val = fw_stats->stat.cnt; \
|
||||
if (hba->prev_stats.stat.cnt <= val) \
|
||||
val -= hba->prev_stats.stat.cnt; \
|
||||
else \
|
||||
val += (0xfffffff - hba->prev_stats.stat.cnt); \
|
||||
hba->bfw_stats.cnt += val; \
|
||||
} while (0)
|
||||
|
||||
/* bnx2fc driver uses only one instance of fcoe_percpu_s */
|
||||
extern struct fcoe_percpu_s bnx2fc_global;
|
||||
|
||||
|
@ -167,6 +179,14 @@ struct bnx2fc_percpu_s {
|
|||
spinlock_t fp_work_lock;
|
||||
};
|
||||
|
||||
struct bnx2fc_fw_stats {
|
||||
u64 fc_crc_cnt;
|
||||
u64 fcoe_tx_pkt_cnt;
|
||||
u64 fcoe_rx_pkt_cnt;
|
||||
u64 fcoe_tx_byte_cnt;
|
||||
u64 fcoe_rx_byte_cnt;
|
||||
};
|
||||
|
||||
struct bnx2fc_hba {
|
||||
struct list_head list;
|
||||
struct cnic_dev *cnic;
|
||||
|
@ -207,6 +227,8 @@ struct bnx2fc_hba {
|
|||
struct bnx2fc_rport **tgt_ofld_list;
|
||||
|
||||
/* statistics */
|
||||
struct bnx2fc_fw_stats bfw_stats;
|
||||
struct fcoe_statistics_params prev_stats;
|
||||
struct fcoe_statistics_params *stats_buffer;
|
||||
dma_addr_t stats_buf_dma;
|
||||
struct completion stat_req_done;
|
||||
|
|
|
@ -687,11 +687,16 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
|
|||
BNX2FC_HBA_DBG(lport, "FW stat req timed out\n");
|
||||
return bnx2fc_stats;
|
||||
}
|
||||
bnx2fc_stats->invalid_crc_count += fw_stats->rx_stat2.fc_crc_cnt;
|
||||
bnx2fc_stats->tx_frames += fw_stats->tx_stat.fcoe_tx_pkt_cnt;
|
||||
bnx2fc_stats->tx_words += (fw_stats->tx_stat.fcoe_tx_byte_cnt) / 4;
|
||||
bnx2fc_stats->rx_frames += fw_stats->rx_stat0.fcoe_rx_pkt_cnt;
|
||||
bnx2fc_stats->rx_words += (fw_stats->rx_stat0.fcoe_rx_byte_cnt) / 4;
|
||||
BNX2FC_STATS(hba, rx_stat2, fc_crc_cnt);
|
||||
bnx2fc_stats->invalid_crc_count += hba->bfw_stats.fc_crc_cnt;
|
||||
BNX2FC_STATS(hba, tx_stat, fcoe_tx_pkt_cnt);
|
||||
bnx2fc_stats->tx_frames += hba->bfw_stats.fcoe_tx_pkt_cnt;
|
||||
BNX2FC_STATS(hba, tx_stat, fcoe_tx_byte_cnt);
|
||||
bnx2fc_stats->tx_words += ((hba->bfw_stats.fcoe_tx_byte_cnt) / 4);
|
||||
BNX2FC_STATS(hba, rx_stat0, fcoe_rx_pkt_cnt);
|
||||
bnx2fc_stats->rx_frames += hba->bfw_stats.fcoe_rx_pkt_cnt;
|
||||
BNX2FC_STATS(hba, rx_stat0, fcoe_rx_byte_cnt);
|
||||
bnx2fc_stats->rx_words += ((hba->bfw_stats.fcoe_rx_byte_cnt) / 4);
|
||||
|
||||
bnx2fc_stats->dumped_frames = 0;
|
||||
bnx2fc_stats->lip_count = 0;
|
||||
|
@ -700,6 +705,8 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
|
|||
bnx2fc_stats->loss_of_signal_count = 0;
|
||||
bnx2fc_stats->prim_seq_protocol_err_count = 0;
|
||||
|
||||
memcpy(&hba->prev_stats, hba->stats_buffer,
|
||||
sizeof(struct fcoe_statistics_params));
|
||||
return bnx2fc_stats;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue