新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux网络驱动程序

Linux网络驱动程序

作者:时间:2010-08-25来源:网络收藏

  //初始化定时器

  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不再难懂)


关键词: 驱动程序 网络 Linux

评论


相关推荐

技术专区

关闭