4.12.8-stable review
Subsystems (6)
Greg Kroah-Hartman
maintainercover 4.12.8-stable review
This is the start of the stable review cycle for the 4.12.8 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 17 01:19:27 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.12.8-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.12.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.12.8-rc1
Michael Neuling <[email protected]>
powerpc: Fix /proc/cpuinfo revision for POWER9 DD2
Steven J. Hill <[email protected]>
MIPS: Octeon: Fix broken EDAC driver.
Paul Burton <[email protected]>
Revert "MIPS: Don't unnecessarily include kmalloc.h into <asm/cache.h>."
Maciej W. Rozycki <[email protected]>
MIPS: DEC: Fix an int-handler.S CPU_DADDI_WORKAROUNDS regression
Neil Armstrong <[email protected]>
pinctrl: meson-gxl: Add missing GPIODV_18 pin entry
Neil Armstrong <[email protected]>
pinctrl: meson-gxbb: Add missing GPIODV_18 pin entry
Thomas Gleixner <[email protected]>
pinctrl: samsung: Remove bogus irq_[un]mask from resource management
Masahiro Yamada <[email protected]>
pinctrl: uniphier: fix WARN_ON() of pingroups dump on LD20
Masahiro Yamada <[email protected]>
pinctrl: uniphier: fix WARN_ON() of pingroups dump on LD11
Andy Shevchenko <[email protected]>
pinctrl: intel: merrifield: Correct UART pin lists
Icenowy Zheng <[email protected]>
pinctrl: sunxi: add a missing function of A10/A20 pinctrl driver
Andy Shevchenko <[email protected]>
pinctrl: cherryview: Add Setzer models to the Chromebook DMI quirk
Christoph Hellwig <[email protected]>
pnfs/blocklayout: require 64-bit sector_t
Stefan-Gabriel Mirea <[email protected]>
iio: adc: vf610_adc: Fix VALT selection value for REFSEL bits
Marc Zyngier <[email protected]>
xhci: Reset Renesas uPD72020x USB controller for 32-bit DMA issue
Marc Zyngier <[email protected]>
PCI: Add pci_reset_function_locked()
Christoph Hellwig <[email protected]>
PCI: Remove __pci_dev_reset() and pci_dev_reset()
Christoph Hellwig <[email protected]>
PCI: Protect pci_error_handlers->reset_notify() usage with device_lock()
Sandeep Singh <[email protected]>
usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume
Kai-Heng Feng <[email protected]>
usb: quirks: Add no-lpm quirk for Moshi USB to Ethernet Adapter
Bin Liu <[email protected]>
usb: core: unlink urbs from the tail of the endpoint's urb_list
Alan Stern <[email protected]>
USB: Check for dropped connection before switching to full speed
Yoshihiro Shimoda <[email protected]>
usb: renesas_usbhs: Fix UGCTRL2 value for R-Car Gen3
Yoshihiro Shimoda <[email protected]>
usb: gadget: udc: renesas_usb3: Fix usb_gadget_giveback_request() calling
Bart Van Assche <[email protected]>
block: Make blk_mq_delay_kick_requeue_list() rerun the queue at a quiet time
Luis R. Rodriguez <[email protected]>
firmware: avoid invalid fallback aborts by using killable wait
Luis R. Rodriguez <[email protected]>
firmware: fix batched requests - send wake up on failure on direct lookups
Luis R. Rodriguez <[email protected]>
firmware: fix batched requests - wake all waiters
Alan Swanson <[email protected]>
uas: Add US_FL_IGNORE_RESIDUE for Initio Corporation INIC-3069
Ian Abbott <[email protected]>
staging: comedi: comedi_fops: do not call blocking ops when !TASK_RUNNING
Hans de Goede <[email protected]>
iio: adc: Revert "axp288: Drop bogus AXP288_ADC_TS_PIN_CTRL register modifications"
Akinobu Mita <[email protected]>
iio: light: tsl2563: use correct event code
Lorenzo Bianconi <[email protected]>
iio: pressure: st_pressure_core: disable multiread by default for LPS22HB
Hans de Goede <[email protected]>
iio: accel: bmc150: Always restore device to normal mode after suspend-resume
Lorenzo Bianconi <[email protected]>
iio: accel: st_accel: add SPI-3wire support
Mykola Kostenok <[email protected]>
iio: aspeed-adc: wait for initial sequence.
Arnd Bergmann <[email protected]>
staging:iio:resolver:ad2s1210 fix negative IIO_ANGL_VEL read
Rafael J. Wysocki <[email protected]>
USB: hcd: Mark secondary HCD as dead if the primary one died
Bin Liu <[email protected]>
usb: musb: fix tx fifo flush handling again
Greg Kroah-Hartman <[email protected]>
USB: serial: pl2303: add new ATEN device id
Stefan Triller <[email protected]>
USB: serial: cp210x: add support for Qivicon USB ZigBee dongle
Hector Martin <[email protected]>
USB: serial: option: add D-Link DWM-222 device ID
Maarten Lankhorst <[email protected]>
drm/i915: Fix out-of-bounds array access in bdw_load_gamma_lut
Wladimir J. van der Laan <[email protected]>
drm/etnaviv: Fix off-by-one error in reloc checking
Lucas Stach <[email protected]>
drm/bridge: tc358767: fix probe without attached output node
Weston Andros Adamson <[email protected]>
nfs/flexfiles: fix leak of nfs4_ff_ds_version arrays
Haibo Chen <[email protected]>
mmc: mmc: correct the logic for setting HS400ES signal voltage
Miquel Raynal <[email protected]>
nand: fix wrong default oob layout for small pages using soft ecc
Hans de Goede <[email protected]>
i2c: designware: Some broken DSTDs use 1MiHz instead of 1MHz
Mateusz Jurczyk <[email protected]>
fuse: initialize the flock flag in fuse_file on allocation
Nicholas Bellinger <[email protected]>
target: Fix node_acl demo-mode + uncached dynamic shutdown regression
Alan Stern <[email protected]>
usb-storage: fix deadlock involving host lock and scsi_done
Nicholas Bellinger <[email protected]>
iscsi-target: Fix iscsi_np reset hung task during parallel delete
Varun Prakash <[email protected]>
iscsi-target: fix memory leak in iscsit_setup_text_cmd()
Boris Brezillon <[email protected]>
mtd: nand: Declare tBERS, tR and tPROG as u64 to avoid integer overflow
Boris Brezillon <[email protected]>
mtd: nand: Fix timing setup for NANDs that do not support SET FEATURES
Boris Brezillon <[email protected]>
mtd: nand: atmel: Fix DT backward compatibility in pmecc.c
Gregory CLEMENT <[email protected]>
pinctrl: armada-37xx: Fix number of pin in south bridge
Jan Kara <[email protected]>
xfs: Fix leak of discard bio
Max Filippov <[email protected]>
xtensa: don't limit csum_partial export by CONFIG_NET
Max Filippov <[email protected]>
xtensa: mm/cache: add missing EXPORT_SYMBOLs
Max Filippov <[email protected]>
xtensa: fix cache aliasing handling code for WT cache
Mel Gorman <[email protected]>
futex: Remove unnecessary warning from get_futex_key
Cong Wang <[email protected]>
mm: fix list corruptions on shmem shrinklist
Jonathan Toppins <[email protected]>
mm: ratelimit PFNs busy info message
-------------
Diffstat:
Makefile | 4 +- arch/mips/dec/int-handler.S | 34 +- arch/mips/include/asm/cache.h | 2 + arch/mips/include/asm/octeon/cvmx-l2c-defs.h | 37 ++- arch/mips/include/asm/octeon/cvmx-l2d-defs.h | 60 ++++ arch/mips/include/asm/octeon/cvmx.h | 1 + arch/powerpc/kernel/setup-common.c | 4 + arch/xtensa/kernel/xtensa_ksyms.c | 2 - arch/xtensa/mm/cache.c | 16 +- block/blk-mq.c | 4 +- drivers/base/firmware_class.c | 49 ++- drivers/gpu/drm/bridge/tc358767.c | 2 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 4 +- drivers/gpu/drm/i915/intel_color.c | 1 + drivers/i2c/busses/i2c-designware-platdrv.c | 3 + drivers/iio/accel/bmc150-accel-core.c | 9 +- drivers/iio/accel/st_accel_core.c | 32 ++ drivers/iio/adc/aspeed_adc.c | 26 ++ drivers/iio/adc/axp288_adc.c | 32 +- drivers/iio/adc/vf610_adc.c | 2 +- drivers/iio/common/st_sensors/st_sensors_core.c | 29 ++ drivers/iio/light/tsl2563.c | 2 +- drivers/iio/pressure/st_pressure_core.c | 2 +- drivers/mmc/core/mmc.c | 2 +- drivers/mtd/nand/atmel/pmecc.c | 21 +- drivers/mtd/nand/nand_base.c | 12 +- drivers/mtd/nand/nand_timings.c | 6 +- drivers/pci/pci.c | 165 ++++++---- drivers/pinctrl/intel/pinctrl-cherryview.c | 7 + drivers/pinctrl/intel/pinctrl-merrifield.c | 6 +- drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 1 + drivers/pinctrl/meson/pinctrl-meson-gxl.c | 1 + drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 2 +- drivers/pinctrl/samsung/pinctrl-exynos.c | 4 - drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c | 1 + drivers/pinctrl/uniphier/pinctrl-uniphier-ld11.c | 364 +++++++++++---------- drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c | 383 ++++++++++++----------- drivers/staging/comedi/comedi_fops.c | 3 + drivers/staging/iio/resolver/ad2s1210.c | 2 +- drivers/target/iscsi/iscsi_target.c | 2 + drivers/target/iscsi/iscsi_target_login.c | 7 +- drivers/target/target_core_tpg.c | 4 +- drivers/target/target_core_transport.c | 4 +- drivers/usb/core/hcd.c | 4 +- drivers/usb/core/hub.c | 10 +- drivers/usb/core/quirks.c | 4 + drivers/usb/gadget/udc/renesas_usb3.c | 21 +- drivers/usb/host/pci-quirks.c | 37 ++- drivers/usb/host/pci-quirks.h | 1 + drivers/usb/host/xhci-pci.c | 7 + drivers/usb/musb/musb_host.c | 1 + drivers/usb/renesas_usbhs/rcar3.c | 9 +- drivers/usb/serial/cp210x.c | 1 + drivers/usb/serial/option.c | 2 + drivers/usb/serial/pl2303.c | 2 + drivers/usb/serial/pl2303.h | 1 + drivers/usb/storage/unusual_uas.h | 4 +- drivers/usb/storage/usb.c | 18 +- fs/fuse/file.c | 2 +- fs/nfs/Kconfig | 1 + fs/nfs/flexfilelayout/flexfilelayoutdev.c | 1 + fs/xfs/xfs_log_cil.c | 1 + include/linux/iio/common/st_sensors.h | 7 + include/linux/mtd/nand.h | 6 +- include/linux/pci.h | 1 + include/linux/platform_data/st_sensors_pdata.h | 2 + include/target/iscsi/iscsi_target_core.h | 1 + kernel/futex.c | 5 +- mm/page_alloc.c | 2 +- mm/shmem.c | 12 +- 70 files changed, 951 insertions(+), 566 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/65 mm: ratelimit PFNs busy info message
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Toppins <[email protected]>
commit 75dddef32514f7aa58930bde6a1263253bc3d4ba upstream.
The RDMA subsystem can generate several thousand of these messages per second eventually leading to a kernel crash. Ratelimit these messages to prevent this crash.
Doug said:
"I've been carrying a version of this for several kernel versions. I
don't remember when they started, but we have one (and only one) class of machines: Dell PE R730xd, that generate these errors. When it happens, without a rate limit, we get rcu timeouts and kernel oopses. With the rate limit, we just get a lot of annoying kernel messages but the machine continues on, recovers, and eventually the memory operations all succeed"
And:
"> Well... why are all these EBUSY's occurring? It sounds inefficient
Quoted 2 lines
(at least) but if it is expected, normal and unavoidable then perhaps we should just remove that message altogether?
I don't have an answer to that question. To be honest, I haven't looked real hard. We never had this at all, then it started out of the blue, but only on our Dell 730xd machines (and it hits all of them), but no other classes or brands of machines. And we have our 730xd machines loaded up with different brands and models of cards (for instance one dedicated to mlx4 hardware, one for qib, one for mlx5, an ocrdma/cxgb4 combo, etc), so the fact that it hit all of the machines meant it wasn't tied to any particular brand/model of RDMA hardware. To me, it always smelled of a hardware oddity specific to maybe the CPUs or mainboard chipsets in these machines, so given that I'm not an mm expert anyway, I never chased it down.
A few other relevant details: it showed up somewhere around 4.8/4.9 or thereabouts. It never happened before, but the prinkt has been there since the 3.18 days, so possibly the test to trigger this message was changed, or something else in the allocator changed such that the situation started happening on these machines?
And, like I said, it is specific to our 730xd machines (but they are all identical, so that could mean it's something like their specific ram configuration is causing the allocator to hit this on these machine but not on other machines in the cluster, I don't want to say it's necessarily the model of chipset or CPU, there are other bits of identicalness between these machines)"
--- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/page_alloc.c +1 -1
@@ -7567,7 +7567,7 @@ int alloc_contig_range(unsigned long sta/* Make sure the range is really isolated. */ if (test_pages_isolated (outer_start, end, false)) { -pr_info ("%s: [%lx, %lx) PFNs busy\n" , +pr_info_ratelimited ("%s: [%lx, %lx) PFNs busy\n" , __func__, outer_start, end); ret = -EBUSY ; goto done;
Greg Kroah-Hartman
maintainerPATCH 2/65 mm: fix list corruptions on shmem shrinklist
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit d041353dc98a6339182cd6f628b4c8f111278cb3 upstream.
We saw many list corruption warnings on shmem shrinklist:
WARNING: CPU: 18 PID: 177 at lib/list_debug.c:59 __list_del_entry+0x9e/0xc0
list_del corruption. prev->next should be ffff9ae5694b82d8, but was ffff9ae5699ba960
Modules linked in: intel_rapl sb_edac edac_core x86_pkg_temp_thermal coretemp iTCO_wdt iTCO_vendor_support crct10dif_pclmul crc32_pclmul ghash_clmulni_intel raid0 dcdbas shpchp wmi hed i2c_i801 ioatdma lpc_ich i2c_smbus acpi_cpufreq tcp_diag inet_diag sch_fq_codel ipmi_si ipmi_devintf ipmi_msghandler igb ptp crc32c_intel pps_core i2c_algo_bit i2c_core dca ipv6 crc_ccitt
CPU: 18 PID: 177 Comm: kswapd1 Not tainted 4.9.34-t3.el7.twitter.x86_64 #1
Hardware name: Dell Inc. PowerEdge C6220/0W6W6G, BIOS 2.2.3 11/07/2013
Call Trace:
dump_stack+0x4d/0x66
__warn+0xcb/0xf0
warn_slowpath_fmt+0x4f/0x60
__list_del_entry+0x9e/0xc0
shmem_unused_huge_shrink+0xfa/0x2e0
shmem_unused_huge_scan+0x20/0x30
super_cache_scan+0x193/0x1a0
shrink_slab.part.41+0x1e3/0x3f0
shrink_slab+0x29/0x30
shrink_node+0xf9/0x2f0
kswapd+0x2d8/0x6c0
kthread+0xd7/0xf0
ret_from_fork+0x22/0x30
WARNING: CPU: 23 PID: 639 at lib/list_debug.c:33 __list_add+0x89/0xb0
list_add corruption. prev->next should be next (ffff9ae5699ba960), but was ffff9ae5694b82d8. (prev=ffff9ae5694b82d8).
Modules linked in: intel_rapl sb_edac edac_core x86_pkg_temp_thermal coretemp iTCO_wdt iTCO_vendor_support crct10dif_pclmul crc32_pclmul ghash_clmulni_intel raid0 dcdbas shpchp wmi hed i2c_i801 ioatdma lpc_ich i2c_smbus acpi_cpufreq tcp_diag inet_diag sch_fq_codel ipmi_si ipmi_devintf ipmi_msghandler igb ptp crc32c_intel pps_core i2c_algo_bit i2c_core dca ipv6 crc_ccitt
CPU: 23 PID: 639 Comm: systemd-udevd Tainted: G W 4.9.34-t3.el7.twitter.x86_64 #1
Hardware name: Dell Inc. PowerEdge C6220/0W6W6G, BIOS 2.2.3 11/07/2013
Call Trace:
dump_stack+0x4d/0x66
__warn+0xcb/0xf0
warn_slowpath_fmt+0x4f/0x60
__list_add+0x89/0xb0
shmem_setattr+0x204/0x230
notify_change+0x2ef/0x440
do_truncate+0x5d/0x90
path_openat+0x331/0x1190
do_filp_open+0x7e/0xe0
do_sys_open+0x123/0x200
SyS_open+0x1e/0x20
do_syscall_64+0x61/0x170
entry_SYSCALL64_slow_path+0x25/0x25The problem is that shmem_unused_huge_shrink() moves entries from the global sbinfo->shrinklist to its local lists and then releases the spinlock. However, a parallel shmem_setattr() could access one of these entries directly and add it back to the global shrinklist if it is removed, with the spinlock held.
The logic itself looks solid since an entry could be either in a local list or the global list, otherwise it is removed from one of them by list_del_init(). So probably the race condition is that, one CPU is in the middle of INIT_LIST_HEAD() but the other CPU calls list_empty() which returns true too early then the following list_add_tail() sees a corrupted entry.
list_empty_careful() is designed to fix this situation.
--- mm/shmem.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
mm/shmem.c +10 -2
@@ -1021,7 +1021,11 @@ static int shmem_setattr(struct dentry **/ if (IS_ENABLED (CONFIG_TRANSPARENT_HUGE_PAGECACHE )) {spin_lock (&sbinfo->shrinklist_lock); -if (list_empty (&info->shrinklist)) { +/* +* _careful to defend against unlocked access to +* ->shrink_list in shmem_unused_huge_shrink() +*/ +if (list_empty_careful (&info->shrinklist)) {list_add_tail (&info->shrinklist, &sbinfo->shrinklist); sbinfo->shrinklist_len++;
@@ -1817,7 +1821,11 @@ alloc_nohuge: page = shmem_alloc_and_ac* to shrink under memory pressure. */ spin_lock (&sbinfo->shrinklist_lock); -if (list_empty (&info->shrinklist)) { +/* +* _careful to defend against unlocked access to +* ->shrink_list in shmem_unused_huge_shrink() +*/ +if (list_empty_careful (&info->shrinklist)) {list_add_tail (&info->shrinklist, &sbinfo->shrinklist); sbinfo->shrinklist_len++;
Greg Kroah-Hartman
maintainerPATCH 3/65 futex: Remove unnecessary warning from get_futex_key
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mel Gorman <[email protected]>
commit 48fb6f4db940e92cfb16cd878cddd59ea6120d06 upstream.
Commit 65d8fc777f6d ("futex: Remove requirement for lock_page() in get_futex_key()") removed an unnecessary lock_page() with the side-effect that page->mapping needed to be treated very carefully.
Two defensive warnings were added in case any assumption was missed and the first warning assumed a correct application would not alter a mapping backing a futex key. Since merging, it has not triggered for any unexpected case but Mark Rutland reported the following bug triggering due to the first warning.
kernel BUG at kernel/futex.c:679!
Internal error: Oops - BUG: 0 [#1] PREEMPT SMP Modules linked in: CPU: 0 PID: 3695 Comm: syz-executor1 Not tainted 4.13.0-rc3-00020-g307fec773ba3 #3 Hardware name: linux,dummy-virt (DT) task: ffff80001e271780 task.stack: ffff000010908000 PC is at get_futex_key+0x6a4/0xcf0 kernel/futex.c:679 LR is at get_futex_key+0x6a4/0xcf0 kernel/futex.c:679 pc : [<ffff00000821ac14>] lr : [<ffff00000821ac14>] pstate: 80000145
The fact that it's a bug instead of a warning was due to an unrelated arm64 problem, but the warning itself triggered because the underlying mapping changed.
This is an application issue but from a kernel perspective it's a recoverable situation and the warning is unnecessary so this patch removes the warning. The warning may potentially be triggered with the following test program from Mark although it may be necessary to adjust NR_FUTEX_THREADS to be a value smaller than the number of CPUs in the system.
#include <linux/futex.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <unistd.h>
#define NR_FUTEX_THREADS 16
pthread_t threads[NR_FUTEX_THREADS];
void *mem;
#define MEM_PROT (PROT_READ | PROT_WRITE)
#define MEM_SIZE 65536
static int futex_wrapper(int *uaddr, int op, int val,
const struct timespec *timeout,
int *uaddr2, int val3)
{
syscall(SYS_futex, uaddr, op, val, timeout, uaddr2, val3);
}
void *poll_futex(void *unused)
{
for (;;) {
futex_wrapper(mem, FUTEX_CMP_REQUEUE_PI, 1, NULL, mem + 4, 1);
}
}
int main(int argc, char *argv[])
{
int i;
mem = mmap(NULL, MEM_SIZE, MEM_PROT,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
printf("Mapping @ %p\n", mem);
printf("Creating futex threads...\n");
for (i = 0; i < NR_FUTEX_THREADS; i++)
pthread_create(&threads[i], NULL, poll_futex, NULL);
printf("Flipping mapping...\n");
for (;;) {
mmap(mem, MEM_SIZE, MEM_PROT,
MAP_FIXED | MAP_SHARED | MAP_ANONYMOUS, -1, 0);
}
return 0;
}--- kernel/futex.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/futex.c +3 -2
@@ -670,13 +670,14 @@ again:* this reference was taken by ihold under the page lock * pinning the inode in place so i_lock was unnecessary. The * only way for this check to fail is if the inode was -* truncated in parallel so warn for now if this happens. +* truncated in parallel which is almost certainly an +* application bug. In such a case, just retry. * * We are not calling into get_futex_key_refs() in file-backed * cases, therefore a successful atomic_inc return below will * guarantee that get_futex_key() will still imply smp_mb(); (B). */ -if (WARN_ON_ONCE (!atomic_inc_not_zero (&inode->i_count))) { +if (!atomic_inc_not_zero (&inode->i_count)) {rcu_read_unlock ();put_page (page);
Greg Kroah-Hartman
maintainerPATCH 4/65 xtensa: fix cache aliasing handling code for WT cache
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit 6d0f581d1768d3eaba15776e7dd1fdfec10cfe36 upstream.
Currently building kernel for xtensa core with aliasing WT cache fails with the following messages:
mm/memory.c:2152: undefined reference to flush_dcache_page' mm/memory.c:2332: undefined reference to local_flush_cache_page' mm/memory.c:1919: undefined reference to local_flush_cache_range' mm/memory.c:4179: undefined reference to copy_to_user_page' mm/memory.c:4183: undefined reference to `copy_from_user_page'
This happens because implementation of these functions is only compiled when data cache is WB, which looks wrong: even when data cache doesn't need flushing it still needs invalidation. The functions like __flush_[invalidate_]dcache_* are correctly defined for both WB and WT caches (and even if they weren't that'd still be ok, just slower).
Fix this by providing the same implementation of the above functions for both WB and WT cache.
--- arch/xtensa/mm/cache.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
arch/xtensa/mm/cache.c +3 -7
@@ -120,10 +120,6 @@ void copy_user_highpage(struct page *dstpreempt_enable (); } -#endif /* DCACHE_WAY_SIZE > PAGE_SIZE */ - -#if (DCACHE_WAY_SIZE >PAGE_SIZE ) &&XCHAL_DCACHE_IS_WRITEBACK -/* * Any time the kernel writes to a user page cache page, or it is about to * read from a page cache page this routine is called.
@@ -208,7 +204,7 @@ void local_flush_cache_page(struct vm_ar __invalidate_icache_page_alias(virt, phys); } -#endif +#endif /* DCACHE_WAY_SIZE > PAGE_SIZE */ void update_mmu_cache (struct vm_area_struct * vma,unsigned long addr,pte_t *ptep)
@@ -225,7 +221,7 @@ update_mmu_cache(struct vm_area_struct *flush_tlb_page (vma, addr); -#if (DCACHE_WAY_SIZE >PAGE_SIZE ) &&XCHAL_DCACHE_IS_WRITEBACK +#if (DCACHE_WAY_SIZE >PAGE_SIZE )if (!PageReserved (page) &&test_bit (PG_arch_1, &page->flags)) {unsigned long phys =page_to_phys (page);
@@ -256,7 +252,7 @@ update_mmu_cache(struct vm_area_struct ** flush_dcache_page() on the page. */ -#if (DCACHE_WAY_SIZE >PAGE_SIZE ) &&XCHAL_DCACHE_IS_WRITEBACK +#if (DCACHE_WAY_SIZE >PAGE_SIZE ) void copy_to_user_page(struct vm_area_struct *vma, struct page *page, unsigned long vaddr, void *dst, const void *src,
Greg Kroah-Hartman
maintainerPATCH 5/65 xtensa: mm/cache: add missing EXPORT_SYMBOLs
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit bc652eb6a0d5cffaea7dc8e8ad488aab2a1bf1ed upstream.
Functions clear_user_highpage, copy_user_highpage, flush_dcache_page, local_flush_cache_range and local_flush_cache_page may be used from modules. Export them.
--- arch/xtensa/mm/cache.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/xtensa/mm/cache.c +5 -1
@@ -103,6 +103,7 @@ void clear_user_highpage(struct page *paclear_page_alias (kvaddr, paddr);preempt_enable (); } +EXPORT_SYMBOL (clear_user_highpage);void copy_user_highpage (struct page *dst,struct page *src,unsigned long vaddr,struct vm_area_struct *vma)
@@ -119,6 +120,7 @@ void copy_user_highpage(struct page *dstcopy_page_alias (dst_vaddr, src_vaddr, dst_paddr, src_paddr);preempt_enable (); } +EXPORT_SYMBOL (copy_user_highpage);/* * Any time the kernel writes to a user page cache page, or it is about to
@@ -172,7 +174,7 @@ void flush_dcache_page(struct page *page/* There shouldn't be an entry in the cache for this page anymore. */ } - +EXPORT_SYMBOL (flush_dcache_page);/* * For now, flush the whole cache. FIXME??
@@ -184,6 +186,7 @@ void local_flush_cache_range(struct vm_a__flush_invalidate_dcache_all ();__invalidate_icache_all (); } +EXPORT_SYMBOL (local_flush_cache_range);/* * Remove any entry in the cache for this page.
@@ -203,6 +206,7 @@ void local_flush_cache_page(struct vm_ar__flush_invalidate_dcache_page_alias (virt, phys); __invalidate_icache_page_alias(virt, phys); } +EXPORT_SYMBOL (local_flush_cache_page);#endif /* DCACHE_WAY_SIZE > PAGE_SIZE */
Greg Kroah-Hartman
maintainerPATCH 6/65 xtensa: dont limit csum_partial export by CONFIG_NET
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit 7f81e55c737a8fa82c71f290945d729a4902f8d2 upstream.
csum_partial and csum_partial_copy_generic are defined unconditionally and are available even when CONFIG_NET is disabled. They are used not only by the network drivers, but also by scsi and media. Don't limit these functions export by CONFIG_NET.
--- arch/xtensa/kernel/xtensa_ksyms.c | 2 -- 1 file changed, 2 deletions(-)
arch/xtensa/kernel/xtensa_ksyms.c +0 -2
@@ -94,13 +94,11 @@ unsigned long __sync_fetch_and_or_4(unsi }EXPORT_SYMBOL (__sync_fetch_and_or_4); -#ifdef CONFIG_NET /* * Networking support */ EXPORT_SYMBOL (csum_partial);EXPORT_SYMBOL (csum_partial_copy_generic); -#endif /* CONFIG_NET */ /* * Architecture-specific symbols
Greg Kroah-Hartman
maintainerPATCH 7/65 xfs: Fix leak of discard bio
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit ea7bd56fa309d10a41b1041827a63c0746c47554 upstream.
The bio describing discard operation is allocated by __blkdev_issue_discard() which returns us a reference to it. That reference is never released and thus we leak this bio. Drop the bio reference once it completes in xlog_discard_endio().
--- fs/xfs/xfs_log_cil.c | 1 + 1 file changed, 1 insertion(+)
fs/xfs/xfs_log_cil.c +1 -0
@@ -519,6 +519,7 @@ xlog_discard_endio(INIT_WORK (&ctx->discard_endio_work, xlog_discard_endio_work);queue_work (xfs_discard_wq, &ctx->discard_endio_work); +bio_put (bio); } static void
Greg Kroah-Hartman
maintainerPATCH 8/65 pinctrl: armada-37xx: Fix number of pin in south bridge
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory CLEMENT <[email protected]>
commit 6b67c3906cd74d88da4f6717b4b294bd52fce56a upstream.
On the south bridge we have pin from to 29, so it gives 30 pins (and not 29).
Without this patch the kernel complain with the following traces:
cat /sys/kernel/debug/pinctrl/d0018800.pinctrl/pingroups
[ 154.530205] armada-37xx-pinctrl d0018800.pinctrl: failed to get pin(29) name [ 154.537567] ------------[ cut here ]------------ [ 154.542348] WARNING: CPU: 1 PID: 1347 at /home/gclement/open/kernel/marvell-mainline-linux/drivers/pinctrl/core.c:1610 pinctrl_groups_show+0x15c/0x1a0 [ 154.555918] Modules linked in: [ 154.558890] CPU: 1 PID: 1347 Comm: cat Tainted: G W 4.13.0-rc1-00001-g19e1b9fa219d #525 [ 154.568316] Hardware name: Marvell Armada 3720 Development Board DB-88F3720-DDR3 (DT) [ 154.576311] task: ffff80001d32d100 task.stack: ffff80001bdc0000 [ 154.583048] PC is at pinctrl_groups_show+0x15c/0x1a0 [ 154.587816] LR is at pinctrl_groups_show+0x148/0x1a0 [ 154.592847] pc : [<ffff0000083e3adc>] lr : [<ffff0000083e3ac8>] pstate: 00000145 [ 154.600840] sp : ffff80001bdc3c80 [ 154.604255] x29: ffff80001bdc3c80 x28: 00000000f7750000 [ 154.609825] x27: ffff80001d05d198 x26: 0000000000000009 [ 154.615224] x25: ffff0000089ead20 x24: 0000000000000002 [ 154.620705] x23: ffff000008c8e1d0 x22: ffff80001be55700 [ 154.626187] x21: ffff80001d05d100 x20: 0000000000000005 [ 154.631667] x19: 0000000000000006 x18: 0000000000000010 [ 154.637238] x17: 0000000000000000 x16: ffff0000081fc4b8 [ 154.642726] x15: 0000000000000006 x14: ffff0000899e537f [ 154.648214] x13: ffff0000099e538d x12: 206f742064656c69 [ 154.653613] x11: 6166203a6c727463 x10: 0000000005f5e0ff [ 154.659094] x9 : ffff80001bdc38c0 x8 : 286e697020746567 [ 154.664576] x7 : ffff000008551870 x6 : 000000000000011b [ 154.670146] x5 : 0000000000000000 x4 : 0000000000000000 [ 154.675544] x3 : 0000000000000000 x2 : 0000000000000000 [ 154.681025] x1 : ffff000008c8e1d0 x0 : ffff80001be55700 [ 154.686507] Call trace: [ 154.688668] Exception stack(0xffff80001bdc3ab0 to 0xffff80001bdc3be0) [ 154.695224] 3aa0: 0000000000000006 0001000000000000 [ 154.703310] 3ac0: ffff80001bdc3c80 ffff0000083e3adc ffff80001bdc3bb0 00000000ffffffd8 [ 154.711304] 3ae0: 4554535953425553 6f6674616c703d4d 4349564544006d72 6674616c702b3d45 [ 154.719478] 3b00: 313030643a6d726f 6e69702e30303838 ffff80006c727463 ffff0000089635d8 [ 154.727562] 3b20: ffff80001d1ca0cb ffff000008af0fa4 ffff80001bdc3b40 ffff000008c8e1dc [ 154.735648] 3b40: ffff80001bdc3bc0 ffff000008223174 ffff80001be55700 ffff000008c8e1d0 [ 154.743731] 3b60: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 [ 154.752354] 3b80: 000000000000011b ffff000008551870 286e697020746567 ffff80001bdc38c0 [ 154.760446] 3ba0: 0000000005f5e0ff 6166203a6c727463 206f742064656c69 ffff0000099e538d [ 154.767910] 3bc0: ffff0000899e537f 0000000000000006 ffff0000081fc4b8 0000000000000000 [ 154.776085] [<ffff0000083e3adc>] pinctrl_groups_show+0x15c/0x1a0 [ 154.782823] [<ffff000008222abc>] seq_read+0x184/0x460 [ 154.787505] [<ffff000008344120>] full_proxy_read+0x60/0xa8 [ 154.793431] [<ffff0000081f9bec>] __vfs_read+0x1c/0x110 [ 154.799001] [<ffff0000081faff4>] vfs_read+0x84/0x140 [ 154.803860] [<ffff0000081fc4fc>] SyS_read+0x44/0xa0 [ 154.808983] [<ffff000008082f30>] el0_svc_naked+0x24/0x28 [ 154.814459] ---[ end trace 4cbb00a92d616b95 ]---
for Armada 37xx")
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +1 -1
@@ -176,7 +176,7 @@ const struct armada_37xx_pin_data armada };const struct armada_37xx_pin_data armada_37xx_pin_sb = { - .nr_pins =29 , + .nr_pins =30 , .name ="GPIO2" , .groups = armada_37xx_sb_groups, .ngroups =ARRAY_SIZE (armada_37xx_sb_groups),
Greg Kroah-Hartman
maintainerPATCH 9/65 mtd: nand: atmel: Fix DT backward compatibility in pmecc.c
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 3aa0907675a38498d8f2d343e94207ad28a117cf upstream.
PMECC caps extraction from old DT bindings is broken, thus leading to erroneous EL registers offset, which in turn make HW ECC unusable on sama5d2 when old bindings are in use.
Passing the NAND dev node instead of the NFC node to of_match_node() solves the problem.
--- drivers/mtd/nand/atmel/pmecc.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-)
drivers/mtd/nand/atmel/pmecc.c +6 -15
@@ -945,6 +945,7 @@ struct atmel_pmecc *devm_atmel_pmecc_get*/ struct platform_device *pdev =to_platform_device (userdev);const struct atmel_pmecc_caps *caps; +const struct of_device_id *match;/* No PMECC engine available. */ if (!of_property_read_bool(userdev->of_node,
@@ -953,21 +954,11 @@ struct atmel_pmecc *devm_atmel_pmecc_get caps = &at91sam9g45_caps; -/* -* Try to find the NFC subnode and extract the associated caps -* from there. -*/ - np =of_find_compatible_node (userdev->of_node,NULL , -"atmel,sama5d3-nfc" ); -if (np) { -const struct of_device_id *match; - - match =of_match_node (atmel_pmecc_legacy_match, np); -if (match && match->data) - caps = match->data; - -of_node_put (np); - } +/* Find the caps associated to the NAND dev node. */ + match =of_match_node (atmel_pmecc_legacy_match, + userdev->of_node); +if (match && match->data) + caps = match->data; pmecc =atmel_pmecc_create (pdev, caps,1 ,2 ); }
Greg Kroah-Hartman
maintainerPATCH 10/65 mtd: nand: Fix timing setup for NANDs that do not support SET FEATURES
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit a11bf5ed951f8900d244d09eb03a888b59c7fc82 upstream.
Some ONFI NANDs do not support the SET/GET FEATURES commands, which, according to the spec, is perfectly valid.
On these NANDs we can't set a specific timing mode using the "timing mode" feature, and we should assume the NAND does not require any setup to enter a specific timing mode.
--- drivers/mtd/nand/nand_base.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/mtd/nand/nand_base.c +3 -1
@@ -1102,7 +1102,9 @@ static int nand_setup_data_interface(str* Ensure the timing mode has been changed on the chip side * before changing timings on the controller side. */ -if (chip->onfi_version) { +if (chip->onfi_version && + (le16_to_cpu (chip->onfi_params.opt_cmd) & +ONFI_OPT_CMD_SET_GET_FEATURES )) {u8 tmode_param[ONFI_SUBFEATURE_PARAM_LEN ] = { chip->onfi_timing_mode_default, };
Greg Kroah-Hartman
maintainerPATCH 11/65 mtd: nand: Declare tBERS, tR and tPROG as u64 to avoid integer overflow
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 6d29231000bbe0fb9e4893a9c68151ffdd3b5469 upstream.
All timings in nand_sdr_timings are expressed in picoseconds but some of them may not fit in an u32.
--- drivers/mtd/nand/nand_timings.c | 6 +++--- include/linux/mtd/nand.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-)
drivers/mtd/nand/nand_timings.c +3 -3
@@ -311,9 +311,9 @@ int onfi_init_data_interface(struct nandstruct nand_sdr_timings *timings = &iface->timings.sdr;/* microseconds -> picoseconds */ - timings->tPROG_max =1000000UL *le16_to_cpu (params->t_prog); - timings->tBERS_max =1000000UL *le16_to_cpu (params->t_bers); - timings->tR_max =1000000UL *le16_to_cpu (params->t_r); + timings->tPROG_max =1000000ULL *le16_to_cpu (params->t_prog); + timings->tBERS_max =1000000ULL *le16_to_cpu (params->t_bers); + timings->tR_max =1000000ULL *le16_to_cpu (params->t_r);/* nanoseconds -> picoseconds */ timings->tCCS_min =1000UL *le16_to_cpu (params->t_ccs);
include/linux/mtd/nand.h +3 -3
@@ -638,10 +638,10 @@ struct nand_buffers {* @tWW_min: WP# transition to WE# low */ struct nand_sdr_timings { -u32 tBERS_max; +u64 tBERS_max;u32 tCCS_min; -u32 tPROG_max; -u32 tR_max; +u64 tPROG_max; +u64 tR_max;u32 tALH_min;u32 tADL_min;u32 tALS_min;
Greg Kroah-Hartman
maintainerPATCH 12/65 iscsi-target: fix memory leak in iscsit_setup_text_cmd()
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Varun Prakash <[email protected]>
commit ea8dc5b4cd2195ee582cae28afa4164c6dea1738 upstream.
On receiving text request iscsi-target allocates buffer for payload in iscsit_handle_text_cmd() and assigns buffer pointer to cmd->text_in_ptr, this buffer is currently freed in iscsit_release_cmd(), if iscsi-target sets 'C' bit in text response then it will receive another text request from the initiator with ttt != 0xffffffff in this case iscsi-target will find cmd using itt and call iscsit_setup_text_cmd() which will set cmd->text_in_ptr to NULL without freeing previously allocated buffer.
This patch fixes this issue by calling kfree(cmd->text_in_ptr) in iscsit_setup_text_cmd() before assigning NULL to it.
For the first text request cmd->text_in_ptr is NULL as cmd is memset to 0 in iscsit_allocate_cmd().
--- drivers/target/iscsi/iscsi_target.c | 1 + 1 file changed, 1 insertion(+)
drivers/target/iscsi/iscsi_target.c +1 -0
@@ -2173,6 +2173,7 @@ iscsit_setup_text_cmd(struct iscsi_conn cmd->cmd_sn =be32_to_cpu (hdr->cmdsn); cmd->exp_stat_sn =be32_to_cpu (hdr->exp_statsn); cmd->data_direction =DMA_NONE ; +kfree (cmd->text_in_ptr); cmd->text_in_ptr =NULL ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 13/65 iscsi-target: Fix iscsi_np reset hung task during parallel delete
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 978d13d60c34818a41fc35962602bdfa5c03f214 upstream.
This patch fixes a bug associated with iscsit_reset_np_thread() that can occur during parallel configfs rmdir of a single iscsi_np used across multiple iscsi-target instances, that would result in hung task(s) similar to below where configfs rmdir process context was blocked indefinately waiting for iscsi_np->np_restart_comp to finish:
[ 6726.112076] INFO: task dcp_proxy_node_:15550 blocked for more than 120 seconds. [ 6726.119440] Tainted: G W O 4.1.26-3321 #2 [ 6726.125045] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 6726.132927] dcp_proxy_node_ D ffff8803f202bc88 0 15550 1 0x00000000 [ 6726.140058] ffff8803f202bc88 ffff88085c64d960 ffff88083b3b1ad0 ffff88087fffeb08 [ 6726.147593] ffff8803f202c000 7fffffffffffffff ffff88083f459c28 ffff88083b3b1ad0 [ 6726.155132] ffff88035373c100 ffff8803f202bca8 ffffffff8168ced2 ffff8803f202bcb8 [ 6726.162667] Call Trace: [ 6726.165150] [<ffffffff8168ced2>] schedule+0x32/0x80 [ 6726.170156] [<ffffffff8168f5b4>] schedule_timeout+0x214/0x290 [ 6726.176030] [<ffffffff810caef2>] ? __send_signal+0x52/0x4a0 [ 6726.181728] [<ffffffff8168d7d6>] wait_for_completion+0x96/0x100 [ 6726.187774] [<ffffffff810e7c80>] ? wake_up_state+0x10/0x10 [ 6726.193395] [<ffffffffa035d6e2>] iscsit_reset_np_thread+0x62/0xe0 [iscsi_target_mod] [ 6726.201278] [<ffffffffa0355d86>] iscsit_tpg_disable_portal_group+0x96/0x190 [iscsi_target_mod] [ 6726.210033] [<ffffffffa0363f7f>] lio_target_tpg_store_enable+0x4f/0xc0 [iscsi_target_mod] [ 6726.218351] [<ffffffff81260c5a>] configfs_write_file+0xaa/0x110 [ 6726.224392] [<ffffffff811ea364>] vfs_write+0xa4/0x1b0 [ 6726.229576] [<ffffffff811eb111>] SyS_write+0x41/0xb0 [ 6726.234659] [<ffffffff8169042e>] system_call_fastpath+0x12/0x71
It would happen because each iscsit_reset_np_thread() sets state to ISCSI_NP_THREAD_RESET, sends SIGINT, and then blocks waiting for completion on iscsi_np->np_restart_comp.
However, if iscsi_np was active processing a login request and more than a single iscsit_reset_np_thread() caller to the same iscsi_np was blocked on iscsi_np->np_restart_comp, iscsi_np kthread process context in __iscsi_target_login_thread() would flush pending signals and only perform a single completion of np->np_restart_comp before going back to sleep within transport specific iscsit_transport->iscsi_accept_np code.
To address this bug, add a iscsi_np->np_reset_count and update __iscsi_target_login_thread() to keep completing np->np_restart_comp until ->np_reset_count has reached zero.
--- drivers/target/iscsi/iscsi_target.c | 1 + drivers/target/iscsi/iscsi_target_login.c | 7 +++++-- include/target/iscsi/iscsi_target_core.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-)
drivers/target/iscsi/iscsi_target.c +1 -0
@@ -418,6 +418,7 @@ int iscsit_reset_np_thread(return 0 ; } np->np_thread_state =ISCSI_NP_THREAD_RESET ; +atomic_inc (&np->np_reset_count);if (np->np_thread) {spin_unlock_bh (&np->np_thread_lock);
drivers/target/iscsi/iscsi_target_login.c +5 -2
@@ -1237,9 +1237,11 @@ static int __iscsi_target_login_thread(sflush_signals (current);spin_lock_bh (&np->np_thread_lock); -if (np->np_thread_state ==ISCSI_NP_THREAD_RESET ) { +if (atomic_dec_if_positive (&np->np_reset_count) >=0 ) { np->np_thread_state =ISCSI_NP_THREAD_ACTIVE ; +spin_unlock_bh (&np->np_thread_lock);complete (&np->np_restart_comp); +return 1 ; }else if (np->np_thread_state ==ISCSI_NP_THREAD_SHUTDOWN ) {spin_unlock_bh (&np->np_thread_lock); goto exit;
@@ -1272,7 +1274,8 @@ static int __iscsi_target_login_thread(s goto exit; }else if (rc <0 ) {spin_lock_bh (&np->np_thread_lock); -if (np->np_thread_state ==ISCSI_NP_THREAD_RESET ) { +if (atomic_dec_if_positive (&np->np_reset_count) >=0 ) { + np->np_thread_state =ISCSI_NP_THREAD_ACTIVE ;spin_unlock_bh (&np->np_thread_lock);complete (&np->np_restart_comp);iscsit_put_transport (conn->conn_transport);
include/target/iscsi/iscsi_target_core.h +1 -0
@@ -787,6 +787,7 @@ struct iscsi_np {int np_sock_type;enum np_thread_state_table np_thread_state;bool enabled; +atomic_t np_reset_count;enum iscsi_timer_flags_table np_login_timer_flags;u32 np_exports;enum np_flags_table np_flags;
Greg Kroah-Hartman
maintainerPATCH 14/65 usb-storage: fix deadlock involving host lock and scsi_done
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit 8b52291a0743fc4db4a7495c846a6f31ee84d282 upstream.
Christoph Hellwig says that since version 4.12, the kernel switched to using blk-mq by default. The old code used a softirq for handling request completions, but blk-mq can handle completions in the caller's context. This may cause a problem for usb-storage, because it invokes the ->scsi_done callback while holding the host lock, and the completion routine sometimes tries to acquire the same lock (when running the error handler, for example).
The consequence is that the existing code will sometimes deadlock upon error completion of a SCSI command (with a lockdep warning).
This is easy enough to fix, since usb-storage doesn't really need to hold the host lock while the callback runs. It was simpler to write it that way, but moving the call outside the locked region is pretty easy and there's no downside. That's what this patch does.
--- drivers/usb/storage/usb.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/usb/storage/usb.c +12 -6
@@ -315,6 +315,7 @@ static int usb_stor_control_thread(void {struct us_data *us = (struct us_data *)__us;struct Scsi_Host *host =us_to_host (us); +struct scsi_cmnd *srb;for (;;) {usb_stor_dbg (us,"*** thread sleeping\n" );
@@ -330,6 +331,7 @@ static int usb_stor_control_thread(voidscsi_lock (host);/* When we are called with no command pending, we're done */ + srb = us->srb;if (us->srb ==NULL ) {scsi_unlock (host);mutex_unlock (&us->dev_mutex);
@@ -398,14 +400,11 @@ static int usb_stor_control_thread(void/* lock access to the state */ scsi_lock (host); -/* indicate that the command is done */ -if (us->srb->result !=DID_ABORT <<16 ) { -usb_stor_dbg (us,"scsi cmd done, result=0x%x\n" , - us->srb->result); - us->srb->scsi_done (us->srb); - }else { +/* was the command aborted? */ +if (us->srb->result ==DID_ABORT <<16 ) { SkipForAbort:usb_stor_dbg (us,"scsi command aborted\n" ); + srb =NULL ;/* Don't call srb->scsi_done() */ }/*
@@ -429,6 +428,13 @@ SkipForAbort:/* unlock the device pointers */ mutex_unlock (&us->dev_mutex); + +/* now that the locks are released, notify the SCSI core */ +if (srb) { +usb_stor_dbg (us,"scsi cmd done, result=0x%x\n" , + srb->result); + srb->scsi_done (srb); + } }/* for (;;) */ /* Wait until we are told to stop */
Greg Kroah-Hartman
maintainerPATCH 15/65 target: Fix node_acl demo-mode + uncached dynamic shutdown regression
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 6f48655facfd7f7ccfe6d252ac0fe319ab02e4dd upstream.
This patch fixes a generate_node_acls = 1 + cache_dynamic_acls = 0 regression, that was introduced by
commit 01d4d673558985d9a118e1e05026633c3e2ade9b
Author: Nicholas Bellinger <[email protected]>
Date: Wed Dec 7 12:55:54 2016 -0800
which originally had the proper list_del_init() usage, but was dropped during list review as it was thought unnecessary by HCH.
However, list_del_init() usage is required during the special generate_node_acls = 1 + cache_dynamic_acls = 0 case when transport_free_session() does a list_del(&se_nacl->acl_list), followed by target_complete_nacl() doing the same thing.
This was manifesting as a general protection fault as reported by Justin:
kernel: general protection fault: 0000 [#1] SMP kernel: Modules linked in: kernel: CPU: 0 PID: 11047 Comm: iscsi_ttx Not tainted 4.13.0-rc2.x86_64.1+ #20 kernel: Hardware name: Intel Corporation S5500BC/S5500BC, BIOS S5500.86B.01.00.0064.050520141428 05/05/2014 kernel: task: ffff88026939e800 task.stack: ffffc90007884000 kernel: RIP: 0010:target_put_nacl+0x49/0xb0 kernel: RSP: 0018:ffffc90007887d70 EFLAGS: 00010246 kernel: RAX: dead000000000200 RBX: ffff8802556ca000 RCX: 0000000000000000 kernel: RDX: dead000000000100 RSI: 0000000000000246 RDI: ffff8802556ce028 kernel: RBP: ffffc90007887d88 R08: 0000000000000001 R09: 0000000000000000 kernel: R10: ffffc90007887df8 R11: ffffea0009986900 R12: ffff8802556ce020 kernel: R13: ffff8802556ce028 R14: ffff8802556ce028 R15: ffffffff88d85540 kernel: FS: 0000000000000000(0000) GS:ffff88027fc00000(0000) knlGS:0000000000000000 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 kernel: CR2: 00007fffe36f5f94 CR3: 0000000009209000 CR4: 00000000003406f0 kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 kernel: DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 kernel: Call Trace: kernel: transport_free_session+0x67/0x140 kernel: transport_deregister_session+0x7a/0xc0 kernel: iscsit_close_session+0x92/0x210 kernel: iscsit_close_connection+0x5f9/0x840 kernel: iscsit_take_action_for_connection_exit+0xfe/0x110 kernel: iscsi_target_tx_thread+0x140/0x1e0 kernel: ? wait_woken+0x90/0x90 kernel: kthread+0x124/0x160 kernel: ? iscsit_thread_get_cpumask+0x90/0x90 kernel: ? kthread_create_on_node+0x40/0x40 kernel: ret_from_fork+0x22/0x30 kernel: Code: 00 48 89 fb 4c 8b a7 48 01 00 00 74 68 4d 8d 6c 24 08 4c
89 ef e8 e8 28 43 00 48 8b 93 20 04 00 00 48 8b 83 28 04 00 00 4c 89 ef <48> 89 42 08 48 89 10 48 b8 00 01 00 00 00 00 ad de 48 89 83 20
kernel: RIP: target_put_nacl+0x49/0xb0 RSP: ffffc90007887d70
kernel: ---[ end trace f12821adbfd46fed ]---
To address this, go ahead and use proper list_del_list() for all cases of se_nacl->acl_list deletion.
--- drivers/target/target_core_tpg.c | 4 ++-- drivers/target/target_core_transport.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/target/target_core_tpg.c +2 -2
@@ -364,7 +364,7 @@ void core_tpg_del_initiator_node_acl(strmutex_lock (&tpg->acl_node_mutex);if (acl->dynamic_node_acl) acl->dynamic_node_acl =0 ; -list_del (&acl->acl_list); +list_del_init (&acl->acl_list);mutex_unlock (&tpg->acl_node_mutex);target_shutdown_sessions (acl);
@@ -548,7 +548,7 @@ int core_tpg_deregister(struct se_portal* in transport_deregister_session(). */ list_for_each_entry_safe (nacl, nacl_tmp, &node_list, acl_list) { -list_del (&nacl->acl_list); +list_del_init (&nacl->acl_list);core_tpg_wait_for_nacl_pr_ref (nacl);core_free_device_list_for_node (nacl, se_tpg);
drivers/target/target_core_transport.c +2 -2
@@ -466,7 +466,7 @@ static void target_complete_nacl(struct }mutex_lock (&se_tpg->acl_node_mutex); -list_del (&nacl->acl_list); +list_del_init (&nacl->acl_list);mutex_unlock (&se_tpg->acl_node_mutex);core_tpg_wait_for_nacl_pr_ref (nacl);
@@ -538,7 +538,7 @@ void transport_free_session(struct se_sespin_unlock_irqrestore (&se_nacl->nacl_sess_lock, flags);if (se_nacl->dynamic_stop) -list_del (&se_nacl->acl_list); +list_del_init (&se_nacl->acl_list); }mutex_unlock (&se_tpg->acl_node_mutex);
Greg Kroah-Hartman
maintainerPATCH 16/65 fuse: initialize the flock flag in fuse_file on allocation
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mateusz Jurczyk <[email protected]>
commit 68227c03cba84a24faf8a7277d2b1a03c8959c2c upstream.
Before the patch, the flock flag could remain uninitialized for the lifespan of the fuse_file allocation. Unless set to true in fuse_file_flock(), it would remain in an indeterminate state until read in an if statement in fuse_release_common(). This could consequently lead to taking an unexpected branch in the code.
The bug was discovered by a runtime instrumentation designed to detect use of uninitialized memory in the kernel.
--- fs/fuse/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/file.c +1 -1
@@ -46,7 +46,7 @@ struct fuse_file *fuse_file_alloc(struct {struct fuse_file *ff; - ff =kmalloc (sizeof (struct fuse_file ),GFP_KERNEL ); + ff =kzalloc (sizeof (struct fuse_file ),GFP_KERNEL );if (unlikely (!ff))return NULL ;
Greg Kroah-Hartman
maintainerPATCH 17/65 i2c: designware: Some broken DSTDs use 1MiHz instead of 1MHz
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 682c6c2188f39d13548ccdc89c9888fbcb547889 upstream.
At least the Acer Iconia Tab8 / aka W1-810 uses 1MiHz instead of 1MHz for one of its busses, fix this up to 1MHz instead of failing the probe of that bus.
This fixes the accelerometer on the Acer Iconia Tab8 not working.
--- drivers/i2c/busses/i2c-designware-platdrv.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/i2c/busses/i2c-designware-platdrv.c +3 -0
@@ -254,6 +254,9 @@ static int dw_i2c_plat_probe(struct plat } acpi_speed =i2c_acpi_find_bus_speed (&pdev->dev); +/* Some broken DSTDs use 1MiHz instead of 1MHz */ +if (acpi_speed ==1048576 ) + acpi_speed =1000000 ;/* * Find bus speed from the "clock-frequency" device property, ACPI * or by using fast mode if neither is set.
Greg Kroah-Hartman
maintainerPATCH 18/65 nand: fix wrong default oob layout for small pages using soft ecc
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Raynal <[email protected]>
commit f7f8c1756e9a5f1258a7cc6b663f8451b724900f upstream.
When using soft ecc, if no ooblayout is given, the core automatically uses one of the nand_ooblayout_{sp,lp}*() functions to determine the layout inside the out of band data.
Until kernel version 4.6, struct nand_ecclayout was used for that purpose. During the migration from 4.6 to 4.7, an error shown up in the small page layout, in the case oob section is only 8 bytes long.
The layout was using three bytes (0, 1, 2) for ecc, two bytes (3, 4) as free bytes, one byte (5) for bad block marker and finally two bytes (6, 7) as free bytes, as shown there:
[linux-4.6] drivers/mtd/nand/nand_base.c:52
static struct nand_ecclayout nand_oob_8 = {
.eccbytes = 3,
.eccpos = {0, 1, 2},
.oobfree = {
{.offset = 3,
.length = 2},
{.offset = 6,
.length = 2} }
};This fixes the current implementation which is incoherent. It references bit 3 at the same time as an ecc byte and a free byte.
Furthermore, it is clear with the previous implementation that there is only one ecc section with 8 bytes oob sections. We shall return -ERANGE in the nand_ooblayout_ecc_sp() function when asked for the second section.
--- drivers/mtd/nand/nand_base.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/mtd/nand/nand_base.c +7 -1
@@ -65,8 +65,14 @@ static int nand_ooblayout_ecc_sp(structif (!section) { oobregion->offset =0 ; - oobregion->length =4 ; +if (mtd->oobsize ==16 ) + oobregion->length =4 ; +else + oobregion->length =3 ; }else { +if (mtd->oobsize ==8 ) +return -ERANGE ; + oobregion->offset =6 ; oobregion->length = ecc->total -4 ; }
Greg Kroah-Hartman
maintainerPATCH 19/65 mmc: mmc: correct the logic for setting HS400ES signal voltage
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haibo Chen <[email protected]>
commit 92ddd95919466de5d34f3cb43635da9a7f9ab814 upstream.
Change the default err value to -EINVAL, make sure the card only has type EXT_CSD_CARD_TYPE_HS400_1_8V also do the signal voltage setting when select hs400es mode.
--- drivers/mmc/core/mmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/core/mmc.c +1 -1
@@ -1288,7 +1288,7 @@ out_err:static int mmc_select_hs400es (struct mmc_card *card) {struct mmc_host *host = card->host; -int err =0 ; +int err = -EINVAL ;u8 val;if (!(host->caps &MMC_CAP_8_BIT_DATA )) {
Greg Kroah-Hartman
maintainerPATCH 20/65 nfs/flexfiles: fix leak of nfs4_ff_ds_version arrays
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weston Andros Adamson <[email protected]>
commit 1feb26162bee7b2f110facfec71b5c7bdbc7d14d upstream.
The client was freeing the nfs4_ff_layout_ds, but not the contained nfs4_ff_ds_version array.
--- fs/nfs/flexfilelayout/flexfilelayoutdev.c | 1 + 1 file changed, 1 insertion(+)
fs/nfs/flexfilelayout/flexfilelayoutdev.c +1 -0
@@ -32,6 +32,7 @@ void nfs4_ff_layout_free_deviceid(struct {nfs4_print_deviceid (&mirror_ds->id_node.deviceid);nfs4_pnfs_ds_put (mirror_ds->ds); +kfree (mirror_ds->ds_versions);kfree_rcu (mirror_ds, id_node.rcu); }
Greg Kroah-Hartman
maintainerPATCH 21/65 drm/bridge: tc358767: fix probe without attached output node
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas Stach <[email protected]>
commit d630213f2a47933e1037909273a20023ba3e598d upstream.
The output node of the TC358767 is only used if another bridge is chained behind it. Panels attached to the TC358767 can be detected using the usual DP AUX probing. This restores the old behavior of ignoring the output if no endpoint is found.
--- drivers/gpu/drm/bridge/tc358767.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/tc358767.c +1 -1
@@ -1255,7 +1255,7 @@ static int tc_probe(struct i2c_client *c/* port@2 is the output port */ ret =drm_of_find_panel_or_bridge (dev->of_node,2 ,0 , &tc->panel,NULL ); -if (ret) +if (ret && ret != -ENODEV )return ret;/* Shut down GPIO is optional */
Greg Kroah-Hartman
maintainerPATCH 22/65 drm/etnaviv: Fix off-by-one error in reloc checking
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wladimir J. van der Laan <[email protected]>
commit d6f756e09f01ea7a0efbbcef269a1e384a35d824 upstream.
A relocation pointing to the last four bytes of a buffer can legitimately happen in the case of small vertex buffers.
--- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +2 -2
@@ -270,8 +270,8 @@ static int submit_reloc(struct etnaviv_gif (ret)return ret; -if (r->reloc_offset >= bo->obj->base.size -sizeof (*ptr)) { -DRM_ERROR ("relocation %u outside object" , i); +if (r->reloc_offset > bo->obj->base.size -sizeof (*ptr)) { +DRM_ERROR ("relocation %u outside object\n" , i);return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 23/65 drm/i915: Fix out-of-bounds array access in bdw_load_gamma_lut
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maarten Lankhorst <[email protected]>
commit 5279fc7724ae3a82c9cfe5b09c1fb07ff0e41056 upstream.
bdw_load_gamma_lut is writing beyond the array to the maximum value. The intend of the function is to clamp values > 1 to 1, so write the intended color to the max register.
This fixes the following KASAN warning:
[ 197.020857] [IGT] kms_pipe_color: executing [ 197.063434] [IGT] kms_pipe_color: starting subtest ctm-0-25-pipe0 [ 197.078989] ================================================================== [ 197.079127] BUG: KASAN: slab-out-of-bounds in bdw_load_gamma_lut.isra.2+0x3b9/0x570 [i915] [ 197.079188] Read of size 2 at addr ffff8800d38db150 by task kms_pipe_color/1839 [ 197.079208] CPU: 2 PID: 1839 Comm: kms_pipe_color Tainted: G U 4.13.0-rc1-patser+ #5211 [ 197.079215] Hardware name: NUC5i7RYB, BIOS RYBDWi35.86A.0246.2015.0309.1355 03/09/2015 [ 197.079220] Call Trace: [ 197.079230] dump_stack+0x68/0x9e [ 197.079239] print_address_description+0x6f/0x250 [ 197.079251] kasan_report+0x216/0x370 [ 197.079374] ? bdw_load_gamma_lut.isra.2+0x3b9/0x570 [i915] [ 197.079451] ? gen8_write16+0x4e0/0x4e0 [i915] [ 197.079460] __asan_report_load2_noabort+0x14/0x20 [ 197.079535] bdw_load_gamma_lut.isra.2+0x3b9/0x570 [i915] [ 197.079612] broadwell_load_luts+0x1df/0x550 [i915] [ 197.079690] intel_color_load_luts+0x7b/0x80 [i915] [ 197.079764] intel_begin_crtc_commit+0x138/0x760 [i915] [ 197.079783] drm_atomic_helper_commit_planes_on_crtc+0x1a3/0x820 [drm_kms_helper] [ 197.079859] ? intel_pre_plane_update+0x571/0x580 [i915] [ 197.079937] intel_update_crtc+0x238/0x330 [i915] [ 197.080016] intel_update_crtcs+0x10f/0x210 [i915] [ 197.080092] intel_atomic_commit_tail+0x1552/0x3340 [i915] [ 197.080101] ? _raw_spin_unlock+0x3c/0x40 [ 197.080110] ? __queue_work+0xb40/0xbf0 [ 197.080188] ? skl_update_crtcs+0xc00/0xc00 [i915] [ 197.080195] ? trace_hardirqs_on+0xd/0x10 [ 197.080269] ? intel_atomic_commit_ready+0x128/0x13c [i915] [ 197.080329] ? __i915_sw_fence_complete+0x5b8/0x6d0 [i915] [ 197.080336] ? debug_object_activate+0x39e/0x580 [ 197.080397] ? i915_sw_fence_await+0x30/0x30 [i915] [ 197.080409] ? __might_sleep+0x15b/0x180 [ 197.080483] intel_atomic_commit+0x944/0xa70 [i915] [ 197.080490] ? refcount_dec_and_test+0x11/0x20 [ 197.080567] ? intel_atomic_commit_tail+0x3340/0x3340 [i915] [ 197.080597] ? drm_atomic_crtc_set_property+0x303/0x580 [drm] [ 197.080674] ? intel_atomic_commit_tail+0x3340/0x3340 [i915] [ 197.080704] drm_atomic_commit+0xd7/0xe0 [drm] [ 197.080722] drm_atomic_helper_crtc_set_property+0xec/0x130 [drm_kms_helper] [ 197.080749] drm_mode_crtc_set_obj_prop+0x7d/0xb0 [drm] [ 197.080775] drm_mode_obj_set_property_ioctl+0x50b/0x5d0 [drm] [ 197.080783] ? __might_fault+0x104/0x180 [ 197.080809] ? drm_mode_obj_find_prop_id+0x160/0x160 [drm] [ 197.080838] ? drm_mode_obj_find_prop_id+0x160/0x160 [drm] [ 197.080861] drm_ioctl_kernel+0x154/0x1a0 [drm] [ 197.080885] drm_ioctl+0x624/0x8f0 [drm] [ 197.080910] ? drm_mode_obj_find_prop_id+0x160/0x160 [drm] [ 197.080934] ? drm_getunique+0x210/0x210 [drm] [ 197.080943] ? __handle_mm_fault+0x1bd0/0x1ce0 [ 197.080949] ? lock_downgrade+0x610/0x610 [ 197.080957] ? __lru_cache_add+0x15a/0x180 [ 197.080967] do_vfs_ioctl+0xd92/0xe40 [ 197.080975] ? ioctl_preallocate+0x1b0/0x1b0 [ 197.080982] ? selinux_capable+0x20/0x20 [ 197.080991] ? __do_page_fault+0x7b7/0x9a0 [ 197.080997] ? lock_downgrade+0x5bb/0x610 [ 197.081007] ? security_file_ioctl+0x57/0x90 [ 197.081016] SyS_ioctl+0x4e/0x80 [ 197.081024] entry_SYSCALL_64_fastpath+0x18/0xad [ 197.081030] RIP: 0033:0x7f61f287a987 [ 197.081035] RSP: 002b:00007fff7d44d188 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 [ 197.081043] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f61f287a987 [ 197.081048] RDX: 00007fff7d44d1c0 RSI: 00000000c01864ba RDI: 0000000000000003 [ 197.081053] RBP: 00007f61f2b3eb00 R08: 0000000000000059 R09: 0000000000000000 [ 197.081058] R10: 0000002ea5c4a290 R11: 0000000000000246 R12: 00007f61f2b3eb58 [ 197.081063] R13: 0000000000001010 R14: 00007f61f2b3eb58 R15: 0000000000002702
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101659
--- drivers/gpu/drm/i915/intel_color.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/i915/intel_color.c +1 -0
@@ -398,6 +398,7 @@ static void bdw_load_gamma_lut(struct dr }/* Program the max register to clamp values > 1.0. */ + i = lut_size -1 ;I915_WRITE (PREC_PAL_GC_MAX (pipe,0 ),drm_color_lut_extract (lut[i].red,16 )); I915_WRITE(PREC_PAL_GC_MAX(pipe, 1),
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Greg Kroah-Hartman
maintainerPATCH 24/65 USB: serial: option: add D-Link DWM-222 device ID
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hector Martin <[email protected]>
commit fd1b8668af59a11bb754a6c9b0051c6c5ce73b74 upstream.
Add device id for D-Link DWM-222.
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -2025,6 +2025,8 @@ static const struct usb_device_id option { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d04, 0xff) }, /* D-Link DWM-158 */ { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e19, 0xff), /* D-Link DWM-221 B1 */ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e35, 0xff), /* D-Link DWM-222 */ + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x7e11, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/A3 */
Greg Kroah-Hartman
maintainerPATCH 25/65 USB: serial: cp210x: add support for Qivicon USB ZigBee dongle
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Triller <[email protected]>
commit 9585e340db9f6cc1c0928d82c3a23cc4460f0a3f upstream.
The German Telekom offers a ZigBee USB Stick under the brand name Qivicon for their SmartHome Home Base in its 1. Generation. The productId is not known by the according kernel module, this patch adds support for it.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -142,6 +142,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */ + { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */ { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
Greg Kroah-Hartman
maintainerPATCH 26/65 USB: serial: pl2303: add new ATEN device id
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit 3b6bcd3d093c698d32e93d4da57679b8fbc5e01e upstream.
This adds a new ATEN device id for a new pl2303-based device.
--- drivers/usb/serial/pl2303.c | 2 ++ drivers/usb/serial/pl2303.h | 1 + 2 files changed, 3 insertions(+)
drivers/usb/serial/pl2303.c +2 -0
@@ -52,6 +52,8 @@ static const struct usb_device_id id_tab { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID), .driver_info = PL2303_QUIRK_ENDPOINT_HACK }, + { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC485), + .driver_info = PL2303_QUIRK_ENDPOINT_HACK }, { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) }, { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) }, { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
drivers/usb/serial/pl2303.h +1 -0
@@ -27,6 +27,7 @@#define ATEN_VENDOR_ID 0x0557#define ATEN_VENDOR_ID2 0x0547#define ATEN_PRODUCT_ID 0x2008 +#define ATEN_PRODUCT_UC485 0x2021#define ATEN_PRODUCT_ID2 0x2118#define IODATA_VENDOR_ID 0x04bb
Greg Kroah-Hartman
maintainerPATCH 27/65 usb: musb: fix tx fifo flush handling again
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bin Liu <[email protected]>
commit 45d73860530a14c608f410b91c6c341777bfa85d upstream.
commit 68fe05e2a451 ("usb: musb: fix tx fifo flush handling") drops the 1ms delay trying to solve the long disconnect time issue when application queued many tx urbs. However, the 1ms delay is needed for some use cases, for example, without the delay, reconnecting AR9271 WIFI dongle no longer works if the connection is dropped from the AP.
So let's add back the 1ms delay in musb_h_tx_flush_fifo(), and solve the long disconnect time problem with a separate patch for usb_hcd_flush_endpoint().
--- drivers/usb/musb/musb_host.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/musb/musb_host.c +1 -0
@@ -139,6 +139,7 @@ static void musb_h_tx_flush_fifo(struct"Could not flush host TX%d fifo: csr: %04x\n" , ep->epnum, csr)) return; +mdelay (1 ); } }
Greg Kroah-Hartman
maintainerPATCH 28/65 USB: hcd: Mark secondary HCD as dead if the primary one died
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
commit cd5a6a4fdaba150089af2afc220eae0fef74878a upstream.
Make usb_hc_died() clear the HCD_FLAG_RH_RUNNING flag for the shared HCD and set HCD_FLAG_DEAD for it, in analogy with what is done for the primary one.
Among other thigs, this prevents check_root_hub_suspended() from returning -EBUSY for dead HCDs which helps to work around system suspend issues in some situations.
This actually fixes occasional suspend failures on one of my test machines.
--- drivers/usb/core/hcd.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/core/hcd.c +2 -0
@@ -2475,6 +2475,8 @@ void usb_hc_died (struct usb_hcd *hcd) }if (usb_hcd_is_primary_hcd (hcd) && hcd->shared_hcd) { hcd = hcd->shared_hcd; +clear_bit (HCD_FLAG_RH_RUNNING , &hcd->flags); +set_bit (HCD_FLAG_DEAD , &hcd->flags);if (hcd->rh_registered) {clear_bit (HCD_FLAG_POLL_RH , &hcd->flags);
Greg Kroah-Hartman
maintainerPATCH 29/65 staging:iio:resolver:ad2s1210 fix negative IIO_ANGL_VEL read
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 105967ad68d2eb1a041bc041f9cf96af2a653b65 upstream.
gcc-7 points out an older regression:
drivers/staging/iio/resolver/ad2s1210.c: In function 'ad2s1210_read_raw':drivers/staging/iio/resolver/ad2s1210.c:515:42: error: '<<' in boolean context, did you mean '<' ? [-Werror=int-in-bool-context]
The original code had 'unsigned short' here, but incorrectly got converted to 'bool'. This reverts the regression and uses a normal type instead.
--- drivers/staging/iio/resolver/ad2s1210.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/resolver/ad2s1210.c +1 -1
@@ -472,7 +472,7 @@ static int ad2s1210_read_raw(struct iio_ long m) {struct ad2s1210_state *st =iio_priv (indio_dev); -bool negative; +u16 negative;int ret =0 ;u16 pos;s16 vel;
Greg Kroah-Hartman
maintainerPATCH 30/65 iio: aspeed-adc: wait for initial sequence.
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mykola Kostenok <[email protected]>
commit 737cc2a593782df6846b3cab7e0f64384f58364a upstream.
This patch enables adc engine at initialization time and waits for the initial sequence completion before enabling adc channels.
Without this code adc channels are not functional and shows zeros for all connected channels.
Tested on mellanox msn platform.
v1 -> v2:
Pointed by Rick Altherr:
- Wait init sequence code enabled by bool
from OF match table.
--- drivers/iio/adc/aspeed_adc.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
drivers/iio/adc/aspeed_adc.c +26 -0
@@ -22,6 +22,7 @@#include <linux/iio/iio.h> #include <linux/iio/driver.h> +#include <linux/iopoll.h> #define ASPEED_RESOLUTION_BITS 10#define ASPEED_CLOCKS_PER_SAMPLE 12
@@ -38,11 +39,17 @@#define ASPEED_ENGINE_ENABLE BIT(0) +#define ASPEED_ADC_CTRL_INIT_RDY BIT(8) + +#define ASPEED_ADC_INIT_POLLING_TIME 500 +#define ASPEED_ADC_INIT_TIMEOUT 500000 +struct aspeed_adc_model_data {const char *model_name;unsigned int min_sampling_rate;// Hz unsigned int max_sampling_rate;// Hz unsigned int vref_voltage;// mV +bool wait_init_sequence; };struct aspeed_adc_data {
@@ -211,6 +218,24 @@ static int aspeed_adc_probe(struct platf goto scaler_error; } + model_data =of_device_get_match_data (&pdev->dev); + +if (model_data->wait_init_sequence) { +/* Enable engine in normal mode. */ +writel (ASPEED_OPERATION_MODE_NORMAL |ASPEED_ENGINE_ENABLE , + data->base +ASPEED_REG_ENGINE_CONTROL ); + +/* Wait for initial sequence complete. */ + ret =readl_poll_timeout (data->base +ASPEED_REG_ENGINE_CONTROL , + adc_engine_control_reg_val, + adc_engine_control_reg_val & +ASPEED_ADC_CTRL_INIT_RDY , +ASPEED_ADC_INIT_POLLING_TIME , +ASPEED_ADC_INIT_TIMEOUT ); +if (ret) + goto scaler_error; + } +/* Start all channels in normal mode. */ clk_prepare_enable (data->clk_scaler->clk); adc_engine_control_reg_val = GENMASK(31, 16) |
@@ -270,6 +295,7 @@ static const struct aspeed_adc_model_dat .vref_voltage = 1800, // mV .min_sampling_rate = 1, .max_sampling_rate = 1000000, + .wait_init_sequence = true, };static const struct of_device_id aspeed_adc_matches[] = {
Greg Kroah-Hartman
maintainerPATCH 31/65 iio: accel: st_accel: add SPI-3wire support
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
commit a7b8829d242b1a58107e9c02b09e93aec446d55c upstream.
Add SPI Serial Interface Mode (SIM) register information in st_sensor_settings look up table to support devices (like LSM303AGR accel sensor) that allow just SPI-3wire communication mode. SIM mode has to be configured before any other operation since it is not enabled by default and the driver is not able to read without that configuration
Whilst a fairly substantial patch, the actual logic is simple and it is better to have the generic fix than a band aid.
--- drivers/iio/accel/st_accel_core.c | 32 ++++++++++++++++++++++++ drivers/iio/common/st_sensors/st_sensors_core.c | 29 +++++++++++++++++++++ include/linux/iio/common/st_sensors.h | 7 +++++ include/linux/platform_data/st_sensors_pdata.h | 2 + 4 files changed, 70 insertions(+)
drivers/iio/accel/st_accel_core.c +32 -0
@@ -166,6 +166,10 @@ static const struct st_sensor_settings s .mask_ihl = 0x02, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, + .sim = { + .addr = 0x23, + .value = BIT(0), + }, .multi_read_bit = true, .bootime = 2, },
@@ -234,6 +238,10 @@ static const struct st_sensor_settings s .mask_od = 0x40, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, + .sim = { + .addr = 0x23, + .value = BIT(0), + }, .multi_read_bit = true, .bootime = 2, },
@@ -316,6 +324,10 @@ static const struct st_sensor_settings s .en_mask = 0x08, }, }, + .sim = { + .addr = 0x24, + .value = BIT(0), + }, .multi_read_bit = false, .bootime = 2, },
@@ -379,6 +391,10 @@ static const struct st_sensor_settings s .mask_int1 = 0x04, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, + .sim = { + .addr = 0x21, + .value = BIT(1), + }, .multi_read_bit = true, .bootime = 2, /* guess */ },
@@ -437,6 +453,10 @@ static const struct st_sensor_settings s .mask_od = 0x40, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, + .sim = { + .addr = 0x21, + .value = BIT(7), + }, .multi_read_bit = false, .bootime = 2, /* guess */ },
@@ -499,6 +519,10 @@ static const struct st_sensor_settings s .addr_ihl = 0x22, .mask_ihl = 0x80, }, + .sim = { + .addr = 0x23, + .value = BIT(0), + }, .multi_read_bit = true, .bootime = 2, },
@@ -547,6 +571,10 @@ static const struct st_sensor_settings s .mask_int1 = 0x04, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, + .sim = { + .addr = 0x21, + .value = BIT(1), + }, .multi_read_bit = false, .bootime = 2, },
@@ -614,6 +642,10 @@ static const struct st_sensor_settings s .mask_ihl = 0x02, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, + .sim = { + .addr = 0x23, + .value = BIT(0), + }, .multi_read_bit = true, .bootime = 2, },
drivers/iio/common/st_sensors/st_sensors_core.c +29 -0
@@ -550,6 +550,31 @@ out: }EXPORT_SYMBOL (st_sensors_read_info_raw); +static int st_sensors_init_interface_mode (struct iio_dev *indio_dev, +const struct st_sensor_settings *sensor_settings) +{ +struct st_sensor_data *sdata =iio_priv (indio_dev); +struct device_node *np = sdata->dev->of_node; +struct st_sensors_platform_data *pdata; + + pdata = (struct st_sensors_platform_data *)sdata->dev->platform_data; +if (((np &&of_property_read_bool (np,"spi-3wire" )) || + (pdata && pdata->spi_3wire)) && sensor_settings->sim.addr) { +int err; + + err = sdata->tf->write_byte (&sdata->tb, sdata->dev, + sensor_settings->sim.addr, + sensor_settings->sim.value); +if (err <0 ) { +dev_err (&indio_dev->dev, +"failed to init interface mode\n" ); +return err; + } + } + +return 0 ; +} +int st_sensors_check_device_support (struct iio_dev *indio_dev,int num_sensors_list,const struct st_sensor_settings *sensor_settings)
@@ -574,6 +599,10 @@ int st_sensors_check_device_support(strureturn -ENODEV ; } + err =st_sensors_init_interface_mode (indio_dev, &sensor_settings[i]); +if (err <0 ) +return err; +if (sensor_settings[i].wai_addr) { err = sdata->tf->read_byte (&sdata->tb, sdata->dev, sensor_settings[i].wai_addr, &wai);
include/linux/iio/common/st_sensors.h +7 -0
@@ -105,6 +105,11 @@ struct st_sensor_fullscale {struct st_sensor_fullscale_avl fs_avl[ST_SENSORS_FULLSCALE_AVL_MAX ]; }; +struct st_sensor_sim { +u8 addr; +u8 value; +}; +/** * struct st_sensor_bdu - ST sensor device block data update * @addr: address of the register.
@@ -197,6 +202,7 @@ struct st_sensor_transfer_function {* @bdu: Block data update register. * @das: Data Alignment Selection register. * @drdy_irq: Data ready register of the sensor. +* @sim: SPI serial interface mode register of the sensor. * @multi_read_bit: Use or not particular bit for [I2C/SPI] multi-read. * @bootime: samples to discard when sensor passing from power-down to power-up. */
@@ -213,6 +219,7 @@ struct st_sensor_settings {struct st_sensor_bdu bdu;struct st_sensor_das das;struct st_sensor_data_ready_irq drdy_irq; +struct st_sensor_sim sim;bool multi_read_bit;unsigned int bootime; };
include/linux/platform_data/st_sensors_pdata.h +2 -0
@@ -17,10 +17,12 @@* Available only for accelerometer and pressure sensors. * Accelerometer DRDY on LSM330 available only on pin 1 (see datasheet). * @open_drain: set the interrupt line to be open drain if possible. +* @spi_3wire: enable spi-3wire mode. */ struct st_sensors_platform_data {u8 drdy_int_pin;bool open_drain; +bool spi_3wire; };#endif /* ST_SENSORS_PDATA_H */
Greg Kroah-Hartman
maintainerPATCH 32/65 iio: accel: bmc150: Always restore device to normal mode after suspend-resume
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit e59e18989c68a8d7941005f81ad6abc4ca682de0 upstream.
After probe we would put the device in normal mode, after a runtime suspend-resume we would put it back in normal mode. But for a regular suspend-resume we would only put it back in normal mode if triggers or events have been requested. This is not consistent and breaks reading raw values after a suspend-resume.
This commit changes the regular resume path to also unconditionally put the device back in normal mode, fixing reading of raw values not working after a regular suspend-resume cycle.
--- drivers/iio/accel/bmc150-accel-core.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/iio/accel/bmc150-accel-core.c +1 -8
@@ -193,7 +193,6 @@ struct bmc150_accel_data {struct regmap *regmap;int irq;struct bmc150_accel_interrupt interrupts[BMC150_ACCEL_INTERRUPTS ]; -atomic_t active_intr;struct bmc150_accel_trigger triggers[BMC150_ACCEL_TRIGGERS ];struct mutex mutex;u8 fifo_mode, watermark;
@@ -493,11 +492,6 @@ static int bmc150_accel_set_interrupt(st goto out_fix_power_state; } -if (state) -atomic_inc (&data->active_intr); -else -atomic_dec (&data->active_intr); -return 0 ; out_fix_power_state:
@@ -1710,8 +1704,7 @@ static int bmc150_accel_resume(struct destruct bmc150_accel_data *data =iio_priv (indio_dev);mutex_lock (&data->mutex); -if (atomic_read (&data->active_intr)) -bmc150_accel_set_mode (data,BMC150_ACCEL_SLEEP_MODE_NORMAL ,0 ); +bmc150_accel_set_mode (data,BMC150_ACCEL_SLEEP_MODE_NORMAL ,0 );bmc150_accel_fifo_set_mode (data);mutex_unlock (&data->mutex);
Greg Kroah-Hartman
maintainerPATCH 33/65 iio: pressure: st_pressure_core: disable multiread by default for LPS22HB
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
commit add6e6ab3ee0e237822e0951476d3df039b49ec8 upstream.
Set multiread variable to false for LPS22HB pressure sensor since it is already enabled in CTRL_REG2. Previous configuration does not cause any issue in I2C communication since SUB Msb has no meaning whereas it breaks register address in SPI communication
--- drivers/iio/pressure/st_pressure_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/pressure/st_pressure_core.c +1 -1
@@ -456,7 +456,7 @@ static const struct st_sensor_settings s .mask_od = 0x40, .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, }, - .multi_read_bit = true, + .multi_read_bit = false, .bootime = 2, }, };
Greg Kroah-Hartman
maintainerPATCH 34/65 iio: light: tsl2563: use correct event code
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akinobu Mita <[email protected]>
commit a3507e48d3f99a93a3056a34a5365f310434570f upstream.
The TSL2563 driver provides three iio channels, two of which are raw ADC channels (channel 0 and channel 1) in the device and the remaining one is calculated by the two. The ADC channel 0 only supports programmable interrupt with threshold settings and this driver supports the event but the generated event code does not contain the corresponding iio channel type.
This is going to change userspace ABI. Hopefully fixing this to be what it should always have been won't break any userspace code.
--- drivers/iio/light/tsl2563.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/light/tsl2563.c +1 -1
@@ -626,7 +626,7 @@ static irqreturn_t tsl2563_event_handlerstruct tsl2563_chip *chip =iio_priv (dev_info); iio_push_event(dev_info, - IIO_UNMOD_EVENT_CODE(IIO_LIGHT, + IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER),
Greg Kroah-Hartman
maintainerPATCH 35/65 iio: adc: Revert "axp288: Drop bogus AXP288_ADC_TS_PIN_CTRL register modifications"
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 631b010abc5b57009c6a8328f51492665f6ef310 upstream.
Inheriting the ADC BIAS current settings from the BIOS instead of hardcoding then causes the AXP288 to disable charging (I think it mis-detects an overheated battery) on at least one model tablet.
So lets go back to hard coding the values, this reverts commit fa2849e9649b ("iio: adc: axp288: Drop bogus AXP288_ADC_TS_PIN_CTRL register modifications"), fixing charging not working on the model tablet in question.
The exact cause is not fully understood, hence the revert to a known working state.
--- drivers/iio/adc/axp288_adc.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
drivers/iio/adc/axp288_adc.c +31 -1
@@ -28,6 +28,8 @@#include <linux/iio/driver.h> #define AXP288_ADC_EN_MASK 0xF1 +#define AXP288_ADC_TS_PIN_GPADC 0xF2 +#define AXP288_ADC_TS_PIN_ON 0xF3enum axp288_adc_id {AXP288_ADC_TS ,
@@ -121,6 +123,16 @@ static int axp288_adc_read_channel(int *return IIO_VAL_INT ; } +static int axp288_adc_set_ts (struct regmap *regmap,unsigned int mode, +unsigned long address) +{ +/* channels other than GPADC do not need to switch TS pin */ +if (address !=AXP288_GP_ADC_H ) +return 0 ; + +return regmap_write (regmap,AXP288_ADC_TS_PIN_CTRL , mode); +} +static int axp288_adc_read_raw (struct iio_dev *indio_dev,struct iio_chan_spec const *chan,int *val,int *val2,long mask)
@@ -131,7 +143,16 @@ static int axp288_adc_read_raw(struct iimutex_lock (&indio_dev->mlock);switch (mask) {case IIO_CHAN_INFO_RAW : +if (axp288_adc_set_ts (info->regmap,AXP288_ADC_TS_PIN_GPADC , + chan->address)) { +dev_err (&indio_dev->dev,"GPADC mode\n" ); + ret = -EINVAL ; +break ; + } ret =axp288_adc_read_channel (val, chan->address, info->regmap); +if (axp288_adc_set_ts (info->regmap,AXP288_ADC_TS_PIN_ON , + chan->address)) +dev_err (&indio_dev->dev,"TS pin restore\n" );break ;default : ret = -EINVAL ;
@@ -141,6 +162,15 @@ static int axp288_adc_read_raw(struct iireturn ret; } +static int axp288_adc_set_state (struct regmap *regmap) +{ +/* ADC should be always enabled for internal FG to function */ +if (regmap_write (regmap,AXP288_ADC_TS_PIN_CTRL ,AXP288_ADC_TS_PIN_ON )) +return -EIO ; + +return regmap_write (regmap,AXP20X_ADC_EN1 ,AXP288_ADC_EN_MASK ); +} +static const struct iio_info axp288_adc_iio_info = { .read_raw = &axp288_adc_read_raw, .driver_module =THIS_MODULE ,
@@ -169,7 +199,7 @@ static int axp288_adc_probe(struct platf* Set ADC to enabled state at all time, including system suspend. * otherwise internal fuel gauge functionality may be affected. */ - ret =regmap_write (info->regmap,AXP20X_ADC_EN1 ,AXP288_ADC_EN_MASK ); + ret =axp288_adc_set_state (axp20x->regmap);if (ret) {dev_err (&pdev->dev,"unable to enable ADC device\n" );return ret;
Greg Kroah-Hartman
maintainerPATCH 36/65 staging: comedi: comedi_fops: do not call blocking ops when !TASK_RUNNING
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit cef988642cdac44e910a27cb6e8166c96f86a0df upstream.
Comedi's read and write file operation handlers (comedi_read() and comedi_write()) currently call copy_to_user() or copy_from_user() whilst in the TASK_INTERRUPTIBLE state, which falls foul of the might_fault() checks when enabled. Fix it by setting the current task state back to TASK_RUNNING a bit earlier before calling these functions.
--- drivers/staging/comedi/comedi_fops.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/staging/comedi/comedi_fops.c +3 -0
@@ -2396,6 +2396,7 @@ static ssize_t comedi_write(struct filecontinue ; } +set_current_state (TASK_RUNNING ); wp = async->buf_write_ptr; n1 =min (n, async->prealloc_bufsz - wp); n2 = n - n1;
@@ -2528,6 +2529,8 @@ static ssize_t comedi_read(struct file * }continue ; } + +set_current_state (TASK_RUNNING ); rp = async->buf_read_ptr; n1 =min (n, async->prealloc_bufsz - rp); n2 = n - n1;
Greg Kroah-Hartman
maintainerPATCH 37/65 uas: Add US_FL_IGNORE_RESIDUE for Initio Corporation INIC-3069
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Swanson <[email protected]>
commit 89f23d51defcb94a5026d4b5da13faf4e1150a6f upstream.
Similar to commit d595259fbb7a ("usb-storage: Add ignore-residue quirk for Initio INIC-3619") for INIC-3169 in unusual_devs.h but INIC-3069 already present in unusual_uas.h. Both in same controller IC family.
Issue is that MakeMKV fails during key exchange with installed bluray drive with following error:
002004:0000 Error 'Scsi error - ILLEGAL REQUEST:COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT ESTABLISHED' occurred while issuing SCSI command AD010..080002400 to device 'SG:dev_11:0'
--- drivers/usb/storage/unusual_uas.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/storage/unusual_uas.h +2 -2
@@ -124,9 +124,9 @@ UNUSUAL_DEV(0x0bc2, 0xab2a, 0x0000, 0x99/* Reported-by: Benjamin Tissoires <[email protected]> */ UNUSUAL_DEV (0x13fd ,0x3940 ,0x0000 ,0x9999 ,"Initio Corporation" , -"" , +"INIC-3069" ,USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , -US_FL_NO_ATA_1X ), +US_FL_NO_ATA_1X |US_FL_IGNORE_RESIDUE ),/* Reported-by: Tom Arild Naess <[email protected]> */ UNUSUAL_DEV(0x152d, 0x0539, 0x0000, 0x9999,
Greg Kroah-Hartman
maintainerPATCH 38/65 firmware: fix batched requests - wake all waiters
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis R. Rodriguez <[email protected]>
commit e44565f62a72064e686f7a852137595ec94d78f2 upstream.
The firmware cache mechanism serves two purposes, the secondary purpose is not well documented nor understood. This fixes a regression with the secondary purpose of the firmware cache mechanism: batched requests on successful lookups. Without this fix *any* time a batched request is triggered, secondary requests for which the batched request mechanism was designed for will seem to last forver and seem to never return. This issue is present for all kernel builds possible, and a hard reset is required.
The firmware cache is used for:
1) Addressing races with file lookups during the suspend/resume cycle by keeping firmware in memory during the suspend/resume cycle
2) Batched requests for the same file rely only on work from the first file lookup, which keeps the firmware in memory until the last release_firmware() is called
Batched requests *only* take effect if secondary requests come in prior to the first user calling release_firmware(). The devres name used for the internal firmware cache is used as a hint other pending requests are ongoing, the firmware buffer data is kept in memory until the last user of the buffer calls release_firmware(), therefore serializing requests and delaying the release until all requests are done.
Batched requests wait for a wakup or signal so we can rely on the first file fetch to write to the pending secondary requests. Commit 5b029624948d ("firmware: do not use fw_lock for fw_state protection") ported the firmware API to use swait, and in doing so failed to convert complete_all() to swake_up_all() -- it used swake_up(), loosing the ability for *some* batched requests to take effect.
We *could* fix this by just using swake_up_all() *but* swait is now known to be very special use case, so its best to just move away from it. So we just go back to using completions as before commit 5b029624948d ("firmware:
do not use fw_lock for fw_state protection") given this was using complete_all().
Without this fix it has been reported plugging in two Intel 6260 Wifi cards on a system will end up enumerating the two devices only 50% of the time [0]. The ported swake_up() should have actually handled the case with two devices, however, *if more than two cards are used* the swake_up() would not have sufficed. This change is only part of the required fixes for batched requests. Another fix is provided in the next patch.
This particular change should fix the cases where more than three requests with the same firmware name is used, otherwise batched requests will wait for MAX_SCHEDULE_TIMEOUT and just timeout eventually.
Below is a summary of tests triggering batched requests on different kernel builds.
Before this patch:
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=y
Most common Linux distribution setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL FAIL request_firmware_direct() FAIL FAIL request_firmware_nowait(uevent=true) FAIL FAIL request_firmware_nowait(uevent=false) FAIL FAIL
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=n
Only possible if CONFIG_DELL_RBU=n and CONFIG_LEDS_LP55XX_COMMON=n, rare.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL FAIL request_firmware_direct() FAIL FAIL request_firmware_nowait(uevent=true) FAIL FAIL request_firmware_nowait(uevent=false) FAIL FAIL
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=yCONFIG_FW_LOADER_USER_HELPER=y
Google Android setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL FAIL request_firmware_direct() FAIL FAIL request_firmware_nowait(uevent=true) FAIL FAIL request_firmware_nowait(uevent=false) FAIL FAIL
============================================================================
After this patch:
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=y
Most common Linux distribution setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL OK request_firmware_direct() FAIL OK request_firmware_nowait(uevent=true) FAIL OK request_firmware_nowait(uevent=false) FAIL OK
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=n
Only possible if CONFIG_DELL_RBU=n and CONFIG_LEDS_LP55XX_COMMON=n, rare.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL OK request_firmware_direct() FAIL OK request_firmware_nowait(uevent=true) FAIL OK request_firmware_nowait(uevent=false) FAIL OK
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=yCONFIG_FW_LOADER_USER_HELPER=y
Google Android setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() OK OK request_firmware_direct() FAIL OK request_firmware_nowait(uevent=true) OK OK request_firmware_nowait(uevent=false) OK OK
============================================================================
[0] https://bugzilla.kernel.org/show_bug.cgi?id=195477
--- drivers/base/firmware_class.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/base/firmware_class.c +5 -7
@@ -30,7 +30,6 @@#include <linux/syscore_ops.h> #include <linux/reboot.h> #include <linux/security.h> -#include <linux/swait.h> #include <generated/utsrelease.h>
@@ -112,13 +111,13 @@ static inline long firmware_loading_time* state of the firmware loading. */ struct fw_state { -struct swait_queue_head wq; +struct completion completion;enum fw_status status; };static void fw_state_init (struct fw_state *fw_st) { -init_swait_queue_head (&fw_st->wq); +init_completion (&fw_st->completion); fw_st->status =FW_STATUS_UNKNOWN ; }
@@ -131,9 +130,8 @@ static int __fw_state_wait_common(struct {long ret; - ret =swait_event_interruptible_timeout (fw_st->wq, -__fw_state_is_done (READ_ONCE (fw_st->status)), - timeout); + ret =wait_for_completion_interruptible_timeout (&fw_st->completion, + timeout);if (ret !=0 && fw_st->status ==FW_STATUS_ABORTED )return -ENOENT ;if (!ret)
@@ -148,7 +146,7 @@ static void __fw_state_set(struct fw_staWRITE_ONCE (fw_st->status, status);if (status ==FW_STATUS_DONE || status ==FW_STATUS_ABORTED ) -swake_up (&fw_st->wq); +complete_all (&fw_st->completion); }#define fw_state_start (fw_st) \
Greg Kroah-Hartman
maintainerPATCH 39/65 firmware: fix batched requests - send wake up on failure on direct lookups
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis R. Rodriguez <[email protected]>
commit 90d41e74a9c36a84e2efbd2a5b8d79299feee6fa upstream.
Fix batched requests from waiting forever on failure.
The firmware API batched requests feature has been broken since the API call request_firmware_direct() was introduced on commit bba3a87e982ad ("firmware:
Introduce request_firmware_direct()"), added on v3.14 *iff* the firmware being requested was not present in *certain kernel builds* [0].
When no firmware is found the worker which goes on to finish never informs waiters queued up of this, so any batched request will stall in what seems to be forever (MAX_SCHEDULE_TIMEOUT). Sadly, a reboot will also stall, as the reboot notifier was only designed to kill custom fallback workers. The issue seems to the user as a type of soft lockup, what *actually* happens underneath the hood is a wait call which never completes as we failed to issue a completion on error.
For device drivers with optional firmware schemes (ie, Intel iwlwifi, or Netronome -- even though it uses request_firmware() and not request_firmware_direct()), this could mean that when you boot a system with multiple cards the firmware will seem to never load on the system, or that the card is just not responsive even the driver initialization. Due to differences in scheduling possible this should not always trigger -- one would need to to ensure that multiple requests are in place at the right time for this to work, also release_firmware() must not be called prior to any other incoming request. The complexity may not be worth supporting batched requests in the future given the wait mechanism is only used also for the fallback mechanism. We'll keep it for now and just fix it.
Its reported that at least with the Intel WiFi cards on one system this issue was creeping up 50% of the boots [0].
Before this commit batched requests testing revealed:
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=n CONFIG_FW_LOADER_USER_HELPER=y
Most common Linux distribution setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL OK request_firmware_direct() FAIL OK request_firmware_nowait(uevent=true) FAIL OK request_firmware_nowait(uevent=false) FAIL OK
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=n
Only possible if CONFIG_DELL_RBU=n and CONFIG_LEDS_LP55XX_COMMON=n, rare.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() FAIL OK request_firmware_direct() FAIL OK request_firmware_nowait(uevent=true) FAIL OK request_firmware_nowait(uevent=false) FAIL OK
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=yCONFIG_FW_LOADER_USER_HELPER=y
Google Android setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() OK OK request_firmware_direct() FAIL OK request_firmware_nowait(uevent=true) OK OK request_firmware_nowait(uevent=false) OK OK
============================================================================
Ater this commit batched testing results:
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=y
Most common Linux distribution setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() OK OK request_firmware_direct() OK OK request_firmware_nowait(uevent=true) OK OK request_firmware_nowait(uevent=false) OK OK
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=nCONFIG_FW_LOADER_USER_HELPER=n
Only possible if CONFIG_DELL_RBU=n and CONFIG_LEDS_LP55XX_COMMON=n, rare.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() OK OK request_firmware_direct() OK OK request_firmware_nowait(uevent=true) OK OK request_firmware_nowait(uevent=false) OK OK
============================================================================CONFIG_FW_LOADER_USER_HELPER_FALLBACK=yCONFIG_FW_LOADER_USER_HELPER=y
Google Android setup.
API-type no-firmware-found firmware-found
----------------------------------------------------------------------
request_firmware() OK OK request_firmware_direct() OK OK request_firmware_nowait(uevent=true) OK OK request_firmware_nowait(uevent=false) OK OK
============================================================================
[0] https://bugzilla.kernel.org/show_bug.cgi?id=195477
--- drivers/base/firmware_class.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-)
drivers/base/firmware_class.c +30 -8
@@ -153,28 +153,27 @@ static void __fw_state_set(struct fw_sta __fw_state_set(fw_st, FW_STATUS_LOADING)#define fw_state_done (fw_st) \ __fw_state_set(fw_st, FW_STATUS_DONE) +#define fw_state_aborted (fw_st) \ + __fw_state_set(fw_st, FW_STATUS_ABORTED)#define fw_state_wait (fw_st) \ __fw_state_wait_common(fw_st, MAX_SCHEDULE_TIMEOUT) -#ifndef CONFIG_FW_LOADER_USER_HELPER - -#define fw_state_is_aborted (fw_st) false - -#else /* CONFIG_FW_LOADER_USER_HELPER */ -static int __fw_state_check (struct fw_state *fw_st,enum fw_status status) {return fw_st->status == status; } +#define fw_state_is_aborted (fw_st) \ + __fw_state_check(fw_st, FW_STATUS_ABORTED) + +#ifdef CONFIG_FW_LOADER_USER_HELPER +#define fw_state_aborted (fw_st) \ __fw_state_set(fw_st, FW_STATUS_ABORTED)#define fw_state_is_done (fw_st) \ __fw_state_check(fw_st, FW_STATUS_DONE)#define fw_state_is_loading (fw_st) \ __fw_state_check(fw_st, FW_STATUS_LOADING) -#define fw_state_is_aborted (fw_st) \ - __fw_state_check(fw_st, FW_STATUS_ABORTED)#define fw_state_wait_timeout (fw_st, timeout) \ __fw_state_wait_common(fw_st, timeout)
@@ -1161,6 +1160,28 @@ static int assign_firmware_buf(struct fireturn 0 ; } +/* +* Batched requests need only one wake, we need to do this step last due to the +* fallback mechanism. The buf is protected with kref_get(), and it won't be +* released until the last user calls release_firmware(). +* +* Failed batched requests are possible as well, in such cases we just share +* the struct firmware_buf and won't release it until all requests are woken +* and have gone through this same path. +*/ +static void fw_abort_batch_reqs (struct firmware *fw) +{ +struct firmware_buf *buf; + +/* Loaded directly? */ +if (!fw || !fw->priv) +return ; + + buf = fw->priv; +if (!fw_state_is_aborted (&buf->fw_st)) +fw_state_aborted (&buf->fw_st); +} +/* called from request_firmware() and request_firmware_work_func() */ static int _request_firmware(const struct firmware **firmware_p, const char *name,
@@ -1222,6 +1243,7 @@ _request_firmware(const struct firmware out:if (ret <0 ) { +fw_abort_batch_reqs (fw);release_firmware (fw); fw =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 40/65 firmware: avoid invalid fallback aborts by using killable wait
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis R. Rodriguez <[email protected]>
commit 260d9f2fc5655a2552701cdd0b909c4466732f19 upstream.
Commit 0cb64249ca500 ("firmware_loader: abort request if wait_for_completion is interrupted") added via 4.0 added support to abort the fallback mechanism when a signal was detected and wait_for_completion_interruptible() returned -ERESTARTSYS -- for instance when a user hits CTRL-C. The abort was overly *too* effective.
When a child process terminates (successful or not) the signal SIGCHLD can be sent to the parent process which ran the child in the background and later triggered a sync request for firmware through a sysfs interface which relies on the fallback mechanism. This signal in turn can be recieved by the interruptible wait we constructed on firmware_class and detects it as an abort *before* userspace could get a chance to write the firmware. Upon failure -EAGAIN is returned, so userspace is also kept in the dark about exactly what happened.
We can reproduce the issue with the fw_fallback.sh selftest:
Before this patch:
$ sudo tools/testing/selftests/firmware/fw_fallback.sh ... tools/testing/selftests/firmware/fw_fallback.sh: error - sync firmware request cancelled due to SIGCHLD
After this patch:
$ sudo tools/testing/selftests/firmware/fw_fallback.sh ... tools/testing/selftests/firmware/fw_fallback.sh: SIGCHLD on sync ignored as expected
Fix this by making the wait killable -- only killable by SIGKILL (kill -9). We loose the ability to allow userspace to cancel a write with CTRL-C (SIGINT), however its been decided the compromise to require SIGKILL is worth the gains.
Chances of this issue occuring are low due to the number of drivers upstream exclusively relying on the fallback mechanism for firmware (2 drivers), however this is observed in the field with custom drivers with sysfs triggers to load firmware. Only distributions relying on the fallback mechanism are impacted as well. An example reported issue was on Android, as follows:
1) Android init (pid=1) fork()s (say pid=42) [this child process is totally unrelated to firmware loading, it could be sleep 2; for all we care ]
2) Android init (pid=1) does a write() on a (driver custom) sysfs file which ends up calling request_firmware() kernel side
3) The firmware loading fallback mechanism is used, the request is sent to userspace and pid 1 waits in the kernel on wait_*
4) before firmware loading completes pid 42 dies (for any reason, even normal termination)
5) Kernel delivers SIGCHLD to pid=1 to tell it a child has died, which causes -ERESTARTSYS to be returned from wait_*
6) The kernel's wait aborts and return -EAGAIN for the request_firmware() caller.
--- drivers/base/firmware_class.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/base/firmware_class.c +1 -2
@@ -130,8 +130,7 @@ static int __fw_state_wait_common(struct {long ret; - ret =wait_for_completion_interruptible_timeout (&fw_st->completion, - timeout); + ret =wait_for_completion_killable_timeout (&fw_st->completion, timeout);if (ret !=0 && fw_st->status ==FW_STATUS_ABORTED )return -ENOENT ;if (!ret)
Greg Kroah-Hartman
maintainerPATCH 41/65 block: Make blk_mq_delay_kick_requeue_list() rerun the queue at a quiet time
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit d4acf3650c7c968f46ad932b9a25d1cc24cf4998 upstream.
The blk_mq_delay_kick_requeue_list() function is used by the device mapper and only by the device mapper to rerun the queue and requeue list after a delay. This function is called once per request that gets requeued. Modify this function such that the queue is run once per path change event instead of once per request that is requeued.
--- block/blk-mq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
block/blk-mq.c +2 -2
@@ -620,8 +620,8 @@ EXPORT_SYMBOL(blk_mq_kick_requeue_list);void blk_mq_delay_kick_requeue_list (struct request_queue *q,unsigned long msecs) { -kblockd_schedule_delayed_work (&q->requeue_work, -msecs_to_jiffies (msecs)); +kblockd_mod_delayed_work_on (WORK_CPU_UNBOUND , &q->requeue_work, +msecs_to_jiffies (msecs)); }EXPORT_SYMBOL (blk_mq_delay_kick_requeue_list);
Greg Kroah-Hartman
maintainerPATCH 42/65 usb: gadget: udc: renesas_usb3: Fix usb_gadget_giveback_request() calling
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit aca5b9ebd096039657417c321a9252c696b359c2 upstream.
According to the gadget.h, a "complete" function will always be called with interrupts disabled. However, sometimes usb3_request_done() function is called with interrupts enabled. So, this function should be held by spin_lock_irqsave() to disable interruption. Also, this driver has to call spin_unlock() to avoid spinlock recursion by this driver before calling usb_gadget_giveback_request().
--- drivers/usb/gadget/udc/renesas_usb3.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
drivers/usb/gadget/udc/renesas_usb3.c +16 -5
@@ -758,21 +758,32 @@ static struct renesas_usb3_request *usb3return usb3_req; } -static void usb3_request_done (struct renesas_usb3_ep *usb3_ep, -struct renesas_usb3_request *usb3_req,int status) +static void __usb3_request_done (struct renesas_usb3_ep *usb3_ep, +struct renesas_usb3_request *usb3_req, +int status) {struct renesas_usb3 *usb3 =usb3_ep_to_usb3 (usb3_ep); -unsigned long flags;dev_dbg (usb3_to_dev (usb3),"giveback: ep%2d, %u, %u, %d\n" , usb3_ep->num, usb3_req->req.length, usb3_req->req.actual, status); usb3_req->req.status = status; -spin_lock_irqsave (&usb3->lock, flags); usb3_ep->started = false;list_del_init (&usb3_req->queue); -spin_unlock_irqrestore (&usb3->lock, flags); +spin_unlock (&usb3->lock);usb_gadget_giveback_request (&usb3_ep->ep, &usb3_req->req); +spin_lock (&usb3->lock); +} + +static void usb3_request_done (struct renesas_usb3_ep *usb3_ep, +struct renesas_usb3_request *usb3_req,int status) +{ +struct renesas_usb3 *usb3 =usb3_ep_to_usb3 (usb3_ep); +unsigned long flags; + +spin_lock_irqsave (&usb3->lock, flags); +__usb3_request_done (usb3_ep, usb3_req, status); +spin_unlock_irqrestore (&usb3->lock, flags); }static void usb3_irq_epc_pipe0_status_end (struct renesas_usb3 *usb3)
Greg Kroah-Hartman
maintainerPATCH 43/65 usb: renesas_usbhs: Fix UGCTRL2 value for R-Car Gen3
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit 2acecd58969897795cf015c9057ebd349a3fda8a upstream.
The latest HW manual (Rev.0.55) shows us this UGCTRL2.VBUSSEL bit. If the bit sets to 1, the VBUS drive is controlled by phy related registers (called "UCOM Registers" on the manual). Since R-Car Gen3 environment will control VBUS by phy-rcar-gen3-usb2 driver, the UGCTRL2.VBUSSEL bit should be set to 1. So, this patch fixes the register's value. Otherwise, even if the ID pin indicates to peripheral, the R-Car will output USBn_PWEN to 1 when a host driver is running.
--- drivers/usb/renesas_usbhs/rcar3.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/usb/renesas_usbhs/rcar3.c +7 -2
@@ -20,9 +20,13 @@/* Low Power Status register (LPSTS) */ #define LPSTS_SUSPM 0x4000 -/* USB General control register 2 (UGCTRL2), bit[31:6] should be 0 */ +/* +* USB General control register 2 (UGCTRL2) +* Remarks: bit[31:11] and bit[9:6] should be 0 +*/ #define UGCTRL2_RESERVED_3 0x00000001/* bit[3:0] should be B'0001 */ #define UGCTRL2_USB0SEL_OTG 0x00000030 +#define UGCTRL2_VBUSSEL 0x00000400static void usbhs_write32 (struct usbhs_priv *priv,u32 reg,u32 data) {
@@ -34,7 +38,8 @@ static int usbhs_rcar3_power_ctrl(struct {struct usbhs_priv *priv =usbhs_pdev_to_priv (pdev); -usbhs_write32 (priv,UGCTRL2 ,UGCTRL2_RESERVED_3 |UGCTRL2_USB0SEL_OTG ); +usbhs_write32 (priv,UGCTRL2 ,UGCTRL2_RESERVED_3 |UGCTRL2_USB0SEL_OTG | +UGCTRL2_VBUSSEL );if (enable) {usbhs_bset (priv,LPSTS ,LPSTS_SUSPM ,LPSTS_SUSPM );
Greg Kroah-Hartman
maintainerPATCH 44/65 USB: Check for dropped connection before switching to full speed
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit 94c43b9897abf4ea366ed4dba027494e080c7050 upstream.
Some buggy USB disk adapters disconnect and reconnect multiple times during the enumeration procedure. This may lead to a device connecting at full speed instead of high speed, because when the USB stack sees that a device isn't able to enumerate at high speed, it tries to hand the connection over to a full-speed companion controller.
The logic for doing this is careful to check that the device is still connected. But this check is inadequate if the device disconnects and reconnects before the check is done. The symptom is that a device works, but much more slowly than it is capable of operating.
The situation was made worse recently by commit 22547c4cc4fe ("usb:
hub: Wait for connection to be reestablished after port reset"), which increases the delay following a reset before a disconnect is recognized, thus giving the device more time to reconnect.
This patch makes the check more robust. If the device was disconnected at any time during enumeration, we will now skip the full-speed handover.
--- drivers/usb/core/hub.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/usb/core/hub.c +6 -4
@@ -4730,7 +4730,8 @@ hub_power_remaining(struct usb_hub *hub)static void hub_port_connect (struct usb_hub *hub,int port1,u16 portstatus,u16 portchange) { -int status, i; +int status = -ENODEV ; +int i;unsigned unit_load;struct usb_device *hdev = hub->hdev;struct usb_hcd *hcd =bus_to_hcd (hdev->bus);
@@ -4934,9 +4935,10 @@ loop: done:hub_port_disable (hub, port1,1 ); -if (hcd->driver->relinquish_port && !hub->hdev->parent) - hcd->driver->relinquish_port (hcd, port1); - +if (hcd->driver->relinquish_port && !hub->hdev->parent) { +if (status != -ENOTCONN && status != -ENODEV ) + hcd->driver->relinquish_port (hcd, port1); + } }/* Handle physical or logical connection change events.
Greg Kroah-Hartman
maintainerPATCH 45/65 usb: core: unlink urbs from the tail of the endpoints urb_list
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bin Liu <[email protected]>
commit 2eac13624364db5b5e1666ae0bb3a4d36bc56b6e upstream.
While unlink an urb, if the urb has been programmed in the controller, the controller driver might do some hw related actions to tear down the urb.
Currently usb_hcd_flush_endpoint() passes each urb from the head of the endpoint's urb_list to the controller driver, which could make the controller driver think each urb has been programmed and take the unnecessary actions for each urb.
This patch changes the behavior in usb_hcd_flush_endpoint() to pass the urbs from the tail of the list, to avoid any unnecessary actions in an controller driver.
--- drivers/usb/core/hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/core/hcd.c +1 -1
@@ -1878,7 +1878,7 @@ void usb_hcd_flush_endpoint(struct usb_d/* No more submits can occur */ spin_lock_irq (&hcd_urb_list_lock); rescan: - list_for_each_entry (urb, &ep->urb_list, urb_list) { +list_for_each_entry_reverse (urb, &ep->urb_list, urb_list) {int is_in;if (urb->unlinked)
Greg Kroah-Hartman
maintainerPATCH 46/65 usb: quirks: Add no-lpm quirk for Moshi USB to Ethernet Adapter
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai-Heng Feng <[email protected]>
commit 7496cfe5431f21da5d27a8388c326397e3f0a5db upstream.
Moshi USB to Ethernet Adapter internally uses a Genesys Logic hub to connect to Realtek r8153.
The Realtek r8153 ethernet does not work on the internal hub, no-lpm quirk can make it work.
Since another r8153 dongle at my hand does not have the issue, so add the quirk to the Genesys Logic hub instead.
--- drivers/usb/core/quirks.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/core/quirks.c +3 -0
@@ -150,6 +150,9 @@ static const struct usb_device_id usb_qu/* appletouch */ { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, + /* Genesys Logic hub, internally used by Moshi USB to Ethernet Adapter */ + { USB_DEVICE(0x05e3, 0x0616), .driver_info = USB_QUIRK_NO_LPM }, + /* Avision AV600U */ { USB_DEVICE(0x0638, 0x0a13), .driver_info = USB_QUIRK_STRING_FETCH_255 },
Greg Kroah-Hartman
maintainerPATCH 47/65 usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandeep Singh <[email protected]>
commit e788787ef4f9c24aafefc480a8da5f92b914e5e6 upstream.
Certain HP keyboards would keep inputting a character automatically which is the wake-up key after S3 resume
On some AMD platforms USB host fails to respond (by holding resume-K) to USB device (an HP keyboard) resume request within 1ms (TURSM) and ensures that resume is signaled for at least 20 ms (TDRSMDN), which is defined in USB 2.0 spec. The result is that the keyboard is out of function.
In SNPS USB design, the host responds to the resume request only after system gets back to S0 and the host gets to functional after the internal HW restore operation that is more than 1 second after the initial resume request from the USB device.
As a workaround for specific keyboard ID(HP Keyboards), applying port reset after resume when the keyboard is plugged in.
--- drivers/usb/core/quirks.c | 1 + drivers/usb/host/pci-quirks.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-)
drivers/usb/core/quirks.c +1 -0
@@ -252,6 +252,7 @@ static const struct usb_device_id usb_am { USB_DEVICE(0x093a, 0x2500), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x093a, 0x2510), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x093a, 0x2521), .driver_info = USB_QUIRK_RESET_RESUME }, + { USB_DEVICE(0x03f0, 0x2b4a), .driver_info = USB_QUIRK_RESET_RESUME }, /* Logitech Optical Mouse M90/M100 */ { USB_DEVICE(0x046d, 0xc05a), .driver_info = USB_QUIRK_RESET_RESUME },
drivers/usb/host/pci-quirks.c +12 -5
@@ -98,6 +98,7 @@ enum amd_chipset_gen {AMD_CHIPSET_HUDSON2 ,AMD_CHIPSET_BOLTON ,AMD_CHIPSET_YANGTZE , +AMD_CHIPSET_TAISHAN , AMD_CHIPSET_UNKNOWN, };
@@ -141,6 +142,11 @@ static int amd_chipset_sb_type_init(stru pinfo->sb_type.gen =AMD_CHIPSET_SB700 ; else if (rev >= 0x40 && rev <= 0x4f) pinfo->sb_type.gen =AMD_CHIPSET_SB800 ; + } + pinfo->smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD , +0x145c ,NULL ); +if (pinfo->smbus_dev) { + pinfo->sb_type.gen =AMD_CHIPSET_TAISHAN ; }else { pinfo->smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ,NULL );
@@ -260,11 +266,12 @@ int usb_hcd_amd_remote_wakeup_quirk(stru {/* Make sure amd chipset type has already been initialized */ usb_amd_find_chipset_info (); -if (amd_chipset.sb_type.gen !=AMD_CHIPSET_YANGTZE ) -return 0 ; - -dev_dbg (&pdev->dev,"QUIRK: Enable AMD remote wakeup fix\n" ); -return 1 ; +if (amd_chipset.sb_type.gen ==AMD_CHIPSET_YANGTZE || + amd_chipset.sb_type.gen ==AMD_CHIPSET_TAISHAN ) { +dev_dbg (&pdev->dev,"QUIRK: Enable AMD remote wakeup fix\n" ); +return 1 ; + } +return 0 ; }EXPORT_SYMBOL_GPL (usb_hcd_amd_remote_wakeup_quirk);
Re: [PATCH 4.12 47/65] usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume
Quoted 7 lines · Greg Kroah-Hartman
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandeep Singh <[email protected]>
commit
e788787ef4f9c24aafefc480a8da5f92b914e5e6upstream.
[...]
Quoted 12 lines
drivers/usb/host/pci-quirks.c +1
-0@@ -98,6 +98,7 @@ enum amd_chipset_gen { AMD_CHIPSET_HUDSON2, AMD_CHIPSET_BOLTON, AMD_CHIPSET_YANGTZE, +AMD_CHIPSET_TAISHAN , AMD_CHIPSET_UNKNOWN, };drivers/usb/host/pci-quirks.c +0
-0@@ -141,6 +142,11 @@ static int amd_chipset_sb_type_init(stru pinfo->sb_type.gen = AMD_CHIPSET_SB700;
drivers/usb/host/pci-quirks.c static int amd_chipset_sb_type_init(stru · line 152
Quoted 10 lines
drivers/usb/host/pci-quirks.c +5
-0else if (rev >= 0x40 && rev <= 0x4f) pinfo->sb_type.gen = AMD_CHIPSET_SB800; + } + pinfo->smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD , + 0x145c, NULL); +if (pinfo->smbus_dev) { + pinfo->sb_type.gen =AMD_CHIPSET_TAISHAN ; } else { pinfo->smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
[...]
This causes pinfo->smbus_dev to be wrongly set to NULL on systems with the ATI chipset that this function checks for first.
Ben.
Signature · 2 lines
Ben Hutchings Reality is just a crutch for people who can't handle science fiction.
Greg Kroah-Hartman
maintainerRe: [PATCH 4.12 47/65] usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume
Quoted 33 lines · Ben Hutchings
Quoted 7 lines · Greg Kroah-Hartman
4.12-stable review patch.��If anyone has any objections, please let me know.
------------------
From: Sandeep Singh <[email protected]>
commit
e788787ef4f9c24aafefc480a8da5f92b914e5e6upstream.[...]
Quoted 22 lines
drivers/usb/host/pci-quirks.c +1
-0@@ -98,6 +98,7 @@ enum amd_chipset_gen { � AMD_CHIPSET_HUDSON2, � AMD_CHIPSET_BOLTON, � AMD_CHIPSET_YANGTZE, +AMD_CHIPSET_TAISHAN , � AMD_CHIPSET_UNKNOWN, �};�
drivers/usb/host/pci-quirks.c +5
-0@@ -141,6 +142,11 @@ static int amd_chipset_sb_type_init(stru � pinfo->sb_type.gen = AMD_CHIPSET_SB700; � else if (rev >= 0x40 && rev <= 0x4f) � pinfo->sb_type.gen = AMD_CHIPSET_SB800; + } + pinfo->smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD , + ��0x145c, NULL); +if (pinfo->smbus_dev) { + pinfo->sb_type.gen =AMD_CHIPSET_TAISHAN ; � } else { � pinfo->smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD, � PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);[...]
Quoted 2 lines
This causes
pinfo->smbus_devto be wrongly set to NULL on systems with the ATI chipset that this function checks for first.
Ugh, for such a "simple" quirk, this has gone through so many different iterations, all of which seem broken :(
Sandeep, can you fix this up and send a follow-on patch to us and the linux-usb mailing list so we can get it fixed up properly?
thanks,
greg k-h
Re: [PATCH 4.12 47/65] usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume
Quoted 29 lines
Quoted 29 lines
Quoted 4 lines
From: Sandeep Singh <[email protected]>
commit
e788787ef4f9c24aafefc480a8da5f92b914e5e6upstream.[...]
Quoted 22 lines
drivers/usb/host/pci-quirks.c +6
-0@@ -98,6 +98,7 @@ enum amd_chipset_gen {AMD_CHIPSET_HUDSON2 ,AMD_CHIPSET_BOLTON ,AMD_CHIPSET_YANGTZE , +AMD_CHIPSET_TAISHAN , AMD_CHIPSET_UNKNOWN, };@@ -141,6 +142,11 @@ static int amd_chipset_sb_type_init(stru pinfo->sb_type.gen =AMD_CHIPSET_SB700 ; else if (rev >= 0x40 && rev <= 0x4f) pinfo->sb_type.gen =AMD_CHIPSET_SB800 ; + } + pinfo->smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD , +0x145c ,NULL ); +if (pinfo->smbus_dev) { + pinfo->sb_type.gen =AMD_CHIPSET_TAISHAN ; }else { pinfo->smbus_dev =pci_get_device (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ,NULL );[...]
Quoted 9 lines
Quoted 2 lines
This causes
pinfo->smbus_devto be wrongly set to NULL on systems with the ATI chipset that this function checks for first.Ugh, for such a "simple" quirk, this has gone through so many different iterations, all of which seem broken :(
Sandeep, can you fix this up and send a follow-on patch to us and the linux-usb mailing list so we can get it fixed up properly?
Greg, :-( We will send follow-on patch shortly.
Greg Kroah-Hartman
maintainerPATCH 48/65 PCI: Protect pci_error_handlers->reset_notify() usage with device_lock()
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
commit b014e96d1abbd67404bbe2018937b46466299e9e upstream.
Every method in struct device_driver or structures derived from it like struct pci_driver MUST provide exclusion vs the driver's ->remove() method, usually by using device_lock().
Protect use of pci_error_handlers->reset_notify() by holding the device lock while calling it.
Note:
- pci_dev_lock() calls device_lock() in addition to blocking user-space config accesses.
- pci_err_handlers->reset_notify() is used inside pci_dev_save_and_disable() and pci_dev_restore(). We could hold the device lock directly in pci_reset_notify(), but we expand the region since we have several calls following each other.
Without this, ->reset_notify() may race with ->remove() calls, which can be easily triggered in NVMe.
[bhelgaas: changelog, add pci_reset_notify() comment] [bhelgaas: fold in fix from Dan Carpenter <[email protected]>:
http://lkml.kernel.org/r/20170701135323.x5vaj4e2wcs2mcro@mwanda]
--- drivers/pci/pci.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
drivers/pci/pci.c +18 -8
@@ -4141,6 +4141,12 @@ static void pci_reset_notify(struct pci_ {const struct pci_error_handlers *err_handler = dev->driver ? dev->driver->err_handler :NULL ; + +/* +* dev->driver->err_handler->reset_notify() is protected against +* races with ->remove() by the device lock, which must be held by +* the caller. +*/ if (err_handler && err_handler->reset_notify) err_handler->reset_notify (dev, prepare); }
@@ -4276,11 +4282,13 @@ int pci_reset_function(struct pci_dev *dif (rc)return rc; +pci_dev_lock (dev);pci_dev_save_and_disable (dev); - rc =pci_dev_reset (dev,0 ); + rc =__pci_dev_reset (dev,0 );pci_dev_restore (dev); +pci_dev_unlock (dev);return rc; }
@@ -4300,16 +4308,14 @@ int pci_try_reset_function(struct pci_deif (rc)return rc; -pci_dev_save_and_disable (dev); +if (!pci_dev_trylock (dev)) +return -EAGAIN ; -if (pci_dev_trylock (dev)) { - rc =__pci_dev_reset (dev,0 ); -pci_dev_unlock (dev); - }else - rc = -EAGAIN ; +pci_dev_save_and_disable (dev); + rc =__pci_dev_reset (dev,0 ); +pci_dev_unlock (dev);pci_dev_restore (dev); -return rc; }EXPORT_SYMBOL_GPL (pci_try_reset_function);
@@ -4459,7 +4465,9 @@ static void pci_bus_save_and_disable(strstruct pci_dev *dev;list_for_each_entry (dev, &bus->devices, bus_list) { +pci_dev_lock (dev);pci_dev_save_and_disable (dev); +pci_dev_unlock (dev);if (dev->subordinate)pci_bus_save_and_disable (dev->subordinate); }
@@ -4474,7 +4482,9 @@ static void pci_bus_restore(struct pci_bstruct pci_dev *dev;list_for_each_entry (dev, &bus->devices, bus_list) { +pci_dev_lock (dev);pci_dev_restore (dev); +pci_dev_unlock (dev);if (dev->subordinate)pci_bus_restore (dev->subordinate); }
Greg Kroah-Hartman
maintainerPATCH 49/65 PCI: Remove __pci_dev_reset() and pci_dev_reset()
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
commit 52354b9d1f46aae7386db7bb8ec8484b5488087f upstream.
Implement the reset probing / reset chain directly in __pci_probe_reset_function() and __pci_reset_function_locked() respectively.
--- drivers/pci/pci.c | 108 ++++++++++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 56 deletions(-)
drivers/pci/pci.c +52 -56
@@ -4069,40 +4069,6 @@ static int pci_dev_reset_slot_function(sreturn pci_reset_hotplug_slot (dev->slot->hotplug, probe); } -static int __pci_dev_reset (struct pci_dev *dev,int probe) -{ -int rc; - -might_sleep (); - - rc =pci_dev_specific_reset (dev, probe); -if (rc != -ENOTTY ) - goto done; - -if (pcie_has_flr (dev)) { -if (!probe) -pcie_flr (dev); - rc =0 ; - goto done; - } - - rc =pci_af_flr (dev, probe); -if (rc != -ENOTTY ) - goto done; - - rc =pci_pm_reset (dev, probe); -if (rc != -ENOTTY ) - goto done; - - rc =pci_dev_reset_slot_function (dev, probe); -if (rc != -ENOTTY ) - goto done; - - rc =pci_parent_bus_reset (dev, probe); -done: -return rc; -} -static void pci_dev_lock (struct pci_dev *dev) {pci_cfg_access_lock (dev);
@@ -4179,21 +4145,6 @@ static void pci_dev_restore(struct pci_dpci_reset_notify (dev, false); } -static int pci_dev_reset (struct pci_dev *dev,int probe) -{ -int rc; - -if (!probe) -pci_dev_lock (dev); - - rc =__pci_dev_reset (dev, probe); - -if (!probe) -pci_dev_unlock (dev); - -return rc; -} -/** * __pci_reset_function - reset a PCI device function * @dev: PCI device to reset
@@ -4213,7 +4164,13 @@ static int pci_dev_reset(struct pci_dev*/ int __pci_reset_function (struct pci_dev *dev) { -return pci_dev_reset (dev,0 ); +int ret; + +pci_dev_lock (dev); + ret =__pci_reset_function_locked (dev); +pci_dev_unlock (dev); + +return ret; }EXPORT_SYMBOL_GPL (__pci_reset_function);
@@ -4238,7 +4195,27 @@ EXPORT_SYMBOL_GPL(__pci_reset_function);*/ int __pci_reset_function_locked (struct pci_dev *dev) { -return __pci_dev_reset (dev,0 ); +int rc; + +might_sleep (); + + rc =pci_dev_specific_reset (dev,0 ); +if (rc != -ENOTTY ) +return rc; +if (pcie_has_flr (dev)) { +pcie_flr (dev); +return 0 ; + } + rc =pci_af_flr (dev,0 ); +if (rc != -ENOTTY ) +return rc; + rc =pci_pm_reset (dev,0 ); +if (rc != -ENOTTY ) +return rc; + rc =pci_dev_reset_slot_function (dev,0 ); +if (rc != -ENOTTY ) +return rc; +return pci_parent_bus_reset (dev,0 ); }EXPORT_SYMBOL_GPL (__pci_reset_function_locked);
@@ -4255,7 +4232,26 @@ EXPORT_SYMBOL_GPL(__pci_reset_function_l*/ int pci_probe_reset_function (struct pci_dev *dev) { -return pci_dev_reset (dev,1 ); +int rc; + +might_sleep (); + + rc =pci_dev_specific_reset (dev,1 ); +if (rc != -ENOTTY ) +return rc; +if (pcie_has_flr (dev)) +return 0 ; + rc =pci_af_flr (dev,1 ); +if (rc != -ENOTTY ) +return rc; + rc =pci_pm_reset (dev,1 ); +if (rc != -ENOTTY ) +return rc; + rc =pci_dev_reset_slot_function (dev,1 ); +if (rc != -ENOTTY ) +return rc; + +return pci_parent_bus_reset (dev,1 ); }/**
@@ -4278,14 +4274,14 @@ int pci_reset_function(struct pci_dev *d {int rc; - rc =pci_dev_reset (dev,1 ); + rc =pci_probe_reset_function (dev);if (rc)return rc;pci_dev_lock (dev);pci_dev_save_and_disable (dev); - rc =__pci_dev_reset (dev,0 ); + rc =__pci_reset_function_locked (dev);pci_dev_restore (dev);pci_dev_unlock (dev);
@@ -4304,7 +4300,7 @@ int pci_try_reset_function(struct pci_de {int rc; - rc =pci_dev_reset (dev,1 ); + rc =pci_probe_reset_function (dev);if (rc)return rc;
@@ -4312,7 +4308,7 @@ int pci_try_reset_function(struct pci_dereturn -EAGAIN ;pci_dev_save_and_disable (dev); - rc =__pci_dev_reset (dev,0 ); + rc =__pci_reset_function_locked (dev);pci_dev_unlock (dev);pci_dev_restore (dev);
Greg Kroah-Hartman
maintainerPATCH 50/65 PCI: Add pci_reset_function_locked()
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
commit a477b9cd37aa81a490dfa3265b7ff4f2c5a92463 upstream.
The implementation of PCI workarounds may require that the device is reset from its probe function. This implies that the PCI device lock is already held, and makes calling pci_reset_function() impossible (since it will itself try to take that lock).
Add pci_reset_function_locked(), which is the equivalent of pci_reset_function(), except that it requires the PCI device lock to be already held by the caller.
[bhelgaas: folded in fix for conflict with 52354b9d1f46 ("PCI: Remove __pci_dev_reset() and pci_dev_reset()")]
--- drivers/pci/pci.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/pci.h | 1 + 2 files changed, 36 insertions(+)
drivers/pci/pci.c +35 -0
@@ -4291,6 +4291,41 @@ int pci_reset_function(struct pci_dev *dEXPORT_SYMBOL_GPL (pci_reset_function);/** +* pci_reset_function_locked - quiesce and reset a PCI device function +* @dev: PCI device to reset +* +* Some devices allow an individual function to be reset without affecting +* other functions in the same device. The PCI device must be responsive +* to PCI config space in order to use this function. +* +* This function does not just reset the PCI portion of a device, but +* clears all the state associated with the device. This function differs +* from __pci_reset_function() in that it saves and restores device state +* over the reset. It also differs from pci_reset_function() in that it +* requires the PCI device lock to be held. +* +* Returns 0 if the device function was successfully reset or negative if the +* device doesn't support resetting a single function. +*/ +int pci_reset_function_locked (struct pci_dev *dev) +{ +int rc; + + rc =pci_probe_reset_function (dev); +if (rc) +return rc; + +pci_dev_save_and_disable (dev); + + rc =__pci_reset_function_locked (dev); + +pci_dev_restore (dev); + +return rc; +} +EXPORT_SYMBOL_GPL (pci_reset_function_locked); + +/** * pci_try_reset_function - quiesce and reset a PCI device function * @dev: PCI device to reset *
include/linux/pci.h +1 -0
@@ -1049,6 +1049,7 @@ void pcie_flr(struct pci_dev *dev);int __pci_reset_function (struct pci_dev *dev);int __pci_reset_function_locked (struct pci_dev *dev);int pci_reset_function (struct pci_dev *dev); +int pci_reset_function_locked (struct pci_dev *dev);int pci_try_reset_function (struct pci_dev *dev);int pci_probe_reset_slot (struct pci_slot *slot);int pci_reset_slot (struct pci_slot *slot);
Greg Kroah-Hartman
maintainerPATCH 51/65 xhci: Reset Renesas uPD72020x USB controller for 32-bit DMA issue
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
commit 8466489ef5ba48272ba4fa4ea9f8f403306de4c7 upstream.
The Renesas uPD72020x XHCI controller seems to suffer from a really annoying bug, where it may retain some of its DMA programming across a XHCI reset, and despite the driver correctly programming new DMA addresses. This is visible if the device has been using 64-bit DMA addresses, and is then switched to using 32-bit DMA addresses. The top 32 bits of the address (now zero) are ignored are replaced by the 32 bits from the *previous* programming. Sticking with 64-bit DMA always works, but doesn't seem very appropriate.
A PCI reset of the device restores the normal functionality, which is done at probe time. Unfortunately, this has to be done before any quirk has been discovered, hence the intrusive nature of the fix.
--- drivers/usb/host/pci-quirks.c | 20 ++++++++++++++++++++ drivers/usb/host/pci-quirks.h | 1 + drivers/usb/host/xhci-pci.c | 7 +++++++ 3 files changed, 28 insertions(+)
drivers/usb/host/pci-quirks.c +20 -0
@@ -1157,3 +1157,23 @@ static void quirk_usb_early_handoff(stru }DECLARE_PCI_FIXUP_CLASS_FINAL (PCI_ANY_ID ,PCI_ANY_ID ,PCI_CLASS_SERIAL_USB ,8 , quirk_usb_early_handoff); + +bool usb_xhci_needs_pci_reset (struct pci_dev *pdev) +{ +/* +* Our dear uPD72020{1,2} friend only partially resets when +* asked to via the XHCI interface, and may end up doing DMA +* at the wrong addresses, as it keeps the top 32bit of some +* addresses from its previous programming under obscure +* circumstances. +* Give it a good wack at probe time. Unfortunately, this +* needs to happen before we've had a chance to discover any +* quirk, or the system will be in a rather bad state. +*/ +if (pdev->vendor ==PCI_VENDOR_ID_RENESAS && + (pdev->device ==0x0014 || pdev->device ==0x0015 )) +return true; + +return false; +} +EXPORT_SYMBOL_GPL (usb_xhci_needs_pci_reset);
drivers/usb/host/pci-quirks.h +1 -0
@@ -15,6 +15,7 @@ void usb_asmedia_modifyflowcontrol(strucvoid usb_enable_intel_xhci_ports (struct pci_dev *xhci_pdev);void usb_disable_xhci_ports (struct pci_dev *xhci_pdev);void sb800_prefetch (struct device *dev,int on); +bool usb_xhci_needs_pci_reset (struct pci_dev *pdev);#else struct pci_dev ;static inline void usb_amd_quirk_pll_disable (void ) {}
drivers/usb/host/xhci-pci.c +7 -0
@@ -285,6 +285,13 @@ static int xhci_pci_probe(struct pci_dev driver = (struct hc_driver *)id->driver_data; +/* For some HW implementation, a XHCI reset is just not enough... */ +if (usb_xhci_needs_pci_reset (dev)) { +dev_info (&dev->dev,"Resetting\n" ); +if (pci_reset_function_locked (dev)) +dev_warn (&dev->dev,"Reset failed" ); + } +/* Prevent runtime suspending between USB-2 and USB-3 initialization */ pm_runtime_get_noresume (&dev->dev);
Greg Kroah-Hartman
maintainerPATCH 52/65 iio: adc: vf610_adc: Fix VALT selection value for REFSEL bits
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan-Gabriel Mirea <[email protected]>
commit d466d3c1217406b14b834335b5b4b33c0d45bd09 upstream.
In order to select the alternate voltage reference pair (VALTH/VALTL), the right value for the REFSEL field in the ADCx_CFG register is "01", leading to 0x800 as register mask. See section 8.2.6.4 in the reference manual[1].
[1] http://www.nxp.com/docs/en/reference-manual/VFXXXRM.pdf
--- drivers/iio/adc/vf610_adc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/vf610_adc.c +1 -1
@@ -77,7 +77,7 @@#define VF610_ADC_ADSTS_MASK 0x300#define VF610_ADC_ADLPC_EN 0x80#define VF610_ADC_ADHSC_EN 0x400 -#define VF610_ADC_REFSEL_VALT 0x100 +#define VF610_ADC_REFSEL_VALT 0x800#define VF610_ADC_REFSEL_VBG 0x1000#define VF610_ADC_ADTRG_HARD 0x2000#define VF610_ADC_AVGS_8 0x4000
Greg Kroah-Hartman
maintainerPATCH 53/65 pnfs/blocklayout: require 64-bit sector_t
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
commit 8a9d6e964d318533ba3d2901ce153ba317c99a89 upstream.
The blocklayout code does not compile cleanly for a 32-bit sector_t, and also has no reliable checks for devices sizes, which makes it unsafe to use with a kernel that doesn't support large block devices.
--- fs/nfs/Kconfig | 1 + 1 file changed, 1 insertion(+)
fs/nfs/Kconfig +1 -0
@@ -121,6 +121,7 @@ config PNFS_FILE_LAYOUT config PNFS_BLOCK tristate depends on NFS_V4_1 && BLK_DEV_DM + depends on 64BIT || LBDAF default NFS_V4 config PNFS_FLEXFILE_LAYOUT
Greg Kroah-Hartman
maintainerPATCH 54/65 pinctrl: cherryview: Add Setzer models to the Chromebook DMI quirk
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 2d80bd3f7eb69204cd5dec4fa7fe7e12cbfaed13 upstream.
Add one more model to the Chromebook DMI quirk to make it working again.
--- drivers/pinctrl/intel/pinctrl-cherryview.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/pinctrl/intel/pinctrl-cherryview.c +7 -0
@@ -1548,6 +1548,13 @@ static const struct dmi_system_id chv_no }, }, { + .ident = "HP Chromebook 11 G5 (Setzer)", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"HP" ), + DMI_MATCH(DMI_PRODUCT_NAME, "Setzer"), + }, + }, + { .ident ="Acer Chromebook R11 (Cyan)" , .matches = { DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
Greg Kroah-Hartman
maintainerPATCH 55/65 pinctrl: sunxi: add a missing function of A10/A20 pinctrl driver
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Icenowy Zheng <[email protected]>
commit d81ece747d8727bb8b1cfc9a20dbe62f09a4e35a upstream.
The PH16 pin has a function with mux id 0x5, which is the DET pin of the "sim" (smart card reader) IP block.
This function is missing in old versions of A10/A20 SoCs' datasheets and user manuals, so it's also missing in the old drivers. The newest A10 Datasheet V1.70 and A20 Datasheet V1.41 contain this pin function, and it's discovered during implementing R40 pinctrl driver.
Add it to the driver. As we now merged A20 pinctrl driver to the A10 one, we need to only fix the A10 driver now.
driver to a driver of its own")
--- drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c | 1 + 1 file changed, 1 insertion(+)
drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c +1 -0
@@ -811,6 +811,7 @@ static const struct sunxi_desc_pin sun4i SUNXI_FUNCTION(0x2, "lcd1"), /* D16 */ SUNXI_FUNCTION(0x3, "pata"), /* ATAD12 */ SUNXI_FUNCTION(0x4, "keypad"), /* IN6 */ + SUNXI_FUNCTION(0x5, "sim"), /* DET */ SUNXI_FUNCTION_IRQ(0x6, 16), /* EINT16 */ SUNXI_FUNCTION(0x7, "csi1")), /* D16 */ SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 17),
Re: [PATCH 4.12 55/65] pinctrl: sunxi: add a missing function of A10/A20 pinctrl driver
Quoted 11 lines · Greg Kroah-Hartman
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Icenowy Zheng <[email protected]>
commit
d81ece747d8727bb8b1cfc9a20dbe62f09a4e35aupstream.The PH16 pin has a function with mux id
0x5, which is the DET pin of the "sim" (smart card reader) IP block.
Quoted 7 lines
This function is missing in old versions of A10/A20 SoCs' datasheets and user manuals, so it's also missing in the old drivers. The newest A10 Datasheet V1.70 and A20 Datasheet V1.41 contain this pin function, and it's discovered during implementing R40 pinctrl driver.
Add it to the driver. As we now merged A20 pinctrl driver to the A10 one, we need to only fix the A10 driver now.
That happened after 4.12, so I think for stable the same change should be applied in drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c.
Ben.
Quoted 24 lines
Fixes f2821b1ca3a2 ("pinctrl: sunxi: Move Allwinner A10 pinctrldriver to a driver of its own")
Signed-off-by Icenowy Zheng <[email protected]>Reviewed-by Chen-Yu Tsai <[email protected]>Signed-off-by Linus Walleij <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c | 1 +1 file changed, 1 insertion(+)drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c +0
-0@@ -811,6 +811,7 @@ static const struct sunxi_desc_pin sun4iSUNXI_FUNCTION(0x2, "lcd1"), /* D16 */
SUNXI_FUNCTION(0x3, "pata"), /* ATAD12 */
SUNXI_FUNCTION(0x4, "keypad"), /* IN6 */drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c +1
-0+ SUNXI_FUNCTION(0x5, "sim"), /* DET */SUNXI_FUNCTION_IRQ(0x6, 16), /* EINT16 */
SUNXI_FUNCTION(0x7, "csi1")), /* D16 */
SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 17),
Signature · 2 lines
Ben Hutchings Reality is just a crutch for people who can't handle science fiction.
Re: [PATCH 4.12 55/65] pinctrl: sunxi: add a missing function of A10/A20 pinctrl driver
Quoted 17 lines · Ben Hutchings
Quoted 16 lines · Greg Kroah-Hartman
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Icenowy Zheng <[email protected]>
commit
d81ece747d8727bb8b1cfc9a20dbe62f09a4e35aupstream.The PH16 pin has a function with mux id
0x5, which is the DET pin of the "sim" (smart card reader) IP block.This function is missing in old versions of A10/A20 SoCs' datasheets and user manuals, so it's also missing in the old drivers. The newest A10 Datasheet V1.70 and A20 Datasheet V1.41 contain this pin function, and it's discovered during implementing R40 pinctrl driver.
Quoted 5 lines
Quoted 2 lines
Add it to the driver. As we now merged A20 pinctrl driver to the A10 one, we need to only fix the A10 driver now.
That happened after 4.12, so I think for stable the same change should be applied in
drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c.
Indeed. Should we send a backported patch?
Thanks
ChenYu
Quoted 31 lines
Ben.
Quoted 17 lines
Fixes f2821b1ca3a2 ("pinctrl: sunxi: Move Allwinner A10 pinctrldriver to a driver of its own")
Signed-off-by Icenowy Zheng <[email protected]>Reviewed-by Chen-Yu Tsai <[email protected]>Signed-off-by Linus Walleij <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c | 1 + 1 file changed, 1 insertion(+)drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c static const struct sunxi_desc_pin sun4i · line 817
Quoted 7 lines
drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c +1
-0@@ -811,6 +811,7 @@ static const struct sunxi_desc_pin sun4i SUNXI_FUNCTION(0x2, "lcd1"), /* D16 */ SUNXI_FUNCTION(0x3, "pata"), /* ATAD12 */ SUNXI_FUNCTION(0x4, "keypad"), /* IN6 */ + SUNXI_FUNCTION(0x5, "sim"), /* DET */ SUNXI_FUNCTION_IRQ(0x6, 16), /* EINT16 */ SUNXI_FUNCTION(0x7, "csi1")), /* D16 */ SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 17),--
Ben Hutchings
Reality is just a crutch for people who can't handle science fiction.
Greg Kroah-Hartman
maintainerRe: [PATCH 4.12 55/65] pinctrl: sunxi: add a missing function of A10/A20 pinctrl driver
Quoted 18 lines · Chen-Yu Tsai
Quoted 17 lines · Ben Hutchings
Quoted 16 lines · Greg Kroah-Hartman
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Icenowy Zheng <[email protected]>
commit
d81ece747d8727bb8b1cfc9a20dbe62f09a4e35aupstream.The PH16 pin has a function with mux id
0x5, which is the DET pin of the "sim" (smart card reader) IP block.This function is missing in old versions of A10/A20 SoCs' datasheets and user manuals, so it's also missing in the old drivers. The newest A10 Datasheet V1.70 and A20 Datasheet V1.41 contain this pin function, and it's discovered during implementing R40 pinctrl driver.
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
Add it to the driver. As we now merged A20 pinctrl driver to the A10 one, we need to only fix the A10 driver now.
That happened after 4.12, so I think for stable the same change should be applied in
drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c.Indeed. Should we send a backported patch?
Yes, please do.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 56/65 pinctrl: intel: merrifield: Correct UART pin lists
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 5d996132d921c391af5f267123eca1a6a3148ecd upstream.
UART pin lists consist GPIO numbers which is simply wrong. Replace it by pin numbers.
--- drivers/pinctrl/intel/pinctrl-merrifield.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pinctrl/intel/pinctrl-merrifield.c +3 -3
@@ -343,9 +343,9 @@ static const struct pinctrl_pin_desc mrfstatic const unsigned int mrfld_sdio_pins[] = {50 ,51 ,52 ,53 ,54 ,55 ,56 };static const unsigned int mrfld_spi5_pins[] = {90 ,91 ,92 ,93 ,94 ,95 ,96 }; -static const unsigned int mrfld_uart0_pins[] = {124 ,125 ,126 ,127 }; -static const unsigned int mrfld_uart1_pins[] = {128 ,129 ,130 ,131 }; -static const unsigned int mrfld_uart2_pins[] = {132 ,133 ,134 ,135 }; +static const unsigned int mrfld_uart0_pins[] = {115 ,116 ,117 ,118 }; +static const unsigned int mrfld_uart1_pins[] = {119 ,120 ,121 ,122 }; +static const unsigned int mrfld_uart2_pins[] = {123 ,124 ,125 ,126 };static const unsigned int mrfld_pwm0_pins[] = {144 };static const unsigned int mrfld_pwm1_pins[] = {145 };static const unsigned int mrfld_pwm2_pins[] = {132 };
Greg Kroah-Hartman
maintainerPATCH 57/65 pinctrl: uniphier: fix WARN_ON() of pingroups dump on LD11
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
commit 9592bc256d50481dfcdba93890e576a728fb373c upstream.
The pingroups dump of debugfs hits WARN_ON() in pinctrl_groups_show(). Filling non-existing ports with '-1' turned out a bad idea.
--- drivers/pinctrl/uniphier/pinctrl-uniphier-ld11.c | 364 ++++++++++++----------- 1 file changed, 192 insertions(+), 172 deletions(-)
drivers/pinctrl/uniphier/pinctrl-uniphier-ld11.c +192 -172
@@ -508,57 +508,71 @@ static const unsigned usb1_pins[] = {48,static const int usb1_muxvals[] = {0 ,0 };static const unsigned usb2_pins[] = {50 ,51 };static const int usb2_muxvals[] = {0 ,0 }; -static const unsigned port_range_pins[] = { +static const unsigned port_range0_pins[] = {159 ,160 ,161 ,162 ,163 ,164 ,165 ,166 ,/* PORT0x */ 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,/* PORT1x */ 8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,/* PORT2x */ -16 ,17 ,18 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT3x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT4x */ --1 ,-1 ,-1 ,46 ,47 ,48 ,49 ,50 ,/* PORT5x */ -51 ,-1 ,-1 ,54 ,55 ,56 ,57 ,58 ,/* PORT6x */ +16 ,17 ,18 ,/* PORT30-32 */ +}; +static const int port_range0_muxvals[] = { +15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT0x */ +15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT1x */ +15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT2x */ +15 ,15 ,15 ,/* PORT30-32 */ +}; +static const unsigned port_range1_pins[] = { +46 ,47 ,48 ,49 ,50 ,/* PORT53-57 */ +51 ,/* PORT60 */ +}; +static const int port_range1_muxvals[] = { +15 ,15 ,15 ,15 ,15 ,/* PORT53-57 */ +15 ,/* PORT60 */ +}; +static const unsigned port_range2_pins[] = { +54 ,55 ,56 ,57 ,58 ,/* PORT63-67 */ 59 ,60 ,69 ,70 ,71 ,72 ,73 ,74 ,/* PORT7x */ 75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,/* PORT8x */ 83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,/* PORT9x */ 91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,/* PORT10x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT11x */ -99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,/* PORT12x */ -107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,/* PORT13x */ -115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,/* PORT14x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT15x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT16x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT17x */ -61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,/* PORT18x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT19x */ -123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,/* PORT20x */ -131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,/* PORT21x */ -139 ,140 ,141 ,142 ,-1 ,-1 ,-1 ,-1 ,/* PORT22x */ -147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,/* PORT23x */ -155 ,156 ,157 ,143 ,144 ,145 ,146 ,158 ,/* PORT24x */ }; -static const int port_range_muxvals[] = { -15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT0x */ -15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT1x */ -15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT2x */ -15 ,15 ,15 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT3x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT4x */ --1 ,-1 ,-1 ,15 ,15 ,15 ,15 ,15 ,/* PORT5x */ -15 ,-1 ,-1 ,15 ,15 ,15 ,15 ,15 ,/* PORT6x */ +static const int port_range2_muxvals[] = { +15 ,15 ,15 ,15 ,15 ,/* PORT63-67 */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT7x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT8x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT9x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT10x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT11x */ +}; +static const unsigned port_range3_pins[] = { +99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,/* PORT12x */ +107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,/* PORT13x */ +115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,/* PORT14x */ +}; +static const int port_range3_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT12x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT13x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT14x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT15x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT16x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT17x */ +}; +static const unsigned port_range4_pins[] = { +61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,/* PORT18x */ +}; +static const int port_range4_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT18x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT19x */ +}; +static const unsigned port_range5_pins[] = { +123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,/* PORT20x */ +131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,/* PORT21x */ +139 ,140 ,141 ,142 ,/* PORT220-223 */ +}; +static const int port_range5_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT20x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT21x */ -15 ,15 ,15 ,15 ,-1 ,-1 ,-1 ,-1 ,/* PORT22x */ +15 ,15 ,15 ,15 ,/* PORT220-223 */ +}; +static const unsigned port_range6_pins[] = { +147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,/* PORT23x */ +155 ,156 ,157 ,143 ,144 ,145 ,146 ,158 ,/* PORT24x */ +}; +static const int port_range6_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT23x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT24x */ };
@@ -607,147 +621,153 @@ static const struct uniphier_pinctrl_groUNIPHIER_PINCTRL_GROUP (usb0),UNIPHIER_PINCTRL_GROUP (usb1),UNIPHIER_PINCTRL_GROUP (usb2), -UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range0), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range1), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range2), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range3), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range4), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range5), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range6),UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ (xirq),UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ (xirq_alternatives), -UNIPHIER_PINCTRL_GROUP_SINGLE (port00, port_range,0 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port01, port_range,1 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port02, port_range,2 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port03, port_range,3 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port04, port_range,4 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port05, port_range,5 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port06, port_range,6 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port07, port_range,7 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port10, port_range,8 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port11, port_range,9 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port12, port_range,10 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port13, port_range,11 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port14, port_range,12 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port15, port_range,13 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port16, port_range,14 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port17, port_range,15 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port20, port_range,16 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port21, port_range,17 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port22, port_range,18 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port23, port_range,19 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port24, port_range,20 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port25, port_range,21 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port26, port_range,22 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port27, port_range,23 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port30, port_range,24 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port31, port_range,25 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port32, port_range,26 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port53, port_range,43 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port54, port_range,44 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port55, port_range,45 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port56, port_range,46 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port57, port_range,47 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port60, port_range,48 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port63, port_range,51 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port64, port_range,52 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port65, port_range,53 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port66, port_range,54 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port67, port_range,55 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port70, port_range,56 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port71, port_range,57 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port72, port_range,58 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port73, port_range,59 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port74, port_range,60 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port75, port_range,61 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port76, port_range,62 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port77, port_range,63 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port80, port_range,64 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port81, port_range,65 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port82, port_range,66 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port83, port_range,67 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port84, port_range,68 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port85, port_range,69 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port86, port_range,70 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port87, port_range,71 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port90, port_range,72 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port91, port_range,73 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port92, port_range,74 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port93, port_range,75 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port94, port_range,76 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port95, port_range,77 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port96, port_range,78 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port97, port_range,79 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port100, port_range,80 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port101, port_range,81 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port102, port_range,82 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port103, port_range,83 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port104, port_range,84 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port105, port_range,85 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port106, port_range,86 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port107, port_range,87 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port120, port_range,96 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port121, port_range,97 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port122, port_range,98 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port123, port_range,99 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port124, port_range,100 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port125, port_range,101 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port126, port_range,102 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port127, port_range,103 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port130, port_range,104 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port131, port_range,105 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port132, port_range,106 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port133, port_range,107 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port134, port_range,108 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port135, port_range,109 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port136, port_range,110 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port137, port_range,111 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port140, port_range,112 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port141, port_range,113 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port142, port_range,114 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port143, port_range,115 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port144, port_range,116 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port145, port_range,117 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port146, port_range,118 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port147, port_range,119 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port180, port_range,144 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port181, port_range,145 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port182, port_range,146 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port183, port_range,147 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port184, port_range,148 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port185, port_range,149 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port186, port_range,150 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port187, port_range,151 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port200, port_range,160 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port201, port_range,161 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port202, port_range,162 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port203, port_range,163 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port204, port_range,164 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port205, port_range,165 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port206, port_range,166 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port207, port_range,167 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port210, port_range,168 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port211, port_range,169 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port212, port_range,170 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port213, port_range,171 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port214, port_range,172 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port215, port_range,173 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port216, port_range,174 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port217, port_range,175 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port220, port_range,176 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port221, port_range,177 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port222, port_range,178 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port223, port_range,179 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port230, port_range,184 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port231, port_range,185 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port232, port_range,186 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port233, port_range,187 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port234, port_range,188 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port235, port_range,189 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port236, port_range,190 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port237, port_range,191 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port240, port_range,192 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port241, port_range,193 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port242, port_range,194 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port243, port_range,195 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port244, port_range,196 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port245, port_range,197 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port246, port_range,198 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port247, port_range,199 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port00, port_range0,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port01, port_range0,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port02, port_range0,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port03, port_range0,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port04, port_range0,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port05, port_range0,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port06, port_range0,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port07, port_range0,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port10, port_range0,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port11, port_range0,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port12, port_range0,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port13, port_range0,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port14, port_range0,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port15, port_range0,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port16, port_range0,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port17, port_range0,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port20, port_range0,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port21, port_range0,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port22, port_range0,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port23, port_range0,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port24, port_range0,20 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port25, port_range0,21 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port26, port_range0,22 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port27, port_range0,23 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port30, port_range0,24 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port31, port_range0,25 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port32, port_range0,26 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port53, port_range1,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port54, port_range1,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port55, port_range1,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port56, port_range1,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port57, port_range1,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port60, port_range1,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port63, port_range2,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port64, port_range2,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port65, port_range2,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port66, port_range2,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port67, port_range2,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port70, port_range2,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port71, port_range2,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port72, port_range2,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port73, port_range2,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port74, port_range2,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port75, port_range2,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port76, port_range2,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port77, port_range2,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port80, port_range2,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port81, port_range2,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port82, port_range2,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port83, port_range2,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port84, port_range2,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port85, port_range2,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port86, port_range2,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port87, port_range2,20 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port90, port_range2,21 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port91, port_range2,22 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port92, port_range2,23 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port93, port_range2,24 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port94, port_range2,25 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port95, port_range2,26 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port96, port_range2,27 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port97, port_range2,28 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port100, port_range2,29 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port101, port_range2,30 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port102, port_range2,31 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port103, port_range2,32 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port104, port_range2,33 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port105, port_range2,34 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port106, port_range2,35 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port107, port_range2,36 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port120, port_range3,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port121, port_range3,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port122, port_range3,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port123, port_range3,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port124, port_range3,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port125, port_range3,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port126, port_range3,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port127, port_range3,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port130, port_range3,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port131, port_range3,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port132, port_range3,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port133, port_range3,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port134, port_range3,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port135, port_range3,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port136, port_range3,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port137, port_range3,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port140, port_range3,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port141, port_range3,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port142, port_range3,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port143, port_range3,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port144, port_range3,20 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port145, port_range3,21 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port146, port_range3,22 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port147, port_range3,23 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port180, port_range4,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port181, port_range4,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port182, port_range4,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port183, port_range4,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port184, port_range4,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port185, port_range4,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port186, port_range4,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port187, port_range4,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port200, port_range5,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port201, port_range5,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port202, port_range5,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port203, port_range5,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port204, port_range5,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port205, port_range5,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port206, port_range5,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port207, port_range5,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port210, port_range5,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port211, port_range5,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port212, port_range5,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port213, port_range5,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port214, port_range5,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port215, port_range5,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port216, port_range5,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port217, port_range5,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port220, port_range5,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port221, port_range5,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port222, port_range5,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port223, port_range5,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port230, port_range6,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port231, port_range6,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port232, port_range6,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port233, port_range6,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port234, port_range6,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port235, port_range6,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port236, port_range6,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port237, port_range6,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port240, port_range6,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port241, port_range6,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port242, port_range6,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port243, port_range6,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port244, port_range6,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port245, port_range6,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port246, port_range6,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port247, port_range6,15 ),UNIPHIER_PINCTRL_GROUP_SINGLE (xirq0, xirq,0 ),UNIPHIER_PINCTRL_GROUP_SINGLE (xirq1, xirq,1 ), UNIPHIER_PINCTRL_GROUP_SINGLE(xirq2, xirq, 2),
Greg Kroah-Hartman
maintainerPATCH 58/65 pinctrl: uniphier: fix WARN_ON() of pingroups dump on LD20
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
commit 1bd303dc04c3f744474e77c153575087b657f7e1 upstream.
The pingroups dump of debugfs hits WARN_ON() in pinctrl_groups_show(). Filling non-existing ports with '-1' turned out a bad idea.
--- drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c | 383 +++++++++++------------ 1 file changed, 194 insertions(+), 189 deletions(-)
drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c +194 -189
@@ -597,7 +597,7 @@ static const unsigned usb2_pins[] = {50,static const int usb2_muxvals[] = {0 ,0 };static const unsigned usb3_pins[] = {52 ,53 };static const int usb3_muxvals[] = {0 ,0 }; -static const unsigned port_range_pins[] = { +static const unsigned port_range0_pins[] = {168 ,169 ,170 ,171 ,172 ,173 ,174 ,175 ,/* PORT0x */ 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,/* PORT1x */ 8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,/* PORT2x */
@@ -609,23 +609,8 @@ static const unsigned port_range_pins[]75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,/* PORT8x */ 83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,/* PORT9x */ 91, 92, 93, 94, 95, 96, 97, 98, /* PORT10x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT11x */ -99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,/* PORT12x */ -107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,/* PORT13x */ -115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,/* PORT14x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT15x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT16x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT17x */ -61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,/* PORT18x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT19x */ -123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,/* PORT20x */ -131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,/* PORT21x */ -139 ,140 ,141 ,142 ,143 ,144 ,145 ,146 ,/* PORT22x */ -147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,/* PORT23x */ -155 ,156 ,157 ,158 ,159 ,160 ,161 ,162 ,/* PORT24x */ - 163, 164, 165, 166, 167, /* PORT25x */ }; -static const int port_range_muxvals[] = { +static const int port_range0_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT0x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT1x */ 15, 15, 15, 15, 15, 15, 15, 15, /* PORT2x */
@@ -637,21 +622,38 @@ static const int port_range_muxvals[] =15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT8x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT9x */ 15, 15, 15, 15, 15, 15, 15, 15, /* PORT10x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT11x */ +}; +static const unsigned port_range1_pins[] = { +99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,/* PORT12x */ +107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,/* PORT13x */ +115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,/* PORT14x */ +}; +static const int port_range1_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT12x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT13x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT14x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT15x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT16x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT17x */ +}; +static const unsigned port_range2_pins[] = { +61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,/* PORT18x */ +}; +static const int port_range2_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT18x */ --1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* PORT19x */ +}; +static const unsigned port_range3_pins[] = { +123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,/* PORT20x */ +131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,/* PORT21x */ +139 ,140 ,141 ,142 ,143 ,144 ,145 ,146 ,/* PORT22x */ +147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,/* PORT23x */ +155 ,156 ,157 ,158 ,159 ,160 ,161 ,162 ,/* PORT24x */ +163 ,164 ,165 ,166 ,167 ,/* PORT250-254 */ +}; +static const int port_range3_muxvals[] = {15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT20x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT21x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT22x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT23x */ 15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,/* PORT24x */ - 15, 15, 15, 15, 15, /* PORT25x */ +15 ,15 ,15 ,15 ,15 ,/* PORT250-254 */ };static const unsigned xirq_pins[] = { 149, 150, 151, 152, 153, 154, 155, 156, /* XIRQ0-7 */
@@ -695,174 +697,177 @@ static const struct uniphier_pinctrl_groUNIPHIER_PINCTRL_GROUP (usb1),UNIPHIER_PINCTRL_GROUP (usb2),UNIPHIER_PINCTRL_GROUP (usb3), -UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range0), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range1), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range2), +UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT (port_range3),UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ (xirq),UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ (xirq_alternatives), -UNIPHIER_PINCTRL_GROUP_SINGLE (port00, port_range,0 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port01, port_range,1 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port02, port_range,2 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port03, port_range,3 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port04, port_range,4 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port05, port_range,5 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port06, port_range,6 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port07, port_range,7 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port10, port_range,8 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port11, port_range,9 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port12, port_range,10 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port13, port_range,11 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port14, port_range,12 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port15, port_range,13 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port16, port_range,14 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port17, port_range,15 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port20, port_range,16 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port21, port_range,17 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port22, port_range,18 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port23, port_range,19 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port24, port_range,20 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port25, port_range,21 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port26, port_range,22 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port27, port_range,23 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port30, port_range,24 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port31, port_range,25 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port32, port_range,26 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port33, port_range,27 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port34, port_range,28 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port35, port_range,29 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port36, port_range,30 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port37, port_range,31 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port40, port_range,32 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port41, port_range,33 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port42, port_range,34 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port43, port_range,35 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port44, port_range,36 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port45, port_range,37 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port46, port_range,38 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port47, port_range,39 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port50, port_range,40 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port51, port_range,41 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port52, port_range,42 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port53, port_range,43 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port54, port_range,44 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port55, port_range,45 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port56, port_range,46 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port57, port_range,47 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port60, port_range,48 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port61, port_range,49 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port62, port_range,50 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port63, port_range,51 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port64, port_range,52 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port65, port_range,53 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port66, port_range,54 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port67, port_range,55 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port70, port_range,56 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port71, port_range,57 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port72, port_range,58 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port73, port_range,59 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port74, port_range,60 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port75, port_range,61 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port76, port_range,62 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port77, port_range,63 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port80, port_range,64 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port81, port_range,65 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port82, port_range,66 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port83, port_range,67 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port84, port_range,68 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port85, port_range,69 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port86, port_range,70 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port87, port_range,71 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port90, port_range,72 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port91, port_range,73 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port92, port_range,74 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port93, port_range,75 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port94, port_range,76 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port95, port_range,77 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port96, port_range,78 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port97, port_range,79 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port100, port_range,80 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port101, port_range,81 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port102, port_range,82 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port103, port_range,83 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port104, port_range,84 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port105, port_range,85 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port106, port_range,86 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port107, port_range,87 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port120, port_range,96 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port121, port_range,97 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port122, port_range,98 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port123, port_range,99 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port124, port_range,100 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port125, port_range,101 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port126, port_range,102 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port127, port_range,103 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port130, port_range,104 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port131, port_range,105 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port132, port_range,106 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port133, port_range,107 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port134, port_range,108 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port135, port_range,109 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port136, port_range,110 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port137, port_range,111 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port140, port_range,112 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port141, port_range,113 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port142, port_range,114 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port143, port_range,115 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port144, port_range,116 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port145, port_range,117 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port146, port_range,118 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port147, port_range,119 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port180, port_range,144 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port181, port_range,145 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port182, port_range,146 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port183, port_range,147 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port184, port_range,148 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port185, port_range,149 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port186, port_range,150 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port187, port_range,151 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port200, port_range,160 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port201, port_range,161 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port202, port_range,162 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port203, port_range,163 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port204, port_range,164 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port205, port_range,165 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port206, port_range,166 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port207, port_range,167 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port210, port_range,168 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port211, port_range,169 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port212, port_range,170 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port213, port_range,171 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port214, port_range,172 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port215, port_range,173 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port216, port_range,174 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port217, port_range,175 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port220, port_range,176 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port221, port_range,177 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port222, port_range,178 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port223, port_range,179 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port224, port_range,180 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port225, port_range,181 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port226, port_range,182 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port227, port_range,183 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port230, port_range,184 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port231, port_range,185 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port232, port_range,186 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port233, port_range,187 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port234, port_range,188 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port235, port_range,189 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port236, port_range,190 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port237, port_range,191 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port240, port_range,192 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port241, port_range,193 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port242, port_range,194 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port243, port_range,195 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port244, port_range,196 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port245, port_range,197 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port246, port_range,198 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port247, port_range,199 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port250, port_range,200 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port251, port_range,201 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port252, port_range,202 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port253, port_range,203 ), -UNIPHIER_PINCTRL_GROUP_SINGLE (port254, port_range,204 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port00, port_range0,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port01, port_range0,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port02, port_range0,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port03, port_range0,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port04, port_range0,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port05, port_range0,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port06, port_range0,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port07, port_range0,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port10, port_range0,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port11, port_range0,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port12, port_range0,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port13, port_range0,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port14, port_range0,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port15, port_range0,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port16, port_range0,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port17, port_range0,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port20, port_range0,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port21, port_range0,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port22, port_range0,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port23, port_range0,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port24, port_range0,20 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port25, port_range0,21 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port26, port_range0,22 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port27, port_range0,23 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port30, port_range0,24 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port31, port_range0,25 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port32, port_range0,26 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port33, port_range0,27 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port34, port_range0,28 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port35, port_range0,29 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port36, port_range0,30 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port37, port_range0,31 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port40, port_range0,32 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port41, port_range0,33 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port42, port_range0,34 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port43, port_range0,35 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port44, port_range0,36 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port45, port_range0,37 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port46, port_range0,38 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port47, port_range0,39 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port50, port_range0,40 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port51, port_range0,41 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port52, port_range0,42 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port53, port_range0,43 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port54, port_range0,44 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port55, port_range0,45 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port56, port_range0,46 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port57, port_range0,47 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port60, port_range0,48 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port61, port_range0,49 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port62, port_range0,50 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port63, port_range0,51 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port64, port_range0,52 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port65, port_range0,53 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port66, port_range0,54 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port67, port_range0,55 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port70, port_range0,56 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port71, port_range0,57 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port72, port_range0,58 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port73, port_range0,59 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port74, port_range0,60 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port75, port_range0,61 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port76, port_range0,62 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port77, port_range0,63 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port80, port_range0,64 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port81, port_range0,65 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port82, port_range0,66 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port83, port_range0,67 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port84, port_range0,68 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port85, port_range0,69 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port86, port_range0,70 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port87, port_range0,71 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port90, port_range0,72 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port91, port_range0,73 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port92, port_range0,74 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port93, port_range0,75 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port94, port_range0,76 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port95, port_range0,77 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port96, port_range0,78 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port97, port_range0,79 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port100, port_range0,80 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port101, port_range0,81 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port102, port_range0,82 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port103, port_range0,83 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port104, port_range0,84 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port105, port_range0,85 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port106, port_range0,86 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port107, port_range0,87 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port120, port_range1,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port121, port_range1,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port122, port_range1,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port123, port_range1,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port124, port_range1,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port125, port_range1,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port126, port_range1,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port127, port_range1,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port130, port_range1,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port131, port_range1,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port132, port_range1,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port133, port_range1,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port134, port_range1,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port135, port_range1,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port136, port_range1,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port137, port_range1,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port140, port_range1,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port141, port_range1,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port142, port_range1,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port143, port_range1,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port144, port_range1,20 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port145, port_range1,21 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port146, port_range1,22 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port147, port_range1,23 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port180, port_range2,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port181, port_range2,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port182, port_range2,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port183, port_range2,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port184, port_range2,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port185, port_range2,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port186, port_range2,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port187, port_range2,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port200, port_range3,0 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port201, port_range3,1 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port202, port_range3,2 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port203, port_range3,3 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port204, port_range3,4 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port205, port_range3,5 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port206, port_range3,6 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port207, port_range3,7 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port210, port_range3,8 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port211, port_range3,9 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port212, port_range3,10 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port213, port_range3,11 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port214, port_range3,12 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port215, port_range3,13 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port216, port_range3,14 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port217, port_range3,15 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port220, port_range3,16 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port221, port_range3,17 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port222, port_range3,18 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port223, port_range3,19 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port224, port_range3,20 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port225, port_range3,21 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port226, port_range3,22 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port227, port_range3,23 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port230, port_range3,24 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port231, port_range3,25 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port232, port_range3,26 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port233, port_range3,27 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port234, port_range3,28 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port235, port_range3,29 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port236, port_range3,30 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port237, port_range3,31 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port240, port_range3,32 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port241, port_range3,33 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port242, port_range3,34 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port243, port_range3,35 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port244, port_range3,36 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port245, port_range3,37 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port246, port_range3,38 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port247, port_range3,39 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port250, port_range3,40 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port251, port_range3,41 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port252, port_range3,42 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port253, port_range3,43 ), +UNIPHIER_PINCTRL_GROUP_SINGLE (port254, port_range3,44 ),UNIPHIER_PINCTRL_GROUP_SINGLE (xirq0, xirq,0 ),UNIPHIER_PINCTRL_GROUP_SINGLE (xirq1, xirq,1 ), UNIPHIER_PINCTRL_GROUP_SINGLE(xirq2, xirq, 2),
Greg Kroah-Hartman
maintainerPATCH 59/65 pinctrl: samsung: Remove bogus irq_[un]mask from resource management
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 3fa53ec2ed885b0aec3f0472e3b4a8a6f1cd748c upstream.
The irq chip callbacks irq_request/release_resources() have absolutely no business with masking and unmasking the irq.
The core code unmasks the interrupt after complete setup and masks it before invoking irq_release_resources().
The unmask is actually harmful as it happens before the interrupt is completely initialized in __setup_irq().
Remove it.
--- drivers/pinctrl/samsung/pinctrl-exynos.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/pinctrl/samsung/pinctrl-exynos.c +0 -4
@@ -205,8 +205,6 @@ static int exynos_irq_request_resources(spin_unlock_irqrestore (&bank->slock, flags); -exynos_irq_unmask (irqd); -return 0 ; }
@@ -226,8 +224,6 @@ static void exynos_irq_release_resources shift = irqd->hwirq * bank_type->fld_width[PINCFG_TYPE_FUNC ]; mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC ]) -1 ; -exynos_irq_mask (irqd); -spin_lock_irqsave (&bank->slock, flags); con =readl (bank->eint_base + reg_con);
Greg Kroah-Hartman
maintainerPATCH 60/65 pinctrl: meson-gxbb: Add missing GPIODV_18 pin entry
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neil Armstrong <[email protected]>
commit 34e61801a3b9df74b69f0e359d64a197a77dd6ac upstream.
GPIODV_18 entry was missing in the original driver push.
--- drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 1 + 1 file changed, 1 insertion(+)
drivers/pinctrl/meson/pinctrl-meson-gxbb.c +1 -0
@@ -85,6 +85,7 @@ static const struct pinctrl_pin_desc mesMESON_PIN (GPIODV_15 ,EE_OFF ),MESON_PIN (GPIODV_16 ,EE_OFF ),MESON_PIN (GPIODV_17 ,EE_OFF ), +MESON_PIN (GPIODV_18 ,EE_OFF ),MESON_PIN (GPIODV_19 ,EE_OFF ),MESON_PIN (GPIODV_20 ,EE_OFF ), MESON_PIN(GPIODV_21, EE_OFF),
Greg Kroah-Hartman
maintainerPATCH 61/65 pinctrl: meson-gxl: Add missing GPIODV_18 pin entry
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neil Armstrong <[email protected]>
commit aa9556956653f85baaadeb4846dc571414f13e36 upstream.
GPIODV_18 entry was missing in the original driver push.
--- drivers/pinctrl/meson/pinctrl-meson-gxl.c | 1 + 1 file changed, 1 insertion(+)
drivers/pinctrl/meson/pinctrl-meson-gxl.c +1 -0
@@ -89,6 +89,7 @@ static const struct pinctrl_pin_desc mesMESON_PIN (GPIODV_15 ,EE_OFF ),MESON_PIN (GPIODV_16 ,EE_OFF ),MESON_PIN (GPIODV_17 ,EE_OFF ), +MESON_PIN (GPIODV_18 ,EE_OFF ),MESON_PIN (GPIODV_19 ,EE_OFF ),MESON_PIN (GPIODV_20 ,EE_OFF ), MESON_PIN(GPIODV_21, EE_OFF),
Greg Kroah-Hartman
maintainerPATCH 62/65 MIPS: DEC: Fix an int-handler.S CPU_DADDI_WORKAROUNDS regression
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit 68fe55680d0f3342969f49412fceabb90bdfadba upstream.
Fix a commit 3021773c7c3e ("MIPS: DEC: Avoid la pseudo-instruction in delay slots") regression and remove assembly errors:
arch/mips/dec/int-handler.S: Assembler messages:arch/mips/dec/int-handler.S:162: Error: Macro used $at after ".set noat" arch/mips/dec/int-handler.S:163: Error: Macro used $at after ".set noat" arch/mips/dec/int-handler.S:229: Error: Macro used $at after ".set noat" arch/mips/dec/int-handler.S:230: Error: Macro used $at after ".set noat"
triggering with with the CPU_DADDI_WORKAROUNDS option set and the DADDIU instruction. This is because with that option in place the instruction becomes a macro, which expands to an LI/DADDU (or actually ADDIU/DADDU) sequence that uses $at as a temporary register.
With CPU_DADDI_WORKAROUNDS we only support `-msym32' compilation though, and this is already enforced in arch/mips/Makefile, so choose the 32-bit expansion variant for the supported configurations and then replace the 64-bit variant with #error just in case.
Patchwork: https://patchwork.linux-mips.org/patch/16893/
--- arch/mips/dec/int-handler.S | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-)
arch/mips/dec/int-handler.S +6 -28
@@ -147,23 +147,12 @@ * Find irq with highest priority */ # open coded PTR_LA t1, cpu_mask_nr_tbl -#if (_MIPS_SZPTR == 32) +#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) # open coded la t1, cpu_mask_nr_tbl lui t1, %hi(cpu_mask_nr_tbl) addiu t1, %lo(cpu_mask_nr_tbl) - -#endif -#if (_MIPS_SZPTR == 64) - # open coded dla t1, cpu_mask_nr_tbl - .set push - .set noat - lui t1, %highest(cpu_mask_nr_tbl) - lui AT, %hi(cpu_mask_nr_tbl) - daddiu t1, t1, %higher(cpu_mask_nr_tbl) - daddiu AT, AT, %lo(cpu_mask_nr_tbl) - dsll t1, 32 - daddu t1, t1, AT - .set pop +#else +#error GCC `-msym32' option required for 64-bit DECstation builds #endif 1: lw t2,(t1) nop
@@ -214,23 +203,12 @@ * Find irq with highest priority */ # open coded PTR_LA t1,asic_mask_nr_tbl -#if (_MIPS_SZPTR == 32) +#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) # open coded la t1, asic_mask_nr_tbl lui t1, %hi(asic_mask_nr_tbl) addiu t1, %lo(asic_mask_nr_tbl) - -#endif -#if (_MIPS_SZPTR == 64) - # open coded dla t1, asic_mask_nr_tbl - .set push - .set noat - lui t1, %highest(asic_mask_nr_tbl) - lui AT, %hi(asic_mask_nr_tbl) - daddiu t1, t1, %higher(asic_mask_nr_tbl) - daddiu AT, AT, %lo(asic_mask_nr_tbl) - dsll t1, 32 - daddu t1, t1, AT - .set pop +#else +#error GCC `-msym32' option required for 64-bit DECstation builds #endif 2: lw t2,(t1) nop
Greg Kroah-Hartman
maintainerPATCH 63/65 Revert "MIPS: Dont unnecessarily include kmalloc.h into <asm/cache.h>."
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit ae5b0675942ab30cde96099c68a2290bd1aafcca upstream.
Commit 296e46db0073 ("MIPS: Don't unnecessarily include kmalloc.h into <asm/cache.h>.") claimed that the inclusion of the machine's kmalloc.h from asm/cache.h is unnecessary, but this is not true.
Without including kmalloc.h we don't get a definition for ARCH_DMA_MINALIGN, which means we no longer suitably align DMA. Further to this the definition of ARCH_KMALLOC_MINALIGN provided by linux/slab.h ends up being set to the alignment of an unsigned long long value rather than to ARCH_DMA_MINALIGN, which means that buffers allocated using kmalloc may no longer be safely aligned for use with DMA.
Fix this by re-adding the include of kmalloc.h in asm/cache.h. This reverts commit 296e46db0073 ("MIPS: Don't unnecessarily include kmalloc.h into <asm/cache.h>.")
Patchwork: https://patchwork.linux-mips.org/patch/16895/
--- arch/mips/include/asm/cache.h | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/include/asm/cache.h +2 -0
@@ -9,6 +9,8 @@#ifndef _ASM_CACHE_H#define _ASM_CACHE_H +#include <kmalloc.h> +#define L1_CACHE_SHIFT CONFIG_MIPS_L1_CACHE_SHIFT#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
Greg Kroah-Hartman
maintainerPATCH 64/65 MIPS: Octeon: Fix broken EDAC driver.
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven J. Hill <[email protected]>
commit 81a67e52763d1db6b3200c648d1efa16daddc536 upstream.
Commit "MIPS: Octeon: Remove unused L2C types and macros." broke the the EDAC driver. Bring back 'cvmx-l2d-defs.h' file and the missing types for L2C. Fixes: 15f6847923a8 ("MIPS: Octeon: Remove unused L2C types and macros.")
Patchwork: https://patchwork.linux-mips.org/patch/16906/
--- arch/mips/include/asm/octeon/cvmx-l2c-defs.h | 37 ++++++++++++++++ arch/mips/include/asm/octeon/cvmx-l2d-defs.h | 60 +++++++++++++++++++++++++++ arch/mips/include/asm/octeon/cvmx.h | 1 3 files changed, 97 insertions(+), 1 deletion(-)
arch/mips/include/asm/octeon/cvmx-l2c-defs.h +36 -1
@@ -33,6 +33,10 @@#define CVMX_L2C_DBG (CVMX_ADD_IO_SEG(0x0001180080000030ull))#define CVMX_L2C_CFG (CVMX_ADD_IO_SEG(0x0001180080000000ull))#define CVMX_L2C_CTL (CVMX_ADD_IO_SEG(0x0001180080800000ull)) +#define CVMX_L2C_ERR_TDTX (block_id) \ + (CVMX_ADD_IO_SEG(0x0001180080A007E0ull) + ((block_id) & 3) * 0x40000ull) +#define CVMX_L2C_ERR_TTGX (block_id) \ + (CVMX_ADD_IO_SEG(0x0001180080A007E8ull) + ((block_id) & 3) * 0x40000ull)#define CVMX_L2C_LCKBASE (CVMX_ADD_IO_SEG(0x0001180080000058ull))#define CVMX_L2C_LCKOFF (CVMX_ADD_IO_SEG(0x0001180080000060ull))#define CVMX_L2C_PFCTL (CVMX_ADD_IO_SEG(0x0001180080000090ull))
@@ -66,9 +70,40 @@ ((offset) & 1) * 8)#define CVMX_L2C_WPAR_PPX (offset) (CVMX_ADD_IO_SEG(0x0001180080840000ull) + \ ((offset) & 31) * 8) -#define CVMX_L2D_FUS3 (CVMX_ADD_IO_SEG(0x00011800800007B8ull)) +union cvmx_l2c_err_tdtx { + uint64_t u64; + struct cvmx_l2c_err_tdtx_s { + __BITFIELD_FIELD(uint64_t dbe:1, + __BITFIELD_FIELD(uint64_t sbe:1, + __BITFIELD_FIELD(uint64_t vdbe:1, + __BITFIELD_FIELD(uint64_t vsbe:1, + __BITFIELD_FIELD(uint64_t syn:10, + __BITFIELD_FIELD(uint64_t reserved_22_49:28, + __BITFIELD_FIELD(uint64_t wayidx:18, + __BITFIELD_FIELD(uint64_t reserved_2_3:2, + __BITFIELD_FIELD(uint64_t type:2, + ;))))))))) + } s; +}; + +union cvmx_l2c_err_ttgx { + uint64_t u64; + struct cvmx_l2c_err_ttgx_s { + __BITFIELD_FIELD(uint64_t dbe:1, + __BITFIELD_FIELD(uint64_t sbe:1, + __BITFIELD_FIELD(uint64_t noway:1, + __BITFIELD_FIELD(uint64_t reserved_56_60:5, + __BITFIELD_FIELD(uint64_t syn:6, + __BITFIELD_FIELD(uint64_t reserved_22_49:28, + __BITFIELD_FIELD(uint64_t wayidx:15, + __BITFIELD_FIELD(uint64_t reserved_2_6:5, + __BITFIELD_FIELD(uint64_t type:2, + ;))))))))) + } s; +}; + union cvmx_l2c_cfg { uint64_t u64; struct cvmx_l2c_cfg_s {
arch/mips/include/asm/octeon/cvmx-l2d-defs.h new file +60 -0
60 lines not on this page · raw message
arch/mips/include/asm/octeon/cvmx.h +1 -0
@@ -62,6 +62,7 @@ enum cvmx_mips_space {#include <asm/octeon/cvmx-iob-defs.h> #include <asm/octeon/cvmx-ipd-defs.h> #include <asm/octeon/cvmx-l2c-defs.h> +#include <asm/octeon/cvmx-l2d-defs.h> #include <asm/octeon/cvmx-l2t-defs.h> #include <asm/octeon/cvmx-led-defs.h> #include <asm/octeon/cvmx-mio-defs.h>
Greg Kroah-Hartman
maintainerPATCH 65/65 powerpc: Fix /proc/cpuinfo revision for POWER9 DD2
In reply to Greg Kroah-Hartman4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit 64ebb9a208c6e66316329a6d9101815d1ee06fa9 upstream.
The P9 PVR bits 12-15 don't indicate a revision but instead different chip configurations. From BookIV we have:
Bits Configuration
0 : Scale out 12 cores
1 : Scale out 24 cores
2 : Scale up 12 cores
3 : Scale up 24 coresDD1 doesn't use this but DD2 does. Linux will mostly use the "Scale out 24 core" configuration (ie. SMT4 not SMT8) which results in a PVR of 0x004e1200. The reported revision in /proc/cpuinfo is hence reported incorrectly as "18.0".
This patch fixes this to mask off only the relevant bits for the major revision (ie. bits 8-11) for POWER9.
--- arch/powerpc/kernel/setup-common.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/kernel/setup-common.c +4 -0
@@ -335,6 +335,10 @@ static int show_cpuinfo(struct seq_file maj = ((pvr >>8 ) &0xFF ) -1 ; min = pvr &0xFF ;break ; +case 0x004e :/* POWER9 bits 12-15 give chip type */ + maj = (pvr >>8 ) &0x0F ; + min = pvr &0xFF ; +break ;default : maj = (pvr >>8 ) &0xFF ; min = pvr &0xFF ;
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.12.8 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 17 01:19:27 UTC 2017. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 122 pass: 122 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.12.8 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 17 01:19:27 UTC 2017. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 122 pass: 122 fail: 0Details are available at http://kerneltests.org/builders.
Great, thanks for testing all of these and letting me know.
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.12.8 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 17 01:19:27 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.12.8-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.12.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Greg Kroah-Hartman
maintainerQuoted 15 lines · Shuah Khan
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.12.8 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 17 01:19:27 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.12.8-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.12.y
and the diffstat can be found below.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Great, thanks for testing all of these and letting me know.
greg k-h