From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/drivers/usb/host/xhci.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-) diff --git a/kernel/drivers/usb/host/xhci.c b/kernel/drivers/usb/host/xhci.c index cd344c5..f16dcdd 100644 --- a/kernel/drivers/usb/host/xhci.c +++ b/kernel/drivers/usb/host/xhci.c @@ -9,6 +9,9 @@ */ #include <linux/pci.h> +#ifndef __GENKSYMS__ /* ANDROID: KABI CRC preservation hack */ +#include <linux/iommu.h> +#endif #include <linux/iopoll.h> #include <linux/irq.h> #include <linux/log2.h> @@ -223,6 +226,7 @@ static void xhci_zero_64b_regs(struct xhci_hcd *xhci) { struct device *dev = xhci_to_hcd(xhci)->self.sysdev; + struct iommu_domain *domain; int err, i; u64 val; u32 intrs; @@ -241,7 +245,9 @@ * an iommu. Doing anything when there is no iommu is definitely * unsafe... */ - if (!(xhci->quirks & XHCI_ZERO_64B_REGS) || !device_iommu_mapped(dev)) + domain = iommu_get_domain_for_dev(dev); + if (!(xhci->quirks & XHCI_ZERO_64B_REGS) || !domain || + domain->type == IOMMU_DOMAIN_IDENTITY) return; xhci_info(xhci, "Zeroing 64bit base registers, expecting fault\n"); @@ -692,6 +698,8 @@ } xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Finished xhci_run for USB2 roothub"); + + set_bit(HCD_FLAG_DEFER_RH_REGISTER, &hcd->flags); xhci_dbc_init(xhci); @@ -1258,7 +1266,7 @@ * the first wake signalling failed, give it that chance. */ pending_portevent = xhci_pending_portevent(xhci); - if (!pending_portevent) { + if (!pending_portevent && !IS_ENABLED(CONFIG_ARCH_ROCKCHIP)) { msleep(120); pending_portevent = xhci_pending_portevent(xhci); } @@ -3865,6 +3873,7 @@ struct xhci_hcd *xhci = hcd_to_xhci(hcd); struct xhci_virt_device *virt_dev; struct xhci_slot_ctx *slot_ctx; + unsigned long flags; int i, ret; /* @@ -3893,7 +3902,11 @@ } virt_dev->udev = NULL; xhci_disable_slot(xhci, udev->slot_id); + + spin_lock_irqsave(&xhci->lock, flags); xhci_free_virt_device(xhci, udev->slot_id); + spin_unlock_irqrestore(&xhci->lock, flags); + } int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id) -- Gitblit v1.6.2