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);
    ···                     
}    
复制代码

 

posted @   闹闹爸爸  阅读(1088)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示