Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: Introduce udc_set_ssp_rate() for SSP

A SuperSpeed Plus device may operate at different speed and lane count
(i.e. gen2x2, gen1x2, or gen2x1). Introduce gadget ops
udc_set_ssp_rate() to set the desire corresponding usb_ssp_rate for
SuperSpeed Plus capable devices.

If the USB device supports different speeds at SuperSpeed Plus, set the
device to operate with the maximum number of lanes and speed.

Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/9b85357cdadc02e3f0d653fd05f89eb46af836e1.1610592135.git.Thinh.Nguyen@synopsys.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Thinh Nguyen and committed by
Greg Kroah-Hartman
ead4c124 db615c62

+13 -5
+11 -5
drivers/usb/gadget/udc/core.c
··· 1133 1133 static inline void usb_gadget_udc_set_speed(struct usb_udc *udc, 1134 1134 enum usb_device_speed speed) 1135 1135 { 1136 - if (udc->gadget->ops->udc_set_speed) { 1137 - enum usb_device_speed s; 1136 + struct usb_gadget *gadget = udc->gadget; 1137 + enum usb_device_speed s; 1138 1138 1139 - s = min(speed, udc->gadget->max_speed); 1140 - udc->gadget->ops->udc_set_speed(udc->gadget, s); 1141 - } 1139 + if (speed == USB_SPEED_UNKNOWN) 1140 + s = gadget->max_speed; 1141 + else 1142 + s = min(speed, gadget->max_speed); 1143 + 1144 + if (s == USB_SPEED_SUPER_PLUS && gadget->ops->udc_set_ssp_rate) 1145 + gadget->ops->udc_set_ssp_rate(gadget, gadget->max_ssp_rate); 1146 + else if (gadget->ops->udc_set_speed) 1147 + gadget->ops->udc_set_speed(gadget, s); 1142 1148 } 1143 1149 1144 1150 /**
+2
include/linux/usb/gadget.h
··· 323 323 struct usb_gadget_driver *); 324 324 int (*udc_stop)(struct usb_gadget *); 325 325 void (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed); 326 + void (*udc_set_ssp_rate)(struct usb_gadget *gadget, 327 + enum usb_ssp_rate rate); 326 328 struct usb_ep *(*match_ep)(struct usb_gadget *, 327 329 struct usb_endpoint_descriptor *, 328 330 struct usb_ss_ep_comp_descriptor *);