Skip to content

Commit

Permalink
qlge: Fix dropping of large non-TCP/UDP frames.
Browse files Browse the repository at this point in the history
This was found with pings that were large enough to span multiple rx
buffers.  The split frame logic handles this case nicely.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ron Mercer authored and David S. Miller committed Feb 17, 2010
1 parent 8ea7a37 commit c0c5695
Showing 1 changed file with 5 additions and 15 deletions.
20 changes: 5 additions & 15 deletions drivers/net/qlge/qlge_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2066,21 +2066,11 @@ static unsigned long ql_process_mac_rx_intr(struct ql_adapter *qdev,
ql_process_mac_rx_page(qdev, rx_ring, ib_mac_rsp,
length, vlan_id);
} else {
struct bq_desc *lbq_desc;

/* Free small buffer that holds the IAL */
lbq_desc = ql_get_curr_sbuf(rx_ring);
netif_err(qdev, rx_err, qdev->ndev,
"Dropping frame, len %d > mtu %d\n",
length, qdev->ndev->mtu);

/* Unwind the large buffers for this frame. */
while (length > 0) {
lbq_desc = ql_get_curr_lchunk(qdev, rx_ring);
length -= (length < rx_ring->lbq_buf_size) ?
length : rx_ring->lbq_buf_size;
put_page(lbq_desc->p.pg_chunk.page);
}
/* Non-TCP/UDP large frames that span multiple buffers
* can be processed corrrectly by the split frame logic.
*/
ql_process_mac_split_rx_intr(qdev, rx_ring, ib_mac_rsp,
vlan_id);
}

return (unsigned long)length;
Expand Down

0 comments on commit c0c5695

Please sign in to comment.