| Oliver Neukum | e6a79f1 | 2008-04-09 15:37:34 +0200 | [diff] [blame] | 1 | What is anchor? | 
 | 2 | =============== | 
 | 3 |  | 
 | 4 | A USB driver needs to support some callbacks requiring | 
 | 5 | a driver to cease all IO to an interface. To do so, a | 
 | 6 | driver has to keep track of the URBs it has submitted | 
 | 7 | to know they've all completed or to call usb_kill_urb | 
 | 8 | for them. The anchor is a data structure takes care of | 
 | 9 | keeping track of URBs and provides methods to deal with | 
 | 10 | multiple URBs. | 
 | 11 |  | 
 | 12 | Allocation and Initialisation | 
 | 13 | ============================= | 
 | 14 |  | 
 | 15 | There's no API to allocate an anchor. It is simply declared | 
 | 16 | as struct usb_anchor. init_usb_anchor() must be called to | 
 | 17 | initialise the data structure. | 
 | 18 |  | 
 | 19 | Deallocation | 
 | 20 | ============ | 
 | 21 |  | 
 | 22 | Once it has no more URBs associated with it, the anchor can be | 
 | 23 | freed with normal memory management operations. | 
 | 24 |  | 
 | 25 | Association and disassociation of URBs with anchors | 
 | 26 | =================================================== | 
 | 27 |  | 
 | 28 | An association of URBs to an anchor is made by an explicit | 
 | 29 | call to usb_anchor_urb(). The association is maintained until | 
| Matt LaPlante | 19f5946 | 2009-04-27 15:06:31 +0200 | [diff] [blame] | 30 | an URB is finished by (successful) completion. Thus disassociation | 
| Oliver Neukum | e6a79f1 | 2008-04-09 15:37:34 +0200 | [diff] [blame] | 31 | is automatic. A function is provided to forcibly finish (kill) | 
 | 32 | all URBs associated with an anchor. | 
 | 33 | Furthermore, disassociation can be made with usb_unanchor_urb() | 
 | 34 |  | 
 | 35 | Operations on multitudes of URBs | 
 | 36 | ================================ | 
 | 37 |  | 
 | 38 | usb_kill_anchored_urbs() | 
 | 39 | ------------------------ | 
 | 40 |  | 
 | 41 | This function kills all URBs associated with an anchor. The URBs | 
 | 42 | are called in the reverse temporal order they were submitted. | 
 | 43 | This way no data can be reordered. | 
 | 44 |  | 
| Oliver Neukum | 697e04d | 2008-09-02 10:52:08 +0200 | [diff] [blame] | 45 | usb_unlink_anchored_urbs() | 
 | 46 | -------------------------- | 
 | 47 |  | 
 | 48 | This function unlinks all URBs associated with an anchor. The URBs | 
 | 49 | are processed in the reverse temporal order they were submitted. | 
 | 50 | This is similar to usb_kill_anchored_urbs(), but it will not sleep. | 
 | 51 | Therefore no guarantee is made that the URBs have been unlinked when | 
 | 52 | the call returns. They may be unlinked later but will be unlinked in | 
 | 53 | finite time. | 
 | 54 |  | 
| Oliver Neukum | d1b1944 | 2008-09-02 14:16:11 +0200 | [diff] [blame] | 55 | usb_scuttle_anchored_urbs() | 
 | 56 | --------------------------- | 
 | 57 |  | 
 | 58 | All URBs of an anchor are unanchored en masse. | 
 | 59 |  | 
| Oliver Neukum | e6a79f1 | 2008-04-09 15:37:34 +0200 | [diff] [blame] | 60 | usb_wait_anchor_empty_timeout() | 
 | 61 | ------------------------------- | 
 | 62 |  | 
 | 63 | This function waits for all URBs associated with an anchor to finish | 
 | 64 | or a timeout, whichever comes first. Its return value will tell you | 
 | 65 | whether the timeout was reached. | 
| Oliver Neukum | 697e04d | 2008-09-02 10:52:08 +0200 | [diff] [blame] | 66 |  | 
| Oliver Neukum | d1b1944 | 2008-09-02 14:16:11 +0200 | [diff] [blame] | 67 | usb_anchor_empty() | 
 | 68 | ------------------ | 
| Oliver Neukum | 697e04d | 2008-09-02 10:52:08 +0200 | [diff] [blame] | 69 |  | 
| Oliver Neukum | d1b1944 | 2008-09-02 14:16:11 +0200 | [diff] [blame] | 70 | Returns true if no URBs are associated with an anchor. Locking | 
 | 71 | is the caller's responsibility. | 
 | 72 |  | 
 | 73 | usb_get_from_anchor() | 
 | 74 | --------------------- | 
 | 75 |  | 
 | 76 | Returns the oldest anchored URB of an anchor. The URB is unanchored | 
 | 77 | and returned with a reference. As you may mix URBs to several | 
 | 78 | destinations in one anchor you have no guarantee the chronologically | 
| Matt LaPlante | 19f5946 | 2009-04-27 15:06:31 +0200 | [diff] [blame] | 79 | first submitted URB is returned. |