From: Herman van Hazendonk Date: Tue, 31 Mar 2020 17:09:55 +0200 Subject: [PATCH] Add fixes for 5.6 kernel Origin: https://salsa.debian.org/Herrie82-guest/broadcom-sta/-/merge_requests/1 Use ioremap instead of ioremap_nocache and proc_ops instead of file_operations on Linux kernel 5.6 and above. Patch amended to adapt i386 arch. --- amd64/src/shared/linux_osl.c | 6 +++++- amd64/src/wl/sys/wl_linux.c | 21 ++++++++++++++++++++- i386/src/shared/linux_osl.c | 6 +++++- i386/src/wl/sys/wl_linux.c | 21 ++++++++++++++++++++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/amd64/src/shared/linux_osl.c b/amd64/src/shared/linux_osl.c index b24a973..9bce9b1 100644 --- a/amd64/src/shared/linux_osl.c +++ b/amd64/src/shared/linux_osl.c @@ -946,7 +946,11 @@ osl_getcycles(void) void * osl_reg_map(uint32 pa, uint size) { - return (ioremap_nocache((unsigned long)pa, (unsigned long)size)); + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + return (ioremap((unsigned long)pa, (unsigned long)size)); + #else + return (ioremap_nocache((unsigned long)pa, (unsigned long)size)); + #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ } void diff --git a/amd64/src/wl/sys/wl_linux.c b/amd64/src/wl/sys/wl_linux.c index 8fe9f4f..66069d4 100644 --- a/amd64/src/wl/sys/wl_linux.c +++ b/amd64/src/wl/sys/wl_linux.c @@ -588,10 +588,17 @@ wl_attach(uint16 vendor, uint16 device, ulong regs, } wl->bcm_bustype = bustype; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) { + WL_ERROR(("wl%d: ioremap() failed\n", unit)); + goto fail; + } + #else if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) { WL_ERROR(("wl%d: ioremap() failed\n", unit)); goto fail; } + #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ wl->bar1_addr = bar1_addr; wl->bar1_size = bar1_size; @@ -778,8 +785,13 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) if ((val & 0x0000ff00) != 0) pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); bar1_size = pci_resource_len(pdev, 2); + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2), + bar1_size); + #else bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2), bar1_size); + #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev, pdev->irq, bar1_addr, bar1_size); @@ -3352,12 +3364,19 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) +static const struct proc_ops wl_fops = { + .proc_read = wl_proc_read, + .proc_write = wl_proc_write, +}; +#else static const struct file_operations wl_fops = { .owner = THIS_MODULE, .read = wl_proc_read, .write = wl_proc_write, }; -#endif +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) */ static int wl_reg_proc_entry(wl_info_t *wl) diff --git a/i386/src/shared/linux_osl.c b/i386/src/shared/linux_osl.c index 3188745..f3b78be 100644 --- a/i386/src/shared/linux_osl.c +++ b/i386/src/shared/linux_osl.c @@ -942,7 +942,11 @@ osl_getcycles(void) void * osl_reg_map(uint32 pa, uint size) { - return (ioremap_nocache((unsigned long)pa, (unsigned long)size)); + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + return (ioremap((unsigned long)pa, (unsigned long)size)); + #else + return (ioremap_nocache((unsigned long)pa, (unsigned long)size)); + #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ } void diff --git a/i386/src/wl/sys/wl_linux.c b/i386/src/wl/sys/wl_linux.c index 0d05100..bff467d 100644 --- a/i386/src/wl/sys/wl_linux.c +++ b/i386/src/wl/sys/wl_linux.c @@ -582,10 +582,17 @@ wl_attach(uint16 vendor, uint16 device, ulong regs, } wl->bcm_bustype = bustype; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + if ((wl->regsva = ioremap(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) { + WL_ERROR(("wl%d: ioremap() failed\n", unit)); + goto fail; + } + #else if ((wl->regsva = ioremap_nocache(dev->base_addr, PCI_BAR0_WINSZ)) == NULL) { WL_ERROR(("wl%d: ioremap() failed\n", unit)); goto fail; } + #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ wl->bar1_addr = bar1_addr; wl->bar1_size = bar1_size; @@ -772,8 +779,13 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) if ((val & 0x0000ff00) != 0) pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); bar1_size = pci_resource_len(pdev, 2); + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) + bar1_addr = (uchar *)ioremap(pci_resource_start(pdev, 2), + bar1_size); + #else bar1_addr = (uchar *)ioremap_nocache(pci_resource_start(pdev, 2), bar1_size); + #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), PCI_BUS, pdev, pdev->irq, bar1_addr, bar1_size); @@ -3335,12 +3347,19 @@ wl_proc_write(struct file *filp, const char __user *buff, size_t length, loff_t } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) +static const struct proc_ops wl_fops = { + .proc_read = wl_proc_read, + .proc_write = wl_proc_write, +}; +#else static const struct file_operations wl_fops = { .owner = THIS_MODULE, .read = wl_proc_read, .write = wl_proc_write, }; -#endif +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) */ +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) */ static int wl_reg_proc_entry(wl_info_t *wl)