On Mon, Aug 24, 2020 at 10:55 PM Lorenzo Colitti <lorenzo@xxxxxxxxxx> wrote: > > 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") > Signed-off-by: Lorenzo Colitti <lorenzo@xxxxxxxxxx> > --- > 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 1d900081b1..5b9266a87f 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.28.0.297.g1956fa8f8d-goog > Reviewed-by: Maciej Żenczykowski <maze@xxxxxxxxxx>