diff options
| author | Jesse Brandeburg <jesse.brandeburg@intel.com> | 2009-06-30 08:45:15 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-06-30 22:46:57 -0400 |
| commit | 91615f765a2935b6cbae424b9eee1585ed681ae6 (patch) | |
| tree | d52da41df99e90a7bd31463147ffece51de0aa61 | |
| parent | 4f57ca6e17edfc56ddde5c87eb893e47e0d2d343 (diff) | |
igb: fix unmap length bug
driver was mixing NET_IP_ALIGN count bytes in map/unmap calls
unevenly. Only map the bytes that the hardware might dma into
also fix unmap related bug where ->dma was not being cleared
after unmap
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/igb/igb_main.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index ea17319624aa..468356d124ea 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
| @@ -4549,11 +4549,12 @@ static bool igb_clean_rx_irq_adv(struct igb_ring *rx_ring, | |||
| 4549 | cleaned = true; | 4549 | cleaned = true; |
| 4550 | cleaned_count++; | 4550 | cleaned_count++; |
| 4551 | 4551 | ||
| 4552 | /* this is the fast path for the non-packet split case */ | ||
| 4552 | if (!adapter->rx_ps_hdr_size) { | 4553 | if (!adapter->rx_ps_hdr_size) { |
| 4553 | pci_unmap_single(pdev, buffer_info->dma, | 4554 | pci_unmap_single(pdev, buffer_info->dma, |
| 4554 | adapter->rx_buffer_len + | 4555 | adapter->rx_buffer_len, |
| 4555 | NET_IP_ALIGN, | ||
| 4556 | PCI_DMA_FROMDEVICE); | 4556 | PCI_DMA_FROMDEVICE); |
| 4557 | buffer_info->dma = 0; | ||
| 4557 | skb_put(skb, length); | 4558 | skb_put(skb, length); |
| 4558 | goto send_up; | 4559 | goto send_up; |
| 4559 | } | 4560 | } |
| @@ -4570,8 +4571,9 @@ static bool igb_clean_rx_irq_adv(struct igb_ring *rx_ring, | |||
| 4570 | 4571 | ||
| 4571 | if (!skb_shinfo(skb)->nr_frags) { | 4572 | if (!skb_shinfo(skb)->nr_frags) { |
| 4572 | pci_unmap_single(pdev, buffer_info->dma, | 4573 | pci_unmap_single(pdev, buffer_info->dma, |
| 4573 | adapter->rx_ps_hdr_size + NET_IP_ALIGN, | 4574 | adapter->rx_ps_hdr_size, |
| 4574 | PCI_DMA_FROMDEVICE); | 4575 | PCI_DMA_FROMDEVICE); |
| 4576 | buffer_info->dma = 0; | ||
| 4575 | skb_put(skb, hlen); | 4577 | skb_put(skb, hlen); |
| 4576 | } | 4578 | } |
| 4577 | 4579 | ||
| @@ -4713,7 +4715,6 @@ static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, | |||
| 4713 | bufsz = adapter->rx_ps_hdr_size; | 4715 | bufsz = adapter->rx_ps_hdr_size; |
| 4714 | else | 4716 | else |
| 4715 | bufsz = adapter->rx_buffer_len; | 4717 | bufsz = adapter->rx_buffer_len; |
| 4716 | bufsz += NET_IP_ALIGN; | ||
| 4717 | 4718 | ||
| 4718 | while (cleaned_count--) { | 4719 | while (cleaned_count--) { |
| 4719 | rx_desc = E1000_RX_DESC_ADV(*rx_ring, i); | 4720 | rx_desc = E1000_RX_DESC_ADV(*rx_ring, i); |
| @@ -4737,7 +4738,7 @@ static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, | |||
| 4737 | } | 4738 | } |
| 4738 | 4739 | ||
| 4739 | if (!buffer_info->skb) { | 4740 | if (!buffer_info->skb) { |
| 4740 | skb = netdev_alloc_skb(netdev, bufsz); | 4741 | skb = netdev_alloc_skb(netdev, bufsz + NET_IP_ALIGN); |
| 4741 | if (!skb) { | 4742 | if (!skb) { |
| 4742 | adapter->alloc_rx_buff_failed++; | 4743 | adapter->alloc_rx_buff_failed++; |
| 4743 | goto no_buffers; | 4744 | goto no_buffers; |
