diff options
-rw-r--r-- | drivers/net/jme.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index b5b174a8c149..19738143aa91 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
@@ -753,20 +753,28 @@ jme_make_new_rx_buf(struct jme_adapter *jme, int i) | |||
753 | struct jme_ring *rxring = &(jme->rxring[0]); | 753 | struct jme_ring *rxring = &(jme->rxring[0]); |
754 | struct jme_buffer_info *rxbi = rxring->bufinf + i; | 754 | struct jme_buffer_info *rxbi = rxring->bufinf + i; |
755 | struct sk_buff *skb; | 755 | struct sk_buff *skb; |
756 | dma_addr_t mapping; | ||
756 | 757 | ||
757 | skb = netdev_alloc_skb(jme->dev, | 758 | skb = netdev_alloc_skb(jme->dev, |
758 | jme->dev->mtu + RX_EXTRA_LEN); | 759 | jme->dev->mtu + RX_EXTRA_LEN); |
759 | if (unlikely(!skb)) | 760 | if (unlikely(!skb)) |
760 | return -ENOMEM; | 761 | return -ENOMEM; |
761 | 762 | ||
763 | mapping = pci_map_page(jme->pdev, virt_to_page(skb->data), | ||
764 | offset_in_page(skb->data), skb_tailroom(skb), | ||
765 | PCI_DMA_FROMDEVICE); | ||
766 | if (unlikely(pci_dma_mapping_error(jme->pdev, mapping))) { | ||
767 | dev_kfree_skb(skb); | ||
768 | return -ENOMEM; | ||
769 | } | ||
770 | |||
771 | if (likely(rxbi->mapping)) | ||
772 | pci_unmap_page(jme->pdev, rxbi->mapping, | ||
773 | rxbi->len, PCI_DMA_FROMDEVICE); | ||
774 | |||
762 | rxbi->skb = skb; | 775 | rxbi->skb = skb; |
763 | rxbi->len = skb_tailroom(skb); | 776 | rxbi->len = skb_tailroom(skb); |
764 | rxbi->mapping = pci_map_page(jme->pdev, | 777 | rxbi->mapping = mapping; |
765 | virt_to_page(skb->data), | ||
766 | offset_in_page(skb->data), | ||
767 | rxbi->len, | ||
768 | PCI_DMA_FROMDEVICE); | ||
769 | |||
770 | return 0; | 778 | return 0; |
771 | } | 779 | } |
772 | 780 | ||