亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dma.txt

?? linux 內核源代碼
?? TXT
字號:
In Linux 2.5 kernels (and later), USB device drivers have additional controlover how DMA may be used to perform I/O operations.  The APIs are detailedin the kernel usb programming guide (kerneldoc, from the source code).API OVERVIEWThe big picture is that USB drivers can continue to ignore most DMA issues,though they still must provide DMA-ready buffers (see DMA-mapping.txt).That's how they've worked through the 2.4 (and earlier) kernels.OR:  they can now be DMA-aware.- New calls enable DMA-aware drivers, letting them allocate dma buffers and  manage dma mappings for existing dma-ready buffers (see below).- URBs have an additional "transfer_dma" field, as well as a transfer_flags  bit saying if it's valid.  (Control requests also have "setup_dma" and a  corresponding transfer_flags bit.)- "usbcore" will map those DMA addresses, if a DMA-aware driver didn't do  it first and set URB_NO_TRANSFER_DMA_MAP or URB_NO_SETUP_DMA_MAP.  HCDs  don't manage dma mappings for URBs.- There's a new "generic DMA API", parts of which are usable by USB device  drivers.  Never use dma_set_mask() on any USB interface or device; that  would potentially break all devices sharing that bus.ELIMINATING COPIESIt's good to avoid making CPUs copy data needlessly.  The costs can add up,and effects like cache-trashing can impose subtle penalties.- If you're doing lots of small data transfers from the same buffer all  the time, that can really burn up resources on systems which use an  IOMMU to manage the DMA mappings.  It can cost MUCH more to set up and  tear down the IOMMU mappings with each request than perform the I/O!  For those specific cases, USB has primitives to allocate less expensive  memory.  They work like kmalloc and kfree versions that give you the right  kind of addresses to store in urb->transfer_buffer and urb->transfer_dma.  You'd also set URB_NO_TRANSFER_DMA_MAP in urb->transfer_flags:	void *usb_buffer_alloc (struct usb_device *dev, size_t size,		int mem_flags, dma_addr_t *dma);	void usb_buffer_free (struct usb_device *dev, size_t size,		void *addr, dma_addr_t dma);  Most drivers should *NOT* be using these primitives; they don't need  to use this type of memory ("dma-coherent"), and memory returned from  kmalloc() will work just fine.  For control transfers you can use the buffer primitives or not for each  of the transfer buffer and setup buffer independently.  Set the flag bits  URB_NO_TRANSFER_DMA_MAP and URB_NO_SETUP_DMA_MAP to indicate which  buffers you have prepared.  For non-control transfers URB_NO_SETUP_DMA_MAP  is ignored.  The memory buffer returned is "dma-coherent"; sometimes you might need to  force a consistent memory access ordering by using memory barriers.  It's  not using a streaming DMA mapping, so it's good for small transfers on  systems where the I/O would otherwise thrash an IOMMU mapping.  (See  Documentation/DMA-mapping.txt for definitions of "coherent" and "streaming"  DMA mappings.)  Asking for 1/Nth of a page (as well as asking for N pages) is reasonably  space-efficient.  On most systems the memory returned will be uncached, because the  semantics of dma-coherent memory require either bypassing CPU caches  or using cache hardware with bus-snooping support.  While x86 hardware  has such bus-snooping, many other systems use software to flush cache  lines to prevent DMA conflicts.- Devices on some EHCI controllers could handle DMA to/from high memory.  Unfortunately, the current Linux DMA infrastructure doesn't have a sane  way to expose these capabilities ... and in any case, HIGHMEM is mostly a  design wart specific to x86_32.  So your best bet is to ensure you never  pass a highmem buffer into a USB driver.  That's easy; it's the default  behavior.  Just don't override it; e.g. with NETIF_F_HIGHDMA.  This may force your callers to do some bounce buffering, copying from  high memory to "normal" DMA memory.  If you can come up with a good way  to fix this issue (for x86_32 machines with over 1 GByte of memory),  feel free to submit patches.WORKING WITH EXISTING BUFFERSExisting buffers aren't usable for DMA without first being mapped into theDMA address space of the device.  However, most buffers passed to yourdriver can safely be used with such DMA mapping.  (See the first sectionof DMA-mapping.txt, titled "What memory is DMA-able?")- When you're using scatterlists, you can map everything at once.  On some  systems, this kicks in an IOMMU and turns the scatterlists into single  DMA transactions:	int usb_buffer_map_sg (struct usb_device *dev, unsigned pipe,		struct scatterlist *sg, int nents);	void usb_buffer_dmasync_sg (struct usb_device *dev, unsigned pipe,		struct scatterlist *sg, int n_hw_ents);	void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe,		struct scatterlist *sg, int n_hw_ents);  It's probably easier to use the new usb_sg_*() calls, which do the DMA  mapping and apply other tweaks to make scatterlist i/o be fast.- Some drivers may prefer to work with the model that they're mapping large  buffers, synchronizing their safe re-use.  (If there's no re-use, then let  usbcore do the map/unmap.)  Large periodic transfers make good examples  here, since it's cheaper to just synchronize the buffer than to unmap it  each time an urb completes and then re-map it on during resubmission.  These calls all work with initialized urbs:  urb->dev, urb->pipe,  urb->transfer_buffer, and urb->transfer_buffer_length must all be  valid when these calls are used (urb->setup_packet must be valid too  if urb is a control request):	struct urb *usb_buffer_map (struct urb *urb);	void usb_buffer_dmasync (struct urb *urb);	void usb_buffer_unmap (struct urb *urb);  The calls manage urb->transfer_dma for you, and set URB_NO_TRANSFER_DMA_MAP  so that usbcore won't map or unmap the buffer.  The same goes for  urb->setup_dma and URB_NO_SETUP_DMA_MAP for control requests.Note that several of those interfaces are currently commented out, sincethey don't have current users.  See the source code.  Other than the dmasynccalls (where the underlying DMA primitives have changed), most of them caneasily be commented back in if you want to use them.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久伊人网影院| 综合亚洲深深色噜噜狠狠网站| www.激情成人| 精品在线免费视频| 午夜日韩在线电影| 亚洲天堂av老司机| 国产精品女人毛片| 国产偷v国产偷v亚洲高清| 欧美一级生活片| 欧美群妇大交群中文字幕| 在线观看亚洲一区| 在线国产电影不卡| 在线观看成人小视频| 91国产精品成人| 在线精品视频免费播放| 色综合一区二区| 91久久国产综合久久| 色综合亚洲欧洲| 成年人网站91| 国产一区二区三区电影在线观看| 免费在线观看成人| 久久国产综合精品| 国产精品一区2区| 国产在线不卡一卡二卡三卡四卡| 久久99精品国产.久久久久久| 秋霞电影网一区二区| 精品一区精品二区高清| 经典三级一区二区| 国产一区在线看| 成人深夜在线观看| 91在线视频18| 欧美蜜桃一区二区三区| 在线播放国产精品二区一二区四区| 777午夜精品免费视频| 日韩女优视频免费观看| 国产欧美精品一区二区三区四区 | 亚洲女性喷水在线观看一区| 精品毛片乱码1区2区3区| 久久午夜色播影院免费高清 | 久久久精品tv| 亚洲欧美日韩国产手机在线| 一区二区三区国产精华| 日韩精品一卡二卡三卡四卡无卡| 蜜桃一区二区三区在线观看| 国产美女久久久久| 色综合久久99| 欧美一区二区三区日韩视频| 国产精品网站在线观看| 日日夜夜精品视频免费| 成人黄色在线视频| 3atv一区二区三区| 国产午夜精品福利| 日日夜夜免费精品视频| 成人自拍视频在线观看| 678五月天丁香亚洲综合网| 欧美激情一区二区在线| 一区二区三区在线免费视频| 日韩av在线发布| av中文字幕在线不卡| 91麻豆精品91久久久久久清纯 | 日本不卡1234视频| 成人污视频在线观看| 欧美日韩精品福利| 日本一区二区视频在线观看| 日韩在线一二三区| 国产一区二区主播在线| 欧美精品在线视频| 成人欧美一区二区三区视频网页 | 欧美一区二区三区免费大片| 国产精品视频免费| 精品一区二区三区免费| 欧美性大战xxxxx久久久| 久久久av毛片精品| 久久精品国产99| 欧美日韩高清一区二区三区| 亚洲视频在线观看一区| 麻豆91精品视频| 国产一区二三区好的| 欧美成人欧美edvon| 亚洲国产日韩一区二区| 91精品福利视频| 亚洲三级小视频| 99久精品国产| 国产精品传媒视频| 国产一区不卡视频| 555夜色666亚洲国产免| 亚洲高清久久久| 欧美丝袜丝nylons| 性感美女久久精品| 欧美日韩三级视频| 亚洲不卡在线观看| 欧美日本一道本| 五月天婷婷综合| 欧美日本高清视频在线观看| 午夜久久久久久久久| 欧美日韩一区二区电影| 人禽交欧美网站| 欧美一区二区视频在线观看| 日本最新不卡在线| 欧美精品免费视频| 亚洲精品ww久久久久久p站| 99久久久无码国产精品| 一区二区三区自拍| 欧美精品少妇一区二区三区| 1区2区3区欧美| 在线观看国产91| 免费观看在线综合| 久久久久国色av免费看影院| 粉嫩久久99精品久久久久久夜| 久久精品一区二区三区不卡| 国产高清精品久久久久| 日韩免费看的电影| 国产风韵犹存在线视精品| 国产精品久久久久久福利一牛影视| 成人免费视频视频在线观看免费 | 日韩一区国产二区欧美三区| 国产欧美一区二区三区沐欲| 懂色av一区二区夜夜嗨| 久久青草欧美一区二区三区| 成人性视频免费网站| 亚洲区小说区图片区qvod| 麻豆精品国产91久久久久久| 久久色成人在线| 欧美日本在线看| 色婷婷精品久久二区二区蜜臂av | 奇米在线7777在线精品| **性色生活片久久毛片| 欧美本精品男人aⅴ天堂| 欧美午夜寂寞影院| 99久久久久免费精品国产| 国产综合一区二区| 男男gaygay亚洲| 午夜亚洲国产au精品一区二区| 色999日韩国产欧美一区二区| 樱桃视频在线观看一区| 欧美精品一区二区三区久久久| 欧洲国内综合视频| 成人午夜视频福利| 精品制服美女丁香| 午夜免费欧美电影| 亚洲人成精品久久久久| 中文乱码免费一区二区| 精品久久久久香蕉网| 色综合天天综合在线视频| 国产精品99久| 国精品**一区二区三区在线蜜桃| 午夜激情一区二区三区| 亚洲乱码一区二区三区在线观看| 中文字幕乱码久久午夜不卡| 久久你懂得1024| wwww国产精品欧美| 欧美精品一区二区三| 欧美成人精精品一区二区频| 欧美一级一区二区| 欧美日韩国产小视频在线观看| 亚洲国产精品传媒在线观看| 欧美日韩极品在线观看一区| 91小视频在线免费看| 国产91精品欧美| 国产99久久久国产精品潘金 | 国产日韩精品一区| 精品少妇一区二区三区日产乱码| 91精品国产日韩91久久久久久| 欧美日韩一级视频| 欧美精品xxxxbbbb| 欧美日韩情趣电影| 欧美午夜精品久久久| 欧美高清视频一二三区 | 一色屋精品亚洲香蕉网站| 欧美三级蜜桃2在线观看| 欧美影视一区二区三区| 欧美日韩和欧美的一区二区| 777午夜精品视频在线播放| 555www色欧美视频| 久久这里只精品最新地址| 亚洲欧美综合另类在线卡通| 亚洲精品久久7777| 亚洲成人av免费| 毛片av一区二区三区| 国产乱码一区二区三区| 成人av网址在线| 日本精品一区二区三区四区的功能| 在线免费视频一区二区| 欧美tk—视频vk| 国产精品久久免费看| 亚洲综合丝袜美腿| 精品在线视频一区| 色综合久久久久| 欧美大片拔萝卜| 自拍偷拍欧美激情| 琪琪一区二区三区| 不卡影院免费观看| 欧美一级精品大片| 中文字幕在线免费不卡| 青青草原综合久久大伊人精品优势| 大桥未久av一区二区三区中文| 精品在线免费视频| 丰满放荡岳乱妇91ww| 欧美日韩亚洲综合一区二区三区| 国产亚洲制服色|