- 论坛徽章:
- 0
|
在 usb_hcd_poll_rh_status() 函数中部分代码如下:- if (length > 0) {
- 此时表示有新设备连接到 root hub 上
- ......
-
- urb = hcd->status_urb;
- urb 是 在 hub_activate() 函数中提交的(中断传输)
-
- if (urb) {
- spin_lock(&urb->lock);
- if (urb->status == -EINPROGRESS) {
- hcd->poll_pending = 0;
- hcd->status_urb = NULL;
-
- 为何要将此设置为NULL?以后怎样使用这个 URB 啊 ?
- 若以后又有新的设备连接到root hub 上 怎样最终执行 hub_events()呢?
-
- urb->status = 0;
- urb->hcpriv = NULL;
- urb->actual_length = length;
- memcpy(urb->transfer_buffer, buffer, length);
- } else /* urb has been unlinked */
- length = 0;
- spin_unlock(&urb->lock);
- } else
- length = 0;
- spin_unlock(&hcd_root_hub_lock);
- /* local irqs are always blocked in completions */
- if (length > 0)
- usb_hcd_giveback_urb (hcd, urb);
- else
- hcd->poll_pending = 1;
- 此句也不是很懂?
- local_irq_restore (flags);
- }
复制代码 |
|