Re: [RFC 3/4] xhci: A default implementation for Ux timeout calculation and tier policy check

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Apr 11, 2014 at 11:29 PM, Felipe Balbi <balbi@xxxxxx> wrote:
> On Fri, Apr 11, 2014 at 03:50:05PM +0530, Pratyush Anand wrote:
>> As best case, a host controller should support U0 to U1 switching for
>> the devices connected below any tier of hub level supported by usb
>> specification. Therefore xhci_check_default_tier_policy always returns
>> success.
>>
>> A host should be able to issue LGO_Ux after the timeout calculated as
>> per definition of system exit latency defined in C.1.5.2. Therefore
>> xhci_calculate_default_ux_timeout returns ux_params.sel as the default
>> implementation.
>>
>> Use default calculation in absence of any vendor specific limitations.
>>
>> Signed-off-by: Pratyush Anand <pratyush.anand@xxxxxx>
>> ---
>>  drivers/usb/host/xhci.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 61 insertions(+)
>>
>> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
>> index 6cc58fe..930c01f 100644
>> --- a/drivers/usb/host/xhci.c
>> +++ b/drivers/usb/host/xhci.c
>> @@ -4140,6 +4140,53 @@ static u16 xhci_get_timeout_no_hub_lpm(struct usb_device *udev,
>>       return USB3_LPM_DISABLED;
>>  }
>>
>> +/* Returns the default hub-encoded U1 timeout value.
>> + */
>
> fits in one line

Ok.

>
>> +static u16 xhci_calculate_default_u1_timeout(struct usb_device *udev,
>> +             struct usb_endpoint_descriptor *desc)
>> +{
>> +     unsigned long long timeout_ns;
>> +
>> +     timeout_ns = udev->u1_params.sel;
>> +
>> +     /* The U1 timeout is encoded in 1us intervals. */
>> +     timeout_ns = DIV_ROUND_UP_ULL(timeout_ns, 1000);
>> +     /* Don't return a timeout of zero, because that's USB3_LPM_DISABLED. */
>> +     if (timeout_ns == USB3_LPM_DISABLED)
>
> will this *ever* happen ? you're using DIV_ROUND_UP...

Only when timeout_ns was zero before DIV_* operation.

>
>> +             timeout_ns++;
>> +
>> +     /* If the necessary timeout value is bigger than what we can set in the
>> +      * USB 3.0 hub, we have to disable hub-initiated U1.
>> +      */
>> +     if (timeout_ns <= USB3_LPM_U1_MAX_TIMEOUT)
>> +             return timeout_ns;
>> +     dev_dbg(&udev->dev, "Hub-initiated U1 disabled "
>> +                     "due to long timeout %llu ms\n", timeout_ns);
>> +     return xhci_get_timeout_no_hub_lpm(udev, USB3_LPM_U1);
>> +}
>> +
>> +/* Returns the default hub-encoded U2 timeout value.
>> + */
>> +static u16 xhci_calculate_default_u2_timeout(struct usb_device *udev,
>> +             struct usb_endpoint_descriptor *desc)
>> +{
>> +     unsigned long long timeout_ns;
>> +
>> +     timeout_ns = udev->u2_params.sel;
>> +
>> +     /* The U2 timeout is encoded in 256us intervals */
>> +     timeout_ns = DIV_ROUND_UP_ULL(timeout_ns, 256 * 1000);
>> +     /* If the necessary timeout value is bigger than what we can set in the
>> +      * USB 3.0 hub, we have to disable hub-initiated U2.
>> +      */
>> +     if (timeout_ns <= USB3_LPM_U2_MAX_TIMEOUT)
>> +             return timeout_ns;
>> +     dev_dbg(&udev->dev, "Hub-initiated U2 disabled "
>> +                     "due to long timeout %llu ms\n", timeout_ns);
>> +     return xhci_get_timeout_no_hub_lpm(udev, USB3_LPM_U2);
>
> this function is mostly duplicated with default_u1, perhaps refactor it
> a bit and pass one extra argument which will tell you if you're
> calculating U1 or U2 ?

Can be done.
Will wait for Mathias comments  and then will send another version.

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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux