亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 請教e1000中DMA傳輸?shù)膯栴} [打印本頁]

作者: tqkangkang    時間: 2007-04-25 08:53
標題: 請教e1000中DMA傳輸?shù)膯栴}
想通過修改e1000驅動,實現(xiàn)把網(wǎng)卡接收到的包以DMA方式傳到指定的buffer里面。然而卻找不到e1000是如何與dma交互的,請各位大蝦指教,謝謝!
作者: prc    時間: 2007-04-25 09:46
直接memcpy就好了,為什么還要dma
作者: bekars    時間: 2007-04-25 10:03
pci_map_single函數(shù)建立的DMA映射,pci_unmap_single函數(shù)進行DMA傳送

2樓的回去看看驅動再說話
作者: albcamus    時間: 2007-04-25 10:39
原帖由 bekars 于 2007-4-25 10:03 發(fā)表于 3樓  
pci_map_single函數(shù)建立的DMA映射,pci_unmap_single函數(shù)進行DMA傳送

2樓的回去看看驅動再說話


之前是不是要pci_set_master?
作者: prc    時間: 2007-04-25 13:07
pci_unmap_single進行dma傳輸?別逗了....

看看pci_map_single和pci_unmap_single分別是怎么實現(xiàn)的:
---------------------------------------------------------------------------
linux/include/asm-generic/pci-dma-compact.h
static inline dma_addr_t
pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
{
    return dma_map_single(hwdev == NULL ? NULL : &hwdev->dev, ptr, size, (enum dma_data_direction)direction);
}

/linux/include/asm-i386/dma-mapping.h
------------------------------------------------------------
static inline dma_addr_t
dma_map_single(struct device *dev, void *ptr, size_t size,
           enum dma_data_direction direction)
{
    BUG_ON(direction == DMA_NONE);
    flush_write_buffers();
    return virt_to_phys(ptr);
}

static inline dma_addr_t
dma_map_single(struct device *dev, void *ptr, size_t size,
           enum dma_data_direction direction)
{
    BUG_ON(direction == DMA_NONE);
    flush_write_buffers();
    return virt_to_phys(ptr);
}

static inline void
dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
         enum dma_data_direction direction)
{
    BUG_ON(direction == DMA_NONE);
}

dma_map_single返回ptr的物理地址,dma_unmap_single什么都不做。
因為外設在訪問內存的時候需要的是物理地址,所以driver才需要做用函數(shù)pci_map_single將虛地址轉成物理地址。這段地址是由CPU和外設共享的。一般情況下CPU只做讀操作,寫入是由外設完成的。

現(xiàn)在的網(wǎng)卡大多數(shù)都是采用主動DMA的方式。也就是當網(wǎng)卡從網(wǎng)線上接收到數(shù)據(jù)之后,就會自己啟動dma將數(shù)據(jù)從網(wǎng)卡內部的FIFO傳送到配置寄存器指定的內存地址。當一個數(shù)據(jù)包接收完成之后,產生一個中斷通知driver進行處理。整個過程不需要cpu進行干涉。當driver接收到中斷的時候,數(shù)據(jù)已經(jīng)在內存里存放好了。

對linux系統(tǒng)來說,大多數(shù)網(wǎng)卡driver為了提高處理效率,都會將skb->data指向這塊共享內存中,這樣可以減少一次內存拷貝操作。
在e1000_clean_rx_irq函數(shù)里在調用 netif_rx 之前直接訪問skb->data就可以了...這就是收到的數(shù)據(jù)包。

如果真的要自己指定地址,修改 alloc_rx_buf 里面的實現(xiàn)代碼就好了
作者: bekars    時間: 2007-04-25 15:24
就會自己啟動dma將數(shù)據(jù)從網(wǎng)卡內部的FIFO傳送到配置寄存器指定的內存地址


請問這個配置寄存器是誰設置的,什么時候設置的?


我看的是ARM的內核代碼,和i386的有些區(qū)別,不同平臺的DMA實現(xiàn)應該很不同,但是你開始說的直接memcpy確實沒有根據(jù),現(xiàn)在的網(wǎng)卡驅動都是用DMA來傳輸數(shù)據(jù)的。驅動收包之后就不會再做內存拷貝的動作了,skb保存在內存的環(huán)形隊列中,供協(xié)議棧處理。

