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

上一次讲的cs8900_receive函数是在中断处理函数中调用的,也就是当中断到来,如果判断出是数据接收情况,则通过这个函数进行数据接收。那么如果中断是由于其他事件触发的呢,当然就需要其他代码了,不过那些代码并不难,大家自己看就是了。
 
中断的内容讲完后,cs8900_start函数也算告一段落,我们回到最初的cs8900_init函数中。在cs8900_start之后的就是cs8900_stop了:
ndev->stop               = cs8900_stop;
这个函数基本上是open的反操作:关闭网卡、释放中断、停止队列。
所以为一个网卡写驱动,主要是读懂它的手册,这样你才知道哪个寄存器做什么,它的工作方式等。留一个作业吧,结合手册和下面代码,理解cs8900网卡的关闭方式:
       cs8900_write (dev,PP_BusCTL,0);
       cs8900_write (dev,PP_TestCTL,0);
       cs8900_write (dev,PP_SelfCTL,0);
       cs8900_write (dev,PP_LineCTL,0);
       cs8900_write (dev,PP_BufCFG,0);
       cs8900_write (dev,PP_TxCFG,0);
       cs8900_write (dev,PP_RxCTL,0);
       cs8900_write (dev,PP_RxCFG,0);
 
释放中断和申请中断又是一对,只管调用就是了:
free_irq (dev->irq,dev);
 
还记得在cs8900_start函数中调用了netif_start_queue吗?那么在关闭网卡后调用netif_stop_queue 就是了。
 
如果按代码顺序讲,该介绍cs8900_send_start了,不过这个函数比较重要,我们放在下一节单独介绍。我们先看它后面的代码:
    ndev->get_stats             = cs8900_get_stats;
       ndev->set_multicast_list        = cs8900_set_receive_mode;
       ndev->tx_timeout         = cs8900_transmit_timeout;
 
我们的cs8900网卡只实现了这些函数。根据网卡的不同,你可能需要自己完成更多的函数。不过就get_stats、set_multicast_list和tx_timeout来说,它们完成的任务是相同的,分别是获取统计信息、处理多播网包、超时处理。
 
先看一下cs8900是如何获取统计信息的:
 
static struct net_device_stats *cs8900_get_stats (struct net_device *dev)
{
       cs8900_t *priv = (cs8900_t *) dev->priv;
       return (&priv->stats);
}
 
stats是一个net_device_stats结构,其实说简单点,你只要返回stats结构就可以了,它里面记录了你需要的信息。net_device_stats结构在netdevice.h文件中。
 
struct net_device_stats
{
       unsigned long rx_packets;     /* total packets received */
       unsigned long tx_packets;     /* total packets transmitted    */
       unsigned long rx_bytes;        /* total bytes received  */
       unsigned long tx_bytes;        /* total bytes transmitted       */
       unsigned long rx_errors;              /* bad packets received         */
       unsigned long tx_errors;              /* packet transmit problems   */
       unsigned long rx_dropped;    /* no space in linux buffers   */
       unsigned long tx_dropped;    /* no space available in linux */
       unsigned long multicast;              /* multicast packets received */
       unsigned long collisions;
 
       /* detailed rx_errors: */
       unsigned long rx_length_errors;
       unsigned long rx_over_errors;      /* receiver ring buff overflow       */
       unsigned long rx_crc_errors;        /* recved pkt with crc error   */
       unsigned long rx_frame_errors;    /* recv'd frame alignment error */
       unsigned long rx_fifo_errors;              /* recv'r fifo overrun            */
       unsigned long rx_missed_errors;   /* receiver missed packet       */
 
       /* detailed tx_errors */
       unsigned long tx_aborted_errors;
       unsigned long tx_carrier_errors;
       unsigned long tx_fifo_errors;
       unsigned long tx_heartbeat_errors;
       unsigned long tx_window_errors;
      
       /* for cslip etc */
       unsigned long rx_compressed;
       unsigned long tx_compressed;
};
 
cs8900_get_stats这个函数虽然简单,但是很实用。
cs8900_set_receive_mode函数设置网卡模式,需要配合手册来阅读。出现的新函数(cs8900_set和cs8900_clear)实际上就是cs8900_write,就是通过与(&)或(|)运算,实用set和clear字样,会使函数非常易读。
 
一句话总结:对网卡的控制需要熟读硬件手册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值