bnx2: Fix jumbo frames error handling.
If errors are reported on a frame descriptor, we need to account for the buffer pages that may have been used for this error packet and recycle them. Otherwise, we may get the wrong pages for the next packet. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Signed-off-by: Benjamin Li <benli@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
259436a505
commit
990ec3804b
1 changed files with 19 additions and 11 deletions
|
@ -2910,18 +2910,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
|
|||
|
||||
rx_hdr = (struct l2_fhdr *) skb->data;
|
||||
len = rx_hdr->l2_fhdr_pkt_len;
|
||||
status = rx_hdr->l2_fhdr_status;
|
||||
|
||||
if ((status = rx_hdr->l2_fhdr_status) &
|
||||
(L2_FHDR_ERRORS_BAD_CRC |
|
||||
L2_FHDR_ERRORS_PHY_DECODE |
|
||||
L2_FHDR_ERRORS_ALIGNMENT |
|
||||
L2_FHDR_ERRORS_TOO_SHORT |
|
||||
L2_FHDR_ERRORS_GIANT_FRAME)) {
|
||||
|
||||
bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
|
||||
sw_ring_prod);
|
||||
goto next_rx;
|
||||
}
|
||||
hdr_len = 0;
|
||||
if (status & L2_FHDR_STATUS_SPLIT) {
|
||||
hdr_len = rx_hdr->l2_fhdr_ip_xsum;
|
||||
|
@ -2931,6 +2921,24 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
|
|||
pg_ring_used = 1;
|
||||
}
|
||||
|
||||
if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
|
||||
L2_FHDR_ERRORS_PHY_DECODE |
|
||||
L2_FHDR_ERRORS_ALIGNMENT |
|
||||
L2_FHDR_ERRORS_TOO_SHORT |
|
||||
L2_FHDR_ERRORS_GIANT_FRAME))) {
|
||||
|
||||
bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
|
||||
sw_ring_prod);
|
||||
if (pg_ring_used) {
|
||||
int pages;
|
||||
|
||||
pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
|
||||
|
||||
bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
|
||||
}
|
||||
goto next_rx;
|
||||
}
|
||||
|
||||
len -= 4;
|
||||
|
||||
if (len <= bp->rx_copy_thresh) {
|
||||
|
|
Loading…
Add table
Reference in a new issue