usb: gadget: add SuperSpeed descriptor support
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
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
@@ -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
PATCH 2/2 usb: gadget: dfu: add SuperSpeed descriptor support
In reply to Thinh NguyenFrom: 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
@@ -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
Quoted 4 lines · Thinh Nguyen
This series adds SuperSpeed descriptor support for the
mass_storageand 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 supportdrivers/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
Quoted 9 lines · Marek Vasut
Quoted 8 lines · Thinh Nguyen
This series adds SuperSpeed descriptor support for the
mass_storageand 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