diff options
author | Havard Skinnemoen <havard@skinnemoen.net> | 2012-10-31 02:04:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-01 11:45:58 -0400 |
commit | 29bc2e1e5504627c08ae2ce298e2209701289c40 (patch) | |
tree | d494d06f528e1d937217e72212968aeb4b5824d3 /drivers/net/ethernet/cadence/macb.c | |
parent | e86cd53afc5907f7c221b709916e2dd354e14691 (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.c | 23 |
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 */ |