[PATCH v6 18/22] usb: dwc2: host: Schedule periodic right away if it's time

Kever Yang kever.yang at rock-chips.com
Sun Jan 31 01:36:00 PST 2016


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 <dianders at chromium.org>
> Tested-by: Heiko Stuebner <heiko at sntech.de>
> Tested-by: Stefan Wahren <stefan.wahren at 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);
> +	}
>   }
>   
>   /**





More information about the linux-rpi-kernel mailing list