[ 本帖最后由 bekars 于 2007-4-25 15:31 編輯 ]
作者: bekars    時間: 2007-04-25 15:28
ixp425的pci_map函數(shù)

dma_addr_t ixp425_pci_map_single(void *virt, size_t size, int direction)
{
        dma_addr_t dma_addr;
        unsigned long flags;
        void *safe;

        DBG("ixp425_map_single(virt=%p,size=%d,dir=%x)\n",
                virt, size, direction);

        dma_addr = virt_to_bus(virt);

        if(((u32)virt + size) >= (CONFIG_KERNEL_START + SZ_64M)) {
                safe = alloc_safe_buffer(virt, size, &dma_addr);
                if (!safe) {
                        printk("%s: Could not allocate safe buffer",
                                        __FILE__);
                        return 0;
                }

                DBG("unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", virt,
                        (void *)virt_to_phys(virt), safe, (void *)dma_addr);

                /*
                 * Only need to copy if DMAing to device
                 */
                if((direction == PCI_DMA_TODEVICE) ||
                   (direction == PCI_DMA_BIDIRECTIONAL)) {
                        memcpy(safe, virt, size);
                }
                consistent_sync(safe, size, direction);
        }
        else
                consistent_sync(virt, size, direction);

        return dma_addr;
}

void ixp425_pci_unmap_single(dma_addr_t dma_addr, size_t size, int direction)
{
        void *safe, *unsafe;
        unsigned long flags;
        struct safe_buffer *safe_buf;

        DBG("ixp425_unmap_single(ptr=%p, size=%d, dir=%x)\n",  
                (void *)dma_addr, size, direction);

        if ((safe_buf = find_safe_buffer(dma_addr, &unsafe))) {
                if((direction == PCI_DMA_FROMDEVICE) ||
                   (direction == PCI_DMA_BIDIRECTIONAL)) {
                        DBG("copyback unsafe %p, safe %p, size %d\n", unsafe, safe_buf->safe, size);
                        consistent_sync(safe_buf->safe, size, direction);
                        memcpy(unsafe, safe_buf->safe, size);
                }
       
                free_safe_buffer(safe_buf);
        } else {
                /*
                 * Assume this is normal memory.  We have a possible
                 * OOPs here if someone sends us a bad dma_addr_t.
                 */
                unsafe = bus_to_virt(dma_addr);
                consistent_sync(unsafe, size, direction);
        }
}


這個地方也想請教一下,一直對DMA硬件如何實現(xiàn)的不清楚:
1)i386平臺的DMA的寄存器是如何設置的?
2)網(wǎng)卡中的數(shù)據(jù)是如何通過DMA傳到內存中的?

[ 本帖最后由 bekars 于 2007-4-25 16:10 編輯 ]
作者: bekars    時間: 2007-04-25 16:09
Part Id - Streaming DMA mappings
--------------------------------

dma_addr_t
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
                      enum dma_data_direction direction)
dma_addr_t
pci_map_single(struct device *dev, void *cpu_addr, size_t size,
                      int direction)

Maps a piece of processor virtual memory so it can be accessed by the
device and returns the physical handle of the memory.

The direction for both api's may be converted freely by casting.
However the dma_ API uses a strongly typed enumerator for its
direction:

DMA_NONE                = PCI_DMA_NONE                no direction (used for
                                                debugging)
DMA_TO_DEVICE                = PCI_DMA_TODEVICE        data is going from the
                                                memory to the device
DMA_FROM_DEVICE                = PCI_DMA_FROMDEVICE        data is coming from
                                                the device to the
                                                memory
DMA_BIDIRECTIONAL        = PCI_DMA_BIDIRECTIONAL        direction isn't known

Notes:  Not all memory regions in a machine can be mapped by this
API.  Further, regions that appear to be physically contiguous in
kernel virtual space may not be contiguous as physical memory.  Since
this API does not provide any scatter/gather capability, it will fail
if the user tries to map a non physically contiguous piece of memory.
For this reason, it is recommended that memory mapped by this API be
obtained only from sources which guarantee to be physically contiguous
(like kmalloc).

