Linux網絡設備驅動之網絡設備的打開與釋放(四)


  網絡設備的打開函數需要完成如下工作:

  • 使能設備使用的硬件資源,申請 I/O 區域、中斷和 DMA 通道等。
  • 調用 Linux 內核提供的 netif_start_queue( )函數,激活設備發送隊列。

  網絡設備的關閉函數需要完成如下工作:

  • 調用 Linux 內核提供的 netif_stop_queue( ) 函數,停止設備傳輸包。
  • 釋放設備所使用的I/O區域、中斷和 DMA 資源。

  Linux 內核提供的 netif_start_queue( ) 和 netif_stop_queue( ) 連個函數的原型為:

static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)
{
    clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
}

/**
 *    netif_start_queue - allow transmit
 *    @dev: network device
 *
 *    Allow upper layers to call the device hard_start_xmit routine.
 */
static inline void netif_start_queue(struct net_device *dev)
{
    netif_tx_start_queue(netdev_get_tx_queue(dev, 0));
}
static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
{
    if (WARN_ON(!dev_queue)) {
        pr_info("netif_stop_queue() cannot be called before register_netdev()\n");
        return;
    }
    set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
}

/**
 *    netif_stop_queue - stop transmitted packets
 *    @dev: network device
 *
 *    Stop upper layers calling the device hard_start_xmit routine.
 *    Used for flow control when transmit resources are unavailable.
 */
static inline void netif_stop_queue(struct net_device *dev)
{
    netif_tx_stop_queue(netdev_get_tx_queue(dev, 0));
}

  根據以上分析,可得出如下代碼所示的網絡設備打開和釋放函數的模板。

/*
 * 網絡設備打開和釋放函數模板
 */
static int xxx_open(struct net_device *dev)
{
    /* 申請端口、IRQ等,類似於fops->open */
    ret = request_irq(dev->irq, &xxx_interrupt, 0, dev->name, dev);
    ···
    netif_start_queue(dev);
    ···
}


static int xxx_release(struct net_device *dev)
{
    /* 釋放端口、IRQ 等,類似於fops->close */
    free_irq(dev->irq, dev);
    ···
    netif_stop_queue(dev);
    ···                     
}    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM