diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2006-05-19 16:52:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-21 18:04:12 -0400 |
commit | c8155cc5d839838f8425dbea568fc537337176a7 (patch) | |
tree | fc50ffe774fa59a1a3d18e8543bb7e04d1e80726 /drivers/usb/host/uhci-hcd.h | |
parent | caf3827a65af476c71eaeb79636869a4ab128d48 (diff) |
[PATCH] UHCI: remove ISO TDs as they are used
This patch (as690) does the same thing for ISO TDs as as680 did for
non-ISO TDs: free them as they are used rather than all at once when an
URB is complete. At the same time it fixes a minor buglet (I'm not
aware of it ever affecting anyone): An ISO TD should be retired when its
frame is over, regardless of whether or not the hardware has marked it
inactive.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/uhci-hcd.h')
-rw-r--r-- | drivers/usb/host/uhci-hcd.h | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index eaac6ddf03a0..469b4268b850 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h | |||
@@ -128,8 +128,6 @@ struct uhci_qh { | |||
128 | __le32 element; /* Queue element (TD) pointer */ | 128 | __le32 element; /* Queue element (TD) pointer */ |
129 | 129 | ||
130 | /* Software fields */ | 130 | /* Software fields */ |
131 | dma_addr_t dma_handle; | ||
132 | |||
133 | struct list_head node; /* Node in the list of QHs */ | 131 | struct list_head node; /* Node in the list of QHs */ |
134 | struct usb_host_endpoint *hep; /* Endpoint information */ | 132 | struct usb_host_endpoint *hep; /* Endpoint information */ |
135 | struct usb_device *udev; | 133 | struct usb_device *udev; |
@@ -138,13 +136,19 @@ struct uhci_qh { | |||
138 | struct uhci_td *dummy_td; /* Dummy TD to end the queue */ | 136 | struct uhci_td *dummy_td; /* Dummy TD to end the queue */ |
139 | struct uhci_td *post_td; /* Last TD completed */ | 137 | struct uhci_td *post_td; /* Last TD completed */ |
140 | 138 | ||
139 | struct usb_iso_packet_descriptor *iso_packet_desc; | ||
140 | /* Next urb->iso_frame_desc entry */ | ||
141 | unsigned long advance_jiffies; /* Time of last queue advance */ | 141 | unsigned long advance_jiffies; /* Time of last queue advance */ |
142 | unsigned int unlink_frame; /* When the QH was unlinked */ | 142 | unsigned int unlink_frame; /* When the QH was unlinked */ |
143 | unsigned int period; /* For Interrupt and Isochronous QHs */ | 143 | unsigned int period; /* For Interrupt and Isochronous QHs */ |
144 | unsigned int iso_frame; /* Frame # for iso_packet_desc */ | ||
145 | int iso_status; /* Status for Isochronous URBs */ | ||
144 | 146 | ||
145 | int state; /* QH_STATE_xxx; see above */ | 147 | int state; /* QH_STATE_xxx; see above */ |
146 | int type; /* Queue type (control, bulk, etc) */ | 148 | int type; /* Queue type (control, bulk, etc) */ |
147 | 149 | ||
150 | dma_addr_t dma_handle; | ||
151 | |||
148 | unsigned int initial_toggle:1; /* Endpoint's current toggle value */ | 152 | unsigned int initial_toggle:1; /* Endpoint's current toggle value */ |
149 | unsigned int needs_fixup:1; /* Must fix the TD toggle values */ | 153 | unsigned int needs_fixup:1; /* Must fix the TD toggle values */ |
150 | unsigned int is_stopped:1; /* Queue was stopped by error/unlink */ | 154 | unsigned int is_stopped:1; /* Queue was stopped by error/unlink */ |
@@ -386,6 +390,8 @@ struct uhci_hcd { | |||
386 | unsigned int frame_number; /* As of last check */ | 390 | unsigned int frame_number; /* As of last check */ |
387 | unsigned int is_stopped; | 391 | unsigned int is_stopped; |
388 | #define UHCI_IS_STOPPED 9999 /* Larger than a frame # */ | 392 | #define UHCI_IS_STOPPED 9999 /* Larger than a frame # */ |
393 | unsigned int last_iso_frame; /* Frame of last scan */ | ||
394 | unsigned int cur_iso_frame; /* Frame for current scan */ | ||
389 | 395 | ||
390 | unsigned int scan_in_progress:1; /* Schedule scan is running */ | 396 | unsigned int scan_in_progress:1; /* Schedule scan is running */ |
391 | unsigned int need_rescan:1; /* Redo the schedule scan */ | 397 | unsigned int need_rescan:1; /* Redo the schedule scan */ |