Further, the physical address of the memory must be within the
dma_mask of the device (the dma_mask represents a bit mask of the
addressable region for the device.  i.e. if the physical address of
the memory anded with the dma_mask is still equal to the physical
address, then the device can perform DMA to the memory).  In order to
ensure that the memory allocated by kmalloc is within the dma_mask,
the driver may specify various platform dependent flags to restrict
the physical memory range of the allocation (e.g. on x86, GFP_DMA
guarantees to be within the first 16Mb of available physical memory,
as required by ISA devices).

Note also that the above constraints on physical contiguity and
dma_mask may not apply if the platform has an IOMMU (a device which
supplies a physical to virtual mapping between the I/O memory bus and
the device).  However, to be portable, device driver writers may *not*
assume that such an IOMMU exists.

Warnings:  Memory coherency operates at a granularity called the cache
line width.  In order for memory mapped by this API to operate
correctly, the mapped region must begin exactly on a cache line
boundary and end exactly on one (to prevent two separately mapped
regions from sharing a single cache line).  Since the cache line size
may not be known at compile time, the API will not enforce this
requirement.  Therefore, it is recommended that driver writers who
don't take special care to determine the cache line size at run time
only map virtual regions that begin and end on page boundaries (which
are guaranteed also to be cache line boundaries).

DMA_TO_DEVICE synchronisation must be done after the last modification
of the memory region by the software and before it is handed off to
the driver.  Once this primitive is used.  Memory covered by this
primitive should be treated as read only by the device.  If the device
may write to it at any point, it should be DMA_BIDIRECTIONAL (see
below).

DMA_FROM_DEVICE synchronisation must be done before the driver
accesses data that may be changed by the device.  This memory should
be treated as read only by the driver.  If the driver needs to write
to it at any point, it should be DMA_BIDIRECTIONAL (see below).

DMA_BIDIRECTIONAL requires special handling: it means that the driver
isn't sure if the memory was modified before being handed off to the
device and also isn't sure if the device will also modify it.  Thus,
you must always sync bidirectional memory twice: once before the
memory is handed off to the device (to make sure all memory changes
are flushed from the processor) and once before the data may be
accessed after being used by the device (to make sure any processor
cache lines are updated with data that the device may have changed.

void
dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
                 enum dma_data_direction direction)
void
pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
                 size_t size, int direction)

Unmaps the region previously mapped.  All the parameters passed in
must be identical to those passed in (and returned) by the mapping
API.
作者: bekars    時間: 2007-04-25 16:11
原帖由 albcamus 于 2007-4-25 10:39 發(fā)表于 4樓  


之前是不是要pci_set_master?



傳送的時候不需要,在網(wǎng)卡驅動probe和resume的時候設置一次就可以了。
作者: prc    時間: 2007-04-25 17:11

  1.     /* Setup the HW Rx Head and Tail Descriptor Pointers and
  2.      * the Base and Length of the Rx Descriptor Ring */
  3.     switch (adapter->num_rx_queues) {
  4. #ifdef CONFIG_E1000_MQ
  5.     case 2:
  6.         rdba = adapter->rx_ring[1].dma;
  7.         E1000_WRITE_REG(hw, RDBAL1, (rdba & 0x00000000ffffffffULL));
  8.         E1000_WRITE_REG(hw, RDBAH1, (rdba >> 32));
  9.         E1000_WRITE_REG(hw, RDLEN1, rdlen);
  10.         E1000_WRITE_REG(hw, RDH1, 0);
  11.         E1000_WRITE_REG(hw, RDT1, 0);
  12.         adapter->rx_ring[1].rdh = E1000_RDH1;
  13.         adapter->rx_ring[1].rdt = E1000_RDT1;
  14.         /* Fall Through */
  15. #endif
  16.     case 1:
  17.     default:
  18.         rdba = adapter->rx_ring[0].dma;
  19.         E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL));
  20.         E1000_WRITE_REG(hw, RDBAH, (rdba >> 32));
  21.         E1000_WRITE_REG(hw, RDLEN, rdlen);
  22.         E1000_WRITE_REG(hw, RDH, 0);
  23.         E1000_WRITE_REG(hw, RDT, 0);
  24.         adapter->rx_ring[0].rdh = E1000_RDH;
  25.         adapter->rx_ring[0].rdt = E1000_RDT;
  26.         break;
  27.     }
復制代碼


