新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Linux網絡驅動程序功能分析

        Linux網絡驅動程序功能分析

        作者: 時間:2012-05-30 來源:網絡 收藏

        //初始化定時器

        本文引用地址:http://www.104case.com/article/148970.htm

          init_timer(tp->timer);

          tp->timer.expires = jiffies + tp->timer_offset;

          tp->timer.data = (unsigned long) tp;

          tp->timer.function = tg3_timer; //超時回調函數

          add_timer(tp->timer);

          //允許網卡開始傳輸包

          netif_start_queue(dev);

          }

          5.關閉設備

          static int tg3_close(struct net_device *dev)

          {

          //停止網卡傳輸包

          netif_stop_queue(dev);

          netif_carrier_off(tp->dev);

          //去除定時器

          del_timer_sync(tp->timer);

          //釋放收包和發包的緩沖區

          tg3_free_rings(tp);

          //釋放中斷

          free_irq(dev->irq, dev);

          }

          [NextPage]

          6.硬件處理數據包發送

          static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)

          {

          len = (skb->len - skb->data_len);

          //以DMA方式向網卡物理設備傳輸包。如果是wireless的話,需要根據802.11協議及硬件的規范從新填充

          //硬件幀頭,然后提交給硬件發送。

          mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);

          tp->tx_buffers[entry].skb = skb;

          pci_unmap_addr_set(tp->tx_buffers[entry], mapping, mapping);

          //硬件發送

          tg3_set_txd(tp, entry, mapping, len, base_flags, mss_and_is_end);

          //記錄發包開始時間

          dev->trans_start = jiffies;

          }

          7.中斷處理收包,發包

          static void tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)

          {

          //如果要收包

          tg3_rx(tp);

          //如果要發包

          tg3_tx(tp);

          }

          8.發包

          static void tg3_tx(struct tg3 *tp)

          {

          struct tx_ring_info *ri = tp->tx_buffers[sw_idx];

          struct sk_buff *skb = ri->skb;

          //以DMA方式向網卡傳輸包完畢

          pci_unmap_single(tp->pdev, pci_unmap_addr(ri, mapping),

          (skb->len - skb->data_len), PCI_DMA_TODEVICE);

          ri->skb = NULL;

          dev_kfree_skb_irq(skb);

          }

          9.收包

          static int tg3_rx(struct tg3 *tp, int budget)

          {

          struct sk_buff *copy_skb;

          //分配一個包

          copy_skb = dev_alloc_skb(len + 2);

          copy_skb->dev = tp->dev;

          //修改包頭空間

          skb_reserve(copy_skb, 2);

          //加入數據到包中

          skb_put(copy_skb, len);

          //以DMA方式從網卡傳輸回數據

          pci_dma_sync_single(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);

          memcpy(copy_skb->data, skb->data, len);

          skb = copy_skb;

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 华亭县| 靖宇县| 博客| 逊克县| 蓬莱市| 宣武区| 和平县| 三都| 广饶县| 都安| 密山市| 崇明县| 即墨市| 普兰县| 绥德县| 康乐县| 广宗县| 兰西县| 嘉义县| 教育| 淳化县| 铜梁县| 翁源县| 石狮市| 海伦市| 古蔺县| 苏州市| 西畴县| 庆安县| 宁明县| 奉贤区| 武宣县| 玉树县| 鄢陵县| 富平县| 昭苏县| 南昌市| 汉寿县| 库尔勒市| 客服| 闵行区|