USB Anchors

什么是anchor?

USB驱动程序需要支持一些回调函数,这些回调函数要求驱动程序停止与接口的所有IO。为此,驱动程序必须跟踪已提交的URB,以了解它们是否已全部完成,或者调用usb_kill_urb来处理它们。anchor是一种数据结构,负责跟踪URB并提供处理多个URB的方法。

分配和初始化

没有API来分配anchor。它只是声明为struct usb_anchor。init_usb_anchor()必须被调用来初始化数据结构。

释放

一旦它没有更多与它关联的URB,anchor可以通过正常的内存管理操作释放。

URB与anchor的关联和解除关联

URB与anchor的关联是通过显式调用usb_anchor_urb()来实现的。该关联一直保持到URB完成(成功完成)。因此,解除关联是自动的。提供了一个函数来强制完成(杀死)与anchor关联的所有URB。此外,可以通过usb_unanchor_urb()来解除关联

对大量URB的操作

usb_kill_anchored_urbs()

此函数杀死与anchor关联的所有URB。URB以它们被提交的相反时间顺序被调用。这样就不会重新排序数据。

usb_scuttle_anchored_urbs()

一个anchor的所有URB都被批量解除锚定。

usb_wait_anchor_empty_timeout()

此函数等待与anchor关联的所有URB完成或超时,以先发生者为准。其返回值将告诉您是否已达到超时。

usb_anchor_empty()

如果anchor没有关联的URB,则返回true。锁定是调用者的责任。

usb_get_from_anchor()

返回anchor中最旧的锚定URB。该URB被解除锚定并返回一个引用。由于您可能会在一个anchor中混合URB到多个目的地,因此您无法保证按时间顺序第一个提交的URB会被返回。