1. DMA的3個基本要素是目的地址,源地址,傳輸字節(jié)數(shù)。
2. 對于e1000,或者大部分PCI 網(wǎng)卡,DMA控制器在網(wǎng)卡芯片內部,由芯片內部的狀態(tài)機控制,是自動啟動的。
3. 源地址,傳輸字節(jié)數(shù)都由網(wǎng)卡芯片自己控制,網(wǎng)卡只需要一個目的地址,以便將數(shù)據(jù)傳送到指定的內存空間。
4. DMA傳輸過程對CPU也是透明的,當DMA傳輸完成之后,產生一個中斷通知CPU進行處理。
5. i386系統(tǒng)有沒有CPU可以控制的DMA控制器我不是很清楚。不過很多嵌入式自身帶有DMA控制器,但是這個東西不具有通用性。因為其它硬件模塊并不知道這些DMA模塊是怎么工作的,除非整個系統(tǒng)都是自己構建的。
作者: albcamus    時間: 2007-04-25 17:14
> 5. i386系統(tǒng)有沒有CPU可以控制的DMA控制器我不是很清楚。
這話不大通啊, DMA控制器本身就是BUS Master方式訪問內存的, 怎么可能受CPU控制呢?
作者: prc    時間: 2007-04-25 17:31
在有些嵌入式系統(tǒng)是做DMA需要CPU去配置 dst, src, count,然后啟動

但是在e1000這樣的設備不需要配置src, count,也不需要cpu去啟動dma,dma是網(wǎng)卡內部自己控制的
作者: 獨孤九賤    時間: 2007-04-25 18:37
原帖由 tqkangkang 于 2007-4-25 08:53 發(fā)表于 1樓  
想通過修改e1000驅動,實現(xiàn)把網(wǎng)卡接收到的包以DMA方式傳到指定的buffer里面。然而卻找不到e1000是如何與dma交互的,請各位大蝦指教,謝謝!


如果沒有記錯的話,驅動本身就是走的DMA方式吧??為什么還要改呢?

很久以前寫過一篇e100的,不知對你有用沒有??

http://www.skynet.org.cn/viewthread.php?tid=14&extra=page%3D1

[ 本帖最后由 獨孤九賤 于 2007-4-25 18:46 編輯 ]
作者: zu_xf    時間: 2007-04-26 10:04
標題: 回復 #13 獨孤九賤 的帖子
看來大家還是沒有搞清楚PCI和DMA的區(qū)別啊。
1.E1000驅動針對的是intel的PCI網(wǎng)卡,沒有也不需要使用DMA,只是借用了DMA這個概念,而實際的數(shù)據(jù)傳輸是通過PCI總線寫到指定的內存中去,而這個操作是不需要CPU干預的,只需要在初始化時設置好緩沖區(qū)并通過PCI命令寫入到網(wǎng)卡內部寄存器就行了。但這并不是DMA,具體請參考PCI2.2規(guī)范。需要者青留下郵箱。
2.CPU和DSP自帶的DMA分為兩種,一種是需要設置的,也就是說你需要指定源地址,目的地址,字節(jié)數(shù),工作方式,更復雜的甚至要DMA描述符隊列;一種是不需要設置的,也就是說你只要指定緩沖區(qū),CPU和DSP就會隱式地調用DMA進行數(shù)據(jù)傳輸。
作者: bekars    時間: 2007-04-26 16:48
原帖由 zu_xf 于 2007-4-26 10:04 發(fā)表于 14樓  
看來大家還是沒有搞清楚PCI和DMA的區(qū)別啊。
1.E1000驅動針對的是intel的PCI網(wǎng)卡,沒有也不需要使用DMA,只是借用了DMA這個概念,而實際的數(shù)據(jù)傳輸是通過PCI總線寫到指定的內存中去,而這個操作是不需要CPU干預 ...



