diff options
Diffstat (limited to 'debian/patches/bugfix')
104 files changed, 11231 insertions, 0 deletions
diff --git a/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch b/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch new file mode 100644 index 000000000..2172fa43d --- /dev/null +++ b/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch @@ -0,0 +1,80 @@ +From: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Date: Sat, 15 Jun 2019 10:23:57 +1000 +Subject: [PATCH 1/4] PCI/ACPI: Evaluate PCI Boot Configuration _DSM +Origin: https://git.kernel.org/linus/a78cf9657ba5426f54aa93a067c10d097944c082 + +Evaluate _DSM Function #5, the "PCI Boot Configuration" function. If the +result is 0, the OS should preserve any resource assignments made by the +firmware. + +Link: https://lore.kernel.org/r/20190615002359.29577-2-benh@kernel.crashing.org +Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> +[bhelgaas: commit log] +Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> +--- + drivers/acpi/pci_root.c | 12 ++++++++++++ + include/linux/pci-acpi.h | 7 ++++--- + include/linux/pci.h | 2 ++ + 3 files changed, 18 insertions(+), 3 deletions(-) + +Index: linux/drivers/acpi/pci_root.c +=================================================================== +--- linux.orig/drivers/acpi/pci_root.c ++++ linux/drivers/acpi/pci_root.c +@@ -884,6 +884,7 @@ struct pci_bus *acpi_pci_root_create(str + int node = acpi_get_node(device->handle); + struct pci_bus *bus; + struct pci_host_bridge *host_bridge; ++ union acpi_object *obj; + + info->root = root; + info->bridge = device; +@@ -920,6 +921,17 @@ struct pci_bus *acpi_pci_root_create(str + if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL)) + host_bridge->native_ltr = 0; + ++ /* ++ * Evaluate the "PCI Boot Configuration" _DSM Function. If it ++ * exists and returns 0, we must preserve any PCI resource ++ * assignments made by firmware for this host bridge. ++ */ ++ obj = acpi_evaluate_dsm(ACPI_HANDLE(bus->bridge), &pci_acpi_dsm_guid, 1, ++ IGNORE_PCI_BOOT_CONFIG_DSM, NULL); ++ if (obj && obj->type == ACPI_TYPE_INTEGER && obj->integer.value == 0) ++ host_bridge->preserve_config = 1; ++ ACPI_FREE(obj); ++ + pci_scan_child_bus(bus); + pci_set_host_bridge_release(host_bridge, acpi_pci_root_release_info, + info); +Index: linux/include/linux/pci-acpi.h +=================================================================== +--- linux.orig/include/linux/pci-acpi.h ++++ linux/include/linux/pci-acpi.h +@@ -107,9 +107,10 @@ static inline void acpiphp_check_host_br + #endif + + extern const guid_t pci_acpi_dsm_guid; +-#define DEVICE_LABEL_DSM 0x07 +-#define RESET_DELAY_DSM 0x08 +-#define FUNCTION_DELAY_DSM 0x09 ++#define IGNORE_PCI_BOOT_CONFIG_DSM 0x05 ++#define DEVICE_LABEL_DSM 0x07 ++#define RESET_DELAY_DSM 0x08 ++#define FUNCTION_DELAY_DSM 0x09 + + #else /* CONFIG_ACPI */ + static inline void acpi_pci_add_bus(struct pci_bus *bus) { } +Index: linux/include/linux/pci.h +=================================================================== +--- linux.orig/include/linux/pci.h ++++ linux/include/linux/pci.h +@@ -486,6 +486,8 @@ struct pci_host_bridge { + unsigned int native_shpc_hotplug:1; /* OS may use SHPC hotplug */ + unsigned int native_pme:1; /* OS may use PCIe PME */ + unsigned int native_ltr:1; /* OS may use PCIe LTR */ ++ unsigned int preserve_config:1; /* Preserve FW resource setup */ ++ + /* Resource alignment requirements */ + resource_size_t (*align_resource)(struct pci_dev *dev, + const struct resource *res, diff --git a/debian/patches/bugfix/all/PCI-Don-t-auto-realloc-if-we-re-preserving-firmware-.patch b/debian/patches/bugfix/all/PCI-Don-t-auto-realloc-if-we-re-preserving-firmware-.patch new file mode 100644 index 000000000..04fa61629 --- /dev/null +++ b/debian/patches/bugfix/all/PCI-Don-t-auto-realloc-if-we-re-preserving-firmware-.patch @@ -0,0 +1,35 @@ +From: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Date: Sat, 15 Jun 2019 10:23:58 +1000 +Subject: [PATCH 2/4] PCI: Don't auto-realloc if we're preserving firmware config +Origin: https://git.kernel.org/linus/7ac0d094fbe95bf7cc96b3066a97e1090ddc734a + +Prevent auto-enabling of bridges reallocation when the FW tells us that the +initial configuration must be preserved for a given host bridge. + +Link: https://lore.kernel.org/r/20190615002359.29577-3-benh@kernel.crashing.org +Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> +--- + drivers/pci/setup-bus.c | 5 +++++ + 1 file changed, 5 insertions(+) + +Index: linux/drivers/pci/setup-bus.c +=================================================================== +--- linux.orig/drivers/pci/setup-bus.c ++++ linux/drivers/pci/setup-bus.c +@@ -1724,10 +1724,15 @@ static enum enable_type pci_realloc_dete + enum enable_type enable_local) + { + bool unassigned = false; ++ struct pci_host_bridge *host; + + if (enable_local != undefined) + return enable_local; + ++ host = pci_find_host_bridge(bus); ++ if (host->preserve_config) ++ return auto_disabled; ++ + pci_walk_bus(bus, iov_resources_unassigned, &unassigned); + if (unassigned) + return auto_enabled; diff --git a/debian/patches/bugfix/all/USB-drop-HDC_LOCAL_MEM-flag.patch b/debian/patches/bugfix/all/USB-drop-HDC_LOCAL_MEM-flag.patch new file mode 100644 index 000000000..727419539 --- /dev/null +++ b/debian/patches/bugfix/all/USB-drop-HDC_LOCAL_MEM-flag.patch @@ -0,0 +1,191 @@ +From: Laurentiu Tudor <laurentiu.tudor@nxp.com> +Date: Wed, 29 May 2019 13:28:43 +0300 +Subject: USB: drop HCD_LOCAL_MEM flag +Origin: https://git.kernel.org/linus/2d7a3dc3e24f43504b1f25eae8195e600f4cce8b + +With the addition of the local memory allocator, the HCD_LOCAL_MEM +flag can be dropped and the checks against it replaced with a check +for the localmem_pool ptr being initialized. + +Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> +Tested-by: Fredrik Noring <noring@nocrew.org> +Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Signed-off-by: Christoph Hellwig <hch@lst.de> +--- + drivers/usb/core/buffer.c | 8 +++----- + drivers/usb/core/hcd.c | 15 ++++++--------- + drivers/usb/host/ehci-hcd.c | 2 +- + drivers/usb/host/fotg210-hcd.c | 2 +- + drivers/usb/host/ohci-hcd.c | 2 +- + drivers/usb/host/ohci-sm501.c | 5 +++-- + drivers/usb/host/ohci-tmio.c | 2 +- + drivers/usb/host/uhci-hcd.c | 2 +- + include/linux/usb/hcd.h | 1 - + 9 files changed, 17 insertions(+), 22 deletions(-) + +--- a/drivers/usb/core/buffer.c ++++ b/drivers/usb/core/buffer.c +@@ -68,7 +68,7 @@ + + if (!IS_ENABLED(CONFIG_HAS_DMA) || + (!is_device_dma_capable(hcd->self.sysdev) && +- !(hcd->driver->flags & HCD_LOCAL_MEM))) ++ !hcd->localmem_pool)) + return 0; + + for (i = 0; i < HCD_BUFFER_POOLS; i++) { +@@ -134,8 +134,7 @@ + + /* some USB hosts just use PIO */ + if (!IS_ENABLED(CONFIG_HAS_DMA) || +- (!is_device_dma_capable(bus->sysdev) && +- !(hcd->driver->flags & HCD_LOCAL_MEM))) { ++ !is_device_dma_capable(bus->sysdev)) { + *dma = ~(dma_addr_t) 0; + return kmalloc(size, mem_flags); + } +@@ -166,8 +165,7 @@ + } + + if (!IS_ENABLED(CONFIG_HAS_DMA) || +- (!is_device_dma_capable(bus->sysdev) && +- !(hcd->driver->flags & HCD_LOCAL_MEM))) { ++ !is_device_dma_capable(bus->sysdev)) { + kfree(addr); + return; + } +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -1346,14 +1346,14 @@ + * using regular system memory - like pci devices doing bus mastering. + * + * To support host controllers with limited dma capabilities we provide dma +- * bounce buffers. This feature can be enabled using the HCD_LOCAL_MEM flag. ++ * bounce buffers. This feature can be enabled by initializing ++ * hcd->localmem_pool using usb_hcd_setup_local_mem(). + * For this to work properly the host controller code must first use the + * function dma_declare_coherent_memory() to point out which memory area + * that should be used for dma allocations. + * +- * The HCD_LOCAL_MEM flag then tells the usb code to allocate all data for +- * dma using dma_alloc_coherent() which in turn allocates from the memory +- * area pointed out with dma_declare_coherent_memory(). ++ * The initialized hcd->localmem_pool then tells the usb code to allocate all ++ * data for dma using the genalloc API. + * + * So, to summarize... + * +@@ -1363,9 +1363,6 @@ + * (a) "normal" kernel memory is no good, and + * (b) there's not enough to share + * +- * - The only *portable* hook for such stuff in the +- * DMA framework is dma_declare_coherent_memory() +- * + * - So we use that, even though the primary requirement + * is that the memory be "local" (hence addressable + * by that device), not "coherent". +@@ -1532,7 +1529,7 @@ + urb->setup_dma)) + return -EAGAIN; + urb->transfer_flags |= URB_SETUP_MAP_SINGLE; +- } else if (hcd->driver->flags & HCD_LOCAL_MEM) { ++ } else if (hcd->localmem_pool) { + ret = hcd_alloc_coherent( + urb->dev->bus, mem_flags, + &urb->setup_dma, +@@ -1602,7 +1599,7 @@ + else + urb->transfer_flags |= URB_DMA_MAP_SINGLE; + } +- } else if (hcd->driver->flags & HCD_LOCAL_MEM) { ++ } else if (hcd->localmem_pool) { + ret = hcd_alloc_coherent( + urb->dev->bus, mem_flags, + &urb->transfer_dma, +--- a/drivers/usb/host/ehci-hcd.c ++++ b/drivers/usb/host/ehci-hcd.c +@@ -560,7 +560,7 @@ + ehci->command = temp; + + /* Accept arbitrarily long scatter-gather lists */ +- if (!(hcd->driver->flags & HCD_LOCAL_MEM)) ++ if (!hcd->localmem_pool) + hcd->self.sg_tablesize = ~0; + + /* Prepare for unlinking active QHs */ +--- a/drivers/usb/host/fotg210-hcd.c ++++ b/drivers/usb/host/fotg210-hcd.c +@@ -4998,7 +4998,7 @@ + fotg210->command = temp; + + /* Accept arbitrarily long scatter-gather lists */ +- if (!(hcd->driver->flags & HCD_LOCAL_MEM)) ++ if (!hcd->localmem_pool) + hcd->self.sg_tablesize = ~0; + return 0; + } +--- a/drivers/usb/host/ohci-hcd.c ++++ b/drivers/usb/host/ohci-hcd.c +@@ -457,7 +457,7 @@ + struct usb_hcd *hcd = ohci_to_hcd(ohci); + + /* Accept arbitrarily long scatter-gather lists */ +- if (!(hcd->driver->flags & HCD_LOCAL_MEM)) ++ if (!hcd->localmem_pool) + hcd->self.sg_tablesize = ~0; + + if (distrust_firmware) +--- a/drivers/usb/host/ohci-sm501.c ++++ b/drivers/usb/host/ohci-sm501.c +@@ -49,7 +49,7 @@ + * generic hardware linkage + */ + .irq = ohci_irq, +- .flags = HCD_USB11 | HCD_MEMORY | HCD_LOCAL_MEM, ++ .flags = HCD_USB11 | HCD_MEMORY, + + /* + * basic lifecycle operations +@@ -153,7 +153,8 @@ + * fine. This is however not always the case - buffers may be allocated + * using kmalloc() - so the usb core needs to be told that it must copy + * data into our local memory if the buffers happen to be placed in +- * regular memory. The HCD_LOCAL_MEM flag does just that. ++ * regular memory. A non-null hcd->localmem_pool initialized by the ++ * the call to usb_hcd_setup_local_mem() below does just that. + */ + + retval = usb_hcd_setup_local_mem(hcd, mem->start, +--- a/drivers/usb/host/ohci-tmio.c ++++ b/drivers/usb/host/ohci-tmio.c +@@ -153,7 +153,7 @@ + + /* generic hardware linkage */ + .irq = ohci_irq, +- .flags = HCD_USB11 | HCD_MEMORY | HCD_LOCAL_MEM, ++ .flags = HCD_USB11 | HCD_MEMORY, + + /* basic lifecycle operations */ + .start = ohci_tmio_start, +--- a/drivers/usb/host/uhci-hcd.c ++++ b/drivers/usb/host/uhci-hcd.c +@@ -581,7 +581,7 @@ + + hcd->uses_new_polling = 1; + /* Accept arbitrarily long scatter-gather lists */ +- if (!(hcd->driver->flags & HCD_LOCAL_MEM)) ++ if (!hcd->localmem_pool) + hcd->self.sg_tablesize = ~0; + + spin_lock_init(&uhci->lock); +--- a/include/linux/usb/hcd.h ++++ b/include/linux/usb/hcd.h +@@ -256,7 +256,6 @@ + + int flags; + #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ +-#define HCD_LOCAL_MEM 0x0002 /* HC needs local memory */ + #define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */ + #define HCD_USB11 0x0010 /* USB 1.1 */ + #define HCD_USB2 0x0020 /* USB 2.0 */ diff --git a/debian/patches/bugfix/all/USB-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch b/debian/patches/bugfix/all/USB-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch new file mode 100644 index 000000000..08a838c66 --- /dev/null +++ b/debian/patches/bugfix/all/USB-ohci-sm501-fix-error-return-code-in-ohci_hcd_sm5.patch @@ -0,0 +1,33 @@ +From: Wei Yongjun <weiyongjun1@huawei.com> +Date: Wed, 6 May 2020 13:56:25 +0000 +Subject: USB: ohci-sm501: fix error return code in ohci_hcd_sm501_drv_probe() +Origin: https://git.kernel.org/linus/b919e077cccfbb77beb98809568b2fb0b4d113ec + +Fix to return a negative error code from the error handling +case instead of 0, as done elsewhere in this function. + +Fixes: 7d9e6f5aebe8 ("usb: host: ohci-sm501: init genalloc for local memory") +Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com> +Acked-by: Alan Stern <stern@rowland.harvard.edu> +Link: https://lore.kernel.org/r/20200506135625.106910-1-weiyongjun1@huawei.com +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/usb/host/ohci-sm501.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/drivers/usb/host/ohci-sm501.c ++++ b/drivers/usb/host/ohci-sm501.c +@@ -156,9 +156,10 @@ + * regular memory. The HCD_LOCAL_MEM flag does just that. + */ + +- if (usb_hcd_setup_local_mem(hcd, mem->start, +- mem->start - mem->parent->start, +- resource_size(mem)) < 0) ++ retval = usb_hcd_setup_local_mem(hcd, mem->start, ++ mem->start - mem->parent->start, ++ resource_size(mem)); ++ if (retval < 0) + goto err5; + retval = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (retval) diff --git a/debian/patches/bugfix/all/USB-use-genalloc-for-USB-HCs-with-local-memory.patch b/debian/patches/bugfix/all/USB-use-genalloc-for-USB-HCs-with-local-memory.patch new file mode 100644 index 000000000..88caafd5a --- /dev/null +++ b/debian/patches/bugfix/all/USB-use-genalloc-for-USB-HCs-with-local-memory.patch @@ -0,0 +1,280 @@ +From: Laurentiu Tudor <laurentiu.tudor@nxp.com> +Date: Wed, 29 May 2019 13:28:40 +0300 +Subject: USB: use genalloc for USB HCs with local memory +Origin: https://git.kernel.org/linus/b0310c2f09bbe8aebefb97ed67949a3a7092aca6 + +For HCs that have local memory, replace the current DMA API usage with +a genalloc generic allocator to manage the mappings for these devices. +To help users, introduce a new HCD API, usb_hcd_setup_local_mem() that +will setup up the genalloc backing up the device local memory. It will +be used in subsequent patches. This is in preparation for dropping +the existing "coherent" dma mem declaration APIs. The current +implementation was relying on a short circuit in the DMA API that in +the end, was acting as an allocator for these type of devices. + +Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> +Tested-by: Fredrik Noring <noring@nocrew.org> +Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Signed-off-by: Christoph Hellwig <hch@lst.de> +--- + drivers/usb/Kconfig | 1 + + drivers/usb/core/buffer.c | 9 +++++++++ + drivers/usb/core/hcd.c | 36 ++++++++++++++++++++++++++++++++++++ + drivers/usb/host/ohci-hcd.c | 23 ++++++++++++++++++----- + drivers/usb/host/ohci-mem.c | 35 +++++++++++++++++++++++++++++++---- + drivers/usb/host/ohci.h | 2 ++ + include/linux/usb/hcd.h | 5 +++++ + 7 files changed, 102 insertions(+), 9 deletions(-) + +--- a/drivers/usb/Kconfig ++++ b/drivers/usb/Kconfig +@@ -44,6 +44,7 @@ + config USB + tristate "Support for Host-side USB" + depends on USB_ARCH_HAS_HCD ++ select GENERIC_ALLOCATOR + select USB_COMMON + select NLS # for UTF-8 strings + ---help--- +--- a/drivers/usb/core/buffer.c ++++ b/drivers/usb/core/buffer.c +@@ -16,6 +16,7 @@ + #include <linux/io.h> + #include <linux/dma-mapping.h> + #include <linux/dmapool.h> ++#include <linux/genalloc.h> + #include <linux/usb.h> + #include <linux/usb/hcd.h> + +@@ -128,6 +129,9 @@ + if (size == 0) + return NULL; + ++ if (hcd->localmem_pool) ++ return gen_pool_dma_alloc(hcd->localmem_pool, size, dma); ++ + /* some USB hosts just use PIO */ + if (!IS_ENABLED(CONFIG_HAS_DMA) || + (!is_device_dma_capable(bus->sysdev) && +@@ -156,6 +160,11 @@ + if (!addr) + return; + ++ if (hcd->localmem_pool) { ++ gen_pool_free(hcd->localmem_pool, (unsigned long)addr, size); ++ return; ++ } ++ + if (!IS_ENABLED(CONFIG_HAS_DMA) || + (!is_device_dma_capable(bus->sysdev) && + !(hcd->driver->flags & HCD_LOCAL_MEM))) { +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -29,6 +29,8 @@ + #include <linux/workqueue.h> + #include <linux/pm_runtime.h> + #include <linux/types.h> ++#include <linux/genalloc.h> ++#include <linux/io.h> + + #include <linux/phy/phy.h> + #include <linux/usb.h> +@@ -3025,6 +3027,40 @@ + } + EXPORT_SYMBOL_GPL(usb_hcd_platform_shutdown); + ++int usb_hcd_setup_local_mem(struct usb_hcd *hcd, phys_addr_t phys_addr, ++ dma_addr_t dma, size_t size) ++{ ++ int err; ++ void *local_mem; ++ ++ hcd->localmem_pool = devm_gen_pool_create(hcd->self.sysdev, PAGE_SHIFT, ++ dev_to_node(hcd->self.sysdev), ++ dev_name(hcd->self.sysdev)); ++ if (IS_ERR(hcd->localmem_pool)) ++ return PTR_ERR(hcd->localmem_pool); ++ ++ local_mem = devm_memremap(hcd->self.sysdev, phys_addr, ++ size, MEMREMAP_WC); ++ if (!local_mem) ++ return -ENOMEM; ++ ++ /* ++ * Here we pass a dma_addr_t but the arg type is a phys_addr_t. ++ * It's not backed by system memory and thus there's no kernel mapping ++ * for it. ++ */ ++ err = gen_pool_add_virt(hcd->localmem_pool, (unsigned long)local_mem, ++ dma, size, dev_to_node(hcd->self.sysdev)); ++ if (err < 0) { ++ dev_err(hcd->self.sysdev, "gen_pool_add_virt failed with %d\n", ++ err); ++ return err; ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(usb_hcd_setup_local_mem); ++ + /*-------------------------------------------------------------------------*/ + + #if IS_ENABLED(CONFIG_USB_MON) +--- a/drivers/usb/host/ohci-hcd.c ++++ b/drivers/usb/host/ohci-hcd.c +@@ -40,6 +40,7 @@ + #include <linux/dmapool.h> + #include <linux/workqueue.h> + #include <linux/debugfs.h> ++#include <linux/genalloc.h> + + #include <asm/io.h> + #include <asm/irq.h> +@@ -514,8 +515,15 @@ + timer_setup(&ohci->io_watchdog, io_watchdog_func, 0); + ohci->prev_frame_no = IO_WATCHDOG_OFF; + +- ohci->hcca = dma_alloc_coherent (hcd->self.controller, +- sizeof(*ohci->hcca), &ohci->hcca_dma, GFP_KERNEL); ++ if (hcd->localmem_pool) ++ ohci->hcca = gen_pool_dma_alloc(hcd->localmem_pool, ++ sizeof(*ohci->hcca), ++ &ohci->hcca_dma); ++ else ++ ohci->hcca = dma_alloc_coherent(hcd->self.controller, ++ sizeof(*ohci->hcca), ++ &ohci->hcca_dma, ++ GFP_KERNEL); + if (!ohci->hcca) + return -ENOMEM; + +@@ -999,9 +1007,14 @@ + remove_debug_files (ohci); + ohci_mem_cleanup (ohci); + if (ohci->hcca) { +- dma_free_coherent (hcd->self.controller, +- sizeof *ohci->hcca, +- ohci->hcca, ohci->hcca_dma); ++ if (hcd->localmem_pool) ++ gen_pool_free(hcd->localmem_pool, ++ (unsigned long)ohci->hcca, ++ sizeof(*ohci->hcca)); ++ else ++ dma_free_coherent(hcd->self.controller, ++ sizeof(*ohci->hcca), ++ ohci->hcca, ohci->hcca_dma); + ohci->hcca = NULL; + ohci->hcca_dma = 0; + } +--- a/drivers/usb/host/ohci-mem.c ++++ b/drivers/usb/host/ohci-mem.c +@@ -36,6 +36,13 @@ + + static int ohci_mem_init (struct ohci_hcd *ohci) + { ++ /* ++ * HCs with local memory allocate from localmem_pool so there's ++ * no need to create the below dma pools. ++ */ ++ if (ohci_to_hcd(ohci)->localmem_pool) ++ return 0; ++ + ohci->td_cache = dma_pool_create ("ohci_td", + ohci_to_hcd(ohci)->self.controller, + sizeof (struct td), +@@ -88,8 +95,12 @@ + { + dma_addr_t dma; + struct td *td; ++ struct usb_hcd *hcd = ohci_to_hcd(hc); + +- td = dma_pool_zalloc (hc->td_cache, mem_flags, &dma); ++ if (hcd->localmem_pool) ++ td = gen_pool_dma_zalloc(hcd->localmem_pool, sizeof(*td), &dma); ++ else ++ td = dma_pool_zalloc(hc->td_cache, mem_flags, &dma); + if (td) { + /* in case hc fetches it, make it look dead */ + td->hwNextTD = cpu_to_hc32 (hc, dma); +@@ -103,6 +114,7 @@ + td_free (struct ohci_hcd *hc, struct td *td) + { + struct td **prev = &hc->td_hash [TD_HASH_FUNC (td->td_dma)]; ++ struct usb_hcd *hcd = ohci_to_hcd(hc); + + while (*prev && *prev != td) + prev = &(*prev)->td_hash; +@@ -110,7 +122,12 @@ + *prev = td->td_hash; + else if ((td->hwINFO & cpu_to_hc32(hc, TD_DONE)) != 0) + ohci_dbg (hc, "no hash for td %p\n", td); +- dma_pool_free (hc->td_cache, td, td->td_dma); ++ ++ if (hcd->localmem_pool) ++ gen_pool_free(hcd->localmem_pool, (unsigned long)td, ++ sizeof(*td)); ++ else ++ dma_pool_free(hc->td_cache, td, td->td_dma); + } + + /*-------------------------------------------------------------------------*/ +@@ -121,8 +138,12 @@ + { + dma_addr_t dma; + struct ed *ed; ++ struct usb_hcd *hcd = ohci_to_hcd(hc); + +- ed = dma_pool_zalloc (hc->ed_cache, mem_flags, &dma); ++ if (hcd->localmem_pool) ++ ed = gen_pool_dma_zalloc(hcd->localmem_pool, sizeof(*ed), &dma); ++ else ++ ed = dma_pool_zalloc(hc->ed_cache, mem_flags, &dma); + if (ed) { + INIT_LIST_HEAD (&ed->td_list); + ed->dma = dma; +@@ -133,6 +154,12 @@ + static void + ed_free (struct ohci_hcd *hc, struct ed *ed) + { +- dma_pool_free (hc->ed_cache, ed, ed->dma); ++ struct usb_hcd *hcd = ohci_to_hcd(hc); ++ ++ if (hcd->localmem_pool) ++ gen_pool_free(hcd->localmem_pool, (unsigned long)ed, ++ sizeof(*ed)); ++ else ++ dma_pool_free(hc->ed_cache, ed, ed->dma); + } + +--- a/drivers/usb/host/ohci.h ++++ b/drivers/usb/host/ohci.h +@@ -385,6 +385,8 @@ + + /* + * memory management for queue data structures ++ * ++ * @td_cache and @ed_cache are %NULL if &usb_hcd.localmem_pool is used. + */ + struct dma_pool *td_cache; + struct dma_pool *ed_cache; +--- a/include/linux/usb/hcd.h ++++ b/include/linux/usb/hcd.h +@@ -211,6 +211,9 @@ + #define HC_IS_RUNNING(state) ((state) & __ACTIVE) + #define HC_IS_SUSPENDED(state) ((state) & __SUSPEND) + ++ /* memory pool for HCs having local memory, or %NULL */ ++ struct gen_pool *localmem_pool; ++ + /* more shared queuing code would be good; it should support + * smarter scheduling, handle transaction translators, etc; + * input size of periodic table to an interrupt scheduler. +@@ -461,6 +464,8 @@ + unsigned int irqnum, unsigned long irqflags); + extern void usb_remove_hcd(struct usb_hcd *hcd); + extern int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1); ++int usb_hcd_setup_local_mem(struct usb_hcd *hcd, phys_addr_t phys_addr, ++ dma_addr_t dma, size_t size); + + struct platform_device; + extern void usb_hcd_platform_shutdown(struct platform_device *dev); diff --git a/debian/patches/bugfix/all/cpupower-bump-soname-version.patch b/debian/patches/bugfix/all/cpupower-bump-soname-version.patch new file mode 100644 index 000000000..5691bd454 --- /dev/null +++ b/debian/patches/bugfix/all/cpupower-bump-soname-version.patch @@ -0,0 +1,29 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Thu, 9 Jun 2016 23:35:08 +0100 +Subject: cpupower: Bump soname version +Forwarded: http://mid.gmane.org/20160610005619.GQ7555@decadent.org.uk + +Several functions in the libcpupower API are renamed or removed in +Linux 4.7. This is an backward-incompatible ABI change, so the +library soname should change from libcpupower.so.0 to +libcpupower.so.1. + +Fixes: ac5a181d065d ("cpupower: Add cpuidle parts into library") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- + tools/power/cpupower/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/tools/power/cpupower/Makefile +=================================================================== +--- linux.orig/tools/power/cpupower/Makefile ++++ linux/tools/power/cpupower/Makefile +@@ -66,7 +66,7 @@ DESTDIR ?= + + VERSION= $(shell ./utils/version-gen.sh) + LIB_MAJ= 0.0.1 +-LIB_MIN= 0 ++LIB_MIN= 1 + + PACKAGE = cpupower + PACKAGE_BUGREPORT = linux-pm@vger.kernel.org diff --git a/debian/patches/bugfix/all/cpupower-fix-checks-for-cpu-existence.patch b/debian/patches/bugfix/all/cpupower-fix-checks-for-cpu-existence.patch new file mode 100644 index 000000000..0ad8fc6cd --- /dev/null +++ b/debian/patches/bugfix/all/cpupower-fix-checks-for-cpu-existence.patch @@ -0,0 +1,51 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Thu, 03 Nov 2016 15:25:26 -0600 +Subject: cpupower: Fix checks for CPU existence +Forwarded: https://marc.info/?l=linux-pm&m=149248268214265 + +Calls to cpufreq_cpu_exists(cpu) were converted to +cpupower_is_cpu_online(cpu) when libcpupower was introduced and the +former function was deleted. However, cpupower_is_cpu_online() does +not distinguish physically absent and offline CPUs, and does not set +errno. + +cpufreq-set has already been fixed (commit c25badc9ceb6). + +In cpufreq-bench, which prints an error message for offline CPUs, +properly distinguish and report the zero and negative cases. + +Fixes: ac5a181d065d ("cpupower: Add cpuidle parts into library") +Fixes: 53d1cd6b125f ("cpupowerutils: bench - Fix cpu online check") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +[carnil: Update/Refresh patch for 4.14.17: The issue with the +incorrect check has been fixed with upstream commit 53d1cd6b125f. +Keep in the patch the distinction and report for the zero and +negative cases.] +--- +Index: linux/tools/power/cpupower/bench/system.c +=================================================================== +--- linux.orig/tools/power/cpupower/bench/system.c ++++ linux/tools/power/cpupower/bench/system.c +@@ -58,12 +58,19 @@ long long int get_time() + + int set_cpufreq_governor(char *governor, unsigned int cpu) + { ++ int rc; + + dprintf("set %s as cpufreq governor\n", governor); + +- if (cpupower_is_cpu_online(cpu) != 1) { +- perror("cpufreq_cpu_exists"); +- fprintf(stderr, "error: cpu %u does not exist\n", cpu); ++ rc = cpupower_is_cpu_online(cpu); ++ if (rc != 1) { ++ if (rc < 0) ++ fprintf(stderr, "cpupower_is_cpu_online: %s\n", ++ strerror(-rc)); ++ else ++ fprintf(stderr, ++ "error: cpu %u is offline or does not exist\n", ++ cpu); + return -1; + } + diff --git a/debian/patches/bugfix/all/disable-some-marvell-phys.patch b/debian/patches/bugfix/all/disable-some-marvell-phys.patch new file mode 100644 index 000000000..297b38c56 --- /dev/null +++ b/debian/patches/bugfix/all/disable-some-marvell-phys.patch @@ -0,0 +1,93 @@ +From: Ian Campbell <ijc@hellion.org.uk> +Subject: phy/marvell: disable 4-port phys +Date: Wed, 20 Nov 2013 08:30:14 +0000 +Bug-Debian: https://bugs.debian.org/723177 +Forwarded: http://thread.gmane.org/gmane.linux.debian.devel.bugs.general/1107774/ + +The Marvell PHY was originally disabled because it can cause networking +failures on some systems. According to Lennert Buytenhek this is because some +of the variants added did not share the same register layout. Since the known +cases are all 4-ports disable those variants (indicated by a 4 in the +penultimate position of the model name) until they can be audited for +correctness. + +[bwh: Also #if-out the init functions for these PHYs to avoid + compiler warnings] + +Index: linux/drivers/net/phy/marvell.c +=================================================================== +--- linux.orig/drivers/net/phy/marvell.c ++++ linux/drivers/net/phy/marvell.c +@@ -950,6 +950,7 @@ static int m88e1118_config_init(struct p + return genphy_soft_reset(phydev); + } + ++#if 0 + static int m88e1149_config_init(struct phy_device *phydev) + { + int err; +@@ -975,7 +976,9 @@ static int m88e1149_config_init(struct p + + return genphy_soft_reset(phydev); + } ++#endif + ++#if 0 + static int m88e1145_config_init_rgmii(struct phy_device *phydev) + { + int err; +@@ -1050,6 +1053,7 @@ static int m88e1145_config_init(struct p + + return 0; + } ++#endif + + /* The VOD can be out of specification on link up. Poke an + * undocumented register, in an undocumented page, with a magic value +@@ -2165,6 +2169,7 @@ static struct phy_driver marvell_drivers + .get_strings = marvell_get_strings, + .get_stats = marvell_get_stats, + }, ++#if 0 + { + .phy_id = MARVELL_PHY_ID_88E1145, + .phy_id_mask = MARVELL_PHY_ID_MASK, +@@ -2185,6 +2190,8 @@ static struct phy_driver marvell_drivers + .get_strings = marvell_get_strings, + .get_stats = marvell_get_stats, + }, ++#endif ++#if 0 + { + .phy_id = MARVELL_PHY_ID_88E1149R, + .phy_id_mask = MARVELL_PHY_ID_MASK, +@@ -2204,6 +2211,8 @@ static struct phy_driver marvell_drivers + .get_strings = marvell_get_strings, + .get_stats = marvell_get_stats, + }, ++#endif ++#if 0 + { + .phy_id = MARVELL_PHY_ID_88E1240, + .phy_id_mask = MARVELL_PHY_ID_MASK, +@@ -2223,6 +2232,7 @@ static struct phy_driver marvell_drivers + .get_strings = marvell_get_strings, + .get_stats = marvell_get_stats, + }, ++#endif + { + .phy_id = MARVELL_PHY_ID_88E1116R, + .phy_id_mask = MARVELL_PHY_ID_MASK, +@@ -2359,9 +2369,9 @@ static struct mdio_device_id __maybe_unu + { MARVELL_PHY_ID_88E1111, MARVELL_PHY_ID_MASK }, + { MARVELL_PHY_ID_88E1118, MARVELL_PHY_ID_MASK }, + { MARVELL_PHY_ID_88E1121R, MARVELL_PHY_ID_MASK }, +- { MARVELL_PHY_ID_88E1145, MARVELL_PHY_ID_MASK }, +- { MARVELL_PHY_ID_88E1149R, MARVELL_PHY_ID_MASK }, +- { MARVELL_PHY_ID_88E1240, MARVELL_PHY_ID_MASK }, ++/* { MARVELL_PHY_ID_88E1145, MARVELL_PHY_ID_MASK }, */ ++/* { MARVELL_PHY_ID_88E1149R, MARVELL_PHY_ID_MASK }, */ ++/* { MARVELL_PHY_ID_88E1240, MARVELL_PHY_ID_MASK }, */ + { MARVELL_PHY_ID_88E1318S, MARVELL_PHY_ID_MASK }, + { MARVELL_PHY_ID_88E1116R, MARVELL_PHY_ID_MASK }, + { MARVELL_PHY_ID_88E1510, MARVELL_PHY_ID_MASK }, diff --git a/debian/patches/bugfix/all/documentation-media-uapi-explicitly-say-there-are-no-invariant-sections.patch b/debian/patches/bugfix/all/documentation-media-uapi-explicitly-say-there-are-no-invariant-sections.patch new file mode 100644 index 000000000..97e5d0a64 --- /dev/null +++ b/debian/patches/bugfix/all/documentation-media-uapi-explicitly-say-there-are-no-invariant-sections.patch @@ -0,0 +1,52 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 23 Nov 2018 13:38:34 -0500 +Subject: media: Documentation/media: uapi: Explicitly say there are no + Invariant Sections +Origin: https://git.kernel.org/linus/861c56c13d817b76e802d664e6ce7edb09cb9417 +Bug-Debian: https://bugs.debian.org/698668 + +The GNU Free Documentation License allows for a work to specify +Invariant Sections that are not allowed to be modified. (Debian +considers that this makes such works non-free.) + +The Linux Media Infrastructure userspace API documentation does not +specify any such sections, but it also doesn't say there are none (as +is recommended by the license text). Make it explicit that there are +none. + +Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com> +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> +Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> +Signed-off-by: Johannes Stezenbach <js@linuxtv.org> +Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> +Signed-off-by: Marcus Metzler <mocm@metzlerbros.de> +Signed-off-by: Michael Ira Krufky <mkrufky@gmail.com> +Signed-off-by: Ralph Metzler <rjkm@metzlerbros.de> +Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> +Signed-off-by: Sean Young <sean@mess.org> +Signed-off-by: Sylwester Nawrocki <snawrocki@kernel.org> +Cc: Thomas Gleixner <tglx@linutronix.de> +Cc: Kate Stewart <kstewart@linuxfoundation.org> +Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> +--- + Documentation/media/media_uapi.rst | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: linux/Documentation/media/media_uapi.rst +=================================================================== +--- linux.orig/Documentation/media/media_uapi.rst ++++ linux/Documentation/media/media_uapi.rst +@@ -10,9 +10,9 @@ Linux Media Infrastructure userspace API + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation. A copy of +-the license is included in the chapter entitled "GNU Free Documentation +-License". ++any later version published by the Free Software Foundation, with no ++Invariant Sections. A copy of the license is included in the chapter ++entitled "GNU Free Documentation License". + + .. only:: html + diff --git a/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch b/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch new file mode 100644 index 000000000..633c5c34c --- /dev/null +++ b/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch @@ -0,0 +1,2895 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Subject: firmware: Remove redundant log messages from drivers +Date: Sun, 09 Dec 2012 16:40:31 +0000 +Forwarded: no + +Now that firmware_class logs every success and failure consistently, +many other log messages can be removed from drivers. + +This will probably need to be split up into multiple patches prior to +upstream submission. + +Index: linux/arch/arm/mach-netx/xc.c +=================================================================== +--- linux.orig/arch/arm/mach-netx/xc.c ++++ linux/arch/arm/mach-netx/xc.c +@@ -127,10 +127,8 @@ int xc_request_firmware(struct xc *x) + + ret = request_firmware(&fw, name, x->dev); + +- if (ret < 0) { +- dev_err(x->dev, "request_firmware failed\n"); ++ if (ret) + return ret; +- } + + head = (struct fw_header *)fw->data; + if (head->magic != 0x4e657458) { +Index: linux/arch/x86/kernel/cpu/microcode/amd.c +=================================================================== +--- linux.orig/arch/x86/kernel/cpu/microcode/amd.c ++++ linux/arch/x86/kernel/cpu/microcode/amd.c +@@ -755,10 +755,8 @@ static enum ucode_state request_microcod + if (c->x86 >= 0x15) + snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); + +- if (request_firmware_direct(&fw, (const char *)fw_name, device)) { +- pr_debug("failed to load file %s\n", fw_name); ++ if (request_firmware_direct(&fw, (const char *)fw_name, device)) + goto out; +- } + + ret = UCODE_ERROR; + if (*(u32 *)fw->data != UCODE_MAGIC) { +Index: linux/drivers/atm/ambassador.c +=================================================================== +--- linux.orig/drivers/atm/ambassador.c ++++ linux/drivers/atm/ambassador.c +@@ -1929,10 +1929,8 @@ static int ucode_init(loader_block *lb, + int res; + + res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev); +- if (res) { +- PRINTK (KERN_ERR, "Cannot load microcode data"); ++ if (res) + return res; +- } + + /* First record contains just the start address */ + rec = (const struct ihex_binrec *)fw->data; +Index: linux/drivers/atm/fore200e.c +=================================================================== +--- linux.orig/drivers/atm/fore200e.c ++++ linux/drivers/atm/fore200e.c +@@ -2505,10 +2505,9 @@ static int fore200e_load_and_start_fw(st + return err; + + sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT); +- if ((err = request_firmware(&firmware, buf, device)) < 0) { +- printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name); ++ err = request_firmware(&firmware, buf, device); ++ if (err) + return err; +- } + + fw_data = (const __le32 *)firmware->data; + fw_size = firmware->size / sizeof(u32); +Index: linux/drivers/bluetooth/ath3k.c +=================================================================== +--- linux.orig/drivers/bluetooth/ath3k.c ++++ linux/drivers/bluetooth/ath3k.c +@@ -430,10 +430,8 @@ static int ath3k_load_patch(struct usb_d + le32_to_cpu(fw_version.rom_version)); + + ret = request_firmware(&firmware, filename, &udev->dev); +- if (ret < 0) { +- BT_ERR("Patch file not found %s", filename); ++ if (ret) + return ret; +- } + + pt_rom_version = get_unaligned_le32(firmware->data + + firmware->size - 8); +@@ -493,10 +491,8 @@ static int ath3k_load_syscfg(struct usb_ + le32_to_cpu(fw_version.rom_version), clk_value, ".dfu"); + + ret = request_firmware(&firmware, filename, &udev->dev); +- if (ret < 0) { +- BT_ERR("Configuration file not found %s", filename); ++ if (ret) + return ret; +- } + + ret = ath3k_load_fwfile(udev, firmware); + release_firmware(firmware); +Index: linux/drivers/bluetooth/bcm203x.c +=================================================================== +--- linux.orig/drivers/bluetooth/bcm203x.c ++++ linux/drivers/bluetooth/bcm203x.c +@@ -189,7 +189,6 @@ static int bcm203x_probe(struct usb_inte + return -ENOMEM; + + if (request_firmware(&firmware, "BCM2033-MD.hex", &udev->dev) < 0) { +- BT_ERR("Mini driver request failed"); + usb_free_urb(data->urb); + return -EIO; + } +@@ -214,7 +213,6 @@ static int bcm203x_probe(struct usb_inte + release_firmware(firmware); + + if (request_firmware(&firmware, "BCM2033-FW.bin", &udev->dev) < 0) { +- BT_ERR("Firmware request failed"); + usb_free_urb(data->urb); + kfree(data->buffer); + return -EIO; +Index: linux/drivers/bluetooth/bfusb.c +=================================================================== +--- linux.orig/drivers/bluetooth/bfusb.c ++++ linux/drivers/bluetooth/bfusb.c +@@ -652,10 +652,8 @@ static int bfusb_probe(struct usb_interf + skb_queue_head_init(&data->pending_q); + skb_queue_head_init(&data->completed_q); + +- if (request_firmware(&firmware, "bfubase.frm", &udev->dev) < 0) { +- BT_ERR("Firmware request failed"); ++ if (request_firmware(&firmware, "bfubase.frm", &udev->dev)) + goto done; +- } + + BT_DBG("firmware data %p size %zu", firmware->data, firmware->size); + +Index: linux/drivers/bluetooth/bt3c_cs.c +=================================================================== +--- linux.orig/drivers/bluetooth/bt3c_cs.c ++++ linux/drivers/bluetooth/bt3c_cs.c +@@ -566,10 +566,8 @@ static int bt3c_open(struct bt3c_info *i + + /* Load firmware */ + err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev); +- if (err < 0) { +- BT_ERR("Firmware request failed"); ++ if (err) + goto error; +- } + + err = bt3c_load_firmware(info, firmware->data, firmware->size); + +Index: linux/drivers/bluetooth/btmrvl_sdio.c +=================================================================== +--- linux.orig/drivers/bluetooth/btmrvl_sdio.c ++++ linux/drivers/bluetooth/btmrvl_sdio.c +@@ -455,8 +455,6 @@ static int btmrvl_sdio_download_helper(s + ret = request_firmware(&fw_helper, card->helper, + &card->func->dev); + if ((ret < 0) || !fw_helper) { +- BT_ERR("request_firmware(helper) failed, error code = %d", +- ret); + ret = -ENOENT; + goto done; + } +@@ -555,8 +553,6 @@ static int btmrvl_sdio_download_fw_w_hel + ret = request_firmware(&fw_firmware, card->firmware, + &card->func->dev); + if ((ret < 0) || !fw_firmware) { +- BT_ERR("request_firmware(firmware) failed, error code = %d", +- ret); + ret = -ENOENT; + goto done; + } +Index: linux/drivers/char/dsp56k.c +=================================================================== +--- linux.orig/drivers/char/dsp56k.c ++++ linux/drivers/char/dsp56k.c +@@ -140,11 +140,8 @@ static int dsp56k_upload(u_char __user * + } + err = request_firmware(&fw, fw_name, &pdev->dev); + platform_device_unregister(pdev); +- if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fw_name, err); ++ if (err) + return err; +- } + if (fw->size % 3) { + printk(KERN_ERR "Bogus length %d in image \"%s\"\n", + fw->size, fw_name); +Index: linux/drivers/dma/imx-sdma.c +=================================================================== +--- linux.orig/drivers/dma/imx-sdma.c ++++ linux/drivers/dma/imx-sdma.c +@@ -1674,11 +1674,8 @@ static void sdma_load_firmware(const str + const struct sdma_script_start_addrs *addr; + unsigned short *ram_code; + +- if (!fw) { +- dev_info(sdma->dev, "external firmware not found, using ROM firmware\n"); +- /* In this case we just use the ROM firmware. */ ++ if (!fw) + return; +- } + + if (fw->size < sizeof(*header)) + goto err_firmware; +Index: linux/drivers/gpu/drm/mga/mga_warp.c +=================================================================== +--- linux.orig/drivers/gpu/drm/mga/mga_warp.c ++++ linux/drivers/gpu/drm/mga/mga_warp.c +@@ -79,11 +79,8 @@ int mga_warp_install_microcode(drm_mga_p + } + rc = request_ihex_firmware(&fw, firmware_name, &pdev->dev); + platform_device_unregister(pdev); +- if (rc) { +- DRM_ERROR("mga: Failed to load microcode \"%s\"\n", +- firmware_name); ++ if (rc) + return rc; +- } + + size = 0; + where = 0; +Index: linux/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c +=================================================================== +--- linux.orig/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c ++++ linux/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c +@@ -1920,10 +1920,8 @@ gf100_gr_ctor_fw_legacy(struct gf100_gr + if (ret) { + snprintf(f, sizeof(f), "nouveau/%s", fwname); + ret = request_firmware(&fw, f, device->dev); +- if (ret) { +- nvkm_error(subdev, "failed to load %s\n", fwname); ++ if (ret) + return ret; +- } + } + + fuc->size = fw->size; +Index: linux/drivers/gpu/drm/r128/r128_cce.c +=================================================================== +--- linux.orig/drivers/gpu/drm/r128/r128_cce.c ++++ linux/drivers/gpu/drm/r128/r128_cce.c +@@ -154,11 +154,8 @@ static int r128_cce_load_microcode(drm_r + } + rc = request_firmware(&fw, FIRMWARE_NAME, &pdev->dev); + platform_device_unregister(pdev); +- if (rc) { +- pr_err("r128_cce: Failed to load firmware \"%s\"\n", +- FIRMWARE_NAME); ++ if (rc) + return rc; +- } + + if (fw->size != 256 * 8) { + pr_err("r128_cce: Bogus length %zu in firmware \"%s\"\n", +Index: linux/drivers/gpu/drm/radeon/ni.c +=================================================================== +--- linux.orig/drivers/gpu/drm/radeon/ni.c ++++ linux/drivers/gpu/drm/radeon/ni.c +@@ -830,9 +830,6 @@ int ni_init_microcode(struct radeon_devi + + out: + if (err) { +- if (err != -EINVAL) +- pr_err("ni_cp: Failed to load firmware \"%s\"\n", +- fw_name); + release_firmware(rdev->pfp_fw); + rdev->pfp_fw = NULL; + release_firmware(rdev->me_fw); +Index: linux/drivers/gpu/drm/radeon/r100.c +=================================================================== +--- linux.orig/drivers/gpu/drm/radeon/r100.c ++++ linux/drivers/gpu/drm/radeon/r100.c +@@ -1041,9 +1041,7 @@ static int r100_cp_init_microcode(struct + } + + err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); +- if (err) { +- pr_err("radeon_cp: Failed to load firmware \"%s\"\n", fw_name); +- } else if (rdev->me_fw->size % 8) { ++ if (err == 0 && rdev->me_fw->size % 8) { + pr_err("radeon_cp: Bogus length %zu in firmware \"%s\"\n", + rdev->me_fw->size, fw_name); + err = -EINVAL; +Index: linux/drivers/gpu/drm/radeon/r600.c +=================================================================== +--- linux.orig/drivers/gpu/drm/radeon/r600.c ++++ linux/drivers/gpu/drm/radeon/r600.c +@@ -2593,9 +2593,6 @@ int r600_init_microcode(struct radeon_de + + out: + if (err) { +- if (err != -EINVAL) +- pr_err("r600_cp: Failed to load firmware \"%s\"\n", +- fw_name); + release_firmware(rdev->pfp_fw); + rdev->pfp_fw = NULL; + release_firmware(rdev->me_fw); +Index: linux/drivers/infiniband/hw/qib/qib_sd7220.c +=================================================================== +--- linux.orig/drivers/infiniband/hw/qib/qib_sd7220.c ++++ linux/drivers/infiniband/hw/qib/qib_sd7220.c +@@ -406,10 +406,8 @@ int qib_sd7220_init(struct qib_devdata * + } + + ret = request_firmware(&fw, SD7220_FW_NAME, &dd->pcidev->dev); +- if (ret) { +- qib_dev_err(dd, "Failed to load IB SERDES image\n"); ++ if (ret) + goto done; +- } + + /* Substitute our deduced value for was_reset */ + ret = qib_ibsd_ucode_loaded(dd->pport, fw); +Index: linux/drivers/input/touchscreen/atmel_mxt_ts.c +=================================================================== +--- linux.orig/drivers/input/touchscreen/atmel_mxt_ts.c ++++ linux/drivers/input/touchscreen/atmel_mxt_ts.c +@@ -2783,10 +2783,8 @@ static int mxt_load_fw(struct device *de + int ret; + + ret = request_firmware(&fw, fn, dev); +- if (ret) { +- dev_err(dev, "Unable to open firmware %s\n", fn); ++ if (ret) + return ret; +- } + + /* Check for incorrect enc file */ + ret = mxt_check_firmware_format(dev, fw); +Index: linux/drivers/isdn/hardware/mISDN/speedfax.c +=================================================================== +--- linux.orig/drivers/isdn/hardware/mISDN/speedfax.c ++++ linux/drivers/isdn/hardware/mISDN/speedfax.c +@@ -392,11 +392,8 @@ setup_instance(struct sfax_hw *card) + card->isar.owner = THIS_MODULE; + + err = request_firmware(&firmware, "isdn/ISAR.BIN", &card->pdev->dev); +- if (err < 0) { +- pr_info("%s: firmware request failed %d\n", +- card->name, err); ++ if (err) + goto error_fw; +- } + if (debug & DEBUG_HW) + pr_notice("%s: got firmware %zu bytes\n", + card->name, firmware->size); +Index: linux/drivers/media/tuners/tuner-xc2028.c +=================================================================== +--- linux.orig/drivers/media/tuners/tuner-xc2028.c ++++ linux/drivers/media/tuners/tuner-xc2028.c +@@ -1367,7 +1367,6 @@ static void load_firmware_cb(const struc + + tuner_dbg("request_firmware_nowait(): %s\n", fw ? "OK" : "error"); + if (!fw) { +- tuner_err("Could not load firmware %s.\n", priv->fname); + priv->state = XC2028_NODEV; + return; + } +Index: linux/drivers/media/usb/dvb-usb/dib0700_devices.c +=================================================================== +--- linux.orig/drivers/media/usb/dvb-usb/dib0700_devices.c ++++ linux/drivers/media/usb/dvb-usb/dib0700_devices.c +@@ -2416,12 +2416,9 @@ static int stk9090m_frontend_attach(stru + + dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80); + +- if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) { +- deb_info("%s: Upload failed. (file not found?)\n", __func__); ++ if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) + return -ENODEV; +- } else { +- deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); +- } ++ deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); + stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size; + stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data; + +@@ -2486,12 +2483,9 @@ static int nim9090md_frontend_attach(str + msleep(20); + dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); + +- if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) { +- deb_info("%s: Upload failed. (file not found?)\n", __func__); ++ if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) + return -EIO; +- } else { +- deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); +- } ++ deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); + nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size; + nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data; + nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size; +Index: linux/drivers/media/usb/dvb-usb/dvb-usb-firmware.c +=================================================================== +--- linux.orig/drivers/media/usb/dvb-usb/dvb-usb-firmware.c ++++ linux/drivers/media/usb/dvb-usb/dvb-usb-firmware.c +@@ -89,13 +89,9 @@ int dvb_usb_download_firmware(struct usb + int ret; + const struct firmware *fw = NULL; + +- if ((ret = request_firmware(&fw, props->firmware, &udev->dev)) != 0) { +- err("did not find the firmware file '%s' (status %d). You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware", +- props->firmware,ret); ++ ret = request_firmware(&fw, props->firmware, &udev->dev); ++ if (ret) + return ret; +- } +- +- info("downloading firmware from file '%s'",props->firmware); + + switch (props->usb_ctrl) { + case CYPRESS_AN2135: +Index: linux/drivers/media/usb/dvb-usb/gp8psk.c +=================================================================== +--- linux.orig/drivers/media/usb/dvb-usb/gp8psk.c ++++ linux/drivers/media/usb/dvb-usb/gp8psk.c +@@ -134,19 +134,14 @@ static int gp8psk_load_bcm4500fw(struct + const u8 *ptr; + u8 *buf; + if ((ret = request_firmware(&fw, bcm4500_firmware, +- &d->udev->dev)) != 0) { +- err("did not find the bcm4500 firmware file '%s' (status %d). You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware", +- bcm4500_firmware,ret); ++ &d->udev->dev)) != 0) + return ret; +- } + + ret = -EINVAL; + + if (gp8psk_usb_out_op(d, LOAD_BCM4500,1,0,NULL, 0)) + goto out_rel_fw; + +- info("downloading bcm4500 firmware from file '%s'",bcm4500_firmware); +- + ptr = fw->data; + buf = kmalloc(64, GFP_KERNEL); + if (!buf) { +Index: linux/drivers/media/usb/dvb-usb/opera1.c +=================================================================== +--- linux.orig/drivers/media/usb/dvb-usb/opera1.c ++++ linux/drivers/media/usb/dvb-usb/opera1.c +@@ -453,8 +453,6 @@ static int opera1_xilinx_load_firmware(s + info("start downloading fpga firmware %s",filename); + + if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) { +- err("did not find the firmware file '%s'. You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware", +- filename); + return ret; + } else { + p = kmalloc(fw->size, GFP_KERNEL); +Index: linux/drivers/media/dvb-frontends/af9013.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/af9013.c ++++ linux/drivers/media/dvb-frontends/af9013.c +@@ -1059,14 +1059,8 @@ static int af9013_download_firmware(stru + + /* Request the firmware, will block and timeout */ + ret = request_firmware(&firmware, name, &client->dev); +- if (ret) { +- dev_info(&client->dev, "firmware file '%s' not found %d\n", +- name, ret); ++ if (ret) + goto err; +- } +- +- dev_info(&client->dev, "downloading firmware from file '%s'\n", +- name); + + /* Write firmware checksum & size */ + for (i = 0; i < firmware->size; i++) +Index: linux/drivers/media/dvb-frontends/bcm3510.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/bcm3510.c ++++ linux/drivers/media/dvb-frontends/bcm3510.c +@@ -636,10 +636,9 @@ static int bcm3510_download_firmware(str + int ret,i; + + deb_info("requesting firmware\n"); +- if ((ret = st->config->request_firmware(fe, &fw, BCM3510_DEFAULT_FIRMWARE)) < 0) { +- err("could not load firmware (%s): %d",BCM3510_DEFAULT_FIRMWARE,ret); ++ ret = st->config->request_firmware(fe, &fw, BCM3510_DEFAULT_FIRMWARE); ++ if (ret) + return ret; +- } + deb_info("got firmware: %zu\n", fw->size); + + b = fw->data; +Index: linux/drivers/media/dvb-frontends/cx24116.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/cx24116.c ++++ linux/drivers/media/dvb-frontends/cx24116.c +@@ -491,13 +491,8 @@ static int cx24116_firmware_ondemand(str + __func__, CX24116_DEFAULT_FIRMWARE); + ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE, + state->i2c->dev.parent); +- printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", +- __func__); +- if (ret) { +- printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n", +- __func__); ++ if (ret) + return ret; +- } + + /* Make sure we don't recurse back through here + * during loading */ +Index: linux/drivers/media/dvb-frontends/drxd_hard.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/drxd_hard.c ++++ linux/drivers/media/dvb-frontends/drxd_hard.c +@@ -903,10 +903,8 @@ static int load_firmware(struct drxd_sta + { + const struct firmware *fw; + +- if (request_firmware(&fw, fw_name, state->dev) < 0) { +- printk(KERN_ERR "drxd: firmware load failure [%s]\n", fw_name); ++ if (request_firmware(&fw, fw_name, state->dev)) + return -EIO; +- } + + state->microcode = kmemdup(fw->data, fw->size, GFP_KERNEL); + if (!state->microcode) { +Index: linux/drivers/media/dvb-frontends/drxk_hard.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/drxk_hard.c ++++ linux/drivers/media/dvb-frontends/drxk_hard.c +@@ -6281,10 +6281,6 @@ static void load_firmware_cb(const struc + + dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded"); + if (!fw) { +- pr_err("Could not load firmware file %s.\n", +- state->microcode_name); +- pr_info("Copy %s to your hotplug directory!\n", +- state->microcode_name); + state->microcode_name = NULL; + + /* +Index: linux/drivers/media/dvb-frontends/ds3000.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/ds3000.c ++++ linux/drivers/media/dvb-frontends/ds3000.c +@@ -360,12 +360,8 @@ static int ds3000_firmware_ondemand(stru + DS3000_DEFAULT_FIRMWARE); + ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE, + state->i2c->dev.parent); +- printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__); +- if (ret) { +- printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n", +- __func__); ++ if (ret) + return ret; +- } + + ret = ds3000_load_firmware(fe, fw); + if (ret) +Index: linux/drivers/media/dvb-frontends/nxt200x.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/nxt200x.c ++++ linux/drivers/media/dvb-frontends/nxt200x.c +@@ -886,12 +886,8 @@ static int nxt2002_init(struct dvb_front + __func__, NXT2002_DEFAULT_FIRMWARE); + ret = request_firmware(&fw, NXT2002_DEFAULT_FIRMWARE, + state->i2c->dev.parent); +- pr_debug("%s: Waiting for firmware upload(2)...\n", __func__); +- if (ret) { +- pr_err("%s: No firmware uploaded (timeout or file not found?)\n", +- __func__); ++ if (ret) + return ret; +- } + + ret = nxt2002_load_firmware(fe, fw); + release_firmware(fw); +@@ -953,12 +949,8 @@ static int nxt2004_init(struct dvb_front + __func__, NXT2004_DEFAULT_FIRMWARE); + ret = request_firmware(&fw, NXT2004_DEFAULT_FIRMWARE, + state->i2c->dev.parent); +- pr_debug("%s: Waiting for firmware upload(2)...\n", __func__); +- if (ret) { +- pr_err("%s: No firmware uploaded (timeout or file not found?)\n", +- __func__); ++ if (ret) + return ret; +- } + + ret = nxt2004_load_firmware(fe, fw); + release_firmware(fw); +Index: linux/drivers/media/dvb-frontends/or51132.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/or51132.c ++++ linux/drivers/media/dvb-frontends/or51132.c +@@ -337,10 +337,8 @@ static int or51132_set_parameters(struct + printk("or51132: Waiting for firmware upload(%s)...\n", + fwname); + ret = request_firmware(&fw, fwname, state->i2c->dev.parent); +- if (ret) { +- printk(KERN_WARNING "or51132: No firmware uploaded(timeout or file not found?)\n"); ++ if (ret) + return ret; +- } + ret = or51132_load_firmware(fe, fw); + release_firmware(fw); + if (ret) { +Index: linux/drivers/media/dvb-frontends/or51211.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/or51211.c ++++ linux/drivers/media/dvb-frontends/or51211.c +@@ -371,11 +371,8 @@ static int or51211_init(struct dvb_front + OR51211_DEFAULT_FIRMWARE); + ret = config->request_firmware(fe, &fw, + OR51211_DEFAULT_FIRMWARE); +- pr_info("Got Hotplug firmware\n"); +- if (ret) { +- pr_warn("No firmware uploaded (timeout or file not found?)\n"); ++ if (ret) + return ret; +- } + + ret = or51211_load_firmware(fe, fw); + release_firmware(fw); +Index: linux/drivers/media/dvb-frontends/sp8870.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/sp8870.c ++++ linux/drivers/media/dvb-frontends/sp8870.c +@@ -315,10 +315,8 @@ static int sp8870_init (struct dvb_front + + /* request the firmware, this will block until someone uploads it */ + printk("sp8870: waiting for firmware upload (%s)...\n", SP8870_DEFAULT_FIRMWARE); +- if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE)) { +- printk("sp8870: no firmware upload (timeout or file not found?)\n"); ++ if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE)) + return -EIO; +- } + + if (sp8870_firmware_upload(state, fw)) { + printk("sp8870: writing firmware to device failed\n"); +Index: linux/drivers/media/dvb-frontends/sp887x.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/sp887x.c ++++ linux/drivers/media/dvb-frontends/sp887x.c +@@ -526,10 +526,8 @@ static int sp887x_init(struct dvb_fronte + /* request the firmware, this will block until someone uploads it */ + printk("sp887x: waiting for firmware upload (%s)...\n", SP887X_DEFAULT_FIRMWARE); + ret = state->config->request_firmware(fe, &fw, SP887X_DEFAULT_FIRMWARE); +- if (ret) { +- printk("sp887x: no firmware upload (timeout or file not found?)\n"); ++ if (ret) + return ret; +- } + + ret = sp887x_initial_setup(fe, fw); + release_firmware(fw); +Index: linux/drivers/media/dvb-frontends/tda10048.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/tda10048.c ++++ linux/drivers/media/dvb-frontends/tda10048.c +@@ -495,8 +495,6 @@ static int tda10048_firmware_upload(stru + ret = request_firmware(&fw, TDA10048_DEFAULT_FIRMWARE, + state->i2c->dev.parent); + if (ret) { +- printk(KERN_ERR "%s: Upload failed. (file not found?)\n", +- __func__); + return -EIO; + } else { + printk(KERN_INFO "%s: firmware read %zu bytes.\n", +Index: linux/drivers/media/dvb-frontends/tda1004x.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/tda1004x.c ++++ linux/drivers/media/dvb-frontends/tda1004x.c +@@ -401,10 +401,8 @@ static int tda10045_fwupload(struct dvb_ + /* request the firmware, this will block until someone uploads it */ + printk(KERN_INFO "tda1004x: waiting for firmware upload (%s)...\n", TDA10045_DEFAULT_FIRMWARE); + ret = state->config->request_firmware(fe, &fw, TDA10045_DEFAULT_FIRMWARE); +- if (ret) { +- printk(KERN_ERR "tda1004x: no firmware upload (timeout or file not found?)\n"); ++ if (ret) + return ret; +- } + + /* reset chip */ + tda1004x_write_mask(state, TDA1004X_CONFC4, 0x10, 0); +@@ -545,7 +543,6 @@ static int tda10046_fwupload(struct dvb_ + /* remain compatible to old bug: try to load with tda10045 image name */ + ret = state->config->request_firmware(fe, &fw, TDA10045_DEFAULT_FIRMWARE); + if (ret) { +- printk(KERN_ERR "tda1004x: no firmware upload (timeout or file not found?)\n"); + return ret; + } else { + printk(KERN_INFO "tda1004x: please rename the firmware file to %s\n", +Index: linux/drivers/media/dvb-frontends/tda10071.c +=================================================================== +--- linux.orig/drivers/media/dvb-frontends/tda10071.c ++++ linux/drivers/media/dvb-frontends/tda10071.c +@@ -850,12 +850,8 @@ static int tda10071_init(struct dvb_fron + + /* request the firmware, this will block and timeout */ + ret = request_firmware(&fw, fw_file, &client->dev); +- if (ret) { +- dev_err(&client->dev, +- "did not find the firmware file '%s' (status %d). You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware\n", +- fw_file, ret); ++ if (ret) + goto error; +- } + + /* init */ + for (i = 0; i < ARRAY_SIZE(tab2); i++) { +Index: linux/drivers/media/pci/ngene/ngene-core.c +=================================================================== +--- linux.orig/drivers/media/pci/ngene/ngene-core.c ++++ linux/drivers/media/pci/ngene/ngene-core.c +@@ -1253,19 +1253,14 @@ static int ngene_load_firm(struct ngene + break; + } + +- if (request_firmware(&fw, fw_name, &dev->pci_dev->dev) < 0) { +- dev_err(pdev, "Could not load firmware file %s.\n", fw_name); +- dev_info(pdev, "Copy %s to your hotplug directory!\n", +- fw_name); ++ if (request_firmware(&fw, fw_name, &dev->pci_dev->dev)) + return -1; +- } + if (size == 0) + size = fw->size; + if (size != fw->size) { + dev_err(pdev, "Firmware %s has invalid size!", fw_name); + err = -1; + } else { +- dev_info(pdev, "Loading firmware file %s.\n", fw_name); + ngene_fw = (u8 *) fw->data; + err = ngene_command_load_firmware(dev, ngene_fw, size); + } +Index: linux/drivers/media/common/siano/smscoreapi.c +=================================================================== +--- linux.orig/drivers/media/common/siano/smscoreapi.c ++++ linux/drivers/media/common/siano/smscoreapi.c +@@ -1164,10 +1164,8 @@ static int smscore_load_firmware_from_fi + return -EINVAL; + + rc = request_firmware(&fw, fw_filename, coredev->device); +- if (rc < 0) { +- pr_err("failed to open firmware file '%s'\n", fw_filename); ++ if (rc < 0) + return rc; +- } + pr_debug("read fw %s, buffer size=0x%zx\n", fw_filename, fw->size); + fw_buf = kmalloc(ALIGN(fw->size + sizeof(struct sms_firmware), + SMS_ALLOC_ALIGNMENT), GFP_KERNEL | coredev->gfp_buf_flags); +Index: linux/drivers/media/pci/ttpci/av7110.c +=================================================================== +--- linux.orig/drivers/media/pci/ttpci/av7110.c ++++ linux/drivers/media/pci/ttpci/av7110.c +@@ -1516,13 +1516,8 @@ static int get_firmware(struct av7110* a + /* request the av7110 firmware, this will block until someone uploads it */ + ret = request_firmware(&fw, "dvb-ttpci-01.fw", &av7110->dev->pci->dev); + if (ret) { +- if (ret == -ENOENT) { +- printk(KERN_ERR "dvb-ttpci: could not load firmware, file not found: dvb-ttpci-01.fw\n"); +- printk(KERN_ERR "dvb-ttpci: usually this should be in /usr/lib/hotplug/firmware or /lib/firmware\n"); +- printk(KERN_ERR "dvb-ttpci: and can be downloaded from https://linuxtv.org/download/dvb/firmware/\n"); +- } else +- printk(KERN_ERR "dvb-ttpci: cannot request firmware (error %i)\n", +- ret); ++ if (ret == -ENOENT) ++ printk(KERN_ERR "dvb-ttpci: firmware can be downloaded from https://linuxtv.org/download/dvb/firmware/\n"); + return -EINVAL; + } + +Index: linux/drivers/media/pci/ttpci/av7110_hw.c +=================================================================== +--- linux.orig/drivers/media/pci/ttpci/av7110_hw.c ++++ linux/drivers/media/pci/ttpci/av7110_hw.c +@@ -247,11 +247,8 @@ int av7110_bootarm(struct av7110 *av7110 + //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT); + + ret = request_firmware(&fw, fw_name, &dev->pci->dev); +- if (ret) { +- printk(KERN_ERR "dvb-ttpci: Failed to load firmware \"%s\"\n", +- fw_name); ++ if (ret) + return ret; +- } + + mwdebi(av7110, DEBISWAB, DPRAM_BASE, fw->data, fw->size); + release_firmware(fw); +Index: linux/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c +=================================================================== +--- linux.orig/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c ++++ linux/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c +@@ -295,10 +295,8 @@ static int ttusb_boot_dsp(struct ttusb * + + err = request_firmware(&fw, "ttusb-budget/dspbootcode.bin", + &ttusb->dev->dev); +- if (err) { +- printk(KERN_ERR "ttusb-budget: failed to request firmware\n"); ++ if (err) + return err; +- } + + /* BootBlock */ + b[0] = 0xaa; +Index: linux/drivers/media/usb/ttusb-dec/ttusb_dec.c +=================================================================== +--- linux.orig/drivers/media/usb/ttusb-dec/ttusb_dec.c ++++ linux/drivers/media/usb/ttusb-dec/ttusb_dec.c +@@ -1334,11 +1334,8 @@ static int ttusb_dec_boot_dsp(struct ttu + dprintk("%s\n", __func__); + + result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev); +- if (result) { +- printk(KERN_ERR "%s: Firmware (%s) unavailable.\n", +- __func__, dec->firmware_name); ++ if (result) + return result; +- } + + firmware = fw_entry->data; + firmware_size = fw_entry->size; +Index: linux/drivers/media/radio/radio-wl1273.c +=================================================================== +--- linux.orig/drivers/media/radio/radio-wl1273.c ++++ linux/drivers/media/radio/radio-wl1273.c +@@ -510,11 +510,8 @@ static int wl1273_fm_upload_firmware_pat + * Uploading the firmware patch is not always necessary, + * so we only print an info message. + */ +- if (request_firmware(&fw_p, fw_name, dev)) { +- dev_info(dev, "%s - %s not found\n", __func__, fw_name); +- ++ if (request_firmware(&fw_p, fw_name, dev)) + return 0; +- } + + ptr = (__u8 *) fw_p->data; + packet_num = ptr[0]; +Index: linux/drivers/media/radio/wl128x/fmdrv_common.c +=================================================================== +--- linux.orig/drivers/media/radio/wl128x/fmdrv_common.c ++++ linux/drivers/media/radio/wl128x/fmdrv_common.c +@@ -1245,10 +1245,8 @@ static int fm_download_firmware(struct f + + ret = request_firmware(&fw_entry, fw_name, + &fmdev->radio_dev->dev); +- if (ret < 0) { +- fmerr("Unable to read firmware(%s) content\n", fw_name); ++ if (ret) + return ret; +- } + fmdbg("Firmware(%s) length : %zu bytes\n", fw_name, fw_entry->size); + + fw_data = (void *)fw_entry->data; +Index: linux/drivers/media/pci/bt8xx/bttv-cards.c +=================================================================== +--- linux.orig/drivers/media/pci/bt8xx/bttv-cards.c ++++ linux/drivers/media/pci/bt8xx/bttv-cards.c +@@ -3916,10 +3916,8 @@ static int pvr_boot(struct bttv *btv) + int rc; + + rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev); +- if (rc != 0) { +- pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr); ++ if (rc != 0) + return rc; +- } + rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size); + pr_info("%d: altera firmware upload %s\n", + btv->c.nr, (rc < 0) ? "failed" : "ok"); +Index: linux/drivers/media/usb/cpia2/cpia2_core.c +=================================================================== +--- linux.orig/drivers/media/usb/cpia2/cpia2_core.c ++++ linux/drivers/media/usb/cpia2/cpia2_core.c +@@ -921,11 +921,8 @@ static int apply_vp_patch(struct camera_ + struct cpia2_command cmd; + + ret = request_firmware(&fw, fw_name, &cam->dev->dev); +- if (ret) { +- printk(KERN_ERR "cpia2: failed to load VP patch \"%s\"\n", +- fw_name); ++ if (ret) + return ret; +- } + + cmd.req_mode = CAMERAACCESS_TYPE_REPEAT | CAMERAACCESS_VP; + cmd.direction = TRANSFER_WRITE; +Index: linux/drivers/media/pci/cx18/cx18-av-firmware.c +=================================================================== +--- linux.orig/drivers/media/pci/cx18/cx18-av-firmware.c ++++ linux/drivers/media/pci/cx18/cx18-av-firmware.c +@@ -79,10 +79,8 @@ int cx18_av_loadfw(struct cx18 *cx) + int i; + int retries1 = 0; + +- if (request_firmware(&fw, FWFILE, &cx->pci_dev->dev) != 0) { +- CX18_ERR_DEV(sd, "unable to open firmware %s\n", FWFILE); ++ if (request_firmware(&fw, FWFILE, &cx->pci_dev->dev) != 0) + return -EINVAL; +- } + + /* The firmware load often has byte errors, so allow for several + retries, both at byte level and at the firmware load level. */ +Index: linux/drivers/media/pci/cx18/cx18-dvb.c +=================================================================== +--- linux.orig/drivers/media/pci/cx18/cx18-dvb.c ++++ linux/drivers/media/pci/cx18/cx18-dvb.c +@@ -137,9 +137,7 @@ static int yuan_mpc718_mt352_reqfw(struc + int ret; + + ret = request_firmware(fw, fn, &cx->pci_dev->dev); +- if (ret) +- CX18_ERR("Unable to open firmware file %s\n", fn); +- else { ++ if (!ret) { + size_t sz = (*fw)->size; + if (sz < 2 || sz > 64 || (sz % 2) != 0) { + CX18_ERR("Firmware %s has a bad size: %lu bytes\n", +Index: linux/drivers/media/pci/cx18/cx18-firmware.c +=================================================================== +--- linux.orig/drivers/media/pci/cx18/cx18-firmware.c ++++ linux/drivers/media/pci/cx18/cx18-firmware.c +@@ -101,11 +101,8 @@ static int load_cpu_fw_direct(const char + u32 __iomem *dst = (u32 __iomem *)mem; + const u32 *src; + +- if (request_firmware(&fw, fn, &cx->pci_dev->dev)) { +- CX18_ERR("Unable to open firmware %s\n", fn); +- CX18_ERR("Did you put the firmware in the hotplug firmware directory?\n"); ++ if (request_firmware(&fw, fn, &cx->pci_dev->dev)) + return -ENOMEM; +- } + + src = (const u32 *)fw->data; + +@@ -146,8 +143,6 @@ static int load_apu_fw_direct(const char + int sz; + + if (request_firmware(&fw, fn, &cx->pci_dev->dev)) { +- CX18_ERR("unable to open firmware %s\n", fn); +- CX18_ERR("did you put the firmware in the hotplug firmware directory?\n"); + cx18_setup_page(cx, 0); + return -ENOMEM; + } +Index: linux/drivers/media/usb/cx231xx/cx231xx-417.c +=================================================================== +--- linux.orig/drivers/media/usb/cx231xx/cx231xx-417.c ++++ linux/drivers/media/usb/cx231xx/cx231xx-417.c +@@ -996,11 +996,6 @@ static int cx231xx_load_firmware(struct + dev->dev); + + if (retval != 0) { +- dev_err(dev->dev, +- "ERROR: Hotplug firmware request failed (%s).\n", +- CX231xx_FIRM_IMAGE_NAME); +- dev_err(dev->dev, +- "Please fix your hotplug setup, the board will not work without firmware loaded!\n"); + vfree(p_current_fw); + vfree(p_buffer); + return retval; +Index: linux/drivers/media/pci/cx23885/cx23885-417.c +=================================================================== +--- linux.orig/drivers/media/pci/cx23885/cx23885-417.c ++++ linux/drivers/media/pci/cx23885/cx23885-417.c +@@ -929,12 +929,8 @@ static int cx23885_load_firmware(struct + retval = request_firmware(&firmware, CX23885_FIRM_IMAGE_NAME, + &dev->pci->dev); + +- if (retval != 0) { +- pr_err("ERROR: Hotplug firmware request failed (%s).\n", +- CX23885_FIRM_IMAGE_NAME); +- pr_err("Please fix your hotplug setup, the board will not work without firmware loaded!\n"); ++ if (retval != 0) + return -1; +- } + + if (firmware->size != CX23885_FIRM_IMAGE_SIZE) { + pr_err("ERROR: Firmware size mismatch (have %zu, expected %d)\n", +Index: linux/drivers/media/pci/cx23885/cx23885-cards.c +=================================================================== +--- linux.orig/drivers/media/pci/cx23885/cx23885-cards.c ++++ linux/drivers/media/pci/cx23885/cx23885-cards.c +@@ -2425,10 +2425,7 @@ void cx23885_card_setup(struct cx23885_d + cinfo.rev, filename); + + ret = request_firmware(&fw, filename, &dev->pci->dev); +- if (ret != 0) +- pr_err("did not find the firmware file '%s'. You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware.", +- filename); +- else ++ if (ret == 0) + altera_init(&netup_config, fw); + + release_firmware(fw); +Index: linux/drivers/media/i2c/cx25840/cx25840-firmware.c +=================================================================== +--- linux.orig/drivers/media/i2c/cx25840/cx25840-firmware.c ++++ linux/drivers/media/i2c/cx25840/cx25840-firmware.c +@@ -122,10 +122,8 @@ int cx25840_loadfw(struct i2c_client *cl + if (is_cx231xx(state) && max_buf_size > 16) + max_buf_size = 16; + +- if (request_firmware(&fw, fwname, FWDEV(client)) != 0) { +- v4l_err(client, "unable to open firmware %s\n", fwname); ++ if (request_firmware(&fw, fwname, FWDEV(client)) != 0) + return -EINVAL; +- } + + start_fw_load(client); + +Index: linux/drivers/media/pci/cx88/cx88-blackbird.c +=================================================================== +--- linux.orig/drivers/media/pci/cx88/cx88-blackbird.c ++++ linux/drivers/media/pci/cx88/cx88-blackbird.c +@@ -471,12 +471,8 @@ static int blackbird_load_firmware(struc + retval = request_firmware(&firmware, CX2341X_FIRM_ENC_FILENAME, + &dev->pci->dev); + +- if (retval != 0) { +- pr_err("Hotplug firmware request failed (%s).\n", +- CX2341X_FIRM_ENC_FILENAME); +- pr_err("Please fix your hotplug setup, the board will not work without firmware loaded!\n"); ++ if (retval != 0) + return -EIO; +- } + + if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) { + pr_err("Firmware size mismatch (have %zd, expected %d)\n", +Index: linux/drivers/media/usb/gspca/vicam.c +=================================================================== +--- linux.orig/drivers/media/usb/gspca/vicam.c ++++ linux/drivers/media/usb/gspca/vicam.c +@@ -239,10 +239,8 @@ static int sd_init(struct gspca_dev *gsp + + ret = request_ihex_firmware(&fw, VICAM_FIRMWARE, + &gspca_dev->dev->dev); +- if (ret) { +- pr_err("Failed to load \"vicam/firmware.fw\": %d\n", ret); ++ if (ret) + return ret; +- } + + firmware_buf = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!firmware_buf) { +Index: linux/drivers/media/pci/ivtv/ivtv-firmware.c +=================================================================== +--- linux.orig/drivers/media/pci/ivtv/ivtv-firmware.c ++++ linux/drivers/media/pci/ivtv/ivtv-firmware.c +@@ -80,8 +80,6 @@ retry: + release_firmware(fw); + return size; + } +- IVTV_ERR("Unable to open firmware %s (must be %ld bytes)\n", fn, size); +- IVTV_ERR("Did you put the firmware in the hotplug firmware directory?\n"); + return -ENOMEM; + } + +Index: linux/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +=================================================================== +--- linux.orig/drivers/media/usb/pvrusb2/pvrusb2-hdw.c ++++ linux/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +@@ -1379,25 +1379,6 @@ static int pvr2_locate_firmware(struct p + "request_firmware fatal error with code=%d",ret); + return ret; + } +- pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "***WARNING*** Device %s firmware seems to be missing.", +- fwtypename); +- pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "Did you install the pvrusb2 firmware files in their proper location?"); +- if (fwcount == 1) { +- pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "request_firmware unable to locate %s file %s", +- fwtypename,fwnames[0]); +- } else { +- pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "request_firmware unable to locate one of the following %s files:", +- fwtypename); +- for (idx = 0; idx < fwcount; idx++) { +- pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "request_firmware: Failed to find %s", +- fwnames[idx]); +- } +- } + return ret; + } + +Index: linux/drivers/media/usb/s2255/s2255drv.c +=================================================================== +--- linux.orig/drivers/media/usb/s2255/s2255drv.c ++++ linux/drivers/media/usb/s2255/s2255drv.c +@@ -2298,10 +2298,8 @@ static int s2255_probe(struct usb_interf + } + /* load the first chunk */ + if (request_firmware(&dev->fw_data->fw, +- FIRMWARE_FILE_NAME, &dev->udev->dev)) { +- dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n"); ++ FIRMWARE_FILE_NAME, &dev->udev->dev)) + goto errorREQFW; +- } + /* check the firmware is valid */ + fw_size = dev->fw_data->fw->size; + pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8]; +Index: linux/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c +=================================================================== +--- linux.orig/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c ++++ linux/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c +@@ -69,10 +69,8 @@ int s5p_mfc_load_firmware(struct s5p_mfc + } + } + +- if (err != 0) { +- mfc_err("Firmware is not present in the /lib/firmware directory nor compiled in kernel\n"); ++ if (err != 0) + return -EINVAL; +- } + if (fw_blob->size > dev->fw_buf.size) { + mfc_err("MFC firmware is too big to be loaded\n"); + release_firmware(fw_blob); +Index: linux/drivers/media/pci/saa7164/saa7164-fw.c +=================================================================== +--- linux.orig/drivers/media/pci/saa7164/saa7164-fw.c ++++ linux/drivers/media/pci/saa7164/saa7164-fw.c +@@ -416,11 +416,8 @@ int saa7164_downloadfirmware(struct saa7 + __func__, fwname); + + ret = request_firmware(&fw, fwname, &dev->pci->dev); +- if (ret) { +- printk(KERN_ERR "%s() Upload failed. (file not found?)\n", +- __func__); ++ if (ret) + return -ENOMEM; +- } + + printk(KERN_INFO "%s() firmware read %zu bytes.\n", + __func__, fw->size); +Index: linux/drivers/misc/ti-st/st_kim.c +=================================================================== +--- linux.orig/drivers/misc/ti-st/st_kim.c ++++ linux/drivers/misc/ti-st/st_kim.c +@@ -301,11 +301,8 @@ static long download_firmware(struct kim + request_firmware(&kim_gdata->fw_entry, bts_scr_name, + &kim_gdata->kim_pdev->dev); + if (unlikely((err != 0) || (kim_gdata->fw_entry->data == NULL) || +- (kim_gdata->fw_entry->size == 0))) { +- pr_err(" request_firmware failed(errno %ld) for %s", err, +- bts_scr_name); ++ (kim_gdata->fw_entry->size == 0))) + return -EINVAL; +- } + ptr = (void *)kim_gdata->fw_entry->data; + len = kim_gdata->fw_entry->size; + /* bts_header to remove out magic number and +Index: linux/drivers/net/can/softing/softing_fw.c +=================================================================== +--- linux.orig/drivers/net/can/softing/softing_fw.c ++++ linux/drivers/net/can/softing/softing_fw.c +@@ -237,11 +237,8 @@ int softing_load_app_fw(const char *file + int8_t type_end = 0, type_entrypoint = 0; + + ret = request_firmware(&fw, file, &card->pdev->dev); +- if (ret) { +- dev_alert(&card->pdev->dev, "request_firmware(%s) got %i\n", +- file, ret); ++ if (ret) + return ret; +- } + dev_dbg(&card->pdev->dev, "firmware(%s) got %lu bytes\n", + file, (unsigned long)fw->size); + /* parse the firmware */ +Index: linux/drivers/net/ethernet/3com/typhoon.c +=================================================================== +--- linux.orig/drivers/net/ethernet/3com/typhoon.c ++++ linux/drivers/net/ethernet/3com/typhoon.c +@@ -1283,11 +1283,8 @@ typhoon_request_firmware(struct typhoon + return 0; + + err = request_firmware(&typhoon_fw, FIRMWARE_NAME, &tp->pdev->dev); +- if (err) { +- netdev_err(tp->dev, "Failed to load firmware \"%s\"\n", +- FIRMWARE_NAME); ++ if (err) + return err; +- } + + image_data = typhoon_fw->data; + remaining = typhoon_fw->size; +Index: linux/drivers/net/ethernet/adaptec/starfire.c +=================================================================== +--- linux.orig/drivers/net/ethernet/adaptec/starfire.c ++++ linux/drivers/net/ethernet/adaptec/starfire.c +@@ -1015,11 +1015,8 @@ static int netdev_open(struct net_device + #endif /* VLAN_SUPPORT */ + + retval = request_firmware(&fw_rx, FIRMWARE_RX, &np->pci_dev->dev); +- if (retval) { +- printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n", +- FIRMWARE_RX); ++ if (retval) + goto out_init; +- } + if (fw_rx->size % 4) { + printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n", + fw_rx->size, FIRMWARE_RX); +@@ -1027,11 +1024,8 @@ static int netdev_open(struct net_device + goto out_rx; + } + retval = request_firmware(&fw_tx, FIRMWARE_TX, &np->pci_dev->dev); +- if (retval) { +- printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n", +- FIRMWARE_TX); ++ if (retval) + goto out_rx; +- } + if (fw_tx->size % 4) { + printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n", + fw_tx->size, FIRMWARE_TX); +Index: linux/drivers/net/ethernet/alteon/acenic.c +=================================================================== +--- linux.orig/drivers/net/ethernet/alteon/acenic.c ++++ linux/drivers/net/ethernet/alteon/acenic.c +@@ -2890,11 +2890,8 @@ static int ace_load_firmware(struct net_ + fw_name = "acenic/tg1.bin"; + + ret = request_firmware(&fw, fw_name, &ap->pdev->dev); +- if (ret) { +- printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n", +- ap->name, fw_name); ++ if (ret) + return ret; +- } + + fw_data = (void *)fw->data; + +Index: linux/drivers/net/ethernet/broadcom/bnx2.c +=================================================================== +--- linux.orig/drivers/net/ethernet/broadcom/bnx2.c ++++ linux/drivers/net/ethernet/broadcom/bnx2.c +@@ -3720,16 +3720,13 @@ static int bnx2_request_uncached_firmwar + } + + rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev); +- if (rc) { +- pr_err("Can't load firmware file \"%s\"\n", mips_fw_file); ++ if (rc) + goto out; +- } + + rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev); +- if (rc) { +- pr_err("Can't load firmware file \"%s\"\n", rv2p_fw_file); ++ if (rc) + goto err_release_mips_firmware; +- } ++ + mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data; + rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data; + if (bp->mips_firmware->size < sizeof(*mips_fw) || +Index: linux/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c ++++ linux/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +@@ -13557,11 +13557,8 @@ static int bnx2x_init_firmware(struct bn + BNX2X_DEV_INFO("Loading %s\n", fw_file_name); + + rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev); +- if (rc) { +- BNX2X_ERR("Can't load firmware file %s\n", +- fw_file_name); ++ if (rc) + goto request_firmware_exit; +- } + + rc = bnx2x_check_firmware(bp); + if (rc) { +Index: linux/drivers/net/ethernet/broadcom/tg3.c +=================================================================== +--- linux.orig/drivers/net/ethernet/broadcom/tg3.c ++++ linux/drivers/net/ethernet/broadcom/tg3.c +@@ -11408,11 +11408,8 @@ static int tg3_request_firmware(struct t + { + const struct tg3_firmware_hdr *fw_hdr; + +- if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) { +- netdev_err(tp->dev, "Failed to load firmware \"%s\"\n", +- tp->fw_needed); ++ if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) + return -ENOENT; +- } + + fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data; + +Index: linux/drivers/net/ethernet/brocade/bna/cna_fwimg.c +=================================================================== +--- linux.orig/drivers/net/ethernet/brocade/bna/cna_fwimg.c ++++ linux/drivers/net/ethernet/brocade/bna/cna_fwimg.c +@@ -32,10 +32,8 @@ cna_read_firmware(struct pci_dev *pdev, + const struct firmware *fw; + u32 n; + +- if (request_firmware(&fw, fw_name, &pdev->dev)) { +- dev_alert(&pdev->dev, "can't load firmware %s\n", fw_name); ++ if (request_firmware(&fw, fw_name, &pdev->dev)) + goto error; +- } + + *bfi_image = (u32 *)fw->data; + *bfi_image_size = fw->size/sizeof(u32); +Index: linux/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c ++++ linux/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +@@ -1038,12 +1038,8 @@ int t3_get_edc_fw(struct cphy *phy, int + fw_name = get_edc_fw_name(edc_idx); + if (fw_name) + ret = request_firmware(&fw, fw_name, &adapter->pdev->dev); +- if (ret < 0) { +- dev_err(&adapter->pdev->dev, +- "could not upgrade firmware: unable to load %s\n", +- fw_name); ++ if (ret) + return ret; +- } + + /* check size, take checksum in account */ + if (fw->size > size + 4) { +@@ -1080,11 +1076,8 @@ static int upgrade_fw(struct adapter *ad + struct device *dev = &adap->pdev->dev; + + ret = request_firmware(&fw, FW_FNAME, dev); +- if (ret < 0) { +- dev_err(dev, "could not upgrade firmware: unable to load %s\n", +- FW_FNAME); ++ if (ret) + return ret; +- } + ret = t3_load_fw(adap, fw->data, fw->size); + release_firmware(fw); + +@@ -1129,11 +1122,8 @@ static int update_tpsram(struct adapter + snprintf(buf, sizeof(buf), TPSRAM_NAME, rev); + + ret = request_firmware(&tpsram, buf, dev); +- if (ret < 0) { +- dev_err(dev, "could not load TP SRAM: unable to load %s\n", +- buf); ++ if (ret) + return ret; +- } + + ret = t3_check_tpsram(adap, tpsram->data, tpsram->size); + if (ret) +Index: linux/drivers/net/ethernet/intel/e100.c +=================================================================== +--- linux.orig/drivers/net/ethernet/intel/e100.c ++++ linux/drivers/net/ethernet/intel/e100.c +@@ -1265,9 +1265,6 @@ static const struct firmware *e100_reque + + if (err) { + if (required) { +- netif_err(nic, probe, nic->netdev, +- "Failed to load firmware \"%s\": %d\n", +- fw_name, err); + return ERR_PTR(err); + } else { + netif_info(nic, probe, nic->netdev, +Index: linux/drivers/net/ethernet/myricom/myri10ge/myri10ge.c +=================================================================== +--- linux.orig/drivers/net/ethernet/myricom/myri10ge/myri10ge.c ++++ linux/drivers/net/ethernet/myricom/myri10ge/myri10ge.c +@@ -581,8 +581,6 @@ static int myri10ge_load_hotplug_firmwar + unsigned i; + + if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { +- dev_err(dev, "Unable to load %s firmware image via hotplug\n", +- mgp->fw_name); + status = -EINVAL; + goto abort_with_nothing; + } +Index: linux/drivers/net/ethernet/smsc/smc91c92_cs.c +=================================================================== +--- linux.orig/drivers/net/ethernet/smsc/smc91c92_cs.c ++++ linux/drivers/net/ethernet/smsc/smc91c92_cs.c +@@ -647,10 +647,8 @@ static int osi_load_firmware(struct pcmc + int i, err; + + err = request_firmware(&fw, FIRMWARE_NAME, &link->dev); +- if (err) { +- pr_err("Failed to load firmware \"%s\"\n", FIRMWARE_NAME); ++ if (err) + return err; +- } + + /* Download the Seven of Diamonds firmware */ + for (i = 0; i < fw->size; i++) { +Index: linux/drivers/net/ethernet/sun/cassini.c +=================================================================== +--- linux.orig/drivers/net/ethernet/sun/cassini.c ++++ linux/drivers/net/ethernet/sun/cassini.c +@@ -805,11 +805,8 @@ static void cas_saturn_firmware_init(str + return; + + err = request_firmware(&fw, fw_name, &cp->pdev->dev); +- if (err) { +- pr_err("Failed to load firmware \"%s\"\n", +- fw_name); ++ if (err) + return; +- } + if (fw->size < 2) { + pr_err("bogus length %zu in \"%s\"\n", + fw->size, fw_name); +Index: linux/drivers/net/hamradio/yam.c +=================================================================== +--- linux.orig/drivers/net/hamradio/yam.c ++++ linux/drivers/net/hamradio/yam.c +@@ -372,11 +372,8 @@ static unsigned char *add_mcs(unsigned c + } + err = request_firmware(&fw, fw_name[predef], &pdev->dev); + platform_device_unregister(pdev); +- if (err) { +- printk(KERN_ERR "Failed to load firmware \"%s\"\n", +- fw_name[predef]); ++ if (err) + return NULL; +- } + if (fw->size != YAM_FPGA_SIZE) { + printk(KERN_ERR "Bogus length %zu in firmware \"%s\"\n", + fw->size, fw_name[predef]); +Index: linux/drivers/net/usb/kaweth.c +=================================================================== +--- linux.orig/drivers/net/usb/kaweth.c ++++ linux/drivers/net/usb/kaweth.c +@@ -390,10 +390,8 @@ static int kaweth_download_firmware(stru + int ret; + + ret = request_firmware(&fw, fwname, &kaweth->dev->dev); +- if (ret) { +- dev_err(&kaweth->intf->dev, "Firmware request failed\n"); ++ if (ret) + return ret; +- } + + if (fw->size > KAWETH_FIRMWARE_BUF_SIZE) { + dev_err(&kaweth->intf->dev, "Firmware too big: %zu\n", +Index: linux/drivers/net/wimax/i2400m/fw.c +=================================================================== +--- linux.orig/drivers/net/wimax/i2400m/fw.c ++++ linux/drivers/net/wimax/i2400m/fw.c +@@ -1583,11 +1583,8 @@ int i2400m_dev_bootstrap(struct i2400m * + } + d_printf(1, dev, "trying firmware %s (%d)\n", fw_name, itr); + ret = request_firmware(&fw, fw_name, dev); +- if (ret < 0) { +- dev_err(dev, "fw %s: cannot load file: %d\n", +- fw_name, ret); ++ if (ret) + continue; +- } + i2400m->fw_name = fw_name; + ret = i2400m_fw_bootstrap(i2400m, fw, flags); + release_firmware(fw); +@@ -1630,8 +1627,6 @@ void i2400m_fw_cache(struct i2400m *i240 + kref_init(&i2400m_fw->kref); + result = request_firmware(&i2400m_fw->fw, i2400m->fw_name, dev); + if (result < 0) { +- dev_err(dev, "firmware %s: failed to cache: %d\n", +- i2400m->fw_name, result); + kfree(i2400m_fw); + i2400m_fw = (void *) ~0; + } else +Index: linux/drivers/net/wireless/atmel/at76c50x-usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/atmel/at76c50x-usb.c ++++ linux/drivers/net/wireless/atmel/at76c50x-usb.c +@@ -1622,13 +1622,8 @@ static struct fwentry *at76_load_firmwar + + at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname); + ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev); +- if (ret < 0) { +- dev_err(&udev->dev, "firmware %s not found!\n", +- fwe->fwname); +- dev_err(&udev->dev, +- "you may need to download the firmware from http://developer.berlios.de/projects/at76c503a/\n"); ++ if (ret) + goto exit; +- } + + at76_dbg(DBG_FW, "got it."); + fwh = (struct at76_fw_header *)(fwe->fw->data); +Index: linux/drivers/net/wireless/ath/ath9k/hif_usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/ath/ath9k/hif_usb.c ++++ linux/drivers/net/wireless/ath/ath9k/hif_usb.c +@@ -1164,9 +1164,6 @@ static void ath9k_hif_usb_firmware_cb(co + if (!ret) + return; + +- dev_err(&hif_dev->udev->dev, +- "ath9k_htc: Failed to get firmware %s\n", +- hif_dev->fw_name); + goto err_fw; + } + +Index: linux/drivers/net/wireless/ath/carl9170/usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/ath/carl9170/usb.c ++++ linux/drivers/net/wireless/ath/carl9170/usb.c +@@ -1029,7 +1029,6 @@ static void carl9170_usb_firmware_step2( + return; + } + +- dev_err(&ar->udev->dev, "firmware not found.\n"); + carl9170_usb_firmware_failed(ar); + } + +Index: linux/drivers/net/wireless/atmel/atmel.c +=================================================================== +--- linux.orig/drivers/net/wireless/atmel/atmel.c ++++ linux/drivers/net/wireless/atmel/atmel.c +@@ -3893,12 +3893,8 @@ static int reset_atmel_card(struct net_d + strcpy(priv->firmware_id, "atmel_at76c502.bin"); + } + err = request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev); +- if (err != 0) { +- printk(KERN_ALERT +- "%s: firmware %s is missing, cannot continue.\n", +- dev->name, priv->firmware_id); ++ if (err != 0) + return err; +- } + } else { + int fw_index = 0; + int success = 0; +Index: linux/drivers/net/wireless/broadcom/b43/main.c +=================================================================== +--- linux.orig/drivers/net/wireless/broadcom/b43/main.c ++++ linux/drivers/net/wireless/broadcom/b43/main.c +@@ -2263,19 +2263,8 @@ int b43_do_request_fw(struct b43_request + } + err = request_firmware(&ctx->blob, ctx->fwname, + ctx->dev->dev->dev); +- if (err == -ENOENT) { +- snprintf(ctx->errors[ctx->req_type], +- sizeof(ctx->errors[ctx->req_type]), +- "Firmware file \"%s\" not found\n", +- ctx->fwname); ++ if (err) + return err; +- } else if (err) { +- snprintf(ctx->errors[ctx->req_type], +- sizeof(ctx->errors[ctx->req_type]), +- "Firmware file \"%s\" request failed (err=%d)\n", +- ctx->fwname, err); +- return err; +- } + fw_ready: + if (ctx->blob->size < sizeof(struct b43_fw_header)) + goto err_format; +Index: linux/drivers/net/wireless/broadcom/b43legacy/main.c +=================================================================== +--- linux.orig/drivers/net/wireless/broadcom/b43legacy/main.c ++++ linux/drivers/net/wireless/broadcom/b43legacy/main.c +@@ -1554,11 +1554,8 @@ static int do_request_fw(struct b43legac + } else { + err = request_firmware(fw, path, dev->dev->dev); + } +- if (err) { +- b43legacyerr(dev->wl, "Firmware file \"%s\" not found " +- "or load failed.\n", path); ++ if (err) + return err; +- } + if ((*fw)->size < sizeof(struct b43legacy_fw_header)) + goto err_format; + hdr = (struct b43legacy_fw_header *)((*fw)->data); +Index: linux/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +=================================================================== +--- linux.orig/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c ++++ linux/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +@@ -378,19 +378,13 @@ static int brcms_request_fw(struct brcms + sprintf(fw_name, "%s-%d.fw", brcms_firmwares[i], + UCODE_LOADER_API_VER); + status = request_firmware(&wl->fw.fw_bin[i], fw_name, device); +- if (status) { +- wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", +- KBUILD_MODNAME, fw_name); ++ if (status) + return status; +- } + sprintf(fw_name, "%s_hdr-%d.fw", brcms_firmwares[i], + UCODE_LOADER_API_VER); + status = request_firmware(&wl->fw.fw_hdr[i], fw_name, device); +- if (status) { +- wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", +- KBUILD_MODNAME, fw_name); ++ if (status) + return status; +- } + wl->fw.hdr_num_entries[i] = + wl->fw.fw_hdr[i]->size / (sizeof(struct firmware_hdr)); + } +Index: linux/drivers/net/wireless/intel/ipw2x00/ipw2100.c +=================================================================== +--- linux.orig/drivers/net/wireless/intel/ipw2x00/ipw2100.c ++++ linux/drivers/net/wireless/intel/ipw2x00/ipw2100.c +@@ -8410,12 +8410,8 @@ static int ipw2100_get_firmware(struct i + + rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev); + +- if (rc < 0) { +- printk(KERN_ERR DRV_NAME ": " +- "%s: Firmware '%s' not available or load failed.\n", +- priv->net_dev->name, fw_name); ++ if (rc) + return rc; +- } + IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data, + fw->fw_entry->size); + +Index: linux/drivers/net/wireless/intel/ipw2x00/ipw2200.c +=================================================================== +--- linux.orig/drivers/net/wireless/intel/ipw2x00/ipw2200.c ++++ linux/drivers/net/wireless/intel/ipw2x00/ipw2200.c +@@ -3410,10 +3410,8 @@ static int ipw_get_fw(struct ipw_priv *p + + /* ask firmware_class module to get the boot firmware off disk */ + rc = request_firmware(raw, name, &priv->pci_dev->dev); +- if (rc < 0) { +- IPW_ERROR("%s request_firmware failed: Reason %d\n", name, rc); ++ if (rc) + return rc; +- } + + if ((*raw)->size < sizeof(*fw)) { + IPW_ERROR("%s is too small (%zd)\n", name, (*raw)->size); +Index: linux/drivers/net/wireless/intel/iwlegacy/3945-mac.c +=================================================================== +--- linux.orig/drivers/net/wireless/intel/iwlegacy/3945-mac.c ++++ linux/drivers/net/wireless/intel/iwlegacy/3945-mac.c +@@ -1854,7 +1854,6 @@ il3945_read_ucode(struct il_priv *il) + sprintf(buf, "%s%u%s", name_pre, idx, ".ucode"); + ret = request_firmware(&ucode_raw, buf, &il->pci_dev->dev); + if (ret < 0) { +- IL_ERR("%s firmware file req failed: %d\n", buf, ret); + if (ret == -ENOENT) + continue; + else +Index: linux/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +=================================================================== +--- linux.orig/drivers/net/wireless/intel/iwlwifi/iwl-drv.c ++++ linux/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +@@ -236,8 +236,6 @@ static int iwl_request_firmware(struct i + } + + if (drv->fw_index < cfg->ucode_api_min) { +- IWL_ERR(drv, "no suitable firmware found!\n"); +- + if (cfg->ucode_api_min == cfg->ucode_api_max) { + IWL_ERR(drv, "%s%d is required\n", fw_pre_name, + cfg->ucode_api_max); +Index: linux/drivers/net/wireless/marvell/libertas_tf/if_usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/marvell/libertas_tf/if_usb.c ++++ linux/drivers/net/wireless/marvell/libertas_tf/if_usb.c +@@ -817,8 +817,6 @@ static int if_usb_prog_firmware(struct i + kernel_param_lock(THIS_MODULE); + ret = request_firmware(&cardp->fw, lbtf_fw_name, &cardp->udev->dev); + if (ret < 0) { +- pr_err("request_firmware() failed with %#x\n", ret); +- pr_err("firmware %s not found\n", lbtf_fw_name); + kernel_param_unlock(THIS_MODULE); + goto done; + } +Index: linux/drivers/net/wireless/marvell/mwifiex/main.c +=================================================================== +--- linux.orig/drivers/net/wireless/marvell/mwifiex/main.c ++++ linux/drivers/net/wireless/marvell/mwifiex/main.c +@@ -528,11 +528,8 @@ static int _mwifiex_fw_dpc(const struct + struct wireless_dev *wdev; + struct completion *fw_done = adapter->fw_done; + +- if (!firmware) { +- mwifiex_dbg(adapter, ERROR, +- "Failed to get firmware %s\n", adapter->fw_name); ++ if (!firmware) + goto err_dnld_fw; +- } + + memset(&fw, 0, sizeof(struct mwifiex_fw_image)); + adapter->firmware = firmware; +Index: linux/drivers/net/wireless/marvell/mwl8k.c +=================================================================== +--- linux.orig/drivers/net/wireless/marvell/mwl8k.c ++++ linux/drivers/net/wireless/marvell/mwl8k.c +@@ -5724,16 +5724,12 @@ static int mwl8k_firmware_load_success(s + static void mwl8k_fw_state_machine(const struct firmware *fw, void *context) + { + struct mwl8k_priv *priv = context; +- struct mwl8k_device_info *di = priv->device_info; + int rc; + + switch (priv->fw_state) { + case FW_STATE_INIT: +- if (!fw) { +- printk(KERN_ERR "%s: Error requesting helper fw %s\n", +- pci_name(priv->pdev), di->helper_image); ++ if (!fw) + goto fail; +- } + priv->fw_helper = fw; + rc = mwl8k_request_fw(priv, priv->fw_pref, &priv->fw_ucode, + true); +@@ -5768,11 +5764,8 @@ static void mwl8k_fw_state_machine(const + break; + + case FW_STATE_LOADING_ALT: +- if (!fw) { +- printk(KERN_ERR "%s: Error requesting alt fw %s\n", +- pci_name(priv->pdev), di->helper_image); ++ if (!fw) + goto fail; +- } + priv->fw_ucode = fw; + rc = mwl8k_firmware_load_success(priv); + if (rc) +@@ -5810,10 +5803,8 @@ retry: + + /* Ask userland hotplug daemon for the device firmware */ + rc = mwl8k_request_firmware(priv, fw_image, nowait); +- if (rc) { +- wiphy_err(hw->wiphy, "Firmware files not found\n"); ++ if (rc) + return rc; +- } + + if (nowait) + return rc; +Index: linux/drivers/net/wireless/intersil/orinoco/fw.c +=================================================================== +--- linux.orig/drivers/net/wireless/intersil/orinoco/fw.c ++++ linux/drivers/net/wireless/intersil/orinoco/fw.c +@@ -132,7 +132,6 @@ orinoco_dl_firmware(struct orinoco_priva + err = request_firmware(&fw_entry, firmware, priv->dev); + + if (err) { +- dev_err(dev, "Cannot find firmware %s\n", firmware); + err = -ENOENT; + goto free; + } +@@ -292,10 +291,8 @@ symbol_dl_firmware(struct orinoco_privat + const struct firmware *fw_entry; + + if (!orinoco_cached_fw_get(priv, true)) { +- if (request_firmware(&fw_entry, fw->pri_fw, priv->dev) != 0) { +- dev_err(dev, "Cannot find firmware: %s\n", fw->pri_fw); ++ if (request_firmware(&fw_entry, fw->pri_fw, priv->dev) != 0) + return -ENOENT; +- } + } else + fw_entry = orinoco_cached_fw_get(priv, true); + +@@ -311,10 +308,8 @@ symbol_dl_firmware(struct orinoco_privat + } + + if (!orinoco_cached_fw_get(priv, false)) { +- if (request_firmware(&fw_entry, fw->sta_fw, priv->dev) != 0) { +- dev_err(dev, "Cannot find firmware: %s\n", fw->sta_fw); ++ if (request_firmware(&fw_entry, fw->sta_fw, priv->dev) != 0) + return -ENOENT; +- } + } else + fw_entry = orinoco_cached_fw_get(priv, false); + +Index: linux/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/intersil/orinoco/orinoco_usb.c ++++ linux/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +@@ -1677,7 +1677,6 @@ static int ezusb_probe(struct usb_interf + if (ezusb_firmware_download(upriv, &firmware) < 0) + goto error; + } else { +- err("No firmware to download"); + goto error; + } + +Index: linux/drivers/net/wireless/intersil/p54/p54pci.c +=================================================================== +--- linux.orig/drivers/net/wireless/intersil/p54/p54pci.c ++++ linux/drivers/net/wireless/intersil/p54/p54pci.c +@@ -499,7 +499,6 @@ static void p54p_firmware_step2(const st + int err; + + if (!fw) { +- dev_err(&pdev->dev, "Cannot find firmware (isl3886pci)\n"); + err = -ENOENT; + goto out; + } +Index: linux/drivers/net/wireless/intersil/p54/p54spi.c +=================================================================== +--- linux.orig/drivers/net/wireless/intersil/p54/p54spi.c ++++ linux/drivers/net/wireless/intersil/p54/p54spi.c +@@ -170,10 +170,8 @@ static int p54spi_request_firmware(struc + /* FIXME: should driver use it's own struct device? */ + ret = request_firmware(&priv->firmware, "3826.arm", &priv->spi->dev); + +- if (ret < 0) { +- dev_err(&priv->spi->dev, "request_firmware() failed: %d", ret); ++ if (ret) + return ret; +- } + + ret = p54_parse_firmware(dev, priv->firmware); + if (ret) { +Index: linux/drivers/net/wireless/intersil/p54/p54usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/intersil/p54/p54usb.c ++++ linux/drivers/net/wireless/intersil/p54/p54usb.c +@@ -931,7 +931,6 @@ static void p54u_load_firmware_cb(const + err = p54u_start_ops(priv); + } else { + err = -ENOENT; +- dev_err(&udev->dev, "Firmware not found.\n"); + } + + complete(&priv->fw_wait_load); +Index: linux/drivers/net/wireless/intersil/prism54/islpci_dev.c +=================================================================== +--- linux.orig/drivers/net/wireless/intersil/prism54/islpci_dev.c ++++ linux/drivers/net/wireless/intersil/prism54/islpci_dev.c +@@ -92,12 +92,9 @@ isl_upload_firmware(islpci_private *priv + const u32 *fw_ptr; + + rc = request_firmware(&fw_entry, priv->firmware, PRISM_FW_PDEV); +- if (rc) { +- printk(KERN_ERR +- "%s: request_firmware() failed for '%s'\n", +- "prism54", priv->firmware); ++ if (rc) + return rc; +- } ++ + /* prepare the Direct Memory Base register */ + reg = ISL38XX_DEV_FIRMWARE_ADDRES; + +Index: linux/drivers/net/wireless/ralink/rt2x00/rt2x00firmware.c +=================================================================== +--- linux.orig/drivers/net/wireless/ralink/rt2x00/rt2x00firmware.c ++++ linux/drivers/net/wireless/ralink/rt2x00/rt2x00firmware.c +@@ -49,10 +49,8 @@ static int rt2x00lib_request_firmware(st + rt2x00_info(rt2x00dev, "Loading firmware file '%s'\n", fw_name); + + retval = request_firmware(&fw, fw_name, device); +- if (retval) { +- rt2x00_err(rt2x00dev, "Failed to request Firmware\n"); ++ if (retval) + return retval; +- } + + if (!fw || !fw->size || !fw->data) { + rt2x00_err(rt2x00dev, "Failed to read Firmware\n"); +Index: linux/drivers/net/wireless/realtek/rtlwifi/core.c +=================================================================== +--- linux.orig/drivers/net/wireless/realtek/rtlwifi/core.c ++++ linux/drivers/net/wireless/realtek/rtlwifi/core.c +@@ -111,7 +111,6 @@ static void rtl_fw_do_work(const struct + if (!err) + goto found_alt; + } +- pr_err("Selected firmware is not available\n"); + rtlpriv->max_fw_size = 0; + return; + } +Index: linux/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c +=================================================================== +--- linux.orig/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c ++++ linux/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c +@@ -86,13 +86,11 @@ static void rtl92se_fw_cb(const struct f + struct ieee80211_hw *hw = context; + struct rtl_priv *rtlpriv = rtl_priv(hw); + struct rt_firmware *pfirmware = NULL; +- char *fw_name = "rtlwifi/rtl8192sefw.bin"; + + RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, + "Firmware callback routine entered!\n"); + complete(&rtlpriv->firmware_loading_complete); + if (!firmware) { +- pr_err("Firmware %s not available\n", fw_name); + rtlpriv->max_fw_size = 0; + return; + } +Index: linux/drivers/net/wireless/ti/wl1251/main.c +=================================================================== +--- linux.orig/drivers/net/wireless/ti/wl1251/main.c ++++ linux/drivers/net/wireless/ti/wl1251/main.c +@@ -71,10 +71,8 @@ static int wl1251_fetch_firmware(struct + + ret = request_firmware(&fw, WL1251_FW_NAME, dev); + +- if (ret < 0) { +- wl1251_error("could not get firmware: %d", ret); ++ if (ret) + return ret; +- } + + if (fw->size % 4) { + wl1251_error("firmware size is not multiple of 32 bits: %zu", +@@ -110,10 +108,8 @@ static int wl1251_fetch_nvs(struct wl125 + + ret = request_firmware(&fw, WL1251_NVS_NAME, dev); + +- if (ret < 0) { +- wl1251_error("could not get nvs file: %d", ret); ++ if (ret) + return ret; +- } + + if (fw->size % 4) { + wl1251_error("nvs size is not multiple of 32 bits: %zu", +Index: linux/drivers/net/wireless/ti/wlcore/main.c +=================================================================== +--- linux.orig/drivers/net/wireless/ti/wlcore/main.c ++++ linux/drivers/net/wireless/ti/wlcore/main.c +@@ -768,10 +768,8 @@ static int wl12xx_fetch_firmware(struct + + ret = request_firmware(&fw, fw_name, wl->dev); + +- if (ret < 0) { +- wl1271_error("could not get firmware %s: %d", fw_name, ret); ++ if (ret) + return ret; +- } + + if (fw->size % 4) { + wl1271_error("firmware size is not multiple of 32 bits: %zu", +Index: linux/drivers/net/wireless/zydas/zd1201.c +=================================================================== +--- linux.orig/drivers/net/wireless/zydas/zd1201.c ++++ linux/drivers/net/wireless/zydas/zd1201.c +@@ -65,8 +65,6 @@ static int zd1201_fw_upload(struct usb_d + + err = request_firmware(&fw_entry, fwfile, &dev->dev); + if (err) { +- dev_err(&dev->dev, "Failed to load %s firmware file!\n", fwfile); +- dev_err(&dev->dev, "Make sure the hotplug firmware loader is installed.\n"); + dev_err(&dev->dev, "Goto http://linux-lc100020.sourceforge.net for more info.\n"); + return err; + } +Index: linux/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +=================================================================== +--- linux.orig/drivers/net/wireless/zydas/zd1211rw/zd_usb.c ++++ linux/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +@@ -120,16 +120,9 @@ static void int_urb_complete(struct urb + static int request_fw_file( + const struct firmware **fw, const char *name, struct device *device) + { +- int r; +- + dev_dbg_f(device, "fw name %s\n", name); + +- r = request_firmware(fw, name, device); +- if (r) +- dev_err(device, +- "Could not load firmware file %s. Error number %d\n", +- name, r); +- return r; ++ return request_firmware(fw, name, device); + } + + static inline u16 get_bcdDevice(const struct usb_device *udev) +Index: linux/drivers/scsi/advansys.c +=================================================================== +--- linux.orig/drivers/scsi/advansys.c ++++ linux/drivers/scsi/advansys.c +@@ -4107,8 +4107,6 @@ static int AscInitAsc1000Driver(ASC_DVC_ + + err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); + if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fwname, err); + asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; + return err; + } +@@ -4473,8 +4471,6 @@ static int AdvInitAsc3550Driver(ADV_DVC_ + + err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); + if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fwname, err); + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; + return err; + } +@@ -4973,8 +4969,6 @@ static int AdvInitAsc38C0800Driver(ADV_D + + err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); + if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fwname, err); + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; + return err; + } +@@ -5461,8 +5455,6 @@ static int AdvInitAsc38C1600Driver(ADV_D + + err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); + if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fwname, err); + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; + return err; + } +Index: linux/drivers/scsi/aic94xx/aic94xx_init.c +=================================================================== +--- linux.orig/drivers/scsi/aic94xx/aic94xx_init.c ++++ linux/drivers/scsi/aic94xx/aic94xx_init.c +@@ -384,8 +384,6 @@ static ssize_t asd_store_update_bios(str + filename_ptr, + &asd_ha->pcidev->dev); + if (err) { +- asd_printk("Failed to load bios image file %s, error %d\n", +- filename_ptr, err); + err = FAIL_OPEN_BIOS_FILE; + goto out1; + } +Index: linux/drivers/scsi/aic94xx/aic94xx_seq.c +=================================================================== +--- linux.orig/drivers/scsi/aic94xx/aic94xx_seq.c ++++ linux/drivers/scsi/aic94xx/aic94xx_seq.c +@@ -1317,11 +1317,8 @@ int asd_init_seqs(struct asd_ha_struct * + + err = asd_request_firmware(asd_ha); + +- if (err) { +- asd_printk("Failed to load sequencer firmware file %s, error %d\n", +- SAS_RAZOR_SEQUENCER_FW_FILE, err); ++ if (err) + return err; +- } + + err = asd_seq_download_seqs(asd_ha); + if (err) { +Index: linux/drivers/scsi/bfa/bfad.c +=================================================================== +--- linux.orig/drivers/scsi/bfa/bfad.c ++++ linux/drivers/scsi/bfa/bfad.c +@@ -1755,7 +1755,6 @@ bfad_read_firmware(struct pci_dev *pdev, + const struct firmware *fw; + + if (request_firmware(&fw, fw_name, &pdev->dev)) { +- printk(KERN_ALERT "Can't locate firmware %s\n", fw_name); + *bfi_image = NULL; + goto out; + } +Index: linux/drivers/scsi/ipr.c +=================================================================== +--- linux.orig/drivers/scsi/ipr.c ++++ linux/drivers/scsi/ipr.c +@@ -4102,10 +4102,8 @@ static ssize_t ipr_store_update_fw(struc + if (endline) + *endline = '\0'; + +- if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) { +- dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname); ++ if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) + return -EIO; +- } + + image_hdr = (struct ipr_ucode_image_header *)fw_entry->data; + +Index: linux/drivers/scsi/pm8001/pm8001_ctl.c +=================================================================== +--- linux.orig/drivers/scsi/pm8001/pm8001_ctl.c ++++ linux/drivers/scsi/pm8001/pm8001_ctl.c +@@ -737,10 +737,6 @@ static ssize_t pm8001_store_update_fw(st + pm8001_ha->dev); + + if (ret) { +- PM8001_FAIL_DBG(pm8001_ha, +- pm8001_printk( +- "Failed to load firmware image file %s, error %d\n", +- filename_ptr, ret)); + pm8001_ha->fw_status = FAIL_OPEN_BIOS_FILE; + goto out; + } +Index: linux/drivers/scsi/qla1280.c +=================================================================== +--- linux.orig/drivers/scsi/qla1280.c ++++ linux/drivers/scsi/qla1280.c +@@ -1552,8 +1552,6 @@ qla1280_request_firmware(struct scsi_qla + err = request_firmware(&fw, fwname, &ha->pdev->dev); + + if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fwname, err); + fw = ERR_PTR(err); + goto unlock; + } +Index: linux/drivers/scsi/qla2xxx/qla_init.c +=================================================================== +--- linux.orig/drivers/scsi/qla2xxx/qla_init.c ++++ linux/drivers/scsi/qla2xxx/qla_init.c +@@ -7470,8 +7470,6 @@ qla2x00_load_risc(scsi_qla_host_t *vha, + /* Load firmware blob. */ + blob = qla2x00_request_firmware(vha); + if (!blob) { +- ql_log(ql_log_info, vha, 0x0083, +- "Firmware image unavailable.\n"); + ql_log(ql_log_info, vha, 0x0084, + "Firmware images can be retrieved from: "QLA_FW_URL ".\n"); + return QLA_FUNCTION_FAILED; +@@ -7573,8 +7571,6 @@ qla24xx_load_risc_blob(scsi_qla_host_t * + /* Load firmware blob. */ + blob = qla2x00_request_firmware(vha); + if (!blob) { +- ql_log(ql_log_warn, vha, 0x0090, +- "Firmware image unavailable.\n"); + ql_log(ql_log_warn, vha, 0x0091, + "Firmware images can be retrieved from: " + QLA_FW_URL ".\n"); +Index: linux/drivers/scsi/qla2xxx/qla_nx.c +=================================================================== +--- linux.orig/drivers/scsi/qla2xxx/qla_nx.c ++++ linux/drivers/scsi/qla2xxx/qla_nx.c +@@ -2464,11 +2464,8 @@ try_blob_fw: + + /* Load firmware blob. */ + blob = ha->hablob = qla2x00_request_firmware(vha); +- if (!blob) { +- ql_log(ql_log_fatal, vha, 0x00a3, +- "Firmware image not present.\n"); ++ if (!blob) + goto fw_load_failed; +- } + + /* Validating firmware blob */ + if (qla82xx_validate_firmware_blob(vha, +Index: linux/drivers/scsi/qla2xxx/qla_os.c +=================================================================== +--- linux.orig/drivers/scsi/qla2xxx/qla_os.c ++++ linux/drivers/scsi/qla2xxx/qla_os.c +@@ -6543,8 +6543,6 @@ qla2x00_request_firmware(scsi_qla_host_t + goto out; + + if (request_firmware(&blob->fw, blob->name, &ha->pdev->dev)) { +- ql_log(ql_log_warn, vha, 0x0063, +- "Failed to load firmware image (%s).\n", blob->name); + blob->fw = NULL; + blob = NULL; + goto out; +Index: linux/drivers/scsi/qlogicpti.c +=================================================================== +--- linux.orig/drivers/scsi/qlogicpti.c ++++ linux/drivers/scsi/qlogicpti.c +@@ -475,11 +475,8 @@ static int qlogicpti_load_firmware(struc + int i, timeout; + + err = request_firmware(&fw, fwname, &qpti->op->dev); +- if (err) { +- printk(KERN_ERR "Failed to load image \"%s\" err %d\n", +- fwname, err); ++ if (err) + return err; +- } + if (fw->size % 2) { + printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", + fw->size, fwname); +Index: linux/drivers/media/usb/go7007/go7007-driver.c +=================================================================== +--- linux.orig/drivers/media/usb/go7007/go7007-driver.c ++++ linux/drivers/media/usb/go7007/go7007-driver.c +@@ -92,10 +92,8 @@ static int go7007_load_encoder(struct go + u16 intr_val, intr_data; + + if (go->boot_fw == NULL) { +- if (request_firmware(&fw_entry, fw_name, go->dev)) { +- v4l2_err(go, "unable to load firmware from file \"%s\"\n", fw_name); ++ if (request_firmware(&fw_entry, fw_name, go->dev)) + return -1; +- } + if (fw_entry->size < 16 || memcmp(fw_entry->data, "WISGO7007FW", 11)) { + v4l2_err(go, "file \"%s\" does not appear to be go7007 firmware\n", fw_name); + release_firmware(fw_entry); +Index: linux/drivers/media/usb/go7007/go7007-fw.c +=================================================================== +--- linux.orig/drivers/media/usb/go7007/go7007-fw.c ++++ linux/drivers/media/usb/go7007/go7007-fw.c +@@ -1573,12 +1573,8 @@ int go7007_construct_fw_image(struct go7 + default: + return -1; + } +- if (request_firmware(&fw_entry, GO7007_FW_NAME, go->dev)) { +- dev_err(go->dev, +- "unable to load firmware from file \"%s\"\n", +- GO7007_FW_NAME); ++ if (request_firmware(&fw_entry, GO7007_FW_NAME, go->dev)) + return -1; +- } + code = kcalloc(codespace, 2, GFP_KERNEL); + if (code == NULL) + goto fw_failed; +Index: linux/drivers/media/usb/go7007/go7007-loader.c +=================================================================== +--- linux.orig/drivers/media/usb/go7007/go7007-loader.c ++++ linux/drivers/media/usb/go7007/go7007-loader.c +@@ -75,11 +75,8 @@ static int go7007_loader_probe(struct us + + dev_info(&interface->dev, "loading firmware %s\n", fw1); + +- if (request_firmware(&fw, fw1, &usbdev->dev)) { +- dev_err(&interface->dev, +- "unable to load firmware from file \"%s\"\n", fw1); ++ if (request_firmware(&fw, fw1, &usbdev->dev)) + goto failed2; +- } + ret = cypress_load_firmware(usbdev, fw, CYPRESS_FX2); + release_firmware(fw); + if (0 != ret) { +@@ -90,11 +87,8 @@ static int go7007_loader_probe(struct us + if (fw2 == NULL) + return 0; + +- if (request_firmware(&fw, fw2, &usbdev->dev)) { +- dev_err(&interface->dev, +- "unable to load firmware from file \"%s\"\n", fw2); ++ if (request_firmware(&fw, fw2, &usbdev->dev)) + goto failed2; +- } + ret = cypress_load_firmware(usbdev, fw, CYPRESS_FX2); + release_firmware(fw); + if (0 != ret) { +Index: linux/drivers/staging/rtl8192u/r819xU_firmware.c +=================================================================== +--- linux.orig/drivers/staging/rtl8192u/r819xU_firmware.c ++++ linux/drivers/staging/rtl8192u/r819xU_firmware.c +@@ -245,10 +245,8 @@ bool init_firmware(struct net_device *de + */ + if (rst_opt == OPT_SYSTEM_RESET) { + rc = request_firmware(&fw_entry, fw_name[init_step], &priv->udev->dev); +- if (rc < 0) { +- RT_TRACE(COMP_ERR, "request firmware fail!\n"); ++ if (rc) + goto download_firmware_fail; +- } + + if (fw_entry->size > sizeof(pfirmware->firmware_buf)) { + RT_TRACE(COMP_ERR, "img file size exceed the container buffer fail!\n"); +Index: linux/drivers/staging/rtl8712/hal_init.c +=================================================================== +--- linux.orig/drivers/staging/rtl8712/hal_init.c ++++ linux/drivers/staging/rtl8712/hal_init.c +@@ -67,8 +67,6 @@ int rtl871x_load_fw(struct _adapter *pad + dev_info(dev, "r8712u: Loading firmware from \"%s\"\n", firmware_file); + rc = request_firmware_nowait(THIS_MODULE, 1, firmware_file, dev, + GFP_KERNEL, padapter, rtl871x_load_fw_cb); +- if (rc) +- dev_err(dev, "r8712u: Firmware request error %d\n", rc); + return rc; + } + MODULE_FIRMWARE("rtlwifi/rtl8712u.bin"); +Index: linux/drivers/net/ethernet/alacritech/slicoss.c +=================================================================== +--- linux.orig/drivers/net/ethernet/alacritech/slicoss.c ++++ linux/drivers/net/ethernet/alacritech/slicoss.c +@@ -1063,11 +1063,8 @@ static int slic_load_rcvseq_firmware(str + file = (sdev->model == SLIC_MODEL_OASIS) ? SLIC_RCV_FIRMWARE_OASIS : + SLIC_RCV_FIRMWARE_MOJAVE; + err = request_firmware(&fw, file, &sdev->pdev->dev); +- if (err) { +- dev_err(&sdev->pdev->dev, +- "failed to load receive sequencer firmware %s\n", file); ++ if (err) + return err; +- } + /* Do an initial sanity check concerning firmware size now. A further + * check follows below. + */ +@@ -1138,10 +1135,8 @@ static int slic_load_firmware(struct sli + file = (sdev->model == SLIC_MODEL_OASIS) ? SLIC_FIRMWARE_OASIS : + SLIC_FIRMWARE_MOJAVE; + err = request_firmware(&fw, file, &sdev->pdev->dev); +- if (err) { +- dev_err(&sdev->pdev->dev, "failed to load firmware %s\n", file); ++ if (err) + return err; +- } + /* Do an initial sanity check concerning firmware size now. A further + * check follows below. + */ +Index: linux/drivers/staging/vt6656/firmware.c +=================================================================== +--- linux.orig/drivers/staging/vt6656/firmware.c ++++ linux/drivers/staging/vt6656/firmware.c +@@ -39,11 +39,8 @@ int vnt_download_firmware(struct vnt_pri + dev_dbg(dev, "---->Download firmware\n"); + + rc = request_firmware(&fw, FIRMWARE_NAME, dev); +- if (rc) { +- dev_err(dev, "firmware file %s request failed (%d)\n", +- FIRMWARE_NAME, rc); +- goto out; +- } ++ if (rc) ++ goto out; + + buffer = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL); + if (!buffer) +Index: linux/drivers/tty/cyclades.c +=================================================================== +--- linux.orig/drivers/tty/cyclades.c ++++ linux/drivers/tty/cyclades.c +@@ -3489,10 +3489,8 @@ static int cyz_load_fw(struct pci_dev *p + int retval; + + retval = request_firmware(&fw, "cyzfirm.bin", &pdev->dev); +- if (retval) { +- dev_err(&pdev->dev, "can't get firmware\n"); ++ if (retval) + goto err; +- } + + /* Check whether the firmware is already loaded and running. If + positive, skip this board */ +Index: linux/drivers/tty/moxa.c +=================================================================== +--- linux.orig/drivers/tty/moxa.c ++++ linux/drivers/tty/moxa.c +@@ -862,13 +862,8 @@ static int moxa_init_board(struct moxa_b + } + + ret = request_firmware(&fw, file, dev); +- if (ret) { +- printk(KERN_ERR "MOXA: request_firmware failed. Make sure " +- "you've placed '%s' file into your firmware " +- "loader directory (e.g. /lib/firmware)\n", +- file); ++ if (ret) + goto err_free; +- } + + ret = moxa_load_fw(brd, fw); + +Index: linux/drivers/tty/serial/icom.c +=================================================================== +--- linux.orig/drivers/tty/serial/icom.c ++++ linux/drivers/tty/serial/icom.c +@@ -360,7 +360,6 @@ static void load_code(struct icom_port * + + /* Load Call Setup into Adapter */ + if (request_firmware(&fw, "icom_call_setup.bin", &dev->dev) < 0) { +- dev_err(&dev->dev,"Unable to load icom_call_setup.bin firmware image\n"); + status = -1; + goto load_code_exit; + } +@@ -380,7 +379,6 @@ static void load_code(struct icom_port * + + /* Load Resident DCE portion of Adapter */ + if (request_firmware(&fw, "icom_res_dce.bin", &dev->dev) < 0) { +- dev_err(&dev->dev,"Unable to load icom_res_dce.bin firmware image\n"); + status = -1; + goto load_code_exit; + } +@@ -425,7 +423,6 @@ static void load_code(struct icom_port * + } + + if (request_firmware(&fw, "icom_asc.bin", &dev->dev) < 0) { +- dev_err(&dev->dev,"Unable to load icom_asc.bin firmware image\n"); + status = -1; + goto load_code_exit; + } +Index: linux/drivers/tty/serial/ucc_uart.c +=================================================================== +--- linux.orig/drivers/tty/serial/ucc_uart.c ++++ linux/drivers/tty/serial/ucc_uart.c +@@ -1165,10 +1165,8 @@ static void uart_firmware_cont(const str + struct device *dev = context; + int ret; + +- if (!fw) { +- dev_err(dev, "firmware not found\n"); ++ if (!fw) + return; +- } + + firmware = (struct qe_firmware *) fw->data; + +Index: linux/drivers/usb/atm/cxacru.c +=================================================================== +--- linux.orig/drivers/usb/atm/cxacru.c ++++ linux/drivers/usb/atm/cxacru.c +@@ -1080,8 +1080,6 @@ static int cxacru_find_firmware(struct c + return -ENOENT; + } + +- usb_info(usbatm, "found firmware %s\n", buf); +- + return 0; + } + +Index: linux/drivers/usb/atm/ueagle-atm.c +=================================================================== +--- linux.orig/drivers/usb/atm/ueagle-atm.c ++++ linux/drivers/usb/atm/ueagle-atm.c +@@ -650,10 +650,8 @@ static void uea_upload_pre_firmware(cons + int ret, size; + + uea_enters(usb); +- if (!fw_entry) { +- uea_err(usb, "firmware is not available\n"); ++ if (!fw_entry) + goto err; +- } + + pfw = fw_entry->data; + size = fw_entry->size; +@@ -748,10 +746,6 @@ static int uea_load_firmware(struct usb_ + ret = request_firmware_nowait(THIS_MODULE, 1, fw_name, &usb->dev, + GFP_KERNEL, usb, + uea_upload_pre_firmware); +- if (ret) +- uea_err(usb, "firmware %s is not available\n", fw_name); +- else +- uea_info(usb, "loading firmware %s\n", fw_name); + + uea_leaves(usb); + return ret; +@@ -913,12 +907,8 @@ static int request_dsp(struct uea_softc + } + + ret = request_firmware(&sc->dsp_firm, dsp_name, &sc->usb_dev->dev); +- if (ret < 0) { +- uea_err(INS_TO_USBDEV(sc), +- "requesting firmware %s failed with error %d\n", +- dsp_name, ret); ++ if (ret) + return ret; +- } + + if (UEA_CHIP_VERSION(sc) == EAGLE_IV) + ret = check_dsp_e4(sc->dsp_firm->data, sc->dsp_firm->size); +@@ -1631,12 +1621,8 @@ static int request_cmvs_old(struct uea_s + + cmvs_file_name(sc, cmv_name, 1); + ret = request_firmware(fw, cmv_name, &sc->usb_dev->dev); +- if (ret < 0) { +- uea_err(INS_TO_USBDEV(sc), +- "requesting firmware %s failed with error %d\n", +- cmv_name, ret); ++ if (ret) + return ret; +- } + + data = (u8 *) (*fw)->data; + size = (*fw)->size; +@@ -1673,9 +1659,6 @@ static int request_cmvs(struct uea_softc + "try to get older cmvs\n", cmv_name); + return request_cmvs_old(sc, cmvs, fw); + } +- uea_err(INS_TO_USBDEV(sc), +- "requesting firmware %s failed with error %d\n", +- cmv_name, ret); + return ret; + } + +@@ -1958,11 +1941,8 @@ static int load_XILINX_firmware(struct u + uea_enters(INS_TO_USBDEV(sc)); + + ret = request_firmware(&fw_entry, fw_name, &sc->usb_dev->dev); +- if (ret) { +- uea_err(INS_TO_USBDEV(sc), "firmware %s is not available\n", +- fw_name); ++ if (ret) + goto err0; +- } + + pfw = fw_entry->data; + size = fw_entry->size; +Index: linux/drivers/usb/misc/emi26.c +=================================================================== +--- linux.orig/drivers/usb/misc/emi26.c ++++ linux/drivers/usb/misc/emi26.c +@@ -85,21 +85,17 @@ static int emi26_load_firmware (struct u + + err = request_ihex_firmware(&loader_fw, "emi26/loader.fw", &dev->dev); + if (err) +- goto nofw; ++ goto wraperr; + + err = request_ihex_firmware(&bitstream_fw, "emi26/bitstream.fw", + &dev->dev); + if (err) +- goto nofw; ++ goto wraperr; + + err = request_ihex_firmware(&firmware_fw, "emi26/firmware.fw", + &dev->dev); +- if (err) { +- nofw: +- dev_err(&dev->dev, "%s - request_firmware() failed\n", +- __func__); ++ if (err) + goto wraperr; +- } + + /* Assert reset (stop the CPU in the EMI) */ + err = emi26_set_reset(dev,1); +Index: linux/drivers/usb/misc/ezusb.c +=================================================================== +--- linux.orig/drivers/usb/misc/ezusb.c ++++ linux/drivers/usb/misc/ezusb.c +@@ -76,12 +76,8 @@ static int ezusb_ihex_firmware_download( + const struct ihex_binrec *record; + + if (request_ihex_firmware(&firmware, firmware_path, +- &dev->dev)) { +- dev_err(&dev->dev, +- "%s - request \"%s\" failed\n", +- __func__, firmware_path); ++ &dev->dev)) + goto out; +- } + + ret = ezusb_set_reset(dev, fx.cpucs_reg, 0); + if (ret < 0) +Index: linux/drivers/usb/misc/isight_firmware.c +=================================================================== +--- linux.orig/drivers/usb/misc/isight_firmware.c ++++ linux/drivers/usb/misc/isight_firmware.c +@@ -45,7 +45,6 @@ static int isight_firmware_load(struct u + return -ENOMEM; + + if (request_firmware(&firmware, "isight.fw", &dev->dev) != 0) { +- printk(KERN_ERR "Unable to load isight firmware\n"); + ret = -ENODEV; + goto out; + } +Index: linux/drivers/usb/serial/io_edgeport.c +=================================================================== +--- linux.orig/drivers/usb/serial/io_edgeport.c ++++ linux/drivers/usb/serial/io_edgeport.c +@@ -375,11 +375,8 @@ static void update_edgeport_E2PROM(struc + + response = request_ihex_firmware(&fw, fw_name, + &edge_serial->serial->dev->dev); +- if (response) { +- dev_err(dev, "Failed to load image \"%s\" err %d\n", +- fw_name, response); ++ if (response) + return; +- } + + rec = (const struct ihex_binrec *)fw->data; + BootMajorVersion = rec->data[0]; +Index: linux/drivers/usb/serial/io_ti.c +=================================================================== +--- linux.orig/drivers/usb/serial/io_ti.c ++++ linux/drivers/usb/serial/io_ti.c +@@ -1010,8 +1010,6 @@ static int download_fw(struct edgeport_s + + status = request_firmware(&fw, fw_name, dev); + if (status) { +- dev_err(dev, "Failed to load image \"%s\" err %d\n", +- fw_name, status); + return status; + } + +Index: linux/drivers/usb/serial/ti_usb_3410_5052.c +=================================================================== +--- linux.orig/drivers/usb/serial/ti_usb_3410_5052.c ++++ linux/drivers/usb/serial/ti_usb_3410_5052.c +@@ -1689,10 +1689,8 @@ static int ti_download_firmware(struct t + } + + check_firmware: +- if (status) { +- dev_err(&dev->dev, "%s - firmware not found\n", __func__); ++ if (status) + return -ENOENT; +- } + if (fw_p->size > TI_FIRMWARE_BUF_SIZE) { + dev_err(&dev->dev, "%s - firmware too large %zu\n", __func__, fw_p->size); + release_firmware(fw_p); +Index: linux/drivers/video/fbdev/broadsheetfb.c +=================================================================== +--- linux.orig/drivers/video/fbdev/broadsheetfb.c ++++ linux/drivers/video/fbdev/broadsheetfb.c +@@ -743,10 +743,8 @@ static ssize_t broadsheet_loadstore_wave + return -EINVAL; + + err = request_firmware(&fw_entry, "broadsheet.wbf", dev); +- if (err < 0) { +- dev_err(dev, "Failed to get broadsheet waveform\n"); ++ if (err) + goto err_failed; +- } + + /* try to enforce reasonable min max on waveform */ + if ((fw_entry->size < 8*1024) || (fw_entry->size > 64*1024)) { +Index: linux/drivers/video/fbdev/metronomefb.c +=================================================================== +--- linux.orig/drivers/video/fbdev/metronomefb.c ++++ linux/drivers/video/fbdev/metronomefb.c +@@ -679,10 +679,8 @@ static int metronomefb_probe(struct plat + a) request the waveform file from userspace + b) process waveform and decode into metromem */ + retval = request_firmware(&fw_entry, "metronome.wbf", &dev->dev); +- if (retval < 0) { +- dev_err(&dev->dev, "Failed to get waveform\n"); ++ if (retval) + goto err_csum_table; +- } + + retval = load_waveform((u8 *) fw_entry->data, fw_entry->size, 3, 31, + par); +Index: linux/sound/drivers/vx/vx_hwdep.c +=================================================================== +--- linux.orig/sound/drivers/vx/vx_hwdep.c ++++ linux/sound/drivers/vx/vx_hwdep.c +@@ -71,10 +71,8 @@ int snd_vx_setup_firmware(struct vx_core + if (! fw_files[chip->type][i]) + continue; + sprintf(path, "vx/%s", fw_files[chip->type][i]); +- if (request_firmware(&fw, path, chip->dev)) { +- snd_printk(KERN_ERR "vx: can't load firmware %s\n", path); ++ if (request_firmware(&fw, path, chip->dev)) + return -ENOENT; +- } + err = chip->ops->load_dsp(chip, i, fw); + if (err < 0) { + release_firmware(fw); +Index: linux/sound/isa/msnd/msnd_pinnacle.c +=================================================================== +--- linux.orig/sound/isa/msnd/msnd_pinnacle.c ++++ linux/sound/isa/msnd/msnd_pinnacle.c +@@ -390,15 +390,11 @@ static int upload_dsp_code(struct snd_ca + outb(HPBLKSEL_0, chip->io + HP_BLKS); + + err = request_firmware(&init_fw, INITCODEFILE, card->dev); +- if (err < 0) { +- printk(KERN_ERR LOGNAME ": Error loading " INITCODEFILE); ++ if (err) + goto cleanup1; +- } + err = request_firmware(&perm_fw, PERMCODEFILE, card->dev); +- if (err < 0) { +- printk(KERN_ERR LOGNAME ": Error loading " PERMCODEFILE); ++ if (err) + goto cleanup; +- } + + memcpy_toio(chip->mappedbase, perm_fw->data, perm_fw->size); + if (snd_msnd_upload_host(chip, init_fw->data, init_fw->size) < 0) { +Index: linux/sound/isa/sscape.c +=================================================================== +--- linux.orig/sound/isa/sscape.c ++++ linux/sound/isa/sscape.c +@@ -544,10 +544,8 @@ static int sscape_upload_bootblock(struc + int ret; + + ret = request_firmware(&init_fw, "scope.cod", card->dev); +- if (ret < 0) { +- snd_printk(KERN_ERR "sscape: Error loading scope.cod"); ++ if (ret) + return ret; +- } + ret = upload_dma_data(sscape, init_fw->data, init_fw->size); + + release_firmware(init_fw); +@@ -584,11 +582,8 @@ static int sscape_upload_microcode(struc + snprintf(name, sizeof(name), "sndscape.co%d", version); + + err = request_firmware(&init_fw, name, card->dev); +- if (err < 0) { +- snd_printk(KERN_ERR "sscape: Error loading sndscape.co%d", +- version); ++ if (err) + return err; +- } + err = upload_dma_data(sscape, init_fw->data, init_fw->size); + if (err == 0) + snd_printk(KERN_INFO "sscape: MIDI firmware loaded %zu KBs\n", +Index: linux/sound/isa/wavefront/wavefront_synth.c +=================================================================== +--- linux.orig/sound/isa/wavefront/wavefront_synth.c ++++ linux/sound/isa/wavefront/wavefront_synth.c +@@ -1957,10 +1957,8 @@ wavefront_download_firmware (snd_wavefro + const struct firmware *firmware; + + err = request_firmware(&firmware, path, dev->card->dev); +- if (err < 0) { +- snd_printk(KERN_ERR "firmware (%s) download failed!!!\n", path); ++ if (err) + return 1; +- } + + len = 0; + buf = firmware->data; +Index: linux/sound/pci/asihpi/hpidspcd.c +=================================================================== +--- linux.orig/sound/pci/asihpi/hpidspcd.c ++++ linux/sound/pci/asihpi/hpidspcd.c +@@ -46,8 +46,6 @@ short hpi_dsp_code_open(u32 adapter, voi + err = request_firmware(&firmware, fw_name, &dev->dev); + + if (err || !firmware) { +- dev_err(&dev->dev, "%d, request_firmware failed for %s\n", +- err, fw_name); + goto error1; + } + if (firmware->size < sizeof(header)) { +Index: linux/sound/pci/echoaudio/echoaudio.c +=================================================================== +--- linux.orig/sound/pci/echoaudio/echoaudio.c ++++ linux/sound/pci/echoaudio/echoaudio.c +@@ -60,11 +60,8 @@ static int get_firmware(const struct fir + "firmware requested: %s\n", card_fw[fw_index].data); + snprintf(name, sizeof(name), "ea/%s", card_fw[fw_index].data); + err = request_firmware(fw_entry, name, &chip->pci->dev); +- if (err < 0) +- dev_err(chip->card->dev, +- "get_firmware(): Firmware not available (%d)\n", err); + #ifdef CONFIG_PM_SLEEP +- else ++ if (!err) + chip->fw_cache[fw_index] = *fw_entry; + #endif + return err; +Index: linux/sound/pci/emu10k1/emu10k1_main.c +=================================================================== +--- linux.orig/sound/pci/emu10k1/emu10k1_main.c ++++ linux/sound/pci/emu10k1/emu10k1_main.c +@@ -888,10 +888,8 @@ static int snd_emu10k1_emu1010_init(stru + dev_info(emu->card->dev, "emu1010: EMU_HANA_ID = 0x%x\n", reg); + + err = snd_emu1010_load_firmware(emu, 0, &emu->firmware); +- if (err < 0) { +- dev_info(emu->card->dev, "emu1010: Loading Firmware failed\n"); ++ if (err < 0) + return err; +- } + + /* ID, should read & 0x7f = 0x55 when FPGA programmed. */ + snd_emu1010_fpga_read(emu, EMU_HANA_ID, ®); +Index: linux/sound/pci/hda/hda_intel.c +=================================================================== +--- linux.orig/sound/pci/hda/hda_intel.c ++++ linux/sound/pci/hda/hda_intel.c +@@ -2079,8 +2079,6 @@ static void azx_firmware_cb(const struct + + if (fw) + chip->fw = fw; +- else +- dev_err(card->dev, "Cannot load firmware, continue without patching\n"); + if (!chip->disabled) { + /* continue probing */ + azx_probe_continue(chip); +Index: linux/sound/pci/korg1212/korg1212.c +=================================================================== +--- linux.orig/sound/pci/korg1212/korg1212.c ++++ linux/sound/pci/korg1212/korg1212.c +@@ -2348,7 +2348,6 @@ static int snd_korg1212_create(struct sn + + err = request_firmware(&dsp_code, "korg/k1212.dsp", &pci->dev); + if (err < 0) { +- snd_printk(KERN_ERR "firmware not available\n"); + snd_korg1212_free(korg1212); + return err; + } +Index: linux/sound/pci/mixart/mixart_hwdep.c +=================================================================== +--- linux.orig/sound/pci/mixart/mixart_hwdep.c ++++ linux/sound/pci/mixart/mixart_hwdep.c +@@ -571,11 +571,8 @@ int snd_mixart_setup_firmware(struct mix + + for (i = 0; i < 3; i++) { + sprintf(path, "mixart/%s", fw_files[i]); +- if (request_firmware(&fw_entry, path, &mgr->pci->dev)) { +- dev_err(&mgr->pci->dev, +- "miXart: can't load firmware %s\n", path); ++ if (request_firmware(&fw_entry, path, &mgr->pci->dev)) + return -ENOENT; +- } + /* fake hwdep dsp record */ + err = mixart_dsp_load(mgr, i, fw_entry); + release_firmware(fw_entry); +Index: linux/sound/pci/pcxhr/pcxhr_hwdep.c +=================================================================== +--- linux.orig/sound/pci/pcxhr/pcxhr_hwdep.c ++++ linux/sound/pci/pcxhr/pcxhr_hwdep.c +@@ -385,12 +385,8 @@ int pcxhr_setup_firmware(struct pcxhr_mg + if (!fw_files[fw_set][i]) + continue; + sprintf(path, "pcxhr/%s", fw_files[fw_set][i]); +- if (request_firmware(&fw_entry, path, &mgr->pci->dev)) { +- dev_err(&mgr->pci->dev, +- "pcxhr: can't load firmware %s\n", +- path); ++ if (request_firmware(&fw_entry, path, &mgr->pci->dev)) + return -ENOENT; +- } + /* fake hwdep dsp record */ + err = pcxhr_dsp_load(mgr, i, fw_entry); + release_firmware(fw_entry); +Index: linux/sound/pci/riptide/riptide.c +=================================================================== +--- linux.orig/sound/pci/riptide/riptide.c ++++ linux/sound/pci/riptide/riptide.c +@@ -1231,11 +1231,8 @@ static int try_to_load_firmware(struct c + if (!chip->fw_entry) { + err = request_firmware(&chip->fw_entry, "riptide.hex", + &chip->pci->dev); +- if (err) { +- snd_printk(KERN_ERR +- "Riptide: Firmware not available %d\n", err); ++ if (err) + return -EIO; +- } + } + err = loadfirmware(cif, chip->fw_entry->data, chip->fw_entry->size); + if (err) { +Index: linux/sound/pci/rme9652/hdsp.c +=================================================================== +--- linux.orig/sound/pci/rme9652/hdsp.c ++++ linux/sound/pci/rme9652/hdsp.c +@@ -5134,11 +5134,8 @@ static int hdsp_request_fw_loader(struct + return -EINVAL; + } + +- if (request_firmware(&fw, fwfile, &hdsp->pci->dev)) { +- dev_err(hdsp->card->dev, +- "cannot load firmware %s\n", fwfile); ++ if (request_firmware(&fw, fwfile, &hdsp->pci->dev)) + return -ENOENT; +- } + if (fw->size < HDSP_FIRMWARE_SIZE) { + dev_err(hdsp->card->dev, + "too short firmware size %d (expected %d)\n", +Index: linux/sound/soc/codecs/wm2000.c +=================================================================== +--- linux.orig/sound/soc/codecs/wm2000.c ++++ linux/sound/soc/codecs/wm2000.c +@@ -891,10 +891,8 @@ static int wm2000_i2c_probe(struct i2c_c + } + + ret = request_firmware(&fw, filename, &i2c->dev); +- if (ret != 0) { +- dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret); ++ if (ret != 0) + goto err_supplies; +- } + + /* Pre-cook the concatenation of the register address onto the image */ + wm2000->anc_download_size = fw->size + 2; +Index: linux/sound/usb/6fire/firmware.c +=================================================================== +--- linux.orig/sound/usb/6fire/firmware.c ++++ linux/sound/usb/6fire/firmware.c +@@ -219,8 +219,6 @@ static int usb6fire_fw_ezusb_upload( + ret = request_firmware(&fw, fwname, &device->dev); + if (ret < 0) { + kfree(rec); +- dev_err(&intf->dev, +- "error requesting ezusb firmware %s.\n", fwname); + return ret; + } + ret = usb6fire_fw_ihex_init(fw, rec); +@@ -296,8 +294,6 @@ static int usb6fire_fw_fpga_upload( + + ret = request_firmware(&fw, fwname, &device->dev); + if (ret < 0) { +- dev_err(&intf->dev, "unable to get fpga firmware %s.\n", +- fwname); + kfree(buffer); + return -EIO; + } +Index: linux/sound/pci/cs46xx/cs46xx_lib.c +=================================================================== +--- linux.orig/sound/pci/cs46xx/cs46xx_lib.c ++++ linux/sound/pci/cs46xx/cs46xx_lib.c +@@ -3253,11 +3253,8 @@ int snd_cs46xx_start_dsp(struct snd_cs46 + #ifdef CONFIG_SND_CS46XX_NEW_DSP + for (i = 0; i < CS46XX_DSP_MODULES; i++) { + err = load_firmware(chip, &chip->modules[i], module_names[i]); +- if (err < 0) { +- dev_err(chip->card->dev, "firmware load error [%s]\n", +- module_names[i]); ++ if (err < 0) + return err; +- } + err = cs46xx_dsp_load_module(chip, chip->modules[i]); + if (err < 0) { + dev_err(chip->card->dev, "image download error [%s]\n", diff --git a/debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch b/debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch new file mode 100644 index 000000000..266688652 --- /dev/null +++ b/debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch @@ -0,0 +1,70 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Subject: firmware_class: Log every success and failure against given device +Date: Sun, 09 Dec 2012 16:02:00 +0000 +Forwarded: no + +The hundreds of users of request_firmware() have nearly as many +different log formats for reporting failures. They also have only the +vaguest hint as to what went wrong; only firmware_class really knows +that. Therefore, add specific log messages for the failure modes that +aren't currently logged. + +In case of a driver that tries multiple names, this may result in the +impression that it failed to initialise. Therefore, also log successes. + +This makes many error messages in drivers redundant, which will be +removed in later patches. + +This does not cover the case where we fall back to a user-mode helper +(which is no longer enabled in Debian). + +NOTE: hw-detect will depend on the "firmware: failed to load %s (%d)\n" +format to detect missing firmware. +--- +Index: linux/drivers/base/firmware_loader/main.c +=================================================================== +--- linux.orig/drivers/base/firmware_loader/main.c ++++ linux/drivers/base/firmware_loader/main.c +@@ -328,21 +328,22 @@ fw_get_filesystem_firmware(struct device + rc = kernel_read_file_from_path(path, &fw_priv->data, &size, + msize, id); + if (rc) { +- if (rc == -ENOENT) +- dev_dbg(device, "loading %s failed with error %d\n", +- path, rc); +- else +- dev_warn(device, "loading %s failed with error %d\n", +- path, rc); ++ dev_dbg(device, "loading %s failed with error %d\n", ++ path, rc); + continue; + } +- dev_dbg(device, "direct-loading %s\n", fw_priv->fw_name); ++ dev_info(device, "firmware: direct-loading firmware %s\n", ++ fw_priv->fw_name); + fw_priv->size = size; + fw_state_done(fw_priv); + break; + } + __putname(path); + ++ if (rc) ++ dev_err(device, "firmware: failed to load %s (%d)\n", ++ fw_priv->fw_name, rc); ++ + return rc; + } + +Index: linux/drivers/base/firmware_loader/fallback.c +=================================================================== +--- linux.orig/drivers/base/firmware_loader/fallback.c ++++ linux/drivers/base/firmware_loader/fallback.c +@@ -604,7 +604,7 @@ static int fw_load_from_user_helper(stru + if (opt_flags & FW_OPT_NOWAIT) { + timeout = usermodehelper_read_lock_wait(timeout); + if (!timeout) { +- dev_dbg(device, "firmware: %s loading timed out\n", ++ dev_err(device, "firmware: %s loading timed out\n", + name); + return -EBUSY; + } diff --git a/debian/patches/bugfix/all/fs-add-module_softdep-declarations-for-hard-coded-cr.patch b/debian/patches/bugfix/all/fs-add-module_softdep-declarations-for-hard-coded-cr.patch new file mode 100644 index 000000000..d6cb0ffac --- /dev/null +++ b/debian/patches/bugfix/all/fs-add-module_softdep-declarations-for-hard-coded-cr.patch @@ -0,0 +1,66 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Wed, 13 Apr 2016 21:48:06 +0100 +Subject: fs: Add MODULE_SOFTDEP declarations for hard-coded crypto drivers +Bug-Debian: https://bugs.debian.org/819725 +Forwarded: http://mid.gmane.org/20160517133631.GF7555@decadent.org.uk + +This helps initramfs builders and other tools to find the full +dependencies of a module. + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +[Lukas Wunner: Forward-ported to 4.11: drop parts applied upstream] +--- +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -2536,3 +2536,4 @@ late_initcall(init_btrfs_fs); + module_exit(exit_btrfs_fs) + + MODULE_LICENSE("GPL"); ++MODULE_SOFTDEP("pre: crypto-crc32c"); +--- a/fs/crypto/crypto.c ++++ b/fs/crypto/crypto.c +@@ -504,3 +504,4 @@ static void __exit fscrypt_exit(void) + module_exit(fscrypt_exit); + + MODULE_LICENSE("GPL"); ++MODULE_SOFTDEP("pre: crypto-aes crypto-ecb"); +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -6200,6 +6200,6 @@ static void __exit ext4_exit_fs(void) + MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); + MODULE_DESCRIPTION("Fourth Extended Filesystem"); + MODULE_LICENSE("GPL"); +-MODULE_SOFTDEP("pre: crc32c"); ++MODULE_SOFTDEP("pre: crypto-crc32c"); + module_init(ext4_init_fs) + module_exit(ext4_exit_fs) +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -3373,5 +3373,5 @@ module_exit(exit_f2fs_fs) + MODULE_AUTHOR("Samsung Electronics's Praesto Team"); + MODULE_DESCRIPTION("Flash Friendly File System"); + MODULE_LICENSE("GPL"); +-MODULE_SOFTDEP("pre: crc32"); ++MODULE_SOFTDEP("pre: crypto-crc32"); + +--- a/fs/jbd2/journal.c ++++ b/fs/jbd2/journal.c +@@ -2744,6 +2744,7 @@ static void __exit journal_exit(void) + } + + MODULE_LICENSE("GPL"); ++MODULE_SOFTDEP("pre: crypto-crc32c"); + module_init(journal_init); + module_exit(journal_exit); + +--- a/fs/nfsd/nfsctl.c ++++ b/fs/nfsd/nfsctl.c +@@ -1337,5 +1337,8 @@ static void __exit exit_nfsd(void) + + MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>"); + MODULE_LICENSE("GPL"); ++#ifdef CONFIG_NFSD_V4 ++MODULE_SOFTDEP("pre: crypto-md5"); ++#endif + module_init(init_nfsd) + module_exit(exit_nfsd) diff --git a/debian/patches/bugfix/all/kbuild-fix-recordmcount-dependency.patch b/debian/patches/bugfix/all/kbuild-fix-recordmcount-dependency.patch new file mode 100644 index 000000000..8e942af28 --- /dev/null +++ b/debian/patches/bugfix/all/kbuild-fix-recordmcount-dependency.patch @@ -0,0 +1,25 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Subject: kbuild: Fix recordmcount dependency for OOT modules +Date: Mon, 08 Sep 2014 18:31:24 +0100 +Forwarded: no + +We never rebuild anything in-tree when building an out-of-tree +modules, so external modules should not depend on the recordmcount +sources. + +Index: linux/scripts/Makefile.build +=================================================================== +--- linux.orig/scripts/Makefile.build ++++ linux/scripts/Makefile.build +@@ -232,6 +232,11 @@ cmd_record_mcount = \ + endif # CC_USING_RECORD_MCOUNT + endif # CONFIG_FTRACE_MCOUNT_RECORD + ++# Don't require recordmcount source for an OOT build. ++ifdef KBUILD_EXTMOD ++recordmcount_source := ++endif ++ + ifdef CONFIG_STACK_VALIDATION + ifneq ($(SKIP_STACK_VALIDATION),1) + diff --git a/debian/patches/bugfix/all/kbuild-include-addtree-remove-quotes-before-matching-path.patch b/debian/patches/bugfix/all/kbuild-include-addtree-remove-quotes-before-matching-path.patch new file mode 100644 index 000000000..22ef11a3b --- /dev/null +++ b/debian/patches/bugfix/all/kbuild-include-addtree-remove-quotes-before-matching-path.patch @@ -0,0 +1,42 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sat, 04 Mar 2017 01:44:15 +0000 +Subject: Kbuild.include: addtree: Remove quotes before matching path +Bug-Debian: https://bugs.debian.org/856474 +Forwarded: https://marc.info/?l=linux-kbuild&m=148987677205629 + +systemtap currently fails to build modules when the kernel source and +object trees are separate. + +systemtap adds something like -I"/usr/share/systemtap/runtime" to +EXTRA_CFLAGS, and addtree should not adjust this as it's specifying an +absolute directory. But since make has no understanding of shell +quoting, it does anyway. + +For a long time this didn't matter, because addtree would still emit +the original -I option after the adjusted one. However, commit +db547ef19064 ("Kbuild: don't add obj tree in additional includes") +changed it to remove the original -I option. + +Remove quotes (both double and single) before matching against the +excluded patterns. + +References: https://bugs.debian.org/856474 +Reported-by: Jack Henschel <jackdev@mailbox.org> +Reported-by: Ritesh Raj Sarraf <rrs@debian.org> +Fixes: db547ef19064 ("Kbuild: don't add obj tree in additional includes") +Cc: stable@vger.kernel.org # 4.8+ +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/scripts/Kbuild.include +=================================================================== +--- linux.orig/scripts/Kbuild.include ++++ linux/scripts/Kbuild.include +@@ -211,7 +211,7 @@ hdr-inst := -f $(srctree)/scripts/Makefi + # Prefix -I with $(srctree) if it is not an absolute path. + # skip if -I has no parameter + addtree = $(if $(patsubst -I%,%,$(1)), \ +-$(if $(filter-out -I/% -I./% -I../%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)),$(1)) ++$(if $(filter-out -I/% -I./% -I../%,$(subst $(quote),,$(subst $(squote),,$(1)))),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)),$(1)) + + # Find all -I options and call addtree + flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) diff --git a/debian/patches/bugfix/all/kbuild-use-nostdinc-in-compile-tests.patch b/debian/patches/bugfix/all/kbuild-use-nostdinc-in-compile-tests.patch new file mode 100644 index 000000000..61a4628a4 --- /dev/null +++ b/debian/patches/bugfix/all/kbuild-use-nostdinc-in-compile-tests.patch @@ -0,0 +1,91 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sat, 19 Oct 2013 19:43:35 +0100 +Subject: kbuild: Use -nostdinc in compile tests +Bug-Debian: https://bugs.debian.org/726861 +Bug-Debian: https://bugs.debian.org/717557 +Forwarded: https://marc.info/?l=linux-kbuild&m=141523555023625 + +gcc 4.8 and later include <stdc-predef.h> by default. In some +versions of eglibc that includes <bits/predefs.h>, but that may be +missing when building with a biarch compiler. Also <stdc-predef.h> +itself could be missing as we are only trying to build a kernel, not +userland. + +The -nostdinc option disables this, though it isn't explicitly +documented. This option is already used when actually building +the kernel, but not by cc-option and other tests. This can result +in silently miscompiling the kernel. + +References: https://bugs.debian.org/717557 +References: https://bugs.debian.org/726861 +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +--- a/scripts/Kbuild.include ++++ b/scripts/Kbuild.include +@@ -121,7 +121,7 @@ CC_OPTION_CFLAGS = $(filter-out $(GCC_PL + # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) + + cc-option = $(call __cc-option, $(CC),\ +- $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS),$(1),$(2)) ++ $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS),$(1),$(2)) + + # hostcc-option + # Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586) +@@ -131,23 +131,24 @@ hostcc-option = $(call __cc-option, $(HO + # cc-option-yn + # Usage: flag := $(call cc-option-yn,-march=winchip-c6) + cc-option-yn = $(call try-run,\ +- $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) ++ $(CC) -Werror $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) + + # cc-disable-warning + # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) + cc-disable-warning = $(call try-run,\ +- $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) ++ $(CC) -Werror $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) + + # cc-name + # Expands to either gcc or clang + cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc) + + # cc-version +-cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) ++cc-version = $(shell $(CONFIG_SHELL) \ ++ $(srctree)/scripts/gcc-version.sh $(CC) $(NOSTDINC_FLAGS)) + + # cc-fullversion + cc-fullversion = $(shell $(CONFIG_SHELL) \ +- $(srctree)/scripts/gcc-version.sh -p $(CC)) ++ $(srctree)/scripts/gcc-version.sh -p $(CC) $(NOSTDINC_FLAGS)) + + # cc-ifversion + # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) +@@ -156,7 +157,7 @@ cc-ifversion = $(shell [ $(cc-version) $ + # cc-ldoption + # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) + cc-ldoption = $(call try-run,\ +- $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) ++ $(CC) $(1) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) + + # ld-option + # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y) +--- a/Makefile ++++ b/Makefile +@@ -661,6 +661,8 @@ else + KBUILD_CFLAGS += -O2 + endif + ++NOSTDINC_FLAGS += -nostdinc ++ + # Tell gcc to never replace conditional load with a non-conditional one + KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0) + KBUILD_CFLAGS += $(call cc-option,-fno-allow-store-data-races) +@@ -781,7 +783,7 @@ LDFLAGS_vmlinux += --gc-sections + endif + + # arch Makefile may override CC so keep this after arch Makefile is included +-NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) ++NOSTDINC_FLAGS += -isystem $(shell $(CC) -print-file-name=include) + + # warn about C99 declaration after statement + KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,) diff --git a/debian/patches/bugfix/all/lib-genalloc-add-gen_pool_dma_zalloc-for-zeroed-DMA.patch b/debian/patches/bugfix/all/lib-genalloc-add-gen_pool_dma_zalloc-for-zeroed-DMA.patch new file mode 100644 index 000000000..360a16aa5 --- /dev/null +++ b/debian/patches/bugfix/all/lib-genalloc-add-gen_pool_dma_zalloc-for-zeroed-DMA.patch @@ -0,0 +1,77 @@ +From: Fredrik Noring <noring@nocrew.org> +Date: Wed, 29 May 2019 13:28:39 +0300 +Subject: lib/genalloc: add gen_pool_dma_zalloc() for zeroed DMA allocations +Origin: https://git.kernel.org/linus/da83a722959a82733c3ca60030cc364ca2318c5a + +gen_pool_dma_zalloc() is a zeroed memory variant of +gen_pool_dma_alloc(). Also document the return values of both, and +indicate NULL as a "%NULL" constant. + +Signed-off-by: Fredrik Noring <noring@nocrew.org> +Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Signed-off-by: Christoph Hellwig <hch@lst.de> +--- + include/linux/genalloc.h | 1 + + lib/genalloc.c | 29 ++++++++++++++++++++++++++++- + 2 files changed, 29 insertions(+), 1 deletion(-) + +--- a/include/linux/genalloc.h ++++ b/include/linux/genalloc.h +@@ -121,6 +121,7 @@ + genpool_algo_t algo, void *data); + extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size, + dma_addr_t *dma); ++void *gen_pool_dma_zalloc(struct gen_pool *pool, size_t size, dma_addr_t *dma); + extern void gen_pool_free(struct gen_pool *, unsigned long, size_t); + extern void gen_pool_for_each_chunk(struct gen_pool *, + void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *); +--- a/lib/genalloc.c ++++ b/lib/genalloc.c +@@ -337,12 +337,14 @@ + * gen_pool_dma_alloc - allocate special memory from the pool for DMA usage + * @pool: pool to allocate from + * @size: number of bytes to allocate from the pool +- * @dma: dma-view physical address return value. Use NULL if unneeded. ++ * @dma: dma-view physical address return value. Use %NULL if unneeded. + * + * Allocate the requested number of bytes from the specified pool. + * Uses the pool allocation function (with first-fit algorithm by default). + * Can not be used in NMI handler on architectures without + * NMI-safe cmpxchg implementation. ++ * ++ * Return: virtual address of the allocated memory, or %NULL on failure + */ + void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size, dma_addr_t *dma) + { +@@ -363,6 +365,31 @@ + EXPORT_SYMBOL(gen_pool_dma_alloc); + + /** ++ * gen_pool_dma_zalloc - allocate special zeroed memory from the pool for ++ * DMA usage ++ * @pool: pool to allocate from ++ * @size: number of bytes to allocate from the pool ++ * @dma: dma-view physical address return value. Use %NULL if unneeded. ++ * ++ * Allocate the requested number of zeroed bytes from the specified pool. ++ * Uses the pool allocation function (with first-fit algorithm by default). ++ * Can not be used in NMI handler on architectures without ++ * NMI-safe cmpxchg implementation. ++ * ++ * Return: virtual address of the allocated zeroed memory, or %NULL on failure ++ */ ++void *gen_pool_dma_zalloc(struct gen_pool *pool, size_t size, dma_addr_t *dma) ++{ ++ void *vaddr = gen_pool_dma_alloc(pool, size, dma); ++ ++ if (vaddr) ++ memset(vaddr, 0, size); ++ ++ return vaddr; ++} ++EXPORT_SYMBOL(gen_pool_dma_zalloc); ++ ++/** + * gen_pool_free - free allocated special memory back to the pool + * @pool: pool to free to + * @addr: starting address of memory to free back to pool diff --git a/debian/patches/bugfix/all/libbpf-add-soname-to-shared-object.patch b/debian/patches/bugfix/all/libbpf-add-soname-to-shared-object.patch new file mode 100644 index 000000000..40f2bcc1d --- /dev/null +++ b/debian/patches/bugfix/all/libbpf-add-soname-to-shared-object.patch @@ -0,0 +1,56 @@ +From: Hilko Bengen <bengen@debian.org> +Date: Sun, 02 Dec 2018 23:26:03 +0000 +Subject: libbpf: add SONAME to shared object + +tools/lib/bpf/libbpf: Add proper version to the shared object. + +Add versioning to the shared object to make it easier on distros to +distribute the library without having to watch for API/ABI versioning. + +This is similar to the change made to tools/lib/lockdep/Makefile in +be227b45fb228adff4371b8de9e3989904209ff4. + +Signed-off-by: Hilko Bengen <bengen@debian.org> +[bwh: Drop unnecessary changes] +--- +Index: linux/tools/lib/bpf/Makefile +=================================================================== +--- linux.orig/tools/lib/bpf/Makefile ++++ linux/tools/lib/bpf/Makefile +@@ -94,7 +94,7 @@ export prefix libdir src obj + libdir_SQ = $(subst ','\'',$(libdir)) + libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) + +-LIB_FILE = libbpf.a libbpf.so ++LIB_FILE = libbpf.a libbpf.so.$(LIBBPF_VERSION) + + VERSION = $(BPF_VERSION) + PATCHLEVEL = $(BPF_PATCHLEVEL) +@@ -103,7 +103,7 @@ EXTRAVERSION = $(BPF_EXTRAVERSION) + OBJ = $@ + N = + +-LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION) ++LIBBPF_VERSION = $(shell make --no-print-directory -sC ../../.. kernelversion | cut -d. -f1,2) + + # Set compile option CFLAGS + ifdef EXTRA_CFLAGS +@@ -169,8 +169,8 @@ $(BPF_IN): force elfdep bpfdep + echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/if_link.h' differs from latest version at 'include/uapi/linux/if_link.h'" >&2 )) || true + $(Q)$(MAKE) $(build)=libbpf + +-$(OUTPUT)libbpf.so: $(BPF_IN) +- $(QUIET_LINK)$(CC) --shared $^ -o $@ ++$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN) ++ $(QUIET_LINK)$(CC) --shared $^ -Wl,-soname,$(@F) -o $@ + + $(OUTPUT)libbpf.a: $(BPF_IN) + $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^ +@@ -185,6 +185,7 @@ endef + install_lib: all_cmd + $(call QUIET_INSTALL, $(LIB_FILE)) \ + $(call do_install,$(LIB_FILE),$(libdir_SQ)) ++ $(Q)ln -sf libbpf.so.$(LIBBPF_VERSION) $(DESTDIR_SQ)$(libdir_SQ)/libbpf.so + + install_headers: + $(call QUIET_INSTALL, headers) \ diff --git a/debian/patches/bugfix/all/libbpf-generate-pkg-config.patch b/debian/patches/bugfix/all/libbpf-generate-pkg-config.patch new file mode 100644 index 000000000..63ecffe5f --- /dev/null +++ b/debian/patches/bugfix/all/libbpf-generate-pkg-config.patch @@ -0,0 +1,90 @@ +Author: Luca Boccassi <bluca@debian.org> +Description: generate pkg-config file for libbpf + Generate a libbpf.pc file at build time so that users can rely + on pkg-config to find the library, its CFLAGS and LDFLAGS. +Origin: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/commit/?id=dd399ac9e343c7573c47d6820e4a23013c54749d +Applied-Upstream: yes +Index: linux/tools/lib/bpf/.gitignore +=================================================================== +--- linux.orig/tools/lib/bpf/.gitignore ++++ linux/tools/lib/bpf/.gitignore +@@ -1,2 +1,3 @@ + libbpf_version.h ++libbpf.pc + FEATURE-DUMP.libbpf +Index: linux/tools/lib/bpf/Makefile +=================================================================== +--- linux.orig/tools/lib/bpf/Makefile ++++ linux/tools/lib/bpf/Makefile +@@ -95,6 +95,7 @@ libdir_SQ = $(subst ','\'',$(libdir)) + libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) + + LIB_FILE = libbpf.a libbpf.so.$(LIBBPF_VERSION) ++PC_FILE = libbpf.pc + + VERSION = $(BPF_VERSION) + PATCHLEVEL = $(BPF_PATCHLEVEL) +@@ -144,8 +145,9 @@ include $(srctree)/tools/build/Makefile. + + BPF_IN := $(OUTPUT)libbpf-in.o + LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE)) ++PC_FILE := $(addprefix $(OUTPUT),$(PC_FILE)) + +-CMD_TARGETS = $(LIB_FILE) ++CMD_TARGETS = $(LIB_FILE) $(PC_FILE) + + TARGETS = $(CMD_TARGETS) + +@@ -175,6 +177,12 @@ $(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $( + $(OUTPUT)libbpf.a: $(BPF_IN) + $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^ + ++$(OUTPUT)libbpf.pc: ++ $(QUIET_GEN)sed -e "s|@PREFIX@|$(prefix)|" \ ++ -e "s|@LIBDIR@|$(libdir_SQ)|" \ ++ -e "s|@VERSION@|$(LIBBPF_VERSION)|" \ ++ < libbpf.pc.template > $@ ++ + define do_install + if [ ! -d '$(DESTDIR_SQ)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \ +@@ -193,7 +201,12 @@ install_headers: + $(call do_install,libbpf.h,$(prefix)/include/bpf,644); + $(call do_install,btf.h,$(prefix)/include/bpf,644); + +-install: install_lib ++install_pkgconfig: $(PC_FILE) ++ $(call QUIET_INSTALL, $(PC_FILE)) \ ++ $(call do_install,$(PC_FILE),$(libdir_SQ)/pkgconfig,644) ++ ++ ++install: install_lib install_pkgconfig + + ### Cleaning rules + +@@ -202,7 +215,7 @@ config-clean: + $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null + + clean: +- $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so .*.d .*.cmd \ ++ $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so .*.d .*.cmd *.pc \ + $(RM) LIBBPF-CFLAGS + $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf + +Index: linux/tools/lib/bpf/libbpf.pc.template +=================================================================== +--- /dev/null ++++ linux/tools/lib/bpf/libbpf.pc.template +@@ -0,0 +1,12 @@ ++# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) ++ ++prefix=@PREFIX@ ++libdir=@LIBDIR@ ++includedir=${prefix}/include ++ ++Name: libbpf ++Description: BPF library ++Version: @VERSION@ ++Libs: -L${libdir} -lbpf ++Requires.private: libelf ++Cflags: -I${includedir} diff --git a/debian/patches/bugfix/all/libbpf-link-shared-object-with-libelf.patch b/debian/patches/bugfix/all/libbpf-link-shared-object-with-libelf.patch new file mode 100644 index 000000000..f02cb07e2 --- /dev/null +++ b/debian/patches/bugfix/all/libbpf-link-shared-object-with-libelf.patch @@ -0,0 +1,22 @@ +From: Hilko Bengen <bengen@debian.org> +Date: Sun, 02 Dec 2018 23:26:03 +0000 +Subject: libbpf: link shared object with libelf + +libbpf.so needs to be linked against libelf to avoid missing symbols. + +Signed-off-by: Hilko Bengen <bengen@debian.org> + +--- +Index: linux/tools/lib/bpf/Makefile +=================================================================== +--- linux.orig/tools/lib/bpf/Makefile ++++ linux/tools/lib/bpf/Makefile +@@ -170,7 +170,7 @@ $(BPF_IN): force elfdep bpfdep + $(Q)$(MAKE) $(build)=libbpf + + $(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN) +- $(QUIET_LINK)$(CC) --shared $^ -Wl,-soname,$(@F) -o $@ ++ $(QUIET_LINK)$(CC) --shared $^ -lelf -Wl,-soname,$(@F) -o $@ + + $(OUTPUT)libbpf.a: $(BPF_IN) + $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^ diff --git a/debian/patches/bugfix/all/libcpupower-hide-private-function.patch b/debian/patches/bugfix/all/libcpupower-hide-private-function.patch new file mode 100644 index 000000000..dba71b64e --- /dev/null +++ b/debian/patches/bugfix/all/libcpupower-hide-private-function.patch @@ -0,0 +1,22 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sat, 01 Dec 2018 19:22:50 +0000 +Subject: libcpupower: Hide private function + +cpupower_read_sysfs() (previously known as sysfs_read_file()) is an +internal function in libcpupower and should not be exported when +libcpupower is a shared library. Change its visibility to "hidden". + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/tools/power/cpupower/lib/cpupower.c +=================================================================== +--- linux.orig/tools/power/cpupower/lib/cpupower.c ++++ linux/tools/power/cpupower/lib/cpupower.c +@@ -15,6 +15,7 @@ + #include "cpupower.h" + #include "cpupower_intern.h" + ++__attribute__((visibility("hidden"))) + unsigned int cpupower_read_sysfs(const char *path, char *buf, size_t buflen) + { + int fd; diff --git a/debian/patches/bugfix/all/module-disable-matching-missing-version-crc.patch b/debian/patches/bugfix/all/module-disable-matching-missing-version-crc.patch new file mode 100644 index 000000000..9c3461019 --- /dev/null +++ b/debian/patches/bugfix/all/module-disable-matching-missing-version-crc.patch @@ -0,0 +1,25 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 02 Dec 2016 23:06:18 +0000 +Subject: module: Disable matching missing version CRC +Forwarded: not-needed + +This partly reverts commit cd3caefb4663e3811d37cc2afad3cce642d60061. +We want to fail closed if a symbol version CRC is missing, as the +alternative may allow subverting module signing. +--- +Index: linux/kernel/module.c +=================================================================== +--- linux.orig/kernel/module.c ++++ linux/kernel/module.c +@@ -1317,9 +1317,8 @@ static int check_version(const struct lo + goto bad_version; + } + +- /* Broken toolchain. Warn once, then let it go.. */ +- pr_warn_once("%s: no symbol version for %s\n", info->name, symname); +- return 1; ++ pr_warn("%s: no symbol version for %s\n", info->name, symname); ++ return 0; + + bad_version: + pr_warn("%s: disagrees about version of symbol %s\n", diff --git a/debian/patches/bugfix/all/mt76-use-the-correct-hweight8-function.patch b/debian/patches/bugfix/all/mt76-use-the-correct-hweight8-function.patch new file mode 100644 index 000000000..ce3b63af3 --- /dev/null +++ b/debian/patches/bugfix/all/mt76-use-the-correct-hweight8-function.patch @@ -0,0 +1,30 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Tue, 12 Feb 2019 15:20:48 +0000 +Subject: mt76: Use the correct hweight8() function +Forwarded: https://marc.info/?l=linux-wireless&m=154998579614180&w=2 + +mt76_init_stream_cap() and mt76_get_txpower() call __sw_hweight8() +directly, but that's only defined if CONFIG_GENERIC_HWEIGHT is +enabled. The function that works on all architectures is hweight8(). + +Fixes: 551e1ef4d291 ("mt76: add mt76_init_stream_cap routine") +Fixes: 9313faacbb4e ("mt76: move mt76x02_get_txpower to mt76 core") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +[bwh: For 4.19, drop change in mt76_get_txpower()] +--- + drivers/net/wireless/mediatek/mt76/mac80211.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/drivers/net/wireless/mediatek/mt76/mac80211.c +=================================================================== +--- linux.orig/drivers/net/wireless/mediatek/mt76/mac80211.c ++++ linux/drivers/net/wireless/mediatek/mt76/mac80211.c +@@ -124,7 +124,7 @@ static void mt76_init_stream_cap(struct + bool vht) + { + struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap; +- int i, nstream = __sw_hweight8(dev->antenna_mask); ++ int i, nstream = hweight8(dev->antenna_mask); + struct ieee80211_sta_vht_cap *vht_cap; + u16 mcs_map = 0; + diff --git a/debian/patches/bugfix/all/net_sched-let-qdisc_put-accept-null-pointer.patch b/debian/patches/bugfix/all/net_sched-let-qdisc_put-accept-null-pointer.patch new file mode 100644 index 000000000..3f259ac4c --- /dev/null +++ b/debian/patches/bugfix/all/net_sched-let-qdisc_put-accept-null-pointer.patch @@ -0,0 +1,50 @@ +From: Diederik de Haas <didi.debian@cknow.org> +Date: Wed, 22 Jun 2022 11:44:05 +0200 +Subject: net_sched: let qdisc_put() accept NULL pointer +Bug-Debian: https://bugs.debian.org/1013299 + +In commit 92833e8b5db6c209e9311ac8c6a44d3bf1856659 titled +"net: sched: rename qdisc_destroy() to qdisc_put()" part of the +functionality of qdisc_destroy() was moved into a (for linux-4.19.y) +new function qdisk_put(), and the previous calls to qdisc_destroy() +were changed to qdisk_put(). +This made it similar to f.e. 5.10.y and current master. + +There was one part of qdisc_destroy() not moved over to qdisc_put() and +that was the check for a NULL value, causing oopses. +(See upstream commit: 6efb971ba8edfbd80b666f29de12882852f095ae) +This patch fixes that. + +Fixes: 92833e8b5db6c209e9311ac8c6a44d3bf1856659 +Reported-by: Thorsten Glaser <tg@mirbsd.de> +Link: https://bugs.debian.org/1013299 +--- + net/sched/sch_generic.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c +index 7c1b1eff84f4..cad2586c3473 100644 +--- a/net/sched/sch_generic.c ++++ b/net/sched/sch_generic.c +@@ -970,8 +970,6 @@ static void qdisc_destroy(struct Qdisc *qdisc) + const struct Qdisc_ops *ops; + struct sk_buff *skb, *tmp; + +- if (!qdisc) +- return; + ops = qdisc->ops; + + #ifdef CONFIG_NET_SCHED +@@ -1003,6 +1001,9 @@ static void qdisc_destroy(struct Qdisc *qdisc) + + void qdisc_put(struct Qdisc *qdisc) + { ++ if (!qdisc) ++ return; ++ + if (qdisc->flags & TCQ_F_BUILTIN || + !refcount_dec_and_test(&qdisc->refcnt)) + return; +-- +2.36.1 + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch new file mode 100644 index 000000000..d50476bca --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch @@ -0,0 +1,153 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 1 Mar 2019 17:19:00 -0800 +Subject: perf script python: Add Python3 support to event_analyzing_sample.py +Origin: https://git.kernel.org/linus/c253c72e9d6723c8b078beb362f050059ef5de39 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the event_analyzing_sample.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Feng Tang <feng.tang@intel.com> +Link: http://lkml.kernel.org/r/20190302011903.2416-5-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/event_analyzing_sample.py | 48 ++++++++++---------- + 1 file changed, 25 insertions(+), 23 deletions(-) + +--- a/tools/perf/scripts/python/event_analyzing_sample.py ++++ b/tools/perf/scripts/python/event_analyzing_sample.py +@@ -15,6 +15,8 @@ + # for a x86 HW PMU event: PEBS with load latency data. + # + ++from __future__ import print_function ++ + import os + import sys + import math +@@ -37,7 +39,7 @@ con = sqlite3.connect("/dev/shm/perf.db" + con.isolation_level = None + + def trace_begin(): +- print "In trace_begin:\n" ++ print("In trace_begin:\n") + + # + # Will create several tables at the start, pebs_ll is for PEBS data with +@@ -76,12 +78,12 @@ def process_event(param_dict): + name = param_dict["ev_name"] + + # Symbol and dso info are not always resolved +- if (param_dict.has_key("dso")): ++ if ("dso" in param_dict): + dso = param_dict["dso"] + else: + dso = "Unknown_dso" + +- if (param_dict.has_key("symbol")): ++ if ("symbol" in param_dict): + symbol = param_dict["symbol"] + else: + symbol = "Unknown_symbol" +@@ -102,7 +104,7 @@ def insert_db(event): + event.ip, event.status, event.dse, event.dla, event.lat)) + + def trace_end(): +- print "In trace_end:\n" ++ print("In trace_end:\n") + # We show the basic info for the 2 type of event classes + show_general_events() + show_pebs_ll() +@@ -123,29 +125,29 @@ def show_general_events(): + # Check the total record number in the table + count = con.execute("select count(*) from gen_events") + for t in count: +- print "There is %d records in gen_events table" % t[0] ++ print("There is %d records in gen_events table" % t[0]) + if t[0] == 0: + return + +- print "Statistics about the general events grouped by thread/symbol/dso: \n" ++ print("Statistics about the general events grouped by thread/symbol/dso: \n") + + # Group by thread + commq = con.execute("select comm, count(comm) from gen_events group by comm order by -count(comm)") +- print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42) ++ print("\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42)) + for row in commq: +- print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%16s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by symbol +- print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58)) + symbolq = con.execute("select symbol, count(symbol) from gen_events group by symbol order by -count(symbol)") + for row in symbolq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by dso +- print "\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74) ++ print("\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74)) + dsoq = con.execute("select dso, count(dso) from gen_events group by dso order by -count(dso)") + for row in dsoq: +- print "%40s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%40s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # + # This function just shows the basic info, and we could do more with the +@@ -156,35 +158,35 @@ def show_pebs_ll(): + + count = con.execute("select count(*) from pebs_ll") + for t in count: +- print "There is %d records in pebs_ll table" % t[0] ++ print("There is %d records in pebs_ll table" % t[0]) + if t[0] == 0: + return + +- print "Statistics about the PEBS Load Latency events grouped by thread/symbol/dse/latency: \n" ++ print("Statistics about the PEBS Load Latency events grouped by thread/symbol/dse/latency: \n") + + # Group by thread + commq = con.execute("select comm, count(comm) from pebs_ll group by comm order by -count(comm)") +- print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42) ++ print("\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42)) + for row in commq: +- print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%16s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by symbol +- print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58)) + symbolq = con.execute("select symbol, count(symbol) from pebs_ll group by symbol order by -count(symbol)") + for row in symbolq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by dse + dseq = con.execute("select dse, count(dse) from pebs_ll group by dse order by -count(dse)") +- print "\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58)) + for row in dseq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by latency + latq = con.execute("select lat, count(lat) from pebs_ll group by lat order by lat") +- print "\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58)) + for row in latq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + def trace_unhandled(event_name, context, event_fields_dict): +- print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) ++ print (' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())])) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch new file mode 100644 index 000000000..25633c098 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch @@ -0,0 +1,214 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 8 Mar 2019 16:05:16 -0800 +Subject: perf script python: Add Python3 support to export-to-postgresql.py +Origin: https://git.kernel.org/linus/1937b0560c3ea43b1b0f7d3617949ca50de8f8c0 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the export-to-postgresql.py script. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190309000518.2438-3-tonyj@suse.de +Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/export-to-postgresql.py | 58 +++++++++++++++------- + 1 file changed, 41 insertions(+), 17 deletions(-) + +--- a/tools/perf/scripts/python/export-to-postgresql.py ++++ b/tools/perf/scripts/python/export-to-postgresql.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -199,6 +201,18 @@ import datetime + + from PySide.QtSql import * + ++if sys.version_info < (3, 0): ++ def toserverstr(str): ++ return str ++ def toclientstr(str): ++ return str ++else: ++ # Assume UTF-8 server_encoding and client_encoding ++ def toserverstr(str): ++ return bytes(str, "UTF_8") ++ def toclientstr(str): ++ return bytes(str, "UTF_8") ++ + # Need to access PostgreSQL C library directly to use COPY FROM STDIN + from ctypes import * + libpq = CDLL("libpq.so.5") +@@ -234,12 +248,14 @@ perf_db_export_mode = True + perf_db_export_calls = False + perf_db_export_callchains = False + ++def printerr(*args, **kw_args): ++ print(*args, file=sys.stderr, **kw_args) + + def usage(): +- print >> sys.stderr, "Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]" +- print >> sys.stderr, "where: columns 'all' or 'branches'" +- print >> sys.stderr, " calls 'calls' => create calls and call_paths table" +- print >> sys.stderr, " callchains 'callchains' => create call_paths table" ++ printerr("Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]") ++ printerr("where: columns 'all' or 'branches'") ++ printerr(" calls 'calls' => create calls and call_paths table") ++ printerr(" callchains 'callchains' => create call_paths table") + raise Exception("Too few arguments") + + if (len(sys.argv) < 2): +@@ -273,7 +289,7 @@ def do_query(q, s): + return + raise Exception("Query failed: " + q.lastError().text()) + +-print datetime.datetime.today(), "Creating database..." ++print(datetime.datetime.today(), "Creating database...") + + db = QSqlDatabase.addDatabase('QPSQL') + query = QSqlQuery(db) +@@ -504,12 +520,12 @@ do_query(query, 'CREATE VIEW samples_vie + ' FROM samples') + + +-file_header = struct.pack("!11sii", "PGCOPY\n\377\r\n\0", 0, 0) +-file_trailer = "\377\377" ++file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0) ++file_trailer = b"\377\377" + + def open_output_file(file_name): + path_name = output_dir_name + "/" + file_name +- file = open(path_name, "w+") ++ file = open(path_name, "wb+") + file.write(file_header) + return file + +@@ -524,13 +540,13 @@ def copy_output_file_direct(file, table_ + + # Use COPY FROM STDIN because security may prevent postgres from accessing the files directly + def copy_output_file(file, table_name): +- conn = PQconnectdb("dbname = " + dbname) ++ conn = PQconnectdb(toclientstr("dbname = " + dbname)) + if (PQstatus(conn)): + raise Exception("COPY FROM STDIN PQconnectdb failed") + file.write(file_trailer) + file.seek(0) + sql = "COPY " + table_name + " FROM STDIN (FORMAT 'binary')" +- res = PQexec(conn, sql) ++ res = PQexec(conn, toclientstr(sql)) + if (PQresultStatus(res) != 4): + raise Exception("COPY FROM STDIN PQexec failed") + data = file.read(65536) +@@ -564,7 +580,7 @@ if perf_db_export_calls: + call_file = open_output_file("call_table.bin") + + def trace_begin(): +- print datetime.datetime.today(), "Writing to intermediate files..." ++ print(datetime.datetime.today(), "Writing to intermediate files...") + # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs + evsel_table(0, "unknown") + machine_table(0, 0, "unknown") +@@ -579,7 +595,7 @@ def trace_begin(): + unhandled_count = 0 + + def trace_end(): +- print datetime.datetime.today(), "Copying to database..." ++ print(datetime.datetime.today(), "Copying to database...") + copy_output_file(evsel_file, "selected_events") + copy_output_file(machine_file, "machines") + copy_output_file(thread_file, "threads") +@@ -594,7 +610,7 @@ def trace_end(): + if perf_db_export_calls: + copy_output_file(call_file, "calls") + +- print datetime.datetime.today(), "Removing intermediate files..." ++ print(datetime.datetime.today(), "Removing intermediate files...") + remove_output_file(evsel_file) + remove_output_file(machine_file) + remove_output_file(thread_file) +@@ -609,7 +625,7 @@ def trace_end(): + if perf_db_export_calls: + remove_output_file(call_file) + os.rmdir(output_dir_name) +- print datetime.datetime.today(), "Adding primary keys" ++ print(datetime.datetime.today(), "Adding primary keys") + do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)') + do_query(query, 'ALTER TABLE machines ADD PRIMARY KEY (id)') + do_query(query, 'ALTER TABLE threads ADD PRIMARY KEY (id)') +@@ -624,7 +640,7 @@ def trace_end(): + if perf_db_export_calls: + do_query(query, 'ALTER TABLE calls ADD PRIMARY KEY (id)') + +- print datetime.datetime.today(), "Adding foreign keys" ++ print(datetime.datetime.today(), "Adding foreign keys") + do_query(query, 'ALTER TABLE threads ' + 'ADD CONSTRAINT machinefk FOREIGN KEY (machine_id) REFERENCES machines (id),' + 'ADD CONSTRAINT processfk FOREIGN KEY (process_id) REFERENCES threads (id)') +@@ -659,8 +675,8 @@ def trace_end(): + do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') + + if (unhandled_count): +- print datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events" +- print datetime.datetime.today(), "Done" ++ print(datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events") ++ print(datetime.datetime.today(), "Done") + + def trace_unhandled(event_name, context, event_fields_dict): + global unhandled_count +@@ -670,12 +686,14 @@ def sched__sched_switch(*x): + pass + + def evsel_table(evsel_id, evsel_name, *x): ++ evsel_name = toserverstr(evsel_name) + n = len(evsel_name) + fmt = "!hiqi" + str(n) + "s" + value = struct.pack(fmt, 2, 8, evsel_id, n, evsel_name) + evsel_file.write(value) + + def machine_table(machine_id, pid, root_dir, *x): ++ root_dir = toserverstr(root_dir) + n = len(root_dir) + fmt = "!hiqiii" + str(n) + "s" + value = struct.pack(fmt, 3, 8, machine_id, 4, pid, n, root_dir) +@@ -686,6 +704,7 @@ def thread_table(thread_id, machine_id, + thread_file.write(value) + + def comm_table(comm_id, comm_str, *x): ++ comm_str = toserverstr(comm_str) + n = len(comm_str) + fmt = "!hiqi" + str(n) + "s" + value = struct.pack(fmt, 2, 8, comm_id, n, comm_str) +@@ -697,6 +716,9 @@ def comm_thread_table(comm_thread_id, co + comm_thread_file.write(value) + + def dso_table(dso_id, machine_id, short_name, long_name, build_id, *x): ++ short_name = toserverstr(short_name) ++ long_name = toserverstr(long_name) ++ build_id = toserverstr(build_id) + n1 = len(short_name) + n2 = len(long_name) + n3 = len(build_id) +@@ -705,12 +727,14 @@ def dso_table(dso_id, machine_id, short_ + dso_file.write(value) + + def symbol_table(symbol_id, dso_id, sym_start, sym_end, binding, symbol_name, *x): ++ symbol_name = toserverstr(symbol_name) + n = len(symbol_name) + fmt = "!hiqiqiqiqiii" + str(n) + "s" + value = struct.pack(fmt, 6, 8, symbol_id, 8, dso_id, 8, sym_start, 8, sym_end, 4, binding, n, symbol_name) + symbol_file.write(value) + + def branch_type_table(branch_type, name, *x): ++ name = toserverstr(name) + n = len(name) + fmt = "!hiii" + str(n) + "s" + value = struct.pack(fmt, 2, 4, branch_type, n, name) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch new file mode 100644 index 000000000..4301e54b6 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch @@ -0,0 +1,85 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 8 Mar 2019 16:05:17 -0800 +Subject: perf script python: Add Python3 support to export-to-sqlite.py +Origin: https://git.kernel.org/linus/ebf6c5c181abe9309788c6241d39602a1ce18723 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the export-to-sqlite.py script + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Acked-by: Adrian Hunter <adrian.hunter@intel.com> +Link: http://lkml.kernel.org/r/20190309000518.2438-4-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/export-to-sqlite.py | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +--- a/tools/perf/scripts/python/export-to-sqlite.py ++++ b/tools/perf/scripts/python/export-to-sqlite.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -60,11 +62,14 @@ perf_db_export_mode = True + perf_db_export_calls = False + perf_db_export_callchains = False + ++def printerr(*args, **keyword_args): ++ print(*args, file=sys.stderr, **keyword_args) ++ + def usage(): +- print >> sys.stderr, "Usage is: export-to-sqlite.py <database name> [<columns>] [<calls>] [<callchains>]" +- print >> sys.stderr, "where: columns 'all' or 'branches'" +- print >> sys.stderr, " calls 'calls' => create calls and call_paths table" +- print >> sys.stderr, " callchains 'callchains' => create call_paths table" ++ printerr("Usage is: export-to-sqlite.py <database name> [<columns>] [<calls>] [<callchains>]"); ++ printerr("where: columns 'all' or 'branches'"); ++ printerr(" calls 'calls' => create calls and call_paths table"); ++ printerr(" callchains 'callchains' => create call_paths table"); + raise Exception("Too few arguments") + + if (len(sys.argv) < 2): +@@ -100,7 +105,7 @@ def do_query_(q): + return + raise Exception("Query failed: " + q.lastError().text()) + +-print datetime.datetime.today(), "Creating database..." ++print(datetime.datetime.today(), "Creating database ...") + + db_exists = False + try: +@@ -376,7 +381,7 @@ if perf_db_export_calls: + call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") + + def trace_begin(): +- print datetime.datetime.today(), "Writing records..." ++ print(datetime.datetime.today(), "Writing records...") + do_query(query, 'BEGIN TRANSACTION') + # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs + evsel_table(0, "unknown") +@@ -394,13 +399,13 @@ unhandled_count = 0 + def trace_end(): + do_query(query, 'END TRANSACTION') + +- print datetime.datetime.today(), "Adding indexes" ++ print(datetime.datetime.today(), "Adding indexes") + if perf_db_export_calls: + do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') + + if (unhandled_count): +- print datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events" +- print datetime.datetime.today(), "Done" ++ print(datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events") ++ print(datetime.datetime.today(), "Done") + + def trace_unhandled(event_name, context, event_fields_dict): + global unhandled_count diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch new file mode 100644 index 000000000..617145de6 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch @@ -0,0 +1,76 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:08 -0800 +Subject: perf script python: Add Python3 support to + failed-syscalls-by-pid.py +Origin: https://git.kernel.org/linus/9b2700efc57f46fe63beee5f64fcfe2746936b4e +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the failed-syscalls-by-pid.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Tom Zanussi <tzanussi@gmail.com> +Link: http://lkml.kernel.org/r/20190222230619.17887-5-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/failed-syscalls-by-pid.py | 21 ++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +--- a/tools/perf/scripts/python/failed-syscalls-by-pid.py ++++ b/tools/perf/scripts/python/failed-syscalls-by-pid.py +@@ -5,6 +5,8 @@ + # Displays system-wide failed system call totals, broken down by pid. + # If a [comm] arg is specified, only syscalls called by [comm] are displayed. + ++from __future__ import print_function ++ + import os + import sys + +@@ -32,7 +34,7 @@ if len(sys.argv) > 1: + syscalls = autodict() + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + print_error_totals() +@@ -57,22 +59,21 @@ def syscalls__sys_exit(event_name, conte + + def print_error_totals(): + if for_comm is not None: +- print "\nsyscall errors for %s:\n\n" % (for_comm), ++ print("\nsyscall errors for %s:\n" % (for_comm)) + else: +- print "\nsyscall errors:\n\n", ++ print("\nsyscall errors:\n") + +- print "%-30s %10s\n" % ("comm [pid]", "count"), +- print "%-30s %10s\n" % ("------------------------------", \ +- "----------"), ++ print("%-30s %10s" % ("comm [pid]", "count")) ++ print("%-30s %10s" % ("------------------------------", "----------")) + + comm_keys = syscalls.keys() + for comm in comm_keys: + pid_keys = syscalls[comm].keys() + for pid in pid_keys: +- print "\n%s [%d]\n" % (comm, pid), ++ print("\n%s [%d]" % (comm, pid)) + id_keys = syscalls[comm][pid].keys() + for id in id_keys: +- print " syscall: %-16s\n" % syscall_name(id), ++ print(" syscall: %-16s" % syscall_name(id)) + ret_keys = syscalls[comm][pid][id].keys() +- for ret, val in sorted(syscalls[comm][pid][id].iteritems(), key = lambda(k, v): (v, k), reverse = True): +- print " err = %-20s %10d\n" % (strerror(ret), val), ++ for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" err = %-20s %10d" % (strerror(ret), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch new file mode 100644 index 000000000..3fb8f1baf --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch @@ -0,0 +1,57 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 1 Mar 2019 17:18:58 -0800 +Subject: perf script python: Add Python3 support to futex-contention.py +Origin: https://git.kernel.org/linus/de2ec16bd438945813198d4de2339a396904c206 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the futex-contention.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190302011903.2416-3-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/futex-contention.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/tools/perf/scripts/python/futex-contention.py ++++ b/tools/perf/scripts/python/futex-contention.py +@@ -10,6 +10,8 @@ + # + # Measures futex contention + ++from __future__ import print_function ++ + import os, sys + sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + from Util import * +@@ -33,18 +35,18 @@ def syscalls__sys_enter_futex(event, ctx + + def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain, + nr, ret): +- if thread_blocktime.has_key(tid): ++ if tid in thread_blocktime: + elapsed = nsecs(s, ns) - thread_blocktime[tid] + add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed) + del thread_blocktime[tid] + del thread_thislock[tid] + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + for (tid, lock) in lock_waits: + min, max, avg, count = lock_waits[tid, lock] +- print "%s[%d] lock %x contended %d times, %d avg ns" % \ +- (process_names[tid], tid, lock, count, avg) ++ print("%s[%d] lock %x contended %d times, %d avg ns" % ++ (process_names[tid], tid, lock, count, avg)) + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch new file mode 100644 index 000000000..c9dd3a189 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch @@ -0,0 +1,133 @@ +From: Tony Jones <tonyj@suse.de> +Date: Tue, 5 Mar 2019 08:19:02 -0800 +Subject: perf script python: Add Python3 support to intel-pt-events.py +Origin: https://git.kernel.org/linus/fdf2460c297f1bb2f3bd20b3b52903b267af9050 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the intel-pt-events.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Acked-by: Adrian Hunter <adrian.hunter@intel.com> +Link: http://lkml.kernel.org/r/fd26acf9-0c0f-717f-9664-a3c33043ce19@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/intel-pt-events.py | 32 ++++++++++++++++----------- + 1 file changed, 19 insertions(+), 13 deletions(-) + +--- a/tools/perf/scripts/python/intel-pt-events.py ++++ b/tools/perf/scripts/python/intel-pt-events.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -22,34 +24,34 @@ sys.path.append(os.environ['PERF_EXEC_PA + #from Core import * + + def trace_begin(): +- print "Intel PT Power Events and PTWRITE" ++ print("Intel PT Power Events and PTWRITE") + + def trace_end(): +- print "End" ++ print("End") + + def trace_unhandled(event_name, context, event_fields_dict): +- print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) ++ print(' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())])) + + def print_ptwrite(raw_buf): + data = struct.unpack_from("<IQ", raw_buf) + flags = data[0] + payload = data[1] + exact_ip = flags & 1 +- print "IP: %u payload: %#x" % (exact_ip, payload), ++ print("IP: %u payload: %#x" % (exact_ip, payload), end=' ') + + def print_cbr(raw_buf): + data = struct.unpack_from("<BBBBII", raw_buf) + cbr = data[0] + f = (data[4] + 500) / 1000 + p = ((cbr * 1000 / data[2]) + 5) / 10 +- print "%3u freq: %4u MHz (%3u%%)" % (cbr, f, p), ++ print("%3u freq: %4u MHz (%3u%%)" % (cbr, f, p), end=' ') + + def print_mwait(raw_buf): + data = struct.unpack_from("<IQ", raw_buf) + payload = data[1] + hints = payload & 0xff + extensions = (payload >> 32) & 0x3 +- print "hints: %#x extensions: %#x" % (hints, extensions), ++ print("hints: %#x extensions: %#x" % (hints, extensions), end=' ') + + def print_pwre(raw_buf): + data = struct.unpack_from("<IQ", raw_buf) +@@ -57,13 +59,14 @@ def print_pwre(raw_buf): + hw = (payload >> 7) & 1 + cstate = (payload >> 12) & 0xf + subcstate = (payload >> 8) & 0xf +- print "hw: %u cstate: %u sub-cstate: %u" % (hw, cstate, subcstate), ++ print("hw: %u cstate: %u sub-cstate: %u" % (hw, cstate, subcstate), ++ end=' ') + + def print_exstop(raw_buf): + data = struct.unpack_from("<I", raw_buf) + flags = data[0] + exact_ip = flags & 1 +- print "IP: %u" % (exact_ip), ++ print("IP: %u" % (exact_ip), end=' ') + + def print_pwrx(raw_buf): + data = struct.unpack_from("<IQ", raw_buf) +@@ -71,18 +74,21 @@ def print_pwrx(raw_buf): + deepest_cstate = payload & 0xf + last_cstate = (payload >> 4) & 0xf + wake_reason = (payload >> 8) & 0xf +- print "deepest cstate: %u last cstate: %u wake reason: %#x" % (deepest_cstate, last_cstate, wake_reason), ++ print("deepest cstate: %u last cstate: %u wake reason: %#x" % ++ (deepest_cstate, last_cstate, wake_reason), end=' ') + + def print_common_start(comm, sample, name): + ts = sample["time"] + cpu = sample["cpu"] + pid = sample["pid"] + tid = sample["tid"] +- print "%16s %5u/%-5u [%03u] %9u.%09u %7s:" % (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name), ++ print("%16s %5u/%-5u [%03u] %9u.%09u %7s:" % ++ (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name), ++ end=' ') + + def print_common_ip(sample, symbol, dso): + ip = sample["ip"] +- print "%16x %s (%s)" % (ip, symbol, dso) ++ print("%16x %s (%s)" % (ip, symbol, dso)) + + def process_event(param_dict): + event_attr = param_dict["attr"] +@@ -92,12 +98,12 @@ def process_event(param_dict): + name = param_dict["ev_name"] + + # Symbol and dso info are not always resolved +- if (param_dict.has_key("dso")): ++ if "dso" in param_dict: + dso = param_dict["dso"] + else: + dso = "[unknown]" + +- if (param_dict.has_key("symbol")): ++ if "symbol" in param_dict: + symbol = param_dict["symbol"] + else: + symbol = "[unknown]" diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch new file mode 100644 index 000000000..3b9e39cc9 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch @@ -0,0 +1,76 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:11 -0800 +Subject: perf script python: Add Python3 support to mem-phys-addr.py +Origin: https://git.kernel.org/linus/e4d053ddb4c48cbde27b4c5edd3cc8f957684e4f +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the mem-phys-addr.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190222230619.17887-8-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/mem-phys-addr.py | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +--- a/tools/perf/scripts/python/mem-phys-addr.py ++++ b/tools/perf/scripts/python/mem-phys-addr.py +@@ -4,6 +4,8 @@ + # Copyright (c) 2018, Intel Corporation. + + from __future__ import division ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -31,21 +33,23 @@ def parse_iomem(): + for i, j in enumerate(f): + m = re.split('-|:',j,2) + if m[2].strip() == 'System RAM': +- system_ram.append(long(m[0], 16)) +- system_ram.append(long(m[1], 16)) ++ system_ram.append(int(m[0], 16)) ++ system_ram.append(int(m[1], 16)) + if m[2].strip() == 'Persistent Memory': +- pmem.append(long(m[0], 16)) +- pmem.append(long(m[1], 16)) ++ pmem.append(int(m[0], 16)) ++ pmem.append(int(m[1], 16)) + + def print_memory_type(): +- print "Event: %s" % (event_name) +- print "%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), +- print "%-40s %10s %10s\n" % ("----------------------------------------", \ ++ print("Event: %s" % (event_name)) ++ print("%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), end='') ++ print("%-40s %10s %10s\n" % ("----------------------------------------", + "-----------", "-----------"), ++ end=''); + total = sum(load_mem_type_cnt.values()) + for mem_type, count in sorted(load_mem_type_cnt.most_common(), \ +- key = lambda(k, v): (v, k), reverse = True): +- print "%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total), ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print("%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total), ++ end='') + + def trace_begin(): + parse_iomem() +@@ -80,7 +84,7 @@ def find_memory_type(phys_addr): + f.seek(0, 0) + for j in f: + m = re.split('-|:',j,2) +- if long(m[0], 16) <= phys_addr <= long(m[1], 16): ++ if int(m[0], 16) <= phys_addr <= int(m[1], 16): + return m[2] + return "N/A" + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch new file mode 100644 index 000000000..631a94449 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch @@ -0,0 +1,59 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:12 -0800 +Subject: perf script python: Add Python3 support to net_dropmonitor.py +Origin: https://git.kernel.org/linus/8c42b9600e561666233b9c557a5209d0dc853ba1 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the net_dropmonitor.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Acked-by: Neil Horman <nhorman@tuxdriver.com> +Link: http://lkml.kernel.org/r/20190222230619.17887-9-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/net_dropmonitor.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/tools/perf/scripts/python/net_dropmonitor.py ++++ b/tools/perf/scripts/python/net_dropmonitor.py +@@ -1,6 +1,8 @@ + # Monitor the system for dropped packets and proudce a report of drop locations and counts + # SPDX-License-Identifier: GPL-2.0 + ++from __future__ import print_function ++ + import os + import sys + +@@ -50,19 +52,19 @@ def get_sym(sloc): + return (None, 0) + + def print_drop_table(): +- print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT") ++ print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")) + for i in drop_log.keys(): + (sym, off) = get_sym(i) + if sym == None: + sym = i +- print "%25s %25s %25s" % (sym, off, drop_log[i]) ++ print("%25s %25s %25s" % (sym, off, drop_log[i])) + + + def trace_begin(): +- print "Starting trace (Ctrl-C to dump results)" ++ print("Starting trace (Ctrl-C to dump results)") + + def trace_end(): +- print "Gathering kallsyms data" ++ print("Gathering kallsyms data") + get_kallsyms_table() + print_drop_table() + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch new file mode 100644 index 000000000..2d501dd4c --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch @@ -0,0 +1,180 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:05 -0800 +Subject: perf script python: Add Python3 support to netdev-times.py +Origin: https://git.kernel.org/linus/02b03ec383e0c79d73aa4b402b3427a8b490ef9f +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the netdev-times.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 +version is now v2.6. + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Sanagi Koki <sanagi.koki@jp.fujitsu.com> +Link: http://lkml.kernel.org/r/20190222230619.17887-2-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/netdev-times.py | 82 +++++++++++++++--------------- + 1 file changed, 42 insertions(+), 40 deletions(-) + +--- a/tools/perf/scripts/python/netdev-times.py ++++ b/tools/perf/scripts/python/netdev-times.py +@@ -8,6 +8,8 @@ + # dev=: show only thing related to specified device + # debug: work with debug mode. It shows buffer status. + ++from __future__ import print_function ++ + import os + import sys + +@@ -17,6 +19,7 @@ sys.path.append(os.environ['PERF_EXEC_PA + from perf_trace_context import * + from Core import * + from Util import * ++from functools import cmp_to_key + + all_event_list = []; # insert all tracepoint event related with this script + irq_dic = {}; # key is cpu and value is a list which stacks irqs +@@ -61,12 +64,12 @@ def diff_msec(src, dst): + def print_transmit(hunk): + if dev != 0 and hunk['dev'].find(dev) < 0: + return +- print "%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % \ ++ print("%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % + (hunk['dev'], hunk['len'], + nsecs_secs(hunk['queue_t']), + nsecs_nsecs(hunk['queue_t'])/1000, + diff_msec(hunk['queue_t'], hunk['xmit_t']), +- diff_msec(hunk['xmit_t'], hunk['free_t'])) ++ diff_msec(hunk['xmit_t'], hunk['free_t']))) + + # Format for displaying rx packet processing + PF_IRQ_ENTRY= " irq_entry(+%.3fmsec irq=%d:%s)" +@@ -98,55 +101,55 @@ def print_receive(hunk): + if show_hunk == 0: + return + +- print "%d.%06dsec cpu=%d" % \ +- (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu) ++ print("%d.%06dsec cpu=%d" % ++ (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu)) + for i in range(len(irq_list)): +- print PF_IRQ_ENTRY % \ ++ print(PF_IRQ_ENTRY % + (diff_msec(base_t, irq_list[i]['irq_ent_t']), +- irq_list[i]['irq'], irq_list[i]['name']) +- print PF_JOINT ++ irq_list[i]['irq'], irq_list[i]['name'])) ++ print(PF_JOINT) + irq_event_list = irq_list[i]['event_list'] + for j in range(len(irq_event_list)): + irq_event = irq_event_list[j] + if irq_event['event'] == 'netif_rx': +- print PF_NET_RX % \ ++ print(PF_NET_RX % + (diff_msec(base_t, irq_event['time']), +- irq_event['skbaddr']) +- print PF_JOINT +- print PF_SOFT_ENTRY % \ +- diff_msec(base_t, hunk['sirq_ent_t']) +- print PF_JOINT ++ irq_event['skbaddr'])) ++ print(PF_JOINT) ++ print(PF_SOFT_ENTRY % ++ diff_msec(base_t, hunk['sirq_ent_t'])) ++ print(PF_JOINT) + event_list = hunk['event_list'] + for i in range(len(event_list)): + event = event_list[i] + if event['event_name'] == 'napi_poll': +- print PF_NAPI_POLL % \ +- (diff_msec(base_t, event['event_t']), event['dev']) ++ print(PF_NAPI_POLL % ++ (diff_msec(base_t, event['event_t']), event['dev'])) + if i == len(event_list) - 1: +- print "" ++ print("") + else: +- print PF_JOINT ++ print(PF_JOINT) + else: +- print PF_NET_RECV % \ ++ print(PF_NET_RECV % + (diff_msec(base_t, event['event_t']), event['skbaddr'], +- event['len']) ++ event['len'])) + if 'comm' in event.keys(): +- print PF_WJOINT +- print PF_CPY_DGRAM % \ ++ print(PF_WJOINT) ++ print(PF_CPY_DGRAM % + (diff_msec(base_t, event['comm_t']), +- event['pid'], event['comm']) ++ event['pid'], event['comm'])) + elif 'handle' in event.keys(): +- print PF_WJOINT ++ print(PF_WJOINT) + if event['handle'] == "kfree_skb": +- print PF_KFREE_SKB % \ ++ print(PF_KFREE_SKB % + (diff_msec(base_t, + event['comm_t']), +- event['location']) ++ event['location'])) + elif event['handle'] == "consume_skb": +- print PF_CONS_SKB % \ ++ print(PF_CONS_SKB % + diff_msec(base_t, +- event['comm_t']) +- print PF_JOINT ++ event['comm_t'])) ++ print(PF_JOINT) + + def trace_begin(): + global show_tx +@@ -172,8 +175,7 @@ def trace_begin(): + + def trace_end(): + # order all events in time +- all_event_list.sort(lambda a,b :cmp(a[EINFO_IDX_TIME], +- b[EINFO_IDX_TIME])) ++ all_event_list.sort(key=cmp_to_key(lambda a,b :a[EINFO_IDX_TIME] < b[EINFO_IDX_TIME])) + # process all events + for i in range(len(all_event_list)): + event_info = all_event_list[i] +@@ -210,19 +212,19 @@ def trace_end(): + print_receive(receive_hunk_list[i]) + # display transmit hunks + if show_tx: +- print " dev len Qdisc " \ +- " netdevice free" ++ print(" dev len Qdisc " ++ " netdevice free") + for i in range(len(tx_free_list)): + print_transmit(tx_free_list[i]) + if debug: +- print "debug buffer status" +- print "----------------------------" +- print "xmit Qdisc:remain:%d overflow:%d" % \ +- (len(tx_queue_list), of_count_tx_queue_list) +- print "xmit netdevice:remain:%d overflow:%d" % \ +- (len(tx_xmit_list), of_count_tx_xmit_list) +- print "receive:remain:%d overflow:%d" % \ +- (len(rx_skb_list), of_count_rx_skb_list) ++ print("debug buffer status") ++ print("----------------------------") ++ print("xmit Qdisc:remain:%d overflow:%d" % ++ (len(tx_queue_list), of_count_tx_queue_list)) ++ print("xmit netdevice:remain:%d overflow:%d" % ++ (len(tx_xmit_list), of_count_tx_xmit_list)) ++ print("receive:remain:%d overflow:%d" % ++ (len(rx_skb_list), of_count_rx_skb_list)) + + # called from perf, when it finds a correspoinding event + def irq__softirq_entry(name, context, cpu, sec, nsec, pid, comm, callchain, vec): diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch new file mode 100644 index 000000000..1c8fdc5a1 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch @@ -0,0 +1,87 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:13 -0800 +Subject: perf script python: Add Python3 support to powerpc-hcalls.py +Origin: https://git.kernel.org/linus/118af5bf799bd1876c3999766d1d2f845d45f019 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the powerpc-hcalls.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com> +Link: http://lkml.kernel.org/r/20190222230619.17887-10-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/powerpc-hcalls.py | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/tools/perf/scripts/python/powerpc-hcalls.py ++++ b/tools/perf/scripts/python/powerpc-hcalls.py +@@ -4,6 +4,8 @@ + # + # Hypervisor call statisics + ++from __future__ import print_function ++ + import os + import sys + +@@ -149,7 +151,7 @@ hcall_table = { + } + + def hcall_table_lookup(opcode): +- if (hcall_table.has_key(opcode)): ++ if (opcode in hcall_table): + return hcall_table[opcode] + else: + return opcode +@@ -157,8 +159,8 @@ def hcall_table_lookup(opcode): + print_ptrn = '%-28s%10s%10s%10s%10s' + + def trace_end(): +- print print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)') +- print '-' * 68 ++ print(print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)')) ++ print('-' * 68) + for opcode in output: + h_name = hcall_table_lookup(opcode) + time = output[opcode]['time'] +@@ -166,14 +168,14 @@ def trace_end(): + min_t = output[opcode]['min'] + max_t = output[opcode]['max'] + +- print print_ptrn % (h_name, cnt, min_t, max_t, time/cnt) ++ print(print_ptrn % (h_name, cnt, min_t, max_t, time//cnt)) + + def powerpc__hcall_exit(name, context, cpu, sec, nsec, pid, comm, callchain, + opcode, retval): +- if (d_enter.has_key(cpu) and d_enter[cpu].has_key(opcode)): ++ if (cpu in d_enter and opcode in d_enter[cpu]): + diff = nsecs(sec, nsec) - d_enter[cpu][opcode] + +- if (output.has_key(opcode)): ++ if (opcode in output): + output[opcode]['time'] += diff + output[opcode]['cnt'] += 1 + if (output[opcode]['min'] > diff): +@@ -190,11 +192,11 @@ def powerpc__hcall_exit(name, context, c + + del d_enter[cpu][opcode] + # else: +-# print "Can't find matching hcall_enter event. Ignoring sample" ++# print("Can't find matching hcall_enter event. Ignoring sample") + + def powerpc__hcall_entry(event_name, context, cpu, sec, nsec, pid, comm, + callchain, opcode): +- if (d_enter.has_key(cpu)): ++ if (cpu in d_enter): + d_enter[cpu][opcode] = nsecs(sec, nsec) + else: + d_enter[cpu] = {opcode: nsecs(sec, nsec)} diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch new file mode 100644 index 000000000..fa90ed99a --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch @@ -0,0 +1,69 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:14 -0800 +Subject: perf script python: Add Python3 support to sctop.py +Origin: https://git.kernel.org/linus/ee75a896ae535d4219a82cc361be96394536f3ba +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the sctop.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Tom Zanussi <tzanussi@gmail.com> +Link: http://lkml.kernel.org/r/20190222230619.17887-11-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/sctop.py | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +--- a/tools/perf/scripts/python/sctop.py ++++ b/tools/perf/scripts/python/sctop.py +@@ -8,7 +8,14 @@ + # will be refreshed every [interval] seconds. The default interval is + # 3 seconds. + +-import os, sys, thread, time ++from __future__ import print_function ++ ++import os, sys, time ++ ++try: ++ import thread ++except ImportError: ++ import _thread as thread + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +@@ -62,18 +69,19 @@ def print_syscall_totals(interval): + while 1: + clear_term() + if for_comm is not None: +- print "\nsyscall events for %s:\n\n" % (for_comm), ++ print("\nsyscall events for %s:\n" % (for_comm)) + else: +- print "\nsyscall events:\n\n", ++ print("\nsyscall events:\n") + +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "----------"), ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ++ ("----------------------------------------", ++ "----------")) + +- for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ ++ for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ + reverse = True): + try: +- print "%-40s %10d\n" % (syscall_name(id), val), ++ print("%-40s %10d" % (syscall_name(id), val)) + except TypeError: + pass + syscalls.clear() diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch new file mode 100644 index 000000000..ff41b4a20 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch @@ -0,0 +1,45 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:15 -0800 +Subject: perf script python: Add Python3 support to stackcollapse.py +Origin: https://git.kernel.org/linus/6d22d9991cf37edfe861569e2433342ad56206a7 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the stackcollapse.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Paolo Bonzini <pbonzini@redhat.com> <pbonzini@redhat.com> +Link: http://lkml.kernel.org/r/20190222230619.17887-12-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/stackcollapse.py | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/tools/perf/scripts/python/stackcollapse.py ++++ b/tools/perf/scripts/python/stackcollapse.py +@@ -19,6 +19,8 @@ + # Written by Paolo Bonzini <pbonzini@redhat.com> + # Based on Brendan Gregg's stackcollapse-perf.pl script. + ++from __future__ import print_function ++ + import os + import sys + from collections import defaultdict +@@ -120,7 +122,6 @@ def process_event(param_dict): + lines[stack_string] = lines[stack_string] + 1 + + def trace_end(): +- list = lines.keys() +- list.sort() ++ list = sorted(lines) + for stack in list: +- print "%s %d" % (stack, lines[stack]) ++ print("%s %d" % (stack, lines[stack])) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch new file mode 100644 index 000000000..8ef6fa8b5 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch @@ -0,0 +1,61 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:16 -0800 +Subject: perf script python: Add Python3 support to stat-cpi.py +Origin: https://git.kernel.org/linus/e985bf761db7646cebcd236249da08bd264069de +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the stat-cpi.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Cc: Jiri Olsa <jolsa@kernel.org> +Link: http://lkml.kernel.org/r/20190222230619.17887-13-tonyj@suse.de +Signed-off-by: Tony Jones <tonyj@suse.de> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/stat-cpi.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/tools/perf/scripts/python/stat-cpi.py ++++ b/tools/perf/scripts/python/stat-cpi.py +@@ -1,6 +1,8 @@ + #!/usr/bin/env python + # SPDX-License-Identifier: GPL-2.0 + ++from __future__ import print_function ++ + data = {} + times = [] + threads = [] +@@ -20,8 +22,8 @@ def store_key(time, cpu, thread): + threads.append(thread) + + def store(time, event, cpu, thread, val, ena, run): +- #print "event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" % \ +- # (event, cpu, thread, time, val, ena, run) ++ #print("event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" % ++ # (event, cpu, thread, time, val, ena, run)) + + store_key(time, cpu, thread) + key = get_key(time, event, cpu, thread) +@@ -59,7 +61,7 @@ def stat__interval(time): + if ins != 0: + cpi = cyc/float(ins) + +- print "%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins) ++ print("%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins)) + + def trace_end(): + pass +@@ -75,4 +77,4 @@ def trace_end(): + # if ins != 0: + # cpi = cyc/float(ins) + # +-# print "time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi) ++# print("time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi)) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch new file mode 100644 index 000000000..9dc84ceac --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch @@ -0,0 +1,74 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:18 -0800 +Subject: perf script python: Add Python3 support to + syscall-counts-by-pid.py +Origin: https://git.kernel.org/linus/de667cce7f4f96b6e22da8fd9c065b961f355080 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the syscall-counts-by-pid.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190222230619.17887-15-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/syscall-counts-by-pid.py | 22 +++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +--- a/tools/perf/scripts/python/syscall-counts-by-pid.py ++++ b/tools/perf/scripts/python/syscall-counts-by-pid.py +@@ -5,6 +5,8 @@ + # Displays system-wide system call totals, broken down by syscall. + # If a [comm] arg is specified, only syscalls called by [comm] are displayed. + ++from __future__ import print_function ++ + import os, sys + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +@@ -31,7 +33,7 @@ if len(sys.argv) > 1: + syscalls = autodict() + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + print_syscall_totals() +@@ -55,20 +57,20 @@ def syscalls__sys_enter(event_name, cont + + def print_syscall_totals(): + if for_comm is not None: +- print "\nsyscall events for %s:\n\n" % (for_comm), ++ print("\nsyscall events for %s:\n" % (for_comm)) + else: +- print "\nsyscall events by comm/pid:\n\n", ++ print("\nsyscall events by comm/pid:\n") + +- print "%-40s %10s\n" % ("comm [pid]/syscalls", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "----------"), ++ print("%-40s %10s" % ("comm [pid]/syscalls", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "----------")) + + comm_keys = syscalls.keys() + for comm in comm_keys: + pid_keys = syscalls[comm].keys() + for pid in pid_keys: +- print "\n%s [%d]\n" % (comm, pid), ++ print("\n%s [%d]" % (comm, pid)) + id_keys = syscalls[comm][pid].keys() +- for id, val in sorted(syscalls[comm][pid].iteritems(), \ +- key = lambda(k, v): (v, k), reverse = True): +- print " %-38s %10d\n" % (syscall_name(id), val), ++ for id, val in sorted(syscalls[comm][pid].items(), \ ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" %-38s %10d" % (syscall_name(id), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch new file mode 100644 index 000000000..59c654479 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch @@ -0,0 +1,65 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 22 Feb 2019 15:06:17 -0800 +Subject: perf script python: Add Python3 support to syscall-counts.py +Origin: https://git.kernel.org/linus/1d1b0dbb859d175eb512a9f0e1ca7e44bd0192cd +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the syscall-counts.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190222230619.17887-14-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/syscall-counts.py | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/tools/perf/scripts/python/syscall-counts.py ++++ b/tools/perf/scripts/python/syscall-counts.py +@@ -5,6 +5,8 @@ + # Displays system-wide system call totals, broken down by syscall. + # If a [comm] arg is specified, only syscalls called by [comm] are displayed. + ++from __future__ import print_function ++ + import os + import sys + +@@ -28,7 +30,7 @@ if len(sys.argv) > 1: + syscalls = autodict() + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + print_syscall_totals() +@@ -51,14 +53,14 @@ def syscalls__sys_enter(event_name, cont + + def print_syscall_totals(): + if for_comm is not None: +- print "\nsyscall events for %s:\n\n" % (for_comm), ++ print("\nsyscall events for %s:\n" % (for_comm)) + else: +- print "\nsyscall events:\n\n", ++ print("\nsyscall events:\n") + +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "-----------"), ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "-----------")) + +- for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ ++ for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ + reverse = True): +- print "%-40s %10d\n" % (syscall_name(id), val), ++ print("%-40s %10d" % (syscall_name(id), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch b/debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch new file mode 100644 index 000000000..b18ceaea8 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch @@ -0,0 +1,511 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 1 Mar 2019 17:18:57 -0800 +Subject: perf script python: Remove mixed indentation +Origin: https://git.kernel.org/linus/b504d7f6876515b74c8e27a44ccdb22372616d97 +Bug-Debian: https://bugs.debian.org/944641 + +Remove mixed indentation in Python scripts. Revert to either all tabs +(most common form) or all spaces (4 or 8) depending on what was the +intent of the original commit. This is necessary to complete Python3 +support as it will flag an error if it encounters mixed indentation. + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190302011903.2416-2-tonyj@suse.de +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/check-perf-trace.py | 69 +++++++++----------- + tools/perf/scripts/python/compaction-times.py | 8 +- + tools/perf/scripts/python/event_analyzing_sample.py | 6 - + tools/perf/scripts/python/failed-syscalls-by-pid.py | 34 ++++----- + tools/perf/scripts/python/futex-contention.py | 2 + tools/perf/scripts/python/intel-pt-events.py | 28 ++++---- + tools/perf/scripts/python/mem-phys-addr.py | 7 +- + tools/perf/scripts/python/net_dropmonitor.py | 2 + tools/perf/scripts/python/netdev-times.py | 12 ++- + tools/perf/scripts/python/sched-migration.py | 6 - + tools/perf/scripts/python/sctop.py | 13 ++- + tools/perf/scripts/python/stackcollapse.py | 2 + tools/perf/scripts/python/syscall-counts-by-pid.py | 47 ++++++------- + tools/perf/scripts/python/syscall-counts.py | 27 +++---- + 14 files changed, 132 insertions(+), 131 deletions(-) + +--- a/tools/perf/scripts/python/check-perf-trace.py ++++ b/tools/perf/scripts/python/check-perf-trace.py +@@ -23,60 +23,59 @@ def trace_begin(): + pass + + def trace_end(): +- print_unhandled() ++ print_unhandled() + + def irq__softirq_entry(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, vec): +- print_header(event_name, common_cpu, common_secs, common_nsecs, +- common_pid, common_comm) ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, vec): ++ print_header(event_name, common_cpu, common_secs, common_nsecs, ++ common_pid, common_comm) + +- print_uncommon(context) ++ print_uncommon(context) + +- print "vec=%s\n" % \ +- (symbol_str("irq__softirq_entry", "vec", vec)), ++ print "vec=%s\n" % (symbol_str("irq__softirq_entry", "vec", vec)), + + def kmem__kmalloc(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, call_site, ptr, bytes_req, bytes_alloc, +- gfp_flags): +- print_header(event_name, common_cpu, common_secs, common_nsecs, +- common_pid, common_comm) ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, call_site, ptr, bytes_req, bytes_alloc, ++ gfp_flags): ++ print_header(event_name, common_cpu, common_secs, common_nsecs, ++ common_pid, common_comm) + +- print_uncommon(context) ++ print_uncommon(context) + +- print "call_site=%u, ptr=%u, bytes_req=%u, " \ ++ print "call_site=%u, ptr=%u, bytes_req=%u, " \ + "bytes_alloc=%u, gfp_flags=%s\n" % \ + (call_site, ptr, bytes_req, bytes_alloc, +- + flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), + + def trace_unhandled(event_name, context, event_fields_dict): +- try: +- unhandled[event_name] += 1 +- except TypeError: +- unhandled[event_name] = 1 ++ try: ++ unhandled[event_name] += 1 ++ except TypeError: ++ unhandled[event_name] = 1 + + def print_header(event_name, cpu, secs, nsecs, pid, comm): + print "%-20s %5u %05u.%09u %8u %-20s " % \ +- (event_name, cpu, secs, nsecs, pid, comm), ++ (event_name, cpu, secs, nsecs, pid, comm), + + # print trace fields not included in handler args + def print_uncommon(context): +- print "common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, " \ +- % (common_pc(context), trace_flag_str(common_flags(context)), \ +- common_lock_depth(context)) ++ print "common_preempt_count=%d, common_flags=%s, " \ ++ "common_lock_depth=%d, " % \ ++ (common_pc(context), trace_flag_str(common_flags(context)), ++ common_lock_depth(context)) + + def print_unhandled(): +- keys = unhandled.keys() +- if not keys: +- return +- +- print "\nunhandled events:\n\n", +- +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "-----------"), ++ keys = unhandled.keys() ++ if not keys: ++ return ++ ++ print "\nunhandled events:\n\n", ++ ++ print "%-40s %10s\n" % ("event", "count"), ++ print "%-40s %10s\n" % ("----------------------------------------", \ ++ "-----------"), + +- for event_name in keys: +- print "%-40s %10d\n" % (event_name, unhandled[event_name]) ++ for event_name in keys: ++ print "%-40s %10d\n" % (event_name, unhandled[event_name]) +--- a/tools/perf/scripts/python/compaction-times.py ++++ b/tools/perf/scripts/python/compaction-times.py +@@ -216,15 +216,15 @@ def compaction__mm_compaction_migratepag + pair(nr_migrated, nr_failed), None, None) + + def compaction__mm_compaction_isolate_freepages(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): + + chead.increment_pending(common_pid, + None, pair(nr_scanned, nr_taken), None) + + def compaction__mm_compaction_isolate_migratepages(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): + + chead.increment_pending(common_pid, + None, None, pair(nr_scanned, nr_taken)) +--- a/tools/perf/scripts/python/event_analyzing_sample.py ++++ b/tools/perf/scripts/python/event_analyzing_sample.py +@@ -37,7 +37,7 @@ con = sqlite3.connect("/dev/shm/perf.db" + con.isolation_level = None + + def trace_begin(): +- print "In trace_begin:\n" ++ print "In trace_begin:\n" + + # + # Will create several tables at the start, pebs_ll is for PEBS data with +@@ -102,7 +102,7 @@ def insert_db(event): + event.ip, event.status, event.dse, event.dla, event.lat)) + + def trace_end(): +- print "In trace_end:\n" ++ print "In trace_end:\n" + # We show the basic info for the 2 type of event classes + show_general_events() + show_pebs_ll() +@@ -187,4 +187,4 @@ def show_pebs_ll(): + print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) + + def trace_unhandled(event_name, context, event_fields_dict): +- print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) ++ print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) +--- a/tools/perf/scripts/python/failed-syscalls-by-pid.py ++++ b/tools/perf/scripts/python/failed-syscalls-by-pid.py +@@ -58,22 +58,22 @@ def syscalls__sys_exit(event_name, conte + raw_syscalls__sys_exit(**locals()) + + def print_error_totals(): +- if for_comm is not None: +- print("\nsyscall errors for %s:\n" % (for_comm)) +- else: +- print("\nsyscall errors:\n") ++ if for_comm is not None: ++ print("\nsyscall errors for %s:\n" % (for_comm)) ++ else: ++ print("\nsyscall errors:\n") + +- print("%-30s %10s" % ("comm [pid]", "count")) +- print("%-30s %10s" % ("------------------------------", "----------")) ++ print("%-30s %10s" % ("comm [pid]", "count")) ++ print("%-30s %10s" % ("------------------------------", "----------")) + +- comm_keys = syscalls.keys() +- for comm in comm_keys: +- pid_keys = syscalls[comm].keys() +- for pid in pid_keys: +- print("\n%s [%d]" % (comm, pid)) +- id_keys = syscalls[comm][pid].keys() +- for id in id_keys: +- print(" syscall: %-16s" % syscall_name(id)) +- ret_keys = syscalls[comm][pid][id].keys() +- for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): +- print(" err = %-20s %10d" % (strerror(ret), val)) ++ comm_keys = syscalls.keys() ++ for comm in comm_keys: ++ pid_keys = syscalls[comm].keys() ++ for pid in pid_keys: ++ print("\n%s [%d]" % (comm, pid)) ++ id_keys = syscalls[comm][pid].keys() ++ for id in id_keys: ++ print(" syscall: %-16s" % syscall_name(id)) ++ ret_keys = syscalls[comm][pid][id].keys() ++ for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" err = %-20s %10d" % (strerror(ret), val)) +--- a/tools/perf/scripts/python/futex-contention.py ++++ b/tools/perf/scripts/python/futex-contention.py +@@ -46,5 +46,5 @@ def trace_end(): + for (tid, lock) in lock_waits: + min, max, avg, count = lock_waits[tid, lock] + print "%s[%d] lock %x contended %d times, %d avg ns" % \ +- (process_names[tid], tid, lock, count, avg) ++ (process_names[tid], tid, lock, count, avg) + +--- a/tools/perf/scripts/python/intel-pt-events.py ++++ b/tools/perf/scripts/python/intel-pt-events.py +@@ -85,22 +85,22 @@ def print_common_ip(sample, symbol, dso) + print "%16x %s (%s)" % (ip, symbol, dso) + + def process_event(param_dict): +- event_attr = param_dict["attr"] +- sample = param_dict["sample"] +- raw_buf = param_dict["raw_buf"] +- comm = param_dict["comm"] +- name = param_dict["ev_name"] ++ event_attr = param_dict["attr"] ++ sample = param_dict["sample"] ++ raw_buf = param_dict["raw_buf"] ++ comm = param_dict["comm"] ++ name = param_dict["ev_name"] + +- # Symbol and dso info are not always resolved +- if (param_dict.has_key("dso")): +- dso = param_dict["dso"] +- else: +- dso = "[unknown]" ++ # Symbol and dso info are not always resolved ++ if (param_dict.has_key("dso")): ++ dso = param_dict["dso"] ++ else: ++ dso = "[unknown]" + +- if (param_dict.has_key("symbol")): +- symbol = param_dict["symbol"] +- else: +- symbol = "[unknown]" ++ if (param_dict.has_key("symbol")): ++ symbol = param_dict["symbol"] ++ else: ++ symbol = "[unknown]" + + if name == "ptwrite": + print_common_start(comm, sample, name) +--- a/tools/perf/scripts/python/mem-phys-addr.py ++++ b/tools/perf/scripts/python/mem-phys-addr.py +@@ -44,12 +44,13 @@ def print_memory_type(): + print("%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), end='') + print("%-40s %10s %10s\n" % ("----------------------------------------", + "-----------", "-----------"), +- end=''); ++ end=''); + total = sum(load_mem_type_cnt.values()) + for mem_type, count in sorted(load_mem_type_cnt.most_common(), \ + key = lambda kv: (kv[1], kv[0]), reverse = True): +- print("%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total), +- end='') ++ print("%-40s %10d %10.1f%%\n" % ++ (mem_type, count, 100 * count / total), ++ end='') + + def trace_begin(): + parse_iomem() +--- a/tools/perf/scripts/python/net_dropmonitor.py ++++ b/tools/perf/scripts/python/net_dropmonitor.py +@@ -7,7 +7,7 @@ import os + import sys + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') ++ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + + from perf_trace_context import * + from Core import * +--- a/tools/perf/scripts/python/netdev-times.py ++++ b/tools/perf/scripts/python/netdev-times.py +@@ -124,14 +124,16 @@ def print_receive(hunk): + event = event_list[i] + if event['event_name'] == 'napi_poll': + print(PF_NAPI_POLL % +- (diff_msec(base_t, event['event_t']), event['dev'])) ++ (diff_msec(base_t, event['event_t']), ++ event['dev'])) + if i == len(event_list) - 1: + print("") + else: + print(PF_JOINT) + else: + print(PF_NET_RECV % +- (diff_msec(base_t, event['event_t']), event['skbaddr'], ++ (diff_msec(base_t, event['event_t']), ++ event['skbaddr'], + event['len'])) + if 'comm' in event.keys(): + print(PF_WJOINT) +@@ -256,7 +258,7 @@ def irq__irq_handler_exit(name, context, + all_event_list.append(event_info) + + def napi__napi_poll(name, context, cpu, sec, nsec, pid, comm, callchain, napi, +- dev_name, work=None, budget=None): ++ dev_name, work=None, budget=None): + event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, + napi, dev_name, work, budget) + all_event_list.append(event_info) +@@ -353,7 +355,7 @@ def handle_irq_softirq_exit(event_info): + if irq_list == [] or event_list == 0: + return + rec_data = {'sirq_ent_t':sirq_ent_t, 'sirq_ext_t':time, +- 'irq_list':irq_list, 'event_list':event_list} ++ 'irq_list':irq_list, 'event_list':event_list} + # merge information realted to a NET_RX softirq + receive_hunk_list.append(rec_data) + +@@ -390,7 +392,7 @@ def handle_netif_receive_skb(event_info) + skbaddr, skblen, dev_name) = event_info + if cpu in net_rx_dic.keys(): + rec_data = {'event_name':'netif_receive_skb', +- 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} ++ 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} + event_list = net_rx_dic[cpu]['event_list'] + event_list.append(rec_data) + rx_skb_list.insert(0, rec_data) +--- a/tools/perf/scripts/python/sched-migration.py ++++ b/tools/perf/scripts/python/sched-migration.py +@@ -16,10 +16,10 @@ import sys + + from collections import defaultdict + try: +- from UserList import UserList ++ from UserList import UserList + except ImportError: +- # Python 3: UserList moved to the collections package +- from collections import UserList ++ # Python 3: UserList moved to the collections package ++ from collections import UserList + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +--- a/tools/perf/scripts/python/sctop.py ++++ b/tools/perf/scripts/python/sctop.py +@@ -13,9 +13,9 @@ from __future__ import print_function + import os, sys, time + + try: +- import thread ++ import thread + except ImportError: +- import _thread as thread ++ import _thread as thread + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +@@ -75,11 +75,12 @@ def print_syscall_totals(interval): + + print("%-40s %10s" % ("event", "count")) + print("%-40s %10s" % +- ("----------------------------------------", +- "----------")) ++ ("----------------------------------------", ++ "----------")) + +- for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ +- reverse = True): ++ for id, val in sorted(syscalls.items(), ++ key = lambda kv: (kv[1], kv[0]), ++ reverse = True): + try: + print("%-40s %10d" % (syscall_name(id), val)) + except TypeError: +--- a/tools/perf/scripts/python/stackcollapse.py ++++ b/tools/perf/scripts/python/stackcollapse.py +@@ -27,7 +27,7 @@ from collections import defaultdict + from optparse import OptionParser, make_option + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') ++ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + + from perf_trace_context import * + from Core import * +--- a/tools/perf/scripts/python/syscall-counts-by-pid.py ++++ b/tools/perf/scripts/python/syscall-counts-by-pid.py +@@ -39,11 +39,10 @@ def trace_end(): + print_syscall_totals() + + def raw_syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, id, args): +- ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, id, args): + if (for_comm and common_comm != for_comm) or \ +- (for_pid and common_pid != for_pid ): ++ (for_pid and common_pid != for_pid ): + return + try: + syscalls[common_comm][common_pid][id] += 1 +@@ -51,26 +50,26 @@ def raw_syscalls__sys_enter(event_name, + syscalls[common_comm][common_pid][id] = 1 + + def syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- id, args): ++ common_secs, common_nsecs, common_pid, common_comm, ++ id, args): + raw_syscalls__sys_enter(**locals()) + + def print_syscall_totals(): +- if for_comm is not None: +- print("\nsyscall events for %s:\n" % (for_comm)) +- else: +- print("\nsyscall events by comm/pid:\n") +- +- print("%-40s %10s" % ("comm [pid]/syscalls", "count")) +- print("%-40s %10s" % ("----------------------------------------", +- "----------")) +- +- comm_keys = syscalls.keys() +- for comm in comm_keys: +- pid_keys = syscalls[comm].keys() +- for pid in pid_keys: +- print("\n%s [%d]" % (comm, pid)) +- id_keys = syscalls[comm][pid].keys() +- for id, val in sorted(syscalls[comm][pid].items(), \ +- key = lambda kv: (kv[1], kv[0]), reverse = True): +- print(" %-38s %10d" % (syscall_name(id), val)) ++ if for_comm is not None: ++ print("\nsyscall events for %s:\n" % (for_comm)) ++ else: ++ print("\nsyscall events by comm/pid:\n") ++ ++ print("%-40s %10s" % ("comm [pid]/syscalls", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "----------")) ++ ++ comm_keys = syscalls.keys() ++ for comm in comm_keys: ++ pid_keys = syscalls[comm].keys() ++ for pid in pid_keys: ++ print("\n%s [%d]" % (comm, pid)) ++ id_keys = syscalls[comm][pid].keys() ++ for id, val in sorted(syscalls[comm][pid].items(), ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" %-38s %10d" % (syscall_name(id), val)) +--- a/tools/perf/scripts/python/syscall-counts.py ++++ b/tools/perf/scripts/python/syscall-counts.py +@@ -36,8 +36,8 @@ def trace_end(): + print_syscall_totals() + + def raw_syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, id, args): ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, id, args): + if for_comm is not None: + if common_comm != for_comm: + return +@@ -47,20 +47,19 @@ def raw_syscalls__sys_enter(event_name, + syscalls[id] = 1 + + def syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- id, args): ++ common_secs, common_nsecs, common_pid, common_comm, id, args): + raw_syscalls__sys_enter(**locals()) + + def print_syscall_totals(): +- if for_comm is not None: +- print("\nsyscall events for %s:\n" % (for_comm)) +- else: +- print("\nsyscall events:\n") ++ if for_comm is not None: ++ print("\nsyscall events for %s:\n" % (for_comm)) ++ else: ++ print("\nsyscall events:\n") + +- print("%-40s %10s" % ("event", "count")) +- print("%-40s %10s" % ("----------------------------------------", +- "-----------")) ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "-----------")) + +- for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ +- reverse = True): +- print("%-40s %10d" % (syscall_name(id), val)) ++ for id, val in sorted(syscalls.items(), ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print("%-40s %10d" % (syscall_name(id), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch b/debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch new file mode 100644 index 000000000..90c7aa835 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch @@ -0,0 +1,104 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 1 Mar 2019 17:18:59 -0800 +Subject: perf script python: add Python3 support to check-perf-trace.py +Origin: https://git.kernel.org/linus/57e604b16362273af6a517abaa6cd1133a7fc732 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python 2 and Python 3 in the check-perf-trace.py script. + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of from __future__ implies the minimum supported version of +Python2 is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Cc: Tom Zanussi <tzanussi@gmail.com> +Link: http://lkml.kernel.org/r/20190302011903.2416-4-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/check-perf-trace.py | 31 ++++++++++++++------------ + 1 file changed, 17 insertions(+), 14 deletions(-) + +--- a/tools/perf/scripts/python/check-perf-trace.py ++++ b/tools/perf/scripts/python/check-perf-trace.py +@@ -7,6 +7,8 @@ + # events, etc. Basically, if this script runs successfully and + # displays expected results, Python scripting support should be ok. + ++from __future__ import print_function ++ + import os + import sys + +@@ -19,7 +21,7 @@ from perf_trace_context import * + unhandled = autodict() + + def trace_begin(): +- print "trace_begin" ++ print("trace_begin") + pass + + def trace_end(): +@@ -33,7 +35,7 @@ def irq__softirq_entry(event_name, conte + + print_uncommon(context) + +- print "vec=%s\n" % (symbol_str("irq__softirq_entry", "vec", vec)), ++ print("vec=%s" % (symbol_str("irq__softirq_entry", "vec", vec))) + + def kmem__kmalloc(event_name, context, common_cpu, + common_secs, common_nsecs, common_pid, common_comm, +@@ -44,10 +46,10 @@ def kmem__kmalloc(event_name, context, c + + print_uncommon(context) + +- print "call_site=%u, ptr=%u, bytes_req=%u, " \ +- "bytes_alloc=%u, gfp_flags=%s\n" % \ ++ print("call_site=%u, ptr=%u, bytes_req=%u, " ++ "bytes_alloc=%u, gfp_flags=%s" % + (call_site, ptr, bytes_req, bytes_alloc, +- flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), ++ flag_str("kmem__kmalloc", "gfp_flags", gfp_flags))) + + def trace_unhandled(event_name, context, event_fields_dict): + try: +@@ -56,26 +58,27 @@ def trace_unhandled(event_name, context, + unhandled[event_name] = 1 + + def print_header(event_name, cpu, secs, nsecs, pid, comm): +- print "%-20s %5u %05u.%09u %8u %-20s " % \ ++ print("%-20s %5u %05u.%09u %8u %-20s " % + (event_name, cpu, secs, nsecs, pid, comm), ++ end=' ') + + # print trace fields not included in handler args + def print_uncommon(context): +- print "common_preempt_count=%d, common_flags=%s, " \ +- "common_lock_depth=%d, " % \ ++ print("common_preempt_count=%d, common_flags=%s, " ++ "common_lock_depth=%d, " % + (common_pc(context), trace_flag_str(common_flags(context)), +- common_lock_depth(context)) ++ common_lock_depth(context))) + + def print_unhandled(): + keys = unhandled.keys() + if not keys: + return + +- print "\nunhandled events:\n\n", ++ print("\nunhandled events:\n") + +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "-----------"), ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "-----------")) + + for event_name in keys: +- print "%-40s %10d\n" % (event_name, unhandled[event_name]) ++ print("%-40s %10d\n" % (event_name, unhandled[event_name])) diff --git a/debian/patches/bugfix/all/radeon-amdgpu-firmware-is-required-for-drm-and-kms-on-r600-onward.patch b/debian/patches/bugfix/all/radeon-amdgpu-firmware-is-required-for-drm-and-kms-on-r600-onward.patch new file mode 100644 index 000000000..cd2ba2e9e --- /dev/null +++ b/debian/patches/bugfix/all/radeon-amdgpu-firmware-is-required-for-drm-and-kms-on-r600-onward.patch @@ -0,0 +1,135 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Subject: radeon, amdgpu: Firmware is required for DRM and KMS on R600 onward +Date: Tue, 08 Jan 2013 03:25:52 +0000 +Bug-Debian: https://bugs.debian.org/607194 +Bug-Debian: https://bugs.debian.org/607471 +Bug-Debian: https://bugs.debian.org/610851 +Bug-Debian: https://bugs.debian.org/627497 +Bug-Debian: https://bugs.debian.org/632212 +Bug-Debian: https://bugs.debian.org/637943 +Bug-Debian: https://bugs.debian.org/649448 +Bug-Debian: https://bugs.debian.org/697229 +Forwarded: no + +radeon requires firmware/microcode for the GPU in all chips, but for +newer chips (apparently R600 'Evergreen' onward) it also expects +firmware for the memory controller and other sub-blocks. + +radeon attempts to gracefully fall back and disable some features if +the firmware is not available, but becomes unstable - the framebuffer +and/or system memory may be corrupted, or the display may stay black. + +Therefore, perform a basic check for the existence of +/lib/firmware/{radeon,amdgpu} when a device is probed, and abort if it +is missing, except for the pre-R600 case. + +--- +Index: linux/drivers/gpu/drm/radeon/radeon_drv.c +=================================================================== +--- linux.orig/drivers/gpu/drm/radeon/radeon_drv.c ++++ linux/drivers/gpu/drm/radeon/radeon_drv.c +@@ -43,6 +43,8 @@ + #include <drm/drm_fb_helper.h> + + #include <drm/drm_crtc_helper.h> ++#include <linux/namei.h> ++#include <linux/path.h> + + /* + * KMS wrapper. +@@ -316,6 +318,28 @@ static struct drm_driver kms_driver; + + bool radeon_device_is_virtual(void); + ++/* Test that /lib/firmware/radeon is a directory (or symlink to a ++ * directory). We could try to match the udev search path, but let's ++ * keep it simple. ++ */ ++static bool radeon_firmware_installed(void) ++{ ++#if IS_BUILTIN(CONFIG_DRM_RADEON) ++ /* It may be too early to tell. Assume it's there. */ ++ return true; ++#else ++ struct path path; ++ ++ if (kern_path("/lib/firmware/radeon", LOOKUP_DIRECTORY | LOOKUP_FOLLOW, ++ &path) == 0) { ++ path_put(&path); ++ return true; ++ } ++ ++ return false; ++#endif ++} ++ + static int radeon_kick_out_firmware_fb(struct pci_dev *pdev) + { + struct apertures_struct *ap; +@@ -376,6 +400,12 @@ static int radeon_pci_probe(struct pci_d + if (vga_switcheroo_client_probe_defer(pdev)) + return -EPROBE_DEFER; + ++ if ((ent->driver_data & RADEON_FAMILY_MASK) >= CHIP_R600 && ++ !radeon_firmware_installed()) { ++ DRM_ERROR("radeon kernel modesetting for R600 or later requires firmware installed\n"); ++ return -ENODEV; ++ } ++ + /* Get rid of things like offb */ + ret = radeon_kick_out_firmware_fb(pdev); + if (ret) +Index: linux/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +=================================================================== +--- linux.orig/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c ++++ linux/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +@@ -33,6 +33,8 @@ + #include <linux/pm_runtime.h> + #include <linux/vga_switcheroo.h> + #include <drm/drm_crtc_helper.h> ++#include <linux/namei.h> ++#include <linux/path.h> + + #include "amdgpu.h" + #include "amdgpu_irq.h" +@@ -793,6 +795,28 @@ MODULE_DEVICE_TABLE(pci, pciidlist); + + static struct drm_driver kms_driver; + ++/* Test that /lib/firmware/amdgpu is a directory (or symlink to a ++ * directory). We could try to match the udev search path, but let's ++ * keep it simple. ++ */ ++static bool amdgpu_firmware_installed(void) ++{ ++#if IS_BUILTIN(CONFIG_DRM_AMDGPU) ++ /* It may be too early to tell. Assume it's there. */ ++ return true; ++#else ++ struct path path; ++ ++ if (kern_path("/lib/firmware/amdgpu", LOOKUP_DIRECTORY | LOOKUP_FOLLOW, ++ &path) == 0) { ++ path_put(&path); ++ return true; ++ } ++ ++ return false; ++#endif ++} ++ + static int amdgpu_kick_out_firmware_fb(struct pci_dev *pdev) + { + struct apertures_struct *ap; +@@ -833,6 +857,11 @@ static int amdgpu_pci_probe(struct pci_d + return -ENODEV; + } + ++ if (!amdgpu_firmware_installed()) { ++ DRM_ERROR("amdgpu requires firmware installed\n"); ++ return -ENODEV; ++ } ++ + /* + * Initialize amdkfd before starting radeon. If it was not loaded yet, + * defer radeon probing diff --git a/debian/patches/bugfix/all/rtc-s35390a-set-uie_unsupported.patch b/debian/patches/bugfix/all/rtc-s35390a-set-uie_unsupported.patch new file mode 100644 index 000000000..b3261d952 --- /dev/null +++ b/debian/patches/bugfix/all/rtc-s35390a-set-uie_unsupported.patch @@ -0,0 +1,40 @@ +From: Richard Leitner <richard.leitner@skidata.com> +Date: Thu, 23 May 2019 13:54:49 +0200 +Subject: [PATCH] rtc: s35390a: set uie_unsupported +Origin: https://git.kernel.org/linus/c0e12848be091e8410fb427f080f2e0149123443 +Bug-Debian: https://bugs.debian.org/932845 + +Alarms are only supported on a per minute basis. This is why +uie_unsupported is set. Furthermore issue a warning when a second based +alarm is requested. + +Signed-off-by: Richard Leitner <richard.leitner@skidata.com> +Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> +--- + drivers/rtc/rtc-s35390a.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +Index: linux/drivers/rtc/rtc-s35390a.c +=================================================================== +--- linux.orig/drivers/rtc/rtc-s35390a.c ++++ linux/drivers/rtc/rtc-s35390a.c +@@ -288,6 +288,9 @@ static int s35390a_rtc_set_alarm(struct + alm->time.tm_min, alm->time.tm_hour, alm->time.tm_mday, + alm->time.tm_mon, alm->time.tm_year, alm->time.tm_wday); + ++ if (alm->time.tm_sec != 0) ++ dev_warn(&client->dev, "Alarms are only supported on a per minute basis!\n"); ++ + /* disable interrupt (which deasserts the irq line) */ + err = s35390a_set_reg(s35390a, S35390A_CMD_STATUS2, &sts, sizeof(sts)); + if (err < 0) +@@ -502,6 +505,9 @@ static int s35390a_probe(struct i2c_clie + goto exit_dummy; + } + ++ /* supports per-minute alarms only, therefore set uie_unsupported */ ++ s35390a->rtc->uie_unsupported = 1; ++ + if (status1 & S35390A_FLAG_INT2) + rtc_update_irq(s35390a->rtc, 1, RTC_AF); + diff --git a/debian/patches/bugfix/all/swiotlb-skip-swiotlb_bounce-when-orig_addr-is-zero.patch b/debian/patches/bugfix/all/swiotlb-skip-swiotlb_bounce-when-orig_addr-is-zero.patch new file mode 100644 index 000000000..df77ca0b2 --- /dev/null +++ b/debian/patches/bugfix/all/swiotlb-skip-swiotlb_bounce-when-orig_addr-is-zero.patch @@ -0,0 +1,47 @@ +From: Liu Shixin <liushixin2@huawei.com> +Date: Thu, 30 Jun 2022 19:33:31 +0800 +Subject: swiotlb: skip swiotlb_bounce when orig_addr is zero +Origin: https://lore.kernel.org/stable/20220630113331.1544886-1-liushixin2@huawei.com/ + +After patch ddbd89deb7d3 ("swiotlb: fix info leak with DMA_FROM_DEVICE"), +swiotlb_bounce will be called in swiotlb_tbl_map_single unconditionally. +This requires that the physical address must be valid, which is not always +true on stable-4.19 or earlier version. +On stable-4.19, swiotlb_alloc_buffer will call swiotlb_tbl_map_single with +orig_addr equal to zero, which cause such a panic: + +Unable to handle kernel paging request at virtual address ffffb77a40000000 +... +pc : __memcpy+0x100/0x180 +lr : swiotlb_bounce+0x74/0x88 +... +Call trace: + __memcpy+0x100/0x180 + swiotlb_tbl_map_single+0x2c8/0x338 + swiotlb_alloc+0xb4/0x198 + __dma_alloc+0x84/0x1d8 + ... + +On stable-4.9 and stable-4.14, swiotlb_alloc_coherent wille call map_single +with orig_addr equal to zero, which can cause same panic. + +Fix this by skipping swiotlb_bounce when orig_addr is zero. + +Fixes: ddbd89deb7d3 ("swiotlb: fix info leak with DMA_FROM_DEVICE") +Signed-off-by: Liu Shixin <liushixin2@huawei.com> +--- + kernel/dma/swiotlb.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/kernel/dma/swiotlb.c ++++ b/kernel/dma/swiotlb.c +@@ -594,7 +594,8 @@ found: + * unconditional bounce may prevent leaking swiotlb content (i.e. + * kernel memory) to user-space. + */ +- swiotlb_bounce(orig_addr, tlb_addr, size, DMA_TO_DEVICE); ++ if (orig_addr) ++ swiotlb_bounce(orig_addr, tlb_addr, size, DMA_TO_DEVICE); + return tlb_addr; + } + diff --git a/debian/patches/bugfix/all/tools-build-remove-bpf-run-time-check-at-build-time.patch b/debian/patches/bugfix/all/tools-build-remove-bpf-run-time-check-at-build-time.patch new file mode 100644 index 000000000..39044c390 --- /dev/null +++ b/debian/patches/bugfix/all/tools-build-remove-bpf-run-time-check-at-build-time.patch @@ -0,0 +1,29 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sun, 21 Feb 2016 15:33:15 +0000 +Subject: tools/build: Remove bpf() run-time check at build time +Forwarded: no + +It is not correct to test that a syscall works on the build system's +kernel. We might be building on an earlier kernel version or with +security restrictions that block bpf(). + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/tools/build/feature/test-bpf.c +=================================================================== +--- linux.orig/tools/build/feature/test-bpf.c ++++ linux/tools/build/feature/test-bpf.c +@@ -35,8 +35,10 @@ int main(void) + attr.prog_flags = 0; + + /* +- * Test existence of __NR_bpf and BPF_PROG_LOAD. +- * This call should fail if we run the testcase. ++ * bwh: Don't use the bpf() syscall as we might be building on a ++ * much older kernel. Do "use" the attr structure here to avoid ++ * a "set but not used" warning. + */ +- return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr)); ++ (void)&attr; ++ return 0; + } diff --git a/debian/patches/bugfix/all/tools-lib-traceevent-use-ldflags.patch b/debian/patches/bugfix/all/tools-lib-traceevent-use-ldflags.patch new file mode 100644 index 000000000..ae303f360 --- /dev/null +++ b/debian/patches/bugfix/all/tools-lib-traceevent-use-ldflags.patch @@ -0,0 +1,29 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 25 Sep 2015 21:26:48 +0100 +Subject: tools/lib/traceevent: Use LDFLAGS +Forwarded: no + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/tools/lib/traceevent/Makefile +=================================================================== +--- linux.orig/tools/lib/traceevent/Makefile ++++ linux/tools/lib/traceevent/Makefile +@@ -174,7 +174,7 @@ $(TE_IN): force + $(Q)$(MAKE) $(build)=libtraceevent + + $(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN) +- $(QUIET_LINK)$(CC) --shared $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@ ++ $(QUIET_LINK)$(CC) $(LDFLAGS) --shared $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@ + @ln -sf $(@F) $(OUTPUT)libtraceevent.so + @ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION) + +@@ -193,7 +193,7 @@ $(PLUGINS_IN): force + $(Q)$(MAKE) $(build)=$(plugin_obj) + + $(OUTPUT)%.so: $(OUTPUT)%-in.o +- $(QUIET_LINK)$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $^ ++ $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -shared -nostartfiles -o $@ $^ + + define make_version.h + (echo '/* This file is automatically generated. Do not modify. */'; \ diff --git a/debian/patches/bugfix/all/tools-perf-man-date.patch b/debian/patches/bugfix/all/tools-perf-man-date.patch new file mode 100644 index 000000000..4515c703c --- /dev/null +++ b/debian/patches/bugfix/all/tools-perf-man-date.patch @@ -0,0 +1,37 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Mon, 13 Jul 2015 20:29:20 +0100 +Subject: perf tools: Use $KBUILD_BUILD_TIMESTAMP as man page date +Forwarded: http://mid.gmane.org/20160517132809.GE7555@decadent.org.uk + +This allows man pages to be built reproducibly. + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/tools/perf/Documentation/Makefile +=================================================================== +--- linux.orig/tools/perf/Documentation/Makefile ++++ linux/tools/perf/Documentation/Makefile +@@ -131,6 +131,9 @@ endif + ifdef DOCBOOK_SUPPRESS_SP + XMLTO_EXTRA += -m manpage-suppress-sp.xsl + endif ++ifdef KBUILD_BUILD_TIMESTAMP ++ASCIIDOC_EXTRA += -a revdate=$(shell date -u -d '$(KBUILD_BUILD_TIMESTAMP)' +%Y-%m-%d) ++endif + + SHELL_PATH ?= $(SHELL) + # Shell quote; +Index: linux/tools/perf/Documentation/asciidoc.conf +=================================================================== +--- linux.orig/tools/perf/Documentation/asciidoc.conf ++++ linux/tools/perf/Documentation/asciidoc.conf +@@ -71,6 +71,9 @@ ifdef::backend-docbook[] + [header] + template::[header-declarations] + <refentry> ++<refentryinfo> ++template::[docinfo] ++</refentryinfo> + <refmeta> + <refentrytitle>{mantitle}</refentrytitle> + <manvolnum>{manvolnum}</manvolnum> diff --git a/debian/patches/bugfix/all/tools-perf-remove-shebangs.patch b/debian/patches/bugfix/all/tools-perf-remove-shebangs.patch new file mode 100644 index 000000000..d01140709 --- /dev/null +++ b/debian/patches/bugfix/all/tools-perf-remove-shebangs.patch @@ -0,0 +1,47 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 25 Sep 2015 20:09:23 +0100 +Subject: tools/perf: Remove shebang lines from perf scripts +Forwarded: no + +perf scripts need to be invoked through perf, not directly through +perl (or other language interpreter). So including shebang lines in +them is useless and possibly misleading. + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/tools/perf/scripts/perl/rw-by-file.pl +=================================================================== +--- linux.orig/tools/perf/scripts/perl/rw-by-file.pl ++++ linux/tools/perf/scripts/perl/rw-by-file.pl +@@ -1,4 +1,3 @@ +-#!/usr/bin/perl -w + # (c) 2009, Tom Zanussi <tzanussi@gmail.com> + # Licensed under the terms of the GNU GPL License version 2 + +Index: linux/tools/perf/scripts/perl/rw-by-pid.pl +=================================================================== +--- linux.orig/tools/perf/scripts/perl/rw-by-pid.pl ++++ linux/tools/perf/scripts/perl/rw-by-pid.pl +@@ -1,4 +1,3 @@ +-#!/usr/bin/perl -w + # (c) 2009, Tom Zanussi <tzanussi@gmail.com> + # Licensed under the terms of the GNU GPL License version 2 + +Index: linux/tools/perf/scripts/perl/rwtop.pl +=================================================================== +--- linux.orig/tools/perf/scripts/perl/rwtop.pl ++++ linux/tools/perf/scripts/perl/rwtop.pl +@@ -1,4 +1,3 @@ +-#!/usr/bin/perl -w + # (c) 2010, Tom Zanussi <tzanussi@gmail.com> + # Licensed under the terms of the GNU GPL License version 2 + +Index: linux/tools/perf/scripts/perl/wakeup-latency.pl +=================================================================== +--- linux.orig/tools/perf/scripts/perl/wakeup-latency.pl ++++ linux/tools/perf/scripts/perl/wakeup-latency.pl +@@ -1,4 +1,3 @@ +-#!/usr/bin/perl -w + # (c) 2009, Tom Zanussi <tzanussi@gmail.com> + # Licensed under the terms of the GNU GPL License version 2 + diff --git a/debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch b/debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch new file mode 100644 index 000000000..341018e58 --- /dev/null +++ b/debian/patches/bugfix/all/usb-add-a-hcd_uses_dma-helper.patch @@ -0,0 +1,110 @@ +From: Christoph Hellwig <hch@lst.de> +Date: Sun, 11 Aug 2019 10:05:16 +0200 +Subject: usb: add a hcd_uses_dma helper +Origin: https://git.kernel.org/linus/edfbcb321faf07ca970e4191abe061deeb7d3788 + +The USB buffer allocation code is the only place in the usb core (and in +fact the whole kernel) that uses is_device_dma_capable, while the URB +mapping code uses the uses_dma flag in struct usb_bus. Switch the buffer +allocation to use the uses_dma flag used by the rest of the USB code, +and create a helper in hcd.h that checks this flag as well as the +CONFIG_HAS_DMA to simplify the caller a bit. + +Signed-off-by: Christoph Hellwig <hch@lst.de> +Link: https://lore.kernel.org/r/20190811080520.21712-3-hch@lst.de +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/usb/core/buffer.c | 10 +++------- + drivers/usb/core/hcd.c | 4 ++-- + drivers/usb/dwc2/hcd.c | 2 +- + include/linux/usb.h | 2 +- + include/linux/usb/hcd.h | 3 +++ + 5 files changed, 10 insertions(+), 11 deletions(-) + +--- a/drivers/usb/core/buffer.c ++++ b/drivers/usb/core/buffer.c +@@ -66,9 +66,7 @@ + char name[16]; + int i, size; + +- if (hcd->localmem_pool || +- !IS_ENABLED(CONFIG_HAS_DMA) || +- !is_device_dma_capable(hcd->self.sysdev)) ++ if (hcd->localmem_pool || !hcd_uses_dma(hcd)) + return 0; + + for (i = 0; i < HCD_BUFFER_POOLS; i++) { +@@ -133,8 +131,7 @@ + return gen_pool_dma_alloc(hcd->localmem_pool, size, dma); + + /* some USB hosts just use PIO */ +- if (!IS_ENABLED(CONFIG_HAS_DMA) || +- !is_device_dma_capable(bus->sysdev)) { ++ if (!hcd_uses_dma(hcd)) { + *dma = ~(dma_addr_t) 0; + return kmalloc(size, mem_flags); + } +@@ -164,8 +161,7 @@ + return; + } + +- if (!IS_ENABLED(CONFIG_HAS_DMA) || +- !is_device_dma_capable(bus->sysdev)) { ++ if (!hcd_uses_dma(hcd)) { + kfree(addr); + return; + } +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -1511,7 +1511,7 @@ + if (usb_endpoint_xfer_control(&urb->ep->desc)) { + if (hcd->self.uses_pio_for_control) + return ret; +- if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) { ++ if (hcd_uses_dma(hcd)) { + if (is_vmalloc_addr(urb->setup_packet)) { + WARN_ONCE(1, "setup packet is not dma capable\n"); + return -EAGAIN; +@@ -1545,7 +1545,7 @@ + dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + if (urb->transfer_buffer_length != 0 + && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) { +- if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) { ++ if (hcd_uses_dma(hcd)) { + if (urb->num_sgs) { + int n; + +--- a/drivers/usb/dwc2/hcd.c ++++ b/drivers/usb/dwc2/hcd.c +@@ -4770,7 +4770,7 @@ + + buf = urb->transfer_buffer; + +- if (hcd->self.uses_dma) { ++ if (hcd_uses_dma(hcd)) { + if (!buf && (urb->transfer_dma & 3)) { + dev_err(hsotg->dev, + "%s: unaligned transfer with no transfer_buffer", +--- a/include/linux/usb.h ++++ b/include/linux/usb.h +@@ -1455,7 +1455,7 @@ + * field rather than determining a dma address themselves. + * + * Note that transfer_buffer must still be set if the controller +- * does not support DMA (as indicated by bus.uses_dma) and when talking ++ * does not support DMA (as indicated by hcd_uses_dma()) and when talking + * to root hub. If you have to trasfer between highmem zone and the device + * on such controller, create a bounce buffer or bail out with an error. + * If transfer_buffer cannot be set (is in highmem) and the controller is DMA +--- a/include/linux/usb/hcd.h ++++ b/include/linux/usb/hcd.h +@@ -422,6 +422,9 @@ + return hcd->high_prio_bh.completing_ep == ep; + } + ++#define hcd_uses_dma(hcd) \ ++ (IS_ENABLED(CONFIG_HAS_DMA) && (hcd)->self.uses_dma) ++ + extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); + extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, + int status); diff --git a/debian/patches/bugfix/all/usb-dont-create-dma-pools-for-HCD.patch b/debian/patches/bugfix/all/usb-dont-create-dma-pools-for-HCD.patch new file mode 100644 index 000000000..197a4fadb --- /dev/null +++ b/debian/patches/bugfix/all/usb-dont-create-dma-pools-for-HCD.patch @@ -0,0 +1,31 @@ +From: Christoph Hellwig <hch@lst.de> +Date: Sun, 11 Aug 2019 10:05:15 +0200 +Subject: usb: don't create dma pools for HCDs with a localmem_pool +Origin: https://git.kernel.org/linus/dd3ecf17ba70a70d2c9ef9ba725281b84f8eef12 + +If the HCD provides a localmem pool we will never use the DMA pools, so +don't create them. + +Fixes: b0310c2f09bb ("USB: use genalloc for USB HCs with local memory") +Signed-off-by: Christoph Hellwig <hch@lst.de> +Link: https://lore.kernel.org/r/20190811080520.21712-2-hch@lst.de +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/usb/core/buffer.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/usb/core/buffer.c ++++ b/drivers/usb/core/buffer.c +@@ -66,9 +66,9 @@ + char name[16]; + int i, size; + +- if (!IS_ENABLED(CONFIG_HAS_DMA) || +- (!is_device_dma_capable(hcd->self.sysdev) && +- !hcd->localmem_pool)) ++ if (hcd->localmem_pool || ++ !IS_ENABLED(CONFIG_HAS_DMA) || ++ !is_device_dma_capable(hcd->self.sysdev)) + return 0; + + for (i = 0; i < HCD_BUFFER_POOLS; i++) { diff --git a/debian/patches/bugfix/all/usb-hcd-Fix-a-NULL-vs-IS_ERR-bug-in-usb_hcd_setup_lo.patch b/debian/patches/bugfix/all/usb-hcd-Fix-a-NULL-vs-IS_ERR-bug-in-usb_hcd_setup_lo.patch new file mode 100644 index 000000000..920b0b780 --- /dev/null +++ b/debian/patches/bugfix/all/usb-hcd-Fix-a-NULL-vs-IS_ERR-bug-in-usb_hcd_setup_lo.patch @@ -0,0 +1,35 @@ +From: Dan Carpenter <dan.carpenter@oracle.com> +Date: Fri, 7 Jun 2019 16:57:09 +0300 +Subject: usb/hcd: Fix a NULL vs IS_ERR() bug in usb_hcd_setup_local_mem() +Origin: https://git.kernel.org/linus/94b9a70d32db0d1e8eeaeb27d74a5ae712644da9 + +The devm_memremap() function doesn't return NULL, it returns error +pointers. + +Fixes: b0310c2f09bb ("USB: use genalloc for USB HCs with local memory") +Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> +Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Link: https://lore.kernel.org/r/20190607135709.GC16718@mwanda +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/usb/core/hcd.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c +index 8b8ec0c7325d..a84b201dd844 100644 +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -3038,8 +3038,8 @@ int usb_hcd_setup_local_mem(struct usb_hcd *hcd, phys_addr_t phys_addr, + + local_mem = devm_memremap(hcd->self.sysdev, phys_addr, + size, MEMREMAP_WC); +- if (!local_mem) +- return -ENOMEM; ++ if (IS_ERR(local_mem)) ++ return PTR_ERR(local_mem); + + /* + * Here we pass a dma_addr_t but the arg type is a phys_addr_t. +-- +2.26.2 + diff --git a/debian/patches/bugfix/all/usb-host-ohci-sm501-init-genalloc-for-local-memory.patch b/debian/patches/bugfix/all/usb-host-ohci-sm501-init-genalloc-for-local-memory.patch new file mode 100644 index 000000000..39d46e009 --- /dev/null +++ b/debian/patches/bugfix/all/usb-host-ohci-sm501-init-genalloc-for-local-memory.patch @@ -0,0 +1,105 @@ +From: Laurentiu Tudor <laurentiu.tudor@nxp.com> +Date: Wed, 29 May 2019 13:28:41 +0300 +Subject: usb: host: ohci-sm501: init genalloc for local memory +Origin: https://git.kernel.org/linus/7d9e6f5aebe8c03f1a5199ca5c30f0c53042af23 + +In preparation for dropping the existing "coherent" dma mem declaration +APIs, replace the current dma_declare_coherent_memory() based mechanism +with the creation of a genalloc pool that will be used in the OHCI +subsystem as replacement for the DMA APIs. + +Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> +Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Signed-off-by: Christoph Hellwig <hch@lst.de> +--- + drivers/usb/host/ohci-sm501.c | 47 +++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 27 deletions(-) + +--- a/drivers/usb/host/ohci-sm501.c ++++ b/drivers/usb/host/ohci-sm501.c +@@ -110,41 +110,18 @@ + goto err0; + } + +- /* The sm501 chip is equipped with local memory that may be used +- * by on-chip devices such as the video controller and the usb host. +- * This driver uses dma_declare_coherent_memory() to make sure +- * usb allocations with dma_alloc_coherent() allocate from +- * this local memory. The dma_handle returned by dma_alloc_coherent() +- * will be an offset starting from 0 for the first local memory byte. +- * +- * So as long as data is allocated using dma_alloc_coherent() all is +- * fine. This is however not always the case - buffers may be allocated +- * using kmalloc() - so the usb core needs to be told that it must copy +- * data into our local memory if the buffers happen to be placed in +- * regular memory. The HCD_LOCAL_MEM flag does just that. +- */ +- +- retval = dma_declare_coherent_memory(dev, mem->start, +- mem->start - mem->parent->start, +- resource_size(mem), +- DMA_MEMORY_EXCLUSIVE); +- if (retval) { +- dev_err(dev, "cannot declare coherent memory\n"); +- goto err1; +- } +- + /* allocate, reserve and remap resources for registers */ + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (res == NULL) { + dev_err(dev, "no resource definition for registers\n"); + retval = -ENOENT; +- goto err2; ++ goto err1; + } + + hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); + if (!hcd) { + retval = -ENOMEM; +- goto err2; ++ goto err1; + } + + hcd->rsrc_start = res->start; +@@ -165,6 +142,24 @@ + + ohci_hcd_init(hcd_to_ohci(hcd)); + ++ /* The sm501 chip is equipped with local memory that may be used ++ * by on-chip devices such as the video controller and the usb host. ++ * This driver uses genalloc so that usb allocations with ++ * gen_pool_dma_alloc() allocate from this local memory. The dma_handle ++ * returned by gen_pool_dma_alloc() will be an offset starting from 0 ++ * for the first local memory byte. ++ * ++ * So as long as data is allocated using gen_pool_dma_alloc() all is ++ * fine. This is however not always the case - buffers may be allocated ++ * using kmalloc() - so the usb core needs to be told that it must copy ++ * data into our local memory if the buffers happen to be placed in ++ * regular memory. The HCD_LOCAL_MEM flag does just that. ++ */ ++ ++ if (usb_hcd_setup_local_mem(hcd, mem->start, ++ mem->start - mem->parent->start, ++ resource_size(mem)) < 0) ++ goto err5; + retval = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (retval) + goto err5; +@@ -182,8 +177,6 @@ + release_mem_region(hcd->rsrc_start, hcd->rsrc_len); + err3: + usb_put_hcd(hcd); +-err2: +- dma_release_declared_memory(dev); + err1: + release_mem_region(mem->start, resource_size(mem)); + err0: +@@ -199,7 +192,6 @@ + iounmap(hcd->regs); + release_mem_region(hcd->rsrc_start, hcd->rsrc_len); + usb_put_hcd(hcd); +- dma_release_declared_memory(&pdev->dev); + mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (mem) + release_mem_region(mem->start, resource_size(mem)); diff --git a/debian/patches/bugfix/all/usbip-document-tcp-wrappers.patch b/debian/patches/bugfix/all/usbip-document-tcp-wrappers.patch new file mode 100644 index 000000000..0943df590 --- /dev/null +++ b/debian/patches/bugfix/all/usbip-document-tcp-wrappers.patch @@ -0,0 +1,31 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sun, 24 Jun 2012 02:51:39 +0100 +Subject: usbip: Document TCP wrappers +Forwarded: no + +Add references to TCP wrappers configuration in the manual page. + +Index: linux/tools/usb/usbip/doc/usbipd.8 +=================================================================== +--- linux.orig/tools/usb/usbip/doc/usbipd.8 ++++ linux/tools/usb/usbip/doc/usbipd.8 +@@ -14,7 +14,8 @@ Devices have to explicitly be exported u + before usbipd makes them available to other hosts. + + The daemon accepts connections from USB/IP clients +-on TCP port 3240 by default. ++on TCP port 3240 by default. The clients authorised to connect may be ++configured as documented in hosts_access(5). + + .SH OPTIONS + .HP +@@ -69,7 +70,8 @@ Show version. + + .B usbipd + offers no authentication or authorization for USB/IP. Any +-USB/IP client can connect and use exported devices. ++USB/IP client running on an authorised host can connect and ++use exported devices. + + .SH EXAMPLES + diff --git a/debian/patches/bugfix/all/usbip-fix-misuse-of-strncpy.patch b/debian/patches/bugfix/all/usbip-fix-misuse-of-strncpy.patch new file mode 100644 index 000000000..b98025b8a --- /dev/null +++ b/debian/patches/bugfix/all/usbip-fix-misuse-of-strncpy.patch @@ -0,0 +1,61 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 20 Jul 2018 01:30:24 +0100 +Subject: usbip: Fix misuse of strncpy() +Bug-Debian: https://bugs.debian.org/897802 +Forwarded: https://marc.info/?l=linux-usb&m=153213915806258 + +gcc 8 reports: + +usbip_device_driver.c: In function ‘read_usb_vudc_device’: +usbip_device_driver.c:106:2: error: ‘strncpy’ specified bound 256 equals destination size [-Werror=stringop-truncation] + strncpy(dev->path, path, SYSFS_PATH_MAX); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +usbip_device_driver.c:125:2: error: ‘strncpy’ specified bound 32 equals destination size [-Werror=stringop-truncation] + strncpy(dev->busid, name, SYSFS_BUS_ID_SIZE); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +I'm not convinced it makes sense to truncate the copied strings here, +but since we're already doing so let's ensure they're still null- +terminated. We can't easily use strlcpy() here, so use snprintf(). + +usbip_common.c has the same problem. + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +Index: linux/tools/usb/usbip/libsrc/usbip_common.c +=================================================================== +--- linux.orig/tools/usb/usbip/libsrc/usbip_common.c ++++ linux/tools/usb/usbip/libsrc/usbip_common.c +@@ -226,8 +226,8 @@ int read_usb_device(struct udev_device * + path = udev_device_get_syspath(sdev); + name = udev_device_get_sysname(sdev); + +- strncpy(udev->path, path, SYSFS_PATH_MAX); +- strncpy(udev->busid, name, SYSFS_BUS_ID_SIZE); ++ snprintf(udev->path, SYSFS_PATH_MAX, "%s", path); ++ snprintf(udev->busid, SYSFS_BUS_ID_SIZE, "%s", name); + + sscanf(name, "%u-%u", &busnum, &devnum); + udev->busnum = busnum; +Index: linux/tools/usb/usbip/libsrc/usbip_device_driver.c +=================================================================== +--- linux.orig/tools/usb/usbip/libsrc/usbip_device_driver.c ++++ linux/tools/usb/usbip/libsrc/usbip_device_driver.c +@@ -103,7 +103,7 @@ int read_usb_vudc_device(struct udev_dev + copy_descr_attr16(dev, &descr, idProduct); + copy_descr_attr16(dev, &descr, bcdDevice); + +- strncpy(dev->path, path, SYSFS_PATH_MAX); ++ snprintf(dev->path, SYSFS_PATH_MAX, "%s", path); + + dev->speed = USB_SPEED_UNKNOWN; + speed = udev_device_get_sysattr_value(sdev, "current_speed"); +@@ -122,7 +122,7 @@ int read_usb_vudc_device(struct udev_dev + dev->busnum = 0; + + name = udev_device_get_sysname(plat); +- strncpy(dev->busid, name, SYSFS_BUS_ID_SIZE); ++ snprintf(dev->busid, SYSFS_BUS_ID_SIZE, "%s", name); + return 0; + err: + fclose(fd); diff --git a/debian/patches/bugfix/arm/ARM-dts-sun8i-h3-add-sy8106a-to-orange-pi-plus.patch b/debian/patches/bugfix/arm/ARM-dts-sun8i-h3-add-sy8106a-to-orange-pi-plus.patch new file mode 100644 index 000000000..1329c9390 --- /dev/null +++ b/debian/patches/bugfix/arm/ARM-dts-sun8i-h3-add-sy8106a-to-orange-pi-plus.patch @@ -0,0 +1,77 @@ +From: Jorik Jonker <jorik@kippendief.biz> +Date: Sat, 29 Sep 2018 15:18:30 +0200 +Subject: ARM: dts: sun8i-h3: add sy8106a to orange pi plus +Origin: https://git.kernel.org/linus/e98d72d98a25890308941080d3a17b4c77e3f460 + +The Orange Pi Plus board lacks voltage scaling capabilities in its +current form. This results in random freezes during boot when cpufreq is +enabled, probably due to wrong voltages. + +This patch (more or less copy/paste from 06139c) does the following +things on this board: +- enable r_i2c +- add sy8106a to the r_i2c bus +- have the sy8106a regulate VDD of cpu + +Since the Orange Pi Plus has the same PMU setup as the Orange Pi PC, I +simply took min/max/fixed/ramp from the latter DTS. In that file the +origin of the values are described by the following comment: + + "The datasheet uses 1.1V as the minimum value of VDD-CPUX, + however both the Armbian DVFS table and the official one + have operating points with voltage under 1.1V, and both + DVFS table are known to work properly at the lowest + operating point. + Use 1.0V as the minimum voltage instead." + +I have tested this on patch two Orange Pi Plus boards, by running a +kernel with this patch and do intermettent runs of cpuburn while +monitoring voltage, frequency and temperature. The board runs stable +across its operatiing points while showing a reasonable (< 40C) +temperature. My Orange Pi PC, when put to the same test, yields similar +stable results. + +Signed-off-by: Jorik Jonker <jorik@kippendief.biz> +Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> +--- + arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +Index: linux/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts +=================================================================== +--- linux.orig/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts ++++ linux/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts +@@ -74,6 +74,10 @@ + }; + }; + ++&cpu0 { ++ cpu-supply = <®_vdd_cpux>; ++}; ++ + &ehci3 { + status = "okay"; + }; +@@ -119,6 +123,22 @@ + }; + }; + ++&r_i2c { ++ status = "okay"; ++ ++ reg_vdd_cpux: regulator@65 { ++ compatible = "silergy,sy8106a"; ++ reg = <0x65>; ++ regulator-name = "vdd-cpux"; ++ silergy,fixed-microvolt = <1200000>; ++ regulator-min-microvolt = <1000000>; ++ regulator-max-microvolt = <1400000>; ++ regulator-ramp-delay = <200>; ++ regulator-boot-on; ++ regulator-always-on; ++ }; ++}; ++ + &usbphy { + usb3_vbus-supply = <®_usb3_vbus>; + }; diff --git a/debian/patches/bugfix/arm/arm-dts-kirkwood-fix-sata-pinmux-ing-for-ts419.patch b/debian/patches/bugfix/arm/arm-dts-kirkwood-fix-sata-pinmux-ing-for-ts419.patch new file mode 100644 index 000000000..a8fc875a3 --- /dev/null +++ b/debian/patches/bugfix/arm/arm-dts-kirkwood-fix-sata-pinmux-ing-for-ts419.patch @@ -0,0 +1,37 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 17 Feb 2017 01:30:30 +0000 +Subject: ARM: dts: kirkwood: Fix SATA pinmux-ing for TS419 +Forwarded: https://www.spinics.net/lists/arm-kernel/msg563610.html +Bug-Debian: https://bugs.debian.org/855017 + +The old board code for the TS419 assigns MPP pins 15 and 16 as SATA +activity signals (and none as SATA presence signals). Currently the +device tree assigns the SoC's default pinmux groups for SATA, which +conflict with the second Ethernet port. + +Reported-by: gmbh@gazeta.pl +Tested-by: gmbh@gazeta.pl +References: https://bugs.debian.org/855017 +Cc: stable@vger.kernel.org # 3.15+ +Fixes: 934b524b3f49 ("ARM: Kirkwood: Add DT description of QNAP 419") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- + arch/arm/boot/dts/kirkwood-ts419.dtsi | 8 ++++++++ + 1 file changed, 8 insertions(+) + +Index: linux/arch/arm/boot/dts/kirkwood-ts419.dtsi +=================================================================== +--- linux.orig/arch/arm/boot/dts/kirkwood-ts419.dtsi ++++ linux/arch/arm/boot/dts/kirkwood-ts419.dtsi +@@ -69,3 +69,11 @@ + phy-handle = <ðphy1>; + }; + }; ++ ++&pmx_sata0 { ++ marvell,pins = "mpp15"; ++}; ++ ++&pmx_sata1 { ++ marvell,pins = "mpp16"; ++}; diff --git a/debian/patches/bugfix/arm/arm-mm-export-__sync_icache_dcache-for-xen-privcmd.patch b/debian/patches/bugfix/arm/arm-mm-export-__sync_icache_dcache-for-xen-privcmd.patch new file mode 100644 index 000000000..2e8771b55 --- /dev/null +++ b/debian/patches/bugfix/arm/arm-mm-export-__sync_icache_dcache-for-xen-privcmd.patch @@ -0,0 +1,31 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Wed, 11 Jul 2018 23:40:55 +0100 +Subject: ARM: mm: Export __sync_icache_dcache() for xen-privcmd +Forwarded: https://marc.info/?l=linux-arm-kernel&m=153134944429241 + +The xen-privcmd driver, which can be modular, calls set_pte_at() +which in turn may call __sync_icache_dcache(). + +The call to __sync_icache_dcache() may be optimised out because it is +conditional on !pte_special(), and xen-privcmd calls pte_mkspecial(). +However, in a non-LPAE configuration there is no "special" bit and the +call is really unconditional. + +Fixes: 3ad0876554ca ("xen/privcmd: add IOCTL_PRIVCMD_MMAP_RESOURCE") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- + arch/arm/mm/flush.c | 1 + + 1 file changed, 1 insertion(+) + +Index: linux/arch/arm/mm/flush.c +=================================================================== +--- linux.orig/arch/arm/mm/flush.c ++++ linux/arch/arm/mm/flush.c +@@ -295,6 +295,7 @@ void __sync_icache_dcache(pte_t pteval) + if (pte_exec(pteval)) + __flush_icache_all(); + } ++EXPORT_SYMBOL_GPL(__sync_icache_dcache); + #endif + + /* diff --git a/debian/patches/bugfix/arm64/arm64-PCI-Allow-resource-reallocation-if-necessary.patch b/debian/patches/bugfix/arm64/arm64-PCI-Allow-resource-reallocation-if-necessary.patch new file mode 100644 index 000000000..55fbe10b5 --- /dev/null +++ b/debian/patches/bugfix/arm64/arm64-PCI-Allow-resource-reallocation-if-necessary.patch @@ -0,0 +1,47 @@ +From: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Date: Sat, 15 Jun 2019 10:23:56 +1000 +Subject: [PATCH 3/4] arm64: PCI: Allow resource reallocation if necessary +Origin: https://git.kernel.org/linus/3e8ba9686600e5f77e692126bf0293edf162989a + +Call pci_assign_unassigned_root_bus_resources() instead of the simpler: + + pci_bus_size_bridges(bus); + pci_bus_assign_resources(bus); + +pci_assign_unassigned_root_bus_resources() calls: + + __pci_bus_size_bridges(bus, add_list); + __pci_bus_assign_resources(bus, add_list, &fail_head); + +so this should be equivalent as long as we're able to assign everything. +If we were unable to assign something, previously we did nothing and left +it unassigned, but after this patch, we will attempt to do some +reallocation. + +Once we start honoring FW resource allocations, this will bring up the +"reallocation" feature which can help making room for SR-IOV when +necessary. + +Link: https://lore.kernel.org/r/20190615002359.29577-1-benh@kernel.crashing.org +Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> +[bhelgaas: commit log] +Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> +Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> +--- + arch/arm64/kernel/pci.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +Index: linux/arch/arm64/kernel/pci.c +=================================================================== +--- linux.orig/arch/arm64/kernel/pci.c ++++ linux/arch/arm64/kernel/pci.c +@@ -194,8 +194,7 @@ struct pci_bus *pci_acpi_scan_root(struc + if (!bus) + return NULL; + +- pci_bus_size_bridges(bus); +- pci_bus_assign_resources(bus); ++ pci_assign_unassigned_root_bus_resources(bus); + + list_for_each_entry(child, &bus->children, node) + pcie_bus_configure_settings(child); diff --git a/debian/patches/bugfix/arm64/arm64-PCI-Preserve-firmware-configuration-when-desir.patch b/debian/patches/bugfix/arm64/arm64-PCI-Preserve-firmware-configuration-when-desir.patch new file mode 100644 index 000000000..37bc6e0c8 --- /dev/null +++ b/debian/patches/bugfix/arm64/arm64-PCI-Preserve-firmware-configuration-when-desir.patch @@ -0,0 +1,46 @@ +From: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Date: Sat, 15 Jun 2019 10:23:59 +1000 +Subject: [PATCH 4/4] arm64: PCI: Preserve firmware configuration when desired +Origin: https://git.kernel.org/linus/85dc04136e86680378546afb808357a58c06061c + +If we must preserve the firmware resource assignments, claim the existing +resources rather than reassigning everything. + +Link: https://lore.kernel.org/r/20190615002359.29577-4-benh@kernel.crashing.org +Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> +[bhelgaas: commit log] +Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> +Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> +Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> +--- + arch/arm64/kernel/pci.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +Index: linux/arch/arm64/kernel/pci.c +=================================================================== +--- linux.orig/arch/arm64/kernel/pci.c ++++ linux/arch/arm64/kernel/pci.c +@@ -169,6 +169,7 @@ struct pci_bus *pci_acpi_scan_root(struc + struct acpi_pci_generic_root_info *ri; + struct pci_bus *bus, *child; + struct acpi_pci_root_ops *root_ops; ++ struct pci_host_bridge *host; + + ri = kzalloc_node(sizeof(*ri), GFP_KERNEL, node); + if (!ri) +@@ -194,6 +195,15 @@ struct pci_bus *pci_acpi_scan_root(struc + if (!bus) + return NULL; + ++ /* If we must preserve the resource configuration, claim now */ ++ host = pci_find_host_bridge(bus); ++ if (host->preserve_config) ++ pci_bus_claim_resources(bus); ++ ++ /* ++ * Assign whatever was left unassigned. If we didn't claim above, ++ * this will reassign everything. ++ */ + pci_assign_unassigned_root_bus_resources(bus); + + list_for_each_entry(child, &bus->children, node) diff --git a/debian/patches/bugfix/arm64/arm64-acpi-Add-fixup-for-HPE-m400-quirks.patch b/debian/patches/bugfix/arm64/arm64-acpi-Add-fixup-for-HPE-m400-quirks.patch new file mode 100644 index 000000000..50098d001 --- /dev/null +++ b/debian/patches/bugfix/arm64/arm64-acpi-Add-fixup-for-HPE-m400-quirks.patch @@ -0,0 +1,92 @@ +From: Geoff Levand <geoff@infradead.org> +Date: Wed, 13 Jun 2018 10:56:08 -0700 +Subject: arm64/acpi: Add fixup for HPE m400 quirks +Forwarded: https://patchwork.codeaurora.org/patch/547277/ + +Adds a new ACPI init routine acpi_fixup_m400_quirks that adds +a work-around for HPE ProLiant m400 APEI firmware problems. + +The work-around disables APEI when CONFIG_ACPI_APEI is set and +m400 firmware is detected. Without this fixup m400 systems +experience errors like these on startup: + + [Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 2 + [Hardware Error]: event severity: fatal + [Hardware Error]: Error 0, type: fatal + [Hardware Error]: section_type: memory error + [Hardware Error]: error_status: 0x0000000000001300 + [Hardware Error]: error_type: 10, invalid address + Kernel panic - not syncing: Fatal hardware error! + +Signed-off-by: Geoff Levand <geoff@infradead.org> +[bwh: Adjust context to apply to Linux 4.19] +--- + arch/arm64/kernel/acpi.c | 40 ++++++++++++++++++++++++++++++++++++---- + 1 file changed, 36 insertions(+), 4 deletions(-) + +Index: linux/arch/arm64/kernel/acpi.c +=================================================================== +--- linux.orig/arch/arm64/kernel/acpi.c ++++ linux/arch/arm64/kernel/acpi.c +@@ -33,6 +33,8 @@ + #include <asm/pgtable.h> + #include <asm/smp_plat.h> + ++#include <acpi/apei.h> ++ + int acpi_noirq = 1; /* skip ACPI IRQ initialization */ + int acpi_disabled = 1; + EXPORT_SYMBOL(acpi_disabled); +@@ -179,6 +181,33 @@ out: + } + + /* ++ * acpi_fixup_m400_quirks - Work-around for HPE ProLiant m400 APEI firmware ++ * problems. ++ */ ++static void __init acpi_fixup_m400_quirks(void) ++{ ++ acpi_status status; ++ struct acpi_table_header *header; ++#if !defined(CONFIG_ACPI_APEI) ++ int hest_disable = HEST_DISABLED; ++#endif ++ ++ if (!IS_ENABLED(CONFIG_ACPI_APEI) || hest_disable != HEST_ENABLED) ++ return; ++ ++ status = acpi_get_table(ACPI_SIG_HEST, 0, &header); ++ ++ if (ACPI_SUCCESS(status) && !strncmp(header->oem_id, "HPE ", 6) && ++ !strncmp(header->oem_table_id, "ProLiant", 8) && ++ MIDR_IMPLEMENTOR(read_cpuid_id()) == ARM_CPU_IMP_APM) { ++ hest_disable = HEST_DISABLED; ++ pr_info("Disabled APEI for m400.\n"); ++ } ++ ++ acpi_put_table(header); ++} ++ ++/* + * acpi_boot_table_init() called from setup_arch(), always. + * 1. find RSDP and get its address, and then find XSDT + * 2. extract all tables and checksums them all +@@ -233,11 +262,14 @@ done: + if (acpi_disabled) { + if (earlycon_acpi_spcr_enable) + early_init_dt_scan_chosen_stdout(); +- } else { +- acpi_parse_spcr(earlycon_acpi_spcr_enable, true); +- if (IS_ENABLED(CONFIG_ACPI_BGRT)) +- acpi_table_parse(ACPI_SIG_BGRT, acpi_parse_bgrt); ++ return; + } ++ ++ acpi_parse_spcr(earlycon_acpi_spcr_enable, true); ++ if (IS_ENABLED(CONFIG_ACPI_BGRT)) ++ acpi_table_parse(ACPI_SIG_BGRT, acpi_parse_bgrt); ++ ++ acpi_fixup_m400_quirks(); + } + + pgprot_t __acpi_get_mem_attribute(phys_addr_t addr) diff --git a/debian/patches/bugfix/arm64/arm64-dts-allwinner-a64-Enable-A64-timer-workaround.patch b/debian/patches/bugfix/arm64/arm64-dts-allwinner-a64-Enable-A64-timer-workaround.patch new file mode 100644 index 000000000..543364416 --- /dev/null +++ b/debian/patches/bugfix/arm64/arm64-dts-allwinner-a64-Enable-A64-timer-workaround.patch @@ -0,0 +1,28 @@ +From: Samuel Holland <samuel@sholland.org> +Date: Sat, 12 Jan 2019 20:17:19 -0600 +Subject: arm64: dts: allwinner: a64: Enable A64 timer workaround +Origin: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/commit?id=55ec26d6a4241363fa94f15377ebd8f1116fbfd7 + +As instability in the architectural timer has been observed on multiple +devices using this SoC, inluding the Pine64 and the Orange Pi Win, +enable the workaround in the SoC's device tree. + +Acked-by: Maxime Ripard <maxime.ripard@bootlin.com> +Signed-off-by: Samuel Holland <samuel@sholland.org> +Signed-off-by: Chen-Yu Tsai <wens@csie.org> +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 1 + + 1 file changed, 1 insertion(+) + +Index: linux/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +=================================================================== +--- linux.orig/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ linux/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -159,6 +159,7 @@ + + timer { + compatible = "arm,armv8-timer"; ++ allwinner,erratum-unknown1; + interrupts = <GIC_PPI 13 + (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>, + <GIC_PPI 14 diff --git a/debian/patches/bugfix/arm64/dts-rockchip-correct-voltage-selector-firefly-RK3399.patch b/debian/patches/bugfix/arm64/dts-rockchip-correct-voltage-selector-firefly-RK3399.patch new file mode 100644 index 000000000..4116ab598 --- /dev/null +++ b/debian/patches/bugfix/arm64/dts-rockchip-correct-voltage-selector-firefly-RK3399.patch @@ -0,0 +1,42 @@ +From: Heinrich Schuchardt <xypron.glpk@gmx.de> +Date: Mon, 4 Jun 2018 19:15:23 +0200 +Subject: arm64: dts: rockchip: correct voltage selector on Firefly-RK3399 +Bug-Debian: https://bugs.debian.org/900799 +Origin: https://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git/patch/?id=710e8c4a54be82ee8a97324e7b4330bf191e08bf + +Without this patch the Firefly-RK3399 board boot process hangs after these +lines: + + fan53555-regulator 0-0040: FAN53555 Option[8] Rev[1] Detected! + fan53555-reg: supplied by vcc_sys + vcc1v8_s3: supplied by vcc_1v8 + +Blacklisting driver fan53555 allows booting. + +The device tree uses a value of fcs,suspend-voltage-selector different to +any other board. + +Changing this setting to the usual value is sufficient to enable booting +and also matches the value used in the vendor kernel. + +Fixes: 171582e00db1 ("arm64: dts: rockchip: add support for firefly-rk3399 board") +Cc: stable@vger.kernel.org +Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3399-firefly.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts +=================================================================== +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts ++++ linux/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts +@@ -455,7 +455,7 @@ + vdd_cpu_b: regulator@40 { + compatible = "silergy,syr827"; + reg = <0x40>; +- fcs,suspend-voltage-selector = <0>; ++ fcs,suspend-voltage-selector = <1>; + regulator-name = "vdd_cpu_b"; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1500000>; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0002-scsi-hisi_sas-Move-evaluation-of-hisi_hba-in-hisi_sa.patch b/debian/patches/bugfix/arm64/huawei-taishan/0002-scsi-hisi_sas-Move-evaluation-of-hisi_hba-in-hisi_sa.patch new file mode 100644 index 000000000..98b6e734e --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0002-scsi-hisi_sas-Move-evaluation-of-hisi_hba-in-hisi_sa.patch @@ -0,0 +1,47 @@ +From bbd24b8bdc501fb5dacb43e847b6eeb9a12829f5 Mon Sep 17 00:00:00 2001 +From: Luo Jiaxing <luojiaxing@huawei.com> +Date: Mon, 24 Sep 2018 23:06:29 +0800 +Subject: [PATCH 02/31] scsi: hisi_sas: Move evaluation of hisi_hba in + hisi_sas_task_prep() +Origin: https://git.kernel.org/linus/1668e3b6f8f8ed2ce685691c92b90dfadeaa3f2f + +In evaluating hisi_hba, the sas_port may be NULL, so for safety relocate +the the check to value possible NULL deference. + +Signed-off-by: Luo Jiaxing <luojiaxing@huawei.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_main.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_main.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -288,13 +288,13 @@ static int hisi_sas_task_prep(struct sas + int *pass) + { + struct domain_device *device = task->dev; +- struct hisi_hba *hisi_hba = dev_to_hisi_hba(device); ++ struct hisi_hba *hisi_hba; + struct hisi_sas_device *sas_dev = device->lldd_dev; + struct hisi_sas_port *port; + struct hisi_sas_slot *slot; + struct hisi_sas_cmd_hdr *cmd_hdr_base; + struct asd_sas_port *sas_port = device->port; +- struct device *dev = hisi_hba->dev; ++ struct device *dev; + int dlvry_queue_slot, dlvry_queue, rc, slot_idx; + int n_elem = 0, n_elem_req = 0, n_elem_resp = 0; + struct hisi_sas_dq *dq; +@@ -315,6 +315,9 @@ static int hisi_sas_task_prep(struct sas + return -ECOMM; + } + ++ hisi_hba = dev_to_hisi_hba(device); ++ dev = hisi_hba->dev; ++ + if (DEV_IS_GONE(sas_dev)) { + if (sas_dev) + dev_info(dev, "task prep: device %d not ready\n", diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0005-scsi-hisi_sas-unmask-interrupts-ent72-and-ent74.patch b/debian/patches/bugfix/arm64/huawei-taishan/0005-scsi-hisi_sas-unmask-interrupts-ent72-and-ent74.patch new file mode 100644 index 000000000..a25ca7885 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0005-scsi-hisi_sas-unmask-interrupts-ent72-and-ent74.patch @@ -0,0 +1,29 @@ +From de1d5713a20562acdb3f94466232432c9dd1d95c Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Mon, 24 Sep 2018 23:06:32 +0800 +Subject: [PATCH 05/31] scsi: hisi_sas: unmask interrupts ent72 and ent74 +Origin: https://git.kernel.org/linus/6ecf5ba13cd5959eb75f617ff32c93bb67790e48 + +The interrupts of ent72 and ent74 are not processed by PCIe AER handling, +so we need to unmask the interrupts and process them first in the driver. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -441,7 +441,7 @@ static void init_reg_v3_hw(struct hisi_h + hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK1, 0xfefefefe); + hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK2, 0xfefefefe); + if (pdev->revision >= 0x21) +- hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK3, 0xffff7fff); ++ hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK3, 0xffff7aff); + else + hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK3, 0xfffe20ff); + hisi_sas_write32(hisi_hba, CHNL_PHYUPDOWN_INT_MSK, 0x0); diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0006-scsi-hisi_sas-Use-block-layer-tag-instead-for-IPTT.patch b/debian/patches/bugfix/arm64/huawei-taishan/0006-scsi-hisi_sas-Use-block-layer-tag-instead-for-IPTT.patch new file mode 100644 index 000000000..15a26a35a --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0006-scsi-hisi_sas-Use-block-layer-tag-instead-for-IPTT.patch @@ -0,0 +1,308 @@ +From d35bf6fccf7d4064065c078d3d369ffeaad6c731 Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Mon, 24 Sep 2018 23:06:33 +0800 +Subject: [PATCH 06/31] scsi: hisi_sas: Use block layer tag instead for IPTT +Origin: https://git.kernel.org/linus/784b46b7cba0ae914dd293f23848c5057c6ba017 + +Currently we use the IPTT defined in LLDD to identify IOs. Actually for +IOs which are from the block layer, they have tags to identify them. So +for those IOs, use tag of the block layer directly, and for IOs which is +not from the block layer (such as internal IOs from libsas/LLDD), reserve +96 IPTTs for them. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas.h | 3 +- + drivers/scsi/hisi_sas/hisi_sas_main.c | 89 +++++++++++++++++--------- + drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 1 - + drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 9 +-- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 8 ++- + 5 files changed, 70 insertions(+), 40 deletions(-) + +--- a/drivers/scsi/hisi_sas/hisi_sas.h ++++ b/drivers/scsi/hisi_sas/hisi_sas.h +@@ -34,6 +34,7 @@ + #define HISI_SAS_MAX_DEVICES HISI_SAS_MAX_ITCT_ENTRIES + #define HISI_SAS_RESET_BIT 0 + #define HISI_SAS_REJECT_CMD_BIT 1 ++#define HISI_SAS_RESERVED_IPTT_CNT 96 + + #define HISI_SAS_STATUS_BUF_SZ (sizeof(struct hisi_sas_status_buffer)) + #define HISI_SAS_COMMAND_TABLE_SZ (sizeof(union hisi_sas_command_table)) +@@ -217,7 +218,7 @@ struct hisi_sas_hw { + int (*hw_init)(struct hisi_hba *hisi_hba); + void (*setup_itct)(struct hisi_hba *hisi_hba, + struct hisi_sas_device *device); +- int (*slot_index_alloc)(struct hisi_hba *hisi_hba, int *slot_idx, ++ int (*slot_index_alloc)(struct hisi_hba *hisi_hba, + struct domain_device *device); + struct hisi_sas_device *(*alloc_dev)(struct domain_device *device); + void (*sl_notify_ssp)(struct hisi_hba *hisi_hba, int phy_no); +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -184,7 +184,14 @@ static void hisi_sas_slot_index_clear(st + + static void hisi_sas_slot_index_free(struct hisi_hba *hisi_hba, int slot_idx) + { +- hisi_sas_slot_index_clear(hisi_hba, slot_idx); ++ unsigned long flags; ++ ++ if (hisi_hba->hw->slot_index_alloc || (slot_idx >= ++ hisi_hba->hw->max_command_entries - HISI_SAS_RESERVED_IPTT_CNT)) { ++ spin_lock_irqsave(&hisi_hba->lock, flags); ++ hisi_sas_slot_index_clear(hisi_hba, slot_idx); ++ spin_unlock_irqrestore(&hisi_hba->lock, flags); ++ } + } + + static void hisi_sas_slot_index_set(struct hisi_hba *hisi_hba, int slot_idx) +@@ -194,24 +201,34 @@ static void hisi_sas_slot_index_set(stru + set_bit(slot_idx, bitmap); + } + +-static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba, int *slot_idx) ++static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba, ++ struct scsi_cmnd *scsi_cmnd) + { +- unsigned int index; ++ int index; + void *bitmap = hisi_hba->slot_index_tags; ++ unsigned long flags; + ++ if (scsi_cmnd) ++ return scsi_cmnd->request->tag; ++ ++ spin_lock_irqsave(&hisi_hba->lock, flags); + index = find_next_zero_bit(bitmap, hisi_hba->slot_index_count, +- hisi_hba->last_slot_index + 1); ++ hisi_hba->last_slot_index + 1); + if (index >= hisi_hba->slot_index_count) { +- index = find_next_zero_bit(bitmap, hisi_hba->slot_index_count, +- 0); +- if (index >= hisi_hba->slot_index_count) ++ index = find_next_zero_bit(bitmap, ++ hisi_hba->slot_index_count, ++ hisi_hba->hw->max_command_entries - ++ HISI_SAS_RESERVED_IPTT_CNT); ++ if (index >= hisi_hba->slot_index_count) { ++ spin_unlock_irqrestore(&hisi_hba->lock, flags); + return -SAS_QUEUE_FULL; ++ } + } + hisi_sas_slot_index_set(hisi_hba, index); +- *slot_idx = index; + hisi_hba->last_slot_index = index; ++ spin_unlock_irqrestore(&hisi_hba->lock, flags); + +- return 0; ++ return index; + } + + static void hisi_sas_slot_index_init(struct hisi_hba *hisi_hba) +@@ -250,9 +267,7 @@ void hisi_sas_slot_task_free(struct hisi + + memset(slot, 0, offsetof(struct hisi_sas_slot, buf)); + +- spin_lock_irqsave(&hisi_hba->lock, flags); + hisi_sas_slot_index_free(hisi_hba, slot->idx); +- spin_unlock_irqrestore(&hisi_hba->lock, flags); + } + EXPORT_SYMBOL_GPL(hisi_sas_slot_task_free); + +@@ -385,16 +400,27 @@ static int hisi_sas_task_prep(struct sas + goto err_out_dma_unmap; + } + +- spin_lock_irqsave(&hisi_hba->lock, flags); + if (hisi_hba->hw->slot_index_alloc) +- rc = hisi_hba->hw->slot_index_alloc(hisi_hba, &slot_idx, +- device); +- else +- rc = hisi_sas_slot_index_alloc(hisi_hba, &slot_idx); +- spin_unlock_irqrestore(&hisi_hba->lock, flags); +- if (rc) ++ rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device); ++ else { ++ struct scsi_cmnd *scsi_cmnd = NULL; ++ ++ if (task->uldd_task) { ++ struct ata_queued_cmd *qc; ++ ++ if (dev_is_sata(device)) { ++ qc = task->uldd_task; ++ scsi_cmnd = qc->scsicmd; ++ } else { ++ scsi_cmnd = task->uldd_task; ++ } ++ } ++ rc = hisi_sas_slot_index_alloc(hisi_hba, scsi_cmnd); ++ } ++ if (rc < 0) + goto err_out_dma_unmap; + ++ slot_idx = rc; + slot = &hisi_hba->slot_info[slot_idx]; + + spin_lock_irqsave(&dq->lock, flags); +@@ -455,9 +481,7 @@ static int hisi_sas_task_prep(struct sas + return 0; + + err_out_tag: +- spin_lock_irqsave(&hisi_hba->lock, flags); + hisi_sas_slot_index_free(hisi_hba, slot_idx); +- spin_unlock_irqrestore(&hisi_hba->lock, flags); + err_out_dma_unmap: + if (!sas_protocol_ata(task->task_proto)) { + if (task->num_scatter) { +@@ -1747,14 +1771,11 @@ hisi_sas_internal_abort_task_exec(struct + port = to_hisi_sas_port(sas_port); + + /* simply get a slot and send abort command */ +- spin_lock_irqsave(&hisi_hba->lock, flags); +- rc = hisi_sas_slot_index_alloc(hisi_hba, &slot_idx); +- if (rc) { +- spin_unlock_irqrestore(&hisi_hba->lock, flags); ++ rc = hisi_sas_slot_index_alloc(hisi_hba, NULL); ++ if (rc < 0) + goto err_out; +- } +- spin_unlock_irqrestore(&hisi_hba->lock, flags); + ++ slot_idx = rc; + slot = &hisi_hba->slot_info[slot_idx]; + + spin_lock_irqsave(&dq->lock, flags_dq); +@@ -1790,7 +1811,6 @@ hisi_sas_internal_abort_task_exec(struct + spin_lock_irqsave(&task->task_state_lock, flags); + task->task_state_flags |= SAS_TASK_AT_INITIATOR; + spin_unlock_irqrestore(&task->task_state_lock, flags); +- + WRITE_ONCE(slot->ready, 1); + /* send abort command to the chip */ + spin_lock_irqsave(&dq->lock, flags); +@@ -1801,9 +1821,7 @@ hisi_sas_internal_abort_task_exec(struct + return 0; + + err_out_tag: +- spin_lock_irqsave(&hisi_hba->lock, flags); + hisi_sas_slot_index_free(hisi_hba, slot_idx); +- spin_unlock_irqrestore(&hisi_hba->lock, flags); + err_out: + dev_err(dev, "internal abort task prep: failed[%d]!\n", rc); + +@@ -2179,6 +2197,8 @@ int hisi_sas_alloc(struct hisi_hba *hisi + hisi_sas_init_mem(hisi_hba); + + hisi_sas_slot_index_init(hisi_hba); ++ hisi_hba->last_slot_index = hisi_hba->hw->max_command_entries - ++ HISI_SAS_RESERVED_IPTT_CNT; + + hisi_hba->wq = create_singlethread_workqueue(dev_name(dev)); + if (!hisi_hba->wq) { +@@ -2382,8 +2402,15 @@ int hisi_sas_probe(struct platform_devic + shost->max_channel = 1; + shost->max_cmd_len = 16; + shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT); +- shost->can_queue = hisi_hba->hw->max_command_entries; +- shost->cmd_per_lun = hisi_hba->hw->max_command_entries; ++ if (hisi_hba->hw->slot_index_alloc) { ++ shost->can_queue = hisi_hba->hw->max_command_entries; ++ shost->cmd_per_lun = hisi_hba->hw->max_command_entries; ++ } else { ++ shost->can_queue = hisi_hba->hw->max_command_entries - ++ HISI_SAS_RESERVED_IPTT_CNT; ++ shost->cmd_per_lun = hisi_hba->hw->max_command_entries - ++ HISI_SAS_RESERVED_IPTT_CNT; ++ } + + sha->sas_ha_name = DRV_NAME; + sha->dev = hisi_hba->dev; +--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +@@ -1807,7 +1807,6 @@ static struct scsi_host_template sht_v1_ + .scan_start = hisi_sas_scan_start, + .change_queue_depth = sas_change_queue_depth, + .bios_param = sas_bios_param, +- .can_queue = 1, + .this_id = -1, + .sg_tablesize = SG_ALL, + .max_sectors = SCSI_DEFAULT_MAX_SECTORS, +--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -770,7 +770,7 @@ static u32 hisi_sas_phy_read32(struct hi + + /* This function needs to be protected from pre-emption. */ + static int +-slot_index_alloc_quirk_v2_hw(struct hisi_hba *hisi_hba, int *slot_idx, ++slot_index_alloc_quirk_v2_hw(struct hisi_hba *hisi_hba, + struct domain_device *device) + { + int sata_dev = dev_is_sata(device); +@@ -778,6 +778,7 @@ slot_index_alloc_quirk_v2_hw(struct hisi + struct hisi_sas_device *sas_dev = device->lldd_dev; + int sata_idx = sas_dev->sata_idx; + int start, end; ++ unsigned long flags; + + if (!sata_dev) { + /* +@@ -801,6 +802,7 @@ slot_index_alloc_quirk_v2_hw(struct hisi + end = 64 * (sata_idx + 2); + } + ++ spin_lock_irqsave(&hisi_hba->lock, flags); + while (1) { + start = find_next_zero_bit(bitmap, + hisi_hba->slot_index_count, start); +@@ -815,8 +817,8 @@ slot_index_alloc_quirk_v2_hw(struct hisi + } + + set_bit(start, bitmap); +- *slot_idx = start; +- return 0; ++ spin_unlock_irqrestore(&hisi_hba->lock, flags); ++ return start; + } + + static bool sata_index_alloc_v2_hw(struct hisi_hba *hisi_hba, int *idx) +@@ -3558,7 +3560,6 @@ static struct scsi_host_template sht_v2_ + .scan_start = hisi_sas_scan_start, + .change_queue_depth = sas_change_queue_depth, + .bios_param = sas_bios_param, +- .can_queue = 1, + .this_id = -1, + .sg_tablesize = SG_ALL, + .max_sectors = SCSI_DEFAULT_MAX_SECTORS, +--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2108,7 +2108,6 @@ static struct scsi_host_template sht_v3_ + .scan_start = hisi_sas_scan_start, + .change_queue_depth = sas_change_queue_depth, + .bios_param = sas_bios_param, +- .can_queue = 1, + .this_id = -1, + .sg_tablesize = SG_ALL, + .max_sectors = SCSI_DEFAULT_MAX_SECTORS, +@@ -2118,6 +2117,7 @@ static struct scsi_host_template sht_v3_ + .target_destroy = sas_target_destroy, + .ioctl = sas_ioctl, + .shost_attrs = host_attrs, ++ .tag_alloc_policy = BLK_TAG_ALLOC_RR, + }; + + static const struct hisi_sas_hw hisi_sas_v3_hw = { +@@ -2255,8 +2255,10 @@ hisi_sas_v3_probe(struct pci_dev *pdev, + shost->max_channel = 1; + shost->max_cmd_len = 16; + shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT); +- shost->can_queue = hisi_hba->hw->max_command_entries; +- shost->cmd_per_lun = hisi_hba->hw->max_command_entries; ++ shost->can_queue = hisi_hba->hw->max_command_entries - ++ HISI_SAS_RESERVED_IPTT_CNT; ++ shost->cmd_per_lun = hisi_hba->hw->max_command_entries - ++ HISI_SAS_RESERVED_IPTT_CNT; + + sha->sas_ha_name = DRV_NAME; + sha->dev = dev; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0007-scsi-hisi_sas-Update-v3-hw-AIP_LIMIT-and-CFG_AGING_T.patch b/debian/patches/bugfix/arm64/huawei-taishan/0007-scsi-hisi_sas-Update-v3-hw-AIP_LIMIT-and-CFG_AGING_T.patch new file mode 100644 index 000000000..440ad1a4a --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0007-scsi-hisi_sas-Update-v3-hw-AIP_LIMIT-and-CFG_AGING_T.patch @@ -0,0 +1,54 @@ +From 4fdcfb8a09d75fbabf4454a60001224b89245c82 Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Mon, 24 Sep 2018 23:06:34 +0800 +Subject: [PATCH 07/31] scsi: hisi_sas: Update v3 hw AIP_LIMIT and + CFG_AGING_TIME register values +Origin: https://git.kernel.org/linus/3bccfba8312762becfb05b35d698ba8cffd440f2 + +Update registers as follows: +- Default value of AIP timer is 1ms, and it is easy for some expanders to + cause IO error. Change the value to max value 65ms to avoid IO error for + those expanders. + +- A CQ completion will be reported by HW when 4 CQs have occurred or the + aging timer expires, whichever happens first. Sor serial IO scenario, it + will still wait 8us for every IO before it is reported. So in the + situation, the performance is poor. So to improve it, change the limit + time to the least value. + For other scenario, it does little affect to the performance. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +++ + 1 file changed, 3 insertions(+) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -127,6 +127,7 @@ + #define PHY_CTRL_RESET_OFF 0 + #define PHY_CTRL_RESET_MSK (0x1 << PHY_CTRL_RESET_OFF) + #define SL_CFG (PORT_BASE + 0x84) ++#define AIP_LIMIT (PORT_BASE + 0x90) + #define SL_CONTROL (PORT_BASE + 0x94) + #define SL_CONTROL_NOTIFY_EN_OFF 0 + #define SL_CONTROL_NOTIFY_EN_MSK (0x1 << SL_CONTROL_NOTIFY_EN_OFF) +@@ -431,6 +432,7 @@ static void init_reg_v3_hw(struct hisi_h + (u32)((1ULL << hisi_hba->queue_count) - 1)); + hisi_sas_write32(hisi_hba, CFG_MAX_TAG, 0xfff0400); + hisi_sas_write32(hisi_hba, HGC_SAS_TXFAIL_RETRY_CTRL, 0x108); ++ hisi_sas_write32(hisi_hba, CFG_AGING_TIME, 0x1); + hisi_sas_write32(hisi_hba, INT_COAL_EN, 0x1); + hisi_sas_write32(hisi_hba, OQ_INT_COAL_TIME, 0x1); + hisi_sas_write32(hisi_hba, OQ_INT_COAL_CNT, 0x1); +@@ -495,6 +497,7 @@ static void init_reg_v3_hw(struct hisi_h + hisi_sas_phy_write32(hisi_hba, i, SAS_SSP_CON_TIMER_CFG, 0x32); + /* used for 12G negotiate */ + hisi_sas_phy_write32(hisi_hba, i, COARSETUNE_TIME, 0x1e); ++ hisi_sas_phy_write32(hisi_hba, i, AIP_LIMIT, 0x2ffff); + } + + for (i = 0; i < hisi_hba->queue_count; i++) { diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0008-scsi-hisi_sas-Fix-spin-lock-management-in-slot_index.patch b/debian/patches/bugfix/arm64/huawei-taishan/0008-scsi-hisi_sas-Fix-spin-lock-management-in-slot_index.patch new file mode 100644 index 000000000..1dbe7390b --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0008-scsi-hisi_sas-Fix-spin-lock-management-in-slot_index.patch @@ -0,0 +1,33 @@ +From f27f6edaf4983b00a3c0e2f6ab720cfa3150a147 Mon Sep 17 00:00:00 2001 +From: John Garry <john.garry@huawei.com> +Date: Tue, 16 Oct 2018 23:00:36 +0800 +Subject: [PATCH 08/31] scsi: hisi_sas: Fix spin lock management in + slot_index_alloc_quirk_v2_hw() +Origin: https://git.kernel.org/linus/fe5fb42de36227c1c2dbb1e7403329ec8a915c20 + +Currently a spin_unlock_irqrestore() call is missing on the error path, +so add it. + +Reported-by: Julia Lawall <julia.lawall@lip6.fr> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -806,8 +806,10 @@ slot_index_alloc_quirk_v2_hw(struct hisi + while (1) { + start = find_next_zero_bit(bitmap, + hisi_hba->slot_index_count, start); +- if (start >= end) ++ if (start >= end) { ++ spin_unlock_irqrestore(&hisi_hba->lock, flags); + return -SAS_QUEUE_FULL; ++ } + /* + * SAS IPTT bit0 should be 1, and SATA IPTT bit0 should be 0. + */ diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0009-scsi-hisi_sas-use-dma_set_mask_and_coherent.patch b/debian/patches/bugfix/arm64/huawei-taishan/0009-scsi-hisi_sas-use-dma_set_mask_and_coherent.patch new file mode 100644 index 000000000..9e466ba4c --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0009-scsi-hisi_sas-use-dma_set_mask_and_coherent.patch @@ -0,0 +1,40 @@ +From 59bc5f2f2492ef9949cd723fc98bafa7d8a6c287 Mon Sep 17 00:00:00 2001 +From: Christoph Hellwig <hch@lst.de> +Date: Thu, 18 Oct 2018 15:10:17 +0200 +Subject: [PATCH 09/31] scsi: hisi_sas: use dma_set_mask_and_coherent +Origin: https://git.kernel.org/linus/e4db40e7a1a2cd6af3b6d5f8f3fba15533872398 + +The driver currently uses pci_set_dma_mask despite otherwise using the +generic DMA API. Switch it over to the better generic DMA API. + +Signed-off-by: Christoph Hellwig <hch@lst.de> +Acked-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2199,14 +2199,11 @@ hisi_sas_v3_probe(struct pci_dev *pdev, + if (rc) + goto err_out_disable_device; + +- if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) || +- (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0)) { +- if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) || +- (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)) { +- dev_err(dev, "No usable DMA addressing method\n"); +- rc = -EIO; +- goto err_out_regions; +- } ++ if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) || ++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) { ++ dev_err(dev, "No usable DMA addressing method\n"); ++ rc = -EIO; ++ goto err_out_regions; + } + + shost = hisi_sas_shost_alloc_pci(pdev); diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0010-scsi-hisi_sas-Create-separate-host-attributes-per-HB.patch b/debian/patches/bugfix/arm64/huawei-taishan/0010-scsi-hisi_sas-Create-separate-host-attributes-per-HB.patch new file mode 100644 index 000000000..5bbf33aa2 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0010-scsi-hisi_sas-Create-separate-host-attributes-per-HB.patch @@ -0,0 +1,116 @@ +From 4e63bca6e8c3a7fac800ee6c27f9afab13774fde Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Fri, 9 Nov 2018 22:06:32 +0800 +Subject: [PATCH 10/31] scsi: hisi_sas: Create separate host attributes per HBA +Origin: https://git.kernel.org/linus/c3566f9a617de3288739fd3b8e7539951bf2b04d + +Currently all the three HBA (v1/v2/v3 HW) share the same host attributes. + +To support each HBA having separate attributes in future, create per-HBA +attributes. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas.h | 1 - + drivers/scsi/hisi_sas/hisi_sas_main.c | 6 ------ + drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 7 ++++++- + drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 7 ++++++- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 7 ++++++- + 5 files changed, 18 insertions(+), 10 deletions(-) + +--- a/drivers/scsi/hisi_sas/hisi_sas.h ++++ b/drivers/scsi/hisi_sas/hisi_sas.h +@@ -468,7 +468,6 @@ extern int hisi_sas_remove(struct platfo + extern int hisi_sas_slave_configure(struct scsi_device *sdev); + extern int hisi_sas_scan_finished(struct Scsi_Host *shost, unsigned long time); + extern void hisi_sas_scan_start(struct Scsi_Host *shost); +-extern struct device_attribute *host_attrs[]; + extern int hisi_sas_host_reset(struct Scsi_Host *shost, int reset_type); + extern void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy); + extern void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -2021,12 +2021,6 @@ EXPORT_SYMBOL_GPL(hisi_sas_kill_tasklets + struct scsi_transport_template *hisi_sas_stt; + EXPORT_SYMBOL_GPL(hisi_sas_stt); + +-struct device_attribute *host_attrs[] = { +- &dev_attr_phy_event_threshold, +- NULL, +-}; +-EXPORT_SYMBOL_GPL(host_attrs); +- + static struct sas_domain_function_template hisi_sas_transport_ops = { + .lldd_dev_found = hisi_sas_dev_found, + .lldd_dev_gone = hisi_sas_dev_gone, +--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +@@ -1797,6 +1797,11 @@ static int hisi_sas_v1_init(struct hisi_ + return 0; + } + ++static struct device_attribute *host_attrs_v1_hw[] = { ++ &dev_attr_phy_event_threshold, ++ NULL ++}; ++ + static struct scsi_host_template sht_v1_hw = { + .name = DRV_NAME, + .module = THIS_MODULE, +@@ -1816,7 +1821,7 @@ static struct scsi_host_template sht_v1_ + .slave_alloc = sas_slave_alloc, + .target_destroy = sas_target_destroy, + .ioctl = sas_ioctl, +- .shost_attrs = host_attrs, ++ .shost_attrs = host_attrs_v1_hw, + }; + + static const struct hisi_sas_hw hisi_sas_v1_hw = { +--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -3552,6 +3552,11 @@ static void wait_cmds_complete_timeout_v + dev_dbg(dev, "wait commands complete %dms\n", time); + } + ++struct device_attribute *host_attrs_v2_hw[] = { ++ &dev_attr_phy_event_threshold, ++ NULL ++}; ++ + static struct scsi_host_template sht_v2_hw = { + .name = DRV_NAME, + .module = THIS_MODULE, +@@ -3571,7 +3576,7 @@ static struct scsi_host_template sht_v2_ + .slave_alloc = sas_slave_alloc, + .target_destroy = sas_target_destroy, + .ioctl = sas_ioctl, +- .shost_attrs = host_attrs, ++ .shost_attrs = host_attrs_v2_hw, + }; + + static const struct hisi_sas_hw hisi_sas_v2_hw = { +--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2101,6 +2101,11 @@ static void wait_cmds_complete_timeout_v + dev_dbg(dev, "wait commands complete %dms\n", time); + } + ++struct device_attribute *host_attrs_v3_hw[] = { ++ &dev_attr_phy_event_threshold, ++ NULL ++}; ++ + static struct scsi_host_template sht_v3_hw = { + .name = DRV_NAME, + .module = THIS_MODULE, +@@ -2120,7 +2125,7 @@ static struct scsi_host_template sht_v3_ + .slave_alloc = sas_slave_alloc, + .target_destroy = sas_target_destroy, + .ioctl = sas_ioctl, +- .shost_attrs = host_attrs, ++ .shost_attrs = host_attrs_v3_hw, + .tag_alloc_policy = BLK_TAG_ALLOC_RR, + }; + diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0011-scsi-hisi_sas-Add-support-for-interrupt-converge-for.patch b/debian/patches/bugfix/arm64/huawei-taishan/0011-scsi-hisi_sas-Add-support-for-interrupt-converge-for.patch new file mode 100644 index 000000000..ae1b2d718 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0011-scsi-hisi_sas-Add-support-for-interrupt-converge-for.patch @@ -0,0 +1,113 @@ +From 7e5e4c2dfd67e156956e46c4d503466726a5359c Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Fri, 9 Nov 2018 22:06:33 +0800 +Subject: [PATCH 11/31] scsi: hisi_sas: Add support for interrupt converge for + v3 hw +Origin: https://git.kernel.org/linus/488cf558e3d7c95daf737d9cae165019ee3f2840 + +If CQ_INT_CONVERGE_EN is enabled, the interrupts of all the 16 CQ queues +will be reported by CQ0. + +So we need to change the process of CQ tasklet for this situation. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 29 +++++++++++++++++++++----- + 1 file changed, 24 insertions(+), 5 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -42,6 +42,7 @@ + #define MAX_CON_TIME_LIMIT_TIME 0xa4 + #define BUS_INACTIVE_LIMIT_TIME 0xa8 + #define REJECT_TO_OPEN_LIMIT_TIME 0xac ++#define CQ_INT_CONVERGE_EN 0xb0 + #define CFG_AGING_TIME 0xbc + #define HGC_DFX_CFG2 0xc0 + #define CFG_ABT_SET_QUERY_IPTT 0xd4 +@@ -371,6 +372,9 @@ struct hisi_sas_err_record_v3 { + ((fis.command == ATA_CMD_DEV_RESET) && \ + ((fis.control & ATA_SRST) != 0))) + ++static bool hisi_sas_intr_conv; ++MODULE_PARM_DESC(intr_conv, "interrupt converge enable (0-1)"); ++ + static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off) + { + void __iomem *regs = hisi_hba->regs + off; +@@ -436,6 +440,8 @@ static void init_reg_v3_hw(struct hisi_h + hisi_sas_write32(hisi_hba, INT_COAL_EN, 0x1); + hisi_sas_write32(hisi_hba, OQ_INT_COAL_TIME, 0x1); + hisi_sas_write32(hisi_hba, OQ_INT_COAL_CNT, 0x1); ++ hisi_sas_write32(hisi_hba, CQ_INT_CONVERGE_EN, ++ hisi_sas_intr_conv); + hisi_sas_write32(hisi_hba, OQ_INT_SRC, 0xffff); + hisi_sas_write32(hisi_hba, ENT_INT_SRC1, 0xffffffff); + hisi_sas_write32(hisi_hba, ENT_INT_SRC2, 0xffffffff); +@@ -1878,10 +1884,12 @@ static int interrupt_init_v3_hw(struct h + for (i = 0; i < hisi_hba->queue_count; i++) { + struct hisi_sas_cq *cq = &hisi_hba->cq[i]; + struct tasklet_struct *t = &cq->tasklet; ++ int nr = hisi_sas_intr_conv ? 16 : 16 + i; ++ unsigned long irqflags = hisi_sas_intr_conv ? IRQF_SHARED : 0; + +- rc = devm_request_irq(dev, pci_irq_vector(pdev, i+16), +- cq_interrupt_v3_hw, 0, +- DRV_NAME " cq", cq); ++ rc = devm_request_irq(dev, pci_irq_vector(pdev, nr), ++ cq_interrupt_v3_hw, irqflags, ++ DRV_NAME " cq", cq); + if (rc) { + dev_err(dev, + "could not request cq%d interrupt, rc=%d\n", +@@ -1898,8 +1906,9 @@ static int interrupt_init_v3_hw(struct h + free_cq_irqs: + for (k = 0; k < i; k++) { + struct hisi_sas_cq *cq = &hisi_hba->cq[k]; ++ int nr = hisi_sas_intr_conv ? 16 : 16 + k; + +- free_irq(pci_irq_vector(pdev, k+16), cq); ++ free_irq(pci_irq_vector(pdev, nr), cq); + } + free_irq(pci_irq_vector(pdev, 11), hisi_hba); + free_chnl_interrupt: +@@ -2089,8 +2098,16 @@ static void wait_cmds_complete_timeout_v + dev_dbg(dev, "wait commands complete %dms\n", time); + } + ++static ssize_t intr_conv_v3_hw_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ return scnprintf(buf, PAGE_SIZE, "%u\n", hisi_sas_intr_conv); ++} ++static DEVICE_ATTR_RO(intr_conv_v3_hw); ++ + struct device_attribute *host_attrs_v3_hw[] = { + &dev_attr_phy_event_threshold, ++ &dev_attr_intr_conv_v3_hw, + NULL + }; + +@@ -2303,8 +2320,9 @@ hisi_sas_v3_destroy_irqs(struct pci_dev + free_irq(pci_irq_vector(pdev, 11), hisi_hba); + for (i = 0; i < hisi_hba->queue_count; i++) { + struct hisi_sas_cq *cq = &hisi_hba->cq[i]; ++ int nr = hisi_sas_intr_conv ? 16 : 16 + i; + +- free_irq(pci_irq_vector(pdev, i+16), cq); ++ free_irq(pci_irq_vector(pdev, nr), cq); + } + pci_free_irq_vectors(pdev); + } +@@ -2626,6 +2644,7 @@ static struct pci_driver sas_v3_pci_driv + }; + + module_pci_driver(sas_v3_pci_driver); ++module_param_named(intr_conv, hisi_sas_intr_conv, bool, 0444); + + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("John Garry <john.garry@huawei.com>"); diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0012-scsi-hisi_sas-Add-support-for-interrupt-coalescing-f.patch b/debian/patches/bugfix/arm64/huawei-taishan/0012-scsi-hisi_sas-Add-support-for-interrupt-coalescing-f.patch new file mode 100644 index 000000000..4595633a2 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0012-scsi-hisi_sas-Add-support-for-interrupt-coalescing-f.patch @@ -0,0 +1,150 @@ +From 20ca5e4f2c4a2c08340225f074c56f7be1c86f5b Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Fri, 9 Nov 2018 22:06:34 +0800 +Subject: [PATCH 12/31] scsi: hisi_sas: Add support for interrupt coalescing + for v3 hw +Origin: https://git.kernel.org/linus/37359798ec44ae03fab383a9bef3b7c9df819063 + +If INT_COAL_EN is enabled, configure time and count of interrupt +coalescing. Then if CQ collects count of CQ entries in time, it will +report the interrupt. Or if CQ doesn't collect enough CQ entries in time, +it will report the interrupt at timeout. + +As all the registers are not supported to be changed dynamically, we need +to config those register between disable and enable PHYs. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas.h | 2 + + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 100 +++++++++++++++++++++++++ + 2 files changed, 102 insertions(+) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas.h +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas.h ++++ linux/drivers/scsi/hisi_sas/hisi_sas.h +@@ -322,6 +322,8 @@ struct hisi_hba { + unsigned long sata_dev_bitmap[BITS_TO_LONGS(HISI_SAS_MAX_DEVICES)]; + struct work_struct rst_work; + u32 phy_state; ++ u32 intr_coal_ticks; /* Time of interrupt coalesce in us */ ++ u32 intr_coal_count; /* Interrupt count to coalesce */ + }; + + /* Generic HW DMA host memory structures */ +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2105,9 +2105,109 @@ static ssize_t intr_conv_v3_hw_show(stru + } + static DEVICE_ATTR_RO(intr_conv_v3_hw); + ++static void config_intr_coal_v3_hw(struct hisi_hba *hisi_hba) ++{ ++ /* config those registers between enable and disable PHYs */ ++ hisi_sas_stop_phys(hisi_hba); ++ ++ if (hisi_hba->intr_coal_ticks == 0 || ++ hisi_hba->intr_coal_count == 0) { ++ hisi_sas_write32(hisi_hba, INT_COAL_EN, 0x1); ++ hisi_sas_write32(hisi_hba, OQ_INT_COAL_TIME, 0x1); ++ hisi_sas_write32(hisi_hba, OQ_INT_COAL_CNT, 0x1); ++ } else { ++ hisi_sas_write32(hisi_hba, INT_COAL_EN, 0x3); ++ hisi_sas_write32(hisi_hba, OQ_INT_COAL_TIME, ++ hisi_hba->intr_coal_ticks); ++ hisi_sas_write32(hisi_hba, OQ_INT_COAL_CNT, ++ hisi_hba->intr_coal_count); ++ } ++ phys_init_v3_hw(hisi_hba); ++} ++ ++static ssize_t intr_coal_ticks_v3_hw_show(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct hisi_hba *hisi_hba = shost_priv(shost); ++ ++ return scnprintf(buf, PAGE_SIZE, "%u\n", ++ hisi_hba->intr_coal_ticks); ++} ++ ++static ssize_t intr_coal_ticks_v3_hw_store(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct hisi_hba *hisi_hba = shost_priv(shost); ++ u32 intr_coal_ticks; ++ int ret; ++ ++ ret = kstrtou32(buf, 10, &intr_coal_ticks); ++ if (ret) { ++ dev_err(dev, "Input data of interrupt coalesce unmatch\n"); ++ return -EINVAL; ++ } ++ ++ if (intr_coal_ticks >= BIT(24)) { ++ dev_err(dev, "intr_coal_ticks must be less than 2^24!\n"); ++ return -EINVAL; ++ } ++ ++ hisi_hba->intr_coal_ticks = intr_coal_ticks; ++ ++ config_intr_coal_v3_hw(hisi_hba); ++ ++ return count; ++} ++static DEVICE_ATTR_RW(intr_coal_ticks_v3_hw); ++ ++static ssize_t intr_coal_count_v3_hw_show(struct device *dev, ++ struct device_attribute ++ *attr, char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct hisi_hba *hisi_hba = shost_priv(shost); ++ ++ return scnprintf(buf, PAGE_SIZE, "%u\n", ++ hisi_hba->intr_coal_count); ++} ++ ++static ssize_t intr_coal_count_v3_hw_store(struct device *dev, ++ struct device_attribute ++ *attr, const char *buf, size_t count) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct hisi_hba *hisi_hba = shost_priv(shost); ++ u32 intr_coal_count; ++ int ret; ++ ++ ret = kstrtou32(buf, 10, &intr_coal_count); ++ if (ret) { ++ dev_err(dev, "Input data of interrupt coalesce unmatch\n"); ++ return -EINVAL; ++ } ++ ++ if (intr_coal_count >= BIT(8)) { ++ dev_err(dev, "intr_coal_count must be less than 2^8!\n"); ++ return -EINVAL; ++ } ++ ++ hisi_hba->intr_coal_count = intr_coal_count; ++ ++ config_intr_coal_v3_hw(hisi_hba); ++ ++ return count; ++} ++static DEVICE_ATTR_RW(intr_coal_count_v3_hw); ++ + struct device_attribute *host_attrs_v3_hw[] = { + &dev_attr_phy_event_threshold, + &dev_attr_intr_conv_v3_hw, ++ &dev_attr_intr_coal_ticks_v3_hw, ++ &dev_attr_intr_coal_count_v3_hw, + NULL + }; + diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0013-scsi-hisi_sas-Relocate-some-codes-to-avoid-an-unused.patch b/debian/patches/bugfix/arm64/huawei-taishan/0013-scsi-hisi_sas-Relocate-some-codes-to-avoid-an-unused.patch new file mode 100644 index 000000000..060fbcfb8 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0013-scsi-hisi_sas-Relocate-some-codes-to-avoid-an-unused.patch @@ -0,0 +1,92 @@ +From 22834ed6cec2690817120e960d43bbf76ddfda17 Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Fri, 9 Nov 2018 22:06:35 +0800 +Subject: [PATCH 13/31] scsi: hisi_sas: Relocate some codes to avoid an unused + check +Origin: https://git.kernel.org/linus/745b6847634c11dda1079d0290781a443eddb4b7 + +In function hisi_sas_task_prep(), we check asd_sas_port, but in function +hisi_sas_task_exec(), we already refer to asd_sas_port by using function +dev_to_hisi_hba() implicitly. So to avoid this possible invalid +dereference, relocate the check to function hisi_sas_task_prep(). + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_main.c | 44 ++++++++++++++------------- + 1 file changed, 23 insertions(+), 21 deletions(-) + +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -303,36 +303,19 @@ static int hisi_sas_task_prep(struct sas + int *pass) + { + struct domain_device *device = task->dev; +- struct hisi_hba *hisi_hba; ++ struct hisi_hba *hisi_hba = dev_to_hisi_hba(device); + struct hisi_sas_device *sas_dev = device->lldd_dev; + struct hisi_sas_port *port; + struct hisi_sas_slot *slot; + struct hisi_sas_cmd_hdr *cmd_hdr_base; + struct asd_sas_port *sas_port = device->port; +- struct device *dev; ++ struct device *dev = hisi_hba->dev; + int dlvry_queue_slot, dlvry_queue, rc, slot_idx; + int n_elem = 0, n_elem_req = 0, n_elem_resp = 0; + struct hisi_sas_dq *dq; + unsigned long flags; + int wr_q_index; + +- if (!sas_port) { +- struct task_status_struct *ts = &task->task_status; +- +- ts->resp = SAS_TASK_UNDELIVERED; +- ts->stat = SAS_PHY_DOWN; +- /* +- * libsas will use dev->port, should +- * not call task_done for sata +- */ +- if (device->dev_type != SAS_SATA_DEV) +- task->task_done(task); +- return -ECOMM; +- } +- +- hisi_hba = dev_to_hisi_hba(device); +- dev = hisi_hba->dev; +- + if (DEV_IS_GONE(sas_dev)) { + if (sas_dev) + dev_info(dev, "task prep: device %d not ready\n", +@@ -507,10 +490,29 @@ static int hisi_sas_task_exec(struct sas + u32 rc; + u32 pass = 0; + unsigned long flags; +- struct hisi_hba *hisi_hba = dev_to_hisi_hba(task->dev); +- struct device *dev = hisi_hba->dev; ++ struct hisi_hba *hisi_hba; ++ struct device *dev; ++ struct domain_device *device = task->dev; ++ struct asd_sas_port *sas_port = device->port; + struct hisi_sas_dq *dq = NULL; + ++ if (!sas_port) { ++ struct task_status_struct *ts = &task->task_status; ++ ++ ts->resp = SAS_TASK_UNDELIVERED; ++ ts->stat = SAS_PHY_DOWN; ++ /* ++ * libsas will use dev->port, should ++ * not call task_done for sata ++ */ ++ if (device->dev_type != SAS_SATA_DEV) ++ task->task_done(task); ++ return -ECOMM; ++ } ++ ++ hisi_hba = dev_to_hisi_hba(device); ++ dev = hisi_hba->dev; ++ + if (unlikely(test_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags))) { + /* + * For IOs from upper layer, it may already disable preempt diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0014-scsi-hisi_sas-Fix-warnings-detected-by-sparse.patch b/debian/patches/bugfix/arm64/huawei-taishan/0014-scsi-hisi_sas-Fix-warnings-detected-by-sparse.patch new file mode 100644 index 000000000..1f9ed71c0 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0014-scsi-hisi_sas-Fix-warnings-detected-by-sparse.patch @@ -0,0 +1,429 @@ +From 13dda01985003ca1b930b42bb3927f7522f4ce69 Mon Sep 17 00:00:00 2001 +From: John Garry <john.garry@huawei.com> +Date: Thu, 6 Dec 2018 21:34:40 +0800 +Subject: [PATCH 14/31] scsi: hisi_sas: Fix warnings detected by sparse +Origin: https://git.kernel.org/linus/735bcc77e6ba83e464665cea9041072190ede37e + +This patchset fixes some warnings detected by the sparse tool, like these: +drivers/scsi/hisi_sas/hisi_sas_main.c:1469:52: warning: incorrect type in assignment (different base types) +drivers/scsi/hisi_sas/hisi_sas_main.c:1469:52: expected unsigned short [unsigned] [assigned] [usertype] tag_of_task_to_be_managed +drivers/scsi/hisi_sas/hisi_sas_main.c:1469:52: got restricted __le16 [usertype] <noident> +drivers/scsi/hisi_sas/hisi_sas_main.c:1723:52: warning: incorrect type in assignment (different base types) +drivers/scsi/hisi_sas/hisi_sas_main.c:1723:52: expected unsigned short [unsigned] [assigned] [usertype] tag_of_task_to_be_managed +drivers/scsi/hisi_sas/hisi_sas_main.c:1723:52: got restricted __le16 [usertype] <noident> + +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas.h | 2 +- + drivers/scsi/hisi_sas/hisi_sas_main.c | 6 +-- + drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 15 +++--- + drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 66 +++++++++++++++----------- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 37 +++++++++------ + 5 files changed, 71 insertions(+), 55 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas.h +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas.h ++++ linux/drivers/scsi/hisi_sas/hisi_sas.h +@@ -211,7 +211,7 @@ struct hisi_sas_slot { + /* Do not reorder/change members after here */ + void *buf; + dma_addr_t buf_dma; +- int idx; ++ u16 idx; + }; + + struct hisi_sas_hw { +Index: linux/drivers/scsi/hisi_sas/hisi_sas_main.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -1463,12 +1463,12 @@ static int hisi_sas_abort_task(struct sa + if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { + struct scsi_cmnd *cmnd = task->uldd_task; + struct hisi_sas_slot *slot = task->lldd_task; +- u32 tag = slot->idx; ++ u16 tag = slot->idx; + int rc2; + + int_to_scsilun(cmnd->device->lun, &lun); + tmf_task.tmf = TMF_ABORT_TASK; +- tmf_task.tag_of_task_to_be_managed = cpu_to_le16(tag); ++ tmf_task.tag_of_task_to_be_managed = tag; + + rc = hisi_sas_debug_issue_ssp_tmf(task->dev, lun.scsi_lun, + &tmf_task); +@@ -1722,7 +1722,7 @@ static int hisi_sas_query_task(struct sa + + int_to_scsilun(cmnd->device->lun, &lun); + tmf_task.tmf = TMF_QUERY_TASK; +- tmf_task.tag_of_task_to_be_managed = cpu_to_le16(tag); ++ tmf_task.tag_of_task_to_be_managed = tag; + + rc = hisi_sas_debug_issue_ssp_tmf(device, + lun.scsi_lun, +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +@@ -510,6 +510,7 @@ static void setup_itct_v1_hw(struct hisi + struct hisi_sas_itct *itct = &hisi_hba->itct[device_id]; + struct asd_sas_port *sas_port = device->port; + struct hisi_sas_port *port = to_hisi_sas_port(sas_port); ++ u64 sas_addr; + + memset(itct, 0, sizeof(*itct)); + +@@ -534,8 +535,8 @@ static void setup_itct_v1_hw(struct hisi + itct->qw0 = cpu_to_le64(qw0); + + /* qw1 */ +- memcpy(&itct->sas_addr, device->sas_addr, SAS_ADDR_SIZE); +- itct->sas_addr = __swab64(itct->sas_addr); ++ memcpy(&sas_addr, device->sas_addr, SAS_ADDR_SIZE); ++ itct->sas_addr = cpu_to_le64(__swab64(sas_addr)); + + /* qw2 */ + itct->qw2 = cpu_to_le64((500ULL << ITCT_HDR_IT_NEXUS_LOSS_TL_OFF) | +@@ -561,7 +562,7 @@ static void clear_itct_v1_hw(struct hisi + reg_val &= ~CFG_AGING_TIME_ITCT_REL_MSK; + hisi_sas_write32(hisi_hba, CFG_AGING_TIME, reg_val); + +- qw0 = cpu_to_le64(itct->qw0); ++ qw0 = le64_to_cpu(itct->qw0); + qw0 &= ~ITCT_HDR_VALID_MSK; + itct->qw0 = cpu_to_le64(qw0); + } +@@ -1100,7 +1101,7 @@ static void slot_err_v1_hw(struct hisi_h + case SAS_PROTOCOL_SSP: + { + int error = -1; +- u32 dma_err_type = cpu_to_le32(err_record->dma_err_type); ++ u32 dma_err_type = le32_to_cpu(err_record->dma_err_type); + u32 dma_tx_err_type = ((dma_err_type & + ERR_HDR_DMA_TX_ERR_TYPE_MSK)) >> + ERR_HDR_DMA_TX_ERR_TYPE_OFF; +@@ -1108,9 +1109,9 @@ static void slot_err_v1_hw(struct hisi_h + ERR_HDR_DMA_RX_ERR_TYPE_MSK)) >> + ERR_HDR_DMA_RX_ERR_TYPE_OFF; + u32 trans_tx_fail_type = +- cpu_to_le32(err_record->trans_tx_fail_type); ++ le32_to_cpu(err_record->trans_tx_fail_type); + u32 trans_rx_fail_type = +- cpu_to_le32(err_record->trans_rx_fail_type); ++ le32_to_cpu(err_record->trans_rx_fail_type); + + if (dma_tx_err_type) { + /* dma tx err */ +@@ -1558,7 +1559,7 @@ static irqreturn_t cq_interrupt_v1_hw(in + u32 cmplt_hdr_data; + + complete_hdr = &complete_queue[rd_point]; +- cmplt_hdr_data = cpu_to_le32(complete_hdr->data); ++ cmplt_hdr_data = le32_to_cpu(complete_hdr->data); + idx = (cmplt_hdr_data & CMPLT_HDR_IPTT_MSK) >> + CMPLT_HDR_IPTT_OFF; + slot = &hisi_hba->slot_info[idx]; +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -934,6 +934,7 @@ static void setup_itct_v2_hw(struct hisi + struct domain_device *parent_dev = device->parent; + struct asd_sas_port *sas_port = device->port; + struct hisi_sas_port *port = to_hisi_sas_port(sas_port); ++ u64 sas_addr; + + memset(itct, 0, sizeof(*itct)); + +@@ -966,8 +967,8 @@ static void setup_itct_v2_hw(struct hisi + itct->qw0 = cpu_to_le64(qw0); + + /* qw1 */ +- memcpy(&itct->sas_addr, device->sas_addr, SAS_ADDR_SIZE); +- itct->sas_addr = __swab64(itct->sas_addr); ++ memcpy(&sas_addr, device->sas_addr, SAS_ADDR_SIZE); ++ itct->sas_addr = cpu_to_le64(__swab64(sas_addr)); + + /* qw2 */ + if (!dev_is_sata(device)) +@@ -2044,11 +2045,11 @@ static void slot_err_v2_hw(struct hisi_h + struct task_status_struct *ts = &task->task_status; + struct hisi_sas_err_record_v2 *err_record = + hisi_sas_status_buf_addr_mem(slot); +- u32 trans_tx_fail_type = cpu_to_le32(err_record->trans_tx_fail_type); +- u32 trans_rx_fail_type = cpu_to_le32(err_record->trans_rx_fail_type); +- u16 dma_tx_err_type = cpu_to_le16(err_record->dma_tx_err_type); +- u16 sipc_rx_err_type = cpu_to_le16(err_record->sipc_rx_err_type); +- u32 dma_rx_err_type = cpu_to_le32(err_record->dma_rx_err_type); ++ u32 trans_tx_fail_type = le32_to_cpu(err_record->trans_tx_fail_type); ++ u32 trans_rx_fail_type = le32_to_cpu(err_record->trans_rx_fail_type); ++ u16 dma_tx_err_type = le16_to_cpu(err_record->dma_tx_err_type); ++ u16 sipc_rx_err_type = le16_to_cpu(err_record->sipc_rx_err_type); ++ u32 dma_rx_err_type = le32_to_cpu(err_record->dma_rx_err_type); + int error = -1; + + if (err_phase == 1) { +@@ -2059,8 +2060,7 @@ static void slot_err_v2_hw(struct hisi_h + trans_tx_fail_type); + } else if (err_phase == 2) { + /* error in RX phase, the priority is: DW1 > DW3 > DW2 */ +- error = parse_trans_rx_err_code_v2_hw( +- trans_rx_fail_type); ++ error = parse_trans_rx_err_code_v2_hw(trans_rx_fail_type); + if (error == -1) { + error = parse_dma_rx_err_code_v2_hw( + dma_rx_err_type); +@@ -2358,6 +2358,7 @@ slot_complete_v2_hw(struct hisi_hba *his + &complete_queue[slot->cmplt_queue_slot]; + unsigned long flags; + bool is_internal = slot->is_internal; ++ u32 dw0; + + if (unlikely(!task || !task->lldd_task || !task->dev)) + return -EINVAL; +@@ -2382,8 +2383,9 @@ slot_complete_v2_hw(struct hisi_hba *his + } + + /* Use SAS+TMF status codes */ +- switch ((complete_hdr->dw0 & CMPLT_HDR_ABORT_STAT_MSK) +- >> CMPLT_HDR_ABORT_STAT_OFF) { ++ dw0 = le32_to_cpu(complete_hdr->dw0); ++ switch ((dw0 & CMPLT_HDR_ABORT_STAT_MSK) >> ++ CMPLT_HDR_ABORT_STAT_OFF) { + case STAT_IO_ABORTED: + /* this io has been aborted by abort command */ + ts->stat = SAS_ABORTED_TASK; +@@ -2408,9 +2410,8 @@ slot_complete_v2_hw(struct hisi_hba *his + break; + } + +- if ((complete_hdr->dw0 & CMPLT_HDR_ERX_MSK) && +- (!(complete_hdr->dw0 & CMPLT_HDR_RSPNS_XFRD_MSK))) { +- u32 err_phase = (complete_hdr->dw0 & CMPLT_HDR_ERR_PHASE_MSK) ++ if ((dw0 & CMPLT_HDR_ERX_MSK) && (!(dw0 & CMPLT_HDR_RSPNS_XFRD_MSK))) { ++ u32 err_phase = (dw0 & CMPLT_HDR_ERR_PHASE_MSK) + >> CMPLT_HDR_ERR_PHASE_OFF; + u32 *error_info = hisi_sas_status_buf_addr_mem(slot); + +@@ -2526,22 +2527,23 @@ static void prep_ata_v2_hw(struct hisi_h + struct hisi_sas_tmf_task *tmf = slot->tmf; + u8 *buf_cmd; + int has_data = 0, hdr_tag = 0; +- u32 dw1 = 0, dw2 = 0; ++ u32 dw0, dw1 = 0, dw2 = 0; + + /* create header */ + /* dw0 */ +- hdr->dw0 = cpu_to_le32(port->id << CMD_HDR_PORT_OFF); ++ dw0 = port->id << CMD_HDR_PORT_OFF; + if (parent_dev && DEV_IS_EXPANDER(parent_dev->dev_type)) +- hdr->dw0 |= cpu_to_le32(3 << CMD_HDR_CMD_OFF); ++ dw0 |= 3 << CMD_HDR_CMD_OFF; + else +- hdr->dw0 |= cpu_to_le32(4 << CMD_HDR_CMD_OFF); ++ dw0 |= 4 << CMD_HDR_CMD_OFF; + + if (tmf && tmf->force_phy) { +- hdr->dw0 |= CMD_HDR_FORCE_PHY_MSK; +- hdr->dw0 |= cpu_to_le32((1 << tmf->phy_id) +- << CMD_HDR_PHY_ID_OFF); ++ dw0 |= CMD_HDR_FORCE_PHY_MSK; ++ dw0 |= (1 << tmf->phy_id) << CMD_HDR_PHY_ID_OFF; + } + ++ hdr->dw0 = cpu_to_le32(dw0); ++ + /* dw1 */ + switch (task->data_dir) { + case DMA_TO_DEVICE: +@@ -3152,20 +3154,24 @@ static void cq_tasklet_v2_hw(unsigned lo + + /* Check for NCQ completion */ + if (complete_hdr->act) { +- u32 act_tmp = complete_hdr->act; ++ u32 act_tmp = le32_to_cpu(complete_hdr->act); + int ncq_tag_count = ffs(act_tmp); ++ u32 dw1 = le32_to_cpu(complete_hdr->dw1); + +- dev_id = (complete_hdr->dw1 & CMPLT_HDR_DEV_ID_MSK) >> ++ dev_id = (dw1 & CMPLT_HDR_DEV_ID_MSK) >> + CMPLT_HDR_DEV_ID_OFF; + itct = &hisi_hba->itct[dev_id]; + + /* The NCQ tags are held in the itct header */ + while (ncq_tag_count) { +- __le64 *ncq_tag = &itct->qw4_15[0]; ++ __le64 *_ncq_tag = &itct->qw4_15[0], __ncq_tag; ++ u64 ncq_tag; + +- ncq_tag_count -= 1; +- iptt = (ncq_tag[ncq_tag_count / 5] +- >> (ncq_tag_count % 5) * 12) & 0xfff; ++ ncq_tag_count--; ++ __ncq_tag = _ncq_tag[ncq_tag_count / 5]; ++ ncq_tag = le64_to_cpu(__ncq_tag); ++ iptt = (ncq_tag >> (ncq_tag_count % 5) * 12) & ++ 0xfff; + + slot = &hisi_hba->slot_info[iptt]; + slot->cmplt_queue_slot = rd_point; +@@ -3176,7 +3182,9 @@ static void cq_tasklet_v2_hw(unsigned lo + ncq_tag_count = ffs(act_tmp); + } + } else { +- iptt = (complete_hdr->dw1) & CMPLT_HDR_IPTT_MSK; ++ u32 dw1 = le32_to_cpu(complete_hdr->dw1); ++ ++ iptt = dw1 & CMPLT_HDR_IPTT_MSK; + slot = &hisi_hba->slot_info[iptt]; + slot->cmplt_queue_slot = rd_point; + slot->cmplt_queue = queue; +@@ -3552,7 +3560,7 @@ static void wait_cmds_complete_timeout_v + dev_dbg(dev, "wait commands complete %dms\n", time); + } + +-struct device_attribute *host_attrs_v2_hw[] = { ++static struct device_attribute *host_attrs_v2_hw[] = { + &dev_attr_phy_event_threshold, + NULL + }; +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -628,6 +628,7 @@ static void setup_itct_v3_hw(struct hisi + struct domain_device *parent_dev = device->parent; + struct asd_sas_port *sas_port = device->port; + struct hisi_sas_port *port = to_hisi_sas_port(sas_port); ++ u64 sas_addr; + + memset(itct, 0, sizeof(*itct)); + +@@ -660,8 +661,8 @@ static void setup_itct_v3_hw(struct hisi + itct->qw0 = cpu_to_le64(qw0); + + /* qw1 */ +- memcpy(&itct->sas_addr, device->sas_addr, SAS_ADDR_SIZE); +- itct->sas_addr = __swab64(itct->sas_addr); ++ memcpy(&sas_addr, device->sas_addr, SAS_ADDR_SIZE); ++ itct->sas_addr = cpu_to_le64(__swab64(sas_addr)); + + /* qw2 */ + if (!dev_is_sata(device)) +@@ -1590,15 +1591,16 @@ slot_err_v3_hw(struct hisi_hba *hisi_hba + &complete_queue[slot->cmplt_queue_slot]; + struct hisi_sas_err_record_v3 *record = + hisi_sas_status_buf_addr_mem(slot); +- u32 dma_rx_err_type = record->dma_rx_err_type; +- u32 trans_tx_fail_type = record->trans_tx_fail_type; ++ u32 dma_rx_err_type = le32_to_cpu(record->dma_rx_err_type); ++ u32 trans_tx_fail_type = le32_to_cpu(record->trans_tx_fail_type); ++ u32 dw3 = le32_to_cpu(complete_hdr->dw3); + + switch (task->task_proto) { + case SAS_PROTOCOL_SSP: + if (dma_rx_err_type & RX_DATA_LEN_UNDERFLOW_MSK) { + ts->residual = trans_tx_fail_type; + ts->stat = SAS_DATA_UNDERRUN; +- } else if (complete_hdr->dw3 & CMPLT_HDR_IO_IN_TARGET_MSK) { ++ } else if (dw3 & CMPLT_HDR_IO_IN_TARGET_MSK) { + ts->stat = SAS_QUEUE_FULL; + slot->abort = 1; + } else { +@@ -1612,7 +1614,7 @@ slot_err_v3_hw(struct hisi_hba *hisi_hba + if (dma_rx_err_type & RX_DATA_LEN_UNDERFLOW_MSK) { + ts->residual = trans_tx_fail_type; + ts->stat = SAS_DATA_UNDERRUN; +- } else if (complete_hdr->dw3 & CMPLT_HDR_IO_IN_TARGET_MSK) { ++ } else if (dw3 & CMPLT_HDR_IO_IN_TARGET_MSK) { + ts->stat = SAS_PHY_DOWN; + slot->abort = 1; + } else { +@@ -1645,6 +1647,7 @@ slot_complete_v3_hw(struct hisi_hba *his + &complete_queue[slot->cmplt_queue_slot]; + unsigned long flags; + bool is_internal = slot->is_internal; ++ u32 dw0, dw1, dw3; + + if (unlikely(!task || !task->lldd_task || !task->dev)) + return -EINVAL; +@@ -1668,11 +1671,14 @@ slot_complete_v3_hw(struct hisi_hba *his + goto out; + } + ++ dw0 = le32_to_cpu(complete_hdr->dw0); ++ dw1 = le32_to_cpu(complete_hdr->dw1); ++ dw3 = le32_to_cpu(complete_hdr->dw3); ++ + /* + * Use SAS+TMF status codes + */ +- switch ((complete_hdr->dw0 & CMPLT_HDR_ABORT_STAT_MSK) +- >> CMPLT_HDR_ABORT_STAT_OFF) { ++ switch ((dw0 & CMPLT_HDR_ABORT_STAT_MSK) >> CMPLT_HDR_ABORT_STAT_OFF) { + case STAT_IO_ABORTED: + /* this IO has been aborted by abort command */ + ts->stat = SAS_ABORTED_TASK; +@@ -1695,7 +1701,7 @@ slot_complete_v3_hw(struct hisi_hba *his + } + + /* check for erroneous completion */ +- if ((complete_hdr->dw0 & CMPLT_HDR_CMPLT_MSK) == 0x3) { ++ if ((dw0 & CMPLT_HDR_CMPLT_MSK) == 0x3) { + u32 *error_info = hisi_sas_status_buf_addr_mem(slot); + + slot_err_v3_hw(hisi_hba, task, slot); +@@ -1704,8 +1710,7 @@ slot_complete_v3_hw(struct hisi_hba *his + "CQ hdr: 0x%x 0x%x 0x%x 0x%x " + "Error info: 0x%x 0x%x 0x%x 0x%x\n", + slot->idx, task, sas_dev->device_id, +- complete_hdr->dw0, complete_hdr->dw1, +- complete_hdr->act, complete_hdr->dw3, ++ dw0, dw1, complete_hdr->act, dw3, + error_info[0], error_info[1], + error_info[2], error_info[3]); + if (unlikely(slot->abort)) +@@ -1803,11 +1808,13 @@ static void cq_tasklet_v3_hw(unsigned lo + while (rd_point != wr_point) { + struct hisi_sas_complete_v3_hdr *complete_hdr; + struct device *dev = hisi_hba->dev; ++ u32 dw1; + int iptt; + + complete_hdr = &complete_queue[rd_point]; ++ dw1 = le32_to_cpu(complete_hdr->dw1); + +- iptt = (complete_hdr->dw1) & CMPLT_HDR_IPTT_MSK; ++ iptt = dw1 & CMPLT_HDR_IPTT_MSK; + if (likely(iptt < HISI_SAS_COMMAND_ENTRIES_V3_HW)) { + slot = &hisi_hba->slot_info[iptt]; + slot->cmplt_queue_slot = rd_point; +@@ -2203,7 +2210,7 @@ static ssize_t intr_coal_count_v3_hw_sto + } + static DEVICE_ATTR_RW(intr_coal_count_v3_hw); + +-struct device_attribute *host_attrs_v3_hw[] = { ++static struct device_attribute *host_attrs_v3_hw[] = { + &dev_attr_phy_event_threshold, + &dev_attr_intr_conv_v3_hw, + &dev_attr_intr_coal_ticks_v3_hw, +@@ -2649,7 +2656,7 @@ static int hisi_sas_v3_suspend(struct pc + struct hisi_hba *hisi_hba = sha->lldd_ha; + struct device *dev = hisi_hba->dev; + struct Scsi_Host *shost = hisi_hba->shost; +- u32 device_state; ++ pci_power_t device_state; + int rc; + + if (!pdev->pm_cap) { +@@ -2695,7 +2702,7 @@ static int hisi_sas_v3_resume(struct pci + struct Scsi_Host *shost = hisi_hba->shost; + struct device *dev = hisi_hba->dev; + unsigned int rc; +- u32 device_state = pdev->current_state; ++ pci_power_t device_state = pdev->current_state; + + dev_warn(dev, "resuming from operating state [D%d]\n", + device_state); diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0015-scsi-hisi_sas-Relocate-some-code-to-reduce-complexit.patch b/debian/patches/bugfix/arm64/huawei-taishan/0015-scsi-hisi_sas-Relocate-some-code-to-reduce-complexit.patch new file mode 100644 index 000000000..1e44aa3b8 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0015-scsi-hisi_sas-Relocate-some-code-to-reduce-complexit.patch @@ -0,0 +1,187 @@ +From 9e9903e8e143c32498565cb49a7aab6081734782 Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Thu, 6 Dec 2018 21:34:41 +0800 +Subject: [PATCH 15/31] scsi: hisi_sas: Relocate some code to reduce complexity +Origin: https://git.kernel.org/linus/6e1b731b535231e199c7810451c851398afccd33 + +Relocate the codes related to dma_map/unmap in hisi_sas_task_prep() to +reduce complexity, with a view to add DIF/DIX support. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_main.c | 146 ++++++++++++++++---------- + 1 file changed, 90 insertions(+), 56 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_main.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -297,6 +297,90 @@ static void hisi_sas_task_prep_abort(str + device_id, abort_flag, tag_to_abort); + } + ++static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba, ++ struct sas_task *task, int n_elem, ++ int n_elem_req, int n_elem_resp) ++{ ++ struct device *dev = hisi_hba->dev; ++ ++ if (!sas_protocol_ata(task->task_proto)) { ++ if (task->num_scatter) { ++ if (n_elem) ++ dma_unmap_sg(dev, task->scatter, ++ task->num_scatter, ++ task->data_dir); ++ } else if (task->task_proto & SAS_PROTOCOL_SMP) { ++ if (n_elem_req) ++ dma_unmap_sg(dev, &task->smp_task.smp_req, ++ 1, DMA_TO_DEVICE); ++ if (n_elem_resp) ++ dma_unmap_sg(dev, &task->smp_task.smp_resp, ++ 1, DMA_FROM_DEVICE); ++ } ++ } ++} ++ ++static int hisi_sas_dma_map(struct hisi_hba *hisi_hba, ++ struct sas_task *task, int *n_elem, ++ int *n_elem_req, int *n_elem_resp) ++{ ++ struct device *dev = hisi_hba->dev; ++ int rc; ++ ++ if (sas_protocol_ata(task->task_proto)) { ++ *n_elem = task->num_scatter; ++ } else { ++ unsigned int req_len, resp_len; ++ ++ if (task->num_scatter) { ++ *n_elem = dma_map_sg(dev, task->scatter, ++ task->num_scatter, task->data_dir); ++ if (!*n_elem) { ++ rc = -ENOMEM; ++ goto prep_out; ++ } ++ } else if (task->task_proto & SAS_PROTOCOL_SMP) { ++ *n_elem_req = dma_map_sg(dev, &task->smp_task.smp_req, ++ 1, DMA_TO_DEVICE); ++ if (!*n_elem_req) { ++ rc = -ENOMEM; ++ goto prep_out; ++ } ++ req_len = sg_dma_len(&task->smp_task.smp_req); ++ if (req_len & 0x3) { ++ rc = -EINVAL; ++ goto err_out_dma_unmap; ++ } ++ *n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp, ++ 1, DMA_FROM_DEVICE); ++ if (!*n_elem_resp) { ++ rc = -ENOMEM; ++ goto err_out_dma_unmap; ++ } ++ resp_len = sg_dma_len(&task->smp_task.smp_resp); ++ if (resp_len & 0x3) { ++ rc = -EINVAL; ++ goto err_out_dma_unmap; ++ } ++ } ++ } ++ ++ if (*n_elem > HISI_SAS_SGE_PAGE_CNT) { ++ dev_err(dev, "task prep: n_elem(%d) > HISI_SAS_SGE_PAGE_CNT", ++ *n_elem); ++ rc = -EINVAL; ++ goto err_out_dma_unmap; ++ } ++ return 0; ++ ++err_out_dma_unmap: ++ /* It would be better to call dma_unmap_sg() here, but it's messy */ ++ hisi_sas_dma_unmap(hisi_hba, task, *n_elem, ++ *n_elem_req, *n_elem_resp); ++prep_out: ++ return rc; ++} ++ + static int hisi_sas_task_prep(struct sas_task *task, + struct hisi_sas_dq **dq_pointer, + bool is_tmf, struct hisi_sas_tmf_task *tmf, +@@ -339,49 +423,10 @@ static int hisi_sas_task_prep(struct sas + return -ECOMM; + } + +- if (!sas_protocol_ata(task->task_proto)) { +- unsigned int req_len, resp_len; +- +- if (task->num_scatter) { +- n_elem = dma_map_sg(dev, task->scatter, +- task->num_scatter, task->data_dir); +- if (!n_elem) { +- rc = -ENOMEM; +- goto prep_out; +- } +- } else if (task->task_proto & SAS_PROTOCOL_SMP) { +- n_elem_req = dma_map_sg(dev, &task->smp_task.smp_req, +- 1, DMA_TO_DEVICE); +- if (!n_elem_req) { +- rc = -ENOMEM; +- goto prep_out; +- } +- req_len = sg_dma_len(&task->smp_task.smp_req); +- if (req_len & 0x3) { +- rc = -EINVAL; +- goto err_out_dma_unmap; +- } +- n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp, +- 1, DMA_FROM_DEVICE); +- if (!n_elem_resp) { +- rc = -ENOMEM; +- goto err_out_dma_unmap; +- } +- resp_len = sg_dma_len(&task->smp_task.smp_resp); +- if (resp_len & 0x3) { +- rc = -EINVAL; +- goto err_out_dma_unmap; +- } +- } +- } else +- n_elem = task->num_scatter; +- +- if (n_elem > HISI_SAS_SGE_PAGE_CNT) { +- dev_err(dev, "task prep: n_elem(%d) > HISI_SAS_SGE_PAGE_CNT", +- n_elem); +- rc = -EINVAL; +- goto err_out_dma_unmap; +- } ++ rc = hisi_sas_dma_map(hisi_hba, task, &n_elem, ++ &n_elem_req, &n_elem_resp); ++ if (rc < 0) ++ goto prep_out; + + if (hisi_hba->hw->slot_index_alloc) + rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device); +@@ -466,19 +511,8 @@ static int hisi_sas_task_prep(struct sas + err_out_tag: + hisi_sas_slot_index_free(hisi_hba, slot_idx); + err_out_dma_unmap: +- if (!sas_protocol_ata(task->task_proto)) { +- if (task->num_scatter) { +- dma_unmap_sg(dev, task->scatter, task->num_scatter, +- task->data_dir); +- } else if (task->task_proto & SAS_PROTOCOL_SMP) { +- if (n_elem_req) +- dma_unmap_sg(dev, &task->smp_task.smp_req, +- 1, DMA_TO_DEVICE); +- if (n_elem_resp) +- dma_unmap_sg(dev, &task->smp_task.smp_resp, +- 1, DMA_FROM_DEVICE); +- } +- } ++ hisi_sas_dma_unmap(hisi_hba, task, n_elem, ++ n_elem_req, n_elem_resp); + prep_out: + dev_err(dev, "task prep: failed[%d]!\n", rc); + return rc; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0016-scsi-hisi_sas-Make-sg_tablesize-consistent-value.patch b/debian/patches/bugfix/arm64/huawei-taishan/0016-scsi-hisi_sas-Make-sg_tablesize-consistent-value.patch new file mode 100644 index 000000000..e025687be --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0016-scsi-hisi_sas-Make-sg_tablesize-consistent-value.patch @@ -0,0 +1,82 @@ +From 8baf75dd36d8e311434162c6a2c74a45262dc0d4 Mon Sep 17 00:00:00 2001 +From: Xiang Chen <chenxiang66@hisilicon.com> +Date: Thu, 6 Dec 2018 21:34:42 +0800 +Subject: [PATCH 16/31] scsi: hisi_sas: Make sg_tablesize consistent value +Origin: https://git.kernel.org/linus/6db831f4ef764ca19d7300d56ab9455af3cb930d + +Sht->sg_tablesize is set in the driver, and it will be assigned to +shost->sg_tablesize in SCSI mid-layer. So it is not necessary to assign +shost->sg_table one more time in the driver. + +In addition to the change, change each scsi_host_template.sg_tablesize +to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL. + +Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> +Signed-off-by: John Garry <john.garry@huawei.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_main.c | 1 - + drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +- + drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +-- + 4 files changed, 3 insertions(+), 5 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_main.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -2426,7 +2426,6 @@ int hisi_sas_probe(struct platform_devic + shost->max_lun = ~0; + shost->max_channel = 1; + shost->max_cmd_len = 16; +- shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT); + if (hisi_hba->hw->slot_index_alloc) { + shost->can_queue = hisi_hba->hw->max_command_entries; + shost->cmd_per_lun = hisi_hba->hw->max_command_entries; +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +@@ -1814,7 +1814,7 @@ static struct scsi_host_template sht_v1_ + .change_queue_depth = sas_change_queue_depth, + .bios_param = sas_bios_param, + .this_id = -1, +- .sg_tablesize = SG_ALL, ++ .sg_tablesize = HISI_SAS_SGE_PAGE_CNT, + .max_sectors = SCSI_DEFAULT_MAX_SECTORS, + .use_clustering = ENABLE_CLUSTERING, + .eh_device_reset_handler = sas_eh_device_reset_handler, +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -3576,7 +3576,7 @@ static struct scsi_host_template sht_v2_ + .change_queue_depth = sas_change_queue_depth, + .bios_param = sas_bios_param, + .this_id = -1, +- .sg_tablesize = SG_ALL, ++ .sg_tablesize = HISI_SAS_SGE_PAGE_CNT, + .max_sectors = SCSI_DEFAULT_MAX_SECTORS, + .use_clustering = ENABLE_CLUSTERING, + .eh_device_reset_handler = sas_eh_device_reset_handler, +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2229,7 +2229,7 @@ static struct scsi_host_template sht_v3_ + .change_queue_depth = sas_change_queue_depth, + .bios_param = sas_bios_param, + .this_id = -1, +- .sg_tablesize = SG_ALL, ++ .sg_tablesize = HISI_SAS_SGE_PAGE_CNT, + .max_sectors = SCSI_DEFAULT_MAX_SECTORS, + .use_clustering = ENABLE_CLUSTERING, + .eh_device_reset_handler = sas_eh_device_reset_handler, +@@ -2371,7 +2371,6 @@ hisi_sas_v3_probe(struct pci_dev *pdev, + shost->max_lun = ~0; + shost->max_channel = 1; + shost->max_cmd_len = 16; +- shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT); + shost->can_queue = hisi_hba->hw->max_command_entries - + HISI_SAS_RESERVED_IPTT_CNT; + shost->cmd_per_lun = hisi_hba->hw->max_command_entries - diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0017-net-hns3-remove-unnecessary-configuration-recapture-.patch b/debian/patches/bugfix/arm64/huawei-taishan/0017-net-hns3-remove-unnecessary-configuration-recapture-.patch new file mode 100644 index 000000000..377ee58bd --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0017-net-hns3-remove-unnecessary-configuration-recapture-.patch @@ -0,0 +1,43 @@ +From 341487a9b370af5c2566fb0c3fe5384c96bdbda7 Mon Sep 17 00:00:00 2001 +From: Huazhong Tan <tanhuazhong@huawei.com> +Date: Tue, 18 Dec 2018 19:37:52 +0800 +Subject: [PATCH 17/31] net: hns3: remove unnecessary configuration recapture + while resetting +Origin: https://git.kernel.org/linus/b51c366df70da0100193d13975980f1990a2d47b + +When doing reset, it is unnecessary to get the hardware's default +configuration again, otherwise, the user's configuration will be +overwritten. + +Fixes: 4ed340ab8f49 ("net: hns3: Add reset process in hclge_main") +Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + .../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 13 ------------- + 1 file changed, 13 deletions(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -5814,19 +5814,6 @@ static int hclge_reset_ae_dev(struct hna + return ret; + } + +- ret = hclge_get_cap(hdev); +- if (ret) { +- dev_err(&pdev->dev, "get hw capability error, ret = %d.\n", +- ret); +- return ret; +- } +- +- ret = hclge_configure(hdev); +- if (ret) { +- dev_err(&pdev->dev, "Configure dev error, ret = %d.\n", ret); +- return ret; +- } +- + ret = hclge_map_tqp(hdev); + if (ret) { + dev_err(&pdev->dev, "Map tqp error, ret = %d.\n", ret); diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0018-net-hns3-remove-1000M-half-support-of-phy.patch b/debian/patches/bugfix/arm64/huawei-taishan/0018-net-hns3-remove-1000M-half-support-of-phy.patch new file mode 100644 index 000000000..e5141d719 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0018-net-hns3-remove-1000M-half-support-of-phy.patch @@ -0,0 +1,29 @@ +From 7740fe91e657e23f25e750d9e34da059a6f607ac Mon Sep 17 00:00:00 2001 +From: Fuyun Liang <liangfuyun1@huawei.com> +Date: Tue, 18 Dec 2018 19:37:55 +0800 +Subject: [PATCH 18/31] net: hns3: remove 1000M/half support of phy +Origin: https://git.kernel.org/linus/8362089d787724bb252f13f942921051943369c7 + +Our phy does not support 1000M/half, this patch removes 1000M/half from +PHY_SUPPORTED_FEATURES. + +Signed-off-by: Fuyun Liang <liangfuyun1@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +@@ -14,7 +14,7 @@ + SUPPORTED_Asym_Pause | \ + PHY_10BT_FEATURES | \ + PHY_100BT_FEATURES | \ +- PHY_1000BT_FEATURES) ++ SUPPORTED_1000baseT_Full) + + enum hclge_mdio_c22_op_seq { + HCLGE_MDIO_C22_WRITE = 1, diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0019-net-hns3-synchronize-speed-and-duplex-from-phy-when-.patch b/debian/patches/bugfix/arm64/huawei-taishan/0019-net-hns3-synchronize-speed-and-duplex-from-phy-when-.patch new file mode 100644 index 000000000..6769afdcf --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0019-net-hns3-synchronize-speed-and-duplex-from-phy-when-.patch @@ -0,0 +1,32 @@ +From 4f28c6b52ffb62eb5a0a5a85af4fa10658fecee5 Mon Sep 17 00:00:00 2001 +From: Peng Li <lipeng321@huawei.com> +Date: Tue, 18 Dec 2018 19:37:56 +0800 +Subject: [PATCH 19/31] net: hns3: synchronize speed and duplex from phy when + phy link up +Origin: https://git.kernel.org/linus/0ad5ea5dbd6cb1e62bac547db5e61bab15af4f44 + +Driver calls phy_connect_direct and registers hclge_mac_adjust_link +to synchronize mac speed and duplex from phy. It is better to +synchronize mac speed and duplex from phy when phy link up. + +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | 4 ++++ + 1 file changed, 4 insertions(+) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +@@ -181,6 +181,10 @@ static void hclge_mac_adjust_link(struct + int duplex, speed; + int ret; + ++ /* When phy link down, do nothing */ ++ if (netdev->phydev->link == 0) ++ return; ++ + speed = netdev->phydev->speed; + duplex = netdev->phydev->duplex; + diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0020-net-hns3-getting-tx-and-dv-buffer-size-through-firmw.patch b/debian/patches/bugfix/arm64/huawei-taishan/0020-net-hns3-getting-tx-and-dv-buffer-size-through-firmw.patch new file mode 100644 index 000000000..de4795be4 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0020-net-hns3-getting-tx-and-dv-buffer-size-through-firmw.patch @@ -0,0 +1,157 @@ +From caeef6247aa6f5250d14108b33cef5458ba6c58e Mon Sep 17 00:00:00 2001 +From: Yunsheng Lin <linyunsheng@huawei.com> +Date: Tue, 18 Dec 2018 19:37:57 +0800 +Subject: [PATCH 20/31] net: hns3: getting tx and dv buffer size through + firmware +Origin: https://git.kernel.org/linus/368686be234daf365ef184a6ee1c4a6c18ede3b1 + +This patch adds support of getting tx and dv buffer size through +firmware, because different version of hardware requires different +size of tx and dv buffer. + +This patch also add dv_buf_size to tc' private buffer size even if +pfc is not enable for the tc. + +Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + .../hisilicon/hns3/hns3pf/hclge_cmd.h | 5 ++- + .../hisilicon/hns3/hns3pf/hclge_main.c | 41 ++++++++++++++----- + .../hisilicon/hns3/hns3pf/hclge_main.h | 3 ++ + 3 files changed, 38 insertions(+), 11 deletions(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +@@ -365,7 +365,9 @@ struct hclge_pf_res_cmd { + #define HCLGE_PF_VEC_NUM_M GENMASK(7, 0) + __le16 pf_intr_vector_number; + __le16 pf_own_fun_number; +- __le32 rsv[3]; ++ __le16 tx_buf_size; ++ __le16 dv_buf_size; ++ __le32 rsv[2]; + }; + + #define HCLGE_CFG_OFFSET_S 0 +@@ -791,6 +793,7 @@ struct hclge_serdes_lb_cmd { + #define HCLGE_TOTAL_PKT_BUF 0x108000 /* 1.03125M bytes */ + #define HCLGE_DEFAULT_DV 0xA000 /* 40k byte */ + #define HCLGE_DEFAULT_NON_DCB_DV 0x7800 /* 30K byte */ ++#define HCLGE_NON_DCB_ADDITIONAL_BUF 0x200 /* 512 byte */ + + #define HCLGE_TYPE_CRQ 0 + #define HCLGE_TYPE_CSQ 1 +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -931,6 +931,18 @@ static int hclge_query_pf_resource(struc + hdev->num_tqps = __le16_to_cpu(req->tqp_num); + hdev->pkt_buf_size = __le16_to_cpu(req->buf_size) << HCLGE_BUF_UNIT_S; + ++ if (req->tx_buf_size) ++ hdev->tx_buf_size = ++ __le16_to_cpu(req->tx_buf_size) << HCLGE_BUF_UNIT_S; ++ else ++ hdev->tx_buf_size = HCLGE_DEFAULT_TX_BUF; ++ ++ if (req->dv_buf_size) ++ hdev->dv_buf_size = ++ __le16_to_cpu(req->dv_buf_size) << HCLGE_BUF_UNIT_S; ++ else ++ hdev->dv_buf_size = HCLGE_DEFAULT_DV; ++ + if (hnae3_dev_roce_supported(hdev)) { + hdev->roce_base_msix_offset = + hnae3_get_field(__le16_to_cpu(req->msixcap_localid_ba_rocee), +@@ -1591,9 +1603,10 @@ static bool hclge_is_rx_buf_ok(struct h + pfc_enable_num = hclge_get_pfc_enalbe_num(hdev); + + if (hnae3_dev_dcb_supported(hdev)) +- shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_DV; ++ shared_buf_min = 2 * hdev->mps + hdev->dv_buf_size; + else +- shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_NON_DCB_DV; ++ shared_buf_min = hdev->mps + HCLGE_NON_DCB_ADDITIONAL_BUF ++ + hdev->dv_buf_size; + + shared_buf_tc = pfc_enable_num * hdev->mps + + (tc_num - pfc_enable_num) * hdev->mps / 2 + +@@ -1606,8 +1619,15 @@ static bool hclge_is_rx_buf_ok(struct h + + shared_buf = rx_all - rx_priv; + buf_alloc->s_buf.buf_size = shared_buf; +- buf_alloc->s_buf.self.high = shared_buf; +- buf_alloc->s_buf.self.low = 2 * hdev->mps; ++ if (hnae3_dev_dcb_supported(hdev)) { ++ buf_alloc->s_buf.self.high = shared_buf - hdev->dv_buf_size; ++ buf_alloc->s_buf.self.low = buf_alloc->s_buf.self.high ++ - hdev->mps / 2; ++ } else { ++ buf_alloc->s_buf.self.high = hdev->mps + ++ HCLGE_NON_DCB_ADDITIONAL_BUF; ++ buf_alloc->s_buf.self.low = hdev->mps / 2; ++ } + + for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { + if ((hdev->hw_tc_map & BIT(i)) && +@@ -1634,11 +1654,11 @@ static int hclge_tx_buffer_calc(struct h + for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { + struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i]; + +- if (total_size < HCLGE_DEFAULT_TX_BUF) ++ if (total_size < hdev->tx_buf_size) + return -ENOMEM; + + if (hdev->hw_tc_map & BIT(i)) +- priv->tx_buf_size = HCLGE_DEFAULT_TX_BUF; ++ priv->tx_buf_size = hdev->tx_buf_size; + else + priv->tx_buf_size = 0; + +@@ -1684,11 +1704,12 @@ static int hclge_rx_buffer_calc(struct h + priv->wl.low = aligned_mps; + priv->wl.high = priv->wl.low + aligned_mps; + priv->buf_size = priv->wl.high + +- HCLGE_DEFAULT_DV; ++ hdev->dv_buf_size; + } else { + priv->wl.low = 0; + priv->wl.high = 2 * aligned_mps; +- priv->buf_size = priv->wl.high; ++ priv->buf_size = priv->wl.high + ++ hdev->dv_buf_size; + } + } else { + priv->enable = 0; +@@ -1720,11 +1741,11 @@ static int hclge_rx_buffer_calc(struct h + if (hdev->tm_info.hw_pfc_map & BIT(i)) { + priv->wl.low = 128; + priv->wl.high = priv->wl.low + aligned_mps; +- priv->buf_size = priv->wl.high + HCLGE_DEFAULT_DV; ++ priv->buf_size = priv->wl.high + hdev->dv_buf_size; + } else { + priv->wl.low = 0; + priv->wl.high = aligned_mps; +- priv->buf_size = priv->wl.high; ++ priv->buf_size = priv->wl.high + hdev->dv_buf_size; + } + } + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +@@ -545,6 +545,9 @@ struct hclge_dev { + u32 flag; + + u32 pkt_buf_size; /* Total pf buf size for tx/rx */ ++ u32 tx_buf_size; /* Tx buffer size for each TC */ ++ u32 dv_buf_size; /* Dv buffer size for each TC */ ++ + u32 mps; /* Max packet size */ + + enum hclge_mta_dmac_sel_type mta_mac_sel_type; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0021-net-hns3-aligning-buffer-size-in-SSU-to-256-bytes.patch b/debian/patches/bugfix/arm64/huawei-taishan/0021-net-hns3-aligning-buffer-size-in-SSU-to-256-bytes.patch new file mode 100644 index 000000000..e5c403de9 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0021-net-hns3-aligning-buffer-size-in-SSU-to-256-bytes.patch @@ -0,0 +1,144 @@ +From 234c314e892d40daa37e97e9057e04d3e3a0c285 Mon Sep 17 00:00:00 2001 +From: Yunsheng Lin <linyunsheng@huawei.com> +Date: Tue, 18 Dec 2018 19:37:58 +0800 +Subject: [PATCH 21/31] net: hns3: aligning buffer size in SSU to 256 bytes +Origin: https://git.kernel.org/linus/b9a400ac295728b2d47445e09814e1880409b311 + +The hardware expects the buffer size set to SSU is aligned to +256 bytes, this patch aligns the buffer size to 256 byte using +roundup or rounddown function. + +Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + .../hisilicon/hns3/hns3pf/hclge_main.c | 45 ++++++++++++------- + 1 file changed, 28 insertions(+), 17 deletions(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -31,6 +31,10 @@ static int hclge_set_mta_filter_mode(str + enum hclge_mta_dmac_sel_type mta_mac_sel, + bool enable); + static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu); ++ ++#define HCLGE_BUF_SIZE_UNIT 256 ++ ++static int hclge_set_mac_mtu(struct hclge_dev *hdev, int new_mps); + static int hclge_init_vlan_config(struct hclge_dev *hdev); + static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev); + +@@ -937,12 +941,16 @@ static int hclge_query_pf_resource(struc + else + hdev->tx_buf_size = HCLGE_DEFAULT_TX_BUF; + ++ hdev->tx_buf_size = roundup(hdev->tx_buf_size, HCLGE_BUF_SIZE_UNIT); ++ + if (req->dv_buf_size) + hdev->dv_buf_size = + __le16_to_cpu(req->dv_buf_size) << HCLGE_BUF_UNIT_S; + else + hdev->dv_buf_size = HCLGE_DEFAULT_DV; + ++ hdev->dv_buf_size = roundup(hdev->dv_buf_size, HCLGE_BUF_SIZE_UNIT); ++ + if (hnae3_dev_roce_supported(hdev)) { + hdev->roce_base_msix_offset = + hnae3_get_field(__le16_to_cpu(req->msixcap_localid_ba_rocee), +@@ -1595,48 +1603,50 @@ static bool hclge_is_rx_buf_ok(struct h + { + u32 shared_buf_min, shared_buf_tc, shared_std; + int tc_num, pfc_enable_num; +- u32 shared_buf; ++ u32 shared_buf, aligned_mps; + u32 rx_priv; + int i; + + tc_num = hclge_get_tc_num(hdev); + pfc_enable_num = hclge_get_pfc_enalbe_num(hdev); ++ aligned_mps = roundup(hdev->mps, HCLGE_BUF_SIZE_UNIT); + + if (hnae3_dev_dcb_supported(hdev)) +- shared_buf_min = 2 * hdev->mps + hdev->dv_buf_size; ++ shared_buf_min = 2 * aligned_mps + hdev->dv_buf_size; + else +- shared_buf_min = hdev->mps + HCLGE_NON_DCB_ADDITIONAL_BUF ++ shared_buf_min = aligned_mps + HCLGE_NON_DCB_ADDITIONAL_BUF + + hdev->dv_buf_size; + +- shared_buf_tc = pfc_enable_num * hdev->mps + +- (tc_num - pfc_enable_num) * hdev->mps / 2 + +- hdev->mps; ++ shared_buf_tc = pfc_enable_num * aligned_mps + ++ (tc_num - pfc_enable_num) * aligned_mps / 2 + ++ aligned_mps; + shared_std = max_t(u32, shared_buf_min, shared_buf_tc); + + rx_priv = hclge_get_rx_priv_buff_alloced(buf_alloc); + if (rx_all <= rx_priv + shared_std) + return false; + +- shared_buf = rx_all - rx_priv; ++ shared_buf = rounddown(rx_all - rx_priv, HCLGE_BUF_SIZE_UNIT); + buf_alloc->s_buf.buf_size = shared_buf; + if (hnae3_dev_dcb_supported(hdev)) { + buf_alloc->s_buf.self.high = shared_buf - hdev->dv_buf_size; + buf_alloc->s_buf.self.low = buf_alloc->s_buf.self.high +- - hdev->mps / 2; ++ - roundup(aligned_mps / 2, HCLGE_BUF_SIZE_UNIT); + } else { +- buf_alloc->s_buf.self.high = hdev->mps + ++ buf_alloc->s_buf.self.high = aligned_mps + + HCLGE_NON_DCB_ADDITIONAL_BUF; +- buf_alloc->s_buf.self.low = hdev->mps / 2; ++ buf_alloc->s_buf.self.low = ++ roundup(aligned_mps / 2, HCLGE_BUF_SIZE_UNIT); + } + + for (i = 0; i < HCLGE_MAX_TC_NUM; i++) { + if ((hdev->hw_tc_map & BIT(i)) && + (hdev->tm_info.hw_pfc_map & BIT(i))) { +- buf_alloc->s_buf.tc_thrd[i].low = hdev->mps; +- buf_alloc->s_buf.tc_thrd[i].high = 2 * hdev->mps; ++ buf_alloc->s_buf.tc_thrd[i].low = aligned_mps; ++ buf_alloc->s_buf.tc_thrd[i].high = 2 * aligned_mps; + } else { + buf_alloc->s_buf.tc_thrd[i].low = 0; +- buf_alloc->s_buf.tc_thrd[i].high = hdev->mps; ++ buf_alloc->s_buf.tc_thrd[i].high = aligned_mps; + } + } + +@@ -1676,7 +1686,6 @@ static int hclge_tx_buffer_calc(struct h + static int hclge_rx_buffer_calc(struct hclge_dev *hdev, + struct hclge_pkt_buf_alloc *buf_alloc) + { +-#define HCLGE_BUF_SIZE_UNIT 128 + u32 rx_all = hdev->pkt_buf_size, aligned_mps; + int no_pfc_priv_num, pfc_priv_num; + struct hclge_priv_buf *priv; +@@ -1702,9 +1711,11 @@ static int hclge_rx_buffer_calc(struct h + priv->enable = 1; + if (hdev->tm_info.hw_pfc_map & BIT(i)) { + priv->wl.low = aligned_mps; +- priv->wl.high = priv->wl.low + aligned_mps; ++ priv->wl.high = ++ roundup(priv->wl.low + aligned_mps, ++ HCLGE_BUF_SIZE_UNIT); + priv->buf_size = priv->wl.high + +- hdev->dv_buf_size; ++ hdev->dv_buf_size; + } else { + priv->wl.low = 0; + priv->wl.high = 2 * aligned_mps; +@@ -1739,7 +1750,7 @@ static int hclge_rx_buffer_calc(struct h + priv->enable = 1; + + if (hdev->tm_info.hw_pfc_map & BIT(i)) { +- priv->wl.low = 128; ++ priv->wl.low = 256; + priv->wl.high = priv->wl.low + aligned_mps; + priv->buf_size = priv->wl.high + hdev->dv_buf_size; + } else { diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0022-net-hns3-fix-a-SSU-buffer-checking-bug.patch b/debian/patches/bugfix/arm64/huawei-taishan/0022-net-hns3-fix-a-SSU-buffer-checking-bug.patch new file mode 100644 index 000000000..26cee78ea --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0022-net-hns3-fix-a-SSU-buffer-checking-bug.patch @@ -0,0 +1,45 @@ +From 4d887b7901d59b472df97bd8a2f8bdeb43be7ced Mon Sep 17 00:00:00 2001 +From: Yunsheng Lin <linyunsheng@huawei.com> +Date: Tue, 18 Dec 2018 19:37:59 +0800 +Subject: [PATCH 22/31] net: hns3: fix a SSU buffer checking bug +Origin: https://git.kernel.org/linus/af854724e51e4047f534ac6d19b3ef9fb3c35c49 + +When caculating the SSU buffer, it first allocate tx and +rx private buffer, then the remaining buffer is for rx +shared buffer. The remaining buffer size should be at +least bigger than or equal to the shared_std, which is the +minimum shared buffer size required by the driver, but +currently if the remaining buffer size is equal to the +shared_std, it returns failure, which causes SSU buffer +allocation failure problem. + +This patch fixes this problem by rounding up shared_std before +checking the the remaining buffer size bigger than or equal to +the shared_std. + +Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support") +Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -1620,10 +1620,11 @@ static bool hclge_is_rx_buf_ok(struct h + shared_buf_tc = pfc_enable_num * aligned_mps + + (tc_num - pfc_enable_num) * aligned_mps / 2 + + aligned_mps; +- shared_std = max_t(u32, shared_buf_min, shared_buf_tc); ++ shared_std = roundup(max_t(u32, shared_buf_min, shared_buf_tc), ++ HCLGE_BUF_SIZE_UNIT); + + rx_priv = hclge_get_rx_priv_buff_alloced(buf_alloc); +- if (rx_all <= rx_priv + shared_std) ++ if (rx_all < rx_priv + shared_std) + return false; + + shared_buf = rounddown(rx_all - rx_priv, HCLGE_BUF_SIZE_UNIT); diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0023-net-hns3-change-default-tc-state-to-close.patch b/debian/patches/bugfix/arm64/huawei-taishan/0023-net-hns3-change-default-tc-state-to-close.patch new file mode 100644 index 000000000..ad8ccd77f --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0023-net-hns3-change-default-tc-state-to-close.patch @@ -0,0 +1,30 @@ +From ea3eff7a2ef69730c8e48715fbf965cb9da8b0bc Mon Sep 17 00:00:00 2001 +From: Jian Shen <shenjian15@huawei.com> +Date: Thu, 20 Dec 2018 11:51:59 +0800 +Subject: [PATCH 23/31] net: hns3: change default tc state to close +Origin: https://git.kernel.org/linus/a298797532d9dc244abf349d7c2ed063732c6ba3 + +In original codes, default tc value is set to the max tc. It's more +reasonable to close tc by changing default tc value to 1. Users can +enable it with lldp tool when they want to use tc. + +Signed-off-by: Jian Shen <shenjian15@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -1200,7 +1200,7 @@ static int hclge_configure(struct hclge_ + hdev->pfc_max = hdev->tc_max; + } + +- hdev->tm_info.num_tc = hdev->tc_max; ++ hdev->tm_info.num_tc = 1; + + /* Currently not support uncontiuous tc */ + for (i = 0; i < hdev->tm_info.num_tc; i++) diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0024-net-hns3-fix-a-bug-caused-by-udelay.patch b/debian/patches/bugfix/arm64/huawei-taishan/0024-net-hns3-fix-a-bug-caused-by-udelay.patch new file mode 100644 index 000000000..b3c3464ca --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0024-net-hns3-fix-a-bug-caused-by-udelay.patch @@ -0,0 +1,39 @@ +From 0f27af14383edac1efaf140d7cbe2d7dfdab7318 Mon Sep 17 00:00:00 2001 +From: Peng Li <lipeng321@huawei.com> +Date: Thu, 20 Dec 2018 11:52:00 +0800 +Subject: [PATCH 24/31] net: hns3: fix a bug caused by udelay +Origin: https://git.kernel.org/linus/1b7d7b0581173219b82abbd81c88cf8aa7d402c2 + +udelay() in driver may always occupancy processor. If there is only +one cpu in system, the VF driver may initialize fail when insmod +PF and VF driver in the same system. This patch use msleep() to free +cpu when VF wait PF message. + +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c +@@ -26,7 +26,7 @@ static int hclgevf_get_mbx_resp(struct h + u8 *resp_data, u16 resp_len) + { + #define HCLGEVF_MAX_TRY_TIMES 500 +-#define HCLGEVF_SLEEP_USCOEND 1000 ++#define HCLGEVF_SLEEP_USECOND 1000 + struct hclgevf_mbx_resp_status *mbx_resp; + u16 r_code0, r_code1; + int i = 0; +@@ -40,7 +40,7 @@ static int hclgevf_get_mbx_resp(struct h + } + + while ((!hdev->mbx_resp.received_resp) && (i < HCLGEVF_MAX_TRY_TIMES)) { +- udelay(HCLGEVF_SLEEP_USCOEND); ++ usleep_range(HCLGEVF_SLEEP_USECOND, HCLGEVF_SLEEP_USECOND * 2); + i++; + } + diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0025-net-hns3-remove-redundant-variable-initialization.patch b/debian/patches/bugfix/arm64/huawei-taishan/0025-net-hns3-remove-redundant-variable-initialization.patch new file mode 100644 index 000000000..2dcf9f2ef --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0025-net-hns3-remove-redundant-variable-initialization.patch @@ -0,0 +1,28 @@ +From 883a7a53d7f6a6494e3a0df73fb02f76ecc42bc1 Mon Sep 17 00:00:00 2001 +From: Peng Li <lipeng321@huawei.com> +Date: Thu, 20 Dec 2018 11:52:06 +0800 +Subject: [PATCH 25/31] net: hns3: remove redundant variable initialization +Origin: https://git.kernel.org/linus/1154bb26c879fea51c20aee167ddce4345caa255 + +This patch removes the redundant variable initialization, +as driver will devm_kzalloc to set value to hdev soon. + +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +@@ -1360,7 +1360,7 @@ static int hclgevf_configure(struct hclg + static int hclgevf_alloc_hdev(struct hnae3_ae_dev *ae_dev) + { + struct pci_dev *pdev = ae_dev->pdev; +- struct hclgevf_dev *hdev = ae_dev->priv; ++ struct hclgevf_dev *hdev; + + hdev = devm_kzalloc(&pdev->dev, sizeof(*hdev), GFP_KERNEL); + if (!hdev) diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0026-net-hns3-call-hns3_nic_net_open-while-doing-HNAE3_UP.patch b/debian/patches/bugfix/arm64/huawei-taishan/0026-net-hns3-call-hns3_nic_net_open-while-doing-HNAE3_UP.patch new file mode 100644 index 000000000..9eddea483 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0026-net-hns3-call-hns3_nic_net_open-while-doing-HNAE3_UP.patch @@ -0,0 +1,46 @@ +From a4e5945057386872cb9add271aea76ca2413f481 Mon Sep 17 00:00:00 2001 +From: Huazhong Tan <tanhuazhong@huawei.com> +Date: Mon, 31 Dec 2018 10:58:29 +0800 +Subject: [PATCH 26/31] net: hns3: call hns3_nic_net_open() while doing + HNAE3_UP_CLIENT +Origin: https://git.kernel.org/linus/e888402789b9db5de4fcda361331d66dbf0cd9fd + +For HNAE3_DOWN_CLIENT calling hns3_nic_net_stop(), HNAE3_UP_CLIENT +should call hns3_nic_net_open(), since if the number of queue or +the map of TC has is changed before HHAE3_UP_CLIENT is called, +it will cause problem. + +Also the HNS3_NIC_STATE_RESETTING flag needs to be cleared before +hns3_nic_net_open() called, and set it back while hns3_nic_net_open() +failed. + +Fixes: bb6b94a896d4 ("net: hns3: Add reset interface implementation in client") +Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> +Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> +Signed-off-by: Peng Li <lipeng321@huawei.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +Index: linux/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +=================================================================== +--- linux.orig/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ linux/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -3439,11 +3439,15 @@ static int hns3_reset_notify_down_enet(s + static int hns3_reset_notify_up_enet(struct hnae3_handle *handle) + { + struct hnae3_knic_private_info *kinfo = &handle->kinfo; ++ struct hns3_nic_priv *priv = netdev_priv(kinfo->netdev); + int ret = 0; + ++ clear_bit(HNS3_NIC_STATE_RESETTING, &priv->state); ++ + if (netif_running(kinfo->netdev)) { +- ret = hns3_nic_net_up(kinfo->netdev); ++ ret = hns3_nic_net_open(kinfo->netdev); + if (ret) { ++ set_bit(HNS3_NIC_STATE_RESETTING, &priv->state); + netdev_err(kinfo->netdev, + "hns net up fail, ret=%d!\n", ret); + return ret; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0029-RDMA-hns-Add-constraint-on-the-setting-of-local-ACK-.patch b/debian/patches/bugfix/arm64/huawei-taishan/0029-RDMA-hns-Add-constraint-on-the-setting-of-local-ACK-.patch new file mode 100644 index 000000000..48e2022bd --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0029-RDMA-hns-Add-constraint-on-the-setting-of-local-ACK-.patch @@ -0,0 +1,43 @@ +From 84193e72c505286e4681b3c566c64eea3e25f7fd Mon Sep 17 00:00:00 2001 +From: Lijun Ou <oulijun@huawei.com> +Date: Wed, 12 Dec 2018 17:49:08 +0800 +Subject: [PATCH 29/31] RDMA/hns: Add constraint on the setting of local ACK + timeout +Origin: https://git.kernel.org/linus/44754b95dd35ee07c462b5425ae9c4cde8c7e7c8 + +According to IB protocol, local ACK timeout shall be a 5 bit +value. Currently, hip08 could not support the possible max value 31. Fail +the request in this case. + +Signed-off-by: Yixian Liu <liuyixian@huawei.com> +Signed-off-by: Lijun Ou <oulijun@huawei.com> +Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> +--- + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +Index: linux/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +=================================================================== +--- linux.orig/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ linux/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -3398,10 +3398,16 @@ static int modify_qp_rtr_to_rts(struct i + V2_QPC_BYTE_212_LSN_S, 0); + + if (attr_mask & IB_QP_TIMEOUT) { +- roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_AT_M, +- V2_QPC_BYTE_28_AT_S, attr->timeout); +- roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_AT_M, +- V2_QPC_BYTE_28_AT_S, 0); ++ if (attr->timeout < 31) { ++ roce_set_field(context->byte_28_at_fl, ++ V2_QPC_BYTE_28_AT_M, V2_QPC_BYTE_28_AT_S, ++ attr->timeout); ++ roce_set_field(qpc_mask->byte_28_at_fl, ++ V2_QPC_BYTE_28_AT_M, V2_QPC_BYTE_28_AT_S, ++ 0); ++ } else { ++ dev_warn(dev, "Local ACK timeout shall be 0 to 30.\n"); ++ } + } + + roce_set_field(context->byte_172_sq_psn, V2_QPC_BYTE_172_SQ_CUR_PSN_M, diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0030-RDMA-hns-Modify-the-pbl-ba-page-size-for-hip08.patch b/debian/patches/bugfix/arm64/huawei-taishan/0030-RDMA-hns-Modify-the-pbl-ba-page-size-for-hip08.patch new file mode 100644 index 000000000..612b481ff --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0030-RDMA-hns-Modify-the-pbl-ba-page-size-for-hip08.patch @@ -0,0 +1,28 @@ +From 454bc02382f8ed2eb3ebc7db4867ed419e3f0241 Mon Sep 17 00:00:00 2001 +From: Lijun Ou <oulijun@huawei.com> +Date: Wed, 12 Dec 2018 17:49:09 +0800 +Subject: [PATCH 30/31] RDMA/hns: Modify the pbl ba page size for hip08 +Origin: https://git.kernel.org/linus/91fb4d83b88a7b544ce564c44167aad29d4154f0 + +Modify the pbl ba page size to 16K for in order to support 4G MR size. + +Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com> +Signed-off-by: Lijun Ou <oulijun@huawei.com> +Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> +--- + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +=================================================================== +--- linux.orig/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ linux/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -1235,7 +1235,7 @@ static int hns_roce_v2_profile(struct hn + caps->mpt_ba_pg_sz = 0; + caps->mpt_buf_pg_sz = 0; + caps->mpt_hop_num = HNS_ROCE_CONTEXT_HOP_NUM; +- caps->pbl_ba_pg_sz = 0; ++ caps->pbl_ba_pg_sz = 2; + caps->pbl_buf_pg_sz = 0; + caps->pbl_hop_num = HNS_ROCE_PBL_HOP_NUM; + caps->mtt_ba_pg_sz = 0; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0031-RDMA-hns-RDMA-hns-Assign-rq-head-pointer-when-enable.patch b/debian/patches/bugfix/arm64/huawei-taishan/0031-RDMA-hns-RDMA-hns-Assign-rq-head-pointer-when-enable.patch new file mode 100644 index 000000000..4f9e5f6be --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0031-RDMA-hns-RDMA-hns-Assign-rq-head-pointer-when-enable.patch @@ -0,0 +1,63 @@ +From 07a7830061e657ce352e690dbe0a794ffb10d22e Mon Sep 17 00:00:00 2001 +From: Lijun Ou <oulijun@huawei.com> +Date: Sat, 12 Jan 2019 18:36:29 +0800 +Subject: [PATCH 31/31] RDMA/hns: RDMA/hns: Assign rq head pointer when enable + rq record db +Origin: https://git.kernel.org/linus/de77503a59403e7045c18c6bb0a10c245a99b648 + +When flush cqe, it needs to get the pointer of rq and sq from db address +space of user and update it into qp context by modified qp. if rq does not +exist, it will not get the value from db address space of user. + +Signed-off-by: Lijun Ou <oulijun@huawei.com> +Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> +--- + drivers/infiniband/hw/hns/hns_roce_qp.c | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +Index: linux/drivers/infiniband/hw/hns/hns_roce_qp.c +=================================================================== +--- linux.orig/drivers/infiniband/hw/hns/hns_roce_qp.c ++++ linux/drivers/infiniband/hw/hns/hns_roce_qp.c +@@ -652,6 +652,10 @@ static int hns_roce_create_qp_common(str + dev_err(dev, "rq record doorbell map failed!\n"); + goto err_sq_dbmap; + } ++ ++ /* indicate kernel supports rq record db */ ++ resp.cap_flags |= HNS_ROCE_SUPPORT_RQ_RECORD_DB; ++ hr_qp->rdb_en = 1; + } + } else { + if (init_attr->create_flags & +@@ -760,16 +764,11 @@ static int hns_roce_create_qp_common(str + else + hr_qp->doorbell_qpn = cpu_to_le64(hr_qp->qpn); + +- if (ib_pd->uobject && (udata->outlen >= sizeof(resp)) && +- (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)) { +- +- /* indicate kernel supports rq record db */ +- resp.cap_flags |= HNS_ROCE_SUPPORT_RQ_RECORD_DB; +- ret = ib_copy_to_udata(udata, &resp, sizeof(resp)); ++ if (udata) { ++ ret = ib_copy_to_udata(udata, &resp, ++ min(udata->outlen, sizeof(resp))); + if (ret) + goto err_qp; +- +- hr_qp->rdb_en = 1; + } + hr_qp->event = hns_roce_ib_qp_event; + +@@ -946,7 +945,9 @@ int hns_roce_modify_qp(struct ib_qp *ibq + (attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) { + if (hr_qp->sdb_en == 1) { + hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr); +- hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); ++ ++ if (hr_qp->rdb_en == 1) ++ hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); + } else { + dev_warn(dev, "flush cqe is not supported in userspace!\n"); + goto out; diff --git a/debian/patches/bugfix/arm64/huawei-taishan/0033-scsi-hisi_sas-fix-calls-to-dma_set_mask_and_coherent.patch b/debian/patches/bugfix/arm64/huawei-taishan/0033-scsi-hisi_sas-fix-calls-to-dma_set_mask_and_coherent.patch new file mode 100644 index 000000000..68374aee8 --- /dev/null +++ b/debian/patches/bugfix/arm64/huawei-taishan/0033-scsi-hisi_sas-fix-calls-to-dma_set_mask_and_coherent.patch @@ -0,0 +1,70 @@ +From badecc38102204f5297ad6ce1d7c7875e514c6f7 Mon Sep 17 00:00:00 2001 +From: Hannes Reinecke <hare@suse.de> +Date: Mon, 18 Feb 2019 08:34:25 +0100 +Subject: [PATCH] scsi: hisi_sas: fix calls to dma_set_mask_and_coherent() +Origin: https://git.kernel.org/linus/d9a00459effc30f6de2cdd887b64f15c6c54ae71 + +The change to use dma_set_mask_and_coherent() incorrectly made a second +call with the 32 bit DMA mask value when the call with the 64 bit DMA +mask value succeeded. + +[mkp: fixed commit message] + +Fixes: e4db40e7a1a2 ("scsi: hisi_sas: use dma_set_mask_and_coherent") +Cc: <stable@vger.kernel.org> +Suggested-by: Ewan D. Milne <emilne@redhat.com> +Signed-off-by: Hannes Reinecke <hare@suse.com> +Reviewed-by: Christoph Hellwig <hch@lst.de> +Signed-off-by: Hannes Reinecke <hare@suse.com> +Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> +--- + drivers/scsi/hisi_sas/hisi_sas_main.c | 8 ++++++-- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 8 +++++--- + 2 files changed, 11 insertions(+), 5 deletions(-) + +Index: linux/drivers/scsi/hisi_sas/hisi_sas_main.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -2339,6 +2339,7 @@ static struct Scsi_Host *hisi_sas_shost_ + struct Scsi_Host *shost; + struct hisi_hba *hisi_hba; + struct device *dev = &pdev->dev; ++ int error; + + shost = scsi_host_alloc(hw->sht, sizeof(*hisi_hba)); + if (!shost) { +@@ -2359,8 +2360,11 @@ static struct Scsi_Host *hisi_sas_shost_ + if (hisi_sas_get_fw_info(hisi_hba) < 0) + goto err_out; + +- if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)) && +- dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))) { ++ error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); ++ if (error) ++ error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); ++ ++ if (error) { + dev_err(dev, "No usable DMA addressing method\n"); + goto err_out; + } +Index: linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +=================================================================== +--- linux.orig/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ linux/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -2328,10 +2328,12 @@ hisi_sas_v3_probe(struct pci_dev *pdev, + if (rc) + goto err_out_disable_device; + +- if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) || +- dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) { ++ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); ++ if (rc) ++ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); ++ if (rc) { + dev_err(dev, "No usable DMA addressing method\n"); +- rc = -EIO; ++ rc = -ENODEV; + goto err_out_regions; + } + diff --git a/debian/patches/bugfix/mips/MIPS-Loongson-Introduce-and-use-loongson_llsc_mb.patch b/debian/patches/bugfix/mips/MIPS-Loongson-Introduce-and-use-loongson_llsc_mb.patch new file mode 100644 index 000000000..b45fc948b --- /dev/null +++ b/debian/patches/bugfix/mips/MIPS-Loongson-Introduce-and-use-loongson_llsc_mb.patch @@ -0,0 +1,387 @@ +From: Huacai Chen <chenhc@lemote.com> +Date: Tue, 15 Jan 2019 16:04:54 +0800 +Subject: MIPS: Loongson: Introduce and use loongson_llsc_mb() +Origin: https://git.kernel.org/linus/e02e07e3127d8aec1f4bcdfb2fc52a2d99b4859e + +On the Loongson-2G/2H/3A/3B there is a hardware flaw that ll/sc and +lld/scd is very weak ordering. We should add sync instructions "before +each ll/lld" and "at the branch-target between ll/sc" to workaround. +Otherwise, this flaw will cause deadlock occasionally (e.g. when doing +heavy load test with LTP). + +Below is the explaination of CPU designer: + +"For Loongson 3 family, when a memory access instruction (load, store, +or prefetch)'s executing occurs between the execution of LL and SC, the +success or failure of SC is not predictable. Although programmer would +not insert memory access instructions between LL and SC, the memory +instructions before LL in program-order, may dynamically executed +between the execution of LL/SC, so a memory fence (SYNC) is needed +before LL/LLD to avoid this situation. + +Since Loongson-3A R2 (3A2000), we have improved our hardware design to +handle this case. But we later deduce a rarely circumstance that some +speculatively executed memory instructions due to branch misprediction +between LL/SC still fall into the above case, so a memory fence (SYNC) +at branch-target (if its target is not between LL/SC) is needed for +Loongson 3A1000, 3B1500, 3A2000 and 3A3000. + +Our processor is continually evolving and we aim to to remove all these +workaround-SYNCs around LL/SC for new-come processor." + +Here is an example: + +Both cpu1 and cpu2 simutaneously run atomic_add by 1 on same atomic var, +this bug cause both 'sc' run by two cpus (in atomic_add) succeed at same +time('sc' return 1), and the variable is only *added by 1*, sometimes, +which is wrong and unacceptable(it should be added by 2). + +Why disable fix-loongson3-llsc in compiler? +Because compiler fix will cause problems in kernel's __ex_table section. + +This patch fix all the cases in kernel, but: + ++. the fix at the end of futex_atomic_cmpxchg_inatomic is for branch-target +of 'bne', there other cases which smp_mb__before_llsc() and smp_llsc_mb() fix +the ll and branch-target coincidently such as atomic_sub_if_positive/ +cmpxchg/xchg, just like this one. + ++. Loongson 3 does support CONFIG_EDAC_ATOMIC_SCRUB, so no need to touch +edac.h + ++. local_ops and cmpxchg_local should not be affected by this bug since +only the owner can write. + ++. mips_atomic_set for syscall.c is deprecated and rarely used, just let +it go + +Signed-off-by: Huacai Chen <chenhc@lemote.com> +Signed-off-by: Huang Pei <huangpei@loongson.cn> +[paul.burton@mips.com: + - Simplify the addition of -mno-fix-loongson3-llsc to cflags, and add + a comment describing why it's there. + - Make loongson_llsc_mb() a no-op when + CONFIG_CPU_LOONGSON3_WORKAROUNDS=n, rather than a compiler memory + barrier. + - Add a comment describing the bug & how loongson_llsc_mb() helps + in asm/barrier.h.] +Signed-off-by: Paul Burton <paul.burton@mips.com> +Cc: Ralf Baechle <ralf@linux-mips.org> +Cc: ambrosehua@gmail.com +Cc: Steven J . Hill <Steven.Hill@cavium.com> +Cc: linux-mips@linux-mips.org +Cc: Fuxin Zhang <zhangfx@lemote.com> +Cc: Zhangjin Wu <wuzhangjin@gmail.com> +Cc: Li Xuefeng <lixuefeng@loongson.cn> +Cc: Xu Chenghua <xuchenghua@loongson.cn> +--- + arch/mips/Kconfig | 15 +++++++++++++++ + arch/mips/include/asm/atomic.h | 6 ++++++ + arch/mips/include/asm/barrier.h | 36 ++++++++++++++++++++++++++++++++++++ + arch/mips/include/asm/bitops.h | 5 +++++ + arch/mips/include/asm/futex.h | 3 +++ + arch/mips/include/asm/pgtable.h | 2 ++ + arch/mips/loongson64/Platform | 23 +++++++++++++++++++++++ + arch/mips/mm/tlbex.c | 10 ++++++++++ + 8 files changed, 100 insertions(+) + +Index: linux/arch/mips/Kconfig +=================================================================== +--- linux.orig/arch/mips/Kconfig ++++ linux/arch/mips/Kconfig +@@ -1397,6 +1397,21 @@ config LOONGSON3_ENHANCEMENT + please say 'N' here. If you want a high-performance kernel to run on + new Loongson 3 machines only, please say 'Y' here. + ++config CPU_LOONGSON3_WORKAROUNDS ++ bool "Old Loongson 3 LLSC Workarounds" ++ default y if SMP ++ depends on CPU_LOONGSON3 ++ help ++ Loongson 3 processors have the llsc issues which require workarounds. ++ Without workarounds the system may hang unexpectedly. ++ ++ Newer Loongson 3 will fix these issues and no workarounds are needed. ++ The workarounds have no significant side effect on them but may ++ decrease the performance of the system so this option should be ++ disabled unless the kernel is intended to be run on old systems. ++ ++ If unsure, please say Y. ++ + config CPU_LOONGSON2E + bool "Loongson 2E" + depends on SYS_HAS_CPU_LOONGSON2E +Index: linux/arch/mips/include/asm/atomic.h +=================================================================== +--- linux.orig/arch/mips/include/asm/atomic.h ++++ linux/arch/mips/include/asm/atomic.h +@@ -58,6 +58,7 @@ static __inline__ void atomic_##op(int i + if (kernel_uses_llsc) { \ + int temp; \ + \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set "MIPS_ISA_LEVEL" \n" \ + "1: ll %0, %1 # atomic_" #op " \n" \ +@@ -84,6 +85,7 @@ static __inline__ int atomic_##op##_retu + if (kernel_uses_llsc) { \ + int temp; \ + \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set "MIPS_ISA_LEVEL" \n" \ + "1: ll %1, %2 # atomic_" #op "_return \n" \ +@@ -116,6 +118,7 @@ static __inline__ int atomic_fetch_##op# + if (kernel_uses_llsc) { \ + int temp; \ + \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set "MIPS_ISA_LEVEL" \n" \ + "1: ll %1, %2 # atomic_fetch_" #op " \n" \ +@@ -251,6 +254,7 @@ static __inline__ void atomic64_##op(lon + if (kernel_uses_llsc) { \ + long temp; \ + \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set "MIPS_ISA_LEVEL" \n" \ + "1: lld %0, %1 # atomic64_" #op " \n" \ +@@ -277,6 +281,7 @@ static __inline__ long atomic64_##op##_r + if (kernel_uses_llsc) { \ + long temp; \ + \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set "MIPS_ISA_LEVEL" \n" \ + "1: lld %1, %2 # atomic64_" #op "_return\n" \ +@@ -309,6 +314,7 @@ static __inline__ long atomic64_fetch_## + if (kernel_uses_llsc) { \ + long temp; \ + \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set "MIPS_ISA_LEVEL" \n" \ + "1: lld %1, %2 # atomic64_fetch_" #op "\n" \ +Index: linux/arch/mips/include/asm/barrier.h +=================================================================== +--- linux.orig/arch/mips/include/asm/barrier.h ++++ linux/arch/mips/include/asm/barrier.h +@@ -222,6 +222,42 @@ + #define __smp_mb__before_atomic() __smp_mb__before_llsc() + #define __smp_mb__after_atomic() smp_llsc_mb() + ++/* ++ * Some Loongson 3 CPUs have a bug wherein execution of a memory access (load, ++ * store or pref) in between an ll & sc can cause the sc instruction to ++ * erroneously succeed, breaking atomicity. Whilst it's unusual to write code ++ * containing such sequences, this bug bites harder than we might otherwise ++ * expect due to reordering & speculation: ++ * ++ * 1) A memory access appearing prior to the ll in program order may actually ++ * be executed after the ll - this is the reordering case. ++ * ++ * In order to avoid this we need to place a memory barrier (ie. a sync ++ * instruction) prior to every ll instruction, in between it & any earlier ++ * memory access instructions. Many of these cases are already covered by ++ * smp_mb__before_llsc() but for the remaining cases, typically ones in ++ * which multiple CPUs may operate on a memory location but ordering is not ++ * usually guaranteed, we use loongson_llsc_mb() below. ++ * ++ * This reordering case is fixed by 3A R2 CPUs, ie. 3A2000 models and later. ++ * ++ * 2) If a conditional branch exists between an ll & sc with a target outside ++ * of the ll-sc loop, for example an exit upon value mismatch in cmpxchg() ++ * or similar, then misprediction of the branch may allow speculative ++ * execution of memory accesses from outside of the ll-sc loop. ++ * ++ * In order to avoid this we need a memory barrier (ie. a sync instruction) ++ * at each affected branch target, for which we also use loongson_llsc_mb() ++ * defined below. ++ * ++ * This case affects all current Loongson 3 CPUs. ++ */ ++#ifdef CONFIG_CPU_LOONGSON3_WORKAROUNDS /* Loongson-3's LLSC workaround */ ++#define loongson_llsc_mb() __asm__ __volatile__(__WEAK_LLSC_MB : : :"memory") ++#else ++#define loongson_llsc_mb() do { } while (0) ++#endif ++ + #include <asm-generic/barrier.h> + + #endif /* __ASM_BARRIER_H */ +Index: linux/arch/mips/include/asm/bitops.h +=================================================================== +--- linux.orig/arch/mips/include/asm/bitops.h ++++ linux/arch/mips/include/asm/bitops.h +@@ -68,6 +68,7 @@ static inline void set_bit(unsigned long + : "ir" (1UL << bit), GCC_OFF_SMALL_ASM() (*m)); + #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6) + } else if (kernel_uses_llsc && __builtin_constant_p(bit)) { ++ loongson_llsc_mb(); + do { + __asm__ __volatile__( + " " __LL "%0, %1 # set_bit \n" +@@ -78,6 +79,7 @@ static inline void set_bit(unsigned long + } while (unlikely(!temp)); + #endif /* CONFIG_CPU_MIPSR2 || CONFIG_CPU_MIPSR6 */ + } else if (kernel_uses_llsc) { ++ loongson_llsc_mb(); + do { + __asm__ __volatile__( + " .set "MIPS_ISA_ARCH_LEVEL" \n" +@@ -120,6 +122,7 @@ static inline void clear_bit(unsigned lo + : "ir" (~(1UL << bit))); + #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6) + } else if (kernel_uses_llsc && __builtin_constant_p(bit)) { ++ loongson_llsc_mb(); + do { + __asm__ __volatile__( + " " __LL "%0, %1 # clear_bit \n" +@@ -130,6 +133,7 @@ static inline void clear_bit(unsigned lo + } while (unlikely(!temp)); + #endif /* CONFIG_CPU_MIPSR2 || CONFIG_CPU_MIPSR6 */ + } else if (kernel_uses_llsc) { ++ loongson_llsc_mb(); + do { + __asm__ __volatile__( + " .set "MIPS_ISA_ARCH_LEVEL" \n" +@@ -188,6 +192,7 @@ static inline void change_bit(unsigned l + unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); + unsigned long temp; + ++ loongson_llsc_mb(); + do { + __asm__ __volatile__( + " .set "MIPS_ISA_ARCH_LEVEL" \n" +Index: linux/arch/mips/include/asm/futex.h +=================================================================== +--- linux.orig/arch/mips/include/asm/futex.h ++++ linux/arch/mips/include/asm/futex.h +@@ -50,6 +50,7 @@ + "i" (-EFAULT) \ + : "memory"); \ + } else if (cpu_has_llsc) { \ ++ loongson_llsc_mb(); \ + __asm__ __volatile__( \ + " .set push \n" \ + " .set noat \n" \ +@@ -162,6 +163,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, + "i" (-EFAULT) + : "memory"); + } else if (cpu_has_llsc) { ++ loongson_llsc_mb(); + __asm__ __volatile__( + "# futex_atomic_cmpxchg_inatomic \n" + " .set push \n" +@@ -190,6 +192,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, + : GCC_OFF_SMALL_ASM() (*uaddr), "Jr" (oldval), "Jr" (newval), + "i" (-EFAULT) + : "memory"); ++ loongson_llsc_mb(); + } else + return -ENOSYS; + +Index: linux/arch/mips/include/asm/pgtable.h +=================================================================== +--- linux.orig/arch/mips/include/asm/pgtable.h ++++ linux/arch/mips/include/asm/pgtable.h +@@ -229,6 +229,7 @@ static inline void set_pte(pte_t *ptep, + : [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp) + : [global] "r" (page_global)); + } else if (kernel_uses_llsc) { ++ loongson_llsc_mb(); + __asm__ __volatile__ ( + " .set "MIPS_ISA_ARCH_LEVEL" \n" + " .set push \n" +@@ -244,6 +245,7 @@ static inline void set_pte(pte_t *ptep, + " .set mips0 \n" + : [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp) + : [global] "r" (page_global)); ++ loongson_llsc_mb(); + } + #else /* !CONFIG_SMP */ + if (pte_none(*buddy)) +Index: linux/arch/mips/loongson64/Platform +=================================================================== +--- linux.orig/arch/mips/loongson64/Platform ++++ linux/arch/mips/loongson64/Platform +@@ -23,6 +23,29 @@ ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS + endif + + cflags-$(CONFIG_CPU_LOONGSON3) += -Wa,--trap ++ ++# ++# Some versions of binutils, not currently mainline as of 2019/02/04, support ++# an -mfix-loongson3-llsc flag which emits a sync prior to each ll instruction ++# to work around a CPU bug (see loongson_llsc_mb() in asm/barrier.h for a ++# description). ++# ++# We disable this in order to prevent the assembler meddling with the ++# instruction that labels refer to, ie. if we label an ll instruction: ++# ++# 1: ll v0, 0(a0) ++# ++# ...then with the assembler fix applied the label may actually point at a sync ++# instruction inserted by the assembler, and if we were using the label in an ++# exception table the table would no longer contain the address of the ll ++# instruction. ++# ++# Avoid this by explicitly disabling that assembler behaviour. If upstream ++# binutils does not merge support for the flag then we can revisit & remove ++# this later - for now it ensures vendor toolchains don't cause problems. ++# ++cflags-$(CONFIG_CPU_LOONGSON3) += $(call as-option,-Wa$(comma)-mno-fix-loongson3-llsc,) ++ + # + # binutils from v2.25 on and gcc starting from v4.9.0 treat -march=loongson3a + # as MIPS64 R2; older versions as just R1. This leaves the possibility open +Index: linux/arch/mips/mm/tlbex.c +=================================================================== +--- linux.orig/arch/mips/mm/tlbex.c ++++ linux/arch/mips/mm/tlbex.c +@@ -943,6 +943,8 @@ build_get_pgd_vmalloc64(u32 **p, struct + * to mimic that here by taking a load/istream page + * fault. + */ ++ if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS)) ++ uasm_i_sync(p, 0); + UASM_i_LA(p, ptr, (unsigned long)tlb_do_page_fault_0); + uasm_i_jr(p, ptr); + +@@ -1663,6 +1665,8 @@ static void + iPTE_LW(u32 **p, unsigned int pte, unsigned int ptr) + { + #ifdef CONFIG_SMP ++ if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS)) ++ uasm_i_sync(p, 0); + # ifdef CONFIG_PHYS_ADDR_T_64BIT + if (cpu_has_64bits) + uasm_i_lld(p, pte, 0, ptr); +@@ -2276,6 +2280,8 @@ static void build_r4000_tlb_load_handler + #endif + + uasm_l_nopage_tlbl(&l, p); ++ if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS)) ++ uasm_i_sync(&p, 0); + build_restore_work_registers(&p); + #ifdef CONFIG_CPU_MICROMIPS + if ((unsigned long)tlb_do_page_fault_0 & 1) { +@@ -2330,6 +2336,8 @@ static void build_r4000_tlb_store_handle + #endif + + uasm_l_nopage_tlbs(&l, p); ++ if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS)) ++ uasm_i_sync(&p, 0); + build_restore_work_registers(&p); + #ifdef CONFIG_CPU_MICROMIPS + if ((unsigned long)tlb_do_page_fault_1 & 1) { +@@ -2385,6 +2393,8 @@ static void build_r4000_tlb_modify_handl + #endif + + uasm_l_nopage_tlbm(&l, p); ++ if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS)) ++ uasm_i_sync(&p, 0); + build_restore_work_registers(&p); + #ifdef CONFIG_CPU_MICROMIPS + if ((unsigned long)tlb_do_page_fault_1 & 1) { diff --git a/debian/patches/bugfix/powerpc/powerpc-boot-fix-missing-crc32poly.h-when-building-with-kernel_xz.patch b/debian/patches/bugfix/powerpc/powerpc-boot-fix-missing-crc32poly.h-when-building-with-kernel_xz.patch new file mode 100644 index 000000000..45e1252df --- /dev/null +++ b/debian/patches/bugfix/powerpc/powerpc-boot-fix-missing-crc32poly.h-when-building-with-kernel_xz.patch @@ -0,0 +1,39 @@ +From: Krzysztof Kozlowski <krzk@kernel.org> +Date: Wed, 29 Aug 2018 09:32:23 +0200 +Subject: powerpc/boot: Fix missing crc32poly.h when building with KERNEL_XZ +Origin: https://patchwork.ozlabs.org/patch/963258/ + +After commit faa16bc404d7 ("lib: Use existing define with +polynomial") the lib/xz/xz_crc32.c includes a header from include/linux +directory thus any other user of this code should define proper include +path. + +This fixes the build error on powerpc with CONFIG_KERNEL_XZ: + + In file included from ../arch/powerpc/boot/../../../lib/decompress_unxz.c:233:0, + from ../arch/powerpc/boot/decompress.c:42: + ../arch/powerpc/boot/../../../lib/xz/xz_crc32.c:18:29: fatal error: linux/crc32poly.h: No such file or directory + +Reported-by: Michal Kubecek <mkubecek@suse.cz> +Fixes: faa16bc404d7 ("lib: Use existing define with polynomial") +Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> +Reported-by: kbuild test robot <lkp@intel.com> +Reported-by: Meelis Roos <mroos@linux.ee> +Tested-by: Michal Kubecek <mkubecek@suse.cz> +--- + arch/powerpc/boot/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/arch/powerpc/boot/Makefile +=================================================================== +--- linux.orig/arch/powerpc/boot/Makefile ++++ linux/arch/powerpc/boot/Makefile +@@ -68,7 +68,7 @@ ifeq ($(call cc-option-yn, -fstack-prote + BOOTCFLAGS += -fno-stack-protector + endif + +-BOOTCFLAGS += -I$(objtree)/$(obj) -I$(srctree)/$(obj) ++BOOTCFLAGS += -I$(objtree)/$(obj) -I$(srctree)/$(obj) -I$(srctree)/include + + DTC_FLAGS ?= -p 1024 + diff --git a/debian/patches/bugfix/powerpc/powerpc-fix-mcpu-options-for-spe-only-compiler.patch b/debian/patches/bugfix/powerpc/powerpc-fix-mcpu-options-for-spe-only-compiler.patch new file mode 100644 index 000000000..833cf5a3c --- /dev/null +++ b/debian/patches/bugfix/powerpc/powerpc-fix-mcpu-options-for-spe-only-compiler.patch @@ -0,0 +1,42 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Wed, 26 Dec 2018 00:00:40 +0000 +Subject: powerpc: Fix -mcpu= options for SPE-only compiler +Forwarded: https://lists.debian.org/debian-kernel/2018/12/msg00295.html + +GCC for Debian's "powerpcspe" architecture only supports 32-bit +SPE targets, and using -mcpu=powerpc or -mcpu=powerpc64 is a fatal +error. + +* Change the test for a biarch compiler to pass both the -m32 and -m64 + options, so that it doesn't catch 32-bit-only compilers +* Add an ifdef CONFIG_PPC64 around the 64-bit CPU option definitions + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -12,7 +12,7 @@ + # Rewritten by Cort Dougan and Paul Mackerras + # + +-HAS_BIARCH := $(call cc-option-yn, -m32) ++HAS_BIARCH := $(call cc-option-yn, -m32 -m64) + + # Set default 32 bits cross compilers for vdso and boot wrapper + CROSS32_COMPILE ?= +@@ -159,6 +159,7 @@ CFLAGS-$(CONFIG_PPC32) += $(call cc-opti + + CFLAGS-$(CONFIG_PPC32) += $(call cc-option,-mno-readonly-in-sdata) + ++ifdef CONFIG_PPC64 + ifdef CONFIG_PPC_BOOK3S_64 + ifdef CONFIG_CPU_LITTLE_ENDIAN + CFLAGS-$(CONFIG_GENERIC_CPU) += -mcpu=power8 +@@ -170,6 +171,7 @@ endif + else ifdef CONFIG_PPC_BOOK3E_64 + CFLAGS-$(CONFIG_GENERIC_CPU) += -mcpu=powerpc64 + endif ++endif + + ifdef CONFIG_FUNCTION_TRACER + CC_FLAGS_FTRACE := -pg diff --git a/debian/patches/bugfix/powerpc/powerpc-lib-makefile-don-t-pull-in-quad.o-for-32-bit.patch b/debian/patches/bugfix/powerpc/powerpc-lib-makefile-don-t-pull-in-quad.o-for-32-bit.patch new file mode 100644 index 000000000..8fc19da9f --- /dev/null +++ b/debian/patches/bugfix/powerpc/powerpc-lib-makefile-don-t-pull-in-quad.o-for-32-bit.patch @@ -0,0 +1,30 @@ +From: James Clarke <jrtc27@jrtc27.com> +Date: Sun, 18 Feb 2018 15:54:44 +0000 +Subject: powerpc/lib/Makefile: Don't pull in quad.o for 32-bit kernels +Origin: https://people.debian.org/~jrtc27/linux-ppc32/0002-powerpc-lib-Makefile-Don-t-pull-in-quad.o-for-32-bit.patch + +The functions exported by quad.o are only used when guarded by +__powerpc64__ and so are unused on 32-bit kernels. Moreover, their +implementations make use of instructions which will cause an illegal +instruction error on 32-bit processors, and are not accepted by the +assembler for SPE processors. + +Fixes: 31bfdb036f12 ("powerpc: Use instruction emulation infrastructure to handle alignment faults") +Signed-off-by: James Clarke <jrtc27@jrtc27.com> +--- + arch/powerpc/lib/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/arch/powerpc/lib/Makefile +=================================================================== +--- linux.orig/arch/powerpc/lib/Makefile ++++ linux/arch/powerpc/lib/Makefile +@@ -35,7 +35,7 @@ obj64-$(CONFIG_KPROBES_SANITY_TEST) += t + obj-y += checksum_$(BITS).o checksum_wrappers.o \ + string_$(BITS).o memcmp_$(BITS).o + +-obj-y += sstep.o ldstfp.o quad.o ++obj-y += sstep.o ldstfp.o + obj64-y += quad.o + + obj-$(CONFIG_PPC_LIB_RHEAP) += rheap.o diff --git a/debian/patches/bugfix/sh/sh-boot-do-not-use-hyphen-in-exported-variable-name.patch b/debian/patches/bugfix/sh/sh-boot-do-not-use-hyphen-in-exported-variable-name.patch new file mode 100644 index 000000000..8e50801c9 --- /dev/null +++ b/debian/patches/bugfix/sh/sh-boot-do-not-use-hyphen-in-exported-variable-name.patch @@ -0,0 +1,132 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sat, 19 Aug 2017 21:42:09 +0100 +Subject: sh: Do not use hyphen in exported variable names +Forwarded: https://marc.info/?l=linux-sh&m=150317827322995&w=2 + +arch/sh/Makefile defines and exports ld-bfd to be used by +arch/sh/boot/Makefile and arch/sh/boot/compressed/Makefile. Similarly +arch/sh/boot/Makefile defines and exports suffix-y to be used by +arch/sh/boot/compressed/Makefile. However some shells, including +dash, will not pass through environment variables whose name includes +a hyphen. Usually GNU make does not use a shell to recurse, but if +e.g. $(srctree) contains '~' it will use a shell here. + +Rename these variables to ld_bfd and suffix_y. + +References: https://buildd.debian.org/status/fetch.php?pkg=linux&arch=sh4&ver=4.13%7Erc5-1%7Eexp1&stamp=1502943967&raw=0 +Fixes: ef9b542fce00 ("sh: bzip2/lzma uImage support.") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- + arch/sh/Makefile | 10 +++++----- + arch/sh/boot/Makefile | 16 ++++++++-------- + arch/sh/boot/compressed/Makefile | 6 +++--- + arch/sh/boot/romimage/Makefile | 4 ++-- + 4 files changed, 18 insertions(+), 18 deletions(-) + +Index: linux/arch/sh/Makefile +=================================================================== +--- linux.orig/arch/sh/Makefile ++++ linux/arch/sh/Makefile +@@ -119,16 +119,16 @@ LDFLAGS_vmlinux += --defsym phys_stext= + endif + + ifdef CONFIG_CPU_LITTLE_ENDIAN +-ld-bfd := elf32-$(UTS_MACHINE)-linux +-LDFLAGS_vmlinux += --defsym jiffies=jiffies_64 --oformat $(ld-bfd) ++ld_bfd := elf32-$(UTS_MACHINE)-linux ++LDFLAGS_vmlinux += --defsym jiffies=jiffies_64 --oformat $(ld_bfd) + KBUILD_LDFLAGS += -EL + else +-ld-bfd := elf32-$(UTS_MACHINE)big-linux +-LDFLAGS_vmlinux += --defsym jiffies=jiffies_64+4 --oformat $(ld-bfd) ++ld_bfd := elf32-$(UTS_MACHINE)big-linux ++LDFLAGS_vmlinux += --defsym jiffies=jiffies_64+4 --oformat $(ld_bfd) + KBUILD_LDFLAGS += -EB + endif + +-export ld-bfd BITS ++export ld_bfd BITS + + head-y := arch/sh/kernel/head_$(BITS).o + +Index: linux/arch/sh/boot/Makefile +=================================================================== +--- linux.orig/arch/sh/boot/Makefile ++++ linux/arch/sh/boot/Makefile +@@ -19,12 +19,12 @@ CONFIG_ZERO_PAGE_OFFSET ?= 0x00001000 + CONFIG_ENTRY_OFFSET ?= 0x00001000 + CONFIG_PHYSICAL_START ?= $(CONFIG_MEMORY_START) + +-suffix-y := bin +-suffix-$(CONFIG_KERNEL_GZIP) := gz +-suffix-$(CONFIG_KERNEL_BZIP2) := bz2 +-suffix-$(CONFIG_KERNEL_LZMA) := lzma +-suffix-$(CONFIG_KERNEL_XZ) := xz +-suffix-$(CONFIG_KERNEL_LZO) := lzo ++suffix_y := bin ++suffix_$(CONFIG_KERNEL_GZIP) := gz ++suffix_$(CONFIG_KERNEL_BZIP2) := bz2 ++suffix_$(CONFIG_KERNEL_LZMA) := lzma ++suffix_$(CONFIG_KERNEL_XZ) := xz ++suffix_$(CONFIG_KERNEL_LZO) := lzo + + targets := zImage vmlinux.srec romImage uImage uImage.srec uImage.gz \ + uImage.bz2 uImage.lzma uImage.xz uImage.lzo uImage.bin +@@ -106,10 +106,10 @@ OBJCOPYFLAGS_uImage.srec := -I binary -O + $(obj)/uImage.srec: $(obj)/uImage + $(call if_changed,objcopy) + +-$(obj)/uImage: $(obj)/uImage.$(suffix-y) ++$(obj)/uImage: $(obj)/uImage.$(suffix_y) + @ln -sf $(notdir $<) $@ + @echo ' Image $@ is ready' + + export CONFIG_PAGE_OFFSET CONFIG_MEMORY_START CONFIG_BOOT_LINK_OFFSET \ + CONFIG_PHYSICAL_START CONFIG_ZERO_PAGE_OFFSET CONFIG_ENTRY_OFFSET \ +- KERNEL_MEMORY suffix-y ++ KERNEL_MEMORY suffix_y +Index: linux/arch/sh/boot/compressed/Makefile +=================================================================== +--- linux.orig/arch/sh/boot/compressed/Makefile ++++ linux/arch/sh/boot/compressed/Makefile +@@ -33,7 +33,7 @@ ORIG_CFLAGS := $(KBUILD_CFLAGS) + KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) + endif + +-LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(IMAGE_OFFSET) -e startup \ ++LDFLAGS_vmlinux := --oformat $(ld_bfd) -Ttext $(IMAGE_OFFSET) -e startup \ + -T $(obj)/../../kernel/vmlinux.lds + + # +@@ -75,7 +75,7 @@ $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.al + + OBJCOPYFLAGS += -R .empty_zero_page + +-LDFLAGS_piggy.o := -r --format binary --oformat $(ld-bfd) -T ++LDFLAGS_piggy.o := -r --format binary --oformat $(ld_bfd) -T + +-$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) FORCE ++$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix_y) FORCE + $(call if_changed,ld) +Index: linux/arch/sh/boot/romimage/Makefile +=================================================================== +--- linux.orig/arch/sh/boot/romimage/Makefile ++++ linux/arch/sh/boot/romimage/Makefile +@@ -13,7 +13,7 @@ mmcif-obj-$(CONFIG_CPU_SUBTYPE_SH7724) : + load-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-load-y) + obj-$(CONFIG_ROMIMAGE_MMCIF) := $(mmcif-obj-y) + +-LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(load-y) -e romstart \ ++LDFLAGS_vmlinux := --oformat $(ld_bfd) -Ttext $(load-y) -e romstart \ + -T $(obj)/../../kernel/vmlinux.lds + + $(obj)/vmlinux: $(obj)/head.o $(obj-y) $(obj)/piggy.o FORCE +@@ -24,7 +24,7 @@ OBJCOPYFLAGS += -j .empty_zero_page + $(obj)/zeropage.bin: vmlinux FORCE + $(call if_changed,objcopy) + +-LDFLAGS_piggy.o := -r --format binary --oformat $(ld-bfd) -T ++LDFLAGS_piggy.o := -r --format binary --oformat $(ld_bfd) -T + + $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/zeropage.bin arch/sh/boot/zImage FORCE + $(call if_changed,ld) diff --git a/debian/patches/bugfix/x86/perf-tools-fix-unwind-build-on-i386.patch b/debian/patches/bugfix/x86/perf-tools-fix-unwind-build-on-i386.patch new file mode 100644 index 000000000..e8727ef11 --- /dev/null +++ b/debian/patches/bugfix/x86/perf-tools-fix-unwind-build-on-i386.patch @@ -0,0 +1,37 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sat, 22 Jul 2017 17:37:33 +0100 +Subject: perf tools: Fix unwind build on i386 +Forwarded: no + +EINVAL may not be defined when building unwind-libunwind.c with +REMOTE_UNWIND_LIBUNWIND, resulting in a compiler error in +LIBUNWIND__ARCH_REG_ID(). Its only caller, access_reg(), only checks +for a negative return value and doesn't care what it is. So change +-EINVAL to -1. + +Fixes: 52ffe0ff02fc ("Support x86(32-bit) cross platform callchain unwind.") +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- + +Index: linux/tools/perf/arch/x86/util/unwind-libunwind.c +=================================================================== +--- linux.orig/tools/perf/arch/x86/util/unwind-libunwind.c ++++ linux/tools/perf/arch/x86/util/unwind-libunwind.c +@@ -67,7 +67,7 @@ int LIBUNWIND__ARCH_REG_ID(int regnum) + break; + default: + pr_err("unwind: invalid reg id %d\n", regnum); +- return -EINVAL; ++ return -1; + } + + return id; +@@ -107,7 +107,7 @@ int LIBUNWIND__ARCH_REG_ID(int regnum) + break; + default: + pr_err("unwind: invalid reg id %d\n", regnum); +- return -EINVAL; ++ return -1; + } + + return id; diff --git a/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-310-15ikb-to.patch b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-310-15ikb-to.patch new file mode 100644 index 000000000..c9cd5cfc4 --- /dev/null +++ b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-310-15ikb-to.patch @@ -0,0 +1,37 @@ +From: Sven Rebhan <sven.rebhan@gmail.com> +Date: Tue, 21 Feb 2017 20:53:48 +0100 +Subject: platform/x86: ideapad-laptop: Add IdeaPad 310-15IKB to no_hw_rfkill +Origin: https://git.kernel.org/linus/1f3bc53d843f92d6e7e7cf56ee79acec918e6421 + +Like other Lenovo models the IdeaPad 310-15IKB does not have an hw rfkill +switch. This results in hard-blocked radios after boot, resulting in +always blocked radios rendering them unusable. + +Add the IdeaPad 310-15IKB to the no_hw_rfkill DMI list and allows using +the built-in radios. + +Signed-off-by: Sven Rebhan <Sven.Rebhan@googlemail.com> +[andy: massaged commit message] +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/ideapad-laptop.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +Index: linux/drivers/platform/x86/ideapad-laptop.c +=================================================================== +--- linux.orig/drivers/platform/x86/ideapad-laptop.c ++++ linux/drivers/platform/x86/ideapad-laptop.c +@@ -1098,6 +1098,13 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo ideapad 310-15IKB", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 310-15IKB"), ++ }, ++ }, ++ { + .ident = "Lenovo ideapad Y700-15ACZ", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), diff --git a/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-v310-15isk-t.patch b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-v310-15isk-t.patch new file mode 100644 index 000000000..43a075fea --- /dev/null +++ b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-v310-15isk-t.patch @@ -0,0 +1,35 @@ +From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Date: Tue, 21 Feb 2017 20:53:48 +0100 +Subject: platform/x86: ideapad-laptop: Add IdeaPad V310-15ISK to no_hw_rfkill +Origin: https://git.kernel.org/linus/ccc7179f4d9467947c94f4302d61cd5143842fcd + +Like other Lenovo models the IdeaPad V310-15ISK does not have an hw +rfkill switch. This results in hard-blocked radios after boot, resulting +in always blocked radios rendering them unusable. + +Add the IdeaPad V310-15ISK to the no_hw_rfkill DMI list and allows using +the built-in radios. + +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/ideapad-laptop.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +Index: linux/drivers/platform/x86/ideapad-laptop.c +=================================================================== +--- linux.orig/drivers/platform/x86/ideapad-laptop.c ++++ linux/drivers/platform/x86/ideapad-laptop.c +@@ -1098,6 +1098,13 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo V310-15ISK", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo V310-15ISK"), ++ }, ++ }, ++ { + .ident = "Lenovo ideapad 310-15IKB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), diff --git a/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-v510-15ikb-t.patch b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-v510-15ikb-t.patch new file mode 100644 index 000000000..f64747726 --- /dev/null +++ b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-ideapad-v510-15ikb-t.patch @@ -0,0 +1,37 @@ +From: Sven Eckelmann <sven@narfation.org> +Date: Sat, 1 Jul 2017 08:20:18 +0200 +Subject: platform/x86: ideapad-laptop: Add IdeaPad V510-15IKB to no_hw_rfkill +Origin: https://git.kernel.org/linus/0df4b805cbccbe3f8378f49c415adb2fcffdd3dc +Bug-Debian: https://bugs.debian.org/866706 + +Like other Lenovo models the IdeaPad V510-15IKB does not have an hw +rfkill switch. This results in hard-blocked radios after boot, resulting +in always blocked radios rendering them unusable. + +Add the IdeaPad V510-15IKB to the no_hw_rfkill DMI list and allows using +the built-in radios. + +Signed-off-by: Sven Eckelmann <sven@narfation.org> +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/ideapad-laptop.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +Index: linux/drivers/platform/x86/ideapad-laptop.c +=================================================================== +--- linux.orig/drivers/platform/x86/ideapad-laptop.c ++++ linux/drivers/platform/x86/ideapad-laptop.c +@@ -1105,6 +1105,13 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo V510-15IKB", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo V510-15IKB"), ++ }, ++ }, ++ { + .ident = "Lenovo ideapad 310-15IKB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), diff --git a/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-several-models-to-no.patch b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-several-models-to-no.patch new file mode 100644 index 000000000..4041cd9a3 --- /dev/null +++ b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-several-models-to-no.patch @@ -0,0 +1,112 @@ +From: Yang Jiaxun <yjx@flygoat.com> +Date: Tue, 4 Jul 2017 14:39:19 +0000 +Subject: platform/x86: ideapad-laptop: Add several models to no_hw_rfkill +Origin: https://git.kernel.org/linus/710c059c248a24609051f5a3dd1d8468cdc675b0 + +Some Lenovo ideapad models do not have hardware rfkill switches, but +trying to read the rfkill switches through the ideapad-laptop module. +It caused to always reported blocking breaking wifi. + +Fix it by adding those models to no_hw_rfkill_list. + +Signed-off-by: Yang Jiaxun <yjx@flygoat.com> +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/ideapad-laptop.c | 70 +++++++++++++++++++++++++++++++++++ + 1 file changed, 70 insertions(+) + +Index: linux/drivers/platform/x86/ideapad-laptop.c +=================================================================== +--- linux.orig/drivers/platform/x86/ideapad-laptop.c ++++ linux/drivers/platform/x86/ideapad-laptop.c +@@ -1098,6 +1098,27 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo V310-14IKB", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo V310-14IKB"), ++ }, ++ }, ++ { ++ .ident = "Lenovo V310-14ISK", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo V310-14ISK"), ++ }, ++ }, ++ { ++ .ident = "Lenovo V310-15IKB", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo V310-15IKB"), ++ }, ++ }, ++ { + .ident = "Lenovo V310-15ISK", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +@@ -1112,6 +1133,41 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo ideapad 300-15IBR", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 300-15IBR"), ++ }, ++ }, ++ { ++ .ident = "Lenovo ideapad 300-15IKB", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 300-15IKB"), ++ }, ++ }, ++ { ++ .ident = "Lenovo ideapad 300S-11IBR", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 300S-11BR"), ++ }, ++ }, ++ { ++ .ident = "Lenovo ideapad 310-15ABR", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 310-15ABR"), ++ }, ++ }, ++ { ++ .ident = "Lenovo ideapad 310-15IAP", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 310-15IAP"), ++ }, ++ }, ++ { + .ident = "Lenovo ideapad 310-15IKB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +@@ -1119,6 +1175,20 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo ideapad 310-15ISK", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 310-15ISK"), ++ }, ++ }, ++ { ++ .ident = "Lenovo ideapad Y700-14ISK", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad Y700-14ISK"), ++ }, ++ }, ++ { + .ident = "Lenovo ideapad Y700-15ACZ", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), diff --git a/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-y520-15ikbn-to-no_hw.patch b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-y520-15ikbn-to-no_hw.patch new file mode 100644 index 000000000..0020839df --- /dev/null +++ b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-y520-15ikbn-to-no_hw.patch @@ -0,0 +1,35 @@ +From: Olle Liljenzin <olle@liljenzin.se> +Date: Sun, 18 Jun 2017 13:09:31 +0200 +Subject: platform/x86: ideapad-laptop: Add Y520-15IKBN to no_hw_rfkill +Origin: https://git.kernel.org/linus/5d9f40b56630a8702b5f7a61a770f9b73aa07464 + +Lenovo Legion Y520-15IKBN is yet another Lenovo model that does not +have an hw rfkill switch, resulting in wifi always reported as hard +blocked. + +Add the model to the list of models without rfkill switch. + +Signed-off-by: Olle Liljenzin <olle@liljenzin.se> +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/ideapad-laptop.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +Index: linux/drivers/platform/x86/ideapad-laptop.c +=================================================================== +--- linux.orig/drivers/platform/x86/ideapad-laptop.c ++++ linux/drivers/platform/x86/ideapad-laptop.c +@@ -1182,6 +1182,13 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo Legion Y520-15IKBN", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Y520-15IKBN"), ++ }, ++ }, ++ { + .ident = "Lenovo Yoga 2 11 / 13 / Pro", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), diff --git a/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-y720-15ikbn-to-no_hw.patch b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-y720-15ikbn-to-no_hw.patch new file mode 100644 index 000000000..59f3dc3f6 --- /dev/null +++ b/debian/patches/bugfix/x86/platform-x86-ideapad-laptop-add-y720-15ikbn-to-no_hw.patch @@ -0,0 +1,35 @@ +From: Olle Liljenzin <olle@liljenzin.se> +Date: Sun, 18 Jun 2017 14:37:58 +0200 +Subject: platform/x86: ideapad-laptop: Add Y720-15IKBN to no_hw_rfkill +Origin: https://git.kernel.org/linus/b2f2fe205c3b9b595dc50ee431230a45d03f9c2c + +Lenovo Legion Y720-15IKBN is yet another Lenovo model that does not +have an hw rfkill switch, resulting in wifi always reported as hard +blocked. + +Add the model to the list of models without rfkill switch. + +Signed-off-by: Olle Liljenzin <olle@liljenzin.se> +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/ideapad-laptop.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +Index: linux/drivers/platform/x86/ideapad-laptop.c +=================================================================== +--- linux.orig/drivers/platform/x86/ideapad-laptop.c ++++ linux/drivers/platform/x86/ideapad-laptop.c +@@ -1189,6 +1189,13 @@ static const struct dmi_system_id no_hw_ + }, + }, + { ++ .ident = "Lenovo Legion Y720-15IKBN", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Y720-15IKBN"), ++ }, ++ }, ++ { + .ident = "Lenovo Yoga 2 11 / 13 / Pro", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), diff --git a/debian/patches/bugfix/x86/revert-perf-build-fix-libunwind-feature-detection-on.patch b/debian/patches/bugfix/x86/revert-perf-build-fix-libunwind-feature-detection-on.patch new file mode 100644 index 000000000..e571c91fe --- /dev/null +++ b/debian/patches/bugfix/x86/revert-perf-build-fix-libunwind-feature-detection-on.patch @@ -0,0 +1,24 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Fri, 25 Sep 2015 22:50:50 +0100 +Subject: Revert "perf build: Fix libunwind feature detection on 32-bit x86" +Forwarded: no + +This reverts commit 05b41775e2edd69a83f592e3534930c934d4038e. +It broke feature detection that was working just fine for us. +--- + tools/perf/Makefile.config | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux/tools/perf/Makefile.config +=================================================================== +--- linux.orig/tools/perf/Makefile.config ++++ linux/tools/perf/Makefile.config +@@ -42,7 +42,7 @@ ifeq ($(SRCARCH),x86) + LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma + $(call detected,CONFIG_X86_64) + else +- LIBUNWIND_LIBS = -lunwind-x86 -llzma -lunwind ++ LIBUNWIND_LIBS = -lunwind -lunwind-x86 + endif + NO_PERF_REGS := 0 + endif diff --git a/debian/patches/bugfix/x86/tools-turbostat-Add-checks-for-failure-of-fgets-and-.patch b/debian/patches/bugfix/x86/tools-turbostat-Add-checks-for-failure-of-fgets-and-.patch new file mode 100644 index 000000000..77b56df47 --- /dev/null +++ b/debian/patches/bugfix/x86/tools-turbostat-Add-checks-for-failure-of-fgets-and-.patch @@ -0,0 +1,114 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Tue, 11 Sep 2018 03:07:28 +0100 +Subject: tools: turbostat: Add checks for failure of fgets() and fscanf() +Forwarded: https://marc.info/?l=linux-pm&m=153711036626779 + +Most calls to fgets() and fscanf() are followed by error checks. +Add an exit-on-error in the remaining cases. + +Signed-off-by: Ben Hutchings <ben@decadent.org.uk> +--- + tools/power/x86/turbostat/turbostat.c | 28 +++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +Index: linux/tools/power/x86/turbostat/turbostat.c +=================================================================== +--- linux.orig/tools/power/x86/turbostat/turbostat.c ++++ linux/tools/power/x86/turbostat/turbostat.c +@@ -2554,7 +2554,8 @@ int get_thread_siblings(struct cpu_topol + filep = fopen_or_die(path, "r"); + do { + offset -= BITMASK_SIZE; +- fscanf(filep, "%lx%c", &map, &character); ++ if (fscanf(filep, "%lx%c", &map, &character) != 2) ++ err(1, "%s: failed to parse file", path); + for (shift = 0; shift < BITMASK_SIZE; shift++) { + if ((map >> shift) & 0x1) { + so = shift + offset; +@@ -3407,14 +3408,14 @@ dump_sysfs_cstate_config(void) + input = fopen(path, "r"); + if (input == NULL) + continue; +- fgets(name_buf, sizeof(name_buf), input); ++ if (!fgets(name_buf, sizeof(name_buf), input)) ++ err(1, "%s: failed to read file", path); + + /* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */ + sp = strchr(name_buf, '-'); + if (!sp) + sp = strchrnul(name_buf, '\n'); + *sp = '\0'; +- + fclose(input); + + sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/desc", +@@ -3422,7 +3423,8 @@ dump_sysfs_cstate_config(void) + input = fopen(path, "r"); + if (input == NULL) + continue; +- fgets(desc, sizeof(desc), input); ++ if (!fgets(desc, sizeof(desc), input)) ++ err(1, "%s: failed to read file", path); + + fprintf(outf, "cpu%d: %s: %s", base_cpu, name_buf, desc); + fclose(input); +@@ -3444,7 +3446,8 @@ dump_sysfs_pstate_config(void) + fprintf(stderr, "NSFOD %s\n", path); + return; + } +- fgets(driver_buf, sizeof(driver_buf), input); ++ if (!fgets(driver_buf, sizeof(driver_buf), input)) ++ err(1, "%s: failed to read file", path); + fclose(input); + + sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", +@@ -3454,7 +3457,8 @@ dump_sysfs_pstate_config(void) + fprintf(stderr, "NSFOD %s\n", path); + return; + } +- fgets(governor_buf, sizeof(governor_buf), input); ++ if (!fgets(governor_buf, sizeof(governor_buf), input)) ++ err(1, "%s: failed to read file", path); + fclose(input); + + fprintf(outf, "cpu%d: cpufreq driver: %s", base_cpu, driver_buf); +@@ -3463,7 +3467,8 @@ dump_sysfs_pstate_config(void) + sprintf(path, "/sys/devices/system/cpu/cpufreq/boost"); + input = fopen(path, "r"); + if (input != NULL) { +- fscanf(input, "%d", &turbo); ++ if (fscanf(input, "%d", &turbo) != 1) ++ err(1, "%s: failed to parse number from file", path); + fprintf(outf, "cpufreq boost: %d\n", turbo); + fclose(input); + } +@@ -3471,7 +3476,8 @@ dump_sysfs_pstate_config(void) + sprintf(path, "/sys/devices/system/cpu/intel_pstate/no_turbo"); + input = fopen(path, "r"); + if (input != NULL) { +- fscanf(input, "%d", &turbo); ++ if (fscanf(input, "%d", &turbo) != 1) ++ err(1, "%s: failed to parse number from file", path); + fprintf(outf, "cpufreq intel_pstate no_turbo: %d\n", turbo); + fclose(input); + } +@@ -5296,7 +5302,8 @@ void probe_sysfs(void) + input = fopen(path, "r"); + if (input == NULL) + continue; +- fgets(name_buf, sizeof(name_buf), input); ++ if (!fgets(name_buf, sizeof(name_buf), input)) ++ err(1, "%s: failed to read file", path); + + /* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */ + sp = strchr(name_buf, '-'); +@@ -5323,7 +5330,8 @@ void probe_sysfs(void) + input = fopen(path, "r"); + if (input == NULL) + continue; +- fgets(name_buf, sizeof(name_buf), input); ++ if (!fgets(name_buf, sizeof(name_buf), input)) ++ err(1, "%s: failed to read file", path); + /* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */ + sp = strchr(name_buf, '-'); + if (!sp) diff --git a/debian/patches/bugfix/x86/viafb-autoload-on-olpc-xo1.5-only.patch b/debian/patches/bugfix/x86/viafb-autoload-on-olpc-xo1.5-only.patch new file mode 100644 index 000000000..14df64f35 --- /dev/null +++ b/debian/patches/bugfix/x86/viafb-autoload-on-olpc-xo1.5-only.patch @@ -0,0 +1,36 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Sat, 20 Apr 2013 15:52:02 +0100 +Subject: viafb: Autoload on OLPC XO 1.5 only +Bug-Debian: https://bugs.debian.org/705788 +Forwarded: no + +It appears that viafb won't work automatically on all the boards for +which it has a PCI device ID match. Currently, it is blacklisted by +udev along with most other framebuffer drivers, so this doesn't matter +much. + +However, this driver is required for console support on the XO 1.5. +We need to allow it to be autoloaded on this model only, and then +un-blacklist it in udev. + +--- +Index: linux/drivers/video/fbdev/via/via-core.c +=================================================================== +--- linux.orig/drivers/video/fbdev/via/via-core.c ++++ linux/drivers/video/fbdev/via/via-core.c +@@ -752,7 +752,14 @@ static const struct pci_device_id via_pc + .driver_data = UNICHROME_VX900 }, + { } + }; +-MODULE_DEVICE_TABLE(pci, via_pci_table); ++ ++static const struct pci_device_id via_pci_autoload_table[] __initconst = { ++ /* OLPC XO 1.5 */ ++ { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_VX855_DID), ++ .subvendor = 0x152d, .subdevice = 0x0833 }, ++ { } ++}; ++MODULE_DEVICE_TABLE(pci, via_pci_autoload_table); + + static struct pci_driver via_driver = { + .name = "viafb", diff --git a/debian/patches/bugfix/x86/x86-32-disable-3dnow-in-generic-config.patch b/debian/patches/bugfix/x86/x86-32-disable-3dnow-in-generic-config.patch new file mode 100644 index 000000000..2970dc8b4 --- /dev/null +++ b/debian/patches/bugfix/x86/x86-32-disable-3dnow-in-generic-config.patch @@ -0,0 +1,31 @@ +From: Ben Hutchings <ben@decadent.org.uk> +Date: Tue, 25 Sep 2018 19:44:13 +0100 +Subject: x86-32: Disable 3D-Now in generic config + +We want the 686 flavour to run on Geode LX and similar AMD family 5 +CPUs as well as family 6 and higher CPUs. This used to work with +CONFIG_M686=y. However commit 25d76ac88821 "x86/Kconfig: Explicitly +enumerate i686-class CPUs in Kconfig" in Linux 4.16 has made the +kernel require family 6 or higher. + +It looks like a sensible choice would be to enable CONFIG_MGEODE_LX +and CONFIG_X86_GENERIC (for more generic optimisations), but this +currently enables CONFIG_X86_USE_3D_NOW which will cause the kernel to +crash on CPUs without the AMD-specific 3D-Now instructions. + +Make CONFIG_X86_USE_3DNOW depend on CONFIG_X86_GENERIC being disabled. + +--- +Index: linux/arch/x86/Kconfig.cpu +=================================================================== +--- linux.orig/arch/x86/Kconfig.cpu ++++ linux/arch/x86/Kconfig.cpu +@@ -337,7 +337,7 @@ config X86_USE_PPRO_CHECKSUM + + config X86_USE_3DNOW + def_bool y +- depends on (MCYRIXIII || MK7 || MGEODE_LX) && !UML ++ depends on (MCYRIXIII || MK7 || MGEODE_LX) && !X86_GENERIC && !UML + + # + # P6_NOPs are a relatively minor optimization that require a family >= |