From: Linus Walleij <linusw@kernel.org>
To: Alan Stern <stern@rowland.harvard.edu>,
Daniel Palmer <daniel@thingy.jp>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Philipp Zabel <p.zabel@pengutronix.de>
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
Linus Walleij <linusw@kernel.org>
Subject: [PATCH v3 4/6] usb: ehci: support additional controller quirks
Date: Thu, 03 Sep 2026 23:17:41 +0200 [thread overview]
Message-ID: <20260903-gemini-usb-fotg2-v3-4-dd92ecf5675b@kernel.org> (raw)
In-Reply-To: <20260903-gemini-usb-fotg2-v3-0-dd92ecf5675b@kernel.org>
Some EHCI implementations omit CONFIGFLAG and USBMODE, or have an
integrated transaction translator that cannot schedule siTDs.
Add quirks to skip CONFIGFLAG and TDI mode accesses and to reject
full- and low-speed isochronous transfers. Standard controllers retain
their current behavior.
Suggested-by: Daniel Palmer <daniel@thingy.jp>
Assisted-by: LLM
Signed-off-by: Linus Walleij <linusw@kernel.org>
---
drivers/usb/host/ehci-hcd.c | 24 ++++++++++++++++--------
drivers/usb/host/ehci-timer.c | 3 ++-
drivers/usb/host/ehci.h | 3 +++
3 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 19cc7611d86d..75f780ec3ba0 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -187,7 +187,8 @@ static int ehci_halt (struct ehci_hcd *ehci)
/* disable any irqs left enabled by previous code */
ehci_writel(ehci, 0, &ehci->regs->intr_enable);
- if (ehci_is_TDI(ehci) && !tdi_in_host_mode(ehci)) {
+ if (ehci_is_TDI(ehci) && !ehci->no_tdi_mode &&
+ !tdi_in_host_mode(ehci)) {
spin_unlock_irq(&ehci->lock);
return 0;
}
@@ -254,7 +255,7 @@ int ehci_reset(struct ehci_hcd *ehci)
if (retval)
return retval;
- if (ehci_is_TDI(ehci))
+ if (ehci_is_TDI(ehci) && !ehci->no_tdi_mode)
tdi_reset (ehci);
if (ehci->debug)
@@ -342,10 +343,12 @@ static void ehci_silence_controller(struct ehci_hcd *ehci)
ehci_turn_off_all_ports(ehci);
/* make BIOS/etc use companion controller during reboot */
- ehci_writel(ehci, 0, &ehci->regs->configured_flag);
+ if (!ehci->no_configured_flag) {
+ ehci_writel(ehci, 0, &ehci->regs->configured_flag);
- /* unblock posted writes */
- ehci_readl(ehci, &ehci->regs->configured_flag);
+ /* unblock posted writes */
+ ehci_readl(ehci, &ehci->regs->configured_flag);
+ }
spin_unlock_irq(&ehci->lock);
}
@@ -629,7 +632,8 @@ static int ehci_run (struct usb_hcd *hcd)
*/
down_write(&ehci_cf_port_reset_rwsem);
ehci->rh_state = EHCI_RH_RUNNING;
- ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
+ if (!ehci->no_configured_flag)
+ ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
/* Wait until HC become operational */
ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
@@ -909,6 +913,8 @@ static int ehci_urb_enqueue (
case PIPE_ISOCHRONOUS:
if (urb->dev->speed == USB_SPEED_HIGH)
return itd_submit (ehci, urb, mem_flags);
+ else if (ehci->no_fsls_isoc)
+ return -EOPNOTSUPP;
else
return sitd_submit (ehci, urb, mem_flags);
}
@@ -1184,7 +1190,8 @@ int ehci_resume(struct usb_hcd *hcd, bool force_reset)
* then we maintained suspend power.
* Just undo the effect of ehci_suspend().
*/
- if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF &&
+ if ((ehci->no_configured_flag ||
+ ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF) &&
!force_reset) {
int mask = INTR_MASK;
@@ -1216,7 +1223,8 @@ int ehci_resume(struct usb_hcd *hcd, bool force_reset)
goto skip;
ehci_writel(ehci, ehci->command, &ehci->regs->command);
- ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
+ if (!ehci->no_configured_flag)
+ ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
ehci->rh_state = EHCI_RH_SUSPENDED;
diff --git a/drivers/usb/host/ehci-timer.c b/drivers/usb/host/ehci-timer.c
index a79c8ac0a55f..404069a3dd0b 100644
--- a/drivers/usb/host/ehci-timer.c
+++ b/drivers/usb/host/ehci-timer.c
@@ -199,7 +199,8 @@ static void ehci_handle_controller_death(struct ehci_hcd *ehci)
/* Clean up the mess */
ehci->rh_state = EHCI_RH_HALTED;
- ehci_writel(ehci, 0, &ehci->regs->configured_flag);
+ if (!ehci->no_configured_flag)
+ ehci_writel(ehci, 0, &ehci->regs->configured_flag);
ehci_writel(ehci, 0, &ehci->regs->intr_enable);
ehci_work(ehci);
end_unlink_async(ehci);
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index bce4579fb8b2..855a9d08b019 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -235,6 +235,9 @@ struct ehci_hcd { /* one per controller */
unsigned spurious_oc:1;
unsigned is_aspeed:1;
unsigned zx_wakeup_clear_needed:1;
+ unsigned no_configured_flag:1;
+ unsigned no_tdi_mode:1;
+ unsigned no_fsls_isoc:1;
/* required for usb32 quirk */
#define OHCI_CTRL_HCFS (3 << 6)
--
2.55.0
next prev parent reply other threads:[~2026-09-03 21:17 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 21:17 [PATCH v3 0/6] Modernize the Faraday FOTG210 driver Linus Walleij
2026-09-03 21:17 ` [PATCH v3 1/6] usb: ehci: support non-standard port status registers Linus Walleij
2026-09-03 21:17 ` [PATCH v3 2/6] usb: ehci: add port reset hooks Linus Walleij
2026-09-03 21:17 ` [PATCH v3 3/6] usb: ehci: add port speed hook Linus Walleij
2026-09-03 21:17 ` Linus Walleij [this message]
2026-09-03 21:17 ` [PATCH v3 5/6] usb: fotg210: use the common EHCI core Linus Walleij
2026-09-03 21:17 ` [PATCH v3 6/6] usb: fotg210-udc: fix endpoint and resource handling Linus Walleij
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=20260903-gemini-usb-fotg2-v3-4-dd92ecf5675b@kernel.org \
--to=linusw@kernel.org \
--cc=daniel@thingy.jp \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=p.zabel@pengutronix.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