Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.29-rc8 66 lines 1.5 kB view raw
1/* skb_dma_map.c: DMA mapping helpers for socket buffers. 2 * 3 * Copyright (C) David S. Miller <davem@davemloft.net> 4 */ 5 6#include <linux/kernel.h> 7#include <linux/module.h> 8#include <linux/dma-mapping.h> 9#include <linux/skbuff.h> 10 11int skb_dma_map(struct device *dev, struct sk_buff *skb, 12 enum dma_data_direction dir) 13{ 14 struct skb_shared_info *sp = skb_shinfo(skb); 15 dma_addr_t map; 16 int i; 17 18 map = dma_map_single(dev, skb->data, 19 skb_headlen(skb), dir); 20 if (dma_mapping_error(dev, map)) 21 goto out_err; 22 23 sp->dma_maps[0] = map; 24 for (i = 0; i < sp->nr_frags; i++) { 25 skb_frag_t *fp = &sp->frags[i]; 26 27 map = dma_map_page(dev, fp->page, fp->page_offset, 28 fp->size, dir); 29 if (dma_mapping_error(dev, map)) 30 goto unwind; 31 sp->dma_maps[i + 1] = map; 32 } 33 sp->num_dma_maps = i + 1; 34 35 return 0; 36 37unwind: 38 while (--i >= 0) { 39 skb_frag_t *fp = &sp->frags[i]; 40 41 dma_unmap_page(dev, sp->dma_maps[i + 1], 42 fp->size, dir); 43 } 44 dma_unmap_single(dev, sp->dma_maps[0], 45 skb_headlen(skb), dir); 46out_err: 47 return -ENOMEM; 48} 49EXPORT_SYMBOL(skb_dma_map); 50 51void skb_dma_unmap(struct device *dev, struct sk_buff *skb, 52 enum dma_data_direction dir) 53{ 54 struct skb_shared_info *sp = skb_shinfo(skb); 55 int i; 56 57 dma_unmap_single(dev, sp->dma_maps[0], 58 skb_headlen(skb), dir); 59 for (i = 0; i < sp->nr_frags; i++) { 60 skb_frag_t *fp = &sp->frags[i]; 61 62 dma_unmap_page(dev, sp->dma_maps[i + 1], 63 fp->size, dir); 64 } 65} 66EXPORT_SYMBOL(skb_dma_unmap);