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狀態查詢。如果要更細節地瞭解的話,還需要看一下數據發送接收的流程,以太網相關的知識。



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