Commit abe78717 authored by Lennert Buytenhek's avatar Lennert Buytenhek Committed by Lennert Buytenhek

mv643xx_eth: enforce multiple-of-8-bytes receive buffer size restriction

The mv643xx_eth hardware ignores the lower three bits of the buffer
size field in receive descriptors, causing the reception of full-sized
packets to fail at some MTUs.  Fix this by rounding the size of
allocated receive buffers up to a multiple of eight bytes.

While we are at it, add a bit of extra space to each receive buffer so
that we can handle multiple vlan tags on ingress.
Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
parent 9e1f3772
...@@ -474,11 +474,19 @@ static void rxq_refill(struct rx_queue *rxq) ...@@ -474,11 +474,19 @@ static void rxq_refill(struct rx_queue *rxq)
/* /*
* Reserve 2+14 bytes for an ethernet header (the * Reserve 2+14 bytes for an ethernet header (the
* hardware automatically prepends 2 bytes of dummy * hardware automatically prepends 2 bytes of dummy
* data to each received packet), 4 bytes for a VLAN * data to each received packet), 16 bytes for up to
* header, and 4 bytes for the trailing FCS -- 24 * four VLAN tags, and 4 bytes for the trailing FCS
* bytes total. * -- 36 bytes total.
*/ */
skb_size = mp->dev->mtu + 24; skb_size = mp->dev->mtu + 36;
/*
* Make sure that the skb size is a multiple of 8
* bytes, as the lower three bits of the receive
* descriptor's buffer size field are ignored by
* the hardware.
*/
skb_size = (skb_size + 7) & ~7;
skb = dev_alloc_skb(skb_size + dma_get_cache_alignment() - 1); skb = dev_alloc_skb(skb_size + dma_get_cache_alignment() - 1);
if (skb == NULL) if (skb == NULL)
...@@ -552,7 +560,7 @@ static int rxq_process(struct rx_queue *rxq, int budget) ...@@ -552,7 +560,7 @@ static int rxq_process(struct rx_queue *rxq, int budget)
spin_unlock_irqrestore(&mp->lock, flags); spin_unlock_irqrestore(&mp->lock, flags);
dma_unmap_single(NULL, rx_desc->buf_ptr + 2, dma_unmap_single(NULL, rx_desc->buf_ptr + 2,
mp->dev->mtu + 24, DMA_FROM_DEVICE); rx_desc->buf_size, DMA_FROM_DEVICE);
rxq->rx_desc_count--; rxq->rx_desc_count--;
rx++; rx++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment