diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/pasemi_mac.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c index c538c66d4b4f..b3994f5d2d2b 100644 --- a/drivers/net/pasemi_mac.c +++ b/drivers/net/pasemi_mac.c | |||
@@ -37,6 +37,12 @@ | |||
37 | 37 | ||
38 | #include "pasemi_mac.h" | 38 | #include "pasemi_mac.h" |
39 | 39 | ||
40 | /* We have our own align, since ppc64 in general has it at 0 because | ||
41 | * of design flaws in some of the server bridge chips. However, for | ||
42 | * PWRficient doing the unaligned copies is more expensive than doing | ||
43 | * unaligned DMA, so make sure the data is aligned instead. | ||
44 | */ | ||
45 | #define LOCAL_SKB_ALIGN 2 | ||
40 | 46 | ||
41 | /* TODO list | 47 | /* TODO list |
42 | * | 48 | * |
@@ -409,13 +415,16 @@ static void pasemi_mac_replenish_rx_ring(struct net_device *dev, int limit) | |||
409 | /* skb might still be in there for recycle on short receives */ | 415 | /* skb might still be in there for recycle on short receives */ |
410 | if (info->skb) | 416 | if (info->skb) |
411 | skb = info->skb; | 417 | skb = info->skb; |
412 | else | 418 | else { |
413 | skb = dev_alloc_skb(BUF_SIZE); | 419 | skb = dev_alloc_skb(BUF_SIZE); |
420 | skb_reserve(skb, LOCAL_SKB_ALIGN); | ||
421 | } | ||
414 | 422 | ||
415 | if (unlikely(!skb)) | 423 | if (unlikely(!skb)) |
416 | break; | 424 | break; |
417 | 425 | ||
418 | dma = pci_map_single(mac->dma_pdev, skb->data, BUF_SIZE, | 426 | dma = pci_map_single(mac->dma_pdev, skb->data, |
427 | BUF_SIZE - LOCAL_SKB_ALIGN, | ||
419 | PCI_DMA_FROMDEVICE); | 428 | PCI_DMA_FROMDEVICE); |
420 | 429 | ||
421 | if (unlikely(dma_mapping_error(dma))) { | 430 | if (unlikely(dma_mapping_error(dma))) { |
@@ -553,10 +562,12 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit) | |||
553 | len = (macrx & XCT_MACRX_LLEN_M) >> XCT_MACRX_LLEN_S; | 562 | len = (macrx & XCT_MACRX_LLEN_M) >> XCT_MACRX_LLEN_S; |
554 | 563 | ||
555 | if (len < 256) { | 564 | if (len < 256) { |
556 | struct sk_buff *new_skb = | 565 | struct sk_buff *new_skb; |
557 | netdev_alloc_skb(mac->netdev, len + NET_IP_ALIGN); | 566 | |
567 | new_skb = netdev_alloc_skb(mac->netdev, | ||
568 | len + LOCAL_SKB_ALIGN); | ||
558 | if (new_skb) { | 569 | if (new_skb) { |
559 | skb_reserve(new_skb, NET_IP_ALIGN); | 570 | skb_reserve(new_skb, LOCAL_SKB_ALIGN); |
560 | memcpy(new_skb->data, skb->data, len); | 571 | memcpy(new_skb->data, skb->data, len); |
561 | /* save the skb in buffer_info as good */ | 572 | /* save the skb in buffer_info as good */ |
562 | skb = new_skb; | 573 | skb = new_skb; |