|
@@ -751,20 +751,28 @@ jme_make_new_rx_buf(struct jme_adapter *jme, int i)
|
|
|
struct jme_ring *rxring = &(jme->rxring[0]);
|
|
|
struct jme_buffer_info *rxbi = rxring->bufinf + i;
|
|
|
struct sk_buff *skb;
|
|
|
+ dma_addr_t mapping;
|
|
|
|
|
|
skb = netdev_alloc_skb(jme->dev,
|
|
|
jme->dev->mtu + RX_EXTRA_LEN);
|
|
|
if (unlikely(!skb))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ mapping = pci_map_page(jme->pdev, virt_to_page(skb->data),
|
|
|
+ offset_in_page(skb->data), skb_tailroom(skb),
|
|
|
+ PCI_DMA_FROMDEVICE);
|
|
|
+ if (unlikely(pci_dma_mapping_error(jme->pdev, mapping))) {
|
|
|
+ dev_kfree_skb(skb);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (likely(rxbi->mapping))
|
|
|
+ pci_unmap_page(jme->pdev, rxbi->mapping,
|
|
|
+ rxbi->len, PCI_DMA_FROMDEVICE);
|
|
|
+
|
|
|
rxbi->skb = skb;
|
|
|
rxbi->len = skb_tailroom(skb);
|
|
|
- rxbi->mapping = pci_map_page(jme->pdev,
|
|
|
- virt_to_page(skb->data),
|
|
|
- offset_in_page(skb->data),
|
|
|
- rxbi->len,
|
|
|
- PCI_DMA_FROMDEVICE);
|
|
|
-
|
|
|
+ rxbi->mapping = mapping;
|
|
|
return 0;
|
|
|
}
|
|
|
|