cs8900网卡驱动简要解析(4)

我们最初分析的函数是cs8900_init,并由此展开,跟踪到了cs8900_probecs8900_readcs8900_write等,现在收回来,还是回到cs8900_init中。

 

cs8900_init里找到如下一行代码:

ndev->open               = cs8900_start;

如果你之前了解过字符设备,你很容易联想到file_operation中的open。其实它们是一样的。open函数在网络设备被激活时(ifconfig)调用。因此,我们在编写网卡驱动时,要考虑网卡激活时,需要完成哪些事情。通常要进行中断的申请、资源的申请等。在cs8900的驱动中,主要完成两件事情:激活网卡和申请中断。激活网卡的代码如下:

cs8900_set (dev,PP_RxCFG,RxOKiE | BufferCRC | CRCerroriE | RuntiE | ExtradataiE);

         cs8900_set (dev,PP_RxCTL,RxOKA | IndividualA | BroadcastA);

         cs8900_set (dev,PP_TxCFG,TxOKiE | Out_of_windowiE | JabberiE);

         cs8900_set (dev,PP_BufCFG,Rdy4TxiE | RxMissiE | TxUnderruniE | TxColOvfiE | MissOvfloiE);

         cs8900_set (dev,PP_LineCTL,SerRxON | SerTxON);

         cs8900_set (dev,PP_BusCTL,EnableRQ);

 

申请中断的方法和以前一样:

request_irq (dev->irq, &cs8900_interrupt, 0, dev->name, dev))

 

显然,我们下一个任务就是完成中断处理函数了(cs8900_interrupt),我们后面再说。

当资源准备就绪后,需要调用netif_start_queue函数开启网络接口的接收和发送数据队列。这个函数原型在netdevivce.h中。与它类似的还有一个函数,叫netif_wake_queue。有人更喜欢使用netif_wake_queue函数,因为它可以通知网络系统可再次开始传输数据包。

static inline void netif_start_queue(struct net_device *dev)

{

         clear_bit(__LINK_STATE_XOFF, &dev->state);

}

static inline void netif_wake_queue(struct net_device *dev)

{

#ifdef CONFIG_NETPOLL_TRAP

         if (netpoll_trap()) {

                   clear_bit(__LINK_STATE_XOFF, &dev->state);

                   return;

         }

#endif

         if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))

                   __netif_schedule(dev);

}

一句话总结:我们需要实现一个open函数,用来完成资源申请和开启网络接口的数据队列任务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值