<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux網(wǎng)絡(luò )驅動(dòng)程序功能分析

Linux網(wǎng)絡(luò )驅動(dòng)程序功能分析

作者: 時(shí)間:2012-05-30 來(lái)源:網(wǎng)絡(luò ) 收藏

//初始化定時(shí)器

本文引用地址:http://dyxdggzs.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; //超時(shí)回調函數

  add_timer(tp->timer);

  //允許網(wǎng)卡開(kāi)始傳輸包

  netif_start_queue(dev);

  }

  5.關(guān)閉設備

  static int tg3_close(struct net_device *dev)

  {

  //停止網(wǎng)卡傳輸包

  netif_stop_queue(dev);

  netif_carrier_off(tp->dev);

  //去除定時(shí)器

  del_timer_sync(tp->timer);

  //釋放收包和發(fā)包的緩沖區

  tg3_free_rings(tp);

  //釋放中斷

  free_irq(dev->irq, dev);

  }

  [NextPage]

  6.硬件處理數據包發(fā)送

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

  {

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

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

  //硬件幀頭,然后提交給硬件發(fā)送。

  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);

  //硬件發(fā)送

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

  //記錄發(fā)包開(kāi)始時(shí)間

  dev->trans_start = jiffies;

  }

  7.中斷處理收包,發(fā)包

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

  {

  //如果要收包

  tg3_rx(tp);

  //如果要發(fā)包

  tg3_tx(tp);

  }

  8.發(fā)包

  static void tg3_tx(struct tg3 *tp)

  {

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

  struct sk_buff *skb = ri->skb;

  //以DMA方式向網(wǎng)卡傳輸包完畢

  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;

  //分配一個(gè)包

  copy_skb = dev_alloc_skb(len + 2);

  copy_skb->dev = tp->dev;

  //修改包頭空間

  skb_reserve(copy_skb, 2);

  //加入數據到包中

  skb_put(copy_skb, len);

  //以DMA方式從網(wǎng)卡傳輸回數據

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

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

  skb = copy_skb;

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


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>