aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/cadence/macb.c
diff options
context:
space:
mode:
authorHavard Skinnemoen <havard@skinnemoen.net>2012-10-31 02:04:58 -0400
committerDavid S. Miller <davem@davemloft.net>2012-11-01 11:45:58 -0400
commit29bc2e1e5504627c08ae2ce298e2209701289c40 (patch)
treed494d06f528e1d937217e72212968aeb4b5824d3 /drivers/net/ethernet/cadence/macb.c
parente86cd53afc5907f7c221b709916e2dd354e14691 (diff)
net/macb: Offset first RX buffer by two bytes
Make the ethernet frame payload word-aligned, possibly making the memcpy into the skb a bit faster. This will be even more important after we eliminate the copy altogether. Also eliminate the redundant RX_OFFSET constant -- it has the same definition and purpose as NET_IP_ALIGN. Signed-off-by: Havard Skinnemoen <havard@skinnemoen.net> [nicolas.ferre@atmel.com: adapt to newer kernel] Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Tested-by: Joachim Eastwood <manabian@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/cadence/macb.c')
-rw-r--r--drivers/net/ethernet/cadence/macb.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
index d5b52ff6d586..c1f20b067abf 100644
--- a/drivers/net/ethernet/cadence/macb.c
+++ b/drivers/net/ethernet/cadence/macb.c
@@ -33,9 +33,6 @@
33#define RX_RING_SIZE 512 /* must be power of 2 */ 33#define RX_RING_SIZE 512 /* must be power of 2 */
34#define RX_RING_BYTES (sizeof(struct macb_dma_desc) * RX_RING_SIZE) 34#define RX_RING_BYTES (sizeof(struct macb_dma_desc) * RX_RING_SIZE)
35 35
36/* Make the IP header word-aligned (the ethernet header is 14 bytes) */
37#define RX_OFFSET 2
38
39#define TX_RING_SIZE 128 /* must be power of 2 */ 36#define TX_RING_SIZE 128 /* must be power of 2 */
40#define TX_RING_BYTES (sizeof(struct macb_dma_desc) * TX_RING_SIZE) 37#define TX_RING_BYTES (sizeof(struct macb_dma_desc) * TX_RING_SIZE)
41 38
@@ -498,7 +495,7 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
498{ 495{
499 unsigned int len; 496 unsigned int len;
500 unsigned int frag; 497 unsigned int frag;
501 unsigned int offset = 0; 498 unsigned int offset;
502 struct sk_buff *skb; 499 struct sk_buff *skb;
503 struct macb_dma_desc *desc; 500 struct macb_dma_desc *desc;
504 501
@@ -509,7 +506,16 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
509 macb_rx_ring_wrap(first_frag), 506 macb_rx_ring_wrap(first_frag),
510 macb_rx_ring_wrap(last_frag), len); 507 macb_rx_ring_wrap(last_frag), len);
511 508
512 skb = netdev_alloc_skb(bp->dev, len + RX_OFFSET); 509 /*
510 * The ethernet header starts NET_IP_ALIGN bytes into the
511 * first buffer. Since the header is 14 bytes, this makes the
512 * payload word-aligned.
513 *
514 * Instead of calling skb_reserve(NET_IP_ALIGN), we just copy
515 * the two padding bytes into the skb so that we avoid hitting
516 * the slowpath in memcpy(), and pull them off afterwards.
517 */
518 skb = netdev_alloc_skb(bp->dev, len + NET_IP_ALIGN);
513 if (!skb) { 519 if (!skb) {
514 bp->stats.rx_dropped++; 520 bp->stats.rx_dropped++;
515 for (frag = first_frag; ; frag++) { 521 for (frag = first_frag; ; frag++) {
@@ -525,7 +531,8 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
525 return 1; 531 return 1;
526 } 532 }
527 533
528 skb_reserve(skb, RX_OFFSET); 534 offset = 0;
535 len += NET_IP_ALIGN;
529 skb_checksum_none_assert(skb); 536 skb_checksum_none_assert(skb);
530 skb_put(skb, len); 537 skb_put(skb, len);
531 538
@@ -549,10 +556,11 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
549 /* Make descriptor updates visible to hardware */ 556 /* Make descriptor updates visible to hardware */
550 wmb(); 557 wmb();
551 558
559 __skb_pull(skb, NET_IP_ALIGN);
552 skb->protocol = eth_type_trans(skb, bp->dev); 560 skb->protocol = eth_type_trans(skb, bp->dev);
553 561
554 bp->stats.rx_packets++; 562 bp->stats.rx_packets++;
555 bp->stats.rx_bytes += len; 563 bp->stats.rx_bytes += skb->len;
556 netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n", 564 netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n",
557 skb->len, skb->csum); 565 skb->len, skb->csum);
558 netif_receive_skb(skb); 566 netif_receive_skb(skb);
@@ -1012,6 +1020,7 @@ static void macb_init_hw(struct macb *bp)
1012 __macb_set_hwaddr(bp); 1020 __macb_set_hwaddr(bp);
1013 1021
1014 config = macb_mdc_clk_div(bp); 1022 config = macb_mdc_clk_div(bp);
1023 config |= MACB_BF(RBOF, NET_IP_ALIGN); /* Make eth data aligned */
1015 config |= MACB_BIT(PAE); /* PAuse Enable */ 1024 config |= MACB_BIT(PAE); /* PAuse Enable */
1016 config |= MACB_BIT(DRFCS); /* Discard Rx FCS */ 1025 config |= MACB_BIT(DRFCS); /* Discard Rx FCS */
1017 config |= MACB_BIT(BIG); /* Receive oversized frames */ 1026 config |= MACB_BIT(BIG); /* Receive oversized frames */