Skip to content

Commit e063f45

Browse files
committed
Merge branch 'bnxt_en-fixes'
Michael Chan says: ==================== bnxt_en: 2 bug fixes. The first patch prevents possible driver crash if we get a bad RX index from the hardware. The second patch resets the device when the hardware reports buffer error to recover from the error. Please queue these for -stable also. Thanks. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents a625204 + 8e44e96 commit e063f45

File tree

1 file changed

+13
-3
lines changed
  • drivers/net/ethernet/broadcom/bnxt

1 file changed

+13
-3
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,8 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
11331133
tpa_info = &rxr->rx_tpa[agg_id];
11341134

11351135
if (unlikely(cons != rxr->rx_next_cons)) {
1136+
netdev_warn(bp->dev, "TPA cons %x != expected cons %x\n",
1137+
cons, rxr->rx_next_cons);
11361138
bnxt_sched_reset(bp, rxr);
11371139
return;
11381140
}
@@ -1585,15 +1587,17 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
15851587
}
15861588

15871589
cons = rxcmp->rx_cmp_opaque;
1588-
rx_buf = &rxr->rx_buf_ring[cons];
1589-
data = rx_buf->data;
1590-
data_ptr = rx_buf->data_ptr;
15911590
if (unlikely(cons != rxr->rx_next_cons)) {
15921591
int rc1 = bnxt_discard_rx(bp, cpr, raw_cons, rxcmp);
15931592

1593+
netdev_warn(bp->dev, "RX cons %x != expected cons %x\n",
1594+
cons, rxr->rx_next_cons);
15941595
bnxt_sched_reset(bp, rxr);
15951596
return rc1;
15961597
}
1598+
rx_buf = &rxr->rx_buf_ring[cons];
1599+
data = rx_buf->data;
1600+
data_ptr = rx_buf->data_ptr;
15971601
prefetch(data_ptr);
15981602

15991603
misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1);
@@ -1610,11 +1614,17 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
16101614

16111615
rx_buf->data = NULL;
16121616
if (rxcmp1->rx_cmp_cfa_code_errors_v2 & RX_CMP_L2_ERRORS) {
1617+
u32 rx_err = le32_to_cpu(rxcmp1->rx_cmp_cfa_code_errors_v2);
1618+
16131619
bnxt_reuse_rx_data(rxr, cons, data);
16141620
if (agg_bufs)
16151621
bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs);
16161622

16171623
rc = -EIO;
1624+
if (rx_err & RX_CMPL_ERRORS_BUFFER_ERROR_MASK) {
1625+
netdev_warn(bp->dev, "RX buffer error %x\n", rx_err);
1626+
bnxt_sched_reset(bp, rxr);
1627+
}
16181628
goto next_rx;
16191629
}
16201630

0 commit comments

Comments
 (0)