Skip to contentSkip to conversation

usb: gadget: add SuperSpeed descriptor support

PATCH Superseded Thinh Nguyen 2 participants 5 messages Jul 9 – Jul 10 USB

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

cover usb: gadget: add SuperSpeed descriptor support

This series adds SuperSpeed descriptor support for the mass_storage and DFU gadget functions so they can operate correctly at SuperSpeed.

Dan Tran (2):
usb: gadget: mass_storage: add SuperSpeed descriptor support
usb: gadget: dfu: add SuperSpeed descriptor support

 drivers/usb/gadget/f_dfu.c          |  6 ++++
 drivers/usb/gadget/f_mass_storage.c | 25 ++++++++++++--
 drivers/usb/gadget/storage_common.c | 52 ++++++++++++++++++++++++++++-
 3 files changed, 80 insertions(+), 3 deletions(-)

base-commit: 913fedc816570c07bfc7f9c4046dc2a3a55e4099

Signature · 1 line
2.53.0
#1 lore raw

PATCH 1/2 usb: gadget: mass_storage: add SuperSpeed descriptor support

From: Dan Tran <[email protected]>

Add SS bulk endpoint descriptors (1024-byte MPS, bMaxBurst=15) to storage_common.c to support SuperSpeed connections. Extend fsg_ep_desc() to select them when operating at SuperSpeed, and wire up ss_descriptors in fsg_bind(). Free ss_descriptors in fsg_unbind() to match.

---
 drivers/usb/gadget/f_mass_storage.c | 25 ++++++++++++--
 drivers/usb/gadget/storage_common.c | 52 ++++++++++++++++++++++++++++-
 2 files changed, 74 insertions(+), 3 deletions(-)
drivers/usb/gadget/f_mass_storage.c +23 -2
index 87ed25e8bb3a..a2f34c100482 100644
@@ -2225,14 +2225,16 @@ reset:
 
 	/* Enable the endpoints */
 	d = fsg_ep_desc(common->gadget,
-			&fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc);
+			&fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc,
+			&fsg_ss_bulk_in_desc);
 	rc = enable_endpoint(common, fsg->bulk_in, d);
 	if (rc)
 		goto reset;
 	fsg->bulk_in_enabled = 1;
 
 	d = fsg_ep_desc(common->gadget,
-			&fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc);
+			&fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc,
+			&fsg_ss_bulk_out_desc);
 	rc = enable_endpoint(common, fsg->bulk_out, d);
 	if (rc)
 		goto reset;
@@ -2653,6 +2655,7 @@ static void fsg_unbind(struct usb_configuration *c, struct usb_function *f)
 	fsg_common_release(fsg->common);
 	free(fsg->function.descriptors);
 	free(fsg->function.hs_descriptors);
+	free(fsg->function.ss_descriptors);
 	kfree(fsg);
 }
 
@@ -2701,6 +2704,24 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f)
 			return -ENOMEM;
 		}
 	}
+
+	if (gadget_is_superspeed(gadget)) {
+		unsigned int max_burst = min_t(unsigned int, FSG_BUFLEN / 1024, 15);
+
+		fsg_ss_bulk_in_desc.bEndpointAddress =
+			fsg_fs_bulk_in_desc.bEndpointAddress;
+		fsg_ss_bulk_in_comp_desc.bMaxBurst = max_burst;
+		fsg_ss_bulk_out_desc.bEndpointAddress =
+			fsg_fs_bulk_out_desc.bEndpointAddress;
+		fsg_ss_bulk_out_comp_desc.bMaxBurst = max_burst;
+		f->ss_descriptors = usb_copy_descriptors(fsg_ss_function);
+		if (unlikely(!f->ss_descriptors)) {
+			free(f->hs_descriptors);
+			free(f->descriptors);
+			return -ENOMEM;
+		}
+	}
+
 	return 0;
 
 autoconf_fail:
drivers/usb/gadget/storage_common.c +51 -1

62 lines not on this page · raw message

Signature · 1 line
2.53.0
#2 lore raw

PATCH 2/2 usb: gadget: dfu: add SuperSpeed descriptor support

In reply to Thinh Nguyen

From: Dan Tran <[email protected]>