給我一份PCI 2.2的DS吧,謝謝
bekars @ gmail.com
作者: zu_xf    時間: 2007-04-26 18:58
標題: 回復 #15 bekars 的帖子
已發(fā),請查收,3M多
作者: raise_sail    時間: 2007-04-27 09:39
是不是可以這樣理解:有些設備的DMA訪問是不需要獨立的DMA控制器的,我想zu_xf所指的DMA指的就是這種方式吧,但有些設備需要系統(tǒng)中有DMA控制器才能使用DMA方式工作,這也是有些設備需要使用request_dma(),有些則不用,特別是PCI設備不用的原因。
作者: zu_xf    時間: 2007-04-27 11:13
也可以這么說.不過準確地說,應該是這樣子的.
DMA分為專有DMA和通用DMA兩種.前者是不需要設置的;后者就是我們常說的DMA,執(zhí)行內存到內存,內存到外設,外設到內存的數(shù)據(jù)移動任務.但是這兩種DMA都有DMA控制器,只不過前者的控制器不歸你管,呵呵.
另外要注意,PCI總線傳輸是通過PCI命令完成的,并不是DMA,也不需要什么DMA控制器.
原帖由 raise_sail 于 2007-4-27 09:39 發(fā)表于 17樓  
是不是可以這樣理解:有些設備的DMA訪問是不需要獨立的DMA控制器的,我想zu_xf所指的DMA指的就是這種方式吧,但有些設備需要系統(tǒng)中有DMA控制器才能使用DMA方式工作,這也是有些設備需要使用request_dma(),有些 ...

作者: why_not    時間: 2007-04-27 15:56
原帖由 zu_xf 于 2007-4-26 10:04 發(fā)表于 14樓  
看來大家還是沒有搞清楚PCI和DMA的區(qū)別啊。
1.E1000驅動針對的是intel的PCI網(wǎng)卡,沒有也不需要使用DMA,只是借用了DMA這個概念,而實際的數(shù)據(jù)傳輸是通過PCI總線寫到指定的內存中去,而這個操作是不需要CPU干預 ...



我也要一份 pci2.2 規(guī)范

why_641@hotmail.com

謝謝

:)
作者: why_not    時間: 2007-04-27 16:01
I-E標準的最大特點就是串行總線,和普通pci的區(qū)別類似于ide和sata的區(qū)別,具體說起來就比較麻煩了,簡單來看指標的話,頻率為2.5Ghz(這個恐怖,串行的好處,同樣因為串行,位寬就沒意義了,但是據(jù)說是什么8bit/10bit的傳輸),帶寬 pci-E 1X單向傳輸250MBps,雙向也就500了,同時pci-e的倍速最高可達16X,多少就自己乘吧,要注意的是pci-e不存在共享問題,也就是說掛在總線上的任何一個設備都會達到這個速度而不是所有設備帶寬的總合。下面引用一篇文章的一段,感興趣的自己看一下:

  在工作原理上,PCI Express與并行體系的PCI沒有任何相似之處,它采用串行方式傳輸數(shù)據(jù),而依靠高頻率來獲得高性能,因此PCI Express也一度被人稱為“串行PCI”。由于串行傳輸不存在信號干擾,總線頻率提升不受阻礙,PCI Express很順利就達到2.5GHz的超高工作頻率。其次,PCI Express采用全雙工運作模式,最基本的PCI Express擁有4根傳輸線路,其中2線用于數(shù)據(jù)發(fā)送,2線用于數(shù)據(jù)接收,也就是發(fā)送數(shù)據(jù)和接收數(shù)據(jù)可以同時進行。相比之下,PCI總線和PCI-X總線在一個時鐘周期內只能作單向數(shù)據(jù)傳輸,效率只有PCI Express的一半;加之PCI Express使用8b/10b編碼的內嵌時鐘技術,時鐘信息被直接寫入數(shù)據(jù)流中,這比PCI總線能更有效節(jié)省傳輸通道,提高傳輸效率。第三,PCI Express沒有沿用傳統(tǒng)的共享式結構,它采用點對點工作模式(Peer to Peer,也被簡稱為P2P),每個PCI Express設備都有自己的專用連接,這樣就無需向整條總線申請帶寬,避免多個設備爭搶帶寬的糟糕情形發(fā)生,而此種情況在共享架構的PCI系統(tǒng)中司空見慣。

    由于工作頻率高達2.5GHz,最基本的PCI Express總線可提供的單向帶寬便達到250MBps(2.5Gbps×1 B/8bit×8b/10b=250MBps),再考慮全雙工運作,該總線的總帶寬達到500MBps-這僅僅是最基本的PCI Express ×1模式。如果使用兩個通道捆綁的×2模式,PCI Express便可提供1GBps的有效數(shù)據(jù)帶寬。依此類推,PCI Express ×4、×8和×16模式的有效數(shù)據(jù)傳輸速率分別達到2GBps、4GBps和8GBps。這與PCI總線可憐的共享式133MBps速率形成極其鮮明的對比,更何況這些都還是每個PCI Express可獨自占用的帶寬。
