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函数,用来完成资源申请和开启网络接口的数据队列任务。

你可能感兴趣的:(.net)