zoukankan      html  css  js  c++  java
  • 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()
    ");
            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);
        ···                     
    }    
  • 相关阅读:
    关于拉格朗日乘子法和KKT条件
    深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
    安全模式下运行Windows installer并卸载程序
    win10 进入安全模式的方法
    支持向量机通俗导论(理解SVM的三层境界)
    Windows系统防火墙用法
    浏览器起始页被篡改恶意跳转解决方法
    网络熟知端口号
    SSL/TLS协议运行机制的概述
    分布式拒绝服务攻击 DDoS
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/13378951.html
Copyright © 2011-2022 走看看