aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2019-04-08 17:39:54 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-08 19:39:41 -0400
commita1b0e4e684e9c300b9e759b46cb7a0147e61ddff (patch)
treede1a1c7a7bc61d5c8da7436fe956f10f485ad78f
parenta62520473f15750cd1432d36b377a06cd7cff8d2 (diff)
bnxt_en: Improve RX consumer index validity check.
There is logic to check that the RX/TPA consumer index is the expected index to work around a hardware problem. However, the potentially bad consumer index is first used to index into an array to reference an entry. This can potentially crash if the bad consumer index is beyond legal range. Improve the logic to use the consumer index for dereferencing after the validity check and log an error message. Fixes: fa7e28127a5a ("bnxt_en: Add workaround to detect bad opaque in rx completion (part 2)") Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 0bb9d7b3a2b6..3df847b7079f 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -1133,6 +1133,8 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
1133 tpa_info = &rxr->rx_tpa[agg_id]; 1133 tpa_info = &rxr->rx_tpa[agg_id];
1134 1134
1135 if (unlikely(cons != rxr->rx_next_cons)) { 1135 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);
1136 bnxt_sched_reset(bp, rxr); 1138 bnxt_sched_reset(bp, rxr);
1137 return; 1139 return;
1138 } 1140 }
@@ -1585,15 +1587,17 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
1585 } 1587 }
1586 1588
1587 cons = rxcmp->rx_cmp_opaque; 1589 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;
1591 if (unlikely(cons != rxr->rx_next_cons)) { 1590 if (unlikely(cons != rxr->rx_next_cons)) {
1592 int rc1 = bnxt_discard_rx(bp, cpr, raw_cons, rxcmp); 1591 int rc1 = bnxt_discard_rx(bp, cpr, raw_cons, rxcmp);
1593 1592
1593 netdev_warn(bp->dev, "RX cons %x != expected cons %x\n",
1594 cons, rxr->rx_next_cons);
1594 bnxt_sched_reset(bp, rxr); 1595 bnxt_sched_reset(bp, rxr);
1595 return rc1; 1596 return rc1;
1596 } 1597 }
1598 rx_buf = &rxr->rx_buf_ring[cons];
1599 data = rx_buf->data;
1600 data_ptr = rx_buf->data_ptr;
1597 prefetch(data_ptr); 1601 prefetch(data_ptr);
1598 1602
1599 misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1); 1603 misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1);