From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Felipe Balbi <balbi@kernel.org>,
Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>
Cc: John Youn <John.Youn@synopsys.com>
Subject: Re: [RFC PATCH 07/14] usb: dwc3: gadget: Set lane count and lsm
Date: Thu, 12 Dec 2019 22:15:39 +0000 [thread overview]
Message-ID: <0132b864-6b9a-5258-8c0f-b007f4138035@synopsys.com> (raw)
In-Reply-To: <87sglqvu2m.fsf@kernel.org>
Hi,
Felipe Balbi wrote:
> Thinh Nguyen <Thinh.Nguyen@synopsys.com> writes:
>
>> DWC_usb32 supports dual-lane at different transfer rate. This patch
>> initializes the controller to use the maximum support transfer rate
>> describes by the dwc3 device property of lane count and lane speed
>> mantissa in Gbps.
> Perhaps this should read as:
>
> "DWC_usb32 supports dual-lane at different transfer rate. This
> patch initializes the controller to use the maximum supported
> transfer rate described by the dwc3 device property of lane
> count and lane speed mantissa in Gbps."
Ok.
>> @@ -1424,6 +1428,38 @@ static void dwc3_check_params(struct dwc3 *dwc)
>>
>> break;
>> }
>> +
>> + switch (dwc->maximum_lsm) {
>> + case 5:
>> + break;
>> + case 10:
>> + if (dwc->maximum_speed == USB_SPEED_SUPER)
>> + dev_err(dev, "invalid maximum_lsm parameter %d\n",
>> + dwc->maximum_lsm);
>> + /* Fall Through */
>> + default:
>> + if (dwc->maximum_speed == USB_SPEED_SUPER)
>> + dwc->maximum_lsm = 5;
>> + else if (dwc->maximum_speed > USB_SPEED_SUPER)
>> + dwc->maximum_lsm = 10;
>> + break;
>> + }
>> +
>> + switch (dwc->maximum_lanes) {
>> + case 1:
>> + case 2:
>> + break;
>> + default:
>> + if (dwc->maximum_lanes > 2)
>> + dev_err(dev, "invalid number of lanes %d\n",
>> + dwc->maximum_lanes);
>> +
>> + if (dwc3_is_usb32(dwc) &&
>> + dwc->maximum_speed == USB_SPEED_SUPER_PLUS)
>> + dwc->maximum_lanes = 2;
>> + else
>> + dwc->maximum_lanes = 1;
>> + }
>> }
>>
>> static int dwc3_probe(struct platform_device *pdev)
>> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
>> index 7fde3c7da543..8e729d4cd5bd 100644
>> --- a/drivers/usb/dwc3/core.h
>> +++ b/drivers/usb/dwc3/core.h
>> @@ -376,6 +376,8 @@
>> #define DWC3_GUCTL2_RST_ACTBITLATER 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)
>>
>> @@ -449,6 +451,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)
>>
>> @@ -946,6 +950,8 @@ 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)
>> + * @maximum_lsm: maximum lane speed mantissa in Gbps
>> + * @maximum_lanes: maximum lane count
>> * @ip: controller's ID
>> * @revision: controller's version of an IP
>> * @version_type: VERSIONTYPE register contents, a sub release of a revision
>> @@ -973,6 +979,7 @@ struct dwc3_scratchpad_array {
>> * @ep0state: state of endpoint zero
>> * @link_state: link state
>> * @speed: device speed (super, high, full, low)
>> + * @lane_count: number of connected lanes
>> * @hwparams: copy of hwparams registers
>> * @root: debugfs root folder pointer
>> * @regset: debugfs pointer to regdump file
>> @@ -1100,6 +1107,8 @@ struct dwc3 {
>> u32 nr_scratch;
>> u32 u1u2;
>> u32 maximum_speed;
>> + u8 maximum_lsm;
>> + u8 maximum_lanes;
>>
>> u32 ip;
>>
>> @@ -1159,6 +1168,7 @@ struct dwc3 {
>> u8 u1pel;
>>
>> u8 speed;
>> + u8 lane_count;
>>
>> u8 num_eps;
>>
>> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
>> index a6d562e208a9..c31144af3261 100644
>> --- a/drivers/usb/dwc3/gadget.c
>> +++ b/drivers/usb/dwc3/gadget.c
>> @@ -2183,6 +2183,53 @@ static void dwc3_gadget_set_speed(struct usb_gadget *g,
>> spin_unlock_irqrestore(&dwc->lock, flags);
>> }
>>
>> +static void dwc3_gadget_set_sublink_attr(struct usb_gadget *g,
>> + unsigned int lane_count,
>> + unsigned int lsm)
>> +{
>> + struct dwc3 *dwc = gadget_to_dwc(g);
>> + unsigned int lanes;
>> + unsigned long flags;
>> + u32 reg;
>> +
>> + spin_lock_irqsave(&dwc->lock, flags);
>> + if (dwc->maximum_speed <= USB_SPEED_SUPER) {
>> + /* Fall back to maximum speed supported by HW */
>> + spin_unlock_irqrestore(&dwc->lock, flags);
>> + dwc3_gadget_set_speed(g, dwc->maximum_speed);
>> + spin_lock_irqsave(&dwc->lock, flags);
> it looks like we should extract a __dwc3_gadget_set_speed() to avoid the
> possible race here:
>
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index a9aba716bf80..e317b696029e 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -2118,14 +2118,11 @@ static void dwc3_gadget_config_params(struct usb_gadget *g,
> cpu_to_le16(DWC3_DEFAULT_U2_DEV_EXIT_LAT);
> }
>
> -static void dwc3_gadget_set_speed(struct usb_gadget *g,
> +static void __dwc3_gadget_set_speed(struct dwc3 *dwc,
> enum usb_device_speed speed)
> {
> - struct dwc3 *dwc = gadget_to_dwc(g);
> - unsigned long flags;
> u32 reg;
>
> - spin_lock_irqsave(&dwc->lock, flags);
> reg = dwc3_readl(dwc->regs, DWC3_DCFG);
> reg &= ~(DWC3_DCFG_SPEED_MASK);
>
> @@ -2175,7 +2172,16 @@ static void dwc3_gadget_set_speed(struct usb_gadget *g,
> }
> }
> dwc3_writel(dwc->regs, DWC3_DCFG, reg);
> +}
> +
> +static void dwc3_gadget_set_speed(struct usb_gadget *g,
> + enum usb_device_speed speed)
> +{
> + struct dwc3 *dwc = gadget_to_dwc(g);
> + unsigned long flags;
>
> + spin_lock_irqsave(&dwc->lock, flags);
> + __dwc3_gadget_set_speed(dwc, speed);
> spin_unlock_irqrestore(&dwc->lock, flags);
> }
>
> Then your patch would look like:
>
> static void dwc3_gadget_set_sublink_attr(struct usb_gadget *g,
> unsigned int lane_count,
> unsigned int lsm)
> {
> struct dwc3 *dwc = gadget_to_dwc(g);
> unsigned int lanes;
> unsigned long flags;
> u32 reg;
>
> spin_lock_irqsave(&dwc->lock, flags);
> if (dwc->maximum_speed <= USB_SPEED_SUPER) {
> /* Fall back to maximum speed supported by HW */
> __dwc3_gadget_set_speed(dwc, dwc->maximum_speed);
> goto done;
> }
>
> [...]
> }
Ok. I'll revise this.
Thanks!
Thinh
next prev parent reply other threads:[~2019-12-12 22:15 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-12 2:48 [RFC PATCH 00/14] usb: dwc3: Introduce DWC_usb32 Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 01/14] usb: gadget: Add lane count and lsm Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 02/14] usb: gadget: Add callback to set lane and transfer rate Thinh Nguyen
2019-12-12 7:58 ` Felipe Balbi
2019-12-12 15:49 ` Alan Stern
2019-12-12 22:33 ` Thinh Nguyen
2019-12-12 22:10 ` Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 03/14] usb: composite: Properly report lsm Thinh Nguyen
2019-12-12 7:59 ` Felipe Balbi
2019-12-12 22:10 ` Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 04/14] usb: dwc3: Implement new id check for DWC_usb32 Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 05/14] usb: dwc3: Update IP checks to support DWC_usb32 Thinh Nguyen
2019-12-12 8:05 ` Felipe Balbi
2019-12-12 22:12 ` Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 06/14] usb: devicetree: dwc3: Add max lane and lsm Thinh Nguyen
2019-12-12 8:06 ` Felipe Balbi
2019-12-19 22:09 ` Rob Herring
2019-12-19 22:49 ` Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 07/14] usb: dwc3: gadget: Set lane count " Thinh Nguyen
2019-12-12 8:14 ` Felipe Balbi
2019-12-12 22:15 ` Thinh Nguyen [this message]
2019-12-12 2:49 ` [RFC PATCH 08/14] usb: dwc3: gadget: Track connected lane count and speed Thinh Nguyen
2019-12-12 2:49 ` [RFC PATCH 09/14] usb: dwc3: gadget: Limit the setting of speed Thinh Nguyen
2019-12-12 2:50 ` [RFC PATCH 10/14] usb: dwc3: Update HWPARAMS0.MDWIDTH for DWC_usb32 Thinh Nguyen
2019-12-12 2:50 ` [RFC PATCH 11/14] usb: devicetree: dwc3: Add TRB prefetch count Thinh Nguyen
2019-12-12 8:18 ` Felipe Balbi
2019-12-12 22:16 ` Thinh Nguyen
2019-12-12 2:50 ` [RFC PATCH 12/14] usb: dwc3: gadget: Set number of TRB prefetch Thinh Nguyen
2019-12-12 2:50 ` [RFC PATCH 13/14] usb: devicetree: dwc3: Add property to disable mult TRB fetch Thinh Nguyen
2019-12-12 8:19 ` Felipe Balbi
2019-12-12 22:28 ` Thinh Nguyen
2019-12-13 7:04 ` Felipe Balbi
2019-12-13 20:10 ` Thinh Nguyen
2019-12-19 22:17 ` Rob Herring
2019-12-19 22:51 ` Thinh Nguyen
2019-12-20 22:11 ` Rob Herring
2019-12-20 23:52 ` Thinh Nguyen
2019-12-12 2:50 ` [RFC PATCH 14/14] usb: dwc3: gadget: Implement disabling of " Thinh Nguyen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0132b864-6b9a-5258-8c0f-b007f4138035@synopsys.com \
--to=thinh.nguyen@synopsys.com \
--cc=John.Youn@synopsys.com \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).