1. peripheral

1.1 发数据 tx

(1)应用层通过系统调用,进入到内核层;
(2)内核的数据链路层将数据送入驱动层;
(3)USB 网卡驱动将数据发送到 UDC控制器;(将req 写入in 端点)
(4)UDC 控制器写寄存器将数据通过 phy 发送出去。

 // \drivers\usb\gadget\function\u_ether.c    // .ndo_start_xmit     = eth_start_xmit,
== eth_start_xmit(struct sk_buff *skb, struct net_device *net)        == usb_ep_queue(in, req, GFP_ATOMIC);     // 将req 写入in 端点== ret = ep->ops->queue(ep, req, gfp_flags);==  dwc3_gadget_ep_queue();== __dwc3_gadget_ep_queue();== __dwc3_gadget_kick_transfer();== dwc3_prepare_trbs();== dwc3_send_gadget_ep_cmd();      trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status);== dwc3_writel(dep->regs, DWC3_DEPCMDPAR0, params->param0);

1.2 收数据 rx

(1)应用层通过系统调用,进入到内核层;
(2)内核的数据链路层将数据送入驱动层;
(3)USB 网卡驱动将数据发送到 UDC控制器;(将req 写入out 端点,表示要读buf)
(4)UDC 控制器接收 host 中断;
(5)req 的完成函数;
(6)完成函数将数据返回给数据链路层。

// \drivers\usb\gadget\function\u_ether.c     //.ndo_open        = eth_open,
== eth_open(struct net_device *net);== eth_start(struct eth_dev *dev, gfp_t gfp_flags);== rx_fill(struct eth_dev *dev, gfp_t gfp_flags);== rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags);== req->complete = rx_complete;== req->complete = rx_complete;== usb_ep_queue(out, req, gfp_flags);   //将req 写入out 端点,表示要读buf
== dwc3_gadget_start();                        //注册中断== request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt, IRQF_SHARED, "dwc3", dwc->ev_buf);== dwc3_thread_interrupt();                    //中断产生(host发消息过来),调用回调函数== dwc3_process_event_buf();         //处理中断事件buf(dwc3_event_buffer )== dwc3_process_event_entry();     trace_dwc3_event(event->raw, dwc);== dwc3_endpoint_interrupt();    //对端点处理的中断== dwc3_gadget_endpoint_transfer_complete();        //传输完成== dwc3_gadget_endpoint_trbs_complete();== dwc3_gadget_ep_cleanup_completed_requests()== dwc3_gadget_giveback();                //数据返回== dwc3_gadget_del_and_unmap_request();     trace_dwc3_gadget_giveback(req);== usb_gadget_giveback_request()          trace_usb_gadget_giveback_request(ep, req, 0);// give the request back to the gadget layer== req->complete(ep, req);== rx_complete(struct usb_ep *ep, struct usb_request *req);      // u_ether 的回调函数
== rx_complete();== skb_dequeue();       //获取skb== netif_rx(struct sk_buff *skb);  // post buffer to the network code

2. host

2.1 发数据 tx

(1)应用层通过系统调用,进入到内核层;
(2)内核的数据链路层将数据送入驱动层;
(3)USB 网卡驱动将数据发送到 XHCI 控制器;
(4)XHCI 控制器写寄存器将数据通过 phy 发送出去。

// \drivers\net\usb\usbnet.c     .ndo_start_xmit     = usbnet_start_xmit,
== usbnet_start_xmit();== usb_alloc_urb();== usb_fill_bulk_urb();== usb_submit_urb();
== usb_submit_urb(cmdinfo->cmd_urb, GFP_ATOMIC);== usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags)hcd->driver->urb_enqueue(hcd, urb, mem_flags);== xhci_urb_enqueue();               trace_xhci_urb_enqueue(urb);== xhci_queue_bulk_tx();      //批量传输== prepare_transfer();== usb_hcd_link_urb_to_ep()     //add an URB to its endpoint queue== list_add_tail(&urb->urb_list, &urb->ep->urb_list);== queue_trb()                      trace_xhci_queue_trb(ring, trb);    //queueing a TRB on a ring== inc_enq()                    trace_xhci_inc_enq(ring);== giveback_first_trb()      //Pass all the TRBs to the hardware at once and make sure this write isn't reordered.== xhci_ring_ep_doorbell()      trace_xhci_ring_ep_doorbell(slot_id, DB_VALUE(ep_index, stream_id));== writel(DB_VALUE(ep_index, stream_id), db_addr);

2.2 收数据 rx

(1)应用层通过系统调用,进入到内核层;
(2)内核的数据链路层将数据送入驱动层;
(3)USB 网卡驱动将数据发送到 XHCI 控制器;
(4)XHCI 控制器接收中断;
(5)urb 的完成函数;
(6)完成函数将数据返回给数据链路层。

// \drivers\net\usb\usbnet.c  //.ndo_open        = usbnet_open,
== usbnet_open(struct net_device *net);== tasklet_schedule (&dev->bh);== usbnet_bh();== rx_alloc_submit();== rx_submit(struct usbnet *dev, struct urb *urb, gfp_t flags);== usb_fill_bulk_urb (urb, dev->udev, dev->in, skb->data, size, rx_complete, skb);== usb_submit_urb();
== xhci_irq(struct usb_hcd *hcd)== xhci_handle_event(struct xhci_hcd *xhci)              trace_xhci_handle_event(xhci->event_ring, &event->generic);== handle_tx_event()                             trace_xhci_handle_transfer(ep_ring, (struct xhci_generic_trb *) ep_trb)== process_bulk_intr_td()      //Process bulk and interrupt tds, update urb status and actual_length.== finish_td()== xhci_td_cleanup()== xhci_giveback_urb_in_irq()     trace_xhci_urb_giveback(urb);== usb_hcd_unlink_urb_from_ep(hcd, urb);== usb_hcd_giveback_urb(hcd, urb, status);== urb->complete(urb);== rx_complete();
== rx_complete();== defer_bh();== tasklet_schedule (&dev->bh);== usbnet_bh();     // tasklet (work deferred from completions, in_irq) or timer== rx_process();      // skb_state = rx_done== usbnet_skb_return();== netif_rx (skb);

USB 网卡驱动数据流相关推荐

  1. linux安装comfast网卡驱动,电脑如何通过usb共享手机网络 Linux安装wifi 无线网络 811AC usb网卡驱动...

    电脑如何通过usb共享手机网络 该方法是通过USB线将手机和电脑连接的方式来共享网络,所以不管是笔记本电脑还是台式机,不管电脑有无线网卡,都可以使用该方法. 准备工作:首先用数据线把手机连接到电脑上, ...

  2. Debian系统源码安装usb网卡驱动

    系统为debian 9.6 64位版本,安装网卡驱动为asix的 AX88772B芯片 1. 安装系统build模块 apt-get install linux-image-$(uname -r) l ...

  3. ubuntu 16.04/18.04安装TP-LINK TL-WDN5200H无线USB网卡驱动

    TP-LINK TL-WDN5200H无线USB网卡驱动没有自带ubuntu系统的驱动 参考如下两篇文章后搞定: 1.https://blog.csdn.net/F_BQ333/article/det ...

  4. ubuntu 16.04安装TP-LINK TL-WDN5200H无线USB网卡驱动

    TP-LINK TL-WDN5200H无线USB网卡驱动没有自带ubuntu系统的驱动 参考如下两篇文章后搞定: 1.https://blog.csdn.net/F_BQ333/article/det ...

  5. 电脑如何通过usb共享手机网络 Linux安装wifi 无线网络 811AC usb网卡驱动

    电脑如何通过usb共享手机网络 该方法是通过USB线将手机和电脑连接的方式来共享网络,所以不管是笔记本电脑还是台式机,不管电脑有无线网卡,都可以使用该方法. 准备工作:首先用数据线把手机连接到电脑上, ...

  6. 雷凌无线usb网卡驱动官方版

    雷凌无线usb网卡驱动v5.1.7.1官方版 软件大小:38.7MB 软件语言:简体中文 软件类别:硬件驱动 软件授权:官方版 更新时间:2015-01-15 应用平台:/Win8/Win7/WinX ...

  7. 嵌入式Linux移植USB网卡驱动

    开发板:友善之臂smart210 操作系统:Ubuntu 12,04 交叉编译器:arm-none-linux-gnueabi gcc version 4.3.2 WIFI 模组:TP-LINK TL ...

  8. ch9200 usb网卡驱动_21包邮的PCMCIA无线网卡开箱+对比测评

    本文是我原创,经我授权发表在贵乎,原文链接:21包邮的PCMCIA无线网卡开箱+对比测评 本篇教程是之前说的18包邮的PCMCIA无线网卡的对比 关于PCMCIA无线网卡 PCMCIA无线网卡优点是兼 ...

  9. linux usb网卡驱动 ko,qf9700 USB网卡在x86 linux和arm linux上的驱动安装以及配置

    最近要在一块老板子上面移植openwrt,需要扩展网口,于是选择了qf9700这款USB网卡,附赠的光盘里面有提供在linux下面安装的驱动源代码,所以我们要自己编译驱动源代码生成内核加载模块,加载模 ...

最新文章

  1. python购物车程序详解用字典_Python_购物车程序[列表嵌套字典]
  2. SCSI协议与存储的发展
  3. MongoDB 安全 checklist 及最优配置模板
  4. Arrays类、大数据运算
  5. 项目怎么放到服务器里,如何把项目放到服务器上
  6. java中jquery怎么学,jQuery动画+实例
  7. android编译非静态内部类,Android 非静态内部类/匿名类引起的内存泄漏
  8. 利用子网掩码划分子网
  9. java 能重写构成函数_java函数重载和函数重写
  10. 跨境电商独立站门槛高,为什么还有无数人挤破头想入坑!
  11. DFA极简化和NFA确定化
  12. mongodb简单安装
  13. JAVA调用WebService的三种方法
  14. pr新建字幕样式(模板)
  15. 第二工业大学计算机应用大专录取分,二工大| 2018年上海第二工业大学专科层次依法自主招生各专业最低录取分数线...
  16. STM32 CubeIDE 断点失效的解决方法
  17. 联发科MT5597 4K数字电视芯片处理器介绍
  18. k8s实现nginx-ingress通过统一IP访问服务无缝对接生产上游Nginx
  19. [附源码]Java计算机毕业设计SSM菜鸟驿站快递分发系统
  20. 计算机软硬件维护意义,计算机软硬件故障检测维护

热门文章

  1. 常德php培训班,常德PHP培训中心哪家比较好(php怎么显示图片)
  2. CSP Darknet53
  3. 计算机应用研究word文档,计算机应用研究论文大纲 计算机应用研究论文提纲怎样写...
  4. 数据中台:中台设计四步走
  5. Web服务器的架设----源码
  6. Android support和Androidx库不能共存问题
  7. 全景漫游软件|全景漫游制作软件|三维全景软件|
  8. csapp 程序人生 Hello’s P2P
  9. 使用Vegas制作视频前该做些什么?
  10. 汽车中的前置箱SGA是怎么进行内存管理的?