On 5/18/2012 7:24 PM, Pratyush Anand wrote:
On 5/18/2012 7:00 PM, Felipe Balbi wrote:
Hi,
On Tue, May 15, 2012 at 07:49:52PM +0530, Pratyush Anand wrote:
If an IN transfer is missed on isoc endpoint, then driver must insure
that next ep_queue is properly handled.
This patch fixes this issue by starting a new transfer for next queued
request.
Only limitation is that, gadget will have to submit a request within 4
uf time, which dwc3 driver considers safe enough for staring a new
transfer.
Signed-off-by: Pratyush Anand<pratyush.anand@xxxxxx>
---
drivers/usb/dwc3/core.h | 3 +++
drivers/usb/dwc3/gadget.c | 36 +++++++++++++++++++++++++++++++-----
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 2a920f8..c3f61f6 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -352,6 +352,7 @@ struct dwc3_event_buffer {
* @number: endpoint number (1 - 15)
* @type: set to bmAttributes& USB_ENDPOINT_XFERTYPE_MASK
* @res_trans_idx: Resource transfer index
+ * @event: pointer to event struct received during missed isoc
xferinprogress
* @interval: the intervall on which the ISOC transfer is started
* @name: a human readable name e.g. ep1out-bulk
* @direction: true for TX, false for RX
@@ -376,6 +377,7 @@ struct dwc3_ep {
#define DWC3_EP_WEDGE (1<< 2)
#define DWC3_EP_BUSY (1<< 4)
#define DWC3_EP_PENDING_REQUEST (1<< 5)
+#define DWC3_EP_MISSED_ISOC (1<< 6)
/* This last one is specific to EP0 */
#define DWC3_EP0_DIR_IN (1<< 31)
@@ -385,6 +387,7 @@ struct dwc3_ep {
u8 number;
u8 type;
u8 res_trans_idx;
+ const struct dwc3_event_depevt *event;
please don't do this... (see more below)
I see, some issue here. May be I will also write to synopsys to clarify it.
frame no coming from event->parameters is of 16 bit.
frame no coming from DSTS is of 13 bits. So, for some cases they might
have different values.
For ex, in my test:
bInterval is 1.
mask = ~(dep->interval - 1);
cur_uf = event->parameters & mask;
gives me cur_uf as 0x791f
while,
cur_uf = __dwc3_gadget_get_frame(dwc);
gives me cur_uf as 0x191F
If I call
dwc3_gadget_start_isoc_uf(dwc, dep, cur_uf)
with cur_uf obtained from __dwc3_gadget_get_frame(dwc) , it does not work.
Regards
Pratyush
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html