Doug,

On 01/29/2016 10:20 AM, Douglas Anderson wrote:
In dwc2_hcd_qh_deactivate() we will put some things on the
periodic_sched_ready list.  These things won't be taken off the ready
list until the next SOF, which might be a little late.  Let's put them
on right away.

Signed-off-by: Douglas Anderson <diand...@chromium.org>
Tested-by: Heiko Stuebner <he...@sntech.de>
Tested-by: Stefan Wahren <stefan.wah...@i2se.com>
---
Changes in v6:
- Add Heiko's Tested-by.
- Add Stefan's Tested-by.

Changes in v5: None
Changes in v4:
- Schedule periodic right away if it's time new for v4.

Changes in v3: None
Changes in v2: None

  drivers/usb/dwc2/hcd_queue.c | 18 ++++++++++++++++--
  1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c
index 9b3c435339ee..3abb34a5fc5b 100644
--- a/drivers/usb/dwc2/hcd_queue.c
+++ b/drivers/usb/dwc2/hcd_queue.c
@@ -1080,12 +1080,26 @@ void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, 
struct dwc2_qh *qh,
         * Note: we purposely use the frame_number from the "hsotg" structure
         * since we know SOF interrupt will handle future frames.
         */
-       if (dwc2_frame_num_le(qh->next_active_frame, hsotg->frame_number))
+       if (dwc2_frame_num_le(qh->next_active_frame, hsotg->frame_number)) {
+               enum dwc2_transaction_type tr_type;
+
+               /*
+                * We're bypassing the SOF handler which is normally what puts
+                * us on the ready list because we're in a hurry and need to
+                * try to catch up.
+                */
+               dwc2_sch_vdbg(hsotg, "QH=%p IMM ready fn=%04x, nxt=%04x\n",
+                             qh, frame_number, qh->next_active_frame);
                list_move_tail(&qh->qh_list_entry,
                               &hsotg->periodic_sched_ready);
-       else
+
+               tr_type = dwc2_hcd_select_transactions(hsotg);
Do we need to add select_transactions call here? If we get into this function in interrupt and once we put the qh in ready queue, the qh can be handled in this frame again by the later function call of dwc_hcd_select_transactions, so what we need to to here is put
it in ready list instead of inactive queue, and wait for the schedule.

Thanks,
- Kever

+               if (tr_type != DWC2_TRANSACTION_NONE)
+                       dwc2_hcd_queue_transactions(hsotg, tr_type);
+       } else {
                list_move_tail(&qh->qh_list_entry,
                               &hsotg->periodic_sched_inactive);
+       }
  }
/**


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to