|
@@ -474,11 +474,19 @@ static void rxq_refill(struct rx_queue *rxq)
|
|
|
/*
|
|
|
* Reserve 2+14 bytes for an ethernet header (the
|
|
|
* hardware automatically prepends 2 bytes of dummy
|
|
|
- * data to each received packet), 4 bytes for a VLAN
|
|
|
- * header, and 4 bytes for the trailing FCS -- 24
|
|
|
- * bytes total.
|
|
|
+ * data to each received packet), 16 bytes for up to
|
|
|
+ * four VLAN tags, and 4 bytes for the trailing FCS
|
|
|
+ * -- 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);
|
|
|
if (skb == NULL)
|
|
@@ -552,7 +560,7 @@ static int rxq_process(struct rx_queue *rxq, int budget)
|
|
|
spin_unlock_irqrestore(&mp->lock, flags);
|
|
|
|
|
|
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--;
|
|
|
rx++;
|
|
|
|