From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Srikanth Chary Chennoju <srikanth.chary-chennoju@amd.com>
Cc: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
"m.grzeschik@pengutronix.de" <m.grzeschik@pengutronix.de>,
"Chris.Wulff@biamp.com" <Chris.Wulff@biamp.com>,
"tiwai@suse.de" <tiwai@suse.de>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"punnaiah.choudary.kalluri@amd.com"
<punnaiah.choudary.kalluri@amd.com>
Subject: Re: [PATCH v2 3/3] usb: gadget: f_sourcesink: Addition of SSP endpoint for ISOC transfers
Date: Fri, 29 Aug 2025 21:49:17 +0000 [thread overview]
Message-ID: <20250829214916.fqxyu2baer7apkl7@synopsys.com> (raw)
In-Reply-To: <20250828112944.2042343-4-srikanth.chary-chennoju@amd.com>
On Thu, Aug 28, 2025, Srikanth Chary Chennoju wrote:
> This patch is created to support super speed plus endpoint for Isoc
> transfers. Now super speed endpoint companion is accompanied by super
> speed plus endpoint companion. With this change we could see the Isoc IN
> and OUT performance reaching to ~749MB/sec which is 96K per uframe.
> The performance numbers are confirmed through Lecroy trace.
>
> Signed-off-by: Srikanth Chary Chennoju <srikanth.chary-chennoju@amd.com>
> ---
> drivers/usb/gadget/function/f_sourcesink.c | 23 ++++++++++++++++++++--
> include/uapi/linux/usb/ch9.h | 2 ++
> 2 files changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/f_sourcesink.c b/drivers/usb/gadget/function/f_sourcesink.c
> index a3a69166c343..79efb6295725 100644
> --- a/drivers/usb/gadget/function/f_sourcesink.c
> +++ b/drivers/usb/gadget/function/f_sourcesink.c
> @@ -232,6 +232,12 @@ static struct usb_ss_ep_comp_descriptor ss_iso_source_comp_desc = {
> .wBytesPerInterval = cpu_to_le16(1024),
> };
>
> +static struct usb_ssp_isoc_ep_comp_descriptor ssp_iso_source_comp_desc = {
> + .bLength = USB_DT_SSP_ISOC_EP_COMP_SIZE,
> + .bDescriptorType = USB_DT_SSP_ISOC_ENDPOINT_COMP,
> + .dwBytesPerInterval = cpu_to_le32(1024),
Why set the dwBytesPerInterval and wBytesPerInterval when they will be
overwritten on bind later?
> +};
> +
> static struct usb_endpoint_descriptor ss_iso_sink_desc = {
> .bLength = USB_DT_ENDPOINT_SIZE,
> .bDescriptorType = USB_DT_ENDPOINT,
> @@ -250,6 +256,12 @@ static struct usb_ss_ep_comp_descriptor ss_iso_sink_comp_desc = {
> .wBytesPerInterval = cpu_to_le16(1024),
> };
>
> +static struct usb_ssp_isoc_ep_comp_descriptor ssp_iso_sink_comp_desc = {
> + .bLength = USB_DT_SSP_ISOC_EP_COMP_SIZE,
> + .bDescriptorType = USB_DT_SSP_ISOC_ENDPOINT_COMP,
> + .dwBytesPerInterval = cpu_to_le32(1024),
> +};
> +
> static struct usb_descriptor_header *ss_source_sink_descs[] = {
> (struct usb_descriptor_header *) &source_sink_intf_alt0,
> (struct usb_descriptor_header *) &ss_source_desc,
> @@ -264,8 +276,10 @@ static struct usb_descriptor_header *ss_source_sink_descs[] = {
> (struct usb_descriptor_header *) &ss_sink_comp_desc,
> (struct usb_descriptor_header *) &ss_iso_source_desc,
> (struct usb_descriptor_header *) &ss_iso_source_comp_desc,
> + (struct usb_descriptor_header *) &ssp_iso_source_comp_desc,
> (struct usb_descriptor_header *) &ss_iso_sink_desc,
> (struct usb_descriptor_header *) &ss_iso_sink_comp_desc,
> + (struct usb_descriptor_header *) &ssp_iso_sink_comp_desc,
> NULL,
> };
>
> @@ -423,7 +437,7 @@ sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
> */
> ss_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket;
> ss_iso_source_desc.bInterval = ss->isoc_interval;
> - ss_iso_source_comp_desc.bmAttributes = ss->isoc_mult;
> + ss_iso_source_comp_desc.bmAttributes = USB_DT_SSP_ISOC_COMP | ss->isoc_mult;
> ss_iso_source_comp_desc.bMaxBurst = ss->isoc_maxburst;
> ss_iso_source_comp_desc.wBytesPerInterval = ss->isoc_maxpacket *
> (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1);
> @@ -432,12 +446,17 @@ sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
>
> ss_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket;
> ss_iso_sink_desc.bInterval = ss->isoc_interval;
> - ss_iso_sink_comp_desc.bmAttributes = ss->isoc_mult;
> + ss_iso_sink_comp_desc.bmAttributes = USB_DT_SSP_ISOC_COMP | ss->isoc_mult;
Don't automatically set USB_DT_SSP_ISOC_COMP if deviec is not connected
in SSP. probably need to create a separate set of descriptors for SSP.
> ss_iso_sink_comp_desc.bMaxBurst = ss->isoc_maxburst;
> ss_iso_sink_comp_desc.wBytesPerInterval = ss->isoc_maxpacket *
> (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1);
> ss_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress;
>
> + ssp_iso_source_comp_desc.dwBytesPerInterval = ss->isoc_maxpacket *
> + (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1) * USB_LANE_SPEED_MANTISSA_GEN2_BY_GEN1;
> + ssp_iso_sink_comp_desc.dwBytesPerInterval = ss->isoc_maxpacket *
> + (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1) * USB_LANE_SPEED_MANTISSA_GEN2_BY_GEN1;
> +
Missing cpu_to_le* endian conversions.
> ret = usb_assign_descriptors(f, fs_source_sink_descs,
> hs_source_sink_descs, ss_source_sink_descs,
> ss_source_sink_descs);
> diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h
> index 8003243a4937..22782c5cb2f3 100644
> --- a/include/uapi/linux/usb/ch9.h
> +++ b/include/uapi/linux/usb/ch9.h
> @@ -702,6 +702,8 @@ struct usb_ssp_isoc_ep_comp_descriptor {
> } __attribute__ ((packed));
>
> #define USB_DT_SSP_ISOC_EP_COMP_SIZE 8
> +#define USB_DT_SSP_ISOC_COMP (1 << 7) /*support for SSP ISOC EP COMP*/
Put this under bmAttributes
> +#define USB_LANE_SPEED_MANTISSA_GEN2_BY_GEN1 2
There's no GEN2_BY_GEN1. There's Gen2x1. Also lane speed mantissa is not
2 for Gen2x1. What you probably wanted to put is probably gen value
multiply by lane count?
BR,
Thinh
>
> /*-------------------------------------------------------------------------*/
>
> --
> 2.25.1
>
BR,
Thinh
prev parent reply other threads:[~2025-08-29 21:49 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-28 11:29 [PATCH v2 0/3] Add support for Superspeed plus EndPoint for Bulk and Isochronous transfers Srikanth Chary Chennoju
2025-08-28 11:29 ` [PATCH v2 1/3] usb:gadget:zero: support for super speed plus Srikanth Chary Chennoju
2025-09-06 12:22 ` Greg KH
2025-08-28 11:29 ` [PATCH v2 2/3] usb: gadget: f_sourcesink support for maxburst for bulk Srikanth Chary Chennoju
2025-08-28 11:29 ` [PATCH v2 3/3] usb: gadget: f_sourcesink: Addition of SSP endpoint for ISOC transfers Srikanth Chary Chennoju
2025-08-29 21:49 ` Thinh Nguyen [this message]
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=20250829214916.fqxyu2baer7apkl7@synopsys.com \
--to=thinh.nguyen@synopsys.com \
--cc=Chris.Wulff@biamp.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=m.grzeschik@pengutronix.de \
--cc=punnaiah.choudary.kalluri@amd.com \
--cc=srikanth.chary-chennoju@amd.com \
--cc=tiwai@suse.de \
/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