Populate ss_descriptors to support SuperSpeed connections. DFU is control-only so no separate SS descriptor set is needed; reuse the same descriptors across all speeds.

---
 drivers/usb/gadget/f_dfu.c | 6 ++++++
 1 file changed, 6 insertions(+)
drivers/usb/gadget/f_dfu.c +6 -0
index ca8b36e077bc..68d2ec7ebbe8 100644
@@ -227,6 +227,7 @@ static inline void to_dfu_mode(struct f_dfu *f_dfu)
 	f_dfu->usb_function.strings = dfu_strings;
 	f_dfu->usb_function.hs_descriptors = f_dfu->function;
 	f_dfu->usb_function.descriptors = f_dfu->function;
+	f_dfu->usb_function.ss_descriptors = f_dfu->function;
 	f_dfu->dfu_state = DFU_STATE_dfuIDLE;
 }
 
@@ -235,6 +236,7 @@ static inline void to_runtime_mode(struct f_dfu *f_dfu)
 	f_dfu->usb_function.strings = NULL;
 	f_dfu->usb_function.hs_descriptors = dfu_runtime_descs;
 	f_dfu->usb_function.descriptors = dfu_runtime_descs;
+	f_dfu->usb_function.ss_descriptors = dfu_runtime_descs;
 }
 
 static int handle_upload(struct usb_request *req, u16 len)
@@ -752,6 +754,9 @@ static int dfu_bind(struct usb_configuration *c, struct usb_function *f)
 	if (s)
 		g_dnl_set_serialnumber((char *)s);
 
+	if (gadget_is_superspeed(cdev->gadget))
+		f_dfu->usb_function.ss_descriptors = f_dfu->function;
+
 error:
 	return rv;
 }
@@ -826,6 +831,7 @@ static int dfu_bind_config(struct usb_configuration *c)
 	f_dfu->usb_function.name = "dfu";
 	f_dfu->usb_function.hs_descriptors = dfu_runtime_descs;
 	f_dfu->usb_function.descriptors = dfu_runtime_descs;
+	f_dfu->usb_function.ss_descriptors = dfu_runtime_descs;
 	f_dfu->usb_function.bind = dfu_bind;
 	f_dfu->usb_function.unbind = dfu_unbind;
 	f_dfu->usb_function.set_alt = dfu_set_alt;
Signature · 1 line
2.53.0
#3 lore raw
In reply to Thinh Nguyen
Quoted 4 lines · Thinh Nguyen

This series adds SuperSpeed descriptor support for the mass_storage and DFU gadget functions so they can operate correctly at SuperSpeed.

Quoted 8 lines

Dan Tran (2):
usb: gadget: mass_storage: add SuperSpeed descriptor support
usb: gadget: dfu: add SuperSpeed descriptor support

  drivers/usb/gadget/f_dfu.c          |  6 ++++
  drivers/usb/gadget/f_mass_storage.c | 25 ++++++++++++--
  drivers/usb/gadget/storage_common.c | 52 ++++++++++++++++++++++++++++-
  3 files changed, 80 insertions(+), 3 deletions(-)

I will let Mattijs comment on the patches themselves. But I would like to ask one thing of you -- please do not add internal Reviewed-by: tags to patches, it confuses upstream reviewers.

Thank you

#4 lore raw
Quoted 9 lines · Marek Vasut
Quoted 8 lines · Thinh Nguyen

This series adds SuperSpeed descriptor support for the mass_storage and DFU gadget functions so they can operate correctly at SuperSpeed.

Dan Tran (2):
usb: gadget: mass_storage: add SuperSpeed descriptor support
usb: gadget: dfu: add SuperSpeed descriptor support

Quoted 8 lines
Quoted 4 lines
  drivers/usb/gadget/f_dfu.c          |  6 ++++
  drivers/usb/gadget/f_mass_storage.c | 25 ++++++++++++--
  drivers/usb/gadget/storage_common.c | 52 ++++++++++++++++++++++++++++-
  3 files changed, 80 insertions(+), 3 deletions(-)

I will let Mattijs comment on the patches themselves. But I would like to ask one thing of you -- please do not add internal Reviewed-by: tags to patches, it confuses upstream reviewers.

Sure, we can resubmit the series with the internal Reviewed-by tags removed.

BR,
Thinh