diff options
| author | Mattijs Korpershoek <[email protected]> | 2026-06-17 13:14:48 +0200 |
|---|---|---|
| committer | Mattijs Korpershoek <[email protected]> | 2026-06-26 11:05:21 +0200 |
| commit | 1c758ce38caa783c85129753c1ecc9d14a203d8e (patch) | |
| tree | 0414d099f10324cfafa8cef6002bd165b86fe4be /drivers | |
| parent | eec819b98439c50f8ea38ac078ff6a862ea03038 (diff) | |
usb: gadget: f_mass_storage: Disable eps during disconnect
When trying two ums commands in a row, the second one no longer
enumerates properly from the host.
This happens since commit
59310d1ecb9f ("usb: gadget: introduce 'enabled' flag in struct usb_ep")
causing usb_ep_enable() to return early when ep->enabled is already set.
Gadget function drivers (such as f_fastboot or f_mass_storage) implement
a disable() function which is called whenever we are done using the
gadget.
Because f_mass_storage driver does not disable the endpoints,
ep->enabled will never be set to false again.
This can be reproduced on the STM32MP157C-DK2 or the Khadas VIM3 boards.
Add calls to usb_ep_disable() as done in linux [1] to fix this.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9fff139aeb11186fd8e75860c959c86cb43ab2f6
Fixes: 59310d1ecb9f ("usb: gadget: introduce 'enabled' flag in struct usb_ep")
Reported-by: Patrice Chotard <[email protected]>
Reviewed-by: Patrice Chotard <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Mattijs Korpershoek <[email protected]>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/gadget/f_mass_storage.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 71dc58da3f0..87ed25e8bb3 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -2275,6 +2275,17 @@ static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) static void fsg_disable(struct usb_function *f) { struct fsg_dev *fsg = fsg_from_func(f); + + /* Disable the endpoints */ + if (fsg->bulk_in_enabled) { + usb_ep_disable(fsg->bulk_in); + fsg->bulk_in_enabled = 0; + } + if (fsg->bulk_out_enabled) { + usb_ep_disable(fsg->bulk_out); + fsg->bulk_out_enabled = 0; + } + fsg->common->new_fsg = NULL; raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); } |
