Skip to content

Commit 5b0752c

Browse files
Ariel Eliordavem330
authored andcommitted
bnx2x: Fix VF statistics
After a VF performs load/unload its statistics become corrupt - we now zero the statistics structures upon a VF device load. Signed-off-by: Ariel Elior <[email protected]> Signed-off-by: Yuval Mintz <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1093860 commit 5b0752c

File tree

3 files changed

+47
-37
lines changed

3 files changed

+47
-37
lines changed

drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6041,9 +6041,10 @@ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code)
60416041
rmb();
60426042
bnx2x_init_rx_rings(bp);
60436043
bnx2x_init_tx_rings(bp);
6044-
6045-
if (IS_VF(bp))
6044+
if (IS_VF(bp)) {
6045+
bnx2x_memset_stats(bp);
60466046
return;
6047+
}
60476048

60486049
/* Initialize MOD_ABS interrupts */
60496050
bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id,

drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,11 +1547,51 @@ static void bnx2x_prep_fw_stats_req(struct bnx2x *bp)
15471547
}
15481548
}
15491549

1550+
void bnx2x_memset_stats(struct bnx2x *bp)
1551+
{
1552+
int i;
1553+
1554+
/* function stats */
1555+
for_each_queue(bp, i) {
1556+
struct bnx2x_fp_stats *fp_stats = &bp->fp_stats[i];
1557+
1558+
memset(&fp_stats->old_tclient, 0,
1559+
sizeof(fp_stats->old_tclient));
1560+
memset(&fp_stats->old_uclient, 0,
1561+
sizeof(fp_stats->old_uclient));
1562+
memset(&fp_stats->old_xclient, 0,
1563+
sizeof(fp_stats->old_xclient));
1564+
if (bp->stats_init) {
1565+
memset(&fp_stats->eth_q_stats, 0,
1566+
sizeof(fp_stats->eth_q_stats));
1567+
memset(&fp_stats->eth_q_stats_old, 0,
1568+
sizeof(fp_stats->eth_q_stats_old));
1569+
}
1570+
}
1571+
1572+
memset(&bp->dev->stats, 0, sizeof(bp->dev->stats));
1573+
1574+
if (bp->stats_init) {
1575+
memset(&bp->net_stats_old, 0, sizeof(bp->net_stats_old));
1576+
memset(&bp->fw_stats_old, 0, sizeof(bp->fw_stats_old));
1577+
memset(&bp->eth_stats_old, 0, sizeof(bp->eth_stats_old));
1578+
memset(&bp->eth_stats, 0, sizeof(bp->eth_stats));
1579+
memset(&bp->func_stats, 0, sizeof(bp->func_stats));
1580+
}
1581+
1582+
bp->stats_state = STATS_STATE_DISABLED;
1583+
1584+
if (bp->port.pmf && bp->port.port_stx)
1585+
bnx2x_port_stats_base_init(bp);
1586+
1587+
/* mark the end of statistics initializiation */
1588+
bp->stats_init = false;
1589+
}
1590+
15501591
void bnx2x_stats_init(struct bnx2x *bp)
15511592
{
15521593
int /*abs*/port = BP_PORT(bp);
15531594
int mb_idx = BP_FW_MB_IDX(bp);
1554-
int i;
15551595

15561596
bp->stats_pending = 0;
15571597
bp->executer_idx = 0;
@@ -1587,36 +1627,11 @@ void bnx2x_stats_init(struct bnx2x *bp)
15871627
&(bp->port.old_nig_stats.egress_mac_pkt1_lo), 2);
15881628
}
15891629

1590-
/* function stats */
1591-
for_each_queue(bp, i) {
1592-
struct bnx2x_fp_stats *fp_stats = &bp->fp_stats[i];
1593-
1594-
memset(&fp_stats->old_tclient, 0,
1595-
sizeof(fp_stats->old_tclient));
1596-
memset(&fp_stats->old_uclient, 0,
1597-
sizeof(fp_stats->old_uclient));
1598-
memset(&fp_stats->old_xclient, 0,
1599-
sizeof(fp_stats->old_xclient));
1600-
if (bp->stats_init) {
1601-
memset(&fp_stats->eth_q_stats, 0,
1602-
sizeof(fp_stats->eth_q_stats));
1603-
memset(&fp_stats->eth_q_stats_old, 0,
1604-
sizeof(fp_stats->eth_q_stats_old));
1605-
}
1606-
}
1607-
16081630
/* Prepare statistics ramrod data */
16091631
bnx2x_prep_fw_stats_req(bp);
16101632

1611-
memset(&bp->dev->stats, 0, sizeof(bp->dev->stats));
1633+
/* Clean SP from previous statistics */
16121634
if (bp->stats_init) {
1613-
memset(&bp->net_stats_old, 0, sizeof(bp->net_stats_old));
1614-
memset(&bp->fw_stats_old, 0, sizeof(bp->fw_stats_old));
1615-
memset(&bp->eth_stats_old, 0, sizeof(bp->eth_stats_old));
1616-
memset(&bp->eth_stats, 0, sizeof(bp->eth_stats));
1617-
memset(&bp->func_stats, 0, sizeof(bp->func_stats));
1618-
1619-
/* Clean SP from previous statistics */
16201635
if (bp->func_stx) {
16211636
memset(bnx2x_sp(bp, func_stats), 0,
16221637
sizeof(struct host_func_stats));
@@ -1626,13 +1641,7 @@ void bnx2x_stats_init(struct bnx2x *bp)
16261641
}
16271642
}
16281643

1629-
bp->stats_state = STATS_STATE_DISABLED;
1630-
1631-
if (bp->port.pmf && bp->port.port_stx)
1632-
bnx2x_port_stats_base_init(bp);
1633-
1634-
/* mark the end of statistics initializiation */
1635-
bp->stats_init = false;
1644+
bnx2x_memset_stats(bp);
16361645
}
16371646

16381647
void bnx2x_save_statistics(struct bnx2x *bp)

drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,8 @@ struct bnx2x_fw_port_stats_old {
540540
/* forward */
541541
struct bnx2x;
542542

543+
void bnx2x_memset_stats(struct bnx2x *bp);
543544
void bnx2x_stats_init(struct bnx2x *bp);
544-
545545
void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event);
546546

547547
/**

0 commit comments

Comments
 (0)