linux usbnet驱动


工作中接触了USB转网口设备,通过USB口连接到电视盒子上,会被识别成一个网卡,遇到USB转网口无法获取IP的问题,学习和调试了这部分usb host端的usbnet驱动,进行一下总结。


USB host端的驱动,包括usb host controller(如xhci, ehci), usb core(负责usb设备插入识别,枚举,设备与驱动匹配), usb driver (具体某种USB设备的驱动,如鼠标,USB网卡,U盘)
本篇文章主要介绍USB网卡驱动,属于usb driver。
USB网卡驱动的代码目录在:/kernel/drivers/net/usb/
主要文件包括usbnet.c: 通用核心代码,每个usb网卡驱动都会用到
不同的USB网卡设备会有各自的.c驱动文件,如ax88179_178a.c,rtl8150.c等
每一个这种.c文件中,都会有一个usb_driver结构体,初始化了一些回调函数,如:
static struct usb_driver ax88179_178a_driver = {
.name = "ax88179_178a",
.id_table = products,
.probe = usbnet_probe,
……………..
}
当usb设备插入usb口时,通过id_table,使设备与具体的usb driver匹配上。然后会调用到usb_driver结构体中赋值的probe函数,会调用到usbnet.c中的代码。


usbnet_probe:

net = alloc_etherdev(sizeof(*dev));  // 申请网卡结构体
init_waitqueue_head(&dev->wait);
skb_queue_head_init (&dev->rxq);
 skb_queue_head_init (&dev->txq);
skb_queue_head_init (&dev->done);
dev->bh.func = usbnet_bh;
net->netdev_ops = &usbnet_netdev_ops;
driver_info->bind() // 调用不同USB网卡各自注册的bind函数,主要作用是,获取in, out, status(接收,发送,状态查询)的endpoint,注册特定设备特有的netdev_ops,启动配置网卡phy
init_status (dev, udev); //根据之前bind()获取到的interrupt ep,配置用于传输网卡状态(如link up/down)的 interrupt pipe, alloc_urb, fill_int_urb。
status = register_netdev (net);  //网卡设备初始化的最重要一步,向上层注册这个网卡设备,协议层就可以通过这个设备的tx rx接口发送接收数据。


usbnet_open
usbnet_probe之后,kernel已经知道了这个net_device, 会调用之前注册的net_device_ops.ndo_open函数,也就是调用usbnet_open (struct net_device *net):
usbnet_status_start(dev, GFP_KERNEL); //submit之前准备好的interrupt urb, 开始查询网卡状态。

netif_start_queue (net); // Allow upper layers to call the device hard_start_xmit routine.



bulk in  ep: 通过rx_submit函数提交接收数据的urb,urb完成之后调用rx_complete回调函数,取出urb中的数据,把skb(网络专用数据结构)往业务层传递

bulk out ep: usbnet_probe和usbnet_open之后,业务层会调用usbnet_start_xmit (struct sk_buff *skb,struct net_device *net), 把skb数据转换成urb,提交给usb,通过USB网卡向外发送网络包。urb完成之后调用tx_complete,启动tasklet_schedule(&dev->bh); 处理完成的skb。

interrutp ep: 网络状态发生改变时,如link down/up, interrupt urb完成,调用intr_complete, 更新网络状态。


比较粗略的usbnet总结,包括注册net_device结构体,数据发送,接收,link状态查询。如果要更细节地了解的话,还需要看一下数据发送接收的流程,以太网相关的知识。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章