Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95195
  • 博文数量: 17
  • 博客积分: 37
  • 博客等级: 民兵
  • 技术积分: 217
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-09 18:24
文章分类
文章存档

2016年(4)

2015年(3)

2014年(9)

2011年(1)

我的朋友

分类: C/C++

2015-08-31 15:02:26

在驱动程序中要支持传输超时处理,只需要实现net_device的watchtimeo和net_device_ops中的ndo_tx_timeout函数。

1】watchdog_timeo

【作用】用于实现传出超时的时间设定。

1】ndo_tx_timeout

【作用】在发送队列停止(netif_queue_stopped(dev)返回1),且watchdog_timeo到期的时候,内核网络子系统会调用ndo_tx_timeout来进行处理

即在驱动中完成以下成员的赋值:
ndev->watchdog_timeo = NIC_TX_TIMEOUT;//设置超时的时间
static const struct net_device_ops  nic_netdev_ops = { 
.....
.ndo_tx_timeout = nic_net_timeout,
.....
};


========用法========

ndo_tx_timeout的实现多种多样,可以根据具体的情况来实现。

关于定时器的信息,参照内核定时器介绍。


在linux2.6内核的rtl8169网卡驱动的实现上,在rtl8169_tx_timeout上就调用了两个函数:

rtl8169_hw_reset()

rtl8169_shedule_work()

其中前一个参数实现了硬件reset。

后一个函数完成了设备缓冲区等初始化任务。

---------------源码---------------

static void rtl8169_tx_timeout(struct net_device *dev)
{
                  struct rtl8169_private *tp = netdev_priv(dev);

                   rtl8169_hw_reset(tp->mmio_addr);
                   rtl8169_schedule_work(dev, rtl8169_reset_task);
 }

阅读(2729) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~