lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 365/757] usb: gadget: f_ncm: fix ncm_bitrate for SuperSpeed and above.
    Date
    From: Lorenzo Colitti <lorenzo@google.com>

    [ Upstream commit 986499b1569af980a819817f17238015b27793f6 ]

    Currently, SuperSpeed NCM gadgets report a speed of 851 Mbps
    in USB_CDC_NOTIFY_SPEED_CHANGE. But the calculation appears to
    assume 16 packets per microframe, and USB 3 and above no longer
    use microframes.

    Maximum speed is actually much higher. On a direct connection,
    theoretical throughput is at most 3.86 Gbps for gen1x1 and
    9.36 Gbps for gen2x1, and I have seen gadget->host iperf
    throughput of >2 Gbps for gen1x1 and >4 Gbps for gen2x1.

    Unfortunately the ConnectionSpeedChange defined in the CDC spec
    only uses 32-bit values, so we can't report accurate numbers for
    10Gbps and above. So, report 3.75Gbps for SuperSpeed (which is
    roughly maximum theoretical performance) and 4.25Gbps for
    SuperSpeed Plus (which is close to the maximum that we can report
    in a 32-bit unsigned integer).

    This results in:

    [50879.191272] cdc_ncm 2-2:1.0 enx228b127e050c: renamed from usb0
    [50879.234778] cdc_ncm 2-2:1.0 enx228b127e050c: 3750 mbit/s downlink 3750 mbit/s uplink

    on SuperSpeed and:

    [50798.434527] cdc_ncm 8-2:1.0 enx228b127e050c: renamed from usb0
    [50798.524278] cdc_ncm 8-2:1.0 enx228b127e050c: 4250 mbit/s downlink 4250 mbit/s uplink

    on SuperSpeed Plus.

    Fixes: 1650113888fe ("usb: gadget: f_ncm: add SuperSpeed descriptors for CDC NCM")
    Reviewed-by: Maciej Żenczykowski <maze@google.com>
    Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
    Signed-off-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/gadget/function/f_ncm.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c
    index 1f638759a9533..7672fa25085b0 100644
    --- a/drivers/usb/gadget/function/f_ncm.c
    +++ b/drivers/usb/gadget/function/f_ncm.c
    @@ -85,8 +85,10 @@ static inline struct f_ncm *func_to_ncm(struct usb_function *f)
    /* peak (theoretical) bulk transfer rate in bits-per-second */
    static inline unsigned ncm_bitrate(struct usb_gadget *g)
    {
    - if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER)
    - return 13 * 1024 * 8 * 1000 * 8;
    + if (gadget_is_superspeed(g) && g->speed >= USB_SPEED_SUPER_PLUS)
    + return 4250000000U;
    + else if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER)
    + return 3750000000U;
    else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
    return 13 * 512 * 8 * 1000 * 8;
    else
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:10    [W:2.893 / U:0.564 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site