usb: dwc3: gadget: check link trb after free_slot is increased
authorZhuang Jin Can <jin.can.zhuang@intel.com>
Thu, 15 May 2014 21:57:57 +0000 (05:57 +0800)
committerFelipe Balbi <balbi@ti.com>
Thu, 19 Jun 2014 13:51:07 +0000 (08:51 -0500)
commit5cd8c48d95c10f729090c89757727e090719fd83
treeb413d6182b8ac1892bd9f8f4a4f941b7c2964175
parent7171511eaec5bf23fb06078f59784a3a0626b38f
usb: dwc3: gadget: check link trb after free_slot is increased

In ISOC transfers, when free_slot points to the last TRB (i.e. Link
TRB), and all queued requests meet Missed Interval Isoc error, busy_slot
points to trb0.
busy_slot->trb0
   trb1
   ...
free_slot->trb31(Link TRB)

After end transfer and receiving the XferNotReady event, trb_left is
caculated as 1 which is wrong, and no TRB will be primed to the
endpoint.

The root cause is free_slot is not increased the same way as busy_slot.
When busy_slot is increased by one, it checks if points to a link TRB
after increasement, but free_slot checks it before increasement.
free_slot should behave the same as busy_slot to make the trb_left
caculation correct.

Reviewed-by: Pratyush Anand <pratyush.anand@st.com>
Signed-off-by: Zhuang Jin Can <jin.can.zhuang@intel.com>
Signed-off-by: Jiebing Li <jiebing.li@intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/gadget.c