From: Mathias Nyman <mathias.nyman@linux.intel.com>
To: "Michał Pecio" <michal.pecio@gmail.com>,
"Alan Stern" <stern@rowland.harvard.edu>,
"Mathias Nyman" <mathias.nyman@intel.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
Cc: Paul Menzel <pmenzel@molgen.mpg.de>,
linux-usb@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH RFC RFT] usb: hcd: Add a usb_device argument to hc_driver.endpoint_reset()
Date: Tue, 8 Apr 2025 16:55:24 +0300 [thread overview]
Message-ID: <357368ff-0c49-4f22-a03d-fd9560c22dae@linux.intel.com> (raw)
In-Reply-To: <20250408121817.6ae8defd@foxbook>
On 8.4.2025 13.18, Michał Pecio wrote:
> xHCI needs usb_device in this callback so it employed some hacks that
> proved unreliable in the long term and made the code a little tricky.
>
> Make USB core supply it directly and simplify xhci_endpoint_reset().
> Use xhci_check_args() to prevent resetting emulated endpoints of root
> hubs and to deduplicate argument validation and improve debuggability.
>
> Update ehci_endpoint_reset(), which is the only other such callback,
> to accept (and ignore) the new argument.
>
> This fixes the root cause of a 6.15-rc1 regression reported by Paul,
> which I was able to reproduce locally. It also solves the general
> problem of xhci_endpoint_reset() becoming a no-op after device reset
> or changing configuration or altsetting. Although nobody complained
> because halted endpoints are reset automatically by xhci_hcd, it was
> a bug - sometimes class drivers want to reset not halted endpoints.
>
> Reported-by: Paul Menzel <pmenzel@molgen.mpg.de>
> Closes: https://lore.kernel.org/linux-usb/c279bd85-3069-4841-b1be-20507ac9f2d7@molgen.mpg.de/
> Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
> ---
>
> Is such change acceptable to interested parties?
Looks like an improvement, and will help clear the EP_STALLED flag
eventually in device reset case.
There are some issues still unsolved due to how xhci endpoints end up being handled
in usb core usb_reset_and_verify_device().
usb_reset_and_verify_device()
hub_port_init()
hcd->driver->reset_device(hcd, udev); /*1 xhci frees ep rings, loses td_list heads */
usb_hcd_alloc_bandwidth(new_config, NULL, NULL) /*2 xhci drop+add ep, allocated new ep rings */
usb_control_msg(udev, usb_sndctrlpipe(...,USB_REQ_SET_CONFIGURATION,...)
for (interfaces) {
if (AlternateSetting == 0) {
usb_disable_interface() /*3 flush urbs, ->xhci_urb_dequeue() */
usb_enable_interface() /*4 clear EP_STALLED flag */
} else {
usb_set_interface()
}
1. driver->reset_device will free all xhci endpoint rings, and lose td_list head, but
keep cancelled_td_list and ep->ep_state flags. xHC issues reset device command
setting all internal ep states in xci to "disabled".
2. usb hcd_alloc_bandwith will drop+add xhci endpoints for this configuration,
allocate new endpoint rings, and inits new td_list head.
Old cancelled_td_list and ep_state flags are still set, not matching ring.
3. usb_disable_interface() will flush all pending URBs calling xhci_urb_dequeue().
xhci_urb_dequeue() makes decision based on stale ep_state flags.
May start to cancel/giveback urbs in old cancelled_td_list for tds that existed
on old freed ring. will also set host_ep->hcpriv to null
4. usb_enable_interface() calls xhci_endpoint_reset() that finally clears
the EP_STALLED flag (udev now found thanks to this patch)
Disabling endpoints, like calling usb_disable_interface() in step 3 should be
done before calling usb_hcd_alloc_bandwith().
This was fixed in other places such as usb_set_interface() and usb_reset_config()
We might need to clean up ep_state flags and give back cancelled URBs in
xhci_discover_or_reset_device() after the reset device xhci command completion.
Thanks
Mathias
next prev parent reply other threads:[~2025-04-08 13:54 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-03 18:02 xhci: WARN Set TR Deq Ptr cmd failed due to incorrect slot or ep state Paul Menzel
2025-04-04 14:26 ` Mathias Nyman
2025-04-04 14:29 ` Paul Menzel
2025-04-05 5:23 ` Paul Menzel
2025-04-05 22:23 ` Michał Pecio
2025-04-06 2:40 ` Alan Stern
2025-04-06 7:50 ` Michał Pecio
2025-04-06 15:50 ` Michał Pecio
2025-04-06 19:26 ` Alan Stern
2025-04-07 5:49 ` Michał Pecio
2025-04-07 16:11 ` Alan Stern
2025-04-08 10:18 ` [PATCH RFC RFT] usb: hcd: Add a usb_device argument to hc_driver.endpoint_reset() Michał Pecio
2025-04-08 13:55 ` Mathias Nyman [this message]
2025-04-09 10:18 ` Michał Pecio
2025-04-09 14:13 ` Alan Stern
2025-04-15 8:38 ` Michał Pecio
2025-04-07 7:15 ` xhci: WARN Set TR Deq Ptr cmd failed due to incorrect slot or ep state Mathias Nyman
2025-04-05 6:43 ` Michał Pecio
2025-04-05 7:36 ` Paul Menzel
2025-04-05 9:49 ` Michał Pecio
2025-04-05 14:08 ` Paul Menzel
2025-04-05 18:13 ` Paul Menzel
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=357368ff-0c49-4f22-a03d-fd9560c22dae@linux.intel.com \
--to=mathias.nyman@linux.intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=michal.pecio@gmail.com \
--cc=pmenzel@molgen.mpg.de \
--cc=stern@rowland.harvard.edu \
/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