Commit 9a9ce1df authored by Igor Kotrasinski's avatar Igor Kotrasinski Committed by Felipe Balbi

usb: gadget: dummy_hcd: in transfer(), return data sent, not limit

dummy_timer uses transfer() to update transfer limit. However,
limit passed to dummy_timer changes depending on transfer type,
so the actual limit is overwritten.

This can cause unpredictably slow / fast bulk transfers when
coupled with control / interrupt transfers.

Fix by returning actual amount of data sent in transfer() and
substracting from total.
Signed-off-by: default avatarIgor Kotrasinski <i.kotrasinsk@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent e42bd6a5
...@@ -1348,6 +1348,7 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb, ...@@ -1348,6 +1348,7 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
{ {
struct dummy *dum = dum_hcd->dum; struct dummy *dum = dum_hcd->dum;
struct dummy_request *req; struct dummy_request *req;
int sent = 0;
top: top:
/* if there's no request queued, the device is NAKing; return */ /* if there's no request queued, the device is NAKing; return */
...@@ -1402,6 +1403,7 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb, ...@@ -1402,6 +1403,7 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
req->req.status = len; req->req.status = len;
} else { } else {
limit -= len; limit -= len;
sent += len;
urb->actual_length += len; urb->actual_length += len;
req->req.actual += len; req->req.actual += len;
} }
...@@ -1472,7 +1474,7 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb, ...@@ -1472,7 +1474,7 @@ static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
if (rescan) if (rescan)
goto top; goto top;
} }
return limit; return sent;
} }
static int periodic_bytes(struct dummy *dum, struct dummy_ep *ep) static int periodic_bytes(struct dummy *dum, struct dummy_ep *ep)
...@@ -1902,7 +1904,7 @@ static void dummy_timer(unsigned long _dum_hcd) ...@@ -1902,7 +1904,7 @@ static void dummy_timer(unsigned long _dum_hcd)
default: default:
treat_control_like_bulk: treat_control_like_bulk:
ep->last_io = jiffies; ep->last_io = jiffies;
total = transfer(dum_hcd, urb, ep, limit, &status); total -= transfer(dum_hcd, urb, ep, limit, &status);
break; break;
} }
......
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