summaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3
diff options
context:
space:
mode:
authorJohn Youn <johnyoun@synopsys.com>2016-05-19 17:26:12 -0700
committerFelipe Balbi <felipe.balbi@linux.intel.com>2016-06-20 12:32:44 +0300
commit32db3d9437b6bd560daeef82a8325436a4ac3366 (patch)
tree6ca6932e39750d5de1f013cef4904c25b290b40f /drivers/usb/dwc3
parent89bc856e5a7462e47d90d5a3f5396bd5795efd0c (diff)
downloadop-kernel-dev-32db3d9437b6bd560daeef82a8325436a4ac3366.zip
op-kernel-dev-32db3d9437b6bd560daeef82a8325436a4ac3366.tar.gz
usb: dwc3: gadget: Account for max size in TRB space
The current calculation takes dep->trb_dequeue - dep->trb_enqueue to find the TRB space left. If you enqueue 1, that results in: (u8) 0 - (u8) 1 = 0xff = 255 TRBs left. This is correct if DWC3_TRB_NUM == 256. If DWC3_TRB_NUM is less than 256 (but still a power of 2) you need to mod the result by DWC3_TRB_NUM. For example the same calculation with DWC3_TRB_NUM = 8, results in: 255 % 6 = 7 TRBs left. Signed-off-by: John Youn <johnyoun@synopsys.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r--drivers/usb/dwc3/gadget.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 663ea9e..4dea3e0 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -845,6 +845,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
{
struct dwc3_trb *tmp;
+ u8 trbs_left;
/*
* If enqueue & dequeue are equal than it is either full or empty.
@@ -864,7 +865,10 @@ static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
return DWC3_TRB_NUM - 1;
}
- return dep->trb_dequeue - dep->trb_enqueue;
+ trbs_left = dep->trb_dequeue - dep->trb_enqueue;
+ trbs_left %= DWC3_TRB_NUM;
+
+ return trbs_left;
}
static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
OpenPOWER on IntegriCloud