X-Git-Url: http://bbs.cooldavid.org/git/?p=jme.git;a=blobdiff_plain;f=jme.c;fp=jme.c;h=9da34cb4fb6304d0423a48e24b9dc4060684605d;hp=4e4613a3dc2ffd80c765ee3d13d56dcc78cda5fd;hb=1eef180c6c36524255aee362949a54232548f979;hpb=577bdf881d4d5a747a08f4ce0fb971ff3f14b77f diff --git a/jme.c b/jme.c index 4e4613a..9da34cb 100644 --- a/jme.c +++ b/jme.c @@ -769,6 +769,7 @@ 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); @@ -778,14 +779,21 @@ jme_make_new_rx_buf(struct jme_adapter *jme, int i) skb->dev = jme->dev; #endif + 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; }