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會被返回。