]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: gadget: tegra-xudc: Always reinitialize data toggle when clear halt
authorHaotien Hsu <haotienh@nvidia.com>
Thu, 27 Nov 2025 03:35:40 +0000 (11:35 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Nov 2025 09:22:48 +0000 (10:22 +0100)
The driver previously skipped handling ClearFeature(ENDPOINT_HALT)
when the endpoint was already not halted. This prevented the
controller from resetting the data sequence number and reinitializing
the endpoint state.

According to USB 3.2 specification Rev. 1.1, section 9.4.5,
ClearFeature(ENDPOINT_HALT) must always reset the data sequence and
set the stream state machine to Disabled, regardless of whether the
endpoint was halted.

Remove the early return so that ClearFeature(ENDPOINT_HALT) always
resets the endpoint sequence state as required by the specification.

Fixes: 49db427232fe ("usb: gadget: Add UDC driver for tegra XUSB device mode controller")
Cc: stable <stable@kernel.org>
Signed-off-by: Haotien Hsu <haotienh@nvidia.com>
Signed-off-by: Wayne Chang <waynec@nvidia.com>
Link: https://patch.msgid.link/20251127033540.2287517-1-waynec@nvidia.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/udc/tegra-xudc.c

index 0c38fc37b6e66cbfd120f66a4bfe4bda2ef9ac74..9d2007f448c0496454590deb8c34f9fc8ab4e97b 100644 (file)
@@ -1558,12 +1558,6 @@ static int __tegra_xudc_ep_set_halt(struct tegra_xudc_ep *ep, bool halt)
                return -ENOTSUPP;
        }
 
-       if (!!(xudc_readl(xudc, EP_HALT) & BIT(ep->index)) == halt) {
-               dev_dbg(xudc->dev, "EP %u already %s\n", ep->index,
-                       halt ? "halted" : "not halted");
-               return 0;
-       }
-
        if (halt) {
                ep_halt(xudc, ep->index);
        } else {