-----------------------------
上面是以前看到過的一段

我想問問


pci-E , 對 intel e1000 這種使用 dma 概念的 驅動有沒有什么影響
作者: zu_xf    時間: 2007-04-28 13:18
具體規(guī)范沒看過,但是要使用PCI-E接口的以太網(wǎng)芯片的時候,首先內核要支持PCI-E總線,也就是說內核要提供PCI-E總線驅動,可能還需要在上電時進行配置;其次,驅動應該也要改,除非兩種接口完全兼容或者說芯片已經(jīng)對此作了處理。
原帖由 why_not 于 2007-4-27 16:01 發(fā)表于 20樓  
I-E標準的最大特點就是串行總線,和普通pci的區(qū)別類似于ide和sata的區(qū)別,具體說起來就比較麻煩了,簡單來看指標的話,頻率為2.5Ghz(這個恐怖,串行的好處,同樣因為串行,位寬就沒意義了,但是據(jù)說是什么8bit ...

作者: albcamus    時間: 2008-03-19 13:57
原帖由 zu_xf 于 2007-4-28 13:18 發(fā)表
具體規(guī)范沒看過,但是要使用PCI-E接口的以太網(wǎng)芯片的時候,首先內核要支持PCI-E總線,也就是說內核要提供PCI-E總線驅動,可能還需要在上電時進行配置;其次,驅動應該也要改,除非兩種接口完全兼容或者說芯片已經(jīng) ...



驅動應該不用改, 可以軟件層兼容的。 PCI-E最大的優(yōu)勢即在于此。

配置方式, PCI-E提供MMCONFIG方式, 估計同樣也支持PCI的type1和type2。
作者: Solaris12    時間: 2008-03-19 22:08
原帖由 zu_xf 于 2007-4-26 10:04 發(fā)表
看來大家還是沒有搞清楚PCI和DMA的區(qū)別啊。
1.E1000驅動針對的是intel的PCI網(wǎng)卡,沒有也不需要使用DMA,只是借用了DMA這個概念,而實際的數(shù)據(jù)傳輸是通過PCI總線寫到指定的內存中去,而這個操作是不需要CPU干預 ...


zu_xf關于E1000的說法是錯誤的.

Intel的E1000可以支持PCI和PCIE兩種網(wǎng)卡, 而且需要靠DMA來把網(wǎng)卡上的數(shù)據(jù)讀入Host Memory.

這個讀一下相關的硬件手冊就知道了. 學習E1000驅動,建議看82571/82572的手冊,里面的支持的功能是最全的. 很多特性在新一代intel網(wǎng)卡里都有延續(xù).
作者: Solaris12    時間: 2008-03-19 22:10
原帖由 albcamus 于 2008-3-19 13:57 發(fā)表



驅動應該不用改, 可以軟件層兼容的。 PCI-E最大的優(yōu)勢即在于此。

配置方式, PCI-E提供MMCONFIG方式, 估計同樣也支持PCI的type1和type2。


PICE雖然可以兼容,但是似乎單獨支持會發(fā)揮更多的特性, 比如說熱插拔的支持.

在Solaris下,PCIE和PCI是不同的驅動.
相信Linux類似的
作者: sirouni    時間: 2008-03-19 23:31
同意樓上的說法,先看一下82571/82572的sepc,
給一點提示,看一下
e1000_alloc_rx_buffers()可能對你有所幫助
作者: accessory    時間: 2009-05-24 22:49
支持23樓
作者: lxzjw123    時間: 2012-04-14 17:14
mark
作者: chishanmingshen    時間: 2013-03-18 17:27
本帖最后由 chishanmingshen 于 2013-03-18 20:10 編輯


哦。。

有點明白了。。。
作者: chishanmingshen    時間: 2013-03-18 20:28
@Solaris12@accessory@prc@bekars@zu_xf

我感覺是zu_xf說的對啊,如果是pci設備的話。

請大家指點迷津,謝謝!






歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2