Commit 32db3d94 authored by John Youn's avatar John Youn Committed by Felipe Balbi

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: default avatarJohn Youn <johnyoun@synopsys.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 89bc856e
...@@ -845,6 +845,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, ...@@ -845,6 +845,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep) static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
{ {
struct dwc3_trb *tmp; struct dwc3_trb *tmp;
u8 trbs_left;
/* /*
* If enqueue & dequeue are equal than it is either full or empty. * 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) ...@@ -864,7 +865,10 @@ static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
return DWC3_TRB_NUM - 1; 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, static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
......
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