lkml.org 
[lkml]   [2016]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 15/22] usb: dwc2: host: Split code out to make dwc2_do_reserve()
    Date
    This no-op change splits code out of dwc2_schedule_periodic() into a
    dwc2_do_reserve() function. This makes it a little easier to follow the
    logic.

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

    Changes in v5: None
    Changes in v4:
    - Split code out to make dwc2_do_reserve() new for v4.

    Changes in v3: None
    Changes in v2: None

    drivers/usb/dwc2/hcd_queue.c | 112 ++++++++++++++++++++++++++-----------------
    1 file changed, 67 insertions(+), 45 deletions(-)

    diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c
    index 8a2067bc1e62..9ce407e5017d 100644
    --- a/drivers/usb/dwc2/hcd_queue.c
    +++ b/drivers/usb/dwc2/hcd_queue.c
    @@ -245,6 +245,70 @@ static int dwc2_find_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
    }

    /**
    + * dwc2_do_reserve() - Make a periodic reservation
    + *
    + * Try to allocate space in the periodic schedule. Depending on parameters
    + * this might use the microframe scheduler or the dumb scheduler.
    + *
    + * @hsotg: The HCD state structure for the DWC OTG controller
    + * @qh: QH for the periodic transfer.
    + *
    + * Returns: 0 upon success; error upon failure.
    + */
    +static int dwc2_do_reserve(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
    +{
    + int status;
    +
    + if (hsotg->core_params->uframe_sched > 0) {
    + int frame = -1;
    +
    + status = dwc2_find_uframe(hsotg, qh);
    + if (status == 0)
    + frame = 7;
    + else if (status > 0)
    + frame = status - 1;
    +
    + /* Set the new frame up */
    + if (frame >= 0) {
    + qh->next_active_frame &= ~0x7;
    + qh->next_active_frame |= (frame & 7);
    + dwc2_sch_dbg(hsotg,
    + "QH=%p sched_p nxt=%04x, uf=%d\n",
    + qh, qh->next_active_frame, frame);
    + }
    +
    + if (status > 0)
    + status = 0;
    + } else {
    + status = dwc2_periodic_channel_available(hsotg);
    + if (status) {
    + dev_info(hsotg->dev,
    + "%s: No host channel available for periodic transfer\n",
    + __func__);
    + return status;
    + }
    +
    + status = dwc2_check_periodic_bandwidth(hsotg, qh);
    + }
    +
    + if (status) {
    + dev_dbg(hsotg->dev,
    + "%s: Insufficient periodic bandwidth for periodic transfer\n",
    + __func__);
    + return status;
    + }
    +
    + if (hsotg->core_params->uframe_sched <= 0)
    + /* Reserve periodic channel */
    + hsotg->periodic_channels++;
    +
    + /* Update claimed usecs per (micro)frame */
    + hsotg->periodic_usecs += qh->host_us;
    +
    + return 0;
    +}
    +
    +/**
    * dwc2_do_unreserve() - Actually release the periodic reservation
    *
    * This function actually releases the periodic bandwidth that was reserved
    @@ -393,51 +457,9 @@ static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
    * that case.
    */
    if (!qh->unreserve_pending) {
    - if (hsotg->core_params->uframe_sched > 0) {
    - int frame = -1;
    -
    - status = dwc2_find_uframe(hsotg, qh);
    - if (status == 0)
    - frame = 7;
    - else if (status > 0)
    - frame = status - 1;
    -
    - /* Set the new frame up */
    - if (frame >= 0) {
    - qh->next_active_frame &= ~0x7;
    - qh->next_active_frame |= (frame & 7);
    - dwc2_sch_dbg(hsotg,
    - "QH=%p sched_p nxt=%04x, uf=%d\n",
    - qh, qh->next_active_frame, frame);
    - }
    -
    - if (status > 0)
    - status = 0;
    - } else {
    - status = dwc2_periodic_channel_available(hsotg);
    - if (status) {
    - dev_info(hsotg->dev,
    - "%s: No host channel available for periodic transfer\n",
    - __func__);
    - return status;
    - }
    -
    - status = dwc2_check_periodic_bandwidth(hsotg, qh);
    - }
    -
    - if (status) {
    - dev_dbg(hsotg->dev,
    - "%s: Insufficient periodic bandwidth for periodic transfer\n",
    - __func__);
    + status = dwc2_do_reserve(hsotg, qh);
    + if (status)
    return status;
    - }
    -
    - if (hsotg->core_params->uframe_sched <= 0)
    - /* Reserve periodic channel */
    - hsotg->periodic_channels++;
    -
    - /* Update claimed usecs per (micro)frame */
    - hsotg->periodic_usecs += qh->host_us;
    }

    qh->unreserve_pending = 0;
    @@ -450,7 +472,7 @@ static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
    list_add_tail(&qh->qh_list_entry,
    &hsotg->periodic_sched_inactive);

    - return status;
    + return 0;
    }

    /**
    --
    2.7.0.rc3.207.g0ac5344
    \
     
     \ /
      Last update: 2016-01-29 03:41    [W:3.653 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site