Linux Kernel
3.7.1
|
#include <whci-hc.h>
Data Fields | |
struct whc_qhead | qh |
union { | |
struct whc_qtd qtd [WHCI_QSET_TD_MAX] | |
struct whc_itd itd [WHCI_QSET_TD_MAX] | |
}; | |
dma_addr_t | qset_dma |
struct whc * | whc |
struct usb_host_endpoint * | ep |
struct list_head | stds |
int | ntds |
int | td_start |
int | td_end |
struct list_head | list_node |
unsigned | in_sw_list:1 |
unsigned | in_hw_list:1 |
unsigned | remove:1 |
unsigned | reset:1 |
struct urb * | pause_after_urb |
struct completion | remove_complete |
uint16_t | max_packet |
uint8_t | max_burst |
uint8_t | max_seq |
struct whc_qset - WUSB data transfers to a specific endpoint : the QHead of this qset : up to 8 qTDs (for qsets for control, bulk and interrupt transfers) : up to 8 iTDs (for qsets for isochronous transfers) : DMA address for this qset : WHCI HC this qset is for : endpoint : list of sTDs queued to this qset : number of qTDs queued (not necessarily the same as nTDs field in the QH) : index of the first qTD in the list : index of next free qTD in the list (provided ntds < WHCI_QSET_TD_MAX)
Queue Sets (qsets) are added to the asynchronous schedule list (ASL) or the periodic zone list (PZL).
qsets may contain up to 8 TDs (either qTDs or iTDs as appropriate). Each TD may refer to at most 1 MiB of data. If a single transfer has > 8MiB of data, TDs can be reused as they are completed since the TD list is used as a circular buffer. Similarly, several (smaller) transfers may be queued in a qset.
WHCI controllers may cache portions of the qsets in the ASL and PZL, requiring the WHCD to inform the WHC that the lists have been updated (fields changed or qsets inserted or removed). For safe insertion and removal of qsets from the lists the schedule must be stopped to avoid races in updating the QH link pointers.
Since the HC is free to execute qsets in any order, all transfers to an endpoint should use the same qset to ensure transfers are executed in the order they're submitted.
[WHCI] section 3.2.3
union { ... } |
dma_addr_t qset_dma |
struct completion remove_complete |