Linux网络设备驱动之网络设备的打开与释放(四)

微信扫一扫,分享到朋友圈

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

 

Linux网络设备驱动之网络设备的打开与释放(四)

原文地址:https://www.cnblogs.com/wanglouxiaozi/p/13378951.html

阿里影业:电影票房即将恢复2/3 国庆档全面复苏

上一篇

初学linux

下一篇

你也可能喜欢

Linux网络设备驱动之网络设备的打开与释放(四)

长按储存图像,分享给朋友