Commit 7a32d9be authored by Thomas Pugliese's avatar Thomas Pugliese Committed by Greg Kroah-Hartman

usb: wusbcore: add support for isoc out transfers

This patch adds support for isochronous out transfers to the HWA.  The
primary changes are:

1.  Add a isoc_pack_desc_urb field to struct wa_seg.  This urb is used
to send the isochronous packet info message to the HWA which describes
the isoc data segment(s) that will be sent as the payload of the
transfer request.

2.  Use the URB iso_frame_desc field to populate the isochronous packet
info message and data segments sent to the HWA.

3.  After the data is sent and transfer result is returned from the
HWA, read the isoc packet status message from the HWA.  The contents of
the isoc packet status message are used to set the iso_frame_desc
status and actual_length fields in the original isoc URB.  This feature
required the addition of a some state tracking variables in struct wahc
so the dti_urb knows what type of packet it expects to receive next.
Signed-off-by: default avatarThomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e4a49a60
...@@ -122,6 +122,11 @@ struct wa_rpipe { ...@@ -122,6 +122,11 @@ struct wa_rpipe {
}; };
enum wa_dti_state {
WA_DTI_TRANSFER_RESULT_PENDING,
WA_DTI_ISOC_PACKET_STATUS_PENDING
};
/** /**
* Instance of a HWA Host Controller * Instance of a HWA Host Controller
* *
...@@ -181,6 +186,15 @@ struct wahc { ...@@ -181,6 +186,15 @@ struct wahc {
spinlock_t rpipe_bm_lock; /* protect rpipe_bm */ spinlock_t rpipe_bm_lock; /* protect rpipe_bm */
struct mutex rpipe_mutex; /* assigning resources to endpoints */ struct mutex rpipe_mutex; /* assigning resources to endpoints */
/*
* dti_state is used to track the state of the dti_urb. When dti_state
* is WA_DTI_ISOC_PACKET_STATUS_PENDING, dti_isoc_xfer_in_progress and
* dti_isoc_xfer_seg identify which xfer the incoming isoc packet status
* refers to.
*/
enum wa_dti_state dti_state;
u32 dti_isoc_xfer_in_progress;
u8 dti_isoc_xfer_seg;
struct urb *dti_urb; /* URB for reading xfer results */ struct urb *dti_urb; /* URB for reading xfer results */
struct urb *buf_in_urb; /* URB for reading data in */ struct urb *buf_in_urb; /* URB for reading data in */
struct edc dti_edc; /* DTI error density counter */ struct edc dti_edc; /* DTI error density counter */
...@@ -247,6 +261,7 @@ static inline void wa_init(struct wahc *wa) ...@@ -247,6 +261,7 @@ static inline void wa_init(struct wahc *wa)
{ {
edc_init(&wa->nep_edc); edc_init(&wa->nep_edc);
atomic_set(&wa->notifs_queued, 0); atomic_set(&wa->notifs_queued, 0);
wa->dti_state = WA_DTI_TRANSFER_RESULT_PENDING;
wa_rpipe_init(wa); wa_rpipe_init(wa);
edc_init(&wa->dti_edc); edc_init(&wa->dti_edc);
INIT_LIST_HEAD(&wa->xfer_list); INIT_LIST_HEAD(&wa->xfer_list);
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment