mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-09-07 13:30:29 +00:00
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.6.103
removed upstream patches:
generic-backport/847-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch [2]
bcm27xx/patches-6.6/950-0135-media-tc358743-Increase-FIFO-level-to-374.patch [4]
bcm27xx/patches-6.6/950-0137-media-tc358743-Check-I2C-succeeded-during-probe.patch [5]
bcm27xx/patches-6.6/950-0143-media-tc358743-Return-an-appropriate-colorspace-from.patch [6]
bcm27xx/patches-6.6/950-0237-media-i2c-tc358743-Only-allow-supported-pixel-fmts-i.patch [7]
bcm27xx/patches-6.6/950-0510-Allow-RESET_BRCMSTB-on-ARCH_BCM2835.patch [8]
update patch to upstream function change
bcm53x/patches-6.6/180-usb-xhci-add-support-for-performing-fake-doorbell.patch
changed function xhci_disable_and_free_slot() upstream [3]
lantiq/patches-6.6/0152-lantiq-VPE.patch [9]
All other patches auto-refreshed.
[2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.103&id=c66caf21b1d0a0847adc34d368e3f6753a2cbd53
[3] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/drivers/usb/host?h=v6.6.103&id=e600de541c37f97482fea2a7a26f186141e7ddea
[4] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=1512ced62c8776707acf2123f7d02f56e80aa782
[5] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=5c809ef89e1ba2c3132e959382a3c22f0f62d5f9
[6] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=9b023149b97a08bd1c47fb4700381dffdad8c9b0
[7] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.103&id=9b023149b97a08bd1c47fb4700381dffdad8c9b0
[8] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/drivers/reset/Kconfig?id=f8818e29d268efc6b52d301cbb38405651a784cd
[9] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/arch/mips/include/asm/vpe.h?h=linux-6.6.y&id=7fe9533fb069013eafb862cefc60f7a9fb666615
Suggested-by: Leo Barsky <leobrsky@proton.me>
Signed-off-by: Goetz Goerisch <ggoerisch@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/19898
(cherry picked from commit 1c92e468d5
)
Signed-off-by: Goetz Goerisch <ggoerisch@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/19924
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
114 lines
3.4 KiB
Diff
114 lines
3.4 KiB
Diff
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
|
Date: Sat, 1 Oct 2016 22:54:48 +0200
|
|
Subject: [PATCH] usb: xhci: add support for performing fake doorbell
|
|
|
|
Broadcom's Northstar XHCI controllers seem to need a special start
|
|
procedure to work correctly. There isn't any official documentation of
|
|
this, the problem is that controller doesn't detect any connected
|
|
devices with default setup. Moreover connecting USB device to controller
|
|
that doesn't run properly can cause SoC's watchdog issues.
|
|
|
|
A workaround that was successfully tested on multiple devices is to
|
|
perform a fake doorbell. This patch adds code for doing this and enables
|
|
it on BCM4708 family.
|
|
---
|
|
drivers/usb/host/xhci-plat.c | 6 +++++
|
|
drivers/usb/host/xhci.c | 63 +++++++++++++++++++++++++++++++++++++++++---
|
|
drivers/usb/host/xhci.h | 1 +
|
|
3 files changed, 67 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/usb/host/xhci-plat.c
|
|
+++ b/drivers/usb/host/xhci-plat.c
|
|
@@ -77,8 +77,13 @@ static int xhci_priv_resume_quirk(struct
|
|
static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|
{
|
|
struct xhci_plat_priv *priv = xhci_to_priv(xhci);
|
|
+ struct platform_device*pdev = to_platform_device(dev);
|
|
+ struct device_node *node = pdev->dev.of_node;
|
|
|
|
xhci->quirks |= priv->quirks;
|
|
+
|
|
+ if (node && of_machine_is_compatible("brcm,bcm4708"))
|
|
+ xhci->quirks |= XHCI_FAKE_DOORBELL;
|
|
}
|
|
|
|
/* called during probe() after chip reset completes */
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -163,6 +163,49 @@ int xhci_start(struct xhci_hcd *xhci)
|
|
return ret;
|
|
}
|
|
|
|
+/**
|
|
+ * xhci_fake_doorbell - Perform a fake doorbell on a specified slot
|
|
+ *
|
|
+ * Some controllers require a fake doorbell to start correctly. Without that
|
|
+ * they simply don't detect any devices.
|
|
+ */
|
|
+static int xhci_fake_doorbell(struct xhci_hcd *xhci, int slot_id)
|
|
+{
|
|
+ u32 temp;
|
|
+
|
|
+ /* Alloc a virt device for that slot */
|
|
+ if (!xhci_alloc_virt_device(xhci, slot_id, NULL, GFP_NOIO)) {
|
|
+ xhci_warn(xhci, "Could not allocate xHCI USB device data structures\n");
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ /* Ring fake doorbell for slot_id ep 0 */
|
|
+ xhci_ring_ep_doorbell(xhci, slot_id, 0, 0);
|
|
+ usleep_range(1000, 1500);
|
|
+
|
|
+ /* Read the status to check if HSE is set or not */
|
|
+ temp = readl(&xhci->op_regs->status);
|
|
+
|
|
+ /* Clear HSE if set */
|
|
+ if (temp & STS_FATAL) {
|
|
+ xhci_dbg(xhci, "HSE problem detected, status: 0x%08x\n", temp);
|
|
+ temp &= ~0x1fff;
|
|
+ temp |= STS_FATAL;
|
|
+ writel(temp, &xhci->op_regs->status);
|
|
+ usleep_range(1000, 1500);
|
|
+ readl(&xhci->op_regs->status);
|
|
+ }
|
|
+
|
|
+ /* Free virt device */
|
|
+ xhci_disable_and_free_slot(xhci, slot_id);
|
|
+
|
|
+ /* We're done if controller is already running */
|
|
+ if (readl(&xhci->op_regs->command) & CMD_RUN)
|
|
+ return 0;
|
|
+
|
|
+ return xhci_start(xhci);
|
|
+}
|
|
+
|
|
/*
|
|
* Reset a halted HC.
|
|
*
|
|
@@ -500,6 +543,15 @@ static int xhci_run_finished(struct xhci
|
|
return -ENODEV;
|
|
}
|
|
|
|
+ if (xhci->quirks & XHCI_FAKE_DOORBELL) {
|
|
+ int err = xhci_fake_doorbell(xhci, 1);
|
|
+ if (err) {
|
|
+ xhci_halt(xhci);
|
|
+ spin_unlock_irqrestore(&xhci->lock, flags);
|
|
+ return err;
|
|
+ }
|
|
+ }
|
|
+
|
|
xhci->cmd_ring_state = CMD_RING_STATE_RUNNING;
|
|
|
|
if (xhci->quirks & XHCI_NEC_HOST)
|
|
--- a/drivers/usb/host/xhci.h
|
|
+++ b/drivers/usb/host/xhci.h
|
|
@@ -1660,6 +1660,7 @@ struct xhci_hcd {
|
|
#define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48)
|
|
#define XHCI_ETRON_HOST BIT_ULL(49)
|
|
#define XHCI_LIMIT_ENDPOINT_INTERVAL_9 BIT_ULL(50)
|
|
+#define XHCI_FAKE_DOORBELL BIT_ULL(51)
|
|
|
|
unsigned int num_active_eps;
|
|
unsigned int limit_active_eps;
|