usb: Support USB 3.2 multi-lanes
Subsystems (3)
Thinh Nguyen
maintainerv7 cover usb: Support USB 3.2 multi-lanes
A USB SuperSpeed Plus device may operate at different speed and lane count (i.e. gen2x2, gen1x2, or gen2x1). The DWC_usb32 IP supports SuperSpeed Plus gen2x2. To support this, this series update a few things to the USB gadget stack and dwc3 driver:
* Accept and parse new maximum_speed devicetree property strings
* Introduce enum usb_ssp_rate to describe the speed in SuperSpeed Plus genXxY
* Capture the connected and max supported usb_ssp_rate
* Report the device sublink speeds base on the usb_ssp_rate in the BOS descriptor
* Introduce gadget ops to select SuperSpeed Plus various transfer rate and lane count
* Update dwc3 driver to support the above changes
Changes in v7:
- Greg picked up the first few patches of the series to his usb-testing branch. Rebase the remaining patches on Greg's usb-testing branch
Changes in v6:
- Rebase on Greg's usb-testing branch
- Update cover letter and title since there are many updates
* Previous version 5: https://lore.kernel.org/linux-usb/[email protected]/
- To simplify things, use usb_ssp_rate enum to specify the signaling rate
generation and lane count instead of separately tracking them.
- Convert the sublink speed attributes to macros and move it to uapi
- Remove usb_sublink_speed struct
- Remove "usb: dwc3: gadget: Report sublink speed capability"
- Update dwc3 to support the new changes
Changes in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
- Add Rob's Reviewed-by
Changes in v4:
- Instead of using a single function to parse "maximum-speed" property for speed, gen X, and number of lanes, split those tasks to separate common functions
- Revise DWC3 driver to use those new common functions
- Fix checkpatch warnings for using "unsigned" rather than "unsigned int" and missing identifier name in udc_set_num_lanes_and_speed gadget ops
Changes in v3:
- Remove "num-lanes" and "lane-speed-mantissa-gbps" common properties
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties validation in dwc3
- Update "maximum-speed" to support variations of SSP Gen X x Y
- Update common function to parse new strings for "maximum-speed"
- Update commit messages for the new changes
Changes in v2:
- Move usb_sublink_speed attribute struct and enum to include/linux/usb/ch9.h
- Use "num-lanes" and "lane-speed-mantissa-gbps" as common properties instead
- Add common functions to get num-lanes and lsm properties
- Fix missing gen1x2 sublink speed attribute check report in dwc3
Thinh Nguyen (6):
dt-binding: usb: Include USB SSP rates in GenXxY
usb: common: Parse for USB SSP genXxY
usb: dwc3: core: Check maximum_speed SSP genXxY
usb: dwc3: gadget: Implement setting of SSP rate
usb: dwc3: gadget: Track connected SSP rate and lane count
usb: dwc3: gadget: Set speed only up to the max supported
.../devicetree/bindings/usb/usb.yaml | 3 + drivers/usb/common/common.c | 26 +++++- drivers/usb/dwc3/core.c | 37 +++++++++ drivers/usb/dwc3/core.h | 9 +++ drivers/usb/dwc3/gadget.c | 80 ++++++++++++++++++- include/linux/usb/ch9.h | 11 +++ 6 files changed, 162 insertions(+), 4 deletions(-)
base-commit: 7a79f1f7f7e75e532c5a803ab3ebf42a3e79497c
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v7 1/6 dt-binding: usb: Include USB SSP rates in GenXxY
According to the USB 3.2 spec, a SuperSpeed Plus device can operate at gen2x2, gen2x1, or gen1x2. If the USB controller device supports multiple lanes at different transfer rates, the user can specify the HW capability via these new speed strings:
"super-speed-plus-gen2x2"
"super-speed-plus-gen2x1"
"super-speed-plus-gen1x2"
If the argument is simply "super-speed-plus", USB controllers should default to their maximum transfer rate and number of lanes.
---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Update the different maximum_speed enums to the usb.yaml
- Remove Reviewed-by: Rob Herring <[email protected]> because the commit is updated
- Rebase on Greg's usb-testing branch
- Update commit message
Changes in v5:
- Add Reviewed-by: Rob Herring <[email protected]>
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
Changes in v4:
- None
Changes in v3:
- Use "maximum-speed" to include both the num-lane and transfer rate for SSP
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties Changes in v2:
- Make "num-lanes" and "lane-speed-mantissa-gbps" common USB properties
Documentation/devicetree/bindings/usb/usb.yaml | 3 +++ 1 file changed, 3 insertions(+)
Documentation/devicetree/bindings/usb/usb.yaml +3 -0
@@ -54,6 +54,9 @@ properties: - high-speed - super-speed - super-speed-plus + - super-speed-plus-gen2x1 + - super-speed-plus-gen1x2 + - super-speed-plus-gen2x2 additionalProperties: true
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerRe: [PATCH v7 1/6] dt-binding: usb: Include USB SSP rates in GenXxY
Hi Rob,
Quoted 41 lines · Thinh Nguyen
According to the USB 3.2 spec, a SuperSpeed Plus device can operate at gen2x2, gen2x1, or gen1x2. If the USB controller device supports multiple lanes at different transfer rates, the user can specify the HW capability via these new speed strings:
"super-speed-plus-gen2x2"
"super-speed-plus-gen2x1"
"super-speed-plus-gen1x2"If the argument is simply "super-speed-plus", USB controllers should default to their maximum transfer rate and number of lanes.
Signed-off-by Thinh Nguyen <[email protected]>---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Update the differentmaximum_speedenums to theusb.yaml
- Remove Reviewed-by: Rob Herring <[email protected]> because the commit is updated
- Rebase on Greg's usb-testing branch
- Update commit message
Changes in v5:
- Add Reviewed-by: Rob Herring <[email protected]>
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
Changes in v4:
- None
Changes in v3:
- Use "maximum-speed" to include both the num-lane and transfer rate for SSP
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties Changes in v2:
- Make "num-lanes" and "lane-speed-mantissa-gbps" common USB propertiesDocumentation/devicetree/bindings/usb/usb.yaml | 3 +++ 1 file changed, 3 insertions(+)Documentation/devicetree/bindings/usb/usb.yaml +0
-0
Documentation/devicetree/bindings/usb/usb.yaml properties: · line 62
Quoted 9 lines
Documentation/devicetree/bindings/usb/usb.yaml +3
-0@@ -54,6 +54,9 @@ properties: - high-speed - super-speed - super-speed-plus + - super-speed-plus-gen2x1 + - super-speed-plus-gen1x2 + - super-speed-plus-gen2x2 additionalProperties: true
Can I have your Reviewed-by again? Had to drop it previously because the change needed to be rebased and added to the yaml file instead.
Thanks,
Thinh
Re: [PATCH v7 1/6] dt-binding: usb: Include USB SSP rates in GenXxY
In reply to Thinh NguyenQuoted 33 lines · Thinh Nguyen
According to the USB 3.2 spec, a SuperSpeed Plus device can operate at gen2x2, gen2x1, or gen1x2. If the USB controller device supports multiple lanes at different transfer rates, the user can specify the HW capability via these new speed strings:
"super-speed-plus-gen2x2"
"super-speed-plus-gen2x1"
"super-speed-plus-gen1x2"If the argument is simply "super-speed-plus", USB controllers should default to their maximum transfer rate and number of lanes.
Signed-off-by Thinh Nguyen <[email protected]>---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Update the differentmaximum_speedenums to theusb.yaml
- Remove Reviewed-by: Rob Herring <[email protected]> because the commit is updated
- Rebase on Greg's usb-testing branch
- Update commit message
Changes in v5:
- Add Reviewed-by: Rob Herring <[email protected]>
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
Changes in v4:
- None
Changes in v3:
- Use "maximum-speed" to include both the num-lane and transfer rate for SSP
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties Changes in v2:
- Make "num-lanes" and "lane-speed-mantissa-gbps" common USB properties
Quoted 3 lines
Documentation/devicetree/bindings/usb/usb.yaml | 3 +++ 1 file changed, 3 insertions(+)
Thinh Nguyen
maintainerRe: [PATCH v7 1/6] dt-binding: usb: Include USB SSP rates in GenXxY
Quoted 34 lines · Rob Herring
Quoted 33 lines · Thinh Nguyen
According to the USB 3.2 spec, a SuperSpeed Plus device can operate at gen2x2, gen2x1, or gen1x2. If the USB controller device supports multiple lanes at different transfer rates, the user can specify the HW capability via these new speed strings:
"super-speed-plus-gen2x2"
"super-speed-plus-gen2x1"
"super-speed-plus-gen1x2"If the argument is simply "super-speed-plus", USB controllers should default to their maximum transfer rate and number of lanes.
Signed-off-by Thinh Nguyen <[email protected]>---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Update the differentmaximum_speedenums to theusb.yaml
- Remove Reviewed-by: Rob Herring <[email protected]> because the commit is updated
- Rebase on Greg's usb-testing branch
- Update commit message
Changes in v5:
- Add Reviewed-by: Rob Herring <[email protected]>
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
Changes in v4:
- None
Changes in v3:
- Use "maximum-speed" to include both the num-lane and transfer rate for SSP
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties Changes in v2:
- Make "num-lanes" and "lane-speed-mantissa-gbps" common USB properties
Quoted 4 lines
Quoted 3 lines
Documentation/devicetree/bindings/usb/usb.yaml | 3 +++ 1 file changed, 3 insertions(+)Reviewed-by Rob Herring <[email protected]>
Thanks!
Thinh
Thinh Nguyen
maintainerPATCH v7 2/6 usb: common: Parse for USB SSP genXxY
In reply to Thinh NguyenThe USB "maximum-speed" property can now take the SSP signaling rate generation and lane count with these new strings:
"super-speed-plus-gen2x2"
"super-speed-plus-gen2x1"
"super-speed-plus-gen1x2"
Introduce usb_get_maximum_ssp_rate() to parse for the corresponding usb_ssp_rate enum. The original usb_get_maximum_speed() will return USB_SPEED_SUPER_PLUS if it matches one of these new strings.
---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Rebase on Greg's usb-testing branch
- Remove usb_get_ssp_num_lanes() and usb_get_ssp_phy_gen() and use usb_get_ssp_rate() to return the corresponding usb_ssp_rate enum instead
- Update commit message
Changes in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
Changes in v4:
- Create 2 functions to get the SSP gen and number of lanes from "maximum-speed" property
- Update usb_get_maximum_speed() to check new SSP strings with genXxY
- Update commit message and subject title to reflect the new changes Changes in v3:
- Add new function to parse "maximum-speed" for lanes and transfer rate
- Remove separate functions getting num_lanes and transfer rate properties Changes in v2:
- New commit
drivers/usb/common/common.c | 26 +++++++++++++++++++++++++- include/linux/usb/ch9.h | 11 +++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-)
drivers/usb/common/common.c +25 -1
@@ -69,6 +69,13 @@ static const char *const speed_names[] = { [USB_SPEED_SUPER_PLUS] = "super-speed-plus", }; +static const char *const ssp_rate[] = { + [USB_SSP_GEN_UNKNOWN ] ="UNKNOWN" , + [USB_SSP_GEN_2x1] ="super-speed-plus-gen2x1" , + [USB_SSP_GEN_1x2] ="super-speed-plus-gen1x2" , + [USB_SSP_GEN_2x2] ="super-speed-plus-gen2x2" , +}; +const char *usb_speed_string (enum usb_device_speed speed) {if (speed <0 || speed >=ARRAY_SIZE (speed_names))
@@ -86,12 +93,29 @@ enum usb_device_speed usb_get_maximum_speed(struct device *dev)if (ret <0 )return USB_SPEED_UNKNOWN ; - ret =match_string (speed_names,ARRAY_SIZE (speed_names), maximum_speed); + ret =match_string (ssp_rate,ARRAY_SIZE (ssp_rate), maximum_speed); +if (ret >0 ) +return USB_SPEED_SUPER_PLUS ; + ret =match_string (speed_names,ARRAY_SIZE (speed_names), maximum_speed);return (ret <0 ) ?USB_SPEED_UNKNOWN : ret; }EXPORT_SYMBOL_GPL (usb_get_maximum_speed); +enum usb_ssp_rate usb_get_maximum_ssp_rate (struct device *dev) +{ +const char *maximum_speed; +int ret; + + ret =device_property_read_string (dev,"maximum-speed" , &maximum_speed); +if (ret <0 ) +return USB_SSP_GEN_UNKNOWN ; + + ret =match_string (ssp_rate,ARRAY_SIZE (ssp_rate), maximum_speed); +return (ret <0 ) ?USB_SSP_GEN_UNKNOWN : ret; +} +EXPORT_SYMBOL_GPL (usb_get_maximum_ssp_rate); +const char *usb_state_string (enum usb_device_state state) {static const char *const names[] = {
include/linux/usb/ch9.h +11 -0
@@ -71,6 +71,17 @@ extern const char *usb_speed_string(enum usb_device_speed speed);*/ extern enum usb_device_speed usb_get_maximum_speed (struct device *dev); +/** +* usb_get_maximum_ssp_rate - Get the signaling rate generation and lane count +* of a SuperSpeed Plus capable device. +* @dev: Pointer to the given USB controller device +* +* If the string from "maximum-speed" property is super-speed-plus-genXxY where +* 'X' is the generation number and 'Y' is the number of lanes, then this +* function returns the corresponding enum usb_ssp_rate. +*/ +extern enum usb_ssp_rate usb_get_maximum_ssp_rate (struct device *dev); +/** * usb_state_string - Returns human readable name for the state. * @state: The state to return a human-readable name for. If it's not
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v7 3/6 usb: dwc3: core: Check maximum_speed SSP genXxY
In reply to Thinh NguyenThe DWC_usb32 controller supports dual-lane SuperSpeed Plus. Check the maximum_speed property for any limitation in the HW to initialize and validate the maximum number of lanes and speed the device will operate.
Currently the controller has no visibility into the HW parameter to determine the maximum number of lanes the HW supports. If the number of lanes is not specified for SSP, then set the default rate to gen2x2 for DWC_usb32 and gen2x1 for DWC_usb31.
---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Rebase on Greg's usb-testing branch
- Update to check for lane count and gen# via usb_ssp_rate enum
- Update commit message
Changes in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header Changes in v4:
- Use new common funtions to get SSP Gen and number of lanes Changes in v3:
- Use new common function to get maximum-speed
- Remove num_lanes and lsm validation since they are no longer separate properties
- Replace dwc->maxmum_lsm field with dwc->maximum_ssp_rate for gen1/gen2 Changes in v2:
- Use common functions to get num_lanes and lsm properties
drivers/usb/dwc3/core.c | 37 +++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/core.h | 2 ++ drivers/usb/dwc3/gadget.c | 1 + 3 files changed, 40 insertions(+)
drivers/usb/dwc3/core.c +37 -0
@@ -1252,6 +1252,7 @@ static void dwc3_get_properties(struct dwc3 *dwc) hird_threshold =12 ; dwc->maximum_speed =usb_get_maximum_speed (dev); + dwc->max_ssp_rate =usb_get_maximum_ssp_rate (dev); dwc->dr_mode =usb_get_dr_mode (dev); dwc->hsphy_mode =of_usb_get_phy_mode (dev->of_node);
@@ -1423,6 +1424,42 @@ static void dwc3_check_params(struct dwc3 *dwc) }break ; } + +/* +* Currently the controller does not have visibility into the HW +* parameter to determine the maximum number of lanes the HW supports. +* If the number of lanes is not specified in the device property, then +* set the default to support dual-lane for DWC_usb32 and single-lane +* for DWC_usb31 for super-speed-plus. +*/ +if (dwc->maximum_speed ==USB_SPEED_SUPER_PLUS ) { +switch (dwc->max_ssp_rate) { +case USB_SSP_GEN_2x1: +if (hwparam_gen ==DWC3_GHWPARAMS3_SSPHY_IFC_GEN1 ) +dev_warn (dev,"UDC only supports Gen 1\n" ); +break ; +case USB_SSP_GEN_1x2: +case USB_SSP_GEN_2x2: +if (DWC3_IP_IS (DWC31 )) +dev_warn (dev,"UDC only supports single lane\n" ); +break ; +case USB_SSP_GEN_UNKNOWN : +default : +switch (hwparam_gen) { +case DWC3_GHWPARAMS3_SSPHY_IFC_GEN2 : +if (DWC3_IP_IS (DWC32 )) + dwc->max_ssp_rate = USB_SSP_GEN_2x2; +else + dwc->max_ssp_rate = USB_SSP_GEN_2x1; +break ; +case DWC3_GHWPARAMS3_SSPHY_IFC_GEN1 : +if (DWC3_IP_IS (DWC32 )) + dwc->max_ssp_rate = USB_SSP_GEN_1x2; +break ; + } +break ; + } + } }static int dwc3_probe (struct platform_device *pdev)
drivers/usb/dwc3/core.h +2 -0
@@ -964,6 +964,7 @@ struct dwc3_scratchpad_array {* @nr_scratch: number of scratch buffers * @u1u2: only used on revisions <1.83a for workaround * @maximum_speed: maximum speed requested (mainly for testing purposes) +* @max_ssp_rate: SuperSpeed Plus maximum signaling rate and lane count * @gadget_max_speed: maximum gadget speed requested * @ip: controller's ID * @revision: controller's version of an IP
@@ -1128,6 +1129,7 @@ struct dwc3 {u32 u1u2;u32 maximum_speed;u32 gadget_max_speed; +enum usb_ssp_rate max_ssp_rate;u32 ip;
drivers/usb/dwc3/gadget.c +1 -0
@@ -3888,6 +3888,7 @@ int dwc3_gadget_init(struct dwc3 *dwc) dwc->revision); dwc->gadget->max_speed = dwc->maximum_speed; + dwc->gadget->max_ssp_rate = dwc->max_ssp_rate;/* * REVISIT: Here we should clear all pending IRQs to be
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v7 4/6 usb: dwc3: gadget: Implement setting of SSP rate
In reply to Thinh NguyenImplement gadget ops udc_set_ssp_rate(). This allows the gadget/core driver to select SSP signaling rate and number of lanes to for DWC_usb32 controller.
---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Update to use usb_ssp_rate enum
- Rebase on Greg's usb-testing branch
- Update to match with the latest flow in dwc3 for setting speed Changes in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header Changes in v4:
- None
Changes in v3:
- None
Changes in v2:
- None
drivers/usb/dwc3/core.h | 5 +++++ drivers/usb/dwc3/gadget.c | 47 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-)
drivers/usb/dwc3/core.h +5 -0
@@ -386,6 +386,8 @@#define DWC3_GUCTL3_SPLITDISABLE BIT(14)/* Device Configuration Register */ +#define DWC3_DCFG_NUMLANES (n) (((n) & 0x3) << 30)/* DWC_usb32 only */ +#define DWC3_DCFG_DEVADDR (addr) ((addr) << 3)#define DWC3_DCFG_DEVADDR_MASK DWC3_DCFG_DEVADDR(0x7f)
@@ -966,6 +968,8 @@ struct dwc3_scratchpad_array {* @maximum_speed: maximum speed requested (mainly for testing purposes) * @max_ssp_rate: SuperSpeed Plus maximum signaling rate and lane count * @gadget_max_speed: maximum gadget speed requested +* @gadget_ssp_rate: Gadget driver's maximum supported SuperSpeed Plus signaling +* rate and lane count. * @ip: controller's ID * @revision: controller's version of an IP * @version_type: VERSIONTYPE register contents, a sub release of a revision
@@ -1130,6 +1134,7 @@ struct dwc3 {u32 maximum_speed;u32 gadget_max_speed;enum usb_ssp_rate max_ssp_rate; +enum usb_ssp_rate gadget_ssp_rate;u32 ip;
drivers/usb/dwc3/gadget.c +46 -1
75 lines not on this page · raw message
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v7 5/6 usb: dwc3: gadget: Track connected SSP rate and lane count
In reply to Thinh NguyenTrack the number of connected lanes and speed in corresponding enum usb_ssp_rate for SuperSpeed Plus capable device.
---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Rebase on Greg's usb-testing branch
- Update commmit message
- Update to report the rate and lane count in usb_ssp_rate enum Changes in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header Changes in v4:
- None
Changes in v3:
- Update commit with updated field name
- No longer use DWC3_LSM_5/10_GBPS macros
Changes in v2:
- Fix missing check for gen1x2 when writing to sublink speed attributes
- Minor fix in commit message (first commit sentence ended with comma)
drivers/usb/dwc3/core.h | 2 ++ drivers/usb/dwc3/gadget.c | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+)
drivers/usb/dwc3/core.h +2 -0
@@ -461,6 +461,8 @@#define DWC3_DEVTEN_USBRSTEN BIT(1)#define DWC3_DEVTEN_DISCONNEVTEN BIT(0) +#define DWC3_DSTS_CONNLANES (n) (((n) >> 30) & 0x3)/* DWC_usb32 only */ +/* Device Status Register */ #define DWC3_DSTS_DCNRD BIT(29)
drivers/usb/dwc3/gadget.c +23 -0
@@ -2120,6 +2120,12 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc) reg |=DWC3_DCFG_SUPERSPEED_PLUS ; } } + +if (DWC3_IP_IS (DWC32 ) && + dwc->gadget_max_speed >USB_SPEED_UNKNOWN && + dwc->gadget_max_speed <USB_SPEED_SUPER_PLUS ) + reg &= ~DWC3_DCFG_NUMLANES (~0 ); +dwc3_writel (dwc->regs,DWC3_DCFG , reg); }
@@ -3369,12 +3375,18 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)struct dwc3_ep *dep;int ret;u32 reg; +u8 lanes =1 ;u8 speed; reg =dwc3_readl (dwc->regs,DWC3_DSTS ); speed = reg &DWC3_DSTS_CONNECTSPD ; dwc->speed = speed; +if (DWC3_IP_IS (DWC32 )) + lanes =DWC3_DSTS_CONNLANES (reg) +1 ; + + dwc->gadget->ssp_rate =USB_SSP_GEN_UNKNOWN ; +/* * RAMClkSel is reset to 0 after USB reset, so it must be reprogrammed * each time on Connect Done.
@@ -3389,6 +3401,11 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) dwc3_gadget_ep0_desc.wMaxPacketSize =cpu_to_le16 (512 ); dwc->gadget->ep0->maxpacket =512 ; dwc->gadget->speed =USB_SPEED_SUPER_PLUS ; + +if (lanes >1 ) + dwc->gadget->ssp_rate = USB_SSP_GEN_2x2; +else + dwc->gadget->ssp_rate = USB_SSP_GEN_2x1;break ;case DWC3_DSTS_SUPERSPEED :/*
@@ -3410,6 +3427,11 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) dwc3_gadget_ep0_desc.wMaxPacketSize =cpu_to_le16 (512 ); dwc->gadget->ep0->maxpacket =512 ; dwc->gadget->speed =USB_SPEED_SUPER ; + +if (lanes >1 ) { + dwc->gadget->speed =USB_SPEED_SUPER_PLUS ; + dwc->gadget->ssp_rate = USB_SSP_GEN_1x2; + }break ;case DWC3_DSTS_HIGHSPEED : dwc3_gadget_ep0_desc.wMaxPacketSize =cpu_to_le16 (64 );
@@ -3904,6 +3926,7 @@ int dwc3_gadget_init(struct dwc3 *dwc) dev->platform_data = dwc; dwc->gadget->ops = &dwc3_gadget_ops; dwc->gadget->speed =USB_SPEED_UNKNOWN ; + dwc->gadget->ssp_rate =USB_SSP_GEN_UNKNOWN ; dwc->gadget->sg_supported = true; dwc->gadget->name ="dwc3-gadget" ; dwc->gadget->lpm_capable = true;
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v7 6/6 usb: dwc3: gadget: Set speed only up to the max supported
In reply to Thinh NguyenThe setting of the device speed should be limited by the device's maximum_speed. Check and prevent the driver from attempting to configure higher than the maximum_speed.
---
Changes in v7:
- Rebase on Greg's usb-testing branch
Changes in v6:
- Rebase on Greg's usb-testing branch
- Update to follow the latest change of dwc3 on Greg's usb-testing branch
- Update commit message
Changes in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header Changes in v4:
- None
Changes in v3:
- None
Changes in v2:
- None
drivers/usb/dwc3/gadget.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/usb/dwc3/gadget.c +10 -5
@@ -2064,9 +2064,14 @@ static void __dwc3_gadget_set_ssp_rate(struct dwc3 *dwc)static void __dwc3_gadget_set_speed (struct dwc3 *dwc) { +enum usb_device_speed speed;u32 reg; -if (dwc->gadget_max_speed ==USB_SPEED_SUPER_PLUS && + speed = dwc->gadget_max_speed; +if (speed > dwc->maximum_speed) + speed = dwc->maximum_speed; + +if (speed ==USB_SPEED_SUPER_PLUS &&DWC3_IP_IS (DWC32 )) {__dwc3_gadget_set_ssp_rate (dwc);return ;
@@ -2092,7 +2097,7 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc) !dwc->dis_metastability_quirk) { reg |= DWC3_DCFG_SUPERSPEED; } else { -switch (dwc->gadget_max_speed) { +switch (speed) {case USB_SPEED_LOW : reg |=DWC3_DCFG_LOWSPEED ;break ;
@@ -2112,7 +2117,7 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc) reg |=DWC3_DCFG_SUPERSPEED_PLUS ;break ;default : -dev_err (dwc->dev,"invalid speed (%d)\n" , dwc->gadget_max_speed); +dev_err (dwc->dev,"invalid speed (%d)\n" , speed);if (DWC3_IP_IS (DWC3 )) reg |=DWC3_DCFG_SUPERSPEED ;
@@ -2122,8 +2127,8 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc) }if (DWC3_IP_IS (DWC32 ) && - dwc->gadget_max_speed >USB_SPEED_UNKNOWN && - dwc->gadget_max_speed <USB_SPEED_SUPER_PLUS ) + speed >USB_SPEED_UNKNOWN && + speed <USB_SPEED_SUPER_PLUS ) reg &= ~DWC3_DCFG_NUMLANES (~0 );dwc3_writel (dwc->regs,DWC3_DCFG , reg);
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerHi Felipe, Greg,
Quoted 73 lines · Thinh Nguyen
A USB SuperSpeed Plus device may operate at different speed and lane count (i.e. gen2x2, gen1x2, or gen2x1). The
DWC_usb32IP supports SuperSpeed Plus gen2x2. To support this, this series update a few things to the USB gadget stack and dwc3 driver:* Accept and parse new
maximum_speeddevicetree property strings
* Introduce enumusb_ssp_rateto describe the speed in SuperSpeed Plus genXxY
* Capture the connected and max supportedusb_ssp_rate
* Report the device sublink speeds base on theusb_ssp_ratein the BOS descriptor
* Introduce gadget ops to select SuperSpeed Plus various transfer rate and lane count
* Update dwc3 driver to support the above changesChanges in v7:
- Greg picked up the first few patches of the series to his usb-testing branch. Rebase the remaining patches on Greg's usb-testing branchChanges in v6:
- Rebase on Greg's usb-testing branch
- Update cover letter and title since there are many updates
* Previous version 5: https://lore.kernel.org/linux-usb/[email protected]/
- To simplify things, useusb_ssp_rateenum to specify the signaling rate
generation and lane count instead of separately tracking them.
- Convert the sublink speed attributes to macros and move it to uapi
- Removeusb_sublink_speedstruct
- Remove "usb: dwc3: gadget: Report sublink speed capability"
- Update dwc3 to support the new changesChanges in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
- Add Rob's Reviewed-byChanges in v4:
- Instead of using a single function to parse "maximum-speed" property for speed, gen X, and number of lanes, split those tasks to separate common functions
- Revise DWC3 driver to use those new common functions
- Fix checkpatch warnings for using "unsigned" rather than "unsigned int" and missing identifier name inudc_set_num_lanes_and_speedgadget opsChanges in v3:
- Remove "num-lanes" and "lane-speed-mantissa-gbps" common properties
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties validation in dwc3
- Update "maximum-speed" to support variations of SSP Gen X x Y
- Update common function to parse new strings for "maximum-speed"
- Update commit messages for the new changesChanges in v2:
- Moveusb_sublink_speedattribute struct and enum toinclude/linux/usb/ch9.h
- Use "num-lanes" and "lane-speed-mantissa-gbps" as common properties instead
- Add common functions to get num-lanes and lsm properties
- Fix missing gen1x2 sublink speed attribute check report in dwc3Thinh Nguyen (6):
dt-binding: usb: Include USB SSP rates in GenXxY
usb: common: Parse for USB SSP genXxY
usb: dwc3: core: Checkmaximum_speedSSP genXxY
usb: dwc3: gadget: Implement setting of SSP rate
usb: dwc3: gadget: Track connected SSP rate and lane count
usb: dwc3: gadget: Set speed only up to the max supported.../devicetree/bindings/usb/usb.yaml | 3 + drivers/usb/common/common.c | 26 +++++- drivers/usb/dwc3/core.c | 37 +++++++++ drivers/usb/dwc3/core.h | 9 +++ drivers/usb/dwc3/gadget.c | 80 ++++++++++++++++++- include/linux/usb/ch9.h | 11 +++ 6 files changed, 162 insertions(+), 4 deletions(-)
Quoted 1 line
base-commit:
7a79f1f7f7e75e532c5a803ab3ebf42a3e79497c
Let me know if there's any issue with these remaining patches. It'd be great if they can go on the "next" branch at some point.
Thanks,
Thinh
Greg Kroah-Hartman
maintainerQuoted 76 lines · Thinh Nguyen
Hi Felipe, Greg,
Quoted 73 lines · Thinh Nguyen
A USB SuperSpeed Plus device may operate at different speed and lane count (i.e. gen2x2, gen1x2, or gen2x1). The
DWC_usb32IP supports SuperSpeed Plus gen2x2. To support this, this series update a few things to the USB gadget stack and dwc3 driver:* Accept and parse new
maximum_speeddevicetree property strings
* Introduce enumusb_ssp_rateto describe the speed in SuperSpeed Plus genXxY
* Capture the connected and max supportedusb_ssp_rate
* Report the device sublink speeds base on theusb_ssp_ratein the BOS descriptor
* Introduce gadget ops to select SuperSpeed Plus various transfer rate and lane count
* Update dwc3 driver to support the above changesChanges in v7:
- Greg picked up the first few patches of the series to his usb-testing branch. Rebase the remaining patches on Greg's usb-testing branchChanges in v6:
- Rebase on Greg's usb-testing branch
- Update cover letter and title since there are many updates
* Previous version 5: https://lore.kernel.org/linux-usb/[email protected]/
- To simplify things, useusb_ssp_rateenum to specify the signaling rate
generation and lane count instead of separately tracking them.
- Convert the sublink speed attributes to macros and move it to uapi
- Removeusb_sublink_speedstruct
- Remove "usb: dwc3: gadget: Report sublink speed capability"
- Update dwc3 to support the new changesChanges in v5:
- Rebase on Felipe's testing/next branch
- Changed Signed-off-by email to match From: email header
- Add Rob's Reviewed-byChanges in v4:
- Instead of using a single function to parse "maximum-speed" property for speed, gen X, and number of lanes, split those tasks to separate common functions
- Revise DWC3 driver to use those new common functions
- Fix checkpatch warnings for using "unsigned" rather than "unsigned int" and missing identifier name inudc_set_num_lanes_and_speedgadget opsChanges in v3:
- Remove "num-lanes" and "lane-speed-mantissa-gbps" common properties
- Remove "num-lanes" and "lane-speed-mantissa-gbps" properties validation in dwc3
- Update "maximum-speed" to support variations of SSP Gen X x Y
- Update common function to parse new strings for "maximum-speed"
- Update commit messages for the new changesChanges in v2:
- Moveusb_sublink_speedattribute struct and enum toinclude/linux/usb/ch9.h
- Use "num-lanes" and "lane-speed-mantissa-gbps" as common properties instead
- Add common functions to get num-lanes and lsm properties
- Fix missing gen1x2 sublink speed attribute check report in dwc3Thinh Nguyen (6):
dt-binding: usb: Include USB SSP rates in GenXxY
usb: common: Parse for USB SSP genXxY
usb: dwc3: core: Checkmaximum_speedSSP genXxY
usb: dwc3: gadget: Implement setting of SSP rate
usb: dwc3: gadget: Track connected SSP rate and lane count
usb: dwc3: gadget: Set speed only up to the max supported.../devicetree/bindings/usb/usb.yaml | 3 + drivers/usb/common/common.c | 26 +++++- drivers/usb/dwc3/core.c | 37 +++++++++ drivers/usb/dwc3/core.h | 9 +++ drivers/usb/dwc3/gadget.c | 80 ++++++++++++++++++- include/linux/usb/ch9.h | 11 +++ 6 files changed, 162 insertions(+), 4 deletions(-)
Quoted 4 lines
Quoted 1 line
base-commit:
7a79f1f7f7e75e532c5a803ab3ebf42a3e79497cLet me know if there's any issue with these remaining patches. It'd be great if they can go on the "next" branch at some point.
I was waiting for Rob's review of the dt changes...