5.4.53-rc1 review
Greg Kroah-Hartman
maintainercover 5.4.53-rc1 review
This is the start of the stable review cycle for the 5.4.53 release. There are 215 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 Wed, 22 Jul 2020 15:27:31 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.53-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-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.53-rc1
Andy Shevchenko <[email protected]>
gpio: pca953x: disable regmap locking for automatic address incrementing
Colin Xu <[email protected]>
drm/i915/gvt: Fix two CFL MMIO handling caused by regression.
Lu Baolu <[email protected]>
iommu/vt-d: Make Intel SVM code 64-bit only
Shannon Nelson <[email protected]>
ionic: export features for vlans to use
Lingling Xu <[email protected]>
spi: sprd: switch the sequence of setting WDG_LOAD_LOW and _HIGH
David Howells <[email protected]>
rxrpc: Fix trace string
Ilya Dryomov <[email protected]>
libceph: don't omit recovery_deletes in target_copy()
Ming Lei <[email protected]>
block: fix get_max_segment_size() overflow on 32bit arch
Ming Lei <[email protected]>
block: fix splitting segments on boundary masks
Chris Wilson <[email protected]>
drm/i915/gt: Ignore irq enabling on the virtual engines
Xiaojie Yuan <[email protected]>
drm/amdgpu/sdma5: fix wptr overwritten in ->get_wptr()
Thomas Gleixner <[email protected]>
genirq/affinity: Handle affinity setting on inactive interrupts correctly
Vincent Guittot <[email protected]>
sched/fair: handle case of task_h_load() returning 0
Mathieu Desnoyers <[email protected]>
sched: Fix unreliable rseq cpu_id for new tasks
Will Deacon <[email protected]>
arm64: compat: Ensure upper 32 bits of x0 are zero on syscall return
Will Deacon <[email protected]>
arm64: ptrace: Consistently use pseudo-singlestep exceptions
Will Deacon <[email protected]>
arm64: ptrace: Override SPSR.SS when single-stepping is enabled
Finley Xiao <[email protected]>
thermal/drivers/cpufreq_cooling: Fix wrong frequency converted from power
Alex Hung <[email protected]>
thermal: int3403_thermal: Downgrade error message
Michał Mirosław <[email protected]>
misc: atmel-ssc: lock with mutex instead of spinlock
Robin Gong <[email protected]>
dmaengine: fsl-edma-common: correct DSIZE_32BYTE
Krzysztof Kozlowski <[email protected]>
dmaengine: mcf-edma: Fix NULL pointer exception in mcf_edma_tx_handler
Krzysztof Kozlowski <[email protected]>
dmaengine: fsl-edma: Fix NULL pointer exception in fsl_edma_tx_handler
Alexander Shishkin <[email protected]>
intel_th: Fix a NULL dereference when hub driver is not loaded
Alexander Shishkin <[email protected]>
intel_th: pci: Add Emmitsburg PCH support
Alexander Shishkin <[email protected]>
intel_th: pci: Add Tiger Lake PCH-H support
Alexander Shishkin <[email protected]>
intel_th: pci: Add Jasper Lake CPU support
Satheesh Rajendran <[email protected]>
powerpc/pseries/svm: Fix incorrect check for shared_lppaca_size
Aneesh Kumar K.V <[email protected]>
powerpc/book3s64/pkeys: Fix pkey_access_permitted() for execute disable pkey
Vishwas M <[email protected]>
hwmon: (emc2103) fix unable to change fan pwm1_enable attribute
Andreas Schwab <[email protected]>
riscv: use 16KB kernel stack on 64-bit
Frederic Weisbecker <[email protected]>
timer: Fix wheel index calculation on last level
Frederic Weisbecker <[email protected]>
timer: Prevent base->clk from moving backward
Chandrakanth Patil <[email protected]>
scsi: megaraid_sas: Remove undefined ENABLE_IRQ_POLL macro
Esben Haabendal <[email protected]>
uio_pdrv_genirq: fix use without device tree and no interrupt
Esben Haabendal <[email protected]>
uio_pdrv_genirq: Remove warning when irq is not specified
Dave Wang <[email protected]>
Input: elan_i2c - add more hardware ID for Lenovo laptops
David Pedersen <[email protected]>
Input: i8042 - add Lenovo XiaoXin Air 12 to i8042 nomux list
Alexander Usyskin <[email protected]>
mei: bus: don't clean driver pointer
Wade Mealing <[email protected]>
Revert "zram: convert remaining CLASS_ATTR() to CLASS_ATTR_RO()"
Chirantan Ekbote <[email protected]>
fuse: Fix parameter for FS_IOC_{GET,SET}FLAGS
Miklos Szeredi <[email protected]>
fuse: use ->reconfigure() instead of ->remount_fs()
Miklos Szeredi <[email protected]>
fuse: ignore 'data' argument of mount(..., MS_REMOUNT)
Amir Goldstein <[email protected]>
ovl: fix unneeded call to ovl_change_flags()
Amir Goldstein <[email protected]>
ovl: relax WARN_ON() when decoding lower directory file handle
youngjun <[email protected]>
ovl: inode reference leak in ovl_is_inuse true case.
Amir Goldstein <[email protected]>
ovl: fix regression with re-formatted lower squashfs
Chuhong Yuan <[email protected]>
serial: mxs-auart: add missed iounmap() in probe failure and remove
Alexander Lobakin <[email protected]>
virtio: virtio_console: add missing MODULE_DEVICE_TABLE() for rproc serial
Jan Kiszka <[email protected]>
Revert "tty: xilinx_uartps: Fix missing id assignment to the console"
Hans de Goede <[email protected]>
virt: vbox: Fix guest capabilities mask check
Hans de Goede <[email protected]>
virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req numbers to match upstream
AceLan Kao <[email protected]>
USB: serial: option: add Quectel EG95 LTE modem
Jörgen Storvist <[email protected]>
USB: serial: option: add GosunCn GM500 series
Igor Moura <[email protected]>
USB: serial: ch341: add new Product ID for CH340
James Hilliard <[email protected]>
USB: serial: cypress_m8: enable Simply Automated UPB PIM
Johan Hovold <[email protected]>
USB: serial: iuu_phoenix: fix memory corruption
Zhang Qiang <[email protected]>
usb: gadget: function: fix missing spinlock in f_uac1_legacy
Peter Chen <[email protected]>
usb: chipidea: core: add wakeup support for extcon
Minas Harutyunyan <[email protected]>
usb: dwc2: Fix shutdown callback in platform
Tom Rix <[email protected]>
USB: c67x00: fix use after free in c67x00_giveback_urb
Kailang Yang <[email protected]>
ALSA: hda/realtek - Enable Speaker for ASUS UX563
Kailang Yang <[email protected]>
ALSA: hda/realtek - Enable Speaker for ASUS UX533 and UX534
Jian-Hong Pan <[email protected]>
ALSA: hda/realtek: Enable headset mic of Acer TravelMate B311R-31 with ALC256
Armas Spann <[email protected]>
ALSA: hda/realtek: enable headset mic of ASUS ROG Zephyrus G14(G401) series with ALC289
Kailang Yang <[email protected]>
ALSA: hda/realtek - change to suitable link model for ASUS platform
Takashi Iwai <[email protected]>
ALSA: usb-audio: Fix race against the error recovery URB submission
Takashi Iwai <[email protected]>
ALSA: line6: Sync the pending work cancel at disconnection
Takashi Iwai <[email protected]>
ALSA: line6: Perform sanity check for each URB creation
James Hilliard <[email protected]>
HID: quirks: Ignore Simply Automated UPB PIM
Sebastian Parschauer <[email protected]>
HID: quirks: Always poll Obins Anne Pro 2 keyboard
Dmitry Torokhov <[email protected]>
HID: magicmouse: do not set up autorepeat
Maciej S. Szmigiero <[email protected]>
HID: logitech-hidpp: avoid repeated "multiplier = " log messages
Saravana Kannan <[email protected]>
slimbus: core: Fix mismatch in of_node_get/put
Vinod Koul <[email protected]>
clk: qcom: gcc: Add missing UFS clocks for SM8150
Vinod Koul <[email protected]>
clk: qcom: gcc: Add GPU and NPU clocks for SM8150
Miquel Raynal <[email protected]>
mtd: rawnand: oxnas: Release all devices in the _remove() path
Miquel Raynal <[email protected]>
mtd: rawnand: oxnas: Unregister all devices on error
Miquel Raynal <[email protected]>
mtd: rawnand: oxnas: Keep track of registered devices
Álvaro Fernández Rojas <[email protected]>
mtd: rawnand: brcmnand: fix CS0 layout
Álvaro Fernández Rojas <[email protected]>
mtd: rawnand: brcmnand: correctly verify erased pages
Miquel Raynal <[email protected]>
mtd: rawnand: timings: Fix default tR_max and tCCS_min timings
Miquel Raynal <[email protected]>
mtd: rawnand: marvell: Fix probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: marvell: Use nand_cleanup() when the device is not yet registered
Miquel Raynal <[email protected]>
mtd: rawnand: marvell: Fix the condition on a return code
Aharon Landau <[email protected]>
RDMA/mlx5: Verify that QP is created with RQ or SQ
Maulik Shah <[email protected]>
soc: qcom: rpmh-rsc: Allow using free WAKE TCS for active request
Raju P.L.S.S.S.N <[email protected]>
soc: qcom: rpmh-rsc: Clear active mode configuration for wake TCS
Maulik Shah <[email protected]>
soc: qcom: rpmh: Invalidate SLEEP and WAKE TCSes before flushing new data
Maulik Shah <[email protected]>
soc: qcom: rpmh: Update dirty flag only when data changes
Jin Yao <[email protected]>
perf stat: Zero all the 'ena' and 'run' array slot stats for interval mode
Bjorn Helgaas <[email protected]>
PCI/PM: Call .bridge_d3() hook only if non-NULL
Tomer Tayar <[email protected]>
habanalabs: Align protection bits configuration of all TPCs
John Johansen <[email protected]>
apparmor: ensure that dfa state tables have entries
Srinivas Kandagatla <[email protected]>
soc: qcom: socinfo: add missing soc_id sysfs entry
Sean Wang <[email protected]>
arm: dts: mt7623: add phy-mode property for gmac2
Kevin Buettner <[email protected]>
copy_xstate_to_kernel: Fix typo which caused GDB regression
Douglas Anderson <[email protected]>
regmap: debugfs: Don't sleep while atomic for fast_io regmaps
Wei Yongjun <[email protected]>
keys: asymmetric: fix error return code in software_key_query()
Krzysztof Kozlowski <[email protected]>
arm64: dts: spcfpga: Align GIC, NAND and UART nodenames with dtschema
Krzysztof Kozlowski <[email protected]>
ARM: dts: socfpga: Align L2 cache-controller nodename with dtschema
Colin Ian King <[email protected]>
xprtrdma: fix incorrect header size calculations
Enric Balletbo i Serra <[email protected]>
Revert "thermal: mediatek: fix register index error"
dillon min <[email protected]>
ARM: dts: Fix dcan driver probe failed on am437x platform
Vasily Averin <[email protected]>
fuse: don't ignore errors from fuse_writepages_fill()
Anna Schumaker <[email protected]>
NFS: Fix interrupted slots by sending a solo SEQUENCE operation
Eddie James <[email protected]>
clk: AST2600: Add mux for EMMC clock
Nathan Chancellor <[email protected]>
clk: mvebu: ARMADA_AP_CPU_CLK needs to select ARMADA_AP_CP_HELPER
Dan Carpenter <[email protected]>
staging: comedi: verify array index is correct before using it
Michał Mirosław <[email protected]>
usb: gadget: udc: atmel: fix uninitialized read in debug printk
Marc Kleine-Budde <[email protected]>
spi: spi-sun6i: sun6i_spi_transfer_one(): fix setting of clock rate
Peter Ujfalusi <[email protected]>
dmaengine: dmatest: stop completed threads when running without set channel
Andy Shevchenko <[email protected]>
dmaengine: dw: Initialize channel before each transfer
Christophe JAILLET <[email protected]>
iio: adc: ad7780: Fix a resource handling path in 'ad7780_probe()'
Tony Lindgren <[email protected]>
bus: ti-sysc: Do not disable on suspend for no-idle
Tony Lindgren <[email protected]>
bus: ti-sysc: Fix sleeping function called from invalid context for RTC quirk
Tony Lindgren <[email protected]>
bus: ti-sysc: Fix wakeirq sleeping function called from invalid context
Neil Armstrong <[email protected]>
arm64: dts: meson-gxl-s805x: reduce initial Mali450 core frequency
Jerome Brunet <[email protected]>
arm64: dts: meson: add missing gxl rng clock
Colin Ian King <[email protected]>
phy: sun4i-usb: fix dereference of pointer phy0 before it is null checked
Yoshihiro Shimoda <[email protected]>
dmaengine: sh: usb-dmac: set tx_result parameters
Pierre-Louis Bossart <[email protected]>
soundwire: intel: fix memory leak with devm_kasprintf
Jonathan Cameron <[email protected]>
iio:health:afe4404 Fix timestamp alignment and prevent data leak.
Christoffer Nielsen <[email protected]>
ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Flight S
Tony Lindgren <[email protected]>
bus: ti-sysc: Use optional clocks on for enable and wait for softreset bit
Paul Menzel <[email protected]>
ACPI: video: Use native backlight on Acer TravelMate 5735Z
Stephan Gerhold <[email protected]>
Input: mms114 - add extra compatible for mms345l
Gregor Pintar <[email protected]>
ALSA: usb-audio: Add quirk for Focusrite Scarlett 2i2
Emmanuel Pescosta <[email protected]>
ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Alpha S
Hans de Goede <[email protected]>
ACPI: video: Use native backlight on Acer Aspire 5783z
Takashi Iwai <[email protected]>
ALSA: usb-audio: Rewrite registration quirk handling
Haibo Chen <[email protected]>
mmc: sdhci: do not enable card detect interrupt for gpio cd type
Neil Armstrong <[email protected]>
doc: dt: bindings: usb: dwc3: Update entries for disabling SS instances in park mode
Chris Wulff <[email protected]>
ALSA: usb-audio: Create a registration quirk for Kingston HyperX Amp (0951:16d8)
Sergei A. Trusov <[email protected]>
Input: goodix - fix touch coordinates on Cube I15-TC
Alexander Tsoy <[email protected]>
ALSA: usb-audio: Add support for MOTU MicroBook IIc
Tony Lindgren <[email protected]>
bus: ti-sysc: Detect EDMA and set quirk flags for tptc
Neil Armstrong <[email protected]>
arm64: dts: g12-common: add parkmode_disable_ss_quirk on DWC3 controller
Tony Lindgren <[email protected]>
bus: ti-sysc: Detect display subsystem related devices
Tony Lindgren <[email protected]>
bus: ti-sysc: Handle module unlock quirk needed for some RTC
Tony Lindgren <[email protected]>
bus: ti-sysc: Consider non-existing registers too when matching quirks
Tony Lindgren <[email protected]>
bus: ti-sysc: Rename clk related quirks to pre_reset and post_reset quirks
Diego Elio Pettenò <[email protected]>
scsi: sr: remove references to BLK_DEV_SR_VENDOR, leave it enabled
Andrey Lebedev <[email protected]>
drm/sun4i: tcon: Separate quirks for tcon0 and tcon1 on A20
Claudiu Beznea <[email protected]>
ARM: at91: pm: add quirk for sam9x60's ulp1
Hans de Goede <[email protected]>
HID: quirks: Remove ITE 8595 entry from hid_have_special_driver
Linus Walleij <[email protected]>
mmc: mmci: Support any block sizes for ux500v2 and qcom variant
Suman Anna <[email protected]>
ARM: OMAP2+: use separate IOMMU pdata to fix DRA7 IPU1 boot
Suman Anna <[email protected]>
ARM: OMAP2+: Add workaround for DRA7 DSP MStandby errata i879
Tero Kristo <[email protected]>
ARM: OMAP4+: remove pdata quirks for omap4+ iommus
Russell King <[email protected]>
net: sfp: add some quirks for GPON modules
Russell King <[email protected]>
net: sfp: add support for module quirks
Sasha Levin <[email protected]>
Revert "usb/xhci-plat: Set PM runtime as active on resume"
Sasha Levin <[email protected]>
Revert "usb/ehci-platform: Set PM runtime as active on resume"
Sasha Levin <[email protected]>
Revert "usb/ohci-platform: Fix a warning when hibernating"
Sascha Hauer <[email protected]>
net: ethernet: mvneta: Add back interface mode validation
Sascha Hauer <[email protected]>
net: ethernet: mvneta: Do not error out in non serdes modes
Sasha Levin <[email protected]>
net: macb: call pm_runtime_put_sync on failure path
Florian Fainelli <[email protected]>
of: of_mdio: Correct loop scanning logic
Florian Fainelli <[email protected]>
net: dsa: bcm_sf2: Fix node reference count
Krzysztof Kozlowski <[email protected]>
spi: spi-fsl-dspi: Fix lockup if device is shutdown during SPI transfer
Jonathan Cameron <[email protected]>
iio:health:afe4403 Fix timestamp alignment and prevent data leak.
Jonathan Cameron <[email protected]>
iio:pressure:ms5611 Fix buffer element alignment
Jonathan Cameron <[email protected]>
iio:humidity:hts221 Fix alignment and data leak issues
Navid Emamdoost <[email protected]>
iio: pressure: zpa2326: handle pm_runtime_get_sync failure
Chuhong Yuan <[email protected]>
iio: mma8452: Add missed iio_device_unregister() call in mma8452_probe()
Matt Ranostay <[email protected]>
iio: core: add missing IIO_MOD_H2/ETHANOL string identifiers
Dinghao Liu <[email protected]>
iio: magnetometer: ak8974: Fix runtime PM imbalance on error
Jonathan Cameron <[email protected]>
iio:humidity:hdc100x Fix alignment and data leak issues
Jonathan Cameron <[email protected]>
iio:magnetometer:ak8974: Fix alignment and data leak issues
Ard Biesheuvel <[email protected]>
arm64/alternatives: don't patch up internal branches
Andy Shevchenko <[email protected]>
i2c: eg20t: Load module automatically if ID matches
Bob Peterson <[email protected]>
gfs2: read-only mounts should grab the sd_freeze_gl glock
Vasily Averin <[email protected]>
tpm_tis: extra chip->ops check on error path in tpm_tis_core_init
Ard Biesheuvel <[email protected]>
arm64/alternatives: use subsections for replacement sequences
Ronnie Sahlberg <[email protected]>
cifs: prevent truncation from long to int in wait_for_free_credits
Kangmin Park <[email protected]>
dt-bindings: mailbox: zynqmp_ipi: fix unit address
Angelo Dureghello <[email protected]>
m68k: mm: fix node memblock init
Mike Rapoport <[email protected]>
m68k: nommu: register start of the memory with memblock
Hou Tao <[email protected]>
blk-mq-debugfs: update blk_queue_flag_name[] accordingly for new flags
Anson Huang <[email protected]>
thermal/drivers: imx: Fix missing of_node_put() at probe time
Petteri Aimonen <[email protected]>
x86/fpu: Reset MXCSR to default in kernel_fpu_begin()
Navid Emamdoost <[email protected]>
drm/exynos: fix ref count leak in mic_pre_enable
Marek Szyprowski <[email protected]>
drm/exynos: Properly propagate return value in drm_iommu_attach_device()
Krishna Manikandan <[email protected]>
drm/msm/dpu: allow initialization of encoder locks during encoder init
Bernard Zhao <[email protected]>
drm/msm: fix potential memleak in error branch
Marc Zyngier <[email protected]>
arm64: arch_timer: Disable the compat vdso for cores affected by ARM64_WORKAROUND_1418040
Marc Zyngier <[email protected]>
arm64: arch_timer: Allow an workaround descriptor to disable compat vdso
Marc Zyngier <[email protected]>
arm64: Introduce a way to disable the 32bit vdso
Willem de Bruijn <[email protected]>
ip: Fix SO_MARK in RST, ACK and ICMP packets
Cong Wang <[email protected]>
cgroup: Fix sock_cgroup_data on big-endian.
Cong Wang <[email protected]>
cgroup: fix cgroup_sk_alloc() for sk_clone_lock()
Eric Dumazet <[email protected]>
tcp: md5: allow changing MD5 keys in all socket states
Eric Dumazet <[email protected]>
tcp: md5: refine tcp_md5_do_add()/tcp_md5_hash_key() barriers
Toke Høiland-Jørgensen <[email protected]>
vlan: consolidate VLAN parsing code and limit max parsing depth
Eric Dumazet <[email protected]>
tcp: md5: do not send silly options in SYNCOOKIES
Eric Dumazet <[email protected]>
tcp: md5: add missing memory barriers in tcp_md5_do_add()/tcp_md5_hash_key()
Christoph Paasch <[email protected]>
tcp: make sure listeners don't initialize congestion-control state
Eric Dumazet <[email protected]>
tcp: fix SO_RCVLOWAT possible hangs under high mem pressure
Toke Høiland-Jørgensen <[email protected]>
sched: consistently handle layer3 header accesses in the presence of VLANs
AceLan Kao <[email protected]>
net: usb: qmi_wwan: add support for Quectel EG95 LTE modem
Cong Wang <[email protected]>
net_sched: fix a memory leak in atm_tc_init()
Codrin Ciubotariu <[email protected]>
net: dsa: microchip: set the correct number of ports
Martin Varghese <[email protected]>
net: Added pointer check for dst->ops->neigh_lookup in dst_neigh_lookup_skb
Eric Dumazet <[email protected]>
llc: make sure applications use ARPHRD_ETHER
Xin Long <[email protected]>
l2tp: remove skb_dst_set() from l2tp_xmit_skb()
David Ahern <[email protected]>
ipv6: Fix use of anycast address with loopback
David Ahern <[email protected]>
ipv6: fib6_select_path can not use out path for nexthop objects
Sabrina Dubroca <[email protected]>
ipv4: fill fl4_icmp_{type,code} in ping_v4_sendmsg
Sean Tranchetti <[email protected]>
genetlink: remove genl_bind
Linus Lüssing <[email protected]>
bridge: mcast: Fix MLD2 Report IPv6 payload length check
Taehee Yoo <[email protected]>
net: rmnet: fix lower interface leak
Dmitry Bogdanov <[email protected]>
net: atlantic: fix ip dst and ipv6 address filters
YueHaibing <[email protected]>
crypto: atmel - Fix build error of CRYPTO_AUTHENC
Tudor Ambarus <[email protected]>
crypto: atmel - Fix selection of CRYPTO_AUTHENC
-------------
Diffstat:
.../bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt | 2 +- Documentation/devicetree/bindings/usb/dwc3.txt | 2 + Makefile | 4 +- arch/alpha/configs/defconfig | 1 - arch/arm/boot/dts/am437x-l4.dtsi | 14 +- arch/arm/boot/dts/mt7623n-rfb-emmc.dts | 1 + arch/arm/boot/dts/socfpga.dtsi | 2 +- arch/arm/boot/dts/socfpga_arria10.dtsi | 2 +- arch/arm/configs/rpc_defconfig | 1 - arch/arm/configs/s3c2410_defconfig | 1 - arch/arm/include/asm/clocksource.h | 11 +- arch/arm/kernel/vdso.c | 2 +- arch/arm/mach-at91/pm_suspend.S | 4 + arch/arm/mach-omap2/omap-iommu.c | 43 ++- arch/arm/mach-omap2/pdata-quirks.c | 35 ++- arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi | 8 +- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 1 + .../dts/amlogic/meson-gxl-s805x-libretech-ac.dts | 2 +- .../boot/dts/amlogic/meson-gxl-s805x-p241.dts | 2 +- arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi | 24 ++ arch/arm64/boot/dts/amlogic/meson-gxl.dtsi | 5 + arch/arm64/include/asm/alternative.h | 16 +- arch/arm64/include/asm/arch_timer.h | 1 + arch/arm64/include/asm/clocksource.h | 5 +- arch/arm64/include/asm/debug-monitors.h | 2 + arch/arm64/include/asm/syscall.h | 12 +- arch/arm64/include/asm/thread_info.h | 1 + arch/arm64/include/asm/vdso/clocksource.h | 14 + arch/arm64/include/asm/vdso/compat_gettimeofday.h | 5 +- arch/arm64/include/asm/vdso/gettimeofday.h | 6 +- arch/arm64/include/asm/vdso/vsyscall.h | 4 +- arch/arm64/kernel/alternative.c | 16 +- arch/arm64/kernel/debug-monitors.c | 20 +- arch/arm64/kernel/ptrace.c | 29 +- arch/arm64/kernel/signal.c | 11 +- arch/arm64/kernel/syscall.c | 5 +- arch/arm64/kernel/vmlinux.lds.S | 3 - arch/ia64/configs/zx1_defconfig | 1 - arch/m68k/configs/amiga_defconfig | 1 - arch/m68k/configs/apollo_defconfig | 1 - arch/m68k/configs/atari_defconfig | 1 - arch/m68k/configs/bvme6000_defconfig | 1 - arch/m68k/configs/hp300_defconfig | 1 - arch/m68k/configs/mac_defconfig | 1 - arch/m68k/configs/multi_defconfig | 1 - arch/m68k/configs/mvme147_defconfig | 1 - arch/m68k/configs/mvme16x_defconfig | 1 - arch/m68k/configs/q40_defconfig | 1 - arch/m68k/configs/sun3_defconfig | 1 - arch/m68k/configs/sun3x_defconfig | 1 - arch/m68k/kernel/setup_no.c | 3 +- arch/m68k/mm/mcfmmu.c | 2 +- arch/mips/configs/bigsur_defconfig | 1 - arch/mips/configs/fuloong2e_defconfig | 1 - arch/mips/configs/ip27_defconfig | 1 - arch/mips/configs/ip32_defconfig | 1 - arch/mips/configs/jazz_defconfig | 1 - arch/mips/configs/malta_defconfig | 1 - arch/mips/configs/malta_kvm_defconfig | 1 - arch/mips/configs/malta_kvm_guest_defconfig | 1 - arch/mips/configs/maltaup_xpa_defconfig | 1 - arch/mips/configs/rm200_defconfig | 1 - arch/powerpc/configs/85xx-hw.config | 1 - arch/powerpc/configs/amigaone_defconfig | 1 - arch/powerpc/configs/chrp32_defconfig | 1 - arch/powerpc/configs/g5_defconfig | 1 - arch/powerpc/configs/maple_defconfig | 1 - arch/powerpc/configs/pasemi_defconfig | 1 - arch/powerpc/configs/pmac32_defconfig | 1 - arch/powerpc/configs/powernv_defconfig | 1 - arch/powerpc/configs/ppc64_defconfig | 1 - arch/powerpc/configs/ppc64e_defconfig | 1 - arch/powerpc/configs/ppc6xx_defconfig | 1 - arch/powerpc/configs/pseries_defconfig | 1 - arch/powerpc/configs/skiroot_defconfig | 1 - arch/powerpc/kernel/paca.c | 2 +- arch/powerpc/mm/book3s64/pkeys.c | 12 +- arch/riscv/include/asm/thread_info.h | 4 + arch/sh/configs/sh03_defconfig | 1 - arch/sparc/configs/sparc64_defconfig | 1 - arch/x86/configs/i386_defconfig | 1 - arch/x86/configs/x86_64_defconfig | 1 - arch/x86/include/asm/fpu/internal.h | 5 + arch/x86/kernel/apic/vector.c | 22 +- arch/x86/kernel/fpu/core.c | 6 + arch/x86/kernel/fpu/xstate.c | 2 +- block/blk-merge.c | 23 +- block/blk-mq-debugfs.c | 3 + crypto/asymmetric_keys/public_key.c | 1 + drivers/acpi/video_detect.c | 19 ++ drivers/base/regmap/regmap-debugfs.c | 52 ++-- drivers/block/zram/zram_drv.c | 3 +- drivers/bus/ti-sysc.c | 331 ++++++++++++++------- drivers/char/tpm/tpm_tis_core.c | 2 +- drivers/char/virtio_console.c | 3 +- drivers/clk/clk-ast2600.c | 49 ++- drivers/clk/mvebu/Kconfig | 1 + drivers/clk/qcom/gcc-sm8150.c | 148 +++++++++ drivers/clocksource/arm_arch_timer.c | 19 +- drivers/crypto/Kconfig | 8 +- drivers/dma/dmatest.c | 2 + drivers/dma/dw/core.c | 12 - drivers/dma/fsl-edma-common.h | 2 +- drivers/dma/fsl-edma.c | 7 + drivers/dma/mcf-edma.c | 7 + drivers/dma/sh/usb-dmac.c | 2 + drivers/gpio/gpio-pca953x.c | 1 + drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 26 +- drivers/gpu/drm/exynos/exynos_drm_dma.c | 4 +- drivers/gpu/drm/exynos/exynos_drm_mic.c | 4 +- drivers/gpu/drm/i915/gt/intel_lrc.c | 1 + drivers/gpu/drm/i915/gvt/handlers.c | 4 +- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 4 +- drivers/gpu/drm/msm/msm_submitqueue.c | 4 +- drivers/gpu/drm/sun4i/sun4i_tcon.c | 2 + drivers/hid/hid-ids.h | 3 + drivers/hid/hid-logitech-hidpp.c | 2 +- drivers/hid/hid-magicmouse.c | 6 + drivers/hid/hid-quirks.c | 5 +- drivers/hwmon/emc2103.c | 2 +- drivers/hwtracing/intel_th/core.c | 21 +- drivers/hwtracing/intel_th/pci.c | 15 + drivers/hwtracing/intel_th/sth.c | 4 +- drivers/i2c/busses/i2c-eg20t.c | 1 + drivers/iio/accel/mma8452.c | 5 +- drivers/iio/adc/ad7780.c | 2 +- drivers/iio/health/afe4403.c | 13 +- drivers/iio/health/afe4404.c | 8 +- drivers/iio/humidity/hdc100x.c | 10 +- drivers/iio/humidity/hts221.h | 7 +- drivers/iio/humidity/hts221_buffer.c | 9 +- drivers/iio/industrialio-core.c | 2 + drivers/iio/magnetometer/ak8974.c | 29 +- drivers/iio/pressure/ms5611_core.c | 11 +- drivers/iio/pressure/zpa2326.c | 4 +- drivers/infiniband/hw/mlx5/qp.c | 2 + drivers/input/serio/i8042-x86ia64io.h | 7 + drivers/input/touchscreen/goodix.c | 22 ++ drivers/input/touchscreen/mms114.c | 17 +- drivers/iommu/Kconfig | 2 +- drivers/misc/atmel-ssc.c | 24 +- drivers/misc/habanalabs/goya/goya_security.c | 99 +++++- drivers/misc/mei/bus.c | 3 +- drivers/mmc/host/mmci.c | 34 ++- drivers/mmc/host/mmci.h | 8 +- drivers/mmc/host/sdhci.c | 2 +- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 24 +- drivers/mtd/nand/raw/marvell_nand.c | 27 +- drivers/mtd/nand/raw/nand_timings.c | 5 +- drivers/mtd/nand/raw/oxnas_nand.c | 24 +- drivers/net/dsa/bcm_sf2.c | 2 + drivers/net/dsa/microchip/ksz8795.c | 3 + drivers/net/dsa/microchip/ksz9477.c | 3 + .../ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c | 4 +- .../aquantia/atlantic/hw_atl/hw_atl_llh_internal.h | 2 +- drivers/net/ethernet/cadence/macb_main.c | 6 +- drivers/net/ethernet/marvell/mvneta.c | 24 +- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 1 + drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 19 +- drivers/net/phy/sfp-bus.c | 79 +++++ drivers/net/usb/qmi_wwan.c | 1 + drivers/of/of_mdio.c | 9 +- drivers/pci/pci.c | 4 +- drivers/phy/allwinner/phy-sun4i-usb.c | 5 +- drivers/scsi/Kconfig | 9 - drivers/scsi/megaraid/megaraid_sas_fusion.c | 2 - drivers/scsi/sr_vendor.c | 8 - drivers/slimbus/core.c | 1 + drivers/soc/qcom/rpmh-rsc.c | 98 +++--- drivers/soc/qcom/rpmh.c | 56 ++-- drivers/soc/qcom/socinfo.c | 2 + drivers/soundwire/intel.c | 5 +- drivers/spi/spi-fsl-dspi.c | 15 +- drivers/spi/spi-sprd-adi.c | 2 +- drivers/spi/spi-sun6i.c | 14 +- drivers/staging/comedi/drivers/addi_apci_1500.c | 10 +- drivers/thermal/cpu_cooling.c | 6 +- drivers/thermal/imx_thermal.c | 7 +- .../intel/int340x_thermal/int3403_thermal.c | 2 +- drivers/thermal/mtk_thermal.c | 6 +- drivers/tty/serial/mxs-auart.c | 12 +- drivers/tty/serial/xilinx_uartps.c | 1 - drivers/uio/uio_pdrv_genirq.c | 4 +- drivers/usb/c67x00/c67x00-sched.c | 2 +- drivers/usb/chipidea/core.c | 24 ++ drivers/usb/dwc2/platform.c | 3 +- drivers/usb/gadget/function/f_uac1_legacy.c | 2 + drivers/usb/gadget/udc/atmel_usba_udc.c | 2 +- drivers/usb/host/ehci-platform.c | 4 - drivers/usb/host/ohci-platform.c | 5 - drivers/usb/host/xhci-plat.c | 10 +- drivers/usb/serial/ch341.c | 1 + drivers/usb/serial/cypress_m8.c | 2 + drivers/usb/serial/cypress_m8.h | 3 + drivers/usb/serial/iuu_phoenix.c | 8 +- drivers/usb/serial/option.c | 6 + drivers/virt/vboxguest/vboxguest_core.c | 6 +- drivers/virt/vboxguest/vboxguest_core.h | 15 + drivers/virt/vboxguest/vboxguest_linux.c | 3 +- drivers/virt/vboxguest/vmmdev.h | 2 + fs/cifs/transport.c | 2 +- fs/fuse/file.c | 14 +- fs/fuse/inode.c | 15 +- fs/gfs2/ops_fstype.c | 12 +- fs/nfs/nfs4proc.c | 20 +- fs/overlayfs/export.c | 2 +- fs/overlayfs/file.c | 10 +- fs/overlayfs/super.c | 23 +- include/linux/blkdev.h | 1 + include/linux/cgroup-defs.h | 8 +- include/linux/cgroup.h | 4 +- include/linux/if_vlan.h | 29 +- include/linux/input/elan-i2c-ids.h | 7 + include/linux/platform_data/ti-sysc.h | 1 + include/net/dst.h | 10 +- include/net/genetlink.h | 8 - include/net/inet_ecn.h | 25 +- include/net/pkt_sched.h | 11 - include/trace/events/rxrpc.h | 2 +- include/uapi/linux/vboxguest.h | 4 +- kernel/cgroup/cgroup.c | 31 +- kernel/irq/manage.c | 37 ++- kernel/sched/core.c | 2 + kernel/sched/fair.c | 16 +- kernel/time/timer.c | 21 +- net/bridge/br_multicast.c | 2 +- net/ceph/osd_client.c | 1 + net/core/filter.c | 10 +- net/core/sock.c | 2 +- net/ipv4/icmp.c | 4 +- net/ipv4/ip_output.c | 2 +- net/ipv4/ping.c | 3 + net/ipv4/tcp.c | 15 +- net/ipv4/tcp_cong.c | 2 +- net/ipv4/tcp_input.c | 2 + net/ipv4/tcp_ipv4.c | 15 +- net/ipv4/tcp_output.c | 8 +- net/ipv6/icmp.c | 4 +- net/ipv6/route.c | 7 +- net/l2tp/l2tp_core.c | 5 +- net/llc/af_llc.c | 10 +- net/netlink/genetlink.c | 49 --- net/sched/act_connmark.c | 9 +- net/sched/act_csum.c | 2 +- net/sched/act_ct.c | 9 +- net/sched/act_ctinfo.c | 9 +- net/sched/act_mpls.c | 2 +- net/sched/act_skbedit.c | 2 +- net/sched/cls_api.c | 2 +- net/sched/cls_flow.c | 8 +- net/sched/cls_flower.c | 2 +- net/sched/em_ipset.c | 2 +- net/sched/em_ipt.c | 2 +- net/sched/em_meta.c | 2 +- net/sched/sch_atm.c | 8 +- net/sched/sch_cake.c | 4 +- net/sched/sch_dsmark.c | 6 +- net/sched/sch_teql.c | 2 +- net/sunrpc/xprtrdma/rpc_rdma.c | 4 +- security/apparmor/match.c | 5 + sound/pci/hda/patch_realtek.c | 27 +- sound/usb/card.c | 12 +- sound/usb/clock.c | 59 +++- sound/usb/line6/capture.c | 2 + sound/usb/line6/driver.c | 2 +- sound/usb/line6/playback.c | 2 + sound/usb/midi.c | 17 +- sound/usb/pcm.c | 7 +- sound/usb/quirks-table.h | 86 +----- sound/usb/quirks.c | 67 ++++- sound/usb/quirks.h | 2 + tools/perf/util/stat.c | 6 +- tools/testing/selftests/net/fib_nexthops.sh | 13 + 273 files changed, 2041 insertions(+), 935 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/215 crypto: atmel - Fix selection of CRYPTO_AUTHENC
From: Tudor Ambarus <[email protected]>
commit d158367682cd822aca811971e988be6a8d8f679f upstream.
The following error is raised when CONFIG_CRYPTO_DEV_ATMEL_AES=y and CONFIG_CRYPTO_DEV_ATMEL_AUTHENC=m:drivers/crypto/atmel-aes.o: In function `atmel_aes_authenc_setkey':
atmel-aes.c:(.text+0x9bc): undefined reference to `crypto_authenc_extractkeys' Makefile:1094: recipe for target 'vmlinux' failed
Fix it by moving the selection of CRYPTO_AUTHENC under config CRYPTO_DEV_ATMEL_AES.
--- drivers/crypto/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/Kconfig +1 -1
@@ -493,7 +493,6 @@ endif # if CRYPTO_DEV_UX500 config CRYPTO_DEV_ATMEL_AUTHENC tristate "Support for Atmel IPSEC/SSL hw accelerator" depends on ARCH_AT91 || COMPILE_TEST - select CRYPTO_AUTHENC select CRYPTO_DEV_ATMEL_AES select CRYPTO_DEV_ATMEL_SHA help
@@ -508,6 +507,7 @@ config CRYPTO_DEV_ATMEL_AES select CRYPTO_AES select CRYPTO_AEAD select CRYPTO_BLKCIPHER + select CRYPTO_AUTHENC help Some Atmel processors have AES hw accelerator. Select this if you want to use the Atmel module for
Greg Kroah-Hartman
maintainerPATCH 2/215 crypto: atmel - Fix build error of CRYPTO_AUTHENC
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
commit aee1f9f3c30e1e20e7f74729ced61eac7d74ca68 upstream.
If CRYPTO_DEV_ATMEL_AUTHENC is m, CRYPTO_DEV_ATMEL_SHA is m, but CRYPTO_DEV_ATMEL_AES is y, building will fail:
drivers/crypto/atmel-aes.o: In function `atmel_aes_authenc_init_tfm':
atmel-aes.c:(.text+0x670): undefined reference to atmel_sha_authenc_get_reqsize' atmel-aes.c:(.text+0x67a): undefined reference to atmel_sha_authenc_spawn' drivers/crypto/atmel-aes.o: In function `atmel_aes_authenc_setkey':
atmel-aes.c:(.text+0x7e5): undefined reference to `atmel_sha_authenc_setkey'
Make CRYPTO_DEV_ATMEL_AUTHENC depend on CRYPTO_DEV_ATMEL_AES, and select CRYPTO_DEV_ATMEL_SHA and CRYPTO_AUTHENC for it under there.
--- drivers/crypto/Kconfig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/crypto/Kconfig +4 -4
@@ -491,10 +491,9 @@ if CRYPTO_DEV_UX500 endif # if CRYPTO_DEV_UX500 config CRYPTO_DEV_ATMEL_AUTHENC - tristate "Support for Atmel IPSEC/SSL hw accelerator" + bool "Support for Atmel IPSEC/SSL hw accelerator" depends on ARCH_AT91 || COMPILE_TEST - select CRYPTO_DEV_ATMEL_AES - select CRYPTO_DEV_ATMEL_SHA + depends on CRYPTO_DEV_ATMEL_AES help Some Atmel processors can combine the AES and SHA hw accelerators to enhance support of IPSEC/SSL.
@@ -507,7 +506,8 @@ config CRYPTO_DEV_ATMEL_AES select CRYPTO_AES select CRYPTO_AEAD select CRYPTO_BLKCIPHER - select CRYPTO_AUTHENC + select CRYPTO_AUTHENC if CRYPTO_DEV_ATMEL_AUTHENC + select CRYPTO_DEV_ATMEL_SHA if CRYPTO_DEV_ATMEL_AUTHENC help Some Atmel processors have AES hw accelerator. Select this if you want to use the Atmel module for
Greg Kroah-Hartman
maintainerPATCH 3/215 net: atlantic: fix ip dst and ipv6 address filters
In reply to Greg Kroah-HartmanFrom: Dmitry Bogdanov <[email protected]>
commit a42e6aee7f47a8a68d09923c720fc8f605a04207 upstream.
This patch fixes ip dst and ipv6 address filters. There were 2 mistakes in the code, which led to the issue:
* invalid register was used for ipv4 dst address;
* incorrect write order of dwords for ipv6 addresses.
--- drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c | 4 ++-- drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c +2 -2
@@ -1597,7 +1597,7 @@ void hw_atl_rpfl3l4_ipv6_src_addr_set(stfor (i =0 ; i <4 ; ++i)aq_hw_write_reg (aq_hw,HW_ATL_RPF_L3_SRCA_ADR (location + i), - ipv6_src[i]); + ipv6_src[3 - i]); } void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location,
@@ -1608,7 +1608,7 @@ void hw_atl_rpfl3l4_ipv6_dest_addr_set(sfor (i =0 ; i <4 ; ++i)aq_hw_write_reg (aq_hw,HW_ATL_RPF_L3_DSTA_ADR (location + i), - ipv6_dest[i]); + ipv6_dest[3 - i]); }u32 hw_atl_sem_ram_get (struct aq_hw_s *self)
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h +1 -1
@@ -2564,7 +2564,7 @@*/ /* Register address for bitfield pif_rpf_l3_da0_i[31:0] */ -#define HW_ATL_RPF_L3_DSTA_ADR (location) (0x000053B0 + (location) * 0x4) +#define HW_ATL_RPF_L3_DSTA_ADR (filter) (0x000053D0 + (filter) * 0x4)/* Bitmask for bitfield l3_da0[1F:0] */ #define HW_ATL_RPF_L3_DSTA_MSK 0xFFFFFFFFu/* Inverted bitmask for bitfield l3_da0[1F:0] */
Greg Kroah-Hartman
maintainerPATCH 4/215 net: rmnet: fix lower interface leak
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
commit 2a762e9e8cd1cf1242e4269a2244666ed02eecd1 upstream.
There are two types of the lower interface of rmnet that are VND and BRIDGE.
Each lower interface can have only one type either VND or BRIDGE. But, there is a case, which uses both lower interface types. Due to this unexpected behavior, lower interface leak occurs.
Test commands:
ip link add dummy0 type dummy
ip link add dummy1 type dummy
ip link add rmnet0 link dummy0 type rmnet mux_id 1 ip link set dummy1 master rmnet0
ip link add rmnet1 link dummy1 type rmnet mux_id 2 ip link del rmnet0
The dummy1 was attached as BRIDGE interface of rmnet0.
Then, it also was attached as VND interface of rmnet1.
This is unexpected behavior and there is no code for handling this case. So that below splat occurs when the rmnet0 interface is deleted.
Splat looks like:
[ 53.254112][ C1] WARNING: CPU: 1 PID: 1192 at net/core/dev.c:8992 rollback_registered_many+0x986/0xcf0 [ 53.254117][ C1] Modules linked in: rmnet dummy openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrag_ipv6 nfx [ 53.254182][ C1] CPU: 1 PID: 1192 Comm: ip Not tainted 5.8.0-rc1+ #620 [ 53.254188][ C1] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 53.254192][ C1] RIP: 0010:rollback_registered_many+0x986/0xcf0 [ 53.254200][ C1] Code: 41 8b 4e cc 45 31 c0 31 d2 4c 89 ee 48 89 df e8 e0 47 ff ff 85 c0 0f 84 cd fc ff ff 0f 0b e5 [ 53.254205][ C1] RSP: 0018:ffff888050a5f2e0 EFLAGS: 00010287 [ 53.254214][ C1] RAX: ffff88805756d658 RBX: ffff88804d99c000 RCX: ffffffff8329d323 [ 53.254219][ C1] RDX: 1ffffffff0be6410 RSI: 0000000000000008 RDI: ffffffff85f32080 [ 53.254223][ C1] RBP: dffffc0000000000 R08: fffffbfff0be6411 R09: fffffbfff0be6411 [ 53.254228][ C1] R10: ffffffff85f32087 R11: 0000000000000001 R12: ffff888050a5f480 [ 53.254233][ C1] R13: ffff88804d99c0b8 R14: ffff888050a5f400 R15: ffff8880548ebe40 [ 53.254238][ C1] FS: 00007f6b86b370c0(0000) GS:ffff88806c200000(0000) knlGS:0000000000000000 [ 53.254243][ C1] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 53.254248][ C1] CR2: 0000562c62438758 CR3: 000000003f600005 CR4: 00000000000606e0 [ 53.254253][ C1] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 53.254257][ C1] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 53.254261][ C1] Call Trace: [ 53.254266][ C1] ? lockdep_hardirqs_on_prepare+0x379/0x540 [ 53.254270][ C1] ? netif_set_real_num_tx_queues+0x780/0x780 [ 53.254275][ C1] ? rmnet_unregister_real_device+0x56/0x90 [rmnet] [ 53.254279][ C1] ? __kasan_slab_free+0x126/0x150 [ 53.254283][ C1] ? kfree+0xdc/0x320 [ 53.254288][ C1] ? rmnet_unregister_real_device+0x56/0x90 [rmnet] [ 53.254293][ C1] unregister_netdevice_many.part.135+0x13/0x1b0 [ 53.254297][ C1] rtnl_delete_link+0xbc/0x100 [ 53.254301][ C1] ? rtnl_af_register+0xc0/0xc0 [ 53.254305][ C1] rtnl_dellink+0x2dc/0x840 [ 53.254309][ C1] ? find_held_lock+0x39/0x1d0 [ 53.254314][ C1] ? valid_fdb_dump_strict+0x620/0x620 [ 53.254318][ C1] ? rtnetlink_rcv_msg+0x457/0x890 [ 53.254322][ C1] ? lock_contended+0xd20/0xd20 [ 53.254326][ C1] rtnetlink_rcv_msg+0x4a8/0x890 [ ... ] [ 73.813696][ T1192] unregister_netdevice: waiting for rmnet0 to become free. Usage count = 1
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +12 -7
@@ -47,15 +47,23 @@ static int rmnet_unregister_real_device(return 0 ; } -static int rmnet_register_real_device (struct net_device *real_dev) +static int rmnet_register_real_device (struct net_device *real_dev, +struct netlink_ext_ack *extack) {struct rmnet_port *port;int rc, entry;ASSERT_RTNL (); -if (rmnet_is_real_dev_registered (real_dev)) +if (rmnet_is_real_dev_registered (real_dev)) { + port =rmnet_get_port_rtnl (real_dev); +if (port->rmnet_mode !=RMNET_EPMODE_VND ) { +NL_SET_ERR_MSG_MOD (extack,"bridge device already exists" ); +return -EINVAL ; + } +return 0 ; + } port =kzalloc (sizeof (*port),GFP_ATOMIC );if (!port)
@@ -134,7 +142,7 @@ static int rmnet_newlink(struct net *src mux_id =nla_get_u16 (data[IFLA_RMNET_MUX_ID ]); - err =rmnet_register_real_device (real_dev); + err =rmnet_register_real_device (real_dev, extack);if (err) goto err0;
@@ -416,13 +424,10 @@ int rmnet_add_bridge(struct net_device *if (port->nr_rmnet_devs >1 )return -EINVAL ; -if (port->rmnet_mode !=RMNET_EPMODE_VND ) -return -EINVAL ; -if (rmnet_is_real_dev_registered (slave_dev))return -EBUSY ; - err =rmnet_register_real_device (slave_dev); + err =rmnet_register_real_device (slave_dev, extack);if (err)return -EBUSY ;
Greg Kroah-Hartman
maintainerPATCH 5/215 bridge: mcast: Fix MLD2 Report IPv6 payload length check
In reply to Greg Kroah-HartmanFrom: "Linus L�ssing" <[email protected]>
[ Upstream commit 5fc6266af7b427243da24f3443a50cd4584aac06 ]
Commit e57f61858b7c ("net: bridge: mcast: fix stale nsrcs pointer in igmp3/mld2 report handling") introduced a bug in the IPv6 header payload length check which would potentially lead to rejecting a valid MLD2 Report:
The check needs to take into account the 2 bytes for the "Number of Sources" field in the "Multicast Address Record" before reading it. And not the size of a pointer to this field.
--- net/bridge/br_multicast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bridge/br_multicast.c +1 -1
@@ -1007,7 +1007,7 @@ static int br_ip6_multicast_mld2_report( nsrcs_offset = len + offsetof(struct mld2_grec , grec_nsrcs);if (skb_transport_offset (skb) +ipv6_transport_len (skb) < - nsrcs_offset +sizeof (_nsrcs)) + nsrcs_offset +sizeof (__nsrcs))return -EINVAL ; _nsrcs = skb_header_pointer(skb, nsrcs_offset,
Greg Kroah-Hartman
maintainerPATCH 6/215 genetlink: remove genl_bind
In reply to Greg Kroah-HartmanFrom: Sean Tranchetti <[email protected]>
[ Upstream commit 1e82a62fec613844da9e558f3493540a5b7a7b67 ]
A potential deadlock can occur during registering or unregistering a new generic netlink family between the main nl_table_lock and the cb_lock where each thread wants the lock held by the other, as demonstrated below.
1) Thread 1 is performing a netlink_bind() operation on a socket. As part of this call, it will call netlink_lock_table(), incrementing the nl_table_users count to 1.
2) Thread 2 is registering (or unregistering) a genl_family via the genl_(un)register_family() API. The cb_lock semaphore will be taken for writing.
3) Thread 1 will call genl_bind() as part of the bind operation to handle subscribing to GENL multicast groups at the request of the user. It will attempt to take the cb_lock semaphore for reading, but it will fail and be scheduled away, waiting for Thread 2 to finish the write.
4) Thread 2 will call netlink_table_grab() during the (un)registration call. However, as Thread 1 has incremented nl_table_users, it will not be able to proceed, and both threads will be stuck waiting for the other.
genl_bind() is a noop, unless a genl_family implements the mcast_bind() function to handle setting up family-specific multicast operations. Since no one in-tree uses this functionality as Cong pointed out, simply removing the genl_bind() function will remove the possibility for deadlock, as there is no attempt by Thread 1 above to take the cb_lock semaphore.
--- include/net/genetlink.h | 8 ------- net/netlink/genetlink.c | 49 ------------------------------------------------ 2 files changed, 57 deletions(-)
include/net/genetlink.h +0 -8
@@ -35,12 +35,6 @@ struct genl_info;* do additional, common, filtering and return an error * @post_doit: called after an operation's doit callback, it may * undo operations done by pre_doit, for example release locks -* @mcast_bind: a socket bound to the given multicast group (which -* is given as the offset into the groups array) -* @mcast_unbind: a socket was unbound from the given multicast group. -* Note that unbind() will not be called symmetrically if the -* generic netlink family is removed while there are still open -* sockets. * @attrbuf: buffer to store parsed attributes (private) * @mcgrps: multicast groups used by this family * @n_mcgrps: number of multicast groups
@@ -64,8 +58,6 @@ struct genl_family {void (*post_doit)(const struct genl_ops *ops,struct sk_buff *skb,struct genl_info *info); -int (*mcast_bind)(struct net *net,int group); -void (*mcast_unbind)(struct net *net,int group);struct nlattr ** attrbuf;/* private */ const struct genl_ops * ops;const struct genl_multicast_group *mcgrps;
net/netlink/genetlink.c +0 -49
60 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 7/215 ipv4: fill fl4_icmp_{type,code} in ping_v4_sendmsg
In reply to Greg Kroah-HartmanFrom: Sabrina Dubroca <[email protected]>
[ Upstream commit 5eff06902394425c722f0a44d9545909a8800f79 ]
IPv4 ping sockets don't set fl4.fl4_icmp_{type,code}, which leads to incomplete IPsec ACQUIRE messages being sent to userspace. Currently, both raw sockets and IPv6 ping sockets set those fields.
Expected output of "ip xfrm monitor":
acquire proto esp
sel src 10.0.2.15/32 dst 8.8.8.8/32 proto icmp type 8 code 0 dev ens4
policy src 10.0.2.15/32 dst 8.8.8.8/32
<snip>Currently with ping sockets:
acquire proto esp
sel src 10.0.2.15/32 dst 8.8.8.8/32 proto icmp type 0 code 0 dev ens4
policy src 10.0.2.15/32 dst 8.8.8.8/32
<snip>The Libreswan test suite found this problem after Fedora changed the value for the sysctl net.ipv4.ping_group_range.
--- net/ipv4/ping.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/ping.c +3 -0
@@ -786,6 +786,9 @@ static int ping_v4_sendmsg(struct sock *inet_sk_flowi_flags (sk), faddr, saddr,0 ,0 , sk->sk_uid); + fl4.fl4_icmp_type = user_icmph.type; + fl4.fl4_icmp_code = user_icmph.code; +security_sk_classify_flow (sk,flowi4_to_flowi (&fl4)); rt =ip_route_output_flow (net, &fl4, sk);if (IS_ERR (rt)) {
Greg Kroah-Hartman
maintainerPATCH 8/215 ipv6: fib6_select_path can not use out path for nexthop objects
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit 34fe5a1cf95c3f114068fc16d919c9cf4b00e428 ]
Brian reported a crash in IPv6 code when using rpfilter with a setup running FRR and external nexthop objects. The root cause of the crash is fib6_select_path setting fib6_nh in the result to NULL because of an improper check for nexthop objects.
More specifically, rpfilter invokes ip6_route_lookup with flowi6_oif set causing fib6_select_path to be called with have_oif_match set. fib6_select_path has early check on have_oif_match and jumps to the out label which presumes a builtin fib6_nh. This path is invalid for nexthop objects; for external nexthops fib6_select_path needs to just return if the fib6_nh has already been set in the result otherwise it returns after the call to nexthop_path_fib6_result. Update the check on have_oif_match to not bail on external nexthops.
Update selftests for this problem.
--- net/ipv6/route.c | 5 ++++- tools/testing/selftests/net/fib_nexthops.sh | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-)
net/ipv6/route.c +4 -1
@@ -431,9 +431,12 @@ void fib6_select_path(const struct net *struct fib6_info *sibling, *next_sibling;struct fib6_info *match = res->f6i; -if ((!match->fib6_nsiblings && !match->nh) || have_oif_match) +if (!match->nh && (!match->fib6_nsiblings || have_oif_match)) goto out; +if (match->nh && have_oif_match && res->nh) +return ; +/* We might have already computed the hash for ICMPv6 errors. In such * case it will always be non-zero. Otherwise now is the time to do it. */
tools/testing/selftests/net/fib_nexthops.sh +13 -0
@@ -512,6 +512,19 @@ ipv6_fcnal_runtime() run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1" run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" + # rpfilter and default route + $IP nexthop flush >/dev/null 2>&1 + run_cmd "ip netns exec me ip6tables -t mangle -I PREROUTING 1 -m rpfilter --invert -j DROP" + run_cmd "$IP nexthop add id 91 via 2001:db8:91::2 dev veth1" + run_cmd "$IP nexthop add id 92 via 2001:db8:92::2 dev veth3" + run_cmd "$IP nexthop add id 93 group 91/92" + run_cmd "$IP -6 ro add default nhid 91" + run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" + log_test $? 0 "Nexthop with default route and rpfilter" + run_cmd "$IP -6 ro replace default nhid 93" + run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" + log_test $? 0 "Nexthop with multipath default route and rpfilter" + # TO-DO: # existing route with old nexthop; append route with new nexthop # existing route with old nexthop; replace route with new
Greg Kroah-Hartman
maintainerPATCH 9/215 ipv6: Fix use of anycast address with loopback
In reply to Greg Kroah-HartmanFrom: David Ahern <[email protected]>
[ Upstream commit aea23c323d89836bcdcee67e49def997ffca043b ]
Thomas reported a regression with IPv6 and anycast using the following reproducer:
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding ip -6 a add fc12::1/16 dev lo
sleep 2
echo "pinging lo"
ping6 -c 2 fc12::
The conversion of addrconf_f6i_alloc to use ip6_route_info_create missed the use of fib6_is_reject which checks addresses added to the loopback interface and sets the REJECT flag as needed. Update fib6_is_reject for loopback checks to handle RTF_ANYCAST addresses.
--- net/ipv6/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/route.c +1 -1
@@ -3409,7 +3409,7 @@ static bool fib6_is_reject(u32 flags, stif ((flags &RTF_REJECT ) || (dev && (dev->flags &IFF_LOOPBACK ) && !(addr_type &IPV6_ADDR_LOOPBACK ) && - !(flags &RTF_LOCAL ))) + !(flags & (RTF_ANYCAST |RTF_LOCAL ))))return true;return false;
Greg Kroah-Hartman
maintainerPATCH 10/215 l2tp: remove skb_dst_set() from l2tp_xmit_skb()
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 27d53323664c549b5bb2dfaaf6f7ad6e0376a64e ]
In the tx path of l2tp, l2tp_xmit_skb() calls skb_dst_set() to set skb's dst. However, it will eventually call inet6_csk_xmit() or ip_queue_xmit() where skb's dst will be overwritten by:
skb_dst_set_noref(skb, dst);
without releasing the old dst in skb. Then it causes dst/dev refcnt leak:
unregister_netdevice: waiting for eth0 to become free. Usage count = 1
This can be reproduced by simply running:
# modprobe l2tp_eth && modprobe l2tp_ip # sh ./tools/testing/selftests/net/l2tp.sh
So before going to inet6_csk_xmit() or ip_queue_xmit(), skb's dst should be dropped. This patch is to fix it by removing skb_dst_set() from l2tp_xmit_skb() and moving skb_dst_drop() into l2tp_xmit_core().
--- net/l2tp/l2tp_core.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
net/l2tp/l2tp_core.c +1 -4
@@ -1030,6 +1030,7 @@ static void l2tp_xmit_core(struct l2tp_s/* Queue the packet to IP for output */ skb->ignore_df =1 ; +skb_dst_drop (skb);#if IS_ENABLED (CONFIG_IPV6 )if (l2tp_sk_is_v6 (tunnel->sock)) error =inet6_csk_xmit (tunnel->sock, skb,NULL );
@@ -1101,10 +1102,6 @@ int l2tp_xmit_skb(struct l2tp_session *s goto out_unlock; } -/* Get routing info from the tunnel socket */ -skb_dst_drop (skb); -skb_dst_set (skb,sk_dst_check (sk,0 )); - inet =inet_sk (sk); fl = &inet->cork.fl;switch (tunnel->encap) {
Greg Kroah-Hartman
maintainerPATCH 11/215 llc: make sure applications use ARPHRD_ETHER
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit a9b1110162357689a34992d5c925852948e5b9fd ]
syzbot was to trigger a bug by tricking AF_LLC with non sensible addr->sllc_arphrd
It seems clear LLC requires an Ethernet device.
Back in commit abf9d537fea2 ("llc: add support for SO_BINDTODEVICE") Octavian Purdila added possibility for application to use a zero value for sllc_arphrd, convert it to ARPHRD_ETHER to not cause regressions on existing applications.
BUG: KASAN: use-after-free in __read_once_size include/linux/compiler.h:199 [inline]
BUG: KASAN: use-after-free in list_empty include/linux/list.h:268 [inline]
BUG: KASAN: use-after-free in waitqueue_active include/linux/wait.h:126 [inline]
BUG: KASAN: use-after-free in wq_has_sleeper include/linux/wait.h:160 [inline]
BUG: KASAN: use-after-free in skwq_has_sleeper include/net/sock.h:2092 [inline]
BUG: KASAN: use-after-free in sock_def_write_space+0x642/0x670 net/core/sock.c:2813
Read of size 8 at addr ffff88801e0b4078 by task ksoftirqd/3/27
CPU: 3 PID: 27 Comm: ksoftirqd/3 Not tainted 5.5.0-rc1-syzkaller #0
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0x197/0x210 lib/dump_stack.c:118
print_address_description.constprop.0.cold+0xd4/0x30b mm/kasan/report.c:374
__kasan_report.cold+0x1b/0x41 mm/kasan/report.c:506
kasan_report+0x12/0x20 mm/kasan/common.c:639
__asan_report_load8_noabort+0x14/0x20 mm/kasan/generic_report.c:135
__read_once_size include/linux/compiler.h:199 [inline]
list_empty include/linux/list.h:268 [inline]
waitqueue_active include/linux/wait.h:126 [inline]
wq_has_sleeper include/linux/wait.h:160 [inline]
skwq_has_sleeper include/net/sock.h:2092 [inline]
sock_def_write_space+0x642/0x670 net/core/sock.c:2813
sock_wfree+0x1e1/0x260 net/core/sock.c:1958
skb_release_head_state+0xeb/0x260 net/core/skbuff.c:652
skb_release_all+0x16/0x60 net/core/skbuff.c:663
__kfree_skb net/core/skbuff.c:679 [inline]
consume_skb net/core/skbuff.c:838 [inline]
consume_skb+0xfb/0x410 net/core/skbuff.c:832
__dev_kfree_skb_any+0xa4/0xd0 net/core/dev.c:2967
dev_kfree_skb_any include/linux/netdevice.h:3650 [inline]
e1000_unmap_and_free_tx_resource.isra.0+0x21b/0x3a0 drivers/net/ethernet/intel/e1000/e1000_main.c:1963
e1000_clean_tx_irq drivers/net/ethernet/intel/e1000/e1000_main.c:3854 [inline]
e1000_clean+0x4cc/0x1d10 drivers/net/ethernet/intel/e1000/e1000_main.c:3796
napi_poll net/core/dev.c:6532 [inline]
net_rx_action+0x508/0x1120 net/core/dev.c:6600
__do_softirq+0x262/0x98c kernel/softirq.c:292
run_ksoftirqd kernel/softirq.c:603 [inline]
run_ksoftirqd+0x8e/0x110 kernel/softirq.c:595
smpboot_thread_fn+0x6a3/0xa40 kernel/smpboot.c:165
kthread+0x361/0x430 kernel/kthread.c:255
ret_from_fork+0x24/0x30 arch/x86/entry/entry_64.S:352
Allocated by task 8247:
save_stack+0x23/0x90 mm/kasan/common.c:72
set_track mm/kasan/common.c:80 [inline]
__kasan_kmalloc mm/kasan/common.c:513 [inline]
__kasan_kmalloc.constprop.0+0xcf/0xe0 mm/kasan/common.c:486
kasan_slab_alloc+0xf/0x20 mm/kasan/common.c:521
slab_post_alloc_hook mm/slab.h:584 [inline]
slab_alloc mm/slab.c:3320 [inline]
kmem_cache_alloc+0x121/0x710 mm/slab.c:3484
sock_alloc_inode+0x1c/0x1d0 net/socket.c:240
alloc_inode+0x68/0x1e0 fs/inode.c:230
new_inode_pseudo+0x19/0xf0 fs/inode.c:919
sock_alloc+0x41/0x270 net/socket.c:560
__sock_create+0xc2/0x730 net/socket.c:1384
sock_create net/socket.c:1471 [inline]
__sys_socket+0x103/0x220 net/socket.c:1513
__do_sys_socket net/socket.c:1522 [inline]
__se_sys_socket net/socket.c:1520 [inline]
__ia32_sys_socket+0x73/0xb0 net/socket.c:1520
do_syscall_32_irqs_on arch/x86/entry/common.c:337 [inline]
do_fast_syscall_32+0x27b/0xe16 arch/x86/entry/common.c:408
entry_SYSENTER_compat+0x70/0x7f arch/x86/entry/entry_64_compat.S:139
Freed by task 17:
save_stack+0x23/0x90 mm/kasan/common.c:72
set_track mm/kasan/common.c:80 [inline]
kasan_set_free_info mm/kasan/common.c:335 [inline]
__kasan_slab_free+0x102/0x150 mm/kasan/common.c:474
kasan_slab_free+0xe/0x10 mm/kasan/common.c:483
__cache_free mm/slab.c:3426 [inline]
kmem_cache_free+0x86/0x320 mm/slab.c:3694
sock_free_inode+0x20/0x30 net/socket.c:261
i_callback+0x44/0x80 fs/inode.c:219
__rcu_reclaim kernel/rcu/rcu.h:222 [inline]
rcu_do_batch kernel/rcu/tree.c:2183 [inline]
rcu_core+0x570/0x1540 kernel/rcu/tree.c:2408
rcu_core_si+0x9/0x10 kernel/rcu/tree.c:2417
__do_softirq+0x262/0x98c kernel/softirq.c:292
The buggy address belongs to the object at ffff88801e0b4000
which belongs to the cache sock_inode_cache of size 1152
The buggy address is located 120 bytes inside of
1152-byte region [ffff88801e0b4000, ffff88801e0b4480)
The buggy address belongs to the page:
page:ffffea0000782d00 refcount:1 mapcount:0 mapping:ffff88807aa59c40 index:0xffff88801e0b4ffd
raw: 00fffe0000000200 ffffea00008e6c88 ffffea0000782d48 ffff88807aa59c40
raw: ffff88801e0b4ffd ffff88801e0b4000 0000000100000003 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff88801e0b3f00: fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
ffff88801e0b3f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff88801e0b4000: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff88801e0b4080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88801e0b4100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb--- net/llc/af_llc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
net/llc/af_llc.c +7 -3
@@ -273,6 +273,10 @@ static int llc_ui_autobind(struct socketif (!sock_flag (sk,SOCK_ZAPPED )) goto out; +if (!addr->sllc_arphrd) + addr->sllc_arphrd =ARPHRD_ETHER ; +if (addr->sllc_arphrd !=ARPHRD_ETHER ) + goto out; rc = -ENODEV ;if (sk->sk_bound_dev_if) { llc->dev =dev_get_by_index (&init_net, sk->sk_bound_dev_if);
@@ -328,7 +332,9 @@ static int llc_ui_bind(struct socket *soif (unlikely (!sock_flag (sk,SOCK_ZAPPED ) || addrlen !=sizeof (*addr))) goto out; rc = -EAFNOSUPPORT ; -if (unlikely (addr->sllc_family !=AF_LLC )) +if (!addr->sllc_arphrd) + addr->sllc_arphrd =ARPHRD_ETHER ; +if (unlikely (addr->sllc_family !=AF_LLC || addr->sllc_arphrd !=ARPHRD_ETHER )) goto out;dprintk ("%s: binding %02X\n" , __func__, addr->sllc_sap); rc = -ENODEV ;
@@ -336,8 +342,6 @@ static int llc_ui_bind(struct socket *soif (sk->sk_bound_dev_if) { llc->dev =dev_get_by_index_rcu (&init_net, sk->sk_bound_dev_if);if (llc->dev) { -if (!addr->sllc_arphrd) - addr->sllc_arphrd = llc->dev->type;if (is_zero_ether_addr (addr->sllc_mac))memcpy (addr->sllc_mac, llc->dev->dev_addr,IFHWADDRLEN );
Greg Kroah-Hartman
maintainerPATCH 12/215 net: Added pointer check for dst->ops->neigh_lookup in dst_neigh_lookup_skb
In reply to Greg Kroah-HartmanFrom: Martin Varghese <[email protected]>
[ Upstream commit 394de110a73395de2ca4516b0de435e91b11b604 ]
The packets from tunnel devices (eg bareudp) may have only metadata in the dst pointer of skb. Hence a pointer check of neigh_lookup is needed in dst_neigh_lookup_skb
Kernel crashes when packets from bareudp device is processed in the kernel neighbour subsytem.
[ 133.384484] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 133.385240] #PF: supervisor instruction fetch in kernel mode [ 133.385828] #PF: error_code(0x0010) - not-present page [ 133.386603] PGD 0 P4D 0 [ 133.386875] Oops: 0010 [#1] SMP PTI [ 133.387275] CPU: 0 PID: 5045 Comm: ping Tainted: G W 5.8.0-rc2+ #15 [ 133.388052] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 [ 133.391076] RIP: 0010:0x0 [ 133.392401] Code: Bad RIP value. [ 133.394029] RSP: 0018:ffffb79980003d50 EFLAGS: 00010246 [ 133.396656] RAX: 0000000080000102 RBX: ffff9de2fe0d6600 RCX: ffff9de2fe5e9d00 [ 133.399018] RDX: 0000000000000000 RSI: ffff9de2fe5e9d00 RDI: ffff9de2fc21b400 [ 133.399685] RBP: ffff9de2fe5e9d00 R08: 0000000000000000 R09: 0000000000000000 [ 133.400350] R10: ffff9de2fbc6be22 R11: ffff9de2fe0d6600 R12: ffff9de2fc21b400 [ 133.401010] R13: ffff9de2fe0d6628 R14: 0000000000000001 R15: 0000000000000003 [ 133.401667] FS: 00007fe014918740(0000) GS:ffff9de2fec00000(0000) knlGS:0000000000000000 [ 133.402412] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 133.402948] CR2: ffffffffffffffd6 CR3: 000000003bb72000 CR4: 00000000000006f0 [ 133.403611] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 133.404270] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 133.404933] Call Trace: [ 133.405169] <IRQ> [ 133.405367] __neigh_update+0x5a4/0x8f0 [ 133.405734] arp_process+0x294/0x820 [ 133.406076] ? __netif_receive_skb_core+0x866/0xe70 [ 133.406557] arp_rcv+0x129/0x1c0 [ 133.406882] __netif_receive_skb_one_core+0x95/0xb0 [ 133.407340] process_backlog+0xa7/0x150 [ 133.407705] net_rx_action+0x2af/0x420 [ 133.408457] __do_softirq+0xda/0x2a8 [ 133.408813] asm_call_on_stack+0x12/0x20 [ 133.409290] </IRQ> [ 133.409519] do_softirq_own_stack+0x39/0x50 [ 133.410036] do_softirq+0x50/0x60 [ 133.410401] __local_bh_enable_ip+0x50/0x60 [ 133.410871] ip_finish_output2+0x195/0x530 [ 133.411288] ip_output+0x72/0xf0 [ 133.411673] ? __ip_finish_output+0x1f0/0x1f0 [ 133.412122] ip_send_skb+0x15/0x40 [ 133.412471] raw_sendmsg+0x853/0xab0 [ 133.412855] ? insert_pfn+0xfe/0x270 [ 133.413827] ? vvar_fault+0xec/0x190 [ 133.414772] sock_sendmsg+0x57/0x80 [ 133.415685] __sys_sendto+0xdc/0x160 [ 133.416605] ? syscall_trace_enter+0x1d4/0x2b0 [ 133.417679] ? __audit_syscall_exit+0x1d9/0x280 [ 133.418753] ? __prepare_exit_to_usermode+0x5d/0x1a0 [ 133.419819] __x64_sys_sendto+0x24/0x30 [ 133.420848] do_syscall_64+0x4d/0x90 [ 133.421768] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 133.422833] RIP: 0033:0x7fe013689c03 [ 133.423749] Code: Bad RIP value. [ 133.424624] RSP: 002b:00007ffc7288f418 EFLAGS: 00000246 ORIG_RAX: 000000000000002c [ 133.425940] RAX: ffffffffffffffda RBX: 000056151fc63720 RCX: 00007fe013689c03 [ 133.427225] RDX: 0000000000000040 RSI: 000056151fc63720 RDI: 0000000000000003 [ 133.428481] RBP: 00007ffc72890b30 R08: 000056151fc60500 R09: 0000000000000010 [ 133.429757] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000040 [ 133.431041] R13: 000056151fc636e0 R14: 000056151fc616bc R15: 0000000000000080 [ 133.432481] Modules linked in: mpls_iptunnel act_mirred act_tunnel_key cls_flower sch_ingress veth mpls_router ip_tunnel bareudp ip6_udp_tunnel udp_tunnel macsec udp_diag inet_diag unix_diag af_packet_diag netlink_diag binfmt_misc xt_MASQUERADE iptable_nat xt_addrtype xt_conntrack nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 br_netfilter bridge stp llc ebtable_filter ebtables overlay ip6table_filter ip6_tables iptable_filter sunrpc ext4 mbcache jbd2 pcspkr i2c_piix4 virtio_balloon joydev ip_tables xfs libcrc32c ata_generic qxl pata_acpi drm_ttm_helper ttm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm ata_piix libata virtio_net net_failover virtio_console failover virtio_blk i2c_core virtio_pci virtio_ring serio_raw floppy virtio dm_mirror dm_region_hash dm_log dm_mod [ 133.444045] CR2: 0000000000000000 [ 133.445082] ---[ end trace f4aeee1958fd1638 ]--- [ 133.446236] RIP: 0010:0x0 [ 133.447180] Code: Bad RIP value. [ 133.448152] RSP: 0018:ffffb79980003d50 EFLAGS: 00010246 [ 133.449363] RAX: 0000000080000102 RBX: ffff9de2fe0d6600 RCX: ffff9de2fe5e9d00 [ 133.450835] RDX: 0000000000000000 RSI: ffff9de2fe5e9d00 RDI: ffff9de2fc21b400 [ 133.452237] RBP: ffff9de2fe5e9d00 R08: 0000000000000000 R09: 0000000000000000 [ 133.453722] R10: ffff9de2fbc6be22 R11: ffff9de2fe0d6600 R12: ffff9de2fc21b400 [ 133.455149] R13: ffff9de2fe0d6628 R14: 0000000000000001 R15: 0000000000000003 [ 133.456520] FS: 00007fe014918740(0000) GS:ffff9de2fec00000(0000) knlGS:0000000000000000 [ 133.458046] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 133.459342] CR2: ffffffffffffffd6 CR3: 000000003bb72000 CR4: 00000000000006f0 [ 133.460782] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 133.462240] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 133.463697] Kernel panic - not syncing: Fatal exception in interrupt [ 133.465226] Kernel Offset: 0xfa00000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff) [ 133.467025] ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
--- include/net/dst.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
include/net/dst.h +9 -1
@@ -401,7 +401,15 @@ static inline struct neighbour *dst_neigstatic inline struct neighbour *dst_neigh_lookup_skb (const struct dst_entry *dst,struct sk_buff *skb) { -struct neighbour *n = dst->ops->neigh_lookup (dst, skb,NULL ); +struct neighbour *n =NULL ; + +/* The packets from tunnel devices (eg bareudp) may have only +* metadata in the dst pointer of skb. Hence a pointer check of +* neigh_lookup is needed. +*/ +if (dst->ops->neigh_lookup) + n = dst->ops->neigh_lookup (dst, skb,NULL ); +return IS_ERR (n) ?NULL : n; }
Greg Kroah-Hartman
maintainerPATCH 13/215 net: dsa: microchip: set the correct number of ports
In reply to Greg Kroah-HartmanFrom: Codrin Ciubotariu <[email protected]>
[ Upstream commit af199a1a9cb02ec0194804bd46c174b6db262075 ]
The number of ports is incorrectly set to the maximum available for a DSA switch. Even if the extra ports are not used, this causes some functions to be called later, like port_disable() and port_stp_state_set(). If the driver doesn't check the port index, it will end up modifying unknown registers.
--- drivers/net/dsa/microchip/ksz8795.c | 3 +++ drivers/net/dsa/microchip/ksz9477.c | 3 +++ 2 files changed, 6 insertions(+)
drivers/net/dsa/microchip/ksz8795.c +3 -0
@@ -1270,6 +1270,9 @@ static int ksz8795_switch_init(struct ks/* set the real number of ports */ dev->ds->num_ports = dev->port_cnt; +/* set the real number of ports */ + dev->ds->num_ports = dev->port_cnt; +return 0 ; }
drivers/net/dsa/microchip/ksz9477.c +3 -0
@@ -515,6 +515,9 @@ static int ksz9477_port_vlan_filtering(s PORT_VLAN_LOOKUP_VID_0, false); } +/* set the real number of ports */ + dev->ds->num_ports = dev->port_cnt; +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 14/215 net_sched: fix a memory leak in atm_tc_init()
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit 306381aec7c2b5a658eebca008c8a1b666536cba ]
When tcf_block_get() fails inside atm_tc_init(), atm_tc_put() is called to release the qdisc p->link.q. But the flow->ref prevents it to do so, as the flow->ref is still zero.
Fix this by moving the p->link.ref initialization before tcf_block_get().
--- net/sched/sch_atm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/sched/sch_atm.c +4 -4
@@ -553,16 +553,16 @@ static int atm_tc_init(struct Qdisc *schif (!p->link.q) p->link.q = &noop_qdisc;pr_debug ("atm_tc_init: link (%p) qdisc %p\n" , &p->link, p->link.q); + p->link.vcc =NULL ; + p->link.sock =NULL ; + p->link.common.classid = sch->handle; + p->link.ref =1 ; err =tcf_block_get (&p->link.block, &p->link.filter_list, sch, extack);if (err)return err; - p->link.vcc =NULL ; - p->link.sock =NULL ; - p->link.common.classid = sch->handle; - p->link.ref =1 ;tasklet_init (&p->task, sch_atm_dequeue, (unsigned long )sch);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 15/215 net: usb: qmi_wwan: add support for Quectel EG95 LTE modem
In reply to Greg Kroah-HartmanFrom: AceLan Kao <[email protected]>
[ Upstream commit f815dd5cf48b905eeecf0a2b990e9b7ab048b4f1 ]
Add support for Quectel Wireless Solutions Co., Ltd. EG95 LTE modem
T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=02 Dev#= 5 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=2c7c ProdID=0195 Rev=03.18 S: Manufacturer=Android S: Product=Android C: #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=500mA I: If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) I: If#=0x1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none) I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none) I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none) I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1370,6 +1370,7 @@ static const struct usb_device_id produc {QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */ + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)}, /* Quectel EG95 */ {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */ {QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */
Greg Kroah-Hartman
maintainerPATCH 16/215 sched: consistently handle layer3 header accesses in the presence of VLANs
In reply to Greg Kroah-HartmanFrom: "Toke H�iland-J�rgensen" <[email protected]>
[ Upstream commit d7bf2ebebc2bd61ab95e2a8e33541ef282f303d4 ]
There are a couple of places in net/sched/ that check skb->protocol and act on the value there. However, in the presence of VLAN tags, the value stored in skb->protocol can be inconsistent based on whether VLAN acceleration is enabled. The commit quoted in the Fixes tag below fixed the users of skb->protocol to use a helper that will always see the VLAN ethertype.
However, most of the callers don't actually handle the VLAN ethertype, but expect to find the IP header type in the protocol field. This means that things like changing the ECN field, or parsing diffserv values, stops working if there's a VLAN tag, or if there are multiple nested VLAN tags (QinQ).
To fix this, change the helper to take an argument that indicates whether the caller wants to skip the VLAN tags or not. When skipping VLAN tags, we make sure to skip all of them, so behaviour is consistent even in QinQ mode.
To make the helper usable from the ECN code, move it to if_vlan.h instead of pkt_sched.h.
v3:
- Remove empty lines
- Move vlan variable definitions inside loop in skb_protocol()
- Also use skb_protocol() helper in IP{,6}_ECN_decapsulate() and bpf_skb_ecn_set_ce()
v2:
- Use eth_type_vlan() helper in skb_protocol()
- Also fix code that reads skb->protocol directly
- Change a couple of 'if/else if' statements to switch constructs to avoid calling the helper twice
--- include/linux/if_vlan.h | 28 ++++++++++++++++++++++++++++ include/net/inet_ecn.h | 25 +++++++++++++++++-------- include/net/pkt_sched.h | 11 ----------- net/core/filter.c | 10 +++++++--- net/sched/act_connmark.c | 9 ++++++--- net/sched/act_csum.c | 2 +- net/sched/act_ct.c | 9 ++++----- net/sched/act_ctinfo.c | 9 ++++++--- net/sched/act_mpls.c | 2 +- net/sched/act_skbedit.c | 2 +- net/sched/cls_api.c | 2 +- net/sched/cls_flow.c | 8 ++++---- net/sched/cls_flower.c | 2 +- net/sched/em_ipset.c | 2 +- net/sched/em_ipt.c | 2 +- net/sched/em_meta.c | 2 +- net/sched/sch_cake.c | 4 ++-- net/sched/sch_dsmark.c | 6 +++--- net/sched/sch_teql.c | 2 +- 19 files changed, 86 insertions(+), 51 deletions(-)
include/linux/if_vlan.h +28 -0
@@ -308,6 +308,34 @@ static inline bool eth_type_vlan(__be16 } } +/* A getter for the SKB protocol field which will handle VLAN tags consistently +* whether VLAN acceleration is enabled or not. +*/ +static inline __be16 skb_protocol (const struct sk_buff *skb,bool skip_vlan) +{ +unsigned int offset =skb_mac_offset (skb) +sizeof (struct ethhdr ); +__be16 proto = skb->protocol; + +if (!skip_vlan) +/* VLAN acceleration strips the VLAN header from the skb and +* moves it to skb->vlan_proto +*/ +return skb_vlan_tag_present (skb) ? skb->vlan_proto : proto; + +while (eth_type_vlan (proto)) { +struct vlan_hdr vhdr, *vh; + + vh =skb_header_pointer (skb, offset,sizeof (vhdr), &vhdr); +if (!vh) +break ; + + proto = vh->h_vlan_encapsulated_proto; + offset +=sizeof (vhdr); + } + +return proto; +} +static inline bool vlan_hw_offload_capable (netdev_features_t features,__be16 proto) {
include/net/inet_ecn.h +17 -8
@@ -4,6 +4,7 @@#include <linux/ip.h> #include <linux/skbuff.h> +#include <linux/if_vlan.h> #include <net/inet_sock.h> #include <net/dsfield.h>
@@ -172,7 +173,7 @@ static inline void ipv6_copy_dscp(unsignstatic inline int INET_ECN_set_ce (struct sk_buff *skb) { -switch (skb->protocol) { +switch (skb_protocol (skb, true)) {case cpu_to_be16 (ETH_P_IP ):if (skb_network_header (skb) +sizeof (struct iphdr ) <=skb_tail_pointer (skb))
@@ -191,7 +192,7 @@ static inline int INET_ECN_set_ce(structstatic inline int INET_ECN_set_ect1 (struct sk_buff *skb) { -switch (skb->protocol) { +switch (skb_protocol (skb, true)) {case cpu_to_be16 (ETH_P_IP ):if (skb_network_header (skb) +sizeof (struct iphdr ) <=skb_tail_pointer (skb))
@@ -272,12 +273,16 @@ static inline int IP_ECN_decapsulate(con {__u8 inner; -if (skb->protocol ==htons (ETH_P_IP )) +switch (skb_protocol (skb, true)) { +case htons (ETH_P_IP ): inner =ip_hdr (skb)->tos; -else if (skb->protocol ==htons (ETH_P_IPV6 )) +break ; +case htons (ETH_P_IPV6 ): inner =ipv6_get_dsfield (ipv6_hdr (skb)); -else +break ; +default :return 0 ; + }return INET_ECN_decapsulate (skb, oiph->tos, inner); }
@@ -287,12 +292,16 @@ static inline int IP6_ECN_decapsulate(co {__u8 inner; -if (skb->protocol ==htons (ETH_P_IP )) +switch (skb_protocol (skb, true)) { +case htons (ETH_P_IP ): inner =ip_hdr (skb)->tos; -else if (skb->protocol ==htons (ETH_P_IPV6 )) +break ; +case htons (ETH_P_IPV6 ): inner =ipv6_get_dsfield (ipv6_hdr (skb)); -else +break ; +default :return 0 ; + }return INET_ECN_decapsulate (skb,ipv6_get_dsfield (oipv6h), inner); }
include/net/pkt_sched.h +0 -11
@@ -128,17 +128,6 @@ static inline void qdisc_run(struct Qdis } } -static inline __be16 tc_skb_protocol (const struct sk_buff *skb) -{ -/* We need to take extra care in case the skb came via -* vlan accelerated path. In that case, use skb->vlan_proto -* as the original vlan header was already stripped. -*/ -if (skb_vlan_tag_present (skb)) -return skb->vlan_proto; -return skb->protocol; -} -/* Calculate maximal size of packet seen by hard_start_xmit routine of this device. */
net/core/filter.c +7 -3
@@ -5730,12 +5730,16 @@ BPF_CALL_1(bpf_skb_ecn_set_ce, struct sk {unsigned int iphdr_len; -if (skb->protocol ==cpu_to_be16 (ETH_P_IP )) +switch (skb_protocol (skb, true)) { +case cpu_to_be16 (ETH_P_IP ): iphdr_len =sizeof (struct iphdr ); -else if (skb->protocol ==cpu_to_be16 (ETH_P_IPV6 )) +break ; +case cpu_to_be16 (ETH_P_IPV6 ): iphdr_len =sizeof (struct ipv6hdr ); -else +break ; +default :return 0 ; + }if (skb_headlen (skb) < iphdr_len)return 0 ;
net/sched/act_connmark.c +6 -3
@@ -43,17 +43,20 @@ static int tcf_connmark_act(struct sk_butcf_lastuse_update (&ca->tcf_tm);bstats_update (&ca->tcf_bstats, skb); -if (skb->protocol ==htons (ETH_P_IP )) { +switch (skb_protocol (skb, true)) { +case htons (ETH_P_IP ):if (skb->len <sizeof (struct iphdr )) goto out; proto =NFPROTO_IPV4 ; - }else if (skb->protocol ==htons (ETH_P_IPV6 )) { +break ; +case htons (ETH_P_IPV6 ):if (skb->len <sizeof (struct ipv6hdr )) goto out; proto =NFPROTO_IPV6 ; - }else { +break ; +default : goto out; }
net/sched/act_csum.c +1 -1
@@ -587,7 +587,7 @@ static int tcf_csum_act(struct sk_buff * goto drop; update_flags = params->update_flags; - protocol =tc_skb_protocol (skb); + protocol =skb_protocol (skb, false); again:switch (protocol) {case cpu_to_be16 (ETH_P_IP ):
net/sched/act_ct.c +4 -5
@@ -100,7 +100,7 @@ static u8 tcf_ct_skb_nf_family(struct sk {u8 family =NFPROTO_UNSPEC ; -switch (skb->protocol) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ): family =NFPROTO_IPV4 ;break ;
@@ -222,6 +222,7 @@ static int ct_nat_execute(struct sk_buffconst struct nf_nat_range2 *range, enum nf_nat_manip_type maniptype) { + __be16 proto = skb_protocol(skb, true);int hooknum, err =NF_ACCEPT ;/* See HOOK2MANIP(). */
@@ -233,14 +234,13 @@ static int ct_nat_execute(struct sk_buffswitch (ctinfo) {case IP_CT_RELATED :case IP_CT_RELATED_REPLY : -if (skb->protocol ==htons (ETH_P_IP ) && +if (proto ==htons (ETH_P_IP ) &&ip_hdr (skb)->protocol ==IPPROTO_ICMP ) {if (!nf_nat_icmp_reply_translation (skb, ct, ctinfo, hooknum)) err =NF_DROP ; goto out; - }else if (IS_ENABLED (CONFIG_IPV6 ) && - skb->protocol ==htons (ETH_P_IPV6 )) { + }else if (IS_ENABLED (CONFIG_IPV6 ) && proto ==htons (ETH_P_IPV6 )) {__be16 frag_off;u8 nexthdr =ipv6_hdr (skb)->nexthdr; int hdrlen = ipv6_skip_exthdr(skb,
@@ -993,4 +993,3 @@ MODULE_AUTHOR("Yossi Kuperman <yossiku@mMODULE_AUTHOR ("Marcelo Ricardo Leitner <[email protected]>" );MODULE_DESCRIPTION ("Connection tracking action" );MODULE_LICENSE ("GPL v2" ); -
net/sched/act_ctinfo.c +6 -3
@@ -96,19 +96,22 @@ static int tcf_ctinfo_act(struct sk_buff action =READ_ONCE (ca->tcf_action); wlen =skb_network_offset (skb); -if (tc_skb_protocol (skb) ==htons (ETH_P_IP )) { +switch (skb_protocol (skb, true)) { +case htons (ETH_P_IP ): wlen +=sizeof (struct iphdr );if (!pskb_may_pull (skb, wlen)) goto out; proto =NFPROTO_IPV4 ; - }else if (tc_skb_protocol (skb) ==htons (ETH_P_IPV6 )) { +break ; +case htons (ETH_P_IPV6 ): wlen +=sizeof (struct ipv6hdr );if (!pskb_may_pull (skb, wlen)) goto out; proto =NFPROTO_IPV6 ; - }else { +break ; +default : goto out; }
net/sched/act_mpls.c +1 -1
@@ -82,7 +82,7 @@ static int tcf_mpls_act(struct sk_buff * goto drop;break ;case TCA_MPLS_ACT_PUSH : - new_lse =tcf_mpls_get_lse (NULL , p, !eth_p_mpls (skb->protocol)); + new_lse =tcf_mpls_get_lse (NULL , p, !eth_p_mpls (skb_protocol (skb, true)));if (skb_mpls_push (skb, new_lse, p->tcfm_proto, mac_len, skb->dev && skb->dev->type ==ARPHRD_ETHER )) goto drop;
net/sched/act_skbedit.c +1 -1
@@ -41,7 +41,7 @@ static int tcf_skbedit_act(struct sk_bufif (params->flags &SKBEDIT_F_INHERITDSFIELD ) {int wlen =skb_network_offset (skb); -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ): wlen +=sizeof (struct iphdr );if (!pskb_may_pull (skb, wlen))
net/sched/cls_api.c +1 -1
@@ -1571,7 +1571,7 @@ int tcf_classify(struct sk_buff *skb, co reclassify: #endiffor (; tp; tp =rcu_dereference_bh (tp->next)) { -__be16 protocol =tc_skb_protocol (skb); +__be16 protocol =skb_protocol (skb, false);int err; if (tp->protocol != protocol &&
net/sched/cls_flow.c +4 -4
@@ -80,7 +80,7 @@ static u32 flow_get_dst(const struct sk_if (dst)return ntohl (dst); -return addr_fold (skb_dst (skb)) ^ (__force u16 )tc_skb_protocol (skb); +return addr_fold (skb_dst (skb)) ^ (__force u16 )skb_protocol (skb, true); } static u32 flow_get_proto(const struct sk_buff *skb,
@@ -104,7 +104,7 @@ static u32 flow_get_proto_dst(const struif (flow->ports.ports)return ntohs (flow->ports.dst); -return addr_fold (skb_dst (skb)) ^ (__force u16 )tc_skb_protocol (skb); +return addr_fold (skb_dst (skb)) ^ (__force u16 )skb_protocol (skb, true); }static u32 flow_get_iif (const struct sk_buff *skb)
@@ -151,7 +151,7 @@ static u32 flow_get_nfct(const struct skstatic u32 flow_get_nfct_src (const struct sk_buff *skb,const struct flow_keys *flow) { -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ):return ntohl (CTTUPLE (skb, src.u3.ip));case htons (ETH_P_IPV6 ):
@@ -164,7 +164,7 @@ fallback:static u32 flow_get_nfct_dst (const struct sk_buff *skb,const struct flow_keys *flow) { -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ):return ntohl (CTTUPLE (skb, dst.u3.ip));case htons (ETH_P_IPV6 ):
net/sched/cls_flower.c +1 -1
@@ -310,7 +310,7 @@ static int fl_classify(struct sk_buff *s/* skb_flow_dissect() does not set n_proto in case an unknown * protocol, so do it rather here. */ - skb_key.basic.n_proto = skb->protocol; + skb_key.basic.n_proto =skb_protocol (skb, false);skb_flow_dissect_tunnel_info (skb, &mask->dissector, &skb_key); skb_flow_dissect_ct(skb, &mask->dissector, &skb_key, fl_ct_info_to_flower_map,
net/sched/em_ipset.c +1 -1
@@ -59,7 +59,7 @@ static int em_ipset_match(struct sk_buff };int ret, network_offset; -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ): state.pf =NFPROTO_IPV4 ;if (!pskb_network_may_pull (skb,sizeof (struct iphdr )))
net/sched/em_ipt.c +1 -1
@@ -212,7 +212,7 @@ static int em_ipt_match(struct sk_buff *struct nf_hook_state state;int ret; -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ):if (!pskb_network_may_pull (skb,sizeof (struct iphdr )))return 0 ;
net/sched/em_meta.c +1 -1
@@ -195,7 +195,7 @@ META_COLLECTOR(int_priority)META_COLLECTOR (int_protocol) {/* Let userspace take care of the byte ordering */ - dst->value =tc_skb_protocol (skb); + dst->value =skb_protocol (skb, false); }META_COLLECTOR (int_pkttype)
net/sched/sch_cake.c +2 -2
@@ -592,7 +592,7 @@ static void cake_update_flowkeys(structstruct nf_conntrack_tuple tuple = {};bool rev = !skb->_nfct; -if (tc_skb_protocol (skb) !=htons (ETH_P_IP )) +if (skb_protocol (skb, true) !=htons (ETH_P_IP ))return ;if (!nf_ct_get_tuple_skb (&tuple, skb))
@@ -1521,7 +1521,7 @@ static u8 cake_handle_diffserv(struct sku16 *buf, buf_;u8 dscp; -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ): buf =skb_header_pointer (skb, offset,sizeof (buf_), &buf_);if (unlikely (!buf))
net/sched/sch_dsmark.c +3 -3
@@ -210,7 +210,7 @@ static int dsmark_enqueue(struct sk_buffif (p->set_tc_index) {int wlen =skb_network_offset (skb); -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ): wlen +=sizeof (struct iphdr ); if (!pskb_may_pull(skb, wlen) ||
@@ -303,7 +303,7 @@ static struct sk_buff *dsmark_dequeue(st index = skb->tc_index & (p->indices -1 );pr_debug ("index %d->%d\n" , skb->tc_index, index); -switch (tc_skb_protocol (skb)) { +switch (skb_protocol (skb, true)) {case htons (ETH_P_IP ):ipv4_change_dsfield (ip_hdr (skb), p->mv[index].mask, p->mv[index].value);
@@ -320,7 +320,7 @@ static struct sk_buff *dsmark_dequeue(st*/ if (p->mv[index].mask !=0xff || p->mv[index].value)pr_warn ("%s: unsupported protocol %d\n" , - __func__,ntohs (tc_skb_protocol (skb))); + __func__,ntohs (skb_protocol (skb, true)));break ; }
net/sched/sch_teql.c +1 -1
@@ -239,7 +239,7 @@ __teql_resolve(struct sk_buff *skb, struchar haddr[MAX_ADDR_LEN ];neigh_ha_snapshot (haddr, n, dev); - err =dev_hard_header (skb, dev,ntohs (tc_skb_protocol (skb)), + err =dev_hard_header (skb, dev,ntohs (skb_protocol (skb, false)), haddr,NULL , skb->len);if (err <0 )
Greg Kroah-Hartman
maintainerPATCH 17/215 tcp: fix SO_RCVLOWAT possible hangs under high mem pressure
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit ba3bb0e76ccd464bb66665a1941fabe55dadb3ba ]
Whenever tcp_try_rmem_schedule() returns an error, we are under trouble and should make sure to wakeup readers so that they can drain socket queues and eventually make room.
--- net/ipv4/tcp_input.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/tcp_input.c +2 -0
@@ -4564,6 +4564,7 @@ static void tcp_data_queue_ofo(struct soif (unlikely (tcp_try_rmem_schedule (sk, skb, skb->truesize))) {NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPOFODROP ); + sk->sk_data_ready (sk);tcp_drop (sk, skb);return ; }
@@ -4807,6 +4808,7 @@ queue_and_out:sk_forced_mem_schedule (sk, skb->truesize); else if (tcp_try_rmem_schedule(sk, skb, skb->truesize)) {NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPRCVQDROP ); + sk->sk_data_ready (sk); goto drop; }
Greg Kroah-Hartman
maintainerPATCH 18/215 tcp: make sure listeners dont initialize congestion-control state
In reply to Greg Kroah-HartmanFrom: Christoph Paasch <[email protected]>
[ Upstream commit ce69e563b325f620863830c246a8698ccea52048 ]
syzkaller found its way into setsockopt with TCP_CONGESTION "cdg". tcp_cdg_init() does a kcalloc to store the gradients. As sk_clone_lock just copies all the memory, the allocated pointer will be copied as well, if the app called setsockopt(..., TCP_CONGESTION) on the listener. If now the socket will be destroyed before the congestion-control has properly been initialized (through a call to tcp_init_transfer), we will end up freeing memory that does not belong to that particular socket, opening the door to a double-free:
[ 11.413102] ================================================================== [ 11.414181] BUG: KASAN: double-free or invalid-free in tcp_cleanup_congestion_control+0x58/0xd0 [ 11.415329] [ 11.415560] CPU: 3 PID: 4884 Comm: syz-executor.5 Not tainted 5.8.0-rc2 #80 [ 11.416544] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 [ 11.418148] Call Trace: [ 11.418534] <IRQ> [ 11.418834] dump_stack+0x7d/0xb0 [ 11.419297] print_address_description.constprop.0+0x1a/0x210 [ 11.422079] kasan_report_invalid_free+0x51/0x80 [ 11.423433] __kasan_slab_free+0x15e/0x170 [ 11.424761] kfree+0x8c/0x230 [ 11.425157] tcp_cleanup_congestion_control+0x58/0xd0 [ 11.425872] tcp_v4_destroy_sock+0x57/0x5a0 [ 11.426493] inet_csk_destroy_sock+0x153/0x2c0 [ 11.427093] tcp_v4_syn_recv_sock+0xb29/0x1100 [ 11.427731] tcp_get_cookie_sock+0xc3/0x4a0 [ 11.429457] cookie_v4_check+0x13d0/0x2500 [ 11.433189] tcp_v4_do_rcv+0x60e/0x780 [ 11.433727] tcp_v4_rcv+0x2869/0x2e10 [ 11.437143] ip_protocol_deliver_rcu+0x23/0x190 [ 11.437810] ip_local_deliver+0x294/0x350 [ 11.439566] __netif_receive_skb_one_core+0x15d/0x1a0 [ 11.441995] process_backlog+0x1b1/0x6b0 [ 11.443148] net_rx_action+0x37e/0xc40 [ 11.445361] __do_softirq+0x18c/0x61a [ 11.445881] asm_call_on_stack+0x12/0x20 [ 11.446409] </IRQ> [ 11.446716] do_softirq_own_stack+0x34/0x40 [ 11.447259] do_softirq.part.0+0x26/0x30 [ 11.447827] __local_bh_enable_ip+0x46/0x50 [ 11.448406] ip_finish_output2+0x60f/0x1bc0 [ 11.450109] __ip_queue_xmit+0x71c/0x1b60 [ 11.451861] __tcp_transmit_skb+0x1727/0x3bb0 [ 11.453789] tcp_rcv_state_process+0x3070/0x4d3a [ 11.456810] tcp_v4_do_rcv+0x2ad/0x780 [ 11.457995] __release_sock+0x14b/0x2c0 [ 11.458529] release_sock+0x4a/0x170 [ 11.459005] __inet_stream_connect+0x467/0xc80 [ 11.461435] inet_stream_connect+0x4e/0xa0 [ 11.462043] __sys_connect+0x204/0x270 [ 11.465515] __x64_sys_connect+0x6a/0xb0 [ 11.466088] do_syscall_64+0x3e/0x70 [ 11.466617] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 11.467341] RIP: 0033:0x7f56046dc469 [ 11.467844] Code: Bad RIP value. [ 11.468282] RSP: 002b:00007f5604dccdd8 EFLAGS: 00000246 ORIG_RAX: 000000000000002a [ 11.469326] RAX: ffffffffffffffda RBX: 000000000068bf00 RCX: 00007f56046dc469 [ 11.470379] RDX: 0000000000000010 RSI: 0000000020000000 RDI: 0000000000000004 [ 11.471311] RBP: 00000000ffffffff R08: 0000000000000000 R09: 0000000000000000 [ 11.472286] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 [ 11.473341] R13: 000000000041427c R14: 00007f5604dcd5c0 R15: 0000000000000003 [ 11.474321] [ 11.474527] Allocated by task 4884: [ 11.475031] save_stack+0x1b/0x40 [ 11.475548] __kasan_kmalloc.constprop.0+0xc2/0xd0 [ 11.476182] tcp_cdg_init+0xf0/0x150 [ 11.476744] tcp_init_congestion_control+0x9b/0x3a0 [ 11.477435] tcp_set_congestion_control+0x270/0x32f [ 11.478088] do_tcp_setsockopt.isra.0+0x521/0x1a00 [ 11.478744] __sys_setsockopt+0xff/0x1e0 [ 11.479259] __x64_sys_setsockopt+0xb5/0x150 [ 11.479895] do_syscall_64+0x3e/0x70 [ 11.480395] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 11.481097] [ 11.481321] Freed by task 4872: [ 11.481783] save_stack+0x1b/0x40 [ 11.482230] __kasan_slab_free+0x12c/0x170 [ 11.482839] kfree+0x8c/0x230 [ 11.483240] tcp_cleanup_congestion_control+0x58/0xd0 [ 11.483948] tcp_v4_destroy_sock+0x57/0x5a0 [ 11.484502] inet_csk_destroy_sock+0x153/0x2c0 [ 11.485144] tcp_close+0x932/0xfe0 [ 11.485642] inet_release+0xc1/0x1c0 [ 11.486131] __sock_release+0xc0/0x270 [ 11.486697] sock_close+0xc/0x10 [ 11.487145] __fput+0x277/0x780 [ 11.487632] task_work_run+0xeb/0x180 [ 11.488118] __prepare_exit_to_usermode+0x15a/0x160 [ 11.488834] do_syscall_64+0x4a/0x70 [ 11.489326] entry_SYSCALL_64_after_hwframe+0x44/0xa9
Wei Wang fixed a part of these CDG-malloc issues with commit c12014440750 ("tcp: memset ca_priv data to 0 properly").
This patch here fixes the listener-scenario: We make sure that listeners setting the congestion-control through setsockopt won't initialize it (thus CDG never allocates on listeners). For those who use AF_UNSPEC to reuse a socket, tcp_disconnect() is changed to cleanup afterwards.
(The issue can be reproduced at least down to v4.4.x.)
--- net/ipv4/tcp.c | 3 +++ net/ipv4/tcp_cong.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-)
net/ipv4/tcp.c +3 -0
@@ -2631,6 +2631,9 @@ int tcp_disconnect(struct sock *sk, int tp->window_clamp =0 ; tp->delivered =0 ; tp->delivered_ce =0 ; +if (icsk->icsk_ca_ops->release) + icsk->icsk_ca_ops->release (sk); +memset (icsk->icsk_ca_priv,0 ,sizeof (icsk->icsk_ca_priv));tcp_set_ca_state (sk, TCP_CA_Open); tp->is_sack_reneg =0 ;tcp_clear_retrans (tp);
net/ipv4/tcp_cong.c +1 -1
@@ -197,7 +197,7 @@ static void tcp_reinit_congestion_contro icsk->icsk_ca_setsockopt =1 ;memset (icsk->icsk_ca_priv,0 ,sizeof (icsk->icsk_ca_priv)); -if (sk->sk_state !=TCP_CLOSE ) +if (!((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN )))tcp_init_congestion_control (sk); }
Greg Kroah-Hartman
maintainerPATCH 19/215 tcp: md5: add missing memory barriers in tcp_md5_do_add()/tcp_md5_hash_key()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 6a2febec338df7e7699a52d00b2e1207dcf65b28 ]
MD5 keys are read with RCU protection, and tcp_md5_do_add() might update in-place a prior key.
Normally, typical RCU updates would allocate a new piece of memory. In this case only key->key and key->keylen might be updated, and we do not care if an incoming packet could see the old key, the new one, or some intermediate value, since changing the key on a live flow is known to be problematic anyway.
We only want to make sure that in the case key->keylen is changed, cpus in tcp_md5_hash_key() wont try to use uninitialized data, or crash because key->keylen was read twice to feed sg_init_one() and ahash_request_set_crypt()
--- net/ipv4/tcp.c | 7 +++++-- net/ipv4/tcp_ipv4.c | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +5 -2
@@ -3847,10 +3847,13 @@ EXPORT_SYMBOL(tcp_md5_hash_skb_data);int tcp_md5_hash_key (struct tcp_md5sig_pool *hp,const struct tcp_md5sig_key *key) { +u8 keylen = key->keylen;struct scatterlist sg; -sg_init_one (&sg, key->key, key->keylen); -ahash_request_set_crypt (hp->md5_req, &sg,NULL , key->keylen); +smp_rmb ();/* paired with smp_wmb() in tcp_md5_do_add() */ + +sg_init_one (&sg, key->key, keylen); +ahash_request_set_crypt (hp->md5_req, &sg,NULL , keylen);return crypto_ahash_update (hp->md5_req); }EXPORT_SYMBOL (tcp_md5_hash_key);
net/ipv4/tcp_ipv4.c +3 -0
@@ -1079,6 +1079,9 @@ int tcp_md5_do_add(struct sock *sk, consif (key) {/* Pre-existing entry - just update that one. */ memcpy (key->key, newkey, newkeylen); + +smp_wmb ();/* pairs with smp_rmb() in tcp_md5_hash_key() */ + key->keylen = newkeylen;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 20/215 tcp: md5: do not send silly options in SYNCOOKIES
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit e114e1e8ac9d31f25b9dd873bab5d80c1fc482ca ]
Whenever cookie_init_timestamp() has been used to encode ECN,SACK,WSCALE options, we can not remove the TS option in the SYNACK.
Otherwise, tcp_synack_options() will still advertize options like WSCALE that we can not deduce later when receiving the packet from the client to complete 3WHS.
Note that modern linux TCP stacks wont use MD5+TS+SACK in a SYN packet, but we can not know for sure that all TCP stacks have the same logic.
Before the fix a tcpdump would exhibit this wrong exchange :
10:12:15.464591 IP C > S: Flags [S], seq 4202415601, win 65535, options [nop,nop,md5 valid,mss 1400,sackOK,TS val 456965269 ecr 0,nop,wscale 8], length 0 10:12:15.464602 IP S > C: Flags [S.], seq 253516766, ack 4202415602, win 65535, options [nop,nop,md5 valid,mss 1400,nop,nop,sackOK,nop,wscale 8], length 0 10:12:15.464611 IP C > S: Flags [.], ack 1, win 256, options [nop,nop,md5 valid], length 0
10:12:15.464678 IP C > S: Flags [P.], seq 1:13, ack 1, win 256, options [nop,nop,md5 valid], length 12
10:12:15.464685 IP S > C: Flags [.], ack 13, win 65535, options [nop,nop,md5 valid], length 0
After this patch the exchange looks saner :
11:59:59.882990 IP C > S: Flags [S], seq 517075944, win 65535, options [nop,nop,md5 valid,mss 1400,sackOK,TS val 1751508483 ecr 0,nop,wscale 8], length 0 11:59:59.883002 IP S > C: Flags [S.], seq 1902939253, ack 517075945, win 65535, options [nop,nop,md5 valid,mss 1400,sackOK,TS val 1751508479 ecr 1751508483,nop,wscale 8], length 0 11:59:59.883012 IP C > S: Flags [.], ack 1, win 256, options [nop,nop,md5 valid,nop,nop,TS val 1751508483 ecr 1751508479], length 0
11:59:59.883114 IP C > S: Flags [P.], seq 1:13, ack 1, win 256, options [nop,nop,md5 valid,nop,nop,TS val 1751508483 ecr 1751508479], length 12 11:59:59.883122 IP S > C: Flags [.], ack 13, win 256, options [nop,nop,md5 valid,nop,nop,TS val 1751508483 ecr 1751508483], length 0
11:59:59.883152 IP S > C: Flags [P.], seq 1:13, ack 13, win 256, options [nop,nop,md5 valid,nop,nop,TS val 1751508484 ecr 1751508483], length 12 11:59:59.883170 IP C > S: Flags [.], ack 13, win 256, options [nop,nop,md5 valid,nop,nop,TS val 1751508484 ecr 1751508484], length 0
Of course, no SACK block will ever be added later, but nothing should break. Technically, we could remove the 4 nops included in MD5+TS options, but again some stacks could break seeing not conventional alignment.
--- net/ipv4/tcp_output.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/ipv4/tcp_output.c +5 -3
@@ -662,7 +662,8 @@ static unsigned int tcp_synack_options(c unsigned int mss, struct sk_buff *skb, struct tcp_out_options *opts, const struct tcp_md5sig_key *md5, - struct tcp_fastopen_cookie *foc) + struct tcp_fastopen_cookie *foc, + enum tcp_synack_type synack_type) { struct inet_request_sock *ireq = inet_rsk(req);unsigned int remaining =MAX_TCP_OPTION_SPACE ;
@@ -677,7 +678,8 @@ static unsigned int tcp_synack_options(c* rather than TS in order to fit in better with old, * buggy kernels, but that was deemed to be unnecessary. */ - ireq->tstamp_ok &= !ireq->sack_ok; +if (synack_type !=TCP_SYNACK_COOKIE ) + ireq->tstamp_ok &= !ireq->sack_ok; }#endif
@@ -3326,7 +3328,7 @@ struct sk_buff *tcp_make_synack(const st#endif skb_set_hash (skb,tcp_rsk (req)->txhash,PKT_HASH_TYPE_L4 ); tcp_header_size =tcp_synack_options (sk, req, mss, skb, &opts, md5, - foc) +sizeof (*th); + foc, synack_type) +sizeof (*th);skb_push (skb, tcp_header_size);skb_reset_transport_header (skb);
Greg Kroah-Hartman
maintainerPATCH 21/215 vlan: consolidate VLAN parsing code and limit max parsing depth
In reply to Greg Kroah-HartmanFrom: "Toke H�iland-J�rgensen" <[email protected]>
[ Upstream commit 469aceddfa3ed16e17ee30533fae45e90f62efd8 ]
Toshiaki pointed out that we now have two very similar functions to extract the L3 protocol number in the presence of VLAN tags. And Daniel pointed out that the unbounded parsing loop makes it possible for maliciously crafted packets to loop through potentially hundreds of tags.
Fix both of these issues by consolidating the two parsing functions and limiting the VLAN tag parsing to a max depth of 8 tags. As part of this, switch over __vlan_get_protocol() to use skb_header_pointer() instead of pskb_may_pull(), to avoid the possible side effects of the latter and keep the skb pointer 'const' through all the parsing functions.
v2:
- Use limit of 8 tags instead of 32 (matching XMIT_RECURSION_LIMIT)
--- include/linux/if_vlan.h | 57 ++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 35 deletions(-)
include/linux/if_vlan.h +22 -35
@@ -25,6 +25,8 @@#define VLAN_ETH_DATA_LEN 1500/* Max. octets in payload */ #define VLAN_ETH_FRAME_LEN 1518/* Max. octets in frame sans FCS */ +#define VLAN_MAX_DEPTH 8/* Max. number of nested VLAN tags parsed */ +/* * struct vlan_hdr - vlan header * @h_vlan_TCI: priority and VLAN ID
@@ -308,34 +310,6 @@ static inline bool eth_type_vlan(__be16 } } -/* A getter for the SKB protocol field which will handle VLAN tags consistently -* whether VLAN acceleration is enabled or not. -*/ -static inline __be16 skb_protocol (const struct sk_buff *skb,bool skip_vlan) -{ -unsigned int offset =skb_mac_offset (skb) +sizeof (struct ethhdr ); -__be16 proto = skb->protocol; - -if (!skip_vlan) -/* VLAN acceleration strips the VLAN header from the skb and -* moves it to skb->vlan_proto -*/ -return skb_vlan_tag_present (skb) ? skb->vlan_proto : proto; - -while (eth_type_vlan (proto)) { -struct vlan_hdr vhdr, *vh; - - vh =skb_header_pointer (skb, offset,sizeof (vhdr), &vhdr); -if (!vh) -break ; - - proto = vh->h_vlan_encapsulated_proto; - offset +=sizeof (vhdr); - } - -return proto; -} -static inline bool vlan_hw_offload_capable (netdev_features_t features,__be16 proto) {
@@ -605,10 +579,10 @@ static inline int vlan_get_tag(const str* Returns the EtherType of the packet, regardless of whether it is * vlan encapsulated (normal or hardware accelerated) or not. */ -static inline __be16 __vlan_get_protocol (struct sk_buff *skb,__be16 type, +static inline __be16 __vlan_get_protocol (const struct sk_buff *skb,__be16 type,int *depth) { -unsigned int vlan_depth = skb->mac_len; +unsigned int vlan_depth = skb->mac_len, parse_depth =VLAN_MAX_DEPTH ;/* if type is 802.1Q/AD then the header should already be * present at mac_len - VLAN_HLEN (if mac_len > 0), or at
@@ -623,13 +597,12 @@ static inline __be16 __vlan_get_protocol vlan_depth =ETH_HLEN ; }do { -struct vlan_hdr *vh; +struct vlan_hdr vhdr, *vh; -if (unlikely (!pskb_may_pull (skb, - vlan_depth +VLAN_HLEN ))) + vh =skb_header_pointer (skb, vlan_depth,sizeof (vhdr), &vhdr); +if (unlikely (!vh || !--parse_depth))return 0 ; - vh = (struct vlan_hdr *)(skb->data + vlan_depth); type = vh->h_vlan_encapsulated_proto; vlan_depth +=VLAN_HLEN ; }while (eth_type_vlan (type));
@@ -648,11 +621,25 @@ static inline __be16 __vlan_get_protocol* Returns the EtherType of the packet, regardless of whether it is * vlan encapsulated (normal or hardware accelerated) or not. */ -static inline __be16 vlan_get_protocol (struct sk_buff *skb) +static inline __be16 vlan_get_protocol (const struct sk_buff *skb) {return __vlan_get_protocol (skb, skb->protocol,NULL ); } +/* A getter for the SKB protocol field which will handle VLAN tags consistently +* whether VLAN acceleration is enabled or not. +*/ +static inline __be16 skb_protocol (const struct sk_buff *skb,bool skip_vlan) +{ +if (!skip_vlan) +/* VLAN acceleration strips the VLAN header from the skb and +* moves it to skb->vlan_proto +*/ +return skb_vlan_tag_present (skb) ? skb->vlan_proto : skb->protocol; + +return vlan_get_protocol (skb); +} +static inline void vlan_set_encap_proto (struct sk_buff *skb,struct vlan_hdr *vhdr) {
Greg Kroah-Hartman
maintainerPATCH 22/215 tcp: md5: refine tcp_md5_do_add()/tcp_md5_hash_key() barriers
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit e6ced831ef11a2a06e8d00aad9d4fc05b610bf38 ]
My prior fix went a bit too far, according to Herbert and Mathieu.
Since we accept that concurrent TCP MD5 lookups might see inconsistent keys, we can use READ_ONCE()/WRITE_ONCE() instead of smp_rmb()/smp_wmb()
Clearing all key->key[] is needed to avoid possible KMSAN reports, if key->keylen is increased. Since tcp_md5_do_add() is not fast path, using __GFP_ZERO to clear all struct tcp_md5sig_key is simpler.
data_race() was added in linux-5.8 and will prevent KCSAN reports, this can safely be removed in stable backports, if data_race() is not yet backported.
v2: use data_race() both in tcp_md5_hash_key() and tcp_md5_do_add()
--- net/ipv4/tcp.c | 6 +++--- net/ipv4/tcp_ipv4.c | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-)
net/ipv4/tcp.c +3 -3
@@ -3847,13 +3847,13 @@ EXPORT_SYMBOL(tcp_md5_hash_skb_data);int tcp_md5_hash_key (struct tcp_md5sig_pool *hp,const struct tcp_md5sig_key *key) { -u8 keylen = key->keylen; +u8 keylen =READ_ONCE (key->keylen);/* paired with WRITE_ONCE() in tcp_md5_do_add */ struct scatterlist sg; -smp_rmb ();/* paired with smp_wmb() in tcp_md5_do_add() */ -sg_init_one (&sg, key->key, keylen);ahash_request_set_crypt (hp->md5_req, &sg,NULL , keylen); + +/* tcp_md5_do_add() might change key->key under us */ return crypto_ahash_update (hp->md5_req); }EXPORT_SYMBOL (tcp_md5_hash_key);
net/ipv4/tcp_ipv4.c +10 -4
@@ -1077,12 +1077,18 @@ int tcp_md5_do_add(struct sock *sk, cons key =tcp_md5_do_lookup_exact (sk, addr, family, prefixlen);if (key) { -/* Pre-existing entry - just update that one. */ +/* Pre-existing entry - just update that one. +* Note that the key might be used concurrently. +*/ memcpy (key->key, newkey, newkeylen); -smp_wmb ();/* pairs with smp_rmb() in tcp_md5_hash_key() */ +/* Pairs with READ_ONCE() in tcp_md5_hash_key(). +* Also note that a reader could catch new key->keylen value +* but old key->key[], this is the reason we use __GFP_ZERO +* at sock_kmalloc() time below these lines. +*/ +WRITE_ONCE (key->keylen, newkeylen); - key->keylen = newkeylen;return 0 ; }
@@ -1098,7 +1104,7 @@ int tcp_md5_do_add(struct sock *sk, consrcu_assign_pointer (tp->md5sig_info, md5sig); } - key =sock_kmalloc (sk,sizeof (*key), gfp); + key =sock_kmalloc (sk,sizeof (*key), gfp | __GFP_ZERO);if (!key)return -ENOMEM ;if (!tcp_alloc_md5sig_pool ()) {
Greg Kroah-Hartman
maintainerPATCH 23/215 tcp: md5: allow changing MD5 keys in all socket states
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 1ca0fafd73c5268e8fc4b997094b8bb2bfe8deea ]
This essentially reverts commit 721230326891 ("tcp: md5: reject TCP_MD5SIG or TCP_MD5SIG_EXT on established sockets")
Mathieu reported that many vendors BGP implementations can actually switch TCP MD5 on established flows.
Quoting Mathieu :
Here is a list of a few network vendors along with their behavior with respect to TCP MD5:
- Cisco: Allows for password to be changed, but within the hold-down
timer (~180 seconds).
- Juniper: When password is initially set on active connection it will reset, but after that any subsequent password changes no network resets.
- Nokia: No notes on if they flap the tcp connection or not.
- Ericsson/RedBack: Allows for 2 password (old/new) to co-exist until both sides are ok with new passwords.
- Meta-Switch: Expects the password to be set before a connection is attempted, but no further info on whether they reset the TCP connection on a change.
- Avaya: Disable the neighbor, then set password, then re-enable.
- Zebos: Would normally allow the change when socket connected.
We can revert my prior change because commit 9424e2e7ad93 ("tcp: md5: fix potential overestimation of TCP option space") removed the leak of 4 kernel bytes to the wire that was the main reason for my patch.
While doing my investigations, I found a bug when a MD5 key is changed, leading to these commits that stable teams want to consider before backporting this revert :
Commit 6a2febec338d ("tcp: md5: add missing memory barriers in tcp_md5_do_add()/tcp_md5_hash_key()") Commit e6ced831ef11 ("tcp: md5: refine tcp_md5_do_add()/tcp_md5_hash_key() barriers")
--- net/ipv4/tcp.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
net/ipv4/tcp.c +1 -4
@@ -3088,10 +3088,7 @@ static int do_tcp_setsockopt(struct sock#ifdef CONFIG_TCP_MD5SIG case TCP_MD5SIG :case TCP_MD5SIG_EXT : -if ((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN )) - err = tp->af_specific->md5_parse (sk, optname, optval, optlen); -else - err = -EINVAL ; + err = tp->af_specific->md5_parse (sk, optname, optval, optlen);break ;#endif case TCP_USER_TIMEOUT :
Greg Kroah-Hartman
maintainerPATCH 24/215 cgroup: fix cgroup_sk_alloc() for sk_clone_lock()
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit ad0f75e5f57ccbceec13274e1e242f2b5a6397ed ]
When we clone a socket in sk_clone_lock(), its sk_cgrp_data is copied, so the cgroup refcnt must be taken too. And, unlike the sk_alloc() path, sock_update_netprioidx() is not called here. Therefore, it is safe and necessary to grab the cgroup refcnt even when cgroup_sk_alloc is disabled.
sk_clone_lock() is in BH context anyway, the in_interrupt() would terminate this function if called there. And for sk_alloc() skcd->val is always zero. So it's safe to factor out the code to make it more readable.
The global variable 'cgroup_sk_alloc_disabled' is used to determine whether to take these reference counts. It is impossible to make the reference counting correct unless we save this bit of information in skcd->val. So, add a new bit there to record whether the socket has already taken the reference counts. This obviously relies on kmalloc() to align cgroup pointers to at least 4 bytes, ARCH_KMALLOC_MINALIGN is certainly larger than that.
This bug seems to be introduced since the beginning, commit d979a39d7242 ("cgroup: duplicate cgroup reference when cloning sockets") tried to fix it but not compeletely. It seems not easy to trigger until the recent commit 090e28b229af
("netprio_cgroup: Fix unlimited memory leak of v2 cgroups") was merged.
--- include/linux/cgroup-defs.h | 6 ++++-- include/linux/cgroup.h | 4 +++- kernel/cgroup/cgroup.c | 31 +++++++++++++++++++------------ net/core/sock.c | 2 +- 4 files changed, 27 insertions(+), 16 deletions(-)
include/linux/cgroup-defs.h +4 -2
@@ -797,7 +797,8 @@ struct sock_cgroup_data { union { #ifdef __LITTLE_ENDIAN struct { - u8 is_data; + u8 is_data : 1; + u8 no_refcnt : 1; u8 padding; u16 prioidx; u32 classid;
@@ -807,7 +808,8 @@ struct sock_cgroup_data {u32 classid;u16 prioidx;u8 padding; - u8 is_data; + u8 no_refcnt : 1; + u8 is_data : 1; } __packed;#endif u64 val;
include/linux/cgroup.h +3 -1
@@ -822,6 +822,7 @@ extern spinlock_t cgroup_sk_update_lock;void cgroup_sk_alloc_disable (void );void cgroup_sk_alloc (struct sock_cgroup_data *skcd); +void cgroup_sk_clone (struct sock_cgroup_data *skcd);void cgroup_sk_free (struct sock_cgroup_data *skcd);static inline struct cgroup *sock_cgroup_ptr (struct sock_cgroup_data *skcd)
@@ -835,7 +836,7 @@ static inline struct cgroup *sock_cgroup*/ v =READ_ONCE (skcd->val); -if (v &1 ) +if (v &3 )return &cgrp_dfl_root.cgrp;return (struct cgroup *)(unsigned long )v ?: &cgrp_dfl_root.cgrp;
@@ -847,6 +848,7 @@ static inline struct cgroup *sock_cgroup#else /* CONFIG_CGROUP_DATA */ static inline void cgroup_sk_alloc (struct sock_cgroup_data *skcd) {} +static inline void cgroup_sk_clone (struct sock_cgroup_data *skcd) {}static inline void cgroup_sk_free (struct sock_cgroup_data *skcd) {}#endif /* CONFIG_CGROUP_DATA */
kernel/cgroup/cgroup.c +19 -12
@@ -6379,18 +6379,8 @@ void cgroup_sk_alloc_disable(void)void cgroup_sk_alloc (struct sock_cgroup_data *skcd) { -if (cgroup_sk_alloc_disabled) -return ; - -/* Socket clone path */ -if (skcd->val) { -/* -* We might be cloning a socket which is left in an empty -* cgroup and the cgroup might have already been rmdir'd. -* Don't use cgroup_get_live(). -*/ -cgroup_get (sock_cgroup_ptr (skcd)); -cgroup_bpf_get (sock_cgroup_ptr (skcd)); +if (cgroup_sk_alloc_disabled) { + skcd->no_refcnt =1 ;return ; }
@@ -6415,10 +6405,27 @@ void cgroup_sk_alloc(struct sock_cgroup_rcu_read_unlock (); } +void cgroup_sk_clone (struct sock_cgroup_data *skcd) +{ +if (skcd->val) { +if (skcd->no_refcnt) +return ; +/* +* We might be cloning a socket which is left in an empty +* cgroup and the cgroup might have already been rmdir'd. +* Don't use cgroup_get_live(). +*/ +cgroup_get (sock_cgroup_ptr (skcd)); +cgroup_bpf_get (sock_cgroup_ptr (skcd)); + } +} +void cgroup_sk_free (struct sock_cgroup_data *skcd) {struct cgroup *cgrp =sock_cgroup_ptr (skcd); +if (skcd->no_refcnt) +return ;cgroup_bpf_put (cgrp);cgroup_put (cgrp); }
net/core/sock.c +1 -1
@@ -1837,7 +1837,7 @@ struct sock *sk_clone_lock(const struct/* sk->sk_memcg will be populated at accept() time */ newsk->sk_memcg =NULL ; -cgroup_sk_alloc (&newsk->sk_cgrp_data); +cgroup_sk_clone (&newsk->sk_cgrp_data);rcu_read_lock (); filter =rcu_dereference (sk->sk_filter);
Greg Kroah-Hartman
maintainerPATCH 25/215 cgroup: Fix sock_cgroup_data on big-endian.
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit 14b032b8f8fce03a546dcf365454bec8c4a58d7d ]
In order for no_refcnt and is_data to be the lowest order two bits in the 'val' we have to pad out the bitfield of the u8.
--- include/linux/cgroup-defs.h | 2 ++ 1 file changed, 2 insertions(+)
include/linux/cgroup-defs.h +2 -0
@@ -799,6 +799,7 @@ struct sock_cgroup_data {struct {u8 is_data :1 ;u8 no_refcnt :1 ; +u8 unused :6 ;u8 padding;u16 prioidx;u32 classid;
@@ -808,6 +809,7 @@ struct sock_cgroup_data {u32 classid;u16 prioidx;u8 padding; + u8 unused : 6; u8 no_refcnt : 1; u8 is_data : 1; } __packed;
Greg Kroah-Hartman
maintainerPATCH 26/215 ip: Fix SO_MARK in RST, ACK and ICMP packets
In reply to Greg Kroah-HartmanFrom: Willem de Bruijn <[email protected]>
[ Upstream commit 0da7536fb47f51df89ccfcb1fa09f249d9accec5 ]
When no full socket is available, skbs are sent over a per-netns control socket. Its sk_mark is temporarily adjusted to match that of the real (request or timewait) socket or to reflect an incoming skb, so that the outgoing skb inherits this in __ip_make_skb.
Introduction of the socket cookie mark field broke this. Now the skb is set through the cookie and cork:
<caller> # init sockc.mark from sk_mark or cmsgip_append_data
ip_setup_cork # convert sockc.mark to cork markip_push_pending_frames
ip_finish_skb
__ip_make_skb # set skb->mark to cork mark
But I missed these special control sockets. Update all callers of __ip(6)_make_skb that were originally missed.
For IPv6, the same two icmp(v6) paths are affected. The third case is not, as commit 92e55f412cff ("tcp: don't annotate mark on control socket from tcp_v6_send_response()") replaced the ctl_sk->sk_mark with passing the mark field directly as a function argument. That commit predates the commit that introduced the bug.
--- net/ipv4/icmp.c | 4 ++-- net/ipv4/ip_output.c | 2 +- net/ipv6/icmp.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-)
net/ipv4/icmp.c +2 -2
@@ -427,7 +427,7 @@ static void icmp_reply(struct icmp_bxm *ipcm_init (&ipc); inet->tos =ip_hdr (skb)->tos; - sk->sk_mark = mark; + ipc.sockc.mark = mark; daddr = ipc.addr =ip_hdr (skb)->saddr; saddr =fib_compute_spec_dst (skb);
@@ -709,10 +709,10 @@ void __icmp_send(struct sk_buff *skb_in, icmp_param.skb = skb_in; icmp_param.offset =skb_network_offset (skb_in);inet_sk (sk)->tos = tos; - sk->sk_mark = mark;ipcm_init (&ipc); ipc.addr = iph->saddr; ipc.opt = &icmp_param.replyopts.opt; + ipc.sockc.mark = mark; rt =icmp_route_lookup (net, &fl4, skb_in, iph, saddr, tos, mark, type, code, &icmp_param);
net/ipv4/ip_output.c +1 -1
@@ -1704,7 +1704,7 @@ void ip_send_unicast_reply(struct sock * sk->sk_protocol =ip_hdr (skb)->protocol; sk->sk_bound_dev_if = arg->bound_dev_if; sk->sk_sndbuf = sysctl_wmem_default; - sk->sk_mark = fl4.flowi4_mark; + ipc.sockc.mark = fl4.flowi4_mark; err =ip_append_data (sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, len,0 , &ipc, &rt,MSG_DONTWAIT );if (unlikely (err)) {
net/ipv6/icmp.c +2 -2
@@ -535,7 +535,6 @@ static void icmp6_send(struct sk_buff *sif (!sk) goto out_bh_enable; - sk->sk_mark = mark; np =inet6_sk (sk);if (!icmpv6_xrlim_allow (sk, type, &fl6))
@@ -552,6 +551,7 @@ static void icmp6_send(struct sk_buff *s fl6.flowi6_oif = np->ucast_oif;ipcm6_init_sk (&ipc6, np); + ipc6.sockc.mark = mark; fl6.flowlabel =ip6_make_flowinfo (ipc6.tclass, fl6.flowlabel); dst =icmpv6_route_lookup (net, skb, sk, &fl6);
@@ -720,7 +720,6 @@ static void icmpv6_echo_reply(struct sk_ sk =icmpv6_xmit_lock (net);if (!sk) goto out_bh_enable; - sk->sk_mark = mark; np =inet6_sk (sk);if (!fl6.flowi6_oif &&ipv6_addr_is_multicast (&fl6.daddr))
@@ -748,6 +747,7 @@ static void icmpv6_echo_reply(struct sk_ipcm6_init_sk (&ipc6, np); ipc6.hlimit =ip6_sk_dst_hoplimit (np, &fl6, dst); ipc6.tclass =ipv6_get_dsfield (ipv6_hdr (skb)); + ipc6.sockc.mark = mark; if (ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr),
Greg Kroah-Hartman
maintainerPATCH 27/215 arm64: Introduce a way to disable the 32bit vdso
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit 97884ca8c2925d14c32188e865069f21378b4b4f upstream.
[this is a redesign rather than a backport]
We have a class of errata (grouped under the ARM64_WORKAROUND_1418040 banner) that force the trapping of counter access from 32bit EL0.
We would normally disable the whole vdso for such defect, except that it would disable it for 64bit userspace as well, which is a shame.
Instead, add a new vdso_clock_mode, which signals that the vdso isn't usable for compat tasks. This gets checked in the new vdso_clocksource_ok() helper, now provided for the 32bit vdso.
--- arch/arm/include/asm/clocksource.h | 11 ++++++++++- arch/arm/kernel/vdso.c | 2 +- arch/arm64/include/asm/clocksource.h | 5 ++++- arch/arm64/include/asm/vdso/clocksource.h | 14 ++++++++++++++ arch/arm64/include/asm/vdso/compat_gettimeofday.h | 5 +++-- arch/arm64/include/asm/vdso/gettimeofday.h | 6 ++++-- arch/arm64/include/asm/vdso/vsyscall.h | 4 +--- drivers/clocksource/arm_arch_timer.c | 8 ++++---- 8 files changed, 41 insertions(+), 14 deletions(-)
arch/arm/include/asm/clocksource.h +10 -1
@@ -1,8 +1,17 @@#ifndef _ASM_CLOCKSOURCE_H#define _ASM_CLOCKSOURCE_H +enum vdso_arch_clockmode { +/* vdso clocksource not usable */ +VDSO_CLOCKMODE_NONE , +/* vdso clocksource usable */ +VDSO_CLOCKMODE_ARCHTIMER , +VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT =VDSO_CLOCKMODE_ARCHTIMER , +}; +struct arch_clocksource_data { -bool vdso_direct;/* Usable for direct VDSO access? */ +/* Usable for direct VDSO access? */ +enum vdso_arch_clockmode clock_mode; };#endif
arch/arm/kernel/vdso.c +1 -1
@@ -281,7 +281,7 @@ static bool tk_is_cntvct(const struct tiif (!IS_ENABLED (CONFIG_ARM_ARCH_TIMER ))return false; -if (!tk->tkr_mono.clock->archdata.vdso_direct) +if (tk->tkr_mono.clock->archdata.clock_mode !=VDSO_CLOCKMODE_ARCHTIMER )return false;return true;
arch/arm64/include/asm/clocksource.h +4 -1
@@ -2,8 +2,11 @@#ifndef _ASM_CLOCKSOURCE_H#define _ASM_CLOCKSOURCE_H +#include <asm/vdso/clocksource.h> +struct arch_clocksource_data { -bool vdso_direct;/* Usable for direct VDSO access? */ +/* Usable for direct VDSO access? */ +enum vdso_arch_clockmode clock_mode; };#endif
arch/arm64/include/asm/vdso/clocksource.h new file +14 -0
@@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ASM_VDSOCLOCKSOURCE_H +#define __ASM_VDSOCLOCKSOURCE_H + +enum vdso_arch_clockmode { +/* vdso clocksource not usable */ +VDSO_CLOCKMODE_NONE , +/* vdso clocksource for both 32 and 64bit tasks */ +VDSO_CLOCKMODE_ARCHTIMER , +/* vdso clocksource for 64bit tasks only */ +VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT , +}; + +#endif
arch/arm64/include/asm/vdso/compat_gettimeofday.h +3 -2
@@ -10,6 +10,7 @@#include <asm/unistd.h> #include <uapi/linux/time.h> +#include <asm/vdso/clocksource.h> #include <asm/vdso/compat_barrier.h> #define __VDSO_USE_SYSCALL ULLONG_MAX
@@ -117,10 +118,10 @@ static __always_inline u64 __arch_get_hwu64 res;/* -* clock_mode == 0 implies that vDSO are enabled otherwise +* clock_mode == ARCHTIMER implies that vDSO are enabled otherwise * fallback on syscall. */ -if (clock_mode) +if (clock_mode !=VDSO_CLOCKMODE_ARCHTIMER )return __VDSO_USE_SYSCALL;/*
arch/arm64/include/asm/vdso/gettimeofday.h +4 -2
@@ -10,6 +10,8 @@#include <asm/unistd.h> #include <uapi/linux/time.h> +#include <asm/vdso/clocksource.h> +#define __VDSO_USE_SYSCALL ULLONG_MAX#define VDSO_HAS_CLOCK_GETRES 1
@@ -71,10 +73,10 @@ static __always_inline u64 __arch_get_hwu64 res;/* -* clock_mode == 0 implies that vDSO are enabled otherwise +* clock_mode != NONE implies that vDSO are enabled otherwise * fallback on syscall. */ -if (clock_mode) +if (clock_mode ==VDSO_CLOCKMODE_NONE )return __VDSO_USE_SYSCALL;/*
arch/arm64/include/asm/vdso/vsyscall.h +1 -3
@@ -24,9 +24,7 @@ struct vdso_data *__arm64_get_k_vdso_datstatic __always_inline int __arm64_get_clock_mode(struct timekeeper *tk) { -u32 use_syscall = !tk->tkr_mono.clock->archdata.vdso_direct; - -return use_syscall; +return tk->tkr_mono.clock->archdata.clock_mode; }#define __arch_get_clock_mode __arm64_get_clock_mode
drivers/clocksource/arm_arch_timer.c +4 -4
@@ -69,7 +69,7 @@ static enum arch_timer_ppi_nr arch_timerstatic bool arch_timer_c3stop;static bool arch_timer_mem_use_virtual;static bool arch_counter_suspend_stop; -static bool vdso_default = true; +static enum vdso_arch_clockmode vdso_default =VDSO_CLOCKMODE_ARCHTIMER ;static cpumask_t evtstrm_available =CPU_MASK_NONE ;static bool evtstrm_enable =IS_ENABLED (CONFIG_ARM_ARCH_TIMER_EVTSTREAM );
@@ -560,8 +560,8 @@ void arch_timer_enable_workaround(const* change both the default value and the vdso itself. */ if (wa->read_cntvct_el0) { - clocksource_counter.archdata.vdso_direct = false; - vdso_default = false; + clocksource_counter.archdata.clock_mode =VDSO_CLOCKMODE_NONE ; + vdso_default =VDSO_CLOCKMODE_NONE ; } }
@@ -979,7 +979,7 @@ static void __init arch_counter_register } arch_timer_read_counter = rd; - clocksource_counter.archdata.vdso_direct = vdso_default; + clocksource_counter.archdata.clock_mode = vdso_default; }else { arch_timer_read_counter = arch_counter_get_cntvct_mem; }
Greg Kroah-Hartman
maintainerPATCH 28/215 arm64: arch_timer: Allow an workaround descriptor to disable compat vdso
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit c1fbec4ac0d701f350a581941d35643d5a9cd184 upstream.
As we are about to disable the vdso for compat tasks in some circumstances, let's allow a workaround descriptor to express exactly that.
--- arch/arm64/include/asm/arch_timer.h | 1 + drivers/clocksource/arm_arch_timer.c | 3 +++ 2 files changed, 4 insertions(+)
arch/arm64/include/asm/arch_timer.h +1 -0
@@ -58,6 +58,7 @@ struct arch_timer_erratum_workaround {u64 (*read_cntvct_el0)(void);int (*set_next_event_phys)(unsigned long ,struct clock_event_device *);int (*set_next_event_virt)(unsigned long ,struct clock_event_device *); +bool disable_compat_vdso; }; DECLARE_PER_CPU(const struct arch_timer_erratum_workaround *,
drivers/clocksource/arm_arch_timer.c +3 -0
@@ -562,6 +562,9 @@ void arch_timer_enable_workaround(constif (wa->read_cntvct_el0) { clocksource_counter.archdata.clock_mode =VDSO_CLOCKMODE_NONE ; vdso_default =VDSO_CLOCKMODE_NONE ; + }else if (wa->disable_compat_vdso && vdso_default !=VDSO_CLOCKMODE_NONE ) { + vdso_default =VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT ; + clocksource_counter.archdata.clock_mode = vdso_default; } }
Greg Kroah-Hartman
maintainerPATCH 29/215 arm64: arch_timer: Disable the compat vdso for cores affected by ARM64_WORKAROUND_1418040
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit 4b661d6133c5d3a7c9aca0b4ee5a78c7766eff3f upstream.
ARM64_WORKAROUND_1418040 requires that AArch32 EL0 accesses to the virtual counter register are trapped and emulated by the kernel. This makes the vdso pretty pointless, and in some cases livelock prone.
Provide a workaround entry that limits the vdso to 64bit tasks.
--- drivers/clocksource/arm_arch_timer.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/clocksource/arm_arch_timer.c +8 -0
@@ -476,6 +476,14 @@ static const struct arch_timer_erratum_w .set_next_event_virt = erratum_set_next_event_tval_virt, },#endif +#ifdef CONFIG_ARM64_ERRATUM_1418040 + { + .match_type = ate_match_local_cap_id, + .id = (void *)ARM64_WORKAROUND_1418040, + .desc = "ARM erratum 1418040", + .disable_compat_vdso = true, + }, +#endif }; typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *,
Greg Kroah-Hartman
maintainerPATCH 30/215 drm/msm: fix potential memleak in error branch
In reply to Greg Kroah-HartmanFrom: Bernard Zhao <[email protected]>
[ Upstream commit 177d3819633cd520e3f95df541a04644aab4c657 ]
In function msm_submitqueue_create, the queue is a local variable, in return -EINVAL branch, queue didnt add to ctxs list yet, and also didn`t kfree, this maybe bring in potential memleak.
--- drivers/gpu/drm/msm/msm_submitqueue.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_submitqueue.c +3 -1
@@ -71,8 +71,10 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx, queue->flags = flags;if (priv->gpu) { -if (prio >= priv->gpu->nr_rings) +if (prio >= priv->gpu->nr_rings) { +kfree (queue);return -EINVAL ; + } queue->prio = prio; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 31/215 drm/msm/dpu: allow initialization of encoder locks during encoder init
In reply to Greg Kroah-HartmanFrom: Krishna Manikandan <[email protected]>
[ Upstream commit 2e7ec6b5297157efabb50e5f82adc628cf90296c ]
In the current implementation, mutex initialization for encoder mutex locks are done during encoder setup. This can lead to scenarios where the lock is used before it is initialized. Move mutex_init to dpu_encoder_init to avoid this.
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +2 -2
@@ -2185,7 +2185,6 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc, dpu_enc =to_dpu_encoder_virt (enc); -mutex_init (&dpu_enc->enc_lock); ret =dpu_encoder_setup_display (dpu_enc, dpu_kms, disp_info);if (ret) goto fail;
@@ -2200,7 +2199,6 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc, 0); -mutex_init (&dpu_enc->rc_lock);INIT_DELAYED_WORK (&dpu_enc->delayed_off_work, dpu_encoder_off_work); dpu_enc->idle_timeout =IDLE_TIMEOUT ;
@@ -2245,6 +2243,8 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,spin_lock_init (&dpu_enc->enc_spinlock); dpu_enc->enabled = false; +mutex_init (&dpu_enc->enc_lock); +mutex_init (&dpu_enc->rc_lock);return &dpu_enc->base; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 32/215 drm/exynos: Properly propagate return value in drm_iommu_attach_device()
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit b9c633882de4601015625f9136f248e9abca8a7a ]
Propagate the proper error codes from the called functions instead of unconditionally returning 0.
Merge conflict so merged it manually.
--- drivers/gpu/drm/exynos/exynos_drm_dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/exynos/exynos_drm_dma.c +2 -2
@@ -61,7 +61,7 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev, struct device *subdrv_dev, void **dma_priv) { struct exynos_drm_private *priv = drm_dev->dev_private; -int ret; +int ret =0 ;if (get_dma_ops (priv->dma_dev) !=get_dma_ops (subdrv_dev)) { DRM_DEV_ERROR(subdrv_dev, "Device %s lacks support for IOMMU\n",
@@ -92,7 +92,7 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev,if (ret)clear_dma_max_seg_size (subdrv_dev); -return 0 ; +return ret; }/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 33/215 drm/exynos: fix ref count leak in mic_pre_enable
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit d4f5a095daf0d25f0b385e1ef26338608433a4c5 ]
in mic_pre_enable, pm_runtime_get_sync is called which increments the counter even in case of failure, leading to incorrect ref count. In case of failure, decrement the ref count before returning.
--- drivers/gpu/drm/exynos/exynos_drm_mic.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/exynos/exynos_drm_mic.c +3 -1
@@ -268,8 +268,10 @@ static void mic_pre_enable(struct drm_bridge *bridge) goto unlock; ret =pm_runtime_get_sync (mic->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put_noidle (mic->dev); goto unlock; + }mic_set_path (mic,1 );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 34/215 x86/fpu: Reset MXCSR to default in kernel_fpu_begin()
In reply to Greg Kroah-HartmanFrom: Petteri Aimonen <[email protected]>
[ Upstream commit 7ad816762f9bf89e940e618ea40c43138b479e10 ]
Previously, kernel floating point code would run with the MXCSR control register value last set by userland code by the thread that was active on the CPU core just before kernel call. This could affect calculation results if rounding mode was changed, or a crash if a FPU/SIMD exception was unmasked.
Restore MXCSR to the kernel's default value.
[ bp: Carve out from a bigger patch by Petteri, add feature check, add
FNINIT call too (amluto). ]
--- arch/x86/include/asm/fpu/internal.h | 5 +++++ arch/x86/kernel/fpu/core.c | 6 ++++++ 2 files changed, 11 insertions(+)
arch/x86/include/asm/fpu/internal.h +5 -0
@@ -619,6 +619,11 @@ static inline void switch_fpu_finish(struct fpu *new_fpu)* MXCSR and XCR definitions: */ +static inline void ldmxcsr (u32 mxcsr) +{ + asmvolatile ("ldmxcsr %0" ::"m" (mxcsr)); +} +extern unsigned int mxcsr_feature_mask;#define XCR_XFEATURE_ENABLED_MASK 0x00000000
arch/x86/kernel/fpu/core.c +6 -0
@@ -101,6 +101,12 @@ void kernel_fpu_begin(void)copy_fpregs_to_fpstate (¤t->thread.fpu); }__cpu_invalidate_fpregs_state (); + +if (boot_cpu_has (X86_FEATURE_XMM )) +ldmxcsr (MXCSR_DEFAULT ); + +if (boot_cpu_has (X86_FEATURE_FPU )) + asmvolatile ("fninit" ); }EXPORT_SYMBOL_GPL (kernel_fpu_begin);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 35/215 thermal/drivers: imx: Fix missing of_node_put() at probe time
In reply to Greg Kroah-HartmanFrom: Anson Huang <[email protected]>
[ Upstream commit b45fd13be340e4ed0a2a9673ba299eb2a71ba829 ]
After finishing using cpu node got from of_get_cpu_node(), of_node_put() needs to be called.
--- drivers/thermal/imx_thermal.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/thermal/imx_thermal.c +4 -3
@@ -656,7 +656,7 @@ MODULE_DEVICE_TABLE(of, of_imx_thermal_match);static int imx_thermal_register_legacy_cooling (struct imx_thermal_data *data) {struct device_node *np; -int ret; +int ret =0 ; data->policy =cpufreq_cpu_get (0 );if (!data->policy) {
@@ -671,11 +671,12 @@ static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)if (IS_ERR (data->cdev)) { ret =PTR_ERR (data->cdev);cpufreq_cpu_put (data->policy); -return ret; } } -return 0 ; +of_node_put (np); + +return ret; }static void imx_thermal_unregister_legacy_cooling (struct imx_thermal_data *data)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 36/215 blk-mq-debugfs: update blk_queue_flag_name[] accordingly for new flags
In reply to Greg Kroah-HartmanFrom: Hou Tao <[email protected]>
[ Upstream commit bfe373f608cf81b7626dfeb904001b0e867c5110 ]
Else there may be magic numbers in /sys/kernel/debug/block/*/state.
--- block/blk-mq-debugfs.c | 3 +++ include/linux/blkdev.h | 1 + 2 files changed, 4 insertions(+)
block/blk-mq-debugfs.c +3 -0
@@ -125,6 +125,9 @@ static const char *const blk_queue_flag_name[] = {QUEUE_FLAG_NAME (REGISTERED ),QUEUE_FLAG_NAME (SCSI_PASSTHROUGH ),QUEUE_FLAG_NAME (QUIESCED ), +QUEUE_FLAG_NAME (PCI_P2PDMA ), +QUEUE_FLAG_NAME (ZONE_RESETALL ), + QUEUE_FLAG_NAME(RQ_ALLOC_TIME), };#undef QUEUE_FLAG_NAME
include/linux/blkdev.h +1 -0
@@ -592,6 +592,7 @@ struct request_queue {u64 write_hints[BLK_MAX_WRITE_HINTS ]; }; +/* Keep blk_queue_flag_name[] in sync with the definitions below */ #define QUEUE_FLAG_STOPPED 0/* queue is stopped */ #define QUEUE_FLAG_DYING 1/* queue being torn down */ #define QUEUE_FLAG_NOMERGES 3/* disable merge attempts */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 37/215 m68k: nommu: register start of the memory with memblock
In reply to Greg Kroah-HartmanFrom: Mike Rapoport <[email protected]>
[ Upstream commit d63bd8c81d8ab64db506ffde569cc8ff197516e2 ]
The m68k nommu setup code didn't register the beginning of the physical memory with memblock because it was anyway occupied by the kernel. However, commit fa3354e4ea39 ("mm: free_area_init: use maximal zone PFNs rather than zone sizes") changed zones initialization to use memblock.memory to detect the zone extents and this caused inconsistency between zone PFNs and the actual PFNs:
BUG: Bad page state in process swapper pfn:20165
page:41fe0ca0 refcount:0 mapcount:1 mapping:00000000 index:0x0 flags: 0x0()
raw: 00000000 00000100 00000122 00000000 00000000 00000000 00000000 00000000
page dumped because: nonzero mapcount
CPU: 0 PID: 1 Comm: swapper Not tainted 5.8.0-rc1-00001-g3a38f8a60c65-dirty #1
Stack from 404c9ebc:
404c9ebc 4029ab28 4029ab28 40088470 41fe0ca0 40299e21 40299df1 404ba2a4
00020165 00000000 41fd2c10 402c7ba0 41fd2c04 40088504 41fe0ca0 40299e21
00000000 40088a12 41fe0ca0 41fe0ca4 0000020a 00000000 00000001 402ca000
00000000 41fe0ca0 41fd2c10 41fd2c10 00000000 00000000 402b2388 00000001
400a0934 40091056 404c9f44 404c9f44 40088db4 402c7ba0 00000001 41fd2c04
41fe0ca0 41fd2000 41fe0ca0 40089e02 4026ecf4 40089e4e 41fe0ca0 ffffffff
Call Trace:
[<40088470>] 0x40088470
[<40088504>] 0x40088504
[<40088a12>] 0x40088a12
[<402ca000>] 0x402ca000
[<400a0934>] 0x400a0934Adjust the memory registration with memblock to include the beginning of the physical memory and make sure that the area occupied by the kernel is marked as reserved.
--- arch/m68k/kernel/setup_no.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/m68k/kernel/setup_no.c +2 -1
@@ -139,7 +139,8 @@ void __init setup_arch(char **cmdline_p)pr_debug ("MEMORY -> ROMFS=0x%p-0x%06lx MEM=0x%06lx-0x%06lx\n " , __bss_stop, memory_start, memory_start, memory_end); -memblock_add (memory_start, memory_end - memory_start); +memblock_add (_rambase, memory_end - _rambase); +memblock_reserve (_rambase, memory_start - _rambase);/* Keep a copy of command line */ *cmdline_p = &command_line[0 ];
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 38/215 m68k: mm: fix node memblock init
In reply to Greg Kroah-HartmanFrom: Angelo Dureghello <[email protected]>
[ Upstream commit c43e55796dd4d13f4855971a4d7970ce2cd94db4 ]
After pulling 5.7.0 (linux-next merge), mcf5441x mmu boot was hanging silently.
memblock_add() seems not appropriate, since using MAX_NUMNODES as node id, while memblock_add_node() sets up memory for node id 0.
--- arch/m68k/mm/mcfmmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/m68k/mm/mcfmmu.c +1 -1
@@ -164,7 +164,7 @@ void __init cf_bootmem_alloc(void) m68k_memory[0 ].addr = _rambase; m68k_memory[0 ].size = _ramend - _rambase; -memblock_add (m68k_memory[0 ].addr, m68k_memory[0 ].size); +memblock_add_node (m68k_memory[0 ].addr, m68k_memory[0 ].size,0 );/* compute total pages in system */ num_pages =PFN_DOWN (_ramend - _rambase);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 39/215 dt-bindings: mailbox: zynqmp_ipi: fix unit address
In reply to Greg Kroah-HartmanFrom: Kangmin Park <[email protected]>
[ Upstream commit 35b9c0fdb9f666628ecda02b1fc44306933a2d97 ]
Fix unit address to match the first address specified in the reg property of the node in example.
--- .../devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt +1 -1
@@ -87,7 +87,7 @@ Example: ranges; /* APU<->RPU0 IPI mailbox controller */ - ipi_mailbox_rpu0: mailbox@ff90400 { + ipi_mailbox_rpu0: mailbox@ff990400 { reg = <0xff990400 0x20>, <0xff990420 0x20>, <0xff990080 0x20>,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 40/215 cifs: prevent truncation from long to int in wait_for_free_credits
In reply to Greg Kroah-HartmanFrom: Ronnie Sahlberg <[email protected]>
[ Upstream commit 19e888678bac8c82206eb915eaf72741b2a2615c ]
The wait_event_... defines evaluate to long so we should not assign it an int as this may truncate the value.
--- fs/cifs/transport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/cifs/transport.c +1 -1
@@ -528,7 +528,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits, const int timeout, const int flags, unsigned int *instance) { - int rc; + long rc;int *credits;int optype;long int t;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 41/215 arm64/alternatives: use subsections for replacement sequences
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
[ Upstream commit f7b93d42945cc71e1346dd5ae07c59061d56745e ]
When building very large kernels, the logic that emits replacement sequences for alternatives fails when relative branches are present in the code that is emitted into the .altinstr_replacement section and patched in at the original site and fixed up. The reason is that the linker will insert veneers if relative branches go out of range, and due to the relative distance of the .altinstr_replacement from the .text section where its branch targets usually live, veneers may be emitted at the end of the .altinstr_replacement section, with the relative branches in the sequence pointed at the veneers instead of the actual target.
The alternatives patching logic will attempt to fix up the branch to point to its original target, which will be the veneer in this case, but given that the patch site is likely to be far away as well, it will be out of range and so patching will fail. There are other cases where these veneers are problematic, e.g., when the target of the branch is in .text while the patch site is in .init.text, in which case putting the replacement sequence inside .text may not help either.
So let's use subsections to emit the replacement code as closely as possible to the patch site, to ensure that veneers are only likely to be emitted if they are required at the patch site as well, in which case they will be in range for the replacement sequence both before and after it is transported to the patch site.
This will prevent alternative sequences in non-init code from being released from memory after boot, but this is tolerable given that the entire section is only 512 KB on an allyesconfig build (which weighs in at 500+ MB for the entire Image). Also, note that modules today carry the replacement sequences in non-init sections as well, and any of those that target init code will be emitted into init sections after this change.
This fixes an early crash when booting an allyesconfig kernel on a system where any of the alternatives sequences containing relative branches are activated at boot (e.g., ARM64_HAS_PAN on TX2)
--- arch/arm64/include/asm/alternative.h | 16 ++++++++-------- arch/arm64/kernel/vmlinux.lds.S | 3 --- 2 files changed, 8 insertions(+), 11 deletions(-)
arch/arm64/include/asm/alternative.h +8 -8
@@ -73,11 +73,11 @@ static inline void apply_alternatives_module(void *start, size_t length) { }".pushsection .altinstructions,\"a\"\n" \ ALTINSTR_ENTRY(feature) \".popsection\n" \ -".pushsection .altinstr_replacement, \"a\"\n" \ +".subsection 1\n" \"663:\n\t" \ newinstr"\n" \"664:\n\t" \ -".popsection\n\t" \ +".previous\n\t" \".org . - (664b-663b) + (662b-661b)\n\t" \".org . - (662b-661b) + (664b-663b)\n" \".endif\n"
@@ -117,9 +117,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { } 662: .pushsection .altinstructions, "a" altinstruction_entry 661b, 663f, \cap, 662b-661b, 664f-663f .popsection - .pushsection .altinstr_replacement,"ax" + .subsection 1 663: \insn2 -664: .popsection +664: .previous .org . - (664b-663b) + (662b-661b) .org . - (662b-661b) + (664b-663b) .endif
@@ -160,7 +160,7 @@ static inline void apply_alternatives_module(void *start, size_t length) { } .pushsection .altinstructions, "a" altinstruction_entry 663f, 661f, \cap, 664f-663f, 662f-661f .popsection - .pushsection .altinstr_replacement, "ax" + .subsection 1 .align 2 /* So GAS knows label 661 is suitably aligned */ 661: .endm
@@ -179,9 +179,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { } .macro alternative_else 662: .if .Lasm_alt_mode==0 - .pushsection .altinstr_replacement,"ax" + .subsection 1 .else - .popsection + .previous .endif 663: .endm
@@ -192,7 +192,7 @@ static inline void apply_alternatives_module(void *start, size_t length) { } .macro alternative_endif 664: .if .Lasm_alt_mode==0 - .popsection + .previous .endif .org . - (664b-663b) + (662b-661b) .org . - (662b-661b) + (664b-663b)
arch/arm64/kernel/vmlinux.lds.S +0 -3
@@ -172,9 +172,6 @@ SECTIONS *(.altinstructions) __alt_instructions_end = .; } - .altinstr_replacement : { - *(.altinstr_replacement) - } . = ALIGN(PAGE_SIZE); __inittext_end = .;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 42/215 tpm_tis: extra chip->ops check on error path in tpm_tis_core_init
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit ccf6fb858e17a8f8a914a1c6444d277cfedfeae6 ]
Found by smatch:drivers/char/tpm/tpm_tis_core.c:1088 tpm_tis_core_init() warn:
variable dereferenced before check 'chip->ops' (see line 979)
'chip->ops' is assigned in the beginning of function in tpmm_chip_alloc->tpm_chip_alloc
and is used before first possible goto to error path.
--- drivers/char/tpm/tpm_tis_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/tpm/tpm_tis_core.c +1 -1
@@ -1006,7 +1006,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,return 0 ; out_err: -if ((chip->ops !=NULL ) && (chip->ops->clk_enable !=NULL )) +if (chip->ops->clk_enable !=NULL ) chip->ops->clk_enable (chip, false);tpm_tis_remove (chip);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 43/215 gfs2: read-only mounts should grab the sd_freeze_gl glock
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit b780cc615ba4795a7ef0e93b19424828a5ad456a ]
Before this patch, only read-write mounts would grab the freeze glock in read-only mode, as part of gfs2_make_fs_rw. So the freeze glock was never initialized. That meant requests to freeze, which request the glock in EX, were granted without any state transition. That meant you could mount a gfs2 file system, which is currently frozen on a different cluster node, in read-only mode.
This patch makes read-only mounts lock the freeze glock in SH mode, which will block for file systems that are frozen on another node.
--- fs/gfs2/ops_fstype.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
fs/gfs2/ops_fstype.c +11 -1
@@ -1168,7 +1168,17 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) goto fail_per_node; } -if (!sb_rdonly (sb)) { +if (sb_rdonly (sb)) { +struct gfs2_holder freeze_gh; + + error =gfs2_glock_nq_init (sdp->sd_freeze_gl,LM_ST_SHARED , +GL_EXACT , &freeze_gh); +if (error) { +fs_err (sdp,"can't make FS RO: %d\n" , error); + goto fail_per_node; + } +gfs2_glock_dq_uninit (&freeze_gh); + }else { error =gfs2_make_fs_rw (sdp);if (error) {fs_err (sdp,"can't make FS RW: %d\n" , error);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 44/215 i2c: eg20t: Load module automatically if ID matches
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 5f90786b31fb7d1e199a8999d46c4e3aea672e11 ]
The driver can't be loaded automatically because it misses module alias to be provided. Add corresponding MODULE_DEVICE_TABLE() call to the driver.
--- drivers/i2c/busses/i2c-eg20t.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-eg20t.c +1 -0
@@ -180,6 +180,7 @@ static const struct pci_device_id pch_pcidev_id[] = { { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_I2C), 1, }, {0,} }; +MODULE_DEVICE_TABLE (pci, pch_pcidev_id);static irqreturn_t pch_i2c_handler (int irq,void *pData);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 45/215 arm64/alternatives: dont patch up internal branches
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
[ Upstream commit 5679b28142193a62f6af93249c0477be9f0c669b ]
Commit f7b93d42945c ("arm64/alternatives: use subsections for replacement sequences") moved the alternatives replacement sequences into subsections, in order to keep the as close as possible to the code that they replace.
Unfortunately, this broke the logic in branch_insn_requires_update, which assumed that any branch into kernel executable code was a branch that required updating, which is no longer the case now that the code sequences that are patched in are in the same section as the patch site itself.
So the only way to discriminate branches that require updating and ones that don't is to check whether the branch targets the replacement sequence itself, and so we can drop the call to kernel_text_address() entirely.
--- arch/arm64/kernel/alternative.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-)
arch/arm64/kernel/alternative.c +2 -14
@@ -43,20 +43,8 @@ bool alternative_is_applied(u16 cpufeature)*/ static bool branch_insn_requires_update (struct alt_instr *alt,unsigned long pc) { -unsigned long replptr; - -if (kernel_text_address (pc)) -return true; - - replptr = (unsigned long )ALT_REPL_PTR (alt); -if (pc >= replptr && pc <= (replptr + alt->alt_len)) -return false; - -/* -* Branching into *another* alternate sequence is doomed, and -* we're not even trying to fix it up. -*/ -BUG (); +unsigned long replptr = (unsigned long )ALT_REPL_PTR (alt); +return !(pc >= replptr && pc <= (replptr + alt->alt_len)); }#define align_down (x, a) ((unsigned long)(x) & ~(((unsigned long)(a)) - 1))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 46/215 iio:magnetometer:ak8974: Fix alignment and data leak issues
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit 838e00b13bfd4cac8b24df25bfc58e2eb99bcc70 upstream.
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data.
This data is allocated with kzalloc so no data can leak appart from previous readings.
--- drivers/iio/magnetometer/ak8974.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/iio/magnetometer/ak8974.c +7 -3
@@ -185,6 +185,11 @@ struct ak8974 {bool drdy_irq;struct completion drdy_complete;bool drdy_active_low; +/* Ensure timestamp is naturally aligned */ +struct { +__le16 channels[3 ]; +s64 ts__aligned(8) ; + } scan; };static const char ak8974_reg_avdd[] ="avdd" ;
@@ -581,7 +586,6 @@ static void ak8974_fill_buffer(struct ii {struct ak8974 *ak8974 =iio_priv (indio_dev);int ret; -__le16 hw_values[8 ];/* Three axes + 64bit padding */ pm_runtime_get_sync (&ak8974->i2c->dev);mutex_lock (&ak8974->lock);
@@ -591,13 +595,13 @@ static void ak8974_fill_buffer(struct iidev_err (&ak8974->i2c->dev,"error triggering measure\n" ); goto out_unlock; } - ret =ak8974_getresult (ak8974, hw_values); + ret =ak8974_getresult (ak8974, ak8974->scan.channels);if (ret) {dev_err (&ak8974->i2c->dev,"error getting measures\n" ); goto out_unlock; } -iio_push_to_buffers_with_timestamp (indio_dev, hw_values, +iio_push_to_buffers_with_timestamp (indio_dev, &ak8974->scan,iio_get_time_ns (indio_dev)); out_unlock:
Greg Kroah-Hartman
maintainerPATCH 47/215 iio:humidity:hdc100x Fix alignment and data leak issues
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit ea5e7a7bb6205d24371373cd80325db1bc15eded upstream.
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data. This data is allocated with kzalloc so no data can leak apart from previous readings.
--- drivers/iio/humidity/hdc100x.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/iio/humidity/hdc100x.c +7 -3
@@ -38,6 +38,11 @@ struct hdc100x_data {/* integration time of the sensor */ int adc_int_us[2 ]; +/* Ensure natural alignment of timestamp */ +struct { +__be16 channels[2 ]; +s64 ts__aligned(8) ; + } scan; };/* integration time in us */
@@ -319,7 +324,6 @@ static irqreturn_t hdc100x_trigger_handlstruct i2c_client *client = data->client;int delay = data->adc_int_us[0 ] + data->adc_int_us[1 ];int ret; -s16 buf[8 ];/* 2x s16 + padding + 8 byte timestamp */ /* dual read starts at temp register */ mutex_lock (&data->lock);
@@ -330,13 +334,13 @@ static irqreturn_t hdc100x_trigger_handl }usleep_range (delay, delay +1000 ); - ret =i2c_master_recv (client, (u8 *)buf,4 ); + ret =i2c_master_recv (client, (u8 *)data->scan.channels,4 );if (ret <0 ) {dev_err (&client->dev,"cannot read sensor data\n" ); goto err; } -iio_push_to_buffers_with_timestamp (indio_dev, buf, +iio_push_to_buffers_with_timestamp (indio_dev, &data->scan,iio_get_time_ns (indio_dev)); err:mutex_unlock (&data->lock);
Re: [PATCH 5.4 047/215] iio:humidity:hdc100x Fix alignment and data leak issues
Quoted 4 lines · Greg Kroah-Hartman
From: Jonathan Cameron <[email protected]>
commit
ea5e7a7bb6205d24371373cd80325db1bc15ededupstream.
Quoted 9 lines
One of a class of bugs pointed out by Lars in a recent review.
iio_push_to_buffers_with_timestampassumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in theiio_priv()data. This data is allocated with kzalloc so no data can leak apart from previous readings.
[]
drivers/iio/humidity/hdc100x.c struct hdc100x_data { · line 44
Quoted 9 lines
+++
b/drivers/iio/humidity/hdc100x.cdrivers/iio/humidity/hdc100x.c +4
-0@@ -38,6 +38,11 @@ struct hdc100x_data {/* integration time of the sensor */ int adc_int_us[2 ]; +/* Ensure natural alignment of timestamp */ +struct { +__be16 channels[2 ]; +s64 ts__aligned(8) ;
Why does an s64 need __aligned(8) ?
This seems needlessly redundant.
Isn't this naturally aligned by the compiler?
The struct isn't packed.
Re: [PATCH 5.4 047/215] iio:humidity:hdc100x Fix alignment and data leak issues
Quoted 19 lines · Joe Perches
Quoted 4 lines · Greg Kroah-Hartman
From: Jonathan Cameron <[email protected]>
commit
ea5e7a7bb6205d24371373cd80325db1bc15ededupstream.Quoted 9 lines
One of a class of bugs pointed out by Lars in a recent review.
iio_push_to_buffers_with_timestampassumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in theiio_priv()data. This data is allocated with kzalloc so no data can leak apart from previous readings.[]
Quoted 3 lines
+++
b/drivers/iio/humidity/hdc100x.c(quoted diff) +0
-0@@ -38,6 +38,11 @@ struct hdc100x_data {
Quoted 8 lines
drivers/iio/humidity/hdc100x.c struct hdc100x_data { · line 44
Quoted 6 lines
drivers/iio/humidity/hdc100x.c +4
-0/* integration time of the sensor */ int adc_int_us[2 ]; +/* Ensure natural alignment of timestamp */ +struct { +__be16 channels[2 ]; +s64 ts__aligned(8) ;Why does an s64 need
__aligned(8)?
This is due to on 32-bit x86 it is aligned to 4 bytes by default.
- Matt
Quoted 6 lines
This seems needlessly redundant.
Isn't this naturally aligned by the compiler?
The struct isn't packed.
Greg Kroah-Hartman
maintainerPATCH 48/215 iio: magnetometer: ak8974: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
commit 0187294d227dfc42889e1da8f8ce1e44fc25f147 upstream.
When devm_regmap_init_i2c() returns an error code, a pairing runtime PM usage counter decrement is needed to keep the counter balanced. For error paths after ak8974_set_power(), ak8974_detect() and ak8974_reset(), things are the same.
However, When iio_triggered_buffer_setup() returns an error code, there will be two PM usgae counter decrements.
--- drivers/iio/magnetometer/ak8974.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/iio/magnetometer/ak8974.c +10 -9
@@ -768,19 +768,21 @@ static int ak8974_probe(struct i2c_clien ak8974->map =devm_regmap_init_i2c (i2c, &ak8974_regmap_config);if (IS_ERR (ak8974->map)) {dev_err (&i2c->dev,"failed to allocate register map\n" ); +pm_runtime_put_noidle (&i2c->dev); +pm_runtime_disable (&i2c->dev);return PTR_ERR (ak8974->map); } ret =ak8974_set_power (ak8974,AK8974_PWR_ON );if (ret) {dev_err (&i2c->dev,"could not power on\n" ); - goto power_off; + goto disable_pm; } ret =ak8974_detect (ak8974);if (ret) {dev_err (&i2c->dev,"neither AK8974 nor AMI30x found\n" ); - goto power_off; + goto disable_pm; } ret =ak8974_selftest (ak8974);
@@ -790,14 +792,9 @@ static int ak8974_probe(struct i2c_clien ret =ak8974_reset (ak8974);if (ret) {dev_err (&i2c->dev,"AK8974 reset failed\n" ); - goto power_off; + goto disable_pm; } -pm_runtime_set_autosuspend_delay (&i2c->dev, -AK8974_AUTOSUSPEND_DELAY ); -pm_runtime_use_autosuspend (&i2c->dev); -pm_runtime_put (&i2c->dev); - indio_dev->dev.parent = &i2c->dev; indio_dev->channels = ak8974_channels; indio_dev->num_channels =ARRAY_SIZE (ak8974_channels);
@@ -850,6 +847,11 @@ no_irq: goto cleanup_buffer; } +pm_runtime_set_autosuspend_delay (&i2c->dev, +AK8974_AUTOSUSPEND_DELAY ); +pm_runtime_use_autosuspend (&i2c->dev); +pm_runtime_put (&i2c->dev); +return 0 ; cleanup_buffer:
@@ -858,7 +860,6 @@ disable_pm:pm_runtime_put_noidle (&i2c->dev);pm_runtime_disable (&i2c->dev);ak8974_set_power (ak8974,AK8974_PWR_OFF ); -power_off:regulator_bulk_disable (ARRAY_SIZE (ak8974->regs), ak8974->regs);return ret;
Greg Kroah-Hartman
maintainerPATCH 49/215 iio: core: add missing IIO_MOD_H2/ETHANOL string identifiers
In reply to Greg Kroah-HartmanFrom: Matt Ranostay <[email protected]>
commit 25f02d3242ab4d16d0cee2dec0d89cedb3747fa9 upstream.
Add missing strings to iio_modifier_names[] for proper modification of channels.
--- drivers/iio/industrialio-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iio/industrialio-core.c +2 -0
@@ -130,6 +130,8 @@ static const char * const iio_modifier_n [IIO_MOD_PM2P5] = "pm2p5", [IIO_MOD_PM4] = "pm4", [IIO_MOD_PM10] = "pm10", + [IIO_MOD_ETHANOL] = "ethanol", + [IIO_MOD_H2] = "h2", };/* relies on pairs of these shared then separate */
Greg Kroah-Hartman
maintainerPATCH 50/215 iio: mma8452: Add missed iio_device_unregister() call in mma8452_probe()
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
commit d7369ae1f4d7cffa7574d15e1f787dcca184c49d upstream.
The function iio_device_register() was called in mma8452_probe(). But the function iio_device_unregister() was not called after a call of the function mma8452_set_freefall_mode() failed. Thus add the missed function call for one error case.
--- drivers/iio/accel/mma8452.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/iio/accel/mma8452.c +4 -1
@@ -1685,10 +1685,13 @@ static int mma8452_probe(struct i2c_clie ret =mma8452_set_freefall_mode (data, false);if (ret <0 ) - goto buffer_cleanup; + goto unregister_device;return 0 ; +unregister_device: +iio_device_unregister (indio_dev); + buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);
Greg Kroah-Hartman
maintainerPATCH 51/215 iio: pressure: zpa2326: handle pm_runtime_get_sync failure
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
commit d88de040e1df38414fc1e4380be9d0e997ab4d58 upstream.
Calling pm_runtime_get_sync increments the counter even in case of failure, causing incorrect ref count. Call pm_runtime_put if pm_runtime_get_sync fails.
--- drivers/iio/pressure/zpa2326.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iio/pressure/zpa2326.c +3 -1
@@ -664,8 +664,10 @@ static int zpa2326_resume(const struct iint err; err =pm_runtime_get_sync (indio_dev->dev.parent); -if (err <0 ) +if (err <0 ) { +pm_runtime_put (indio_dev->dev.parent);return err; + }if (err >0 ) {/*
Greg Kroah-Hartman
maintainerPATCH 52/215 iio:humidity:hts221 Fix alignment and data leak issues
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit 5c49056ad9f3c786f7716da2dd47e4488fc6bd25 upstream.
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data. This data is allocated with kzalloc so no data can leak apart from previous readings.
Explicit alignment of ts needed to ensure consistent padding on all architectures (particularly x86_32 with it's 4 byte alignment of s64)
--- drivers/iio/humidity/hts221.h | 7 +++++-- drivers/iio/humidity/hts221_buffer.c | 9 +++++---- 2 files changed, 10 insertions(+), 6 deletions(-)
drivers/iio/humidity/hts221.h +5 -2
@@ -14,8 +14,6 @@#include <linux/iio/iio.h> -#define HTS221_DATA_SIZE 2 -enum hts221_sensor_type {HTS221_SENSOR_H ,HTS221_SENSOR_T ,
@@ -39,6 +37,11 @@ struct hts221_hw {bool enabled;u8 odr; +/* Ensure natural alignment of timestamp */ +struct { +__le16 channels[2 ]; +s64 ts__aligned(8) ; + } scan; };extern const struct dev_pm_ops hts221_pm_ops;
drivers/iio/humidity/hts221_buffer.c +5 -4
@@ -162,7 +162,6 @@ static const struct iio_buffer_setup_opsstatic irqreturn_t hts221_buffer_handler_thread (int irq,void *p) { -u8 buffer[ALIGN (2 *HTS221_DATA_SIZE ,sizeof (s64)) +sizeof (s64)];struct iio_poll_func *pf = p;struct iio_dev *iio_dev = pf->indio_dev;struct hts221_hw *hw =iio_priv (iio_dev);
@@ -172,18 +171,20 @@ static irqreturn_t hts221_buffer_handler/* humidity data */ ch = &iio_dev->channels[HTS221_SENSOR_H ]; err =regmap_bulk_read (hw->regmap, ch->address, - buffer,HTS221_DATA_SIZE ); + &hw->scan.channels[0 ], +sizeof (hw->scan.channels[0 ]));if (err <0 ) goto out;/* temperature data */ ch = &iio_dev->channels[HTS221_SENSOR_T ]; err =regmap_bulk_read (hw->regmap, ch->address, - buffer +HTS221_DATA_SIZE ,HTS221_DATA_SIZE ); + &hw->scan.channels[1 ], +sizeof (hw->scan.channels[1 ]));if (err <0 ) goto out; -iio_push_to_buffers_with_timestamp (iio_dev, buffer, +iio_push_to_buffers_with_timestamp (iio_dev, &hw->scan,iio_get_time_ns (iio_dev)); out:
Greg Kroah-Hartman
maintainerPATCH 53/215 iio:pressure:ms5611 Fix buffer element alignment
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit 8db4afe163bbdd93dca6fcefbb831ef12ecc6b4d upstream.
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. Here there is no data leak possibility so use an explicit structure on the stack to ensure alignment and nice readable fashion.
The forced alignment of ts isn't strictly necessary in this driver as the padding will be correct anyway (there isn't any). However it is probably less fragile to have it there and it acts as documentation of the requirement.
--- drivers/iio/pressure/ms5611_core.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/iio/pressure/ms5611_core.c +8 -3
@@ -212,16 +212,21 @@ static irqreturn_t ms5611_trigger_handlestruct iio_poll_func *pf = p;struct iio_dev *indio_dev = pf->indio_dev;struct ms5611_state *st =iio_priv (indio_dev); -s32 buf[4 ];/* s32 (pressure) + s32 (temp) + 2 * s32 (timestamp) */ +/* Ensure buffer elements are naturally aligned */ +struct { +s32 channels[2 ]; +s64 ts__aligned(8) ; + } scan;int ret;mutex_lock (&st->lock); - ret =ms5611_read_temp_and_pressure (indio_dev, &buf[1 ], &buf[0 ]); + ret =ms5611_read_temp_and_pressure (indio_dev, &scan.channels[1 ], + &scan.channels[0 ]);mutex_unlock (&st->lock);if (ret <0 ) goto err; -iio_push_to_buffers_with_timestamp (indio_dev, buf, +iio_push_to_buffers_with_timestamp (indio_dev, &scan,iio_get_time_ns (indio_dev)); err:
Greg Kroah-Hartman
maintainerPATCH 54/215 iio:health:afe4403 Fix timestamp alignment and prevent data leak.
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit 3f9c6d38797e9903937b007a341dad0c251765d6 upstream.
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses a 32 byte array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data with alignment explicitly requested. This data is allocated with kzalloc so no data can leak appart from previous readings.
--- drivers/iio/health/afe4403.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/iio/health/afe4403.c +8 -5
@@ -63,6 +63,7 @@ static const struct reg_field afe4403_re* @regulator: Pointer to the regulator for the IC * @trig: IIO trigger for this device * @irq: ADC_RDY line interrupt number +* @buffer: Used to construct data layout to push into IIO buffer. */ struct afe4403_data {struct device *dev;
@@ -72,6 +73,8 @@ struct afe4403_data {struct regulator *regulator;struct iio_trigger *trig;int irq; +/* Ensure suitable alignment for timestamp */ +s32 buffer[8 ]__aligned(8) ; };enum afe4403_chan_id {
@@ -309,7 +312,6 @@ static irqreturn_t afe4403_trigger_handlstruct iio_dev *indio_dev = pf->indio_dev;struct afe4403_data *afe =iio_priv (indio_dev);int ret, bit, i =0 ; -s32 buffer[8 ];u8 tx[4 ] = {AFE440X_CONTROL0 ,0x0 ,0x0 ,AFE440X_CONTROL0_READ };u8 rx[3 ];
@@ -326,9 +328,9 @@ static irqreturn_t afe4403_trigger_handlif (ret) goto err; - buffer[i++] = (rx[0 ] <<16 ) | - (rx[1 ] <<8 ) | - (rx[2 ]); + afe->buffer[i++] = (rx[0 ] <<16 ) | + (rx[1 ] <<8 ) | + (rx[2 ]); }/* Disable reading from the device */
@@ -337,7 +339,8 @@ static irqreturn_t afe4403_trigger_handlif (ret) goto err; -iio_push_to_buffers_with_timestamp (indio_dev, buffer, pf->timestamp); +iio_push_to_buffers_with_timestamp (indio_dev, afe->buffer, + pf->timestamp); err:iio_trigger_notify_done (indio_dev->trig);
Greg Kroah-Hartman
maintainerPATCH 55/215 spi: spi-fsl-dspi: Fix lockup if device is shutdown during SPI transfer
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 3c525b69e8c1a9a6944e976603c7a1a713e728f9 ]
During shutdown, the driver should unregister the SPI controller and stop the hardware. Otherwise the dspi_transfer_one_message() could wait on completion infinitely.
Additionally, calling spi_unregister_controller() first in device shutdown reverse-matches the probe function, where SPI controller is registered at the end.
--- drivers/spi/spi-fsl-dspi.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-)
drivers/spi/spi-fsl-dspi.c +1 -14
@@ -1184,20 +1184,7 @@ static int dspi_remove(struct platform_device *pdev)static void dspi_shutdown (struct platform_device *pdev) { -struct spi_controller *ctlr =platform_get_drvdata (pdev); -struct fsl_dspi *dspi =spi_controller_get_devdata (ctlr); - -/* Disable RX and TX */ -regmap_update_bits (dspi->regmap,SPI_MCR , -SPI_MCR_DIS_TXF |SPI_MCR_DIS_RXF , -SPI_MCR_DIS_TXF |SPI_MCR_DIS_RXF ); - -/* Stop Running */ -regmap_update_bits (dspi->regmap,SPI_MCR ,SPI_MCR_HALT ,SPI_MCR_HALT ); - -dspi_release_dma (dspi); -clk_disable_unprepare (dspi->clk); -spi_unregister_controller (dspi->ctlr); +dspi_remove (pdev); }static struct platform_driver fsl_dspi_driver = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 56/215 net: dsa: bcm_sf2: Fix node reference count
In reply to Greg Kroah-HartmanFrom: Florian Fainelli <[email protected]>
[ Upstream commit 8dbe4c5d5e40fe140221024f7b16bec9f310bf70 ]
of_find_node_by_name() will do an of_node_put() on the "from" argument. With CONFIG_OF_DYNAMIC enabled which checks for device_node reference counts, we would be getting a warning like this:
[ 6.347230] refcount_t: increment on 0; use-after-free. [ 6.352498] WARNING: CPU: 3 PID: 77 at lib/refcount.c:156 refcount_inc_checked+0x38/0x44 [ 6.360601] Modules linked in: [ 6.363661] CPU: 3 PID: 77 Comm: kworker/3:1 Tainted: G W 5.4.46-gb78b3e9956e6 #13 [ 6.372546] Hardware name: BCM97278SV (DT) [ 6.376649] Workqueue: events deferred_probe_work_func [ 6.381796] pstate: 60000005 (nZCv daif -PAN -UAO) [ 6.386595] pc : refcount_inc_checked+0x38/0x44 [ 6.391133] lr : refcount_inc_checked+0x38/0x44 ... [ 6.478791] Call trace: [ 6.481243] refcount_inc_checked+0x38/0x44 [ 6.485433] kobject_get+0x3c/0x4c [ 6.488840] of_node_get+0x24/0x34 [ 6.492247] of_irq_find_parent+0x3c/0xe0 [ 6.496263] of_irq_parse_one+0xe4/0x1d0 [ 6.500191] irq_of_parse_and_map+0x44/0x84 [ 6.504381] bcm_sf2_sw_probe+0x22c/0x844 [ 6.508397] platform_drv_probe+0x58/0xa8 [ 6.512413] really_probe+0x238/0x3fc [ 6.516081] driver_probe_device+0x11c/0x12c [ 6.520358] __device_attach_driver+0xa8/0x100 [ 6.524808] bus_for_each_drv+0xb4/0xd0 [ 6.528650] __device_attach+0xd0/0x164 [ 6.532493] device_initial_probe+0x24/0x30 [ 6.536682] bus_probe_device+0x38/0x98 [ 6.540524] deferred_probe_work_func+0xa8/0xd4 [ 6.545061] process_one_work+0x178/0x288 [ 6.549078] process_scheduled_works+0x44/0x48 [ 6.553529] worker_thread+0x218/0x270 [ 6.557285] kthread+0xdc/0xe4 [ 6.560344] ret_from_fork+0x10/0x18 [ 6.563925] ---[ end trace 68f65caf69bb152a ]---
Fix this by adding a of_node_get() to increment the reference count prior to the call.
--- drivers/net/dsa/bcm_sf2.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/dsa/bcm_sf2.c +2 -0
@@ -1116,6 +1116,8 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)set_bit (0 , priv->cfp.used);set_bit (0 , priv->cfp.unique); +/* Balance of_node_put() done by of_find_node_by_name() */ +of_node_get (dn); ports =of_find_node_by_name (dn,"ports" );if (ports) {bcm_sf2_identify_ports (priv, ports);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 57/215 of: of_mdio: Correct loop scanning logic
In reply to Greg Kroah-HartmanFrom: Florian Fainelli <[email protected]>
[ Upstream commit 5a8d7f126c97d04d893f5e5be2b286437a0d01b0 ]
Commit 209c65b61d94 ("drivers/of/of_mdio.c:fix of_mdiobus_register()") introduced a break of the loop on the premise that a successful registration should exit the loop. The premise is correct but not to code, because rc && rc != -ENODEV is just a special error condition, that means we would exit the loop even with rc == -ENODEV which is absolutely not correct since this is the error code to indicate to the MDIO bus layer that scanning should continue.
Fix this by explicitly checking for rc = 0 as the only valid condition to break out of the loop.
--- drivers/of/of_mdio.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/of/of_mdio.c +7 -2
@@ -265,10 +265,15 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) child, addr);if (of_mdiobus_child_is_phy (child)) { +/* -ENODEV is the return code that PHYLIB has +* standardized on to indicate that bus +* scanning should continue. +*/ rc =of_mdiobus_register_phy (mdio, child, addr); -if (rc && rc != -ENODEV ) +if (!rc) +break ; +if (rc != -ENODEV ) goto unregister; -break ; } } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 58/215 net: macb: call pm_runtime_put_sync on failure path
In reply to Greg Kroah-Hartman[ Upstream commit 0eaf228d574bd82a9aed73e3953bfb81721f4227 ]
Call pm_runtime_put_sync() on failure path of at91ether_open.
--- drivers/net/ethernet/cadence/macb_main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb_main.c +5 -1
@@ -3708,7 +3708,7 @@ static int at91ether_open(struct net_device *dev) ret =at91ether_start (dev);if (ret) -return ret; + goto pm_exit;/* Enable MAC interrupts */ macb_writel(lp, IER, MACB_BIT(RCOMP) |
@@ -3725,6 +3725,10 @@ static int at91ether_open(struct net_device *dev)netif_start_queue (dev);return 0 ; + +pm_exit: +pm_runtime_put_sync (&lp->pdev->dev); +return ret; }/* Close the interface */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 59/215 net: ethernet: mvneta: Do not error out in non serdes modes
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
[ Upstream commit d3d239dcb8aae6d7b10642d292b404e57604f7ea ]
In mvneta_config_interface() the RGMII modes are catched by the default case which is an error return. The RGMII modes are valid modes for the driver, so instead of returning an error add a break statement to return successfully.
This avoids this warning for non comphy SoCs which use RGMII, like SolidRun Clearfog:
WARNING: CPU: 0 PID: 268 at drivers/net/ethernet/marvell/mvneta.c:3512 mvneta_start_dev+0x220/0x23c
--- drivers/net/ethernet/marvell/mvneta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/mvneta.c +1 -1
@@ -3206,7 +3206,7 @@ static int mvneta_config_interface(struct mvneta_port *pp, MVNETA_HSGMII_SERDES_PROTO);break ;default : -return -EINVAL ; +break ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 60/215 net: ethernet: mvneta: Add back interface mode validation
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
[ Upstream commit 41c2b6b4f0f807803bb49f65835d136941a70f85 ]
When writing the serdes configuration register was moved to mvneta_config_interface() the whole code block was removed from mvneta_port_power_up() in the assumption that its only purpose was to write the serdes configuration register. As mentioned by Russell King its purpose was also to check for valid interface modes early so that later in the driver we do not have to care for unexpected interface modes.
Add back the test to let the driver bail out early on unhandled interface modes.
--- drivers/net/ethernet/marvell/mvneta.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/mvneta.c +19 -3
@@ -4496,10 +4496,18 @@ static void mvneta_conf_mbus_windows(struct mvneta_port *pp, }/* Power up the port */ -static void mvneta_port_power_up (struct mvneta_port *pp,int phy_mode) +static int mvneta_port_power_up (struct mvneta_port *pp,int phy_mode) {/* MAC Cause register should be cleared */ mvreg_write (pp,MVNETA_UNIT_INTR_CAUSE ,0 ); + +if (phy_mode !=PHY_INTERFACE_MODE_QSGMII && + phy_mode !=PHY_INTERFACE_MODE_SGMII && + !phy_interface_mode_is_8023z (phy_mode) && + !phy_interface_mode_is_rgmii (phy_mode)) +return -EINVAL ; + +return 0 ; }/* Device initialization routine */
@@ -4683,7 +4691,11 @@ static int mvneta_probe(struct platform_device *pdev)if (err <0 ) goto err_netdev; -mvneta_port_power_up (pp, phy_mode); + err =mvneta_port_power_up (pp, pp->phy_interface); +if (err <0 ) { +dev_err (&pdev->dev,"can't power up port\n" ); +return err; + }/* Armada3700 network controller does not support per-cpu * operation, so only single NAPI should be initialized.
@@ -4836,7 +4848,11 @@ static int mvneta_resume(struct device *device) } }mvneta_defaults_set (pp); -mvneta_port_power_up (pp, pp->phy_interface); + err =mvneta_port_power_up (pp, pp->phy_interface); +if (err <0 ) { +dev_err (device,"can't power up port\n" ); +return err; + }netif_device_attach (dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 61/215 Revert "usb/ohci-platform: Fix a warning when hibernating"
In reply to Greg Kroah-HartmanThis reverts commit fbf719e5da126c6b391ea7b1f38d4493582d8aaf.
Eugeniu Rosca writes:
Quoted 12 lines · Eugeniu Rosca
After integrating v4.14.186 commit
5410d158ca2a50("usb/ehci-platform:
Set PM runtime as active on resume") into downstream v4.14.x, we started to consistently experience below panic [1] on every second s2ram of R-Car H3 Salvator-X Renesas reference board.After some investigations, we concluded the following:
- the issue does not exist in vanilla v5.8-rc4+
- [bisecting shows that] the panic on v4.14.186 is caused by the lack of v5.6-rc1 commit987351e1ea7772("phy: core: Add consumer device link support"). Getting evidence for that is easy. Reverting987351e1ea7772in vanilla leads to a similar backtrace [2].
Quoted 9 lines
Questions:
- Backporting987351e1ea7772("phy: core: Add consumer device link support") to v4.14.187 looks challenging enough, so probably not worth it. Anybody to contradict this?
- Assuming no plans to backport the missing mainline commit to v4.14.x, should the following three v4.14.186 commits be reverted on v4.14.x?
*baef809ea497a4("usb/ohci-platform: Fix a warning when hibernating")
*9f33eff4958885("usb/xhci-plat: Set PM runtime as active on resume")
*5410d158ca2a50("usb/ehci-platform: Set PM runtime as active on resume")
--- drivers/usb/host/ohci-platform.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/usb/host/ohci-platform.c +0 -5
@@ -299,11 +299,6 @@ static int ohci_platform_resume(struct device *dev) }ohci_resume (hcd, false); - -pm_runtime_disable (dev); -pm_runtime_set_active (dev); -pm_runtime_enable (dev); -return 0 ; }#endif /* CONFIG_PM_SLEEP */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 62/215 Revert "usb/ehci-platform: Set PM runtime as active on resume"
In reply to Greg Kroah-HartmanThis reverts commit 335d720bb4bd9d2808cae5af6f3c636c87f19596.
Eugeniu Rosca writes:
Quoted 12 lines · Eugeniu Rosca
After integrating v4.14.186 commit
5410d158ca2a50("usb/ehci-platform:
Set PM runtime as active on resume") into downstream v4.14.x, we started to consistently experience below panic [1] on every second s2ram of R-Car H3 Salvator-X Renesas reference board.After some investigations, we concluded the following:
- the issue does not exist in vanilla v5.8-rc4+
- [bisecting shows that] the panic on v4.14.186 is caused by the lack of v5.6-rc1 commit987351e1ea7772("phy: core: Add consumer device link support"). Getting evidence for that is easy. Reverting987351e1ea7772in vanilla leads to a similar backtrace [2].
Quoted 9 lines
Questions:
- Backporting987351e1ea7772("phy: core: Add consumer device link support") to v4.14.187 looks challenging enough, so probably not worth it. Anybody to contradict this?
- Assuming no plans to backport the missing mainline commit to v4.14.x, should the following three v4.14.186 commits be reverted on v4.14.x?
*baef809ea497a4("usb/ohci-platform: Fix a warning when hibernating")
*9f33eff4958885("usb/xhci-plat: Set PM runtime as active on resume")
*5410d158ca2a50("usb/ehci-platform: Set PM runtime as active on resume")
--- drivers/usb/host/ehci-platform.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/usb/host/ehci-platform.c +0 -4
@@ -455,10 +455,6 @@ static int ehci_platform_resume(struct device *dev)ehci_resume (hcd, priv->reset_on_resume); -pm_runtime_disable (dev); -pm_runtime_set_active (dev); -pm_runtime_enable (dev); -if (priv->quirk_poll)quirk_poll_init (priv);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 63/215 Revert "usb/xhci-plat: Set PM runtime as active on resume"
In reply to Greg Kroah-HartmanThis reverts commit 57a1cd87efb9279ab58aae2e5c41920150e31873.
Eugeniu Rosca writes:
Quoted 12 lines · Eugeniu Rosca
After integrating v4.14.186 commit
5410d158ca2a50("usb/ehci-platform:
Set PM runtime as active on resume") into downstream v4.14.x, we started to consistently experience below panic [1] on every second s2ram of R-Car H3 Salvator-X Renesas reference board.After some investigations, we concluded the following:
- the issue does not exist in vanilla v5.8-rc4+
- [bisecting shows that] the panic on v4.14.186 is caused by the lack of v5.6-rc1 commit987351e1ea7772("phy: core: Add consumer device link support"). Getting evidence for that is easy. Reverting987351e1ea7772in vanilla leads to a similar backtrace [2].
Quoted 9 lines
Questions:
- Backporting987351e1ea7772("phy: core: Add consumer device link support") to v4.14.187 looks challenging enough, so probably not worth it. Anybody to contradict this?
- Assuming no plans to backport the missing mainline commit to v4.14.x, should the following three v4.14.186 commits be reverted on v4.14.x?
*baef809ea497a4("usb/ohci-platform: Fix a warning when hibernating")
*9f33eff4958885("usb/xhci-plat: Set PM runtime as active on resume")
*5410d158ca2a50("usb/ehci-platform: Set PM runtime as active on resume")
--- drivers/usb/host/xhci-plat.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)
drivers/usb/host/xhci-plat.c +1 -9
@@ -410,15 +410,7 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)if (ret)return ret; - ret =xhci_resume (xhci,0 ); -if (ret) -return ret; - -pm_runtime_disable (dev); -pm_runtime_set_active (dev); -pm_runtime_enable (dev); - -return 0 ; +return xhci_resume (xhci,0 ); }static int __maybe_unused xhci_plat_runtime_suspend (struct device *dev)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 64/215 net: sfp: add support for module quirks
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit b34bb2cb5b62c7397c28fcc335e8047a687eada4 ]
Add support for applying module quirks to the list of supported ethtool link modes.
--- drivers/net/phy/sfp-bus.c | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+)
drivers/net/phy/sfp-bus.c +54 -0
@@ -9,6 +9,12 @@#include "sfp.h" +struct sfp_quirk { +const char *vendor; +const char *part; +void (*modes)(const struct sfp_eeprom_id *id,unsigned long *modes); +}; +/** * struct sfp_bus - internal representation of a sfp bus */
@@ -21,6 +27,7 @@ struct sfp_bus {const struct sfp_socket_ops *socket_ops;struct device *sfp_dev;struct sfp *sfp; +const struct sfp_quirk *sfp_quirk;const struct sfp_upstream_ops *upstream_ops;void *upstream;
@@ -30,6 +37,46 @@ struct sfp_bus {bool started; }; +static const struct sfp_quirk sfp_quirks[] = { +}; + +static size_t sfp_strlen (const char *str,size_t maxlen) +{ +size_t size, i; + +/* Trailing characters should be filled with space chars */ +for (i =0 , size =0 ; i < maxlen; i++) +if (str[i] !=' ' ) + size = i +1 ; + +return size; +} + +static bool sfp_match (const char *qs,const char *str,size_t len) +{ +if (!qs) +return true; +if (strlen (qs) != len) +return false; +return !strncmp (qs, str, len); +} + +static const struct sfp_quirk *sfp_lookup_quirk (const struct sfp_eeprom_id *id) +{ +const struct sfp_quirk *q; +unsigned int i; +size_t vs, ps; + + vs =sfp_strlen (id->base.vendor_name,ARRAY_SIZE (id->base.vendor_name)); + ps =sfp_strlen (id->base.vendor_pn,ARRAY_SIZE (id->base.vendor_pn)); + +for (i =0 , q = sfp_quirks; i <ARRAY_SIZE (sfp_quirks); i++, q++) +if (sfp_match (q->vendor, id->base.vendor_name, vs) && +sfp_match (q->part, id->base.vendor_pn, ps)) +return q; + +return NULL ; +}/** * sfp_parse_port() - Parse the EEPROM base ID, setting the port type * @bus: a pointer to the &struct sfp_bus structure for the sfp module
@@ -233,6 +280,9 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, phylink_set(modes, 1000baseX_Full); } +if (bus->sfp_quirk) + bus->sfp_quirk->modes (id, modes); +bitmap_or (support, support, modes, __ETHTOOL_LINK_MODE_MASK_NBITS);phylink_set (support, Autoneg);
@@ -553,6 +603,8 @@ int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id)const struct sfp_upstream_ops *ops =sfp_get_upstream_ops (bus);int ret =0 ; + bus->sfp_quirk =sfp_lookup_quirk (id); +if (ops && ops->module_insert) ret = ops->module_insert (bus->upstream, id);
@@ -566,6 +618,8 @@ void sfp_module_remove(struct sfp_bus *bus)if (ops && ops->module_remove) ops->module_remove (bus->upstream); + + bus->sfp_quirk =NULL ; }EXPORT_SYMBOL_GPL (sfp_module_remove);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 65/215 net: sfp: add some quirks for GPON modules
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit b0eae33b2583dceb36224619f9fd85e6140ae594 ]
Marc Micalizzi reports that Huawei MA5671A and Alcatel/Lucent G-010S-P modules are capable of 2500base-X, but incorrectly report their capabilities in the EEPROM. It seems rather common that GPON modules mis-report.
Let's fix these modules by adding some quirks.
--- drivers/net/phy/sfp-bus.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
drivers/net/phy/sfp-bus.c +25 -0
@@ -37,7 +37,32 @@ struct sfp_bus {bool started; }; +static void sfp_quirk_2500basex (const struct sfp_eeprom_id *id, +unsigned long *modes) +{ + phylink_set(modes, 2500baseX_Full); +} +static const struct sfp_quirk sfp_quirks[] = { + { +// Alcatel Lucent G-010S-P can operate at 2500base-X, but +// incorrectly report 2500MBd NRZ in their EEPROM + .vendor ="ALCATELLUCENT" , + .part ="G010SP" , + .modes = sfp_quirk_2500basex, + }, { +// Alcatel Lucent G-010S-A can operate at 2500base-X, but +// report 3.2GBd NRZ in their EEPROM + .vendor ="ALCATELLUCENT" , + .part ="3FE46541AA" , + .modes = sfp_quirk_2500basex, + }, { +// Huawei MA5671A can operate at 2500base-X, but report 1.2GBd +// NRZ in their EEPROM + .vendor ="HUAWEI" , + .part ="MA5671A" , + .modes = sfp_quirk_2500basex, + }, };static size_t sfp_strlen (const char *str,size_t maxlen)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 66/215 ARM: OMAP4+: remove pdata quirks for omap4+ iommus
In reply to Greg Kroah-HartmanFrom: Tero Kristo <[email protected]>
[ Upstream commit e4c4b540e1e6c21ff8b987e92b2bd170ee006a94 ]
IOMMU driver will be using ti-sysc bus driver for power management control going forward, and the pdata quirks are not needed for anything anymore.
--- arch/arm/mach-omap2/pdata-quirks.c | 14 -------------- 1 file changed, 14 deletions(-)
arch/arm/mach-omap2/pdata-quirks.c +0 -14
@@ -311,16 +311,6 @@ static void __init omap3_pandora_legacy_init(void) }#endif /* CONFIG_ARCH_OMAP3 */ -#if defined(CONFIG_ARCH_OMAP4 ) || defined(CONFIG_SOC_OMAP5 ) -static struct iommu_platform_data omap4_iommu_pdata = { - .reset_name ="mmu_cache" , - .assert_reset = omap_device_assert_hardreset, - .deassert_reset = omap_device_deassert_hardreset, - .device_enable = omap_device_enable, - .device_idle = omap_device_idle, -}; -#endif -#if defined(CONFIG_SOC_AM33XX ) || defined(CONFIG_SOC_AM43XX )static struct wkup_m3_platform_data wkup_m3_data = { .reset_name = "wkup_m3",
@@ -543,10 +533,6 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = { &wkup_m3_data),#endif #if defined(CONFIG_ARCH_OMAP4 ) || defined(CONFIG_SOC_OMAP5 ) -OF_DEV_AUXDATA ("ti,omap4-iommu" ,0x4a066000 ,"4a066000.mmu" , - &omap4_iommu_pdata), -OF_DEV_AUXDATA ("ti,omap4-iommu" ,0x55082000 ,"55082000.mmu" , - &omap4_iommu_pdata),OF_DEV_AUXDATA ("ti,omap4-smartreflex-iva" ,0x4a0db000 ,"4a0db000.smartreflex" , &omap_sr_pdata[OMAP_SR_IVA ]), OF_DEV_AUXDATA("ti,omap4-smartreflex-core", 0x4a0dd000,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 67/215 ARM: OMAP2+: Add workaround for DRA7 DSP MStandby errata i879
In reply to Greg Kroah-HartmanFrom: Suman Anna <[email protected]>
[ Upstream commit 2f14101a1d760db72393910d481fbf7768c44530 ]
Errata Title:
i879: DSP MStandby requires CD_EMU in SW_WKUP
Description:
The DSP requires the internal emulation clock to be actively toggling in order to successfully enter a low power mode via execution of the IDLE instruction and PRCM MStandby/Idle handshake. This assumes that other prerequisites and software sequence are followed.
Workaround:
The emulation clock to the DSP is free-running anytime CCS is connected via JTAG debugger to the DSP subsystem or when the CD_EMU clock domain is set in SW_WKUP mode. The CD_EMU domain can be set in SW_WKUP mode via the CM_EMU_CLKSTCTRL [1:0]CLKTRCTRL field.
Implementation:
This patch implements this workaround by denying the HW_AUTO mode for the EMU clockdomain during the power-up of any DSP processor and re-enabling the HW_AUTO mode during the shutdown of the last DSP processor (actually done during the enabling and disabling of the respective DSP MDMA MMUs). Reference counting has to be used to manage the independent sequencing between the multiple DSP processors.
This switching is done at runtime rather than a static clockdomain flags value to meet the target power domain state for the EMU power domain during suspend.
Note that the DSP MStandby behavior is not consistent across all boards prior to this fix. Please see commit 45f871eec6c0 ("ARM:
OMAP2+: Extend DRA7 IPU1 MMU pdata quirks to DSP MDMA MMUs") for details.
--- arch/arm/mach-omap2/omap-iommu.c | 43 +++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-)
arch/arm/mach-omap2/omap-iommu.c +40 -3
@@ -11,14 +11,43 @@#include "omap_hwmod.h" #include "omap_device.h" +#include "clockdomain.h" #include "powerdomain.h" +static void omap_iommu_dra7_emu_swsup_config (struct platform_device *pdev, +bool enable) +{ +static struct clockdomain *emu_clkdm; +static DEFINE_SPINLOCK (emu_lock); +static atomic_t count; +struct device_node *np = pdev->dev.of_node; + +if (!of_device_is_compatible (np,"ti,dra7-dsp-iommu" )) +return ; + +if (!emu_clkdm) { + emu_clkdm =clkdm_lookup ("emu_clkdm" ); +if (WARN_ON_ONCE (!emu_clkdm)) +return ; + } + +spin_lock (&emu_lock); + +if (enable && (atomic_inc_return (&count) ==1 )) +clkdm_deny_idle (emu_clkdm); +else if (!enable && (atomic_dec_return (&count) ==0 )) +clkdm_allow_idle (emu_clkdm); + +spin_unlock (&emu_lock); +} +int omap_iommu_set_pwrdm_constraint (struct platform_device *pdev,bool request,u8 *pwrst) {struct powerdomain *pwrdm;struct omap_device *od;u8 next_pwrst; +int ret =0 ; od =to_omap_device (pdev);if (!od)
@@ -31,13 +60,21 @@ int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request,if (!pwrdm)return -EINVAL ; -if (request) +if (request) { *pwrst =pwrdm_read_next_pwrst (pwrdm); +omap_iommu_dra7_emu_swsup_config (pdev, true); + }if (*pwrst >PWRDM_POWER_RET ) -return 0 ; + goto out; next_pwrst = request ?PWRDM_POWER_ON : *pwrst; -return pwrdm_set_next_pwrst (pwrdm, next_pwrst); + ret =pwrdm_set_next_pwrst (pwrdm, next_pwrst); + +out: +if (!request) +omap_iommu_dra7_emu_swsup_config (pdev, false); + +return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 68/215 ARM: OMAP2+: use separate IOMMU pdata to fix DRA7 IPU1 boot
In reply to Greg Kroah-HartmanFrom: Suman Anna <[email protected]>
[ Upstream commit 4601832f40501efc3c2fd264a5a69bd1ac17d520 ]
The IPU1 MMU has been using common IOMMU pdata quirks defined and used by all IPU IOMMU devices on OMAP4 and beyond. Separate out the pdata for IPU1 MMU with the additional .set_pwrdm_constraint ops plugged in, so that the IPU1 power domain can be restricted to ON state during the boot and active period of the IPU1 remote processor. This eliminates the pre-conditions for the IPU1 boot issue as described in commit afe518400bdb ("iommu/omap: fix boot issue on remoteprocs with AMMU/Unicache").
NOTE:
1. RET is not a valid target power domain state on DRA7 platforms, and IPU power domain is normally programmed for OFF. The IPU1 still fails to boot though, and an unclearable l3_noc error is thrown currently on 4.14 kernel without this fix. This behavior is slightly different from previous 4.9 LTS kernel.
2. The fix is currently applied only to IPU1 on DRA7xx SoC, as the other affected processors on OMAP4/OMAP5/DRA7 are in domains that are not entering RET. IPU2 on DRA7 is in CORE power domain which is only programmed for ON power state. The fix can be easily scaled if these domains do hit RET in the future.
3. The issue was not seen on current DRA7 platforms if any of the DSP remote processors were booted and using one of the GPTimers 5, 6, 7 or 8 on previous 4.9 LTS kernel. This was due to the errata fix for i874 implemented in commit 1cbabcb9807e ("ARM:
DRA7: clockdomain: Implement timer workaround for errata i874") which keeps the IPU1 power domain from entering RET when the timers are active. But the timer workaround did not make any difference on 4.14 kernel, and an l3_noc error was seen still without this fix.
--- arch/arm/mach-omap2/pdata-quirks.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
arch/arm/mach-omap2/pdata-quirks.c +21 -0
@@ -44,6 +44,17 @@ struct pdata_init {static struct of_dev_auxdata omap_auxdata_lookup[];static struct twl4030_gpio_platform_data twl_gpio_auxdata; +#if IS_ENABLED (CONFIG_OMAP_IOMMU ) +int omap_iommu_set_pwrdm_constraint (struct platform_device *pdev,bool request, +u8 *pwrst); +#else +static inline int omap_iommu_set_pwrdm_constraint (struct platform_device *pdev, +bool request,u8 *pwrst) +{ +return 0 ; +} +#endif +#ifdef CONFIG_MACH_NOKIA_N8X0 static void __init omap2420_n8x0_legacy_init (void ) {
@@ -326,6 +337,10 @@ static void __init omap5_uevm_legacy_init(void)#endif #ifdef CONFIG_SOC_DRA7XX +static struct iommu_platform_data dra7_ipu1_dsp_iommu_pdata = { + .set_pwrdm_constraint = omap_iommu_set_pwrdm_constraint, +}; +static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc1;static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc2;static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc3;
@@ -547,6 +562,12 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = { &dra7_hsmmc_data_mmc2),OF_DEV_AUXDATA ("ti,dra7-hsmmc" ,0x480ad000 ,"480ad000.mmc" , &dra7_hsmmc_data_mmc3), +OF_DEV_AUXDATA ("ti,dra7-dsp-iommu" ,0x40d01000 ,"40d01000.mmu" , + &dra7_ipu1_dsp_iommu_pdata), +OF_DEV_AUXDATA ("ti,dra7-dsp-iommu" ,0x41501000 ,"41501000.mmu" , + &dra7_ipu1_dsp_iommu_pdata), +OF_DEV_AUXDATA ("ti,dra7-iommu" ,0x58882000 ,"58882000.mmu" , + &dra7_ipu1_dsp_iommu_pdata), #endif/* Common auxdata */ OF_DEV_AUXDATA("ti,sysc", 0, NULL, &ti_sysc_pdata),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 69/215 mmc: mmci: Support any block sizes for ux500v2 and qcom variant
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit 2253ed4b36dc876d1598c4dab5587e537ec68c34 ]
For the ux500v2 variant of the PL18x block, any block sizes are supported. This is necessary to support some SDIO transfers. This also affects the QCOM MMCI variant and the ST micro variant.
For Ux500 an additional quirk only allowing DMA on blocks that are a power of two is needed. This might be a bug in the DMA engine (DMA40) or the MMCI or in the interconnect, but the most likely is the MMCI, as transfers of these sizes work fine for other devices using the same DMA engine. DMA works fine also with SDIO as long as the blocksize is a power of 2.
This patch has proven necessary for enabling SDIO for WLAN on PostmarketOS-based Ux500 platforms.
What we managed to test in practice is Broadcom WiFi over SDIO on the Ux500 based Samsung GT-I8190 and GT-S7710. This WiFi chip, BCM4334 works fine after the patch.
Before this patch:
brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac4334-sdio
for chip BCM4334/3 mmci-pl18x 80118000.sdi1_per2: unsupported block size (60 bytes) brcmfmac: brcmf_sdiod_ramrw: membytes transfer failed brcmfmac: brcmf_sdio_download_code_file: error -22 on writing 434236 membytes at 0x00000000
brcmfmac: brcmf_sdio_download_firmware: dongle image file download
failed
After this patch:
brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4334/3 wl0:
Nov 21 2012 00:21:28 version 6.10.58.813 (B2) FWID 01-0
Bringing up networks, discovering networks with "iw dev wlan0 scan" and connecting works fine from this point.
This patch is inspired by Ulf Hansson's patch
http://www.spinics.net/lists/linux-mmc/msg12160.html
As the DMA engines on these platforms may now get block sizes they were not used to before, make sure to also respect if the DMA engine says "no" to a transfer.
Make a drive-by fix for datactrl_blocksz, misspelled.
--- drivers/mmc/host/mmci.c | 34 ++++++++++++++++++++++++++++++---- drivers/mmc/host/mmci.h | 8 +++++++- 2 files changed, 37 insertions(+), 5 deletions(-)
drivers/mmc/host/mmci.c +30 -4
@@ -168,6 +168,8 @@ static struct variant_data variant_ux500 = { .cmdreg_srsp = MCI_CPSM_RESPONSE, .datalength_bits = 24, .datactrl_blocksz = 11, + .datactrl_any_blocksz = true, + .dma_power_of_2 = true, .datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN, .st_sdio = true, .st_clkdiv = true,
@@ -201,6 +203,8 @@ static struct variant_data variant_ux500v2 = { .datactrl_mask_ddrmode = MCI_DPSM_ST_DDRMODE, .datalength_bits = 24, .datactrl_blocksz = 11, + .datactrl_any_blocksz = true, + .dma_power_of_2 = true, .datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN, .st_sdio = true, .st_clkdiv = true,
@@ -260,6 +264,7 @@ static struct variant_data variant_stm32_sdmmc = { .datacnt_useless = true, .datalength_bits = 25, .datactrl_blocksz = 14, + .datactrl_any_blocksz = true, .stm32_idmabsize_mask = GENMASK(12, 5), .init = sdmmc_variant_init, };
@@ -279,6 +284,7 @@ static struct variant_data variant_qcom = { .data_cmd_enable = MCI_CPSM_QCOM_DATCMD, .datalength_bits = 24, .datactrl_blocksz = 11, + .datactrl_any_blocksz = true, .pwrreg_powerup = MCI_PWR_UP, .f_max = 208000000, .explicit_mclk_control = true,
@@ -447,10 +453,11 @@ void mmci_dma_setup(struct mmci_host *host)static int mmci_validate_data (struct mmci_host *host,struct mmc_data *data) { +struct variant_data *variant = host->variant; +if (!data)return 0 ; - -if (!is_power_of_2 (data->blksz)) { +if (!is_power_of_2 (data->blksz) && !variant->datactrl_any_blocksz) {dev_err (mmc_dev (host->mmc),"unsupported block size (%d bytes)\n" , data->blksz);return -EINVAL ;
@@ -515,7 +522,9 @@ int mmci_dma_start(struct mmci_host *host, unsigned int datactrl)"Submit MMCI DMA job, sglen %d blksz %04x blks %04x flags %08x\n" , data->sg_len, data->blksz, data->blocks, data->flags); - host->ops->dma_start (host, &datactrl); + ret = host->ops->dma_start (host, &datactrl); +if (ret) +return ret;/* Trigger the DMA transfer */ mmci_write_datactrlreg (host, datactrl);
@@ -822,6 +831,18 @@ static int _mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data,if (data->blksz * data->blocks <= variant->fifosize)return -EINVAL ; +/* +* This is necessary to get SDIO working on the Ux500. We do not yet +* know if this is a bug in: +* - The Ux500 DMA controller (DMA40) +* - The MMCI DMA interface on the Ux500 +* some power of two blocks (such as 64 bytes) are sent regularly +* during SDIO traffic and those work fine so for these we enable DMA +* transfers. +*/ +if (host->variant->dma_power_of_2 && !is_power_of_2 (data->blksz)) +return -EINVAL ; + device = chan->device; nr_sg =dma_map_sg (device->dev, data->sg, data->sg_len,mmc_get_dma_dir (data));
@@ -872,9 +893,14 @@ int mmci_dmae_prep_data(struct mmci_host *host,int mmci_dmae_start (struct mmci_host *host,unsigned int *datactrl) {struct mmci_dmae_priv *dmae = host->dma_priv; +int ret; host->dma_in_progress = true; -dmaengine_submit (dmae->desc_current); + ret =dma_submit_error (dmaengine_submit (dmae->desc_current)); +if (ret <0 ) { + host->dma_in_progress = false; +return ret; + }dma_async_issue_pending (dmae->cur); *datactrl |=MCI_DPSM_DMAENABLE ;
drivers/mmc/host/mmci.h +7 -1
@@ -278,7 +278,11 @@ struct mmci_host;* @stm32_clkdiv: true if using a STM32-specific clock divider algorithm * @datactrl_mask_ddrmode: ddr mode mask in datactrl register. * @datactrl_mask_sdio: SDIO enable mask in datactrl register -* @datactrl_blksz: block size in power of two +* @datactrl_blocksz: block size in power of two +* @datactrl_any_blocksz: true if block any block sizes are accepted by +* hardware, such as with some SDIO traffic that send +* odd packets. +* @dma_power_of_2: DMA only works with blocks that are a power of 2. * @datactrl_first: true if data must be setup before send command * @datacnt_useless: true if you could not use datacnt register to read * remaining data
@@ -323,6 +327,8 @@ struct variant_data {unsigned int datactrl_mask_ddrmode;unsigned int datactrl_mask_sdio;unsigned int datactrl_blocksz; + u8 datactrl_any_blocksz:1; + u8 dma_power_of_2:1; u8 datactrl_first:1; u8 datacnt_useless:1; u8 st_sdio:1;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 70/215 HID: quirks: Remove ITE 8595 entry from hid_have_special_driver
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 3045696d0ce663d67c95dcb8206d3de57f6841ec ]
The ITE 8595 chip used in various 2-in-1 keyboard docks works fine with the hid-generic driver (minus the RF_KILL key) and also keeps working fine when swapping drivers, so there is no need to have it in the hid_have_special_driver list.
Note the other 2 USB ids in hid-ite.c were never added to hid_have_special_driver.
--- drivers/hid/hid-quirks.c | 3 --- 1 file changed, 3 deletions(-)
drivers/hid/hid-quirks.c +0 -3
@@ -400,9 +400,6 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) }, #endif -#if IS_ENABLED(CONFIG_HID_ITE) - { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, -#endif #if IS_ENABLED(CONFIG_HID_ICADE) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) }, #endif
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 71/215 ARM: at91: pm: add quirk for sam9x60s ulp1
In reply to Greg Kroah-HartmanFrom: Claudiu Beznea <[email protected]>
[ Upstream commit bb1a0e87e1c54cd884e9b92b1cec06b186edc7a0 ]
On SAM9X60 2 nop operations has to be introduced after setting WAITMODE bit in CKGR_MOR.
--- arch/arm/mach-at91/pm_suspend.S | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/mach-at91/pm_suspend.S +4 -0
@@ -268,6 +268,10 @@ ENDPROC(at91_backup_mode) orr tmp1, tmp1, #AT91_PMC_KEY str tmp1, [pmc, #AT91_CKGR_MOR] + /* Quirk for SAM9X60's PMC */ + nop + nop + wait_mckrdy /* Enable the crystal oscillator */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 72/215 drm/sun4i: tcon: Separate quirks for tcon0 and tcon1 on A20
In reply to Greg Kroah-HartmanFrom: Andrey Lebedev <[email protected]>
[ Upstream commit cd0ecabdc953397ed0378022b3b90e0c0871c2eb ]
Timing controllers on A20 are not equivalent: tcon0 on A20 supports LVDS output and tcon1 does not. Separate the capabilities by introducing independent set of quirks for each of the tcons.
--- drivers/gpu/drm/sun4i/sun4i_tcon.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/sun4i/sun4i_tcon.c +2 -0
@@ -1504,6 +1504,8 @@ const struct of_device_id sun4i_tcon_of_table[] = { { .compatible = "allwinner,sun6i-a31-tcon", .data = &sun6i_a31_quirks }, { .compatible = "allwinner,sun6i-a31s-tcon", .data = &sun6i_a31s_quirks }, { .compatible = "allwinner,sun7i-a20-tcon", .data = &sun7i_a20_quirks }, + { .compatible = "allwinner,sun7i-a20-tcon0", .data = &sun7i_a20_quirks }, + { .compatible = "allwinner,sun7i-a20-tcon1", .data = &sun7i_a20_quirks }, { .compatible = "allwinner,sun8i-a23-tcon", .data = &sun8i_a33_quirks }, { .compatible = "allwinner,sun8i-a33-tcon", .data = &sun8i_a33_quirks }, { .compatible = "allwinner,sun8i-a83t-tcon-lcd", .data = &sun8i_a83t_lcd_quirks },
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 73/215 scsi: sr: remove references to BLK_DEV_SR_VENDOR, leave it enabled
In reply to Greg Kroah-HartmanFrom: Diego Elio Pettenò <[email protected]>
[ Upstream commit 679b2ec8e060ca7a90441aff5e7d384720a41b76 ]
This kernel configuration is basically enabling/disabling sr driver quirks detection. While these quirks are for fairly rare devices (very old CD burners, and a glucometer), the additional detection of these models is a very minimal amount of code.
The logic behind the quirks is always built into the sr driver.
This also removes the config from all the defconfig files that are enabling this already.
--- arch/alpha/configs/defconfig | 1 - arch/arm/configs/rpc_defconfig | 1 - arch/arm/configs/s3c2410_defconfig | 1 - arch/ia64/configs/zx1_defconfig | 1 - arch/m68k/configs/amiga_defconfig | 1 - arch/m68k/configs/apollo_defconfig | 1 - arch/m68k/configs/atari_defconfig | 1 - arch/m68k/configs/bvme6000_defconfig | 1 - arch/m68k/configs/hp300_defconfig | 1 - arch/m68k/configs/mac_defconfig | 1 - arch/m68k/configs/multi_defconfig | 1 - arch/m68k/configs/mvme147_defconfig | 1 - arch/m68k/configs/mvme16x_defconfig | 1 - arch/m68k/configs/q40_defconfig | 1 - arch/m68k/configs/sun3_defconfig | 1 - arch/m68k/configs/sun3x_defconfig | 1 - arch/mips/configs/bigsur_defconfig | 1 - arch/mips/configs/fuloong2e_defconfig | 1 - arch/mips/configs/ip27_defconfig | 1 - arch/mips/configs/ip32_defconfig | 1 - arch/mips/configs/jazz_defconfig | 1 - arch/mips/configs/malta_defconfig | 1 - arch/mips/configs/malta_kvm_defconfig | 1 - arch/mips/configs/malta_kvm_guest_defconfig | 1 - arch/mips/configs/maltaup_xpa_defconfig | 1 - arch/mips/configs/rm200_defconfig | 1 - arch/powerpc/configs/85xx-hw.config | 1 - arch/powerpc/configs/amigaone_defconfig | 1 - arch/powerpc/configs/chrp32_defconfig | 1 - arch/powerpc/configs/g5_defconfig | 1 - arch/powerpc/configs/maple_defconfig | 1 - arch/powerpc/configs/pasemi_defconfig | 1 - arch/powerpc/configs/pmac32_defconfig | 1 - arch/powerpc/configs/powernv_defconfig | 1 - arch/powerpc/configs/ppc64_defconfig | 1 - arch/powerpc/configs/ppc64e_defconfig | 1 - arch/powerpc/configs/ppc6xx_defconfig | 1 - arch/powerpc/configs/pseries_defconfig | 1 - arch/powerpc/configs/skiroot_defconfig | 1 - arch/sh/configs/sh03_defconfig | 1 - arch/sparc/configs/sparc64_defconfig | 1 - arch/x86/configs/i386_defconfig | 1 - arch/x86/configs/x86_64_defconfig | 1 - drivers/scsi/Kconfig | 9 --------- drivers/scsi/sr_vendor.c | 8 -------- 45 files changed, 60 deletions(-)
arch/alpha/configs/defconfig +0 -1
@@ -36,7 +36,6 @@ CONFIG_BLK_DEV_CY82C693=y CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_SCSI_AIC7XXX=m CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 # CONFIG_AIC7XXX_DEBUG_ENABLE is not set
arch/arm/configs/rpc_defconfig +0 -1
@@ -32,7 +32,6 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/arm/configs/s3c2410_defconfig +0 -1
@@ -202,7 +202,6 @@ CONFIG_EEPROM_AT24=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_CONSTANTS=y
arch/ia64/configs/zx1_defconfig +0 -1
@@ -35,7 +35,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_CHR_DEV_OSST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/m68k/configs/amiga_defconfig +0 -1
@@ -334,7 +334,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/apollo_defconfig +0 -1
@@ -319,7 +319,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/atari_defconfig +0 -1
@@ -334,7 +334,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/bvme6000_defconfig +0 -1
@@ -316,7 +316,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/hp300_defconfig +0 -1
@@ -318,7 +318,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/mac_defconfig +0 -1
@@ -325,7 +325,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/multi_defconfig +0 -1
@@ -358,7 +358,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/mvme147_defconfig +0 -1
@@ -315,7 +315,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/mvme16x_defconfig +0 -1
@@ -316,7 +316,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/q40_defconfig +0 -1
@@ -324,7 +324,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/sun3_defconfig +0 -1
@@ -313,7 +313,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/m68k/configs/sun3x_defconfig +0 -1
@@ -313,7 +313,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SAS_ATTRS=m
arch/mips/configs/bigsur_defconfig +0 -1
@@ -112,7 +112,6 @@ CONFIG_BLK_DEV_TC86C001=m CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_CHR_DEV_SCH=m CONFIG_ATA=y
arch/mips/configs/fuloong2e_defconfig +0 -1
@@ -99,7 +99,6 @@ CONFIG_CDROM_PKTCDVD=m CONFIG_ATA_OVER_ETH=m CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOWLEVEL is not set
arch/mips/configs/ip27_defconfig +0 -1
@@ -99,7 +99,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_CONSTANTS=y
arch/mips/configs/ip32_defconfig +0 -1
@@ -50,7 +50,6 @@ CONFIG_RAID_ATTRS=y CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/mips/configs/jazz_defconfig +0 -1
@@ -191,7 +191,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SCAN_ASYNC=y CONFIG_SCSI_FC_ATTRS=y
arch/mips/configs/malta_defconfig +0 -1
@@ -239,7 +239,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/mips/configs/malta_kvm_defconfig +0 -1
@@ -247,7 +247,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/mips/configs/malta_kvm_guest_defconfig +0 -1
@@ -245,7 +245,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/mips/configs/maltaup_xpa_defconfig +0 -1
@@ -245,7 +245,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y
arch/mips/configs/rm200_defconfig +0 -1
@@ -203,7 +203,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SCAN_ASYNC=y CONFIG_SCSI_FC_ATTRS=y
arch/powerpc/configs/85xx-hw.config +0 -1
@@ -2,7 +2,6 @@ CONFIG_AQUANTIA_PHY=y CONFIG_AT803X_PHY=y CONFIG_ATA=y CONFIG_BLK_DEV_SD=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_BLK_DEV_SR=y CONFIG_BROADCOM_PHY=y CONFIG_C293_PCIE=y
arch/powerpc/configs/amigaone_defconfig +0 -1
@@ -47,7 +47,6 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SYM53C8XX_2=y
arch/powerpc/configs/chrp32_defconfig +0 -1
@@ -45,7 +45,6 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SYM53C8XX_2=y
arch/powerpc/configs/g5_defconfig +0 -1
@@ -62,7 +62,6 @@ CONFIG_CDROM_PKTCDVD=m CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SPI_ATTRS=y
arch/powerpc/configs/maple_defconfig +0 -1
@@ -41,7 +41,6 @@ CONFIG_BLK_DEV_RAM_SIZE=8192 # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_IPR=y CONFIG_ATA=y
arch/powerpc/configs/pasemi_defconfig +0 -1
@@ -60,7 +60,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_CHR_DEV_OSST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SCH=y CONFIG_SCSI_CONSTANTS=y
arch/powerpc/configs/pmac32_defconfig +0 -1
@@ -119,7 +119,6 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_FC_ATTRS=y
arch/powerpc/configs/powernv_defconfig +0 -1
@@ -111,7 +111,6 @@ CONFIG_BLK_DEV_NVME=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SCAN_ASYNC=y
arch/powerpc/configs/ppc64_defconfig +0 -1
@@ -110,7 +110,6 @@ CONFIG_VIRTIO_BLK=m CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_FC_ATTRS=y
arch/powerpc/configs/ppc64e_defconfig +0 -1
@@ -60,7 +60,6 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_FC_ATTRS=y
arch/powerpc/configs/ppc6xx_defconfig +0 -1
@@ -372,7 +372,6 @@ CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_ENCLOSURE=m
arch/powerpc/configs/pseries_defconfig +0 -1
@@ -97,7 +97,6 @@ CONFIG_VIRTIO_BLK=m CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_FC_ATTRS=y
arch/powerpc/configs/skiroot_defconfig +0 -1
@@ -83,7 +83,6 @@ CONFIG_EEPROM_AT24=m # CONFIG_OCXL is not set CONFIG_BLK_DEV_SD=m CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SCAN_ASYNC=y
arch/sh/configs/sh03_defconfig +0 -1
@@ -46,7 +46,6 @@ CONFIG_BLK_DEV_IDETAPE=m CONFIG_SCSI=m CONFIG_BLK_DEV_SD=m CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_NETDEVICES=y CONFIG_NET_ETHERNET=y
arch/sparc/configs/sparc64_defconfig +0 -1
@@ -73,7 +73,6 @@ CONFIG_RAID_ATTRS=m CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_CONSTANTS=y
arch/x86/configs/i386_defconfig +0 -1
@@ -137,7 +137,6 @@ CONFIG_CONNECTOR=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SPI_ATTRS=y
arch/x86/configs/x86_64_defconfig +0 -1
@@ -136,7 +136,6 @@ CONFIG_CONNECTOR=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_SPI_ATTRS=y
drivers/scsi/Kconfig +0 -9
@@ -114,15 +114,6 @@ config BLK_DEV_SR <file:Documentation/scsi/scsi.txt>. The module will be called sr_mod. -config BLK_DEV_SR_VENDOR - bool "Enable vendor-specific extensions (for SCSI CDROM)" - depends on BLK_DEV_SR - help - This enables the usage of vendor specific SCSI commands. This is - required to support multisession CDs with old NEC/TOSHIBA cdrom - drives (and HP Writers). If you have such a drive and get the first - session only, try saying Y here; everybody else says N. - config CHR_DEV_SG tristate "SCSI generic support" depends on SCSI
drivers/scsi/sr_vendor.c +0 -8
@@ -66,9 +66,6 @@void sr_vendor_init (Scsi_CD *cd) { -#ifndef CONFIG_BLK_DEV_SR_VENDOR - cd->vendor =VENDOR_SCSI3 ; -#else const char *vendor = cd->device->vendor;const char *model = cd->device->model;
@@ -100,7 +97,6 @@ void sr_vendor_init(Scsi_CD *cd) cd->vendor =VENDOR_TOSHIBA ; } -#endif }
@@ -114,10 +110,8 @@ int sr_set_blocklength(Scsi_CD *cd, int blocklength)struct ccs_modesel_head *modesel;int rc, density =0 ; -#ifdef CONFIG_BLK_DEV_SR_VENDOR if (cd->vendor ==VENDOR_TOSHIBA ) density = (blocklength >2048 ) ?0x81 :0x83 ; -#endif buffer =kmalloc (512 ,GFP_KERNEL |GFP_DMA );if (!buffer)
@@ -205,7 +199,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) }break ; -#ifdef CONFIG_BLK_DEV_SR_VENDOR case VENDOR_NEC :{unsigned long min, sec, frame; cgc.cmd[0 ] =0xde ;
@@ -298,7 +291,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) sector = buffer[11 ] + (buffer[10 ] <<8 ) + (buffer[9 ] <<16 ) + (buffer[8 ] <<24 );break ; -#endif /* CONFIG_BLK_DEV_SR_VENDOR */ default :/* should not happen */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 74/215 bus: ti-sysc: Rename clk related quirks to pre_reset and post_reset quirks
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit e64c021fd92467e34b9d970a651bcaa8f326f3f2 ]
The clk_disable_quirk and clk_enable_quirk should really be called pre_reset_quirk and post_reset_quirk to avoid confusion like we had with hdq1w reset.
Let's also rename the related functions so the code is easier to follow. Note that we also have reset_done_quirk that is needed in some cases after checking the separate register for reset done bit.
--- drivers/bus/ti-sysc.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
drivers/bus/ti-sysc.c +16 -16
@@ -70,8 +70,8 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {* @child_needs_resume: runtime resume needed for child on resume from suspend * @disable_on_idle: status flag used for disabling modules with resets * @idle_work: work structure used to perform delayed idle on a module -* @clk_enable_quirk: module specific clock enable quirk -* @clk_disable_quirk: module specific clock disable quirk +* @pre_reset_quirk: module specific pre-reset quirk +* @post_reset_quirk: module specific post-reset quirk * @reset_done_quirk: module specific reset done quirk * @module_enable_quirk: module specific enable quirk * @module_disable_quirk: module specific disable quirk
@@ -97,8 +97,8 @@ struct sysc { unsigned int needs_resume:1; unsigned int child_needs_resume:1;struct delayed_work idle_work; -void (*clk_enable_quirk)(struct sysc *sysc); -void (*clk_disable_quirk)(struct sysc *sysc); +void (*pre_reset_quirk)(struct sysc *sysc); +void (*post_reset_quirk)(struct sysc *sysc);void (*reset_done_quirk)(struct sysc *sysc);void (*module_enable_quirk)(struct sysc *sysc);void (*module_disable_quirk)(struct sysc *sysc);
@@ -1433,7 +1433,7 @@ static void sysc_module_enable_quirk_aess(struct sysc *ddata)sysc_write (ddata, offset,1 ); } -/* I2C needs extra enable bit toggling for reset */ +/* I2C needs to be disabled for reset */ static void sysc_clk_quirk_i2c (struct sysc *ddata,bool enable) {int offset;
@@ -1454,14 +1454,14 @@ static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable)sysc_write (ddata, offset, val); } -static void sysc_clk_enable_quirk_i2c (struct sysc *ddata) +static void sysc_pre_reset_quirk_i2c (struct sysc *ddata) { -sysc_clk_quirk_i2c (ddata, true); +sysc_clk_quirk_i2c (ddata, false); } -static void sysc_clk_disable_quirk_i2c (struct sysc *ddata) +static void sysc_post_reset_quirk_i2c (struct sysc *ddata) { -sysc_clk_quirk_i2c (ddata, false); +sysc_clk_quirk_i2c (ddata, true); }/* 36xx SGX needs a quirk for to bypass OCP IPG interrupt logic */
@@ -1503,14 +1503,14 @@ static void sysc_init_module_quirks(struct sysc *ddata)return ;if (ddata->cfg.quirks &SYSC_MODULE_QUIRK_HDQ1W ) { - ddata->clk_disable_quirk = sysc_pre_reset_quirk_hdq1w; + ddata->pre_reset_quirk = sysc_pre_reset_quirk_hdq1w;return ; }if (ddata->cfg.quirks &SYSC_MODULE_QUIRK_I2C ) { - ddata->clk_enable_quirk = sysc_clk_enable_quirk_i2c; - ddata->clk_disable_quirk = sysc_clk_disable_quirk_i2c; + ddata->pre_reset_quirk = sysc_pre_reset_quirk_i2c; + ddata->post_reset_quirk = sysc_post_reset_quirk_i2c;return ; }
@@ -1629,8 +1629,8 @@ static int sysc_reset(struct sysc *ddata)else syss_done = ddata->cfg.syss_mask; -if (ddata->clk_disable_quirk) - ddata->clk_disable_quirk (ddata); +if (ddata->pre_reset_quirk) + ddata->pre_reset_quirk (ddata); sysc_val =sysc_read_sysconfig (ddata); sysc_val |= sysc_mask;
@@ -1640,8 +1640,8 @@ static int sysc_reset(struct sysc *ddata)usleep_range (ddata->cfg.srst_udelay, ddata->cfg.srst_udelay *2 ); -if (ddata->clk_enable_quirk) - ddata->clk_enable_quirk (ddata); +if (ddata->post_reset_quirk) + ddata->post_reset_quirk (ddata);/* Poll on reset status */ if (syss_offset >=0 ) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 75/215 bus: ti-sysc: Consider non-existing registers too when matching quirks
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 590e15c76f1231329d1543570a54058dba2e4ff6 ]
We are currently setting -1 for non-existing sysconfig related registers for quirks, but setting -ENODEV elsewhere. And for matching the quirks, we're now just ignoring the non-existing registers. This will cause issues with misdetecting DSS registers as the hardware revision numbers can have duplicates.
To avoid this, let's standardize on using -ENODEV also for the quirks instead of -1. That way we can always just test for a match without adding any more complicated logic.
--- drivers/bus/ti-sysc.c | 120 ++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 63 deletions(-)
drivers/bus/ti-sysc.c +57 -63
@@ -1231,16 +1231,16 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { SYSC_QUIRK_LEGACY_IDLE),SYSC_QUIRK ("sham" ,0 ,0x100 ,0x110 ,0x114 ,0x40000c03 ,0xffffffff ,SYSC_QUIRK_LEGACY_IDLE ), -SYSC_QUIRK ("smartreflex" ,0 ,-1 ,0x24 ,-1 ,0x00000000 ,0xffffffff , +SYSC_QUIRK ("smartreflex" ,0 , -ENODEV ,0x24 , -ENODEV ,0x00000000 ,0xffffffff ,SYSC_QUIRK_LEGACY_IDLE ), -SYSC_QUIRK ("smartreflex" ,0 ,-1 ,0x38 ,-1 ,0x00000000 ,0xffffffff , +SYSC_QUIRK ("smartreflex" ,0 , -ENODEV ,0x38 , -ENODEV ,0x00000000 ,0xffffffff ,SYSC_QUIRK_LEGACY_IDLE ),SYSC_QUIRK ("timer" ,0 ,0 ,0x10 ,0x14 ,0x00000015 ,0xffffffff ,0 ),/* Some timers on omap4 and later */ -SYSC_QUIRK ("timer" ,0 ,0 ,0x10 ,-1 ,0x50002100 ,0xffffffff , +SYSC_QUIRK ("timer" ,0 ,0 ,0x10 , -ENODEV ,0x50002100 ,0xffffffff ,0 ), -SYSC_QUIRK ("timer" ,0 ,0 ,0x10 ,-1 ,0x4fff1301 ,0xffff00ff , +SYSC_QUIRK ("timer" ,0 ,0 ,0x10 , -ENODEV ,0x4fff1301 ,0xffff00ff ,0 ),SYSC_QUIRK ("uart" ,0 ,0x50 ,0x54 ,0x58 ,0x00000046 ,0xffffffff , SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
@@ -1253,18 +1253,18 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),/* Quirks that need to be set based on the module address */ -SYSC_QUIRK ("mcpdm" ,0x40132000 ,0 ,0x10 ,-1 ,0x50000800 ,0xffffffff , +SYSC_QUIRK ("mcpdm" ,0x40132000 ,0 ,0x10 , -ENODEV ,0x50000800 ,0xffffffff ,SYSC_QUIRK_EXT_OPT_CLOCK |SYSC_QUIRK_NO_RESET_ON_INIT |SYSC_QUIRK_SWSUP_SIDLE ),/* Quirks that need to be set based on detected module */ -SYSC_QUIRK ("aess" ,0 ,0 ,0x10 ,-1 ,0x40000000 ,0xffffffff , +SYSC_QUIRK ("aess" ,0 ,0 ,0x10 , -ENODEV ,0x40000000 ,0xffffffff ,SYSC_MODULE_QUIRK_AESS ), -SYSC_QUIRK ("dcan" ,0x48480000 ,0x20 ,-1 ,-1 ,0xa3170504 ,0xffffffff , +SYSC_QUIRK ("dcan" ,0x48480000 ,0x20 , -ENODEV , -ENODEV ,0xa3170504 ,0xffffffff ,SYSC_QUIRK_CLKDM_NOAUTO ), -SYSC_QUIRK ("dwc3" ,0x48880000 ,0 ,0x10 ,-1 ,0x500a0200 ,0xffffffff , +SYSC_QUIRK ("dwc3" ,0x48880000 ,0 ,0x10 , -ENODEV ,0x500a0200 ,0xffffffff ,SYSC_QUIRK_CLKDM_NOAUTO ), -SYSC_QUIRK ("dwc3" ,0x488c0000 ,0 ,0x10 ,-1 ,0x500a0200 ,0xffffffff , +SYSC_QUIRK ("dwc3" ,0x488c0000 ,0 ,0x10 , -ENODEV ,0x500a0200 ,0xffffffff ,SYSC_QUIRK_CLKDM_NOAUTO ),SYSC_QUIRK ("hdq1w" ,0 ,0 ,0x14 ,0x18 ,0x00000006 ,0xffffffff , SYSC_MODULE_QUIRK_HDQ1W),
@@ -1278,12 +1278,12 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { SYSC_MODULE_QUIRK_I2C),SYSC_QUIRK ("i2c" ,0 ,0 ,0x10 ,0x90 ,0x5040000a ,0xfffff0f0 ,SYSC_MODULE_QUIRK_I2C ), -SYSC_QUIRK ("gpu" ,0x50000000 ,0x14 ,-1 ,-1 ,0x00010201 ,0xffffffff ,0 ), -SYSC_QUIRK ("gpu" ,0x50000000 ,0xfe00 ,0xfe10 ,-1 ,0x40000000 ,0xffffffff , +SYSC_QUIRK ("gpu" ,0x50000000 ,0x14 , -ENODEV , -ENODEV ,0x00010201 ,0xffffffff ,0 ), +SYSC_QUIRK ("gpu" ,0x50000000 ,0xfe00 ,0xfe10 , -ENODEV ,0x40000000 ,0xffffffff ,SYSC_MODULE_QUIRK_SGX ),SYSC_QUIRK ("usb_otg_hs" ,0 ,0x400 ,0x404 ,0x408 ,0x00000050 ,0xffffffff ,SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY ), -SYSC_QUIRK ("usb_otg_hs" ,0 ,0 ,0x10 ,-1 ,0x4ea2080d ,0xffffffff , +SYSC_QUIRK ("usb_otg_hs" ,0 ,0 ,0x10 , -ENODEV ,0x4ea2080d ,0xffffffff ,SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY ),SYSC_QUIRK ("wdt" ,0 ,0 ,0x10 ,0x14 ,0x502a0500 ,0xfffff0f0 , SYSC_MODULE_QUIRK_WDT),
@@ -1292,57 +1292,57 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { SYSC_MODULE_QUIRK_WDT | SYSC_QUIRK_SWSUP_SIDLE),#ifdef DEBUG -SYSC_QUIRK ("adc" ,0 ,0 ,0x10 ,-1 ,0x47300001 ,0xffffffff ,0 ), -SYSC_QUIRK ("atl" ,0 ,0 ,-1 ,-1 ,0x0a070100 ,0xffffffff ,0 ), -SYSC_QUIRK ("cm" ,0 ,0 ,-1 ,-1 ,0x40000301 ,0xffffffff ,0 ), -SYSC_QUIRK ("control" ,0 ,0 ,0x10 ,-1 ,0x40000900 ,0xffffffff ,0 ), +SYSC_QUIRK ("adc" ,0 ,0 ,0x10 , -ENODEV ,0x47300001 ,0xffffffff ,0 ), +SYSC_QUIRK ("atl" ,0 ,0 , -ENODEV , -ENODEV ,0x0a070100 ,0xffffffff ,0 ), +SYSC_QUIRK ("cm" ,0 ,0 , -ENODEV , -ENODEV ,0x40000301 ,0xffffffff ,0 ), +SYSC_QUIRK ("control" ,0 ,0 ,0x10 , -ENODEV ,0x40000900 ,0xffffffff ,0 ),SYSC_QUIRK ("cpgmac" ,0 ,0x1200 ,0x1208 ,0x1204 ,0x4edb1902 ,0xffff00f0 ,0 ), -SYSC_QUIRK ("dcan" ,0 ,0x20 ,-1 ,-1 ,0xa3170504 ,0xffffffff ,0 ), -SYSC_QUIRK ("dcan" ,0 ,0x20 ,-1 ,-1 ,0x4edb1902 ,0xffffffff ,0 ), -SYSC_QUIRK ("dmic" ,0 ,0 ,0x10 ,-1 ,0x50010000 ,0xffffffff ,0 ), -SYSC_QUIRK ("dwc3" ,0 ,0 ,0x10 ,-1 ,0x500a0200 ,0xffffffff ,0 ), +SYSC_QUIRK ("dcan" ,0 ,0x20 , -ENODEV , -ENODEV ,0xa3170504 ,0xffffffff ,0 ), +SYSC_QUIRK ("dcan" ,0 ,0x20 , -ENODEV , -ENODEV ,0x4edb1902 ,0xffffffff ,0 ), +SYSC_QUIRK ("dmic" ,0 ,0 ,0x10 , -ENODEV ,0x50010000 ,0xffffffff ,0 ), +SYSC_QUIRK ("dwc3" ,0 ,0 ,0x10 , -ENODEV ,0x500a0200 ,0xffffffff ,0 ),SYSC_QUIRK ("d2d" ,0x4a0b6000 ,0 ,0x10 ,0x14 ,0x00000010 ,0xffffffff ,0 ),SYSC_QUIRK ("d2d" ,0x4a0cd000 ,0 ,0x10 ,0x14 ,0x00000010 ,0xffffffff ,0 ), -SYSC_QUIRK ("epwmss" ,0 ,0 ,0x4 ,-1 ,0x47400001 ,0xffffffff ,0 ), -SYSC_QUIRK ("gpu" ,0 ,0x1fc00 ,0x1fc10 ,-1 ,0 ,0 ,0 ), -SYSC_QUIRK ("gpu" ,0 ,0xfe00 ,0xfe10 ,-1 ,0x40000000 ,0xffffffff ,0 ), +SYSC_QUIRK ("epwmss" ,0 ,0 ,0x4 , -ENODEV ,0x47400001 ,0xffffffff ,0 ), +SYSC_QUIRK ("gpu" ,0 ,0x1fc00 ,0x1fc10 , -ENODEV ,0 ,0 ,0 ), +SYSC_QUIRK ("gpu" ,0 ,0xfe00 ,0xfe10 , -ENODEV ,0x40000000 ,0xffffffff ,0 ),SYSC_QUIRK ("hsi" ,0 ,0 ,0x10 ,0x14 ,0x50043101 ,0xffffffff ,0 ), -SYSC_QUIRK ("iss" ,0 ,0 ,0x10 ,-1 ,0x40000101 ,0xffffffff ,0 ), -SYSC_QUIRK ("lcdc" ,0 ,0 ,0x54 ,-1 ,0x4f201000 ,0xffffffff ,0 ), -SYSC_QUIRK ("mcasp" ,0 ,0 ,0x4 ,-1 ,0x44306302 ,0xffffffff ,0 ), -SYSC_QUIRK ("mcasp" ,0 ,0 ,0x4 ,-1 ,0x44307b02 ,0xffffffff ,0 ), -SYSC_QUIRK ("mcbsp" ,0 ,-1 ,0x8c ,-1 ,0 ,0 ,0 ), -SYSC_QUIRK ("mcspi" ,0 ,0 ,0x10 ,-1 ,0x40300a0b ,0xffff00ff ,0 ), +SYSC_QUIRK ("iss" ,0 ,0 ,0x10 , -ENODEV ,0x40000101 ,0xffffffff ,0 ), +SYSC_QUIRK ("lcdc" ,0 ,0 ,0x54 , -ENODEV ,0x4f201000 ,0xffffffff ,0 ), +SYSC_QUIRK ("mcasp" ,0 ,0 ,0x4 , -ENODEV ,0x44306302 ,0xffffffff ,0 ), +SYSC_QUIRK ("mcasp" ,0 ,0 ,0x4 , -ENODEV ,0x44307b02 ,0xffffffff ,0 ), +SYSC_QUIRK ("mcbsp" ,0 , -ENODEV ,0x8c , -ENODEV ,0 ,0 ,0 ), +SYSC_QUIRK ("mcspi" ,0 ,0 ,0x10 , -ENODEV ,0x40300a0b ,0xffff00ff ,0 ),SYSC_QUIRK ("mcspi" ,0 ,0 ,0x110 ,0x114 ,0x40300a0b ,0xffffffff ,0 ), -SYSC_QUIRK ("mailbox" ,0 ,0 ,0x10 ,-1 ,0x00000400 ,0xffffffff ,0 ), -SYSC_QUIRK ("m3" ,0 ,0 ,-1 ,-1 ,0x5f580105 ,0x0fff0f00 ,0 ), +SYSC_QUIRK ("mailbox" ,0 ,0 ,0x10 , -ENODEV ,0x00000400 ,0xffffffff ,0 ), +SYSC_QUIRK ("m3" ,0 ,0 , -ENODEV , -ENODEV ,0x5f580105 ,0x0fff0f00 ,0 ),SYSC_QUIRK ("ocp2scp" ,0 ,0 ,0x10 ,0x14 ,0x50060005 ,0xfffffff0 ,0 ), -SYSC_QUIRK ("ocp2scp" ,0 ,0 ,-1 ,-1 ,0x50060007 ,0xffffffff ,0 ), -SYSC_QUIRK ("padconf" ,0 ,0 ,0x10 ,-1 ,0x4fff0800 ,0xffffffff ,0 ), -SYSC_QUIRK ("padconf" ,0 ,0 ,-1 ,-1 ,0x40001100 ,0xffffffff ,0 ), -SYSC_QUIRK ("prcm" ,0 ,0 ,-1 ,-1 ,0x40000100 ,0xffffffff ,0 ), -SYSC_QUIRK ("prcm" ,0 ,0 ,-1 ,-1 ,0x00004102 ,0xffffffff ,0 ), -SYSC_QUIRK ("prcm" ,0 ,0 ,-1 ,-1 ,0x40000400 ,0xffffffff ,0 ), -SYSC_QUIRK ("scm" ,0 ,0 ,0x10 ,-1 ,0x40000900 ,0xffffffff ,0 ), -SYSC_QUIRK ("scm" ,0 ,0 ,-1 ,-1 ,0x4e8b0100 ,0xffffffff ,0 ), -SYSC_QUIRK ("scm" ,0 ,0 ,-1 ,-1 ,0x4f000100 ,0xffffffff ,0 ), -SYSC_QUIRK ("scm" ,0 ,0 ,-1 ,-1 ,0x40000900 ,0xffffffff ,0 ), -SYSC_QUIRK ("scrm" ,0 ,0 ,-1 ,-1 ,0x00000010 ,0xffffffff ,0 ), -SYSC_QUIRK ("sdio" ,0 ,0 ,0x10 ,-1 ,0x40202301 ,0xffff0ff0 ,0 ), +SYSC_QUIRK ("ocp2scp" ,0 ,0 , -ENODEV , -ENODEV ,0x50060007 ,0xffffffff ,0 ), +SYSC_QUIRK ("padconf" ,0 ,0 ,0x10 , -ENODEV ,0x4fff0800 ,0xffffffff ,0 ), +SYSC_QUIRK ("padconf" ,0 ,0 , -ENODEV , -ENODEV ,0x40001100 ,0xffffffff ,0 ), +SYSC_QUIRK ("prcm" ,0 ,0 , -ENODEV , -ENODEV ,0x40000100 ,0xffffffff ,0 ), +SYSC_QUIRK ("prcm" ,0 ,0 , -ENODEV , -ENODEV ,0x00004102 ,0xffffffff ,0 ), +SYSC_QUIRK ("prcm" ,0 ,0 , -ENODEV , -ENODEV ,0x40000400 ,0xffffffff ,0 ), +SYSC_QUIRK ("scm" ,0 ,0 ,0x10 , -ENODEV ,0x40000900 ,0xffffffff ,0 ), +SYSC_QUIRK ("scm" ,0 ,0 , -ENODEV , -ENODEV ,0x4e8b0100 ,0xffffffff ,0 ), +SYSC_QUIRK ("scm" ,0 ,0 , -ENODEV , -ENODEV ,0x4f000100 ,0xffffffff ,0 ), +SYSC_QUIRK ("scm" ,0 ,0 , -ENODEV , -ENODEV ,0x40000900 ,0xffffffff ,0 ), +SYSC_QUIRK ("scrm" ,0 ,0 , -ENODEV , -ENODEV ,0x00000010 ,0xffffffff ,0 ), +SYSC_QUIRK ("sdio" ,0 ,0 ,0x10 , -ENODEV ,0x40202301 ,0xffff0ff0 ,0 ),SYSC_QUIRK ("sdio" ,0 ,0x2fc ,0x110 ,0x114 ,0x31010000 ,0xffffffff ,0 ),SYSC_QUIRK ("sdma" ,0 ,0 ,0x2c ,0x28 ,0x00010900 ,0xffffffff ,0 ), -SYSC_QUIRK ("slimbus" ,0 ,0 ,0x10 ,-1 ,0x40000902 ,0xffffffff ,0 ), -SYSC_QUIRK ("slimbus" ,0 ,0 ,0x10 ,-1 ,0x40002903 ,0xffffffff ,0 ), -SYSC_QUIRK ("spinlock" ,0 ,0 ,0x10 ,-1 ,0x50020000 ,0xffffffff ,0 ), -SYSC_QUIRK ("rng" ,0 ,0x1fe0 ,0x1fe4 ,-1 ,0x00000020 ,0xffffffff ,0 ), -SYSC_QUIRK ("rtc" ,0 ,0x74 ,0x78 ,-1 ,0x4eb01908 ,0xffff00f0 ,0 ), -SYSC_QUIRK ("timer32k" ,0 ,0 ,0x4 ,-1 ,0x00000060 ,0xffffffff ,0 ), +SYSC_QUIRK ("slimbus" ,0 ,0 ,0x10 , -ENODEV ,0x40000902 ,0xffffffff ,0 ), +SYSC_QUIRK ("slimbus" ,0 ,0 ,0x10 , -ENODEV ,0x40002903 ,0xffffffff ,0 ), +SYSC_QUIRK ("spinlock" ,0 ,0 ,0x10 , -ENODEV ,0x50020000 ,0xffffffff ,0 ), +SYSC_QUIRK ("rng" ,0 ,0x1fe0 ,0x1fe4 , -ENODEV ,0x00000020 ,0xffffffff ,0 ), +SYSC_QUIRK ("rtc" ,0 ,0x74 ,0x78 , -ENODEV ,0x4eb01908 ,0xffff00f0 ,0 ), +SYSC_QUIRK ("timer32k" ,0 ,0 ,0x4 , -ENODEV ,0x00000060 ,0xffffffff ,0 ),SYSC_QUIRK ("usbhstll" ,0 ,0 ,0x10 ,0x14 ,0x00000004 ,0xffffffff ,0 ),SYSC_QUIRK ("usbhstll" ,0 ,0 ,0x10 ,0x14 ,0x00000008 ,0xffffffff ,0 ),SYSC_QUIRK ("usb_host_hs" ,0 ,0 ,0x10 ,0x14 ,0x50700100 ,0xffffffff ,0 ), -SYSC_QUIRK ("usb_host_hs" ,0 ,0 ,0x10 ,-1 ,0x50700101 ,0xffffffff ,0 ), - SYSC_QUIRK("vfpe", 0, 0, 0x104, -1, 0x4d001200, 0xffffffff, 0), +SYSC_QUIRK ("usb_host_hs" ,0 ,0 ,0x10 , -ENODEV ,0x50700101 ,0xffffffff ,0 ), + SYSC_QUIRK("vfpe", 0, 0, 0x104, -ENODEV, 0x4d001200, 0xffffffff, 0), #endif };
@@ -1364,16 +1364,13 @@ static void sysc_init_early_quirks(struct sysc *ddata)if (q->base != ddata->module_pa)continue ; -if (q->rev_offset >=0 && - q->rev_offset != ddata->offsets[SYSC_REVISION ]) +if (q->rev_offset != ddata->offsets[SYSC_REVISION ])continue ; -if (q->sysc_offset >=0 && - q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG ]) +if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG ])continue ; -if (q->syss_offset >=0 && - q->syss_offset != ddata->offsets[SYSC_SYSSTATUS ]) +if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS ])continue ; ddata->name = q->name;
@@ -1393,16 +1390,13 @@ static void sysc_init_revision_quirks(struct sysc *ddata)if (q->base && q->base != ddata->module_pa)continue ; -if (q->rev_offset >=0 && - q->rev_offset != ddata->offsets[SYSC_REVISION ]) +if (q->rev_offset != ddata->offsets[SYSC_REVISION ])continue ; -if (q->sysc_offset >=0 && - q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG ]) +if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG ])continue ; -if (q->syss_offset >=0 && - q->syss_offset != ddata->offsets[SYSC_SYSSTATUS ]) +if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS ])continue ; if (q->revision == ddata->revision ||
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 76/215 bus: ti-sysc: Handle module unlock quirk needed for some RTC
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit e8639e1c986a8a9d0f94549170f6db579376c3ae ]
The RTC modules on am3 and am4 need quirk handling to unlock and lock them for reset so let's add the quirk handling based on what we already have for legacy platform data. In later patches we will simply drop the RTC related platform data and the old quirk handling.
--- drivers/bus/ti-sysc.c | 74 ++++++++++++++++++++++++--- include/linux/platform_data/ti-sysc.h | 1 + 2 files changed, 69 insertions(+), 6 deletions(-)
drivers/bus/ti-sysc.c +68 -6
@@ -75,6 +75,8 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {* @reset_done_quirk: module specific reset done quirk * @module_enable_quirk: module specific enable quirk * @module_disable_quirk: module specific disable quirk +* @module_unlock_quirk: module specific sysconfig unlock quirk +* @module_lock_quirk: module specific sysconfig lock quirk */ struct sysc {struct device *dev;
@@ -102,6 +104,8 @@ struct sysc {void (*reset_done_quirk)(struct sysc *sysc);void (*module_enable_quirk)(struct sysc *sysc);void (*module_disable_quirk)(struct sysc *sysc); +void (*module_unlock_quirk)(struct sysc *sysc); +void (*module_lock_quirk)(struct sysc *sysc); }; static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
@@ -863,6 +867,22 @@ static void sysc_show_registers(struct sysc *ddata) buf); } +/** +* sysc_write_sysconfig - handle sysconfig quirks for register write +* @ddata: device driver data +* @value: register value +*/ +static void sysc_write_sysconfig (struct sysc *ddata,u32 value) +{ +if (ddata->module_unlock_quirk) + ddata->module_unlock_quirk (ddata); + +sysc_write (ddata, ddata->offsets[SYSC_SYSCONFIG ], value); + +if (ddata->module_lock_quirk) + ddata->module_lock_quirk (ddata); +} +#define SYSC_IDLE_MASK (SYSC_NR_IDLEMODES - 1)#define SYSC_CLOCACT_ICK 2
@@ -912,7 +932,7 @@ static int sysc_enable_module(struct device *dev) reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift); reg |= best_mode << regbits->sidle_shift; -sysc_write (ddata, ddata->offsets[SYSC_SYSCONFIG ], reg); +sysc_write_sysconfig (ddata, reg); set_midle:/* Set MIDLE mode */
@@ -931,14 +951,14 @@ set_midle: reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); reg |= best_mode << regbits->midle_shift; -sysc_write (ddata, ddata->offsets[SYSC_SYSCONFIG ], reg); +sysc_write_sysconfig (ddata, reg); set_autoidle:/* Autoidle bit must enabled separately if available */ if (regbits->autoidle_shift >=0 && ddata->cfg.sysc_val &BIT (regbits->autoidle_shift)) { reg |=1 << regbits->autoidle_shift; -sysc_write (ddata, ddata->offsets[SYSC_SYSCONFIG ], reg); +sysc_write_sysconfig (ddata, reg); }/* Flush posted write */
@@ -999,7 +1019,7 @@ static int sysc_disable_module(struct device *dev) reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); reg |= best_mode << regbits->midle_shift; -sysc_write (ddata, ddata->offsets[SYSC_SYSCONFIG ], reg); +sysc_write_sysconfig (ddata, reg); set_sidle:/* Set SIDLE mode */
@@ -1022,7 +1042,7 @@ set_sidle:if (regbits->autoidle_shift >=0 && ddata->cfg.sysc_val &BIT (regbits->autoidle_shift)) reg |=1 << regbits->autoidle_shift; -sysc_write (ddata, ddata->offsets[SYSC_SYSCONFIG ], reg); +sysc_write_sysconfig (ddata, reg);/* Flush posted write */ sysc_read (ddata, ddata->offsets[SYSC_SYSCONFIG ]);
@@ -1281,6 +1301,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {SYSC_QUIRK ("gpu" ,0x50000000 ,0x14 , -ENODEV , -ENODEV ,0x00010201 ,0xffffffff ,0 ),SYSC_QUIRK ("gpu" ,0x50000000 ,0xfe00 ,0xfe10 , -ENODEV ,0x40000000 ,0xffffffff ,SYSC_MODULE_QUIRK_SGX ), +SYSC_QUIRK ("rtc" ,0 ,0x74 ,0x78 , -ENODEV ,0x4eb01908 ,0xffff00f0 , +SYSC_MODULE_QUIRK_RTC_UNLOCK ),SYSC_QUIRK ("usb_otg_hs" ,0 ,0x400 ,0x404 ,0x408 ,0x00000050 ,0xffffffff ,SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY ), SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -ENODEV, 0x4ea2080d, 0xffffffff,
@@ -1336,7 +1358,6 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {SYSC_QUIRK ("slimbus" ,0 ,0 ,0x10 , -ENODEV ,0x40002903 ,0xffffffff ,0 ),SYSC_QUIRK ("spinlock" ,0 ,0 ,0x10 , -ENODEV ,0x50020000 ,0xffffffff ,0 ),SYSC_QUIRK ("rng" ,0 ,0x1fe0 ,0x1fe4 , -ENODEV ,0x00000020 ,0xffffffff ,0 ), -SYSC_QUIRK ("rtc" ,0 ,0x74 ,0x78 , -ENODEV ,0x4eb01908 ,0xffff00f0 ,0 ),SYSC_QUIRK ("timer32k" ,0 ,0 ,0x4 , -ENODEV ,0x00000060 ,0xffffffff ,0 ),SYSC_QUIRK ("usbhstll" ,0 ,0 ,0x10 ,0x14 ,0x00000004 ,0xffffffff ,0 ), SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000008, 0xffffffff, 0),
@@ -1458,6 +1479,40 @@ static void sysc_post_reset_quirk_i2c(struct sysc *ddata)sysc_clk_quirk_i2c (ddata, true); } +/* RTC on am3 and 4 needs to be unlocked and locked for sysconfig */ +static void sysc_quirk_rtc (struct sysc *ddata,bool lock) +{ +u32 val, kick0_val =0 , kick1_val =0 ; +unsigned long flags; +int error; + +if (!lock) { + kick0_val =0x83e70b13 ; + kick1_val =0x95a4f1e0 ; + } + +local_irq_save (flags); +/* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */ + error =readl_poll_timeout (ddata->module_va +0x44 , val, + !(val &BIT (0 )),100 ,50 ); +if (error) +dev_warn (ddata->dev,"rtc busy timeout\n" ); +/* Now we have ~15 microseconds to read/write various registers */ +sysc_write (ddata,0x6c , kick0_val); +sysc_write (ddata,0x70 , kick1_val); +local_irq_restore (flags); +} + +static void sysc_module_unlock_quirk_rtc (struct sysc *ddata) +{ +sysc_quirk_rtc (ddata, false); +} + +static void sysc_module_lock_quirk_rtc (struct sysc *ddata) +{ +sysc_quirk_rtc (ddata, true); +} +/* 36xx SGX needs a quirk for to bypass OCP IPG interrupt logic */ static void sysc_module_enable_quirk_sgx (struct sysc *ddata) {
@@ -1512,6 +1567,13 @@ static void sysc_init_module_quirks(struct sysc *ddata)if (ddata->cfg.quirks &SYSC_MODULE_QUIRK_AESS ) ddata->module_enable_quirk = sysc_module_enable_quirk_aess; +if (ddata->cfg.quirks &SYSC_MODULE_QUIRK_RTC_UNLOCK ) { + ddata->module_unlock_quirk = sysc_module_unlock_quirk_rtc; + ddata->module_lock_quirk = sysc_module_lock_quirk_rtc; + +return ; + } +if (ddata->cfg.quirks &SYSC_MODULE_QUIRK_SGX ) ddata->module_enable_quirk = sysc_module_enable_quirk_sgx;
include/linux/platform_data/ti-sysc.h +1 -0
@@ -49,6 +49,7 @@ struct sysc_regbits {s8 emufree_shift; }; +#define SYSC_MODULE_QUIRK_RTC_UNLOCK BIT(22)#define SYSC_QUIRK_CLKDM_NOAUTO BIT(21)#define SYSC_QUIRK_FORCE_MSTANDBY BIT(20)#define SYSC_MODULE_QUIRK_AESS BIT(19)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 77/215 bus: ti-sysc: Detect display subsystem related devices
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 77dfece2e6d8bedb6ecd4d61379ae3dc52f389bd ]
In order to prepare probing display subsystem (DSS) with ti-sysc interconnect target module driver and device tree data, let's detect DSS related modules.
We need to also add reset quirk handling for DSS, but until that's done, let's just enable the optional clock quirks for DSS and omap4 HDMI. The rest is just naming of modules if CONFIG_DEBUG is set.
--- drivers/bus/ti-sysc.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/bus/ti-sysc.c +19 -0
@@ -1282,10 +1282,18 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { SYSC_MODULE_QUIRK_AESS),SYSC_QUIRK ("dcan" ,0x48480000 ,0x20 , -ENODEV , -ENODEV ,0xa3170504 ,0xffffffff ,SYSC_QUIRK_CLKDM_NOAUTO ), +SYSC_QUIRK ("dss" ,0x4832a000 ,0 ,0x10 ,0x14 ,0x00000020 ,0xffffffff , +SYSC_QUIRK_OPT_CLKS_IN_RESET ), +SYSC_QUIRK ("dss" ,0x58000000 ,0 , -ENODEV ,0x14 ,0x00000040 ,0xffffffff , +SYSC_QUIRK_OPT_CLKS_IN_RESET ), +SYSC_QUIRK ("dss" ,0x58000000 ,0 , -ENODEV ,0x14 ,0x00000061 ,0xffffffff , +SYSC_QUIRK_OPT_CLKS_IN_RESET ),SYSC_QUIRK ("dwc3" ,0x48880000 ,0 ,0x10 , -ENODEV ,0x500a0200 ,0xffffffff ,SYSC_QUIRK_CLKDM_NOAUTO ),SYSC_QUIRK ("dwc3" ,0x488c0000 ,0 ,0x10 , -ENODEV ,0x500a0200 ,0xffffffff ,SYSC_QUIRK_CLKDM_NOAUTO ), +SYSC_QUIRK ("hdmi" ,0 ,0 ,0x10 , -ENODEV ,0x50030200 ,0xffffffff , +SYSC_QUIRK_OPT_CLKS_NEEDED ),SYSC_QUIRK ("hdq1w" ,0 ,0 ,0x14 ,0x18 ,0x00000006 ,0xffffffff ,SYSC_MODULE_QUIRK_HDQ1W ), SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff,
@@ -1322,13 +1330,21 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { 0xffff00f0, 0),SYSC_QUIRK ("dcan" ,0 ,0x20 , -ENODEV , -ENODEV ,0xa3170504 ,0xffffffff ,0 ),SYSC_QUIRK ("dcan" ,0 ,0x20 , -ENODEV , -ENODEV ,0x4edb1902 ,0xffffffff ,0 ), +SYSC_QUIRK ("dispc" ,0x4832a400 ,0 ,0x10 ,0x14 ,0x00000030 ,0xffffffff ,0 ), +SYSC_QUIRK ("dispc" ,0x58001000 ,0 ,0x10 ,0x14 ,0x00000040 ,0xffffffff ,0 ), +SYSC_QUIRK ("dispc" ,0x58001000 ,0 ,0x10 ,0x14 ,0x00000051 ,0xffffffff ,0 ),SYSC_QUIRK ("dmic" ,0 ,0 ,0x10 , -ENODEV ,0x50010000 ,0xffffffff ,0 ), +SYSC_QUIRK ("dsi" ,0x58004000 ,0 ,0x10 ,0x14 ,0x00000030 ,0xffffffff ,0 ), +SYSC_QUIRK ("dsi" ,0x58005000 ,0 ,0x10 ,0x14 ,0x00000030 ,0xffffffff ,0 ), +SYSC_QUIRK ("dsi" ,0x58005000 ,0 ,0x10 ,0x14 ,0x00000040 ,0xffffffff ,0 ), +SYSC_QUIRK ("dsi" ,0x58009000 ,0 ,0x10 ,0x14 ,0x00000040 ,0xffffffff ,0 ),SYSC_QUIRK ("dwc3" ,0 ,0 ,0x10 , -ENODEV ,0x500a0200 ,0xffffffff ,0 ),SYSC_QUIRK ("d2d" ,0x4a0b6000 ,0 ,0x10 ,0x14 ,0x00000010 ,0xffffffff ,0 ),SYSC_QUIRK ("d2d" ,0x4a0cd000 ,0 ,0x10 ,0x14 ,0x00000010 ,0xffffffff ,0 ),SYSC_QUIRK ("epwmss" ,0 ,0 ,0x4 , -ENODEV ,0x47400001 ,0xffffffff ,0 ),SYSC_QUIRK ("gpu" ,0 ,0x1fc00 ,0x1fc10 , -ENODEV ,0 ,0 ,0 ),SYSC_QUIRK ("gpu" ,0 ,0xfe00 ,0xfe10 , -ENODEV ,0x40000000 ,0xffffffff ,0 ), +SYSC_QUIRK ("hdmi" ,0 ,0 ,0x10 , -ENODEV ,0x50031d00 ,0xffffffff ,0 ),SYSC_QUIRK ("hsi" ,0 ,0 ,0x10 ,0x14 ,0x50043101 ,0xffffffff ,0 ),SYSC_QUIRK ("iss" ,0 ,0 ,0x10 , -ENODEV ,0x40000101 ,0xffffffff ,0 ), SYSC_QUIRK("lcdc", 0, 0, 0x54, -ENODEV, 0x4f201000, 0xffffffff, 0),
@@ -1346,6 +1362,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {SYSC_QUIRK ("prcm" ,0 ,0 , -ENODEV , -ENODEV ,0x40000100 ,0xffffffff ,0 ),SYSC_QUIRK ("prcm" ,0 ,0 , -ENODEV , -ENODEV ,0x00004102 ,0xffffffff ,0 ),SYSC_QUIRK ("prcm" ,0 ,0 , -ENODEV , -ENODEV ,0x40000400 ,0xffffffff ,0 ), +SYSC_QUIRK ("rfbi" ,0x4832a800 ,0 ,0x10 ,0x14 ,0x00000010 ,0xffffffff ,0 ), +SYSC_QUIRK ("rfbi" ,0x58002000 ,0 ,0x10 ,0x14 ,0x00000010 ,0xffffffff ,0 ),SYSC_QUIRK ("scm" ,0 ,0 ,0x10 , -ENODEV ,0x40000900 ,0xffffffff ,0 ),SYSC_QUIRK ("scm" ,0 ,0 , -ENODEV , -ENODEV ,0x4e8b0100 ,0xffffffff ,0 ), SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4f000100, 0xffffffff, 0),
@@ -1363,6 +1381,7 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {SYSC_QUIRK ("usbhstll" ,0 ,0 ,0x10 ,0x14 ,0x00000008 ,0xffffffff ,0 ),SYSC_QUIRK ("usb_host_hs" ,0 ,0 ,0x10 ,0x14 ,0x50700100 ,0xffffffff ,0 ),SYSC_QUIRK ("usb_host_hs" ,0 ,0 ,0x10 , -ENODEV ,0x50700101 ,0xffffffff ,0 ), +SYSC_QUIRK ("venc" ,0x58003000 ,0 , -ENODEV , -ENODEV ,0x00000002 ,0xffffffff ,0 ), SYSC_QUIRK("vfpe", 0, 0, 0x104, -ENODEV, 0x4d001200, 0xffffffff, 0), #endif };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 78/215 arm64: dts: g12-common: add parkmode_disable_ss_quirk on DWC3 controller
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
[ Upstream commit a81bcfb6ac20cdd2e8dec3da14c8bbe1d18f6321 ]
When high load on the DWC3 SuperSpeed port, the controller crashes with:
[ 221.141621] xhci-hcd xhci-hcd.0.auto: xHCI host not responding to stop endpoint command. [ 221.157631] xhci-hcd xhci-hcd.0.auto: Host halt failed, -110 [ 221.157635] xhci-hcd xhci-hcd.0.auto: xHCI host controller not responding, assume dead [ 221.159901] xhci-hcd xhci-hcd.0.auto: xHCI host not responding to stop endpoint command. [ 221.159961] hub 2-1.1:1.0: hub_ext_port_status failed (err = -22) [ 221.160076] xhci-hcd xhci-hcd.0.auto: HC died; cleaning up [ 221.165946] usb 2-1.1-port1: cannot reset (err = -22)
Setting the parkmode_disable_ss_quirk quirk fixes the issue.
--- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +1 -0
@@ -2381,6 +2381,7 @@ dr_mode = "host"; snps,dis_u2_susphy_quirk; snps,quirk-frame-length-adjustment; + snps,parkmode-disable-ss-quirk; }; };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 79/215 bus: ti-sysc: Detect EDMA and set quirk flags for tptc
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 25bfaaa73c7d26a6e897559c510d7daff5e9d22d ]
In order to probe EDMA with ti-sysc interconnect target module and with device tree data, we need to properly detect EDMA and set the flags for SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY for tptc.
We have these flags currently set for am4 and dra7, but not for am335x. Let's set them for all the SoCs as the tptc module should behave the same for all of them. It's likely that am335x was never tested to idle EDMA tptc.
--- drivers/bus/ti-sysc.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/bus/ti-sysc.c +5 -0
@@ -1311,6 +1311,10 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { SYSC_MODULE_QUIRK_SGX),SYSC_QUIRK ("rtc" ,0 ,0x74 ,0x78 , -ENODEV ,0x4eb01908 ,0xffff00f0 ,SYSC_MODULE_QUIRK_RTC_UNLOCK ), +SYSC_QUIRK ("tptc" ,0 ,0 ,0x10 , -ENODEV ,0x40006c00 ,0xffffefff , +SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY ), +SYSC_QUIRK ("tptc" ,0 ,0 , -ENODEV , -ENODEV ,0x40007c00 ,0xffffffff , +SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY ),SYSC_QUIRK ("usb_otg_hs" ,0 ,0x400 ,0x404 ,0x408 ,0x00000050 ,0xffffffff ,SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY ), SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -ENODEV, 0x4ea2080d, 0xffffffff,
@@ -1377,6 +1381,7 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {SYSC_QUIRK ("spinlock" ,0 ,0 ,0x10 , -ENODEV ,0x50020000 ,0xffffffff ,0 ),SYSC_QUIRK ("rng" ,0 ,0x1fe0 ,0x1fe4 , -ENODEV ,0x00000020 ,0xffffffff ,0 ),SYSC_QUIRK ("timer32k" ,0 ,0 ,0x4 , -ENODEV ,0x00000060 ,0xffffffff ,0 ), +SYSC_QUIRK ("tpcc" ,0 ,0 , -ENODEV , -ENODEV ,0x40014c00 ,0xffffffff ,0 ),SYSC_QUIRK ("usbhstll" ,0 ,0 ,0x10 ,0x14 ,0x00000004 ,0xffffffff ,0 ),SYSC_QUIRK ("usbhstll" ,0 ,0 ,0x10 ,0x14 ,0x00000008 ,0xffffffff ,0 ), SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, 0x14, 0x50700100, 0xffffffff, 0),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 80/215 ALSA: usb-audio: Add support for MOTU MicroBook IIc
In reply to Greg Kroah-HartmanFrom: Alexander Tsoy <[email protected]>
[ Upstream commit 2edb84e3047b93da2f2b234219cdc304df042d9e ]
MicroBook IIc operates in UAC2 mode by default. This patch addresses several issues with it:
- MicroBook II and IIc shares the same USB ID. We can distinguish them by interface class.
- MaxPacketsOnly attribute is erroneously set in endpoint descriptors. As a result this card produces noise with all sample rates other than 96 KHz. This also causes issues like IOMMU page faults and other problems with host controller.
- Sample rate changes takes more than 2 seconds for this device. Clock validity request returns false during that period, so the clock validity quirk is required.
--- sound/usb/clock.c | 59 ++++++++++++++++++++++++++++++++-------- sound/usb/pcm.c | 7 ++++- sound/usb/quirks-table.h | 2 +- sound/usb/quirks.c | 18 +++++++++++- 4 files changed, 72 insertions(+), 14 deletions(-)
sound/usb/clock.c +48 -11
@@ -151,16 +151,15 @@ static int uac_clock_selector_set_val(struct snd_usb_audio *chip, int selector_ireturn ret; } -/* -* Assume the clock is valid if clock source supports only one single sample -* rate, the terminal is connected directly to it (there is no clock selector) -* and clock type is internal. This is to deal with some Denon DJ controllers -* that always reports that clock is invalid. -*/ static bool uac_clock_source_is_valid_quirk (struct snd_usb_audio *chip,struct audioformat *fmt,int source_id) { +bool ret = false; +int count; +unsigned char data; +struct usb_device *dev = chip->dev; +if (fmt->protocol ==UAC_VERSION_2 ) {struct uac_clock_source_descriptor *cs_desc =snd_usb_find_clock_source (chip->ctrl_intf, source_id);
@@ -168,13 +167,51 @@ static bool uac_clock_source_is_valid_quirk(struct snd_usb_audio *chip,if (!cs_desc)return false; -return (fmt->nr_rates ==1 && - (fmt->clock &0xff ) == cs_desc->bClockID && - (cs_desc->bmAttributes &0x3 ) != -UAC_CLOCK_SOURCE_TYPE_EXT ); +/* +* Assume the clock is valid if clock source supports only one +* single sample rate, the terminal is connected directly to it +* (there is no clock selector) and clock type is internal. +* This is to deal with some Denon DJ controllers that always +* reports that clock is invalid. +*/ +if (fmt->nr_rates ==1 && + (fmt->clock &0xff ) == cs_desc->bClockID && + (cs_desc->bmAttributes &0x3 ) != +UAC_CLOCK_SOURCE_TYPE_EXT ) +return true; + } + +/* +* MOTU MicroBook IIc +* Sample rate changes takes more than 2 seconds for this device. Clock +* validity request returns false during that period. +*/ +if (chip->usb_id ==USB_ID (0x07fd ,0x0004 )) { + count =0 ; + +while ((!ret) && (count <50 )) { +int err; + +msleep (100 ); + + err =snd_usb_ctl_msg (dev,usb_rcvctrlpipe (dev,0 ),UAC2_CS_CUR , +USB_TYPE_CLASS |USB_RECIP_INTERFACE |USB_DIR_IN , +UAC2_CS_CONTROL_CLOCK_VALID <<8 , +snd_usb_ctrl_intf (chip) | (source_id <<8 ), + &data,sizeof (data)); +if (err <0 ) { +dev_warn (&dev->dev, +"%s(): cannot get clock validity for id %d\n" , + __func__, source_id); +return false; + } + + ret = !!data; + count++; + } } -return false; +return ret; } static bool uac_clock_source_is_valid(struct snd_usb_audio *chip,
sound/usb/pcm.c +6 -1
@@ -344,7 +344,12 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, ep =0x81 ; ifnum =1 ; goto add_sync_ep_from_ifnum; -case USB_ID (0x07fd ,0x0004 ):/* MOTU MicroBook II */ +case USB_ID (0x07fd ,0x0004 ):/* MOTU MicroBook II/IIc */ +/* MicroBook IIc */ +if (altsd->bInterfaceClass ==USB_CLASS_AUDIO ) +return 0 ; + +/* MicroBook II */ ep =0x84 ; ifnum =0 ; goto add_sync_ep_from_ifnum;
sound/usb/quirks-table.h +1 -1
@@ -3492,7 +3492,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), },/* MOTU Microbook II */ { - USB_DEVICE(0x07fd, 0x0004), + USB_DEVICE_VENDOR_SPEC(0x07fd, 0x0004), .driver_info = (unsigned long ) &(const struct snd_usb_audio_quirk ) { .vendor_name ="MOTU" , .product_name ="MicroBookII" ,
sound/usb/quirks.c +17 -1
@@ -1316,7 +1316,15 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev,case USB_ID (0x2466 ,0x8010 ):/* Fractal Audio Axe-Fx 3 */ return snd_usb_axefx3_boot_quirk (dev);case USB_ID (0x07fd ,0x0004 ):/* MOTU MicroBook II */ -return snd_usb_motu_microbookii_boot_quirk (dev); +/* +* For some reason interface 3 with vendor-spec class is +* detected on MicroBook IIc. +*/ +if (get_iface_desc (intf->altsetting)->bInterfaceClass == +USB_CLASS_VENDOR_SPEC && +get_iface_desc (intf->altsetting)->bInterfaceNumber <3 ) +return snd_usb_motu_microbookii_boot_quirk (dev); +break ; }return 0 ;
@@ -1764,5 +1772,13 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,else fp->ep_attr |=USB_ENDPOINT_SYNC_SYNC ;break ; +case USB_ID (0x07fd ,0x0004 ):/* MOTU MicroBook IIc */ +/* +* MaxPacketsOnly attribute is erroneously set in endpoint +* descriptors. As a result this card produces noise with +* all sample rates other than 96 KHz. +*/ + fp->attributes &= ~UAC_EP_CS_ATTR_FILL_MAX ; +break ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 81/215 Input: goodix - fix touch coordinates on Cube I15-TC
In reply to Greg Kroah-HartmanFrom: Sergei A. Trusov <[email protected]>
[ Upstream commit 1dd5ddc125b4625c3beb8e644ae872445d739bbc ]
The touchscreen on the Cube I15-TC don't match the default display, with 0,0 touches being reported when touching at the top-right of the screen.
Add a quirk to invert the x coordinate.
--- drivers/input/touchscreen/goodix.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/input/touchscreen/goodix.c +22 -0
@@ -168,6 +168,22 @@ static const struct dmi_system_id nine_bytes_report[] = { {} }; +/* +* Those tablets have their x coordinate inverted +*/ +static const struct dmi_system_id inverted_x_screen[] = { +#if defined(CONFIG_DMI) && defined(CONFIG_X86) + { + .ident ="Cube I15-TC" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Cube" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"I15-TC" ) + }, + }, +#endif + {} +}; +/** * goodix_i2c_read - read data from a register of the i2c slave device. *
@@ -780,6 +796,12 @@ static int goodix_configure_dev(struct goodix_ts_data *ts) "Non-standard 9-bytes report format quirk\n"); } +if (dmi_check_system (inverted_x_screen)) { + ts->prop.invert_x = true; +dev_dbg (&ts->client->dev, +"Applying 'inverted x screen' quirk\n" ); + } + error =input_mt_init_slots (ts->input_dev, ts->max_touch_num,INPUT_MT_DIRECT |INPUT_MT_DROP_UNUSED );if (error) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 82/215 ALSA: usb-audio: Create a registration quirk for Kingston HyperX Amp (0951:16d8)
In reply to Greg Kroah-HartmanFrom: Chris Wulff <[email protected]>
[ Upstream commit 55f7326170d9e83e2d828591938e1101982a679c ]
Create a quirk that allows special processing and/or skipping the call to snd_card_register.
For HyperX AMP, which uses two interfaces, but only has a capture stream in the second, this allows the capture stream to merge with the first PCM.
--- sound/usb/card.c | 12 ++++++++---- sound/usb/quirks.c | 14 ++++++++++++++ sound/usb/quirks.h | 3 +++ 3 files changed, 25 insertions(+), 4 deletions(-)
sound/usb/card.c +8 -4
@@ -659,10 +659,14 @@ static int usb_audio_probe(struct usb_interface *intf, goto __error; } -/* we are allowed to call snd_card_register() many times */ - err =snd_card_register (chip->card); -if (err <0 ) - goto __error; +/* we are allowed to call snd_card_register() many times, but first +* check to see if a device needs to skip it or do anything special +*/ +if (snd_usb_registration_quirk (chip, ifnum) ==0 ) { + err =snd_card_register (chip->card); +if (err <0 ) + goto __error; + }if (quirk && quirk->shares_media_device) {/* don't want to fail when snd_media_device_create() fails */
sound/usb/quirks.c +14 -0
@@ -1782,3 +1782,17 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,break ; } } + +int snd_usb_registration_quirk (struct snd_usb_audio *chip, +int iface) +{ +switch (chip->usb_id) { +case USB_ID (0x0951 ,0x16d8 ):/* Kingston HyperX AMP */ +/* Register only when we reach interface 2 so that streams can +* merge correctly into PCMs from interface 0 +*/ +return (iface !=2 ); + } +/* Register as normal */ +return 0 ; +}
sound/usb/quirks.h +3 -0
@@ -51,4 +51,7 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,struct audioformat *fp, int stream); +int snd_usb_registration_quirk (struct snd_usb_audio *chip, +int iface); +#endif /* __USBAUDIO_QUIRKS_H */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 83/215 doc: dt: bindings: usb: dwc3: Update entries for disabling SS instances in park mode
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
[ Upstream commit 3d157c28d2289edf0439e8308e8de3a06acaaf0e ]
This patch updates the documentation with the information related to the quirks that needs to be added for disabling all SuperSpeed XHCI instances in park mode.
--- Documentation/devicetree/bindings/usb/dwc3.txt | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/usb/dwc3.txt +2 -0
@@ -75,6 +75,8 @@ Optional properties: from P0 to P1/P2/P3 without delay. - snps,dis-tx-ipgap-linecheck-quirk: when set, disable u2mac linestate check during HS transmit. + - snps,parkmode-disable-ss-quirk: when set, all SuperSpeed bus instances in + park mode are disabled. - snps,dis_metastability_quirk: when set, disable metastability workaround. CAUTION: use only if you are absolutely sure of it. - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 84/215 mmc: sdhci: do not enable card detect interrupt for gpio cd type
In reply to Greg Kroah-HartmanFrom: Haibo Chen <[email protected]>
[ Upstream commit e65bb38824711559844ba932132f417bc5a355e2 ]
Except SDHCI_QUIRK_BROKEN_CARD_DETECTION and MMC_CAP_NONREMOVABLE, we also do not need to handle controller native card detect interrupt for gpio cd type.
If we wrong enabled the card detect interrupt for gpio case, it will cause a lot of unexpected card detect interrupts during data transfer which should not happen.
--- drivers/mmc/host/sdhci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/host/sdhci.c +1 -1
@@ -152,7 +152,7 @@ static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)u32 present;if ((host->quirks &SDHCI_QUIRK_BROKEN_CARD_DETECTION ) || - !mmc_card_is_removable (host->mmc)) + !mmc_card_is_removable (host->mmc) ||mmc_can_gpio_cd (host->mmc))return ;if (enable) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 85/215 ALSA: usb-audio: Rewrite registration quirk handling
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit d8695bc5b1fe88305396b1f788d3b5f218e28a30 ]
A slight refactoring of the registration quirk code. Now it uses the table lookup for easy additions in future. Also the return type was changed to bool, and got a few more comments.
--- sound/usb/card.c | 2 +- sound/usb/quirks.c | 40 ++++++++++++++++++++++++++++++---------- sound/usb/quirks.h | 3 +-- 3 files changed, 32 insertions(+), 13 deletions(-)
sound/usb/card.c +1 -1
@@ -662,7 +662,7 @@ static int usb_audio_probe(struct usb_interface *intf,/* we are allowed to call snd_card_register() many times, but first * check to see if a device needs to skip it or do anything special */ -if (snd_usb_registration_quirk (chip, ifnum) ==0 ) { +if (!snd_usb_registration_quirk (chip, ifnum)) { err =snd_card_register (chip->card);if (err <0 ) goto __error;
sound/usb/quirks.c +30 -10
@@ -1783,16 +1783,36 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip, } } -int snd_usb_registration_quirk (struct snd_usb_audio *chip, -int iface) +/* +* registration quirk: +* the registration is skipped if a device matches with the given ID, +* unless the interface reaches to the defined one. This is for delaying +* the registration until the last known interface, so that the card and +* devices appear at the same time. +*/ + +struct registration_quirk { +unsigned int usb_id;/* composed via USB_ID() */ +unsigned int interface;/* the interface to trigger register */ +}; + +#define REG_QUIRK_ENTRY (vendor, product, iface) \ + { .usb_id = USB_ID(vendor, product), .interface = (iface) } + +static const struct registration_quirk registration_quirks[] = { +REG_QUIRK_ENTRY (0x0951 ,0x16d8 ,2 ),/* Kingston HyperX AMP */ + {0 }/* terminator */ +}; + +/* return true if skipping registration */ +bool snd_usb_registration_quirk (struct snd_usb_audio *chip,int iface) { -switch (chip->usb_id) { -case USB_ID (0x0951 ,0x16d8 ):/* Kingston HyperX AMP */ -/* Register only when we reach interface 2 so that streams can -* merge correctly into PCMs from interface 0 -*/ -return (iface !=2 ); - } +const struct registration_quirk *q; + +for (q = registration_quirks; q->usb_id; q++) +if (chip->usb_id == q->usb_id) +return iface != q->interface; +/* Register as normal */ -return 0 ; +return false; }
sound/usb/quirks.h +1 -2
@@ -51,7 +51,6 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,struct audioformat *fp, int stream); -int snd_usb_registration_quirk (struct snd_usb_audio *chip, -int iface); +bool snd_usb_registration_quirk (struct snd_usb_audio *chip,int iface);#endif /* __USBAUDIO_QUIRKS_H */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 86/215 ACPI: video: Use native backlight on Acer Aspire 5783z
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 1c8fbc1f9bfb804ef2f0d4ee9397ab800e33f23a ]
The Acer Aspire 5783z shipped with Windows 7 and as such does not trigger our "win8 ready" heuristic for prefering the native backlight interface.
Still ACPI backlight control doesn't work on this model, where as the native (intel_video) backlight interface does work. Add a quirk to force using native backlight control on this model.
--- drivers/acpi/video_detect.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/acpi/video_detect.c +9 -0
@@ -336,6 +336,15 @@ static const struct dmi_system_id video_detect_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"), }, }, + { + .callback = video_detect_force_native, + .ident = "Acer Aspire 5738z", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"), + DMI_MATCH(DMI_BOARD_NAME, "JV50"), + }, + },/* * Desktops which falsely report a backlight and which our heuristics
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 87/215 ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Alpha S
In reply to Greg Kroah-HartmanFrom: Emmanuel Pescosta <[email protected]>
[ Upstream commit fd60e0683e8e9107e09cd2e4798f3e27e85d2705 ]
Similar to the Kingston HyperX AMP, the Kingston HyperX Cloud Alpha S (0951:16d8) uses two interfaces, but only the second interface contains the capture stream. This patch delays the registration until the second interface appears.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1801,6 +1801,7 @@ struct registration_quirk {static const struct registration_quirk registration_quirks[] = {REG_QUIRK_ENTRY (0x0951 ,0x16d8 ,2 ),/* Kingston HyperX AMP */ +REG_QUIRK_ENTRY (0x0951 ,0x16ed ,2 ),/* Kingston HyperX Cloud Alpha S */ {0 }/* terminator */ };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 88/215 ALSA: usb-audio: Add quirk for Focusrite Scarlett 2i2
In reply to Greg Kroah-HartmanFrom: Gregor Pintar <[email protected]>
[ Upstream commit 6f4ea2074ddf689ac6f892afa58515032dabf2e4 ]
Force it to use asynchronous playback.
Same quirk has already been added for Focusrite Scarlett Solo (2nd gen) with a commit 46f5710f0b88 ("ALSA: usb-audio: Add quirk for Focusrite Scarlett Solo").
This also seems to prevent regular clicks when playing at 44100Hz on Scarlett 2i2 (2nd gen). I did not notice any side effects.
Moved both quirks to snd_usb_audioformat_attributes_quirk() as suggested.
--- sound/usb/quirks-table.h | 84 ---------------------------------------- sound/usb/quirks.c | 13 +++++++ 2 files changed, 13 insertions(+), 84 deletions(-)
sound/usb/quirks-table.h +0 -84
@@ -2776,90 +2776,6 @@ YAMAHA_DEVICE(0x7010, "UB99"), .type = QUIRK_MIDI_NOVATION } }, -{ -/* -* Focusrite Scarlett Solo 2nd generation -* Reports that playback should use Synch: Synchronous -* while still providing a feedback endpoint. Synchronous causes -* snapping on some sample rates. -* Force it to use Synch: Asynchronous. -*/ - USB_DEVICE(0x1235, 0x8205), - .driver_info = (unsigned long ) & (const struct snd_usb_audio_quirk ) { - .ifnum =QUIRK_ANY_INTERFACE , - .type =QUIRK_COMPOSITE , - .data = (const struct snd_usb_audio_quirk []) { - { - .ifnum =1 , - .type =QUIRK_AUDIO_FIXED_ENDPOINT , - .data = & (const struct audioformat ) { - .formats =SNDRV_PCM_FMTBIT_S32_LE , - .channels =2 , - .iface =1 , - .altsetting =1 , - .altset_idx =1 , - .attributes =0 , - .endpoint =0x01 , - .ep_attr =USB_ENDPOINT_XFER_ISOC | -USB_ENDPOINT_SYNC_ASYNC , - .protocol =UAC_VERSION_2 , - .rates =SNDRV_PCM_RATE_44100 | -SNDRV_PCM_RATE_48000 | -SNDRV_PCM_RATE_88200 | -SNDRV_PCM_RATE_96000 | -SNDRV_PCM_RATE_176400 | -SNDRV_PCM_RATE_192000 , - .rate_min =44100 , - .rate_max =192000 , - .nr_rates =6 , - .rate_table = (unsigned int []) { -44100 ,48000 ,88200 , -96000 ,176400 ,192000 - }, - .clock =41 - } - }, - { - .ifnum =2 , - .type =QUIRK_AUDIO_FIXED_ENDPOINT , - .data = & (const struct audioformat ) { - .formats =SNDRV_PCM_FMTBIT_S32_LE , - .channels =2 , - .iface =2 , - .altsetting =1 , - .altset_idx =1 , - .attributes =0 , - .endpoint =0x82 , - .ep_attr =USB_ENDPOINT_XFER_ISOC | -USB_ENDPOINT_SYNC_ASYNC | -USB_ENDPOINT_USAGE_IMPLICIT_FB , - .protocol =UAC_VERSION_2 , - .rates =SNDRV_PCM_RATE_44100 | -SNDRV_PCM_RATE_48000 | -SNDRV_PCM_RATE_88200 | -SNDRV_PCM_RATE_96000 | -SNDRV_PCM_RATE_176400 | -SNDRV_PCM_RATE_192000 , - .rate_min =44100 , - .rate_max =192000 , - .nr_rates =6 , - .rate_table = (unsigned int []) { -44100 ,48000 ,88200 , -96000 ,176400 ,192000 - }, - .clock =41 - } - }, - { - .ifnum =3 , - .type =QUIRK_IGNORE_INTERFACE - }, - { - .ifnum =-1 - } - } - } -},/* Access Music devices */ {
sound/usb/quirks.c +13 -0
@@ -1780,6 +1780,19 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,*/ fp->attributes &= ~UAC_EP_CS_ATTR_FILL_MAX ;break ; +case USB_ID (0x1235 ,0x8202 ):/* Focusrite Scarlett 2i2 2nd gen */ +case USB_ID (0x1235 ,0x8205 ):/* Focusrite Scarlett Solo 2nd gen */ +/* +* Reports that playback should use Synch: Synchronous +* while still providing a feedback endpoint. +* Synchronous causes snapping on some sample rates. +* Force it to use Synch: Asynchronous. +*/ +if (stream ==SNDRV_PCM_STREAM_PLAYBACK ) { + fp->ep_attr &= ~USB_ENDPOINT_SYNCTYPE ; + fp->ep_attr |=USB_ENDPOINT_SYNC_ASYNC ; + } +break ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 89/215 Input: mms114 - add extra compatible for mms345l
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit 7842087b0196d674ed877d768de8f2a34d7fdc53 ]
MMS345L is another first generation touch screen from Melfas, which uses mostly the same registers as MMS152.
However, there is some garbage printed during initialization. Apparently MMS345L does not have the MMS152_COMPAT_GROUP register that is read+printed during initialization.
TSP FW Rev: bootloader 0x6 / core 0x26 / config 0x26, Compat group: \x06
On earlier kernel versions the compat group was actually printed as an ASCII control character, seems like it gets escaped now.
But we probably shouldn't print something from a random register.
Add a separate "melfas,mms345l" compatible that avoids reading from the MMS152_COMPAT_GROUP register. This might also help in case there is some other device-specific quirk in the future.
--- drivers/input/touchscreen/mms114.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/input/touchscreen/mms114.c +15 -2
@@ -54,6 +54,7 @@enum mms_type {TYPE_MMS114 =114 ,TYPE_MMS152 =152 , +TYPE_MMS345L =345 , };struct mms114_data {
@@ -250,6 +251,15 @@ static int mms114_get_version(struct mms114_data *data)int error;switch (data->type) { +case TYPE_MMS345L : + error =__mms114_read_reg (data,MMS152_FW_REV ,3 , buf); +if (error) +return error; + +dev_info (dev,"TSP FW Rev: bootloader 0x%x / core 0x%x / config 0x%x\n" , + buf[0 ], buf[1 ], buf[2 ]); +break ; +case TYPE_MMS152 : error =__mms114_read_reg (data,MMS152_FW_REV ,3 , buf);if (error)
@@ -287,8 +297,8 @@ static int mms114_setup_regs(struct mms114_data *data)if (error <0 )return error; -/* MMS152 has no configuration or power on registers */ -if (data->type ==TYPE_MMS152 ) +/* Only MMS114 has configuration and power on registers */ +if (data->type !=TYPE_MMS114 )return 0 ; error =mms114_set_active (data, true);
@@ -598,6 +608,9 @@ static const struct of_device_id mms114_dt_match[] = { }, { .compatible = "melfas,mms152", .data = (void *)TYPE_MMS152, + }, { + .compatible = "melfas,mms345l", + .data = (void *)TYPE_MMS345L, }, { } };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 90/215 ACPI: video: Use native backlight on Acer TravelMate 5735Z
In reply to Greg Kroah-HartmanFrom: Paul Menzel <[email protected]>
[ Upstream commit c41c36e900a337b4132b12ccabc97f5578248b44 ]
Currently, changing the brightness of the internal display of the Acer TravelMate 5735Z does not work. Pressing the function keys or changing the slider, GNOME Shell 3.36.2 displays the OSD (five steps), but the brightness does not change.
The Acer TravelMate 5735Z shipped with Windows 7 and as such does not trigger our "win8 ready" heuristic for preferring the native backlight interface.
Still ACPI backlight control doesn't work on this model, where as the native (intel_video) backlight interface does work by adding acpi_backlight=native or acpi_backlight=none to Linux’ command line.
So, add a quirk to force using native backlight control on this model.
--- drivers/acpi/video_detect.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/acpi/video_detect.c +10 -0
@@ -345,6 +345,16 @@ static const struct dmi_system_id video_detect_dmi_table[] = { DMI_MATCH(DMI_BOARD_NAME, "JV50"), }, }, + { + /* https://bugzilla.kernel.org/show_bug.cgi?id=207835 */ + .callback = video_detect_force_native, + .ident = "Acer TravelMate 5735Z", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5735Z"), + DMI_MATCH(DMI_BOARD_NAME, "BA51_MV"), + }, + },/* * Desktops which falsely report a backlight and which our heuristics
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 91/215 bus: ti-sysc: Use optional clocks on for enable and wait for softreset bit
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit d46f9fbec71997420e4fb83c04d9affdf423f879 ]
Some modules reset automatically when idled, and when re-enabled, we must wait for the automatic OCP softreset to complete. And if optional clocks are configured, we need to keep the clocks on while waiting for the reset to complete.
Let's fix the issue by moving the OCP softreset code to a separate function sysc_wait_softreset(), and call it also from sysc_enable_module() with the optional clocks enabled.
This is based on what we're already doing for legacy platform data booting in _enable_sysc().
--- drivers/bus/ti-sysc.c | 80 ++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 20 deletions(-)
drivers/bus/ti-sysc.c +60 -20
@@ -186,6 +186,35 @@ static u32 sysc_read_sysstatus(struct sysc *ddata)return sysc_read (ddata, offset); } +/* Poll on reset status */ +static int sysc_wait_softreset (struct sysc *ddata) +{ +u32 sysc_mask, syss_done, rstval; +int syss_offset, error =0 ; + + syss_offset = ddata->offsets[SYSC_SYSSTATUS ]; + sysc_mask =BIT (ddata->cap->regbits->srst_shift); + +if (ddata->cfg.quirks &SYSS_QUIRK_RESETDONE_INVERTED ) + syss_done =0 ; +else + syss_done = ddata->cfg.syss_mask; + +if (syss_offset >=0 ) { + error =readx_poll_timeout (sysc_read_sysstatus, ddata, rstval, + (rstval & ddata->cfg.syss_mask) == + syss_done, +100 ,MAX_MODULE_SOFTRESET_WAIT ); + + }else if (ddata->cfg.quirks &SYSC_QUIRK_RESET_STATUS ) { + error =readx_poll_timeout (sysc_read_sysconfig, ddata, rstval, + !(rstval & sysc_mask), +100 ,MAX_MODULE_SOFTRESET_WAIT ); + } + +return error; +} +static int sysc_add_named_clock_from_child (struct sysc *ddata,const char *name,const char *optfck_name)
@@ -892,8 +921,34 @@ static int sysc_enable_module(struct device *dev)struct sysc *ddata;const struct sysc_regbits *regbits;u32 reg, idlemodes, best_mode; +int error; ddata =dev_get_drvdata (dev); + +/* +* Some modules like DSS reset automatically on idle. Enable optional +* reset clocks and wait for OCP softreset to complete. +*/ +if (ddata->cfg.quirks &SYSC_QUIRK_OPT_CLKS_IN_RESET ) { + error =sysc_enable_opt_clocks (ddata); +if (error) { +dev_err (ddata->dev, +"Optional clocks failed for enable: %i\n" , + error); +return error; + } + } + error =sysc_wait_softreset (ddata); +if (error) +dev_warn (ddata->dev,"OCP softreset timed out\n" ); +if (ddata->cfg.quirks &SYSC_QUIRK_OPT_CLKS_IN_RESET ) +sysc_disable_opt_clocks (ddata); + +/* +* Some subsystem private interconnects, like DSS top level module, +* need only the automatic OCP softreset handling with no sysconfig +* register bits to configure. +*/ if (ddata->offsets[SYSC_SYSCONFIG ] == -ENODEV )return 0 ;
@@ -1691,11 +1746,10 @@ static int sysc_rstctrl_reset_deassert(struct sysc *ddata, bool reset)*/ static int sysc_reset (struct sysc *ddata) { -int sysc_offset, syss_offset, sysc_val, rstval, error =0 ; -u32 sysc_mask, syss_done; +int sysc_offset, sysc_val, error; +u32 sysc_mask; sysc_offset = ddata->offsets[SYSC_SYSCONFIG ]; - syss_offset = ddata->offsets[SYSC_SYSSTATUS ]; if (ddata->legacy_mode || sysc_offset < 0 || ddata->cap->regbits->srst_shift < 0 ||
@@ -1704,11 +1758,6 @@ static int sysc_reset(struct sysc *ddata) sysc_mask =BIT (ddata->cap->regbits->srst_shift); -if (ddata->cfg.quirks &SYSS_QUIRK_RESETDONE_INVERTED ) - syss_done =0 ; -else - syss_done = ddata->cfg.syss_mask; -if (ddata->pre_reset_quirk) ddata->pre_reset_quirk (ddata);
@@ -1723,18 +1772,9 @@ static int sysc_reset(struct sysc *ddata)if (ddata->post_reset_quirk) ddata->post_reset_quirk (ddata); -/* Poll on reset status */ -if (syss_offset >=0 ) { - error =readx_poll_timeout (sysc_read_sysstatus, ddata, rstval, - (rstval & ddata->cfg.syss_mask) == - syss_done, -100 ,MAX_MODULE_SOFTRESET_WAIT ); - - }else if (ddata->cfg.quirks &SYSC_QUIRK_RESET_STATUS ) { - error =readx_poll_timeout (sysc_read_sysconfig, ddata, rstval, - !(rstval & sysc_mask), -100 ,MAX_MODULE_SOFTRESET_WAIT ); - } + error =sysc_wait_softreset (ddata); +if (error) +dev_warn (ddata->dev,"OCP softreset timed out\n" );if (ddata->reset_done_quirk) ddata->reset_done_quirk (ddata);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 92/215 ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Flight S
In reply to Greg Kroah-HartmanFrom: Christoffer Nielsen <[email protected]>
[ Upstream commit 73094608b8e214952444fb104651704c98a37aeb ]
Similar to the Kingston HyperX AMP, the Kingston HyperX Cloud Alpha S (0951:0x16ea) uses two interfaces, but only the second interface contains the capture stream. This patch delays the registration until the second interface appears.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1815,6 +1815,7 @@ struct registration_quirk {static const struct registration_quirk registration_quirks[] = {REG_QUIRK_ENTRY (0x0951 ,0x16d8 ,2 ),/* Kingston HyperX AMP */ REG_QUIRK_ENTRY (0x0951 ,0x16ed ,2 ),/* Kingston HyperX Cloud Alpha S */ +REG_QUIRK_ENTRY (0x0951 ,0x16ea ,2 ),/* Kingston HyperX Cloud Flight S */ {0 }/* terminator */ };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 93/215 iio:health:afe4404 Fix timestamp alignment and prevent data leak.
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
[ Upstream commit f88ecccac4be348bbcc6d056bdbc622a8955c04d ]
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses a 40 byte array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data with alignment explicitly requested. This data is allocated with kzalloc so no data can leak appart from previous readings.
--- drivers/iio/health/afe4404.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/iio/health/afe4404.c +5 -3
@@ -83,6 +83,7 @@ static const struct reg_field afe4404_reg_fields[] = {* @regulator: Pointer to the regulator for the IC * @trig: IIO trigger for this device * @irq: ADC_RDY line interrupt number +* @buffer: Used to construct a scan to push to the iio buffer. */ struct afe4404_data {struct device *dev;
@@ -91,6 +92,7 @@ struct afe4404_data {struct regulator *regulator;struct iio_trigger *trig;int irq; +s32 buffer[10 ]__aligned(8) ; };enum afe4404_chan_id {
@@ -328,17 +330,17 @@ static irqreturn_t afe4404_trigger_handler(int irq, void *private)struct iio_dev *indio_dev = pf->indio_dev;struct afe4404_data *afe =iio_priv (indio_dev);int ret, bit, i =0 ; -s32 buffer[10 ];for_each_set_bit (bit, indio_dev->active_scan_mask, indio_dev->masklength) { ret =regmap_read (afe->regmap, afe4404_channel_values[bit], - &buffer[i++]); + &afe->buffer[i++]);if (ret) goto err; } -iio_push_to_buffers_with_timestamp (indio_dev, buffer, pf->timestamp); +iio_push_to_buffers_with_timestamp (indio_dev, afe->buffer, + pf->timestamp); err:iio_trigger_notify_done (indio_dev->trig);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 94/215 soundwire: intel: fix memory leak with devm_kasprintf
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit bf6d6e68d2028a2d82f4c106f50ec75cc1e6ef89 ]
The dais are allocated with devm_kcalloc() but their name isn't resourced managed and never freed. Fix by also using devm_ for the dai names as well.
--- drivers/soundwire/intel.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/soundwire/intel.c +3 -2
@@ -842,8 +842,9 @@ static int intel_create_dai(struct sdw_cdns *cdns,/* TODO: Read supported rates/formats from hardware */ for (i = off; i < (off + num); i++) { - dais[i].name =kasprintf (GFP_KERNEL ,"SDW%d Pin%d" , - cdns->instance, i); + dais[i].name =devm_kasprintf (cdns->dev,GFP_KERNEL , +"SDW%d Pin%d" , + cdns->instance, i);if (!dais[i].name)return -ENOMEM ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 95/215 dmaengine: sh: usb-dmac: set tx_result parameters
In reply to Greg Kroah-HartmanFrom: Yoshihiro Shimoda <[email protected]>
[ Upstream commit 466257d9968ac79575831250b039dc07566c7b13 ]
A client driver (renesas_usbhs) assumed that dmaengine_tx_status() could return the residue even if the transfer was completed. However, this was not correct usage [1] and this caused to break getting the residue after the commit 24461d9792c2 ("dmaengine: virt-dma: Fix access after free in vchan_complete()") actually. So, this is possible to get wrong received size if the usb controller gets a short packet. For example, g_zero driver causes "bad OUT byte" errors.
To use the tx_result from the renesas_usbhs driver when the transfer is completed, set the tx_result parameters.
Notes that the renesas_usbhs driver needs to update for it.
[1]
https://lore.kernel.org/dmaengine/20200616165550.GP2324254@vkoul-mobl/
--- drivers/dma/sh/usb-dmac.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/dma/sh/usb-dmac.c +2 -0
@@ -586,6 +586,8 @@ static void usb_dmac_isr_transfer_end(struct usb_dmac_chan *chan) desc->residue =usb_dmac_get_current_residue (chan, desc, desc->sg_index -1 ); desc->done_cookie = desc->vd.tx.cookie; + desc->vd.tx_result.result =DMA_TRANS_NOERROR ; + desc->vd.tx_result.residue = desc->residue;vchan_cookie_complete (&desc->vd);/* Restart the next transfer if this driver has a next desc */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 96/215 phy: sun4i-usb: fix dereference of pointer phy0 before it is null checked
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 38b1927e5bf9bcad4a2e33189ef1c5569f9599ba ]
Currently pointer phy0 is being dereferenced via the assignment of phy on the call to phy_get_drvdata before phy0 is null checked, this can lead to a null pointer dereference. Fix this by performing the null check on phy0 before the call to phy_get_drvdata. Also replace the phy0 == NULL check with the more usual !phy0 idiom.
Addresses-Coverity: ("Dereference before null check")
--- drivers/phy/allwinner/phy-sun4i-usb.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/phy/allwinner/phy-sun4i-usb.c +3 -2
@@ -545,13 +545,14 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)struct sun4i_usb_phy_data *data = container_of(work, struct sun4i_usb_phy_data, detect.work);struct phy *phy0 = data->phys[0 ].phy; -struct sun4i_usb_phy *phy =phy_get_drvdata (phy0); +struct sun4i_usb_phy *phy;bool force_session_end, id_notify = false, vbus_notify = false;int id_det, vbus_det; -if (phy0 ==NULL ) +if (!phy0)return ; + phy =phy_get_drvdata (phy0); id_det =sun4i_usb_phy0_get_id_det (data); vbus_det =sun4i_usb_phy0_get_vbus_det (data);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 97/215 arm64: dts: meson: add missing gxl rng clock
In reply to Greg Kroah-HartmanFrom: Jerome Brunet <[email protected]>
[ Upstream commit 95ca6f06dd4827ff63be5154120c7a8511cd9a41 ]
The peripheral clock of the RNG is missing for gxl while it is present for gxbb.
--- arch/arm64/boot/dts/amlogic/meson-gxl.dtsi | 5 +++++ 1 file changed, 5 insertions(+)
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +5 -0
@@ -288,6 +288,11 @@ clkc: clock-controller { }; }; +&hwrng { + clocks = <&clkc CLKID_RNG0>; + clock-names = "core"; +}; + &i2c_A { clocks = <&clkc CLKID_I2C>; };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 98/215 arm64: dts: meson-gxl-s805x: reduce initial Mali450 core frequency
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
[ Upstream commit b2037dafcf082cd24b88ae9283af628235df36e1 ]
When starting at 744MHz, the Mali 450 core crashes on S805X based boards:
lima d00c0000.gpu: IRQ ppmmu3 not found
lima d00c0000.gpu: IRQ ppmmu4 not found
lima d00c0000.gpu: IRQ ppmmu5 not found
lima d00c0000.gpu: IRQ ppmmu6 not found
lima d00c0000.gpu: IRQ ppmmu7 not found
Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.7.2+ #492 Hardware name: Libre Computer AML-S805X-AC (DT) pstate: 40000005 (nZcv daif -PAN -UAO) pc : lima_gp_init+0x28/0x188 ... Call trace: lima_gp_init+0x28/0x188 lima_device_init+0x334/0x534 lima_pdev_probe+0xa4/0xe4 ... Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
Reverting to a safer 666Mhz frequency on the S805X that doesn't use the GP0 PLL makes it more stable.
--- .../amlogic/meson-gxl-s805x-libretech-ac.dts | 2 +- .../boot/dts/amlogic/meson-gxl-s805x-p241.dts | 2 +- .../boot/dts/amlogic/meson-gxl-s805x.dtsi | 24 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi
arch/arm64/boot/dts/amlogic/meson-gxl-s805x-libretech-ac.dts +1 -1
@@ -9,7 +9,7 @@ #include <dt-bindings/input/input.h> -#include "meson-gxl-s905x.dtsi" +#include "meson-gxl-s805x.dtsi" / { compatible = "libretech,aml-s805x-ac", "amlogic,s805x",
arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts +1 -1
@@ -9,7 +9,7 @@ #include <dt-bindings/input/input.h> -#include "meson-gxl-s905x.dtsi" +#include "meson-gxl-s805x.dtsi" / { compatible = "amlogic,p241", "amlogic,s805x", "amlogic,meson-gxl";
arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi new file +24 -0
@@ -0,0 +1,24 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2020 BayLibre SAS + * Author: Neil Armstrong <[email protected]> + */ + +#include "meson-gxl-s905x.dtsi" + +/ { + compatible = "amlogic,s805x", "amlogic,meson-gxl"; +}; + +/* The S805X Package doesn't seem to handle the 744MHz OPP correctly */ +&mali { + assigned-clocks = <&clkc CLKID_MALI_0_SEL>, + <&clkc CLKID_MALI_0>, + <&clkc CLKID_MALI>; /* Glitch free mux */ + assigned-clock-parents = <&clkc CLKID_FCLK_DIV3>, + <0>, /* Do Nothing */ + <&clkc CLKID_MALI_0>; + assigned-clock-rates = <0>, /* Do Nothing */ + <666666666>, + <0>; /* Do Nothing */ +};
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 99/215 bus: ti-sysc: Fix wakeirq sleeping function called from invalid context
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 9f9113925018d500a95df539014d9ff11ac2c02d ]
With CONFIG_DEBUG_ATOMIC_SLEEP enabled we can see the following with wakeirqs and serial console idled:
BUG: sleeping function called from invalid context at drivers/bus/ti-sysc.c:242
...
(sysc_wait_softreset) from [<c0606894>] (sysc_enable_module+0x48/0x274) (sysc_enable_module) from [<c0606c5c>] (sysc_runtime_resume+0x19c/0x1d8) (sysc_runtime_resume) from [<c0606cf0>] (sysc_child_runtime_resume+0x58/0x84) (sysc_child_runtime_resume) from [<c06eb7bc>] (__rpm_callback+0x30/0x12c) (__rpm_callback) from [<c06eb8d8>] (rpm_callback+0x20/0x80) (rpm_callback) from [<c06eb434>] (rpm_resume+0x638/0x7fc) (rpm_resume) from [<c06eb658>] (__pm_runtime_resume+0x60/0x9c) (__pm_runtime_resume) from [<c06edc08>] (handle_threaded_wake_irq+0x24/0x60) (handle_threaded_wake_irq) from [<c01befec>] (irq_thread_fn+0x1c/0x78) (irq_thread_fn) from [<c01bf30c>] (irq_thread+0x140/0x26c)
We have __pm_runtime_resume() call the sysc_runtime_resume() with spinlock held and interrupts disabled.
--- drivers/bus/ti-sysc.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/bus/ti-sysc.c +6 -7
@@ -201,15 +201,14 @@ static int sysc_wait_softreset(struct sysc *ddata) syss_done = ddata->cfg.syss_mask;if (syss_offset >=0 ) { - error =readx_poll_timeout (sysc_read_sysstatus, ddata, rstval, - (rstval & ddata->cfg.syss_mask) == - syss_done, -100 ,MAX_MODULE_SOFTRESET_WAIT ); + error =readx_poll_timeout_atomic (sysc_read_sysstatus, ddata, + rstval, (rstval & ddata->cfg.syss_mask) == + syss_done,100 ,MAX_MODULE_SOFTRESET_WAIT ); }else if (ddata->cfg.quirks &SYSC_QUIRK_RESET_STATUS ) { - error =readx_poll_timeout (sysc_read_sysconfig, ddata, rstval, - !(rstval & sysc_mask), -100 ,MAX_MODULE_SOFTRESET_WAIT ); + error =readx_poll_timeout_atomic (sysc_read_sysconfig, ddata, + rstval, !(rstval & sysc_mask), +100 ,MAX_MODULE_SOFTRESET_WAIT ); }return error;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 100/215 bus: ti-sysc: Fix sleeping function called from invalid context for RTC quirk
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit afe6f1eeb08f85e57f0a02b71efb5a0839606aac ]
With CONFIG_DEBUG_ATOMIC_SLEEP enabled we can see the following with RTC probe:
BUG: sleeping function called from invalid context at drivers/bus/ti-sysc.c:1736
...
(sysc_quirk_rtc) from [<c060d01c>] (sysc_write_sysconfig+0x1c/0x60) (sysc_write_sysconfig) from [<c060d9f4>] (sysc_enable_module+0x11c/0x274) (sysc_enable_module) from [<c060f37c>] (sysc_probe+0xe9c/0x1380) (sysc_probe) from [<c06e9384>] (platform_drv_probe+0x48/0x98)
--- drivers/bus/ti-sysc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/bus/ti-sysc.c +2 -2
@@ -1571,8 +1571,8 @@ static void sysc_quirk_rtc(struct sysc *ddata, bool lock)local_irq_save (flags);/* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */ - error =readl_poll_timeout (ddata->module_va +0x44 , val, - !(val &BIT (0 )),100 ,50 ); + error =readl_poll_timeout_atomic (ddata->module_va +0x44 , val, + !(val &BIT (0 )),100 ,50 );if (error)dev_warn (ddata->dev,"rtc busy timeout\n" );/* Now we have ~15 microseconds to read/write various registers */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 101/215 bus: ti-sysc: Do not disable on suspend for no-idle
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit a55de412228cc5a2b4bf8d2a09849898102633e2 ]
If we have "ti,no-idle" specified for a module we must not disable the the module on suspend to keep things backwards compatible.
--- drivers/bus/ti-sysc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/bus/ti-sysc.c +4 -2
@@ -1245,7 +1245,8 @@ static int __maybe_unused sysc_noirq_suspend(struct device *dev) ddata =dev_get_drvdata (dev); -if (ddata->cfg.quirks &SYSC_QUIRK_LEGACY_IDLE ) +if (ddata->cfg.quirks & + (SYSC_QUIRK_LEGACY_IDLE |SYSC_QUIRK_NO_IDLE ))return 0 ;return pm_runtime_force_suspend (dev);
@@ -1257,7 +1258,8 @@ static int __maybe_unused sysc_noirq_resume(struct device *dev) ddata =dev_get_drvdata (dev); -if (ddata->cfg.quirks &SYSC_QUIRK_LEGACY_IDLE ) +if (ddata->cfg.quirks & + (SYSC_QUIRK_LEGACY_IDLE |SYSC_QUIRK_NO_IDLE ))return 0 ;return pm_runtime_force_resume (dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 102/215 iio: adc: ad7780: Fix a resource handling path in ad7780_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit b0536f9826a5ed3328d527b4fc1686867a9f3041 ]
If 'ad7780_init_gpios()' fails, we must not release some resources that have not been allocated yet. Return directly instead.
--- drivers/iio/adc/ad7780.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/ad7780.c +1 -1
@@ -309,7 +309,7 @@ static int ad7780_probe(struct spi_device *spi) ret =ad7780_init_gpios (&spi->dev, st);if (ret) - goto error_cleanup_buffer_and_trigger; +return ret; st->reg =devm_regulator_get (&spi->dev,"avdd" );if (IS_ERR (st->reg))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 103/215 dmaengine: dw: Initialize channel before each transfer
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 99ba8b9b0d9780e9937eb1d488d120e9e5c2533d ]
In some cases DMA can be used only with a consumer which does runtime power management and on the platforms, that have DMA auto power gating logic (see comments in the drivers/acpi/acpi_lpss.c), may result in DMA losing its context. Simple mitigation of this issue is to initialize channel each time the consumer initiates a transfer.
--- drivers/dma/dw/core.c | 12 ------------ 1 file changed, 12 deletions(-)
drivers/dma/dw/core.c +0 -12
@@ -118,16 +118,11 @@ static void dwc_initialize(struct dw_dma_chan *dwc) {struct dw_dma *dw =to_dw_dma (dwc->chan.device); -if (test_bit (DW_DMA_IS_INITIALIZED , &dwc->flags)) -return ; - dw->initialize_chan (dwc);/* Enable interrupts */ channel_set_bit (dw,MASK .XFER, dwc->mask);channel_set_bit (dw,MASK .ERROR, dwc->mask); - -set_bit (DW_DMA_IS_INITIALIZED , &dwc->flags); }/*----------------------------------------------------------------------*/
@@ -954,8 +949,6 @@ static void dwc_issue_pending(struct dma_chan *chan)void do_dw_dma_off (struct dw_dma *dw) { -unsigned int i; -dma_writel (dw,CFG ,0 );channel_clear_bit (dw,MASK .XFER, dw->all_chan_mask);
@@ -966,9 +959,6 @@ void do_dw_dma_off(struct dw_dma *dw)while (dma_readl (dw,CFG ) &DW_CFG_DMA_EN )cpu_relax (); - -for (i =0 ; i < dw->dma.chancnt; i++) -clear_bit (DW_DMA_IS_INITIALIZED , &dw->chan[i].flags); }void do_dw_dma_on (struct dw_dma *dw)
@@ -1032,8 +1022,6 @@ static void dwc_free_chan_resources(struct dma_chan *chan)/* Clear custom channel configuration */ memset (&dwc->dws,0 ,sizeof (struct dw_dma_slave )); -clear_bit (DW_DMA_IS_INITIALIZED , &dwc->flags); -/* Disable interrupts */ channel_clear_bit (dw,MASK .XFER, dwc->mask);channel_clear_bit (dw,MASK .BLOCK, dwc->mask);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 104/215 dmaengine: dmatest: stop completed threads when running without set channel
In reply to Greg Kroah-HartmanFrom: Peter Ujfalusi <[email protected]>
[ Upstream commit fd17d1abce426b4224a916a242b57be94272771b ]
The completed threads were not cleared and consequent run would result threads accumulating:
echo 800000 > /sys/module/dmatest/parameters/test_buf_size echo 2000 > /sys/module/dmatest/parameters/timeout echo 50 > /sys/module/dmatest/parameters/iterations echo 1 > /sys/module/dmatest/parameters/max_channels echo "" > /sys/module/dmatest/parameters/channel
[ 237.507265] dmatest: Added 1 threads using dma1chan2 echo 1 > /sys/module/dmatest/parameters/run [ 244.713360] dmatest: Started 1 threads using dma1chan2 [ 246.117680] dmatest: dma1chan2-copy0: summary 50 tests, 0 failures 2437.47 iops 977623 KB/s (0)
echo 1 > /sys/module/dmatest/parameters/run
[ 292.381471] dmatest: No channels configured, continue with any [ 292.389307] dmatest: Added 1 threads using dma1chan3 [ 292.394302] dmatest: Started 1 threads using dma1chan2 [ 292.399454] dmatest: Started 1 threads using dma1chan3 [ 293.800835] dmatest: dma1chan3-copy0: summary 50 tests, 0 failures 2624.53 iops 975014 KB/s (0)
echo 1 > /sys/module/dmatest/parameters/run
[ 307.301429] dmatest: No channels configured, continue with any [ 307.309212] dmatest: Added 1 threads using dma1chan4 [ 307.314197] dmatest: Started 1 threads using dma1chan2 [ 307.319343] dmatest: Started 1 threads using dma1chan3 [ 307.324492] dmatest: Started 1 threads using dma1chan4 [ 308.730773] dmatest: dma1chan4-copy0: summary 50 tests, 0 failures 2390.28 iops 965436 KB/s (0)
--- drivers/dma/dmatest.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/dma/dmatest.c +2 -0
@@ -1168,6 +1168,8 @@ static int dmatest_run_set(const char *val, const struct kernel_param *kp) }else if (dmatest_run) {if (!is_threaded_test_pending (info)) {pr_info ("No channels configured, continue with any\n" ); +if (!is_threaded_test_run (info)) +stop_threaded_test (info);add_threaded_test (info); }start_threaded_tests (info);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 105/215 spi: spi-sun6i: sun6i_spi_transfer_one(): fix setting of clock rate
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
[ Upstream commit ed7815db70d17b1741883f2da8e1d80bc2efe517 ]
A SPI transfer defines the _maximum_ speed of the SPI transfer. However the driver doesn't take into account that the clock divider is always rounded down (due to integer arithmetics). This results in a too high clock rate for the SPI transfer.
E.g.: with a mclk_rate of 24 MHz and a SPI transfer speed of 10 MHz, the original code calculates a reg of "0", which results in a effective divider of "2" and a 12 MHz clock for the SPI transfer.
This patch fixes the issue by using DIV_ROUND_UP() instead of a plain integer division.
While there simplify the divider calculation for the CDR1 case, use order_base_2() instead of two ilog2() calculations.
--- drivers/spi/spi-sun6i.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
drivers/spi/spi-sun6i.c +6 -8
@@ -198,7 +198,7 @@ static int sun6i_spi_transfer_one(struct spi_master *master, struct spi_transfer *tfr) {struct sun6i_spi *sspi =spi_master_get_devdata (master); -unsigned int mclk_rate, div, timeout; +unsigned int mclk_rate, div, div_cdr1, div_cdr2, timeout;unsigned int start, end, tx_time;unsigned int trig_level;unsigned int tx_len =0 ;
@@ -287,14 +287,12 @@ static int sun6i_spi_transfer_one(struct spi_master *master,* First try CDR2, and if we can't reach the expected * frequency, fall back to CDR1. */ - div = mclk_rate / (2 * tfr->speed_hz); -if (div <= (SUN6I_CLK_CTL_CDR2_MASK +1 )) { -if (div >0 ) - div--; - - reg =SUN6I_CLK_CTL_CDR2 (div) |SUN6I_CLK_CTL_DRS ; + div_cdr1 =DIV_ROUND_UP (mclk_rate, tfr->speed_hz); + div_cdr2 =DIV_ROUND_UP (div_cdr1,2 ); +if (div_cdr2 <= (SUN6I_CLK_CTL_CDR2_MASK +1 )) { + reg =SUN6I_CLK_CTL_CDR2 (div_cdr2 -1 ) |SUN6I_CLK_CTL_DRS ; }else { - div =ilog2 (mclk_rate) -ilog2 (tfr->speed_hz); + div =min (SUN6I_CLK_CTL_CDR1_MASK ,order_base_2 (div_cdr1)); reg =SUN6I_CLK_CTL_CDR1 (div); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 106/215 usb: gadget: udc: atmel: fix uninitialized read in debug printk
In reply to Greg Kroah-HartmanFrom: Michał Mirosław <[email protected]>
[ Upstream commit 30517ffeb3bff842e1355cbc32f1959d9dbb5414 ]
Fixed commit moved the assignment of 'req', but did not update a reference in the DBG() call. Use the argument as it was renamed.
--- drivers/usb/gadget/udc/atmel_usba_udc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/atmel_usba_udc.c +1 -1
@@ -870,7 +870,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)u32 status;DBG (DBG_GADGET |DBG_QUEUE ,"ep_dequeue: %s, req %p\n" , - ep->ep.name, req); + ep->ep.name, _req);spin_lock_irqsave (&udc->lock, flags);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 107/215 staging: comedi: verify array index is correct before using it
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit ef75e14a6c935eec82abac07ab68e388514e39bc ]
This code reads from the array before verifying that "trig" is a valid index. If the index is wildly out of bounds then reading from an invalid address could lead to an Oops.
--- drivers/staging/comedi/drivers/addi_apci_1500.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/staging/comedi/drivers/addi_apci_1500.c +7 -3
@@ -456,9 +456,9 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev,unsigned int lo_mask = data[5 ] << shift;unsigned int chan_mask = hi_mask | lo_mask;unsigned int old_mask = (1 << shift) -1 ; -unsigned int pm = devpriv->pm[trig] & old_mask; -unsigned int pt = devpriv->pt[trig] & old_mask; -unsigned int pp = devpriv->pp[trig] & old_mask; +unsigned int pm; +unsigned int pt; +unsigned int pp;if (trig >1 ) { dev_dbg(dev->class_dev,
@@ -471,6 +471,10 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev,return -EINVAL ; } + pm = devpriv->pm[trig] & old_mask; + pt = devpriv->pt[trig] & old_mask; + pp = devpriv->pp[trig] & old_mask; +switch (data[2 ]) {case COMEDI_DIGITAL_TRIG_DISABLE :/* clear trigger configuration */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 108/215 clk: mvebu: ARMADA_AP_CPU_CLK needs to select ARMADA_AP_CP_HELPER
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 8e3709d7e3a67e2d3f42bd1fc2052353a5678944 ]
When building arm32 allmodconfig:
ld.lld: error: undefined symbol: ap_cp_unique_name
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
referenced by
ap-cpu-clk.c
clk/mvebu/ap-cpu-clk.o:(ap_cpu_clock_probe) in archivedrivers/built-in.a
ap_cp_unique_name is only compiled into the kernel image when CONFIG_ARMADA_AP_CP_HELPER is selected (as it is not user selectable). However, CONFIG_ARMADA_AP_CPU_CLK does not select it.
This has been a problem since the driver was added to the kernel but it was not built before commit c318ea261749 ("cpufreq: ap806: fix cpufreq driver needs ap cpu clk") so it was never noticed.
--- drivers/clk/mvebu/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/clk/mvebu/Kconfig +1 -0
@@ -42,6 +42,7 @@ config ARMADA_AP806_SYSCON config ARMADA_AP_CPU_CLK bool + select ARMADA_AP_CP_HELPER config ARMADA_CP110_SYSCON bool
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 109/215 clk: AST2600: Add mux for EMMC clock
In reply to Greg Kroah-HartmanFrom: Eddie James <[email protected]>
[ Upstream commit c2407ab3bd55064d459bc822efd1c134e852798c ]
The EMMC clock can be derived from either the HPLL or the MPLL. Register a clock mux so that the rate is calculated correctly based upon the parent.
--- drivers/clk/clk-ast2600.c | 49 ++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 8 deletions(-)
drivers/clk/clk-ast2600.c +41 -8
@@ -130,6 +130,18 @@ static const struct clk_div_table ast2600_eclk_div_table[] = { { 0 } }; +static const struct clk_div_table ast2600_emmc_extclk_div_table[] = { + {0x0 ,2 }, + {0x1 ,4 }, + {0x2 ,6 }, + {0x3 ,8 }, + {0x4 ,10 }, + {0x5 ,12 }, + {0x6 ,14 }, + {0x7 ,16 }, + {0 } +}; +static const struct clk_div_table ast2600_mac_div_table[] = { {0x0 ,4 }, {0x1 ,4 },
@@ -389,6 +401,11 @@ static struct clk_hw *aspeed_g6_clk_hw_register_gate(struct device *dev,return hw; } +static const char *const emmc_extclk_parent_names[] = { +"emmc_extclk_hpll_in" , +"mpll" , +}; +static const char *const vclk_parent_names[] = {"dpll" ,"d1pll" ,
@@ -458,16 +475,32 @@ static int aspeed_g6_clk_probe(struct platform_device *pdev)return PTR_ERR (hw); aspeed_g6_clk_data->hws[ASPEED_CLK_UARTX ] = hw; -/* EMMC ext clock divider */ - hw =clk_hw_register_gate (dev,"emmc_extclk_gate" ,"hpll" ,0 , - scu_g6_base +ASPEED_G6_CLK_SELECTION1 ,15 ,0 , - &aspeed_g6_clk_lock); +/* EMMC ext clock */ + hw =clk_hw_register_fixed_factor (dev,"emmc_extclk_hpll_in" ,"hpll" , +0 ,1 ,2 );if (IS_ERR (hw))return PTR_ERR (hw); - hw =clk_hw_register_divider_table (dev,"emmc_extclk" ,"emmc_extclk_gate" ,0 , - scu_g6_base +ASPEED_G6_CLK_SELECTION1 ,12 ,3 ,0 , - ast2600_div_table, - &aspeed_g6_clk_lock); + + hw =clk_hw_register_mux (dev,"emmc_extclk_mux" , + emmc_extclk_parent_names, +ARRAY_SIZE (emmc_extclk_parent_names),0 , + scu_g6_base +ASPEED_G6_CLK_SELECTION1 ,11 ,1 , +0 , &aspeed_g6_clk_lock); +if (IS_ERR (hw)) +return PTR_ERR (hw); + + hw =clk_hw_register_gate (dev,"emmc_extclk_gate" ,"emmc_extclk_mux" , +0 , scu_g6_base +ASPEED_G6_CLK_SELECTION1 , +15 ,0 , &aspeed_g6_clk_lock); +if (IS_ERR (hw)) +return PTR_ERR (hw); + + hw =clk_hw_register_divider_table (dev,"emmc_extclk" , +"emmc_extclk_gate" ,0 , + scu_g6_base + +ASPEED_G6_CLK_SELECTION1 ,12 , +3 ,0 , ast2600_emmc_extclk_div_table, + &aspeed_g6_clk_lock);if (IS_ERR (hw))return PTR_ERR (hw); aspeed_g6_clk_data->hws[ASPEED_CLK_EMMC ] = hw;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 110/215 NFS: Fix interrupted slots by sending a solo SEQUENCE operation
In reply to Greg Kroah-HartmanFrom: Anna Schumaker <[email protected]>
[ Upstream commit 913fadc5b105c3619d9e8d0fe8899ff1593cc737 ]
We used to do this before 3453d5708b33, but this was changed to better handle the NFS4ERR_SEQ_MISORDERED error code. This commit fixed the slot re-use case when the server doesn't receive the interrupted operation, but if the server does receive the operation then it could still end up replying to the client with mis-matched operations from the reply cache.
We can fix this by sending a SEQUENCE to the server while recovering from a SEQ_MISORDERED error when we detect that we are in an interrupted slot situation.
--- fs/nfs/nfs4proc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
fs/nfs/nfs4proc.c +18 -2
@@ -774,6 +774,14 @@ static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, slot->seq_nr_last_acked = seqnr; } +static void nfs4_probe_sequence (struct nfs_client *client,const struct cred *cred, +struct nfs4_slot *slot) +{ +struct rpc_task *task =_nfs41_proc_sequence (client, cred, slot, true); +if (!IS_ERR (task)) +rpc_put_task_async (task); +} +static int nfs41_sequence_process (struct rpc_task *task,struct nfs4_sequence_res *res) {
@@ -790,6 +798,7 @@ static int nfs41_sequence_process(struct rpc_task *task, goto out; session = slot->table->session; + clp = session->clp;trace_nfs4_sequence_done (session, res);
@@ -804,7 +813,6 @@ static int nfs41_sequence_process(struct rpc_task *task,nfs4_slot_sequence_acked (slot, slot->seq_nr);/* Update the slot's sequence and clientid lease timer */ slot->seq_done =1 ; - clp = session->clp;do_renew_lease (clp, res->sr_timestamp);/* Check sequence flags */ nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags,
@@ -852,10 +860,18 @@ static int nfs41_sequence_process(struct rpc_task *task,/* * Were one or more calls using this slot interrupted? * If the server never received the request, then our -* transmitted slot sequence number may be too high. +* transmitted slot sequence number may be too high. However, +* if the server did receive the request then it might +* accidentally give us a reply with a mismatched operation. +* We can sort this out by sending a lone sequence operation +* to the server on the same slot. */ if ((s32)(slot->seq_nr - slot->seq_nr_last_acked) >1 ) { slot->seq_nr--; +if (task->tk_msg.rpc_proc != &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE ]) { +nfs4_probe_sequence (clp, task->tk_msg.rpc_cred, slot); + res->sr_slot =NULL ; + } goto retry_nowait; }/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 111/215 fuse: dont ignore errors from fuse_writepages_fill()
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit 7779b047a57f6824a43d0e1f70de2741b7426b9d ]
fuse_writepages() ignores some errors taken from fuse_writepages_fill() I believe it is a bug: if .writepages is called with WB_SYNC_ALL it should either guarantee that all data was successfully saved or return error.
--- fs/fuse/file.c | 2 -- 1 file changed, 2 deletions(-)
fs/fuse/file.c +0 -2
@@ -2148,10 +2148,8 @@ static int fuse_writepages(struct address_space *mapping, err =write_cache_pages (mapping, wbc, fuse_writepages_fill, &data);if (data.wpa) { -/* Ignore errors if we can write at least one page */ WARN_ON (!data.wpa->ia.ap.num_pages);fuse_writepages_send (&data); - err =0 ; }if (data.ff)fuse_file_put (data.ff, false, false);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 112/215 ARM: dts: Fix dcan driver probe failed on am437x platform
In reply to Greg Kroah-HartmanFrom: dillon min <[email protected]>
[ Upstream commit 2a4117df9b436a0e4c79d211284ab2097bcd00dc ]
Got following d_can probe errors with kernel 5.8-rc1 on am437x
[ 10.730822] CAN device driver interface Starting Wait for Network to be Configured... [ OK ] Reached target Network. [ 10.787363] c_can_platform 481cc000.can: probe failed [ 10.792484] c_can_platform: probe of 481cc000.can failed with error -2 [ 10.799457] c_can_platform 481d0000.can: probe failed [ 10.804617] c_can_platform: probe of 481d0000.can failed with error -2
actually, Tony has fixed this issue on am335x with the patch [3]
Since am437x has the same clock structure with am335x [1][2], so reuse the code from Tony Lindgren's patch [3] to fix it.
[1]: https://www.ti.com/lit/pdf/spruh73 Chapter-23, Figure 23-1. DCAN
Integration
[2]: https://www.ti.com/lit/pdf/spruhl7 Chapter-25, Figure 25-1. DCAN
Integration
[3]: commit 516f1117d0fb ("ARM: dts: Configure osc clock for d_can on
am335x")
--- arch/arm/boot/dts/am437x-l4.dtsi | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
arch/arm/boot/dts/am437x-l4.dtsi +10 -4
@@ -1576,8 +1576,9 @@ target-module@cc000 { /* 0x481cc000, ap 50 46.0 */ reg-names = "rev"; ti,hwmods = "d_can0"; /* Domains (P, C): per_pwrdm, l4ls_clkdm */ - clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>; - clock-names = "fck"; + clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>, + <&dcan0_fck>; + clock-names = "fck", "osc"; #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0xcc000 0x2000>;
@@ -1585,6 +1586,8 @@ target-module@cc000 { /* 0x481cc000, ap 50 46.0 */ dcan0: can@0 { compatible = "ti,am4372-d_can", "ti,am3352-d_can"; reg = <0x0 0x2000>; + clocks = <&dcan0_fck>; + clock-names = "fck"; syscon-raminit = <&scm_conf 0x644 0>; interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>; status = "disabled";
@@ -1597,8 +1600,9 @@ target-module@d0000 { /* 0x481d0000, ap 52 3a.0 */ reg-names = "rev"; ti,hwmods = "d_can1"; /* Domains (P, C): per_pwrdm, l4ls_clkdm */ - clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>; - clock-names = "fck"; + clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>, + <&dcan1_fck>; + clock-names = "fck", "osc"; #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0xd0000 0x2000>;
@@ -1606,6 +1610,8 @@ target-module@d0000 { /* 0x481d0000, ap 52 3a.0 */ dcan1: can@0 { compatible = "ti,am4372-d_can", "ti,am3352-d_can"; reg = <0x0 0x2000>; + clocks = <&dcan1_fck>; + clock-name = "fck"; syscon-raminit = <&scm_conf 0x644 1>; interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; status = "disabled";
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 113/215 Revert "thermal: mediatek: fix register index error"
In reply to Greg Kroah-HartmanFrom: Enric Balletbo i Serra <[email protected]>
[ Upstream commit a8f62f183021be389561570ab5f8c701a5e70298 ]
This reverts commit eb9aecd90d1a39601e91cd08b90d5fee51d321a6
The above patch is supposed to fix a register index error on mt2701. It is not clear if the problem solved is a hang or just an invalid value returned, my guess is the second. The patch introduces, though, a new hang on MT8173 device making them unusable. So, seems reasonable, revert the patch because introduces a worst issue.
The reason I send a revert instead of trying to fix the issue for MT8173 is because the information needed to fix the issue is in the datasheet and is not public. So I am not really able to fix it.
Fixes the following bug when CONFIG_MTK_THERMAL is set on MT8173 devices.
[ 2.222488] Unable to handle kernel paging request at virtual address ffff8000125f5001 [ 2.230421] Mem abort info: [ 2.233207] ESR = 0x96000021 [ 2.236261] EC = 0x25: DABT (current EL), IL = 32 bits [ 2.241571] SET = 0, FnV = 0 [ 2.244623] EA = 0, S1PTW = 0 [ 2.247762] Data abort info: [ 2.250640] ISV = 0, ISS = 0x00000021 [ 2.254473] CM = 0, WnR = 0 [ 2.257544] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000041850000 [ 2.264251] [ffff8000125f5001] pgd=000000013ffff003, pud=000000013fffe003, pmd=000000013fff9003, pte=006800001100b707 [ 2.274867] Internal error: Oops: 96000021 [#1] PREEMPT SMP [ 2.280432] Modules linked in: [ 2.283483] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.7.0-rc6+ #162 [ 2.289914] Hardware name: Google Elm (DT) [ 2.294003] pstate: 20000005 (nzCv daif -PAN -UAO) [ 2.298792] pc : mtk_read_temp+0xb8/0x1c8 [ 2.302793] lr : mtk_read_temp+0x7c/0x1c8 [ 2.306794] sp : ffff80001003b930 [ 2.310100] x29: ffff80001003b930 x28: 0000000000000000 [ 2.315404] x27: 0000000000000002 x26: ffff0000f9550b10 [ 2.320709] x25: ffff0000f9550a80 x24: 0000000000000090 [ 2.326014] x23: ffff80001003ba24 x22: 00000000610344c0 [ 2.331318] x21: 0000000000002710 x20: 00000000000001f4 [ 2.336622] x19: 0000000000030d40 x18: ffff800011742ec0 [ 2.341926] x17: 0000000000000001 x16: 0000000000000001 [ 2.347230] x15: ffffffffffffffff x14: ffffff0000000000 [ 2.352535] x13: ffffffffffffffff x12: 0000000000000028 [ 2.357839] x11: 0000000000000003 x10: ffff800011295ec8 [ 2.363143] x9 : 000000000000291b x8 : 0000000000000002 [ 2.368447] x7 : 00000000000000a8 x6 : 0000000000000004 [ 2.373751] x5 : 0000000000000000 x4 : ffff800011295cb0 [ 2.379055] x3 : 0000000000000002 x2 : ffff8000125f5001 [ 2.384359] x1 : 0000000000000001 x0 : ffff0000f9550a80 [ 2.389665] Call trace: [ 2.392105] mtk_read_temp+0xb8/0x1c8 [ 2.395760] of_thermal_get_temp+0x2c/0x40 [ 2.399849] thermal_zone_get_temp+0x78/0x160 [ 2.404198] thermal_zone_device_update.part.0+0x3c/0x1f8 [ 2.409589] thermal_zone_device_update+0x34/0x48 [ 2.414286] of_thermal_set_mode+0x58/0x88 [ 2.418375] thermal_zone_of_sensor_register+0x1a8/0x1d8 [ 2.423679] devm_thermal_zone_of_sensor_register+0x64/0xb0 [ 2.429242] mtk_thermal_probe+0x690/0x7d0 [ 2.433333] platform_drv_probe+0x5c/0xb0 [ 2.437335] really_probe+0xe4/0x448 [ 2.440901] driver_probe_device+0xe8/0x140 [ 2.445077] device_driver_attach+0x7c/0x88 [ 2.449252] __driver_attach+0xac/0x178 [ 2.453082] bus_for_each_dev+0x78/0xc8 [ 2.456909] driver_attach+0x2c/0x38 [ 2.460476] bus_add_driver+0x14c/0x230 [ 2.464304] driver_register+0x6c/0x128 [ 2.468131] __platform_driver_register+0x50/0x60 [ 2.472831] mtk_thermal_driver_init+0x24/0x30 [ 2.477268] do_one_initcall+0x50/0x298 [ 2.481098] kernel_init_freeable+0x1ec/0x264 [ 2.485450] kernel_init+0x1c/0x110 [ 2.488931] ret_from_fork+0x10/0x1c [ 2.492502] Code: f9401081 f9400402 b8a67821 8b010042 (b9400042) [ 2.498599] ---[ end trace e43e3105ed27dc99 ]--- [ 2.503367] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b [ 2.511020] SMP: stopping secondary CPUs [ 2.514941] Kernel Offset: disabled [ 2.518421] CPU features: 0x090002,25006005 [ 2.522595] Memory Limit: none [ 2.525644] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b ]--
--- drivers/thermal/mtk_thermal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/thermal/mtk_thermal.c +2 -4
@@ -594,8 +594,7 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)u32 raw;for (i =0 ; i < conf->bank_data[bank->id].num_sensors; i++) { - raw =readl (mt->thermal_base + - conf->msr[conf->bank_data[bank->id].sensors[i]]); + raw =readl (mt->thermal_base + conf->msr[i]); temp = raw_to_mcelsius(mt, conf->bank_data[bank->id].sensors[i],
@@ -736,8 +735,7 @@ static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num,for (i =0 ; i < conf->bank_data[num].num_sensors; i++)writel (conf->sensor_mux_values[conf->bank_data[num].sensors[i]], - mt->thermal_base + - conf->adcpnp[conf->bank_data[num].sensors[i]]); + mt->thermal_base + conf->adcpnp[i]);writel ((1 << conf->bank_data[num].num_sensors) -1 , controller_base +TEMP_MONCTL0 );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 114/215 xprtrdma: fix incorrect header size calculations
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 912288442cb2f431bf3c8cb097a5de83bc6dbac1 ]
Currently the header size calculations are using an assignment operator instead of a += operator when accumulating the header size leading to incorrect sizes. Fix this by using the correct operator.
Addresses-Coverity: ("Unused value")
--- net/sunrpc/xprtrdma/rpc_rdma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/sunrpc/xprtrdma/rpc_rdma.c +2 -2
@@ -71,7 +71,7 @@ static unsigned int rpcrdma_max_call_header_size(unsigned int maxsegs) size =RPCRDMA_HDRLEN_MIN ;/* Maximum Read list size */ - size = maxsegs * rpcrdma_readchunk_maxsz *sizeof (__be32); + size += maxsegs * rpcrdma_readchunk_maxsz *sizeof (__be32);/* Minimal Read chunk size */ size +=sizeof (__be32);/* segment count */
@@ -96,7 +96,7 @@ static unsigned int rpcrdma_max_reply_header_size(unsigned int maxsegs) size =RPCRDMA_HDRLEN_MIN ;/* Maximum Write list size */ - size =sizeof (__be32);/* segment count */ + size +=sizeof (__be32);/* segment count */ size += maxsegs * rpcrdma_segment_maxsz *sizeof (__be32); size +=sizeof (__be32);/* list discriminator */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 115/215 ARM: dts: socfpga: Align L2 cache-controller nodename with dtschema
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit d7adfe5ffed9faa05f8926223086b101e14f700d ]
Fix dtschema validator warnings like:
l2-cache@fffff000: $nodename:0:
'l2-cache@fffff000' does not match '^(cache-controller|cpu)(@[0-9a-f,]+)*$'--- arch/arm/boot/dts/socfpga.dtsi | 2 +- arch/arm/boot/dts/socfpga_arria10.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/socfpga.dtsi +1 -1
@@ -710,7 +710,7 @@ ocram-ecc@ffd08144 { }; }; - L2: l2-cache@fffef000 { + L2: cache-controller@fffef000 { compatible = "arm,pl310-cache"; reg = <0xfffef000 0x1000>; interrupts = <0 38 0x04>;
arch/arm/boot/dts/socfpga_arria10.dtsi +1 -1
@@ -636,7 +636,7 @@ sdr: sdr@ffcfb100 { reg = <0xffcfb100 0x80>; }; - L2: l2-cache@fffff000 { + L2: cache-controller@fffff000 { compatible = "arm,pl310-cache"; reg = <0xfffff000 0x1000>; interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 116/215 arm64: dts: spcfpga: Align GIC, NAND and UART nodenames with dtschema
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 681a5c71fb829fc2193e3bb524af41525477f5c3 ]
Fix dtschema validator warnings like:
intc@fffc1000: $nodename:0:
'intc@fffc1000' does not match '^interrupt-controller(@[0-9a-f,]+)*$'--- arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi +4 -4
@@ -77,7 +77,7 @@ psci { method = "smc"; }; - intc: intc@fffc1000 { + intc: interrupt-controller@fffc1000 { compatible = "arm,gic-400", "arm,cortex-a15-gic"; #interrupt-cells = <3>; interrupt-controller;
@@ -302,7 +302,7 @@ mmc: dwmmc0@ff808000 { status = "disabled"; }; - nand: nand@ffb90000 { + nand: nand-controller@ffb90000 { #address-cells = <1>; #size-cells = <0>; compatible = "altr,socfpga-denali-nand";
@@ -445,7 +445,7 @@ timer3: timer3@ffd00100 { clock-names = "timer"; }; - uart0: serial0@ffc02000 { + uart0: serial@ffc02000 { compatible = "snps,dw-apb-uart"; reg = <0xffc02000 0x100>; interrupts = <0 108 4>;
@@ -456,7 +456,7 @@ uart0: serial0@ffc02000 { status = "disabled"; }; - uart1: serial1@ffc02100 { + uart1: serial@ffc02100 { compatible = "snps,dw-apb-uart"; reg = <0xffc02100 0x100>; interrupts = <0 109 4>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 117/215 keys: asymmetric: fix error return code in software_key_query()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 6cbba1f9114a8134cff9138c79add15012fd52b9 ]
Fix to return negative error code -ENOMEM from kmalloc() error handling case instead of 0, as done elsewhere in this function.
--- crypto/asymmetric_keys/public_key.c | 1 + 1 file changed, 1 insertion(+)
crypto/asymmetric_keys/public_key.c +1 -0
@@ -119,6 +119,7 @@ static int software_key_query(const struct kernel_pkey_params *params,if (IS_ERR (tfm))return PTR_ERR (tfm); + ret = -ENOMEM ; key =kmalloc (pkey->keylen +sizeof (u32) *2 + pkey->paramlen,GFP_KERNEL );if (!key)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 118/215 regmap: debugfs: Dont sleep while atomic for fast_io regmaps
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit 299632e54b2e692d2830af84be51172480dc1e26 ]
If a regmap has "fast_io" set then its lock function uses a spinlock. That doesn't work so well with the functions:
* regmap_cache_only_write_file()
* regmap_cache_bypass_write_file()
Both of the above functions have the pattern:
1. Lock the regmap.
2. Call:
debugfs_write_file_bool()
copy_from_user()
__might_fault()
__might_sleep()Let's reorder things a bit so that we do all of our sleepable functions before we grab the lock.
--- drivers/base/regmap/regmap-debugfs.c | 52 ++++++++++++++++------------ 1 file changed, 29 insertions(+), 23 deletions(-)
drivers/base/regmap/regmap-debugfs.c +29 -23
@@ -457,29 +457,31 @@ static ssize_t regmap_cache_only_write_file(struct file *file, {struct regmap *map =container_of (file->private_data, struct regmap, cache_only); -ssize_t result; -bool was_enabled, require_sync = false; +bool new_val, require_sync = false;int err; - map->lock (map->lock_arg); + err =kstrtobool_from_user (user_buf, count, &new_val); +/* Ignore malforned data like debugfs_write_file_bool() */ +if (err) +return count; - was_enabled = map->cache_only; + err =debugfs_file_get (file->f_path.dentry); +if (err) +return err; - result =debugfs_write_file_bool (file, user_buf, count, ppos); -if (result <0 ) { - map->unlock (map->lock_arg); -return result; - } + map->lock (map->lock_arg); -if (map->cache_only && !was_enabled) { +if (new_val && !map->cache_only) {dev_warn (map->dev,"debugfs cache_only=Y forced\n" );add_taint (TAINT_USER ,LOCKDEP_STILL_OK ); - }else if (!map->cache_only && was_enabled) { + }else if (!new_val && map->cache_only) {dev_warn (map->dev,"debugfs cache_only=N forced: syncing cache\n" ); require_sync = true; } + map->cache_only = new_val; map->unlock (map->lock_arg); +debugfs_file_put (file->f_path.dentry);if (require_sync) { err =regcache_sync (map);
@@ -487,7 +489,7 @@ static ssize_t regmap_cache_only_write_file(struct file *file,dev_err (map->dev,"Failed to sync cache %d\n" , err); } -return result; +return count; }static const struct file_operations regmap_cache_only_fops = {
@@ -502,28 +504,32 @@ static ssize_t regmap_cache_bypass_write_file(struct file *file, {struct regmap *map =container_of (file->private_data, struct regmap, cache_bypass); -ssize_t result; -bool was_enabled; +bool new_val; +int err; - map->lock (map->lock_arg); + err =kstrtobool_from_user (user_buf, count, &new_val); +/* Ignore malforned data like debugfs_write_file_bool() */ +if (err) +return count; - was_enabled = map->cache_bypass; + err =debugfs_file_get (file->f_path.dentry); +if (err) +return err; - result =debugfs_write_file_bool (file, user_buf, count, ppos); -if (result <0 ) - goto out; + map->lock (map->lock_arg); -if (map->cache_bypass && !was_enabled) { +if (new_val && !map->cache_bypass) {dev_warn (map->dev,"debugfs cache_bypass=Y forced\n" );add_taint (TAINT_USER ,LOCKDEP_STILL_OK ); - }else if (!map->cache_bypass && was_enabled) { + }else if (!new_val && map->cache_bypass) {dev_warn (map->dev,"debugfs cache_bypass=N forced\n" ); } + map->cache_bypass = new_val; -out: map->unlock (map->lock_arg); +debugfs_file_put (file->f_path.dentry); -return result; +return count; }static const struct file_operations regmap_cache_bypass_fops = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 119/215 copy_xstate_to_kernel: Fix typo which caused GDB regression
In reply to Greg Kroah-HartmanFrom: Kevin Buettner <[email protected]>
commit 5714ee50bb4375bd586858ad800b1d9772847452 upstream.
This fixes a regression encountered while running the gdb.base/corefile.exp test in GDB's test suite.
In my testing, the typo prevented the sw_reserved field of struct fxregs_state from being output to the kernel XSAVES area. Thus the correct mask corresponding to XCR0 was not present in the core file for GDB to interrogate, resulting in the following behavior:
[kev@f32-1 gdb]$ ./gdb -q testsuite/outputs/gdb.base/corefile/corefile testsuite/outputs/gdb.base/corefile/corefile.core Reading symbols from testsuite/outputs/gdb.base/corefile/corefile...
[New LWP 232880]
warning: Unexpected size of section `.reg-xstate/232880' in core file.
With the typo fixed, the test works again as expected.
--- arch/x86/kernel/fpu/xstate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/fpu/xstate.c +1 -1
@@ -1017,7 +1017,7 @@ int copy_xstate_to_kernel(void *kbuf, stcopy_part (offsetof(struct fxregs_state , st_space),128 , &xsave->i387.st_space, &kbuf, &offset_start, &count);if (header.xfeatures &XFEATURE_MASK_SSE ) -copy_part (xstate_offsets[XFEATURE_MASK_SSE ],256 , +copy_part (xstate_offsets[XFEATURE_SSE ],256 , &xsave->i387.xmm_space, &kbuf, &offset_start, &count);/* * Fill xsave->i387.sw_reserved value for ptrace frame:
Greg Kroah-Hartman
maintainerPATCH 120/215 arm: dts: mt7623: add phy-mode property for gmac2
In reply to Greg Kroah-HartmanFrom: Sean Wang <[email protected]>
commit ff5b89c2858f28006f9f9c0a88c55a679488192c upstream.
Add phy-mode property required by phylink on gmac2
--- arch/arm/boot/dts/mt7623n-rfb-emmc.dts | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/mt7623n-rfb-emmc.dts +1 -0
@@ -138,6 +138,7 @@ mac@1 { compatible = "mediatek,eth-mac"; reg = <1>; + phy-mode = "rgmii"; phy-handle = <&phy5>; };
Greg Kroah-Hartman
maintainerPATCH 121/215 soc: qcom: socinfo: add missing soc_id sysfs entry
In reply to Greg Kroah-HartmanFrom: Srinivas Kandagatla <[email protected]>
commit 27a344139c186889d742764d3c2a62b395949cef upstream.
Looks like SoC ID is not exported to sysfs for some reason. This patch adds it!
This is mostly used by userspace libraries like Snapdragon Neural Processing Engine (SNPE) SDK for checking supported SoC info.
--- drivers/soc/qcom/socinfo.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/soc/qcom/socinfo.c +2 -0
@@ -428,6 +428,8 @@ static int qcom_socinfo_probe(struct pla qs->attr.family ="Snapdragon" ; qs->attr.machine =socinfo_machine (&pdev->dev,le32_to_cpu (info->id)); + qs->attr.soc_id =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%u" , +le32_to_cpu (info->id)); qs->attr.revision =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%u.%u" ,SOCINFO_MAJOR (le32_to_cpu (info->ver)),SOCINFO_MINOR (le32_to_cpu (info->ver)));
Greg Kroah-Hartman
maintainerPATCH 122/215 apparmor: ensure that dfa state tables have entries
In reply to Greg Kroah-HartmanFrom: John Johansen <[email protected]>
commit c27c6bd2c4d6b6bb779f9b722d5607993e1d5e5c upstream.
Currently it is possible to specify a state machine table with 0 length, this is not valid as optional tables are specified by not defining the table as present. Further this allows by-passing the base tables range check against the next/check tables.
--- security/apparmor/match.c | 5 +++++ 1 file changed, 5 insertions(+)
security/apparmor/match.c +5 -0
@@ -97,6 +97,9 @@ static struct table_header *unpack_table th.td_flags == YYTD_DATA8)) goto out; +/* if we have a table it must have some entries */ +if (th.td_lolen ==0 ) + goto out; tsize =table_size (th.td_lolen, th.td_flags);if (bsize < tsize) goto out;
@@ -198,6 +201,8 @@ static int verify_dfa(struct aa_dfa *dfa state_count = dfa->tables[YYTD_ID_BASE ]->td_lolen; trans_count = dfa->tables[YYTD_ID_NXT ]->td_lolen; +if (state_count ==0 ) + goto out;for (i =0 ; i < state_count; i++) {if (!(BASE_TABLE (dfa)[i] &MATCH_FLAG_DIFF_ENCODE ) && (DEFAULT_TABLE (dfa)[i] >= state_count))
Greg Kroah-Hartman
maintainerPATCH 123/215 habanalabs: Align protection bits configuration of all TPCs
In reply to Greg Kroah-HartmanFrom: Tomer Tayar <[email protected]>
commit 79c823c57e69d9e584a5ee4ee6406eb3854393ae upstream.
Align the protection bits configuration of all TPC cores to be as of TPC core 0.
--- drivers/misc/habanalabs/goya/goya_security.c | 99 ++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-)
drivers/misc/habanalabs/goya/goya_security.c +98 -1
@@ -695,7 +695,6 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC0_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC0_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC0_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); - mask |=1 << ((mmTPC0_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC0_CFG_TPC_STALL &0x7F ) >>2 ); mask |=1 << ((mmTPC0_CFG_MSS_CONFIG &0x7F ) >>2 ); mask |=1 << ((mmTPC0_CFG_TPC_INTR_CAUSE &0x7F ) >>2 );
@@ -875,6 +874,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC1_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC1_WR_REGULATOR_BASE); + pb_addr = (mmTPC1_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC1_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC1_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC1_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC1_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -882,6 +891,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC1_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC1_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC1_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC1_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
@@ -1057,6 +1070,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC2_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC2_WR_REGULATOR_BASE); + pb_addr = (mmTPC2_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC2_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC2_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC2_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC2_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -1064,6 +1087,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC2_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC2_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC2_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC2_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
@@ -1239,6 +1266,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC3_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC3_WR_REGULATOR_BASE); + pb_addr = (mmTPC3_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC3_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC3_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC3_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC3_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -1246,6 +1283,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC3_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC3_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC3_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC3_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
@@ -1421,6 +1462,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC4_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC4_WR_REGULATOR_BASE); + pb_addr = (mmTPC4_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC4_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC4_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC4_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC4_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -1428,6 +1479,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC4_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC4_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC4_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC4_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
@@ -1603,6 +1658,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC5_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC5_WR_REGULATOR_BASE); + pb_addr = (mmTPC5_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC5_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC5_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC5_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC5_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -1610,6 +1675,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC5_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC5_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC5_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC5_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
@@ -1785,6 +1854,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC6_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC6_WR_REGULATOR_BASE); + pb_addr = (mmTPC6_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC6_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC6_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC6_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC6_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -1792,6 +1871,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC6_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC6_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC6_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC6_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
@@ -1967,6 +2050,16 @@ static void goya_init_tpc_protection_bitgoya_pb_set_block (hdev, mmTPC7_RD_REGULATOR_BASE);goya_pb_set_block (hdev, mmTPC7_WR_REGULATOR_BASE); + pb_addr = (mmTPC7_CFG_SEMAPHORE & ~0xFFF ) +PROT_BITS_OFFS ; + word_offset = ((mmTPC7_CFG_SEMAPHORE &PROT_BITS_OFFS ) >>7 ) <<2 ; + + mask =1 << ((mmTPC7_CFG_SEMAPHORE &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_VFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_SFLAGS &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_STATUS &0x7F ) >>2 ); + +WREG32 (pb_addr + word_offset, ~mask); + pb_addr = (mmTPC7_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF ) +PROT_BITS_OFFS ; word_offset = ((mmTPC7_CFG_CFG_BASE_ADDRESS_HIGH &PROT_BITS_OFFS ) >>7 ) <<2 ;
@@ -1974,6 +2067,10 @@ static void goya_init_tpc_protection_bit mask |=1 << ((mmTPC7_CFG_CFG_SUBTRACT_VALUE &0x7F ) >>2 ); mask |=1 << ((mmTPC7_CFG_SM_BASE_ADDRESS_LOW &0x7F ) >>2 ); mask |=1 << ((mmTPC7_CFG_SM_BASE_ADDRESS_HIGH &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_TPC_STALL &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_MSS_CONFIG &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_TPC_INTR_CAUSE &0x7F ) >>2 ); + mask |=1 << ((mmTPC7_CFG_TPC_INTR_MASK &0x7F ) >>2 );WREG32 (pb_addr + word_offset, ~mask);
Greg Kroah-Hartman
maintainerPATCH 124/215 PCI/PM: Call .bridge_d3() hook only if non-NULL
In reply to Greg Kroah-HartmanFrom: Bjorn Helgaas <[email protected]>
commit c3aaf086701d05a82c8156ee8620af41e5a7d6fe upstream.
26ad34d510a8 ("PCI / ACPI: Whitelist D3 for more PCIe hotplug ports") added the struct pci_platform_pm_ops.bridge_d3() function pointer and platform_pci_bridge_d3() to use it.
The .bridge_d3() op is implemented by acpi_pci_platform_pm, but not by mid_pci_platform_pm. We don't expect platform_pci_bridge_d3() to be called on Intel MID platforms, but nothing in the code itself would prevent that.
Check the .bridge_d3() pointer for NULL before calling it.
--- drivers/pci/pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/pci/pci.c +3 -1
@@ -802,7 +802,9 @@ static inline bool platform_pci_need_resstatic inline bool platform_pci_bridge_d3 (struct pci_dev *dev) { -return pci_platform_pm ? pci_platform_pm->bridge_d3 (dev) : false; +if (pci_platform_pm && pci_platform_pm->bridge_d3) +return pci_platform_pm->bridge_d3 (dev); +return false; }/**
Greg Kroah-Hartman
maintainerPATCH 125/215 perf stat: Zero all the ena and run array slot stats for interval mode
In reply to Greg Kroah-HartmanFrom: Jin Yao <[email protected]>
commit 0e0bf1ea1147fcf74eab19c2d3c853cc3740a72f upstream.
As the code comments in perf_stat_process_counter() say, we calculate counter's data every interval, and the display code shows ps->res_stats avg value. We need to zero the stats for interval mode.
But the current code only zeros the res_stats[0], it doesn't zero the res_stats[1] and res_stats[2], which are for ena and run of counter.
This patch zeros the whole res_stats[] for interval mode.
--- tools/perf/util/stat.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/perf/util/stat.c +4 -2
@@ -367,8 +367,10 @@ int perf_stat_process_counter(struct per* interval mode, otherwise overall avg running * averages will be shown for each interval. */ -if (config->interval) -init_stats (ps->res_stats); +if (config->interval) { +for (i =0 ; i <3 ; i++) +init_stats (&ps->res_stats[i]); + }if (counter->per_pkg)zero_per_pkg (counter);
Greg Kroah-Hartman
maintainerPATCH 126/215 soc: qcom: rpmh: Update dirty flag only when data changes
In reply to Greg Kroah-HartmanFrom: Maulik Shah <[email protected]>
commit bb7000677a1b287206c8d4327c62442fa3050a8f upstream.
Currently rpmh ctrlr dirty flag is set for all cases regardless of data is really changed or not. Add changes to update dirty flag when data is changed to newer values. Update dirty flag everytime when data in batch cache is updated since rpmh_flush() may get invoked from any CPU instead of only last CPU going to low power mode.
Also move dirty flag updates to happen from within cache_lock and remove unnecessary INIT_LIST_HEAD() call and a default case from switch.
--- drivers/soc/qcom/rpmh.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/soc/qcom/rpmh.c +11 -8
@@ -119,6 +119,7 @@ static struct cache_req *cache_rpm_reque {struct cache_req *req;unsigned long flags; +u32 old_sleep_val, old_wake_val;spin_lock_irqsave (&ctrlr->cache_lock, flags); req =__find_req (ctrlr, cmd->addr);
@@ -133,26 +134,27 @@ static struct cache_req *cache_rpm_reque req->addr = cmd->addr; req->sleep_val = req->wake_val =UINT_MAX ; -INIT_LIST_HEAD (&req->list);list_add_tail (&req->list, &ctrlr->cache); existing: + old_sleep_val = req->sleep_val; + old_wake_val = req->wake_val; +switch (state) {case RPMH_ACTIVE_ONLY_STATE : -if (req->sleep_val !=UINT_MAX ) - req->wake_val = cmd->data; -break ;case RPMH_WAKE_ONLY_STATE : req->wake_val = cmd->data;break ;case RPMH_SLEEP_STATE : req->sleep_val = cmd->data;break ; -default : -break ; } - ctrlr->dirty = true; + ctrlr->dirty = (req->sleep_val != old_sleep_val || + req->wake_val != old_wake_val) && + req->sleep_val !=UINT_MAX && + req->wake_val !=UINT_MAX ; + unlock:spin_unlock_irqrestore (&ctrlr->cache_lock, flags);
@@ -287,6 +289,7 @@ static void cache_batch(struct rpmh_ctrlspin_lock_irqsave (&ctrlr->cache_lock, flags);list_add_tail (&req->list, &ctrlr->batch_cache); + ctrlr->dirty = true;spin_unlock_irqrestore (&ctrlr->cache_lock, flags); }
@@ -323,6 +326,7 @@ static void invalidate_batch(struct rpmhlist_for_each_entry_safe (req, tmp, &ctrlr->batch_cache, list)kfree (req);INIT_LIST_HEAD (&ctrlr->batch_cache); + ctrlr->dirty = true;spin_unlock_irqrestore (&ctrlr->cache_lock, flags); }
@@ -509,7 +513,6 @@ int rpmh_invalidate(const struct deviceint ret;invalidate_batch (ctrlr); - ctrlr->dirty = true; do { ret = rpmh_rsc_invalidate(ctrlr_to_drv(ctrlr));
Greg Kroah-Hartman
maintainerPATCH 127/215 soc: qcom: rpmh: Invalidate SLEEP and WAKE TCSes before flushing new data
In reply to Greg Kroah-HartmanFrom: Maulik Shah <[email protected]>
commit f5ac95f9ca2f439179a5baf48e1c0f22f83d936e upstream.
TCSes have previously programmed data when rpmh_flush() is called. This can cause old data to trigger along with newly flushed.
Fix this by cleaning SLEEP and WAKE TCSes before new data is flushed.
With this there is no need to invoke rpmh_rsc_invalidate() call from rpmh_invalidate().
Simplify rpmh_invalidate() by moving invalidate_batch() inside.
--- drivers/soc/qcom/rpmh.c | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-)
drivers/soc/qcom/rpmh.c +18 -23
@@ -317,19 +317,6 @@ static int flush_batch(struct rpmh_ctrlrreturn ret; } -static void invalidate_batch (struct rpmh_ctrlr *ctrlr) -{ -struct batch_cache_req *req, *tmp; -unsigned long flags; - -spin_lock_irqsave (&ctrlr->cache_lock, flags); -list_for_each_entry_safe (req, tmp, &ctrlr->batch_cache, list) -kfree (req); -INIT_LIST_HEAD (&ctrlr->batch_cache); - ctrlr->dirty = true; -spin_unlock_irqrestore (&ctrlr->cache_lock, flags); -} -/** * rpmh_write_batch: Write multiple sets of RPMH commands and wait for the * batch to finish.
@@ -469,6 +456,13 @@ int rpmh_flush(const struct device *dev)return 0 ; } +/* Invalidate the TCSes first to avoid stale data */ +do { + ret =rpmh_rsc_invalidate (ctrlr_to_drv (ctrlr)); + }while (ret == -EAGAIN ); +if (ret) +return ret; +/* First flush the cached batch requests */ ret =flush_batch (ctrlr);if (ret)
@@ -500,24 +494,25 @@ int rpmh_flush(const struct device *dev)EXPORT_SYMBOL (rpmh_flush);/** -* rpmh_invalidate: Invalidate all sleep and active sets -* sets. +* rpmh_invalidate: Invalidate sleep and wake sets in batch_cache * * @dev: The device making the request * -* Invalidate the sleep and active values in the TCS blocks. +* Invalidate the sleep and wake values in batch_cache. */ int rpmh_invalidate (const struct device *dev) {struct rpmh_ctrlr *ctrlr =get_rpmh_ctrlr (dev); -int ret; - -invalidate_batch (ctrlr); +struct batch_cache_req *req, *tmp; +unsigned long flags; -do { - ret =rpmh_rsc_invalidate (ctrlr_to_drv (ctrlr)); - }while (ret == -EAGAIN ); +spin_lock_irqsave (&ctrlr->cache_lock, flags); +list_for_each_entry_safe (req, tmp, &ctrlr->batch_cache, list) +kfree (req); +INIT_LIST_HEAD (&ctrlr->batch_cache); + ctrlr->dirty = true; +spin_unlock_irqrestore (&ctrlr->cache_lock, flags); -return ret; +return 0 ; }EXPORT_SYMBOL (rpmh_invalidate);
Greg Kroah-Hartman
maintainerPATCH 128/215 soc: qcom: rpmh-rsc: Clear active mode configuration for wake TCS
In reply to Greg Kroah-HartmanFrom: Raju P.L.S.S.S.N <[email protected]>
commit 15b3bf61b8d48f8e0ccd9d7f1bcb468b543da396 upstream.
For RSCs that have sleep & wake TCS but no dedicated active TCS, wake TCS can be re-purposed to send active requests. Once the active requests are sent and response is received, the active mode configuration needs to be cleared so that controller can use wake TCS for sending wake requests.
Introduce enable_tcs_irq() to enable completion IRQ for repurposed TCSes.
--- drivers/soc/qcom/rpmh-rsc.c | 77 ++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 23 deletions(-)
drivers/soc/qcom/rpmh-rsc.c +54 -23
@@ -201,6 +201,42 @@ static const struct tcs_request *get_reqreturn NULL ; } +static void __tcs_set_trigger (struct rsc_drv *drv,int tcs_id,bool trigger) +{ +u32 enable; + +/* +* HW req: Clear the DRV_CONTROL and enable TCS again +* While clearing ensure that the AMC mode trigger is cleared +* and then the mode enable is cleared. +*/ + enable =read_tcs_reg (drv,RSC_DRV_CONTROL , tcs_id,0 ); + enable &= ~TCS_AMC_MODE_TRIGGER ; +write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); + enable &= ~TCS_AMC_MODE_ENABLE ; +write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); + +if (trigger) { +/* Enable the AMC mode on the TCS and then trigger the TCS */ + enable =TCS_AMC_MODE_ENABLE ; +write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); + enable |=TCS_AMC_MODE_TRIGGER ; +write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); + } +} + +static void enable_tcs_irq (struct rsc_drv *drv,int tcs_id,bool enable) +{ +u32 data; + + data =read_tcs_reg (drv,RSC_DRV_IRQ_ENABLE ,0 ,0 ); +if (enable) + data |=BIT (tcs_id); +else + data &= ~BIT (tcs_id); +write_tcs_reg (drv,RSC_DRV_IRQ_ENABLE ,0 , data); +} +/** * tcs_tx_done: TX Done interrupt handler */
@@ -237,6 +273,14 @@ static irqreturn_t tcs_tx_done(int irq, }trace_rpmh_tx_done (drv, i, req, err); + +/* +* If wake tcs was re-purposed for sending active +* votes, clear AMC trigger & enable modes and +* disable interrupt for this TCS +*/ +if (!drv->tcs[ACTIVE_TCS ].num_tcs) +__tcs_set_trigger (drv, i, false); skip:/* Reclaim the TCS */ write_tcs_reg (drv,RSC_DRV_CMD_ENABLE , i,0 );
@@ -244,6 +288,13 @@ skip:write_tcs_reg (drv,RSC_DRV_IRQ_CLEAR ,0 ,BIT (i));spin_lock (&drv->lock);clear_bit (i, drv->tcs_in_use); +/* +* Disable interrupt for WAKE TCS to avoid being +* spammed with interrupts coming when the solver +* sends its wake votes. +*/ +if (!drv->tcs[ACTIVE_TCS ].num_tcs) +enable_tcs_irq (drv, i, false);spin_unlock (&drv->lock);if (req)rpmh_tx_done (req, err);
@@ -285,28 +336,6 @@ static void __tcs_buffer_write(struct rswrite_tcs_reg (drv,RSC_DRV_CMD_ENABLE , tcs_id, cmd_enable); } -static void __tcs_trigger (struct rsc_drv *drv,int tcs_id) -{ -u32 enable; - -/* -* HW req: Clear the DRV_CONTROL and enable TCS again -* While clearing ensure that the AMC mode trigger is cleared -* and then the mode enable is cleared. -*/ - enable =read_tcs_reg (drv,RSC_DRV_CONTROL , tcs_id,0 ); - enable &= ~TCS_AMC_MODE_TRIGGER ; -write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); - enable &= ~TCS_AMC_MODE_ENABLE ; -write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); - -/* Enable the AMC mode on the TCS and then trigger the TCS */ - enable =TCS_AMC_MODE_ENABLE ; -write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); - enable |=TCS_AMC_MODE_TRIGGER ; -write_tcs_reg_sync (drv,RSC_DRV_CONTROL , tcs_id, enable); -} -static int check_for_req_inflight (struct rsc_drv *drv,struct tcs_group *tcs,const struct tcs_request *msg) {
@@ -377,10 +406,12 @@ static int tcs_write(struct rsc_drv *drv tcs->req[tcs_id - tcs->offset] = msg;set_bit (tcs_id, drv->tcs_in_use); +if (msg->state ==RPMH_ACTIVE_ONLY_STATE && tcs->type !=ACTIVE_TCS ) +enable_tcs_irq (drv, tcs_id, true);spin_unlock (&drv->lock);__tcs_buffer_write (drv, tcs_id,0 , msg); -__tcs_trigger (drv, tcs_id); +__tcs_set_trigger (drv, tcs_id, true); done_write:spin_unlock_irqrestore (&tcs->lock, flags);
Greg Kroah-Hartman
maintainerPATCH 129/215 soc: qcom: rpmh-rsc: Allow using free WAKE TCS for active request
In reply to Greg Kroah-HartmanFrom: Maulik Shah <[email protected]>
commit 38427e5a47bf83299da930bd474c6cb2632ad810 upstream.
When there are more than one WAKE TCS available and there is no dedicated ACTIVE TCS available, invalidating all WAKE TCSes and waiting for current transfer to complete in first WAKE TCS blocks using another free WAKE TCS to complete current request.
Remove rpmh_rsc_invalidate() to happen from tcs_write() when WAKE TCSes is re-purposed to be used for Active mode. Clear only currently used WAKE TCS's register configuration.
--- drivers/soc/qcom/rpmh-rsc.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-)
drivers/soc/qcom/rpmh-rsc.c +11 -12
@@ -148,7 +148,7 @@ int rpmh_rsc_invalidate(struct rsc_drv *static struct tcs_group *get_tcs_for_msg (struct rsc_drv *drv,const struct tcs_request *msg) { -int type, ret; +int type;struct tcs_group *tcs;switch (msg->state) {
@@ -169,19 +169,10 @@ static struct tcs_group *get_tcs_for_msg* If we are making an active request on a RSC that does not have a * dedicated TCS for active state use, then re-purpose a wake TCS to * send active votes. -* NOTE: The driver must be aware that this RSC does not have a -* dedicated AMC, and therefore would invalidate the sleep and wake -* TCSes before making an active state request. */ tcs =get_tcs_of_type (drv, type); -if (msg->state ==RPMH_ACTIVE_ONLY_STATE && !tcs->num_tcs) { +if (msg->state ==RPMH_ACTIVE_ONLY_STATE && !tcs->num_tcs) tcs =get_tcs_of_type (drv,WAKE_TCS ); -if (tcs->num_tcs) { - ret =rpmh_rsc_invalidate (drv); -if (ret) -return ERR_PTR (ret); - } - }return tcs; }
@@ -406,8 +397,16 @@ static int tcs_write(struct rsc_drv *drv tcs->req[tcs_id - tcs->offset] = msg;set_bit (tcs_id, drv->tcs_in_use); -if (msg->state ==RPMH_ACTIVE_ONLY_STATE && tcs->type !=ACTIVE_TCS ) +if (msg->state ==RPMH_ACTIVE_ONLY_STATE && tcs->type !=ACTIVE_TCS ) { +/* +* Clear previously programmed WAKE commands in selected +* repurposed TCS to avoid triggering them. tcs->slots will be +* cleaned from rpmh_flush() by invoking rpmh_rsc_invalidate() +*/ +write_tcs_reg_sync (drv,RSC_DRV_CMD_ENABLE , tcs_id,0 ); +write_tcs_reg_sync (drv,RSC_DRV_CMD_WAIT_FOR_CMPL , tcs_id,0 );enable_tcs_irq (drv, tcs_id, true); + }spin_unlock (&drv->lock);__tcs_buffer_write (drv, tcs_id,0 , msg);
Greg Kroah-Hartman
maintainerPATCH 130/215 RDMA/mlx5: Verify that QP is created with RQ or SQ
In reply to Greg Kroah-HartmanFrom: Aharon Landau <[email protected]>
commit 0eacc574aae7300bf46c10c7116c3ba5825505b7 upstream.
RAW packet QP and underlay QP must be created with either RQ or SQ, check that.
--- drivers/infiniband/hw/mlx5/qp.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/mlx5/qp.c +2 -0
@@ -1463,6 +1463,8 @@ static int create_raw_packet_qp(struct mu16 uid =to_mpd (pd)->uid;u32 out[MLX5_ST_SZ_DW (create_tir_out)] = {}; +if (!qp->sq.wqe_cnt && !qp->rq.wqe_cnt) +return -EINVAL ;if (qp->sq.wqe_cnt) { err =create_raw_packet_qp_tis (dev, qp, sq, tdn, pd);if (err)
Greg Kroah-Hartman
maintainerPATCH 131/215 mtd: rawnand: marvell: Fix the condition on a return code
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit c27075772d1f1c8aaf276db9943b35adda8a8b65 upstream.
In a previous fix, I changed the condition on which the timeout of an IRQ is reached from:
if (!ret)
into:
if (ret && !pending)
While having a non-zero return code is usual in the Linux kernel, here ret comes from a wait_for_completion_timeout() which returns 0 when the waiting period is too long.
Hence, the revised condition should be:
if (!ret && !pending)
The faulty patch did not produce any error because of the !pending condition so this change is finally purely cosmetic and does not change the actual driver behavior.
--- drivers/mtd/nand/raw/marvell_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/raw/marvell_nand.c +1 -1
@@ -707,7 +707,7 @@ static int marvell_nfc_wait_op(struct na* In case the interrupt was not served in the required time frame, * check if the ISR was not served or if something went actually wrong. */ -if (ret && !pending) { +if (!ret && !pending) {dev_err (nfc->dev,"Timeout waiting for RB signal\n" );return -ETIMEDOUT ; }
Greg Kroah-Hartman
maintainerPATCH 132/215 mtd: rawnand: marvell: Use nand_cleanup() when the device is not yet registered
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit 7a0c18fb5c71c6ac7d4662a145e4227dcd4a36a3 upstream.
Do not call nand_release() while the MTD device has not been registered, use nand_cleanup() instead.
--- drivers/mtd/nand/raw/marvell_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/raw/marvell_nand.c +1 -1
@@ -2664,7 +2664,7 @@ static int marvell_nand_chip_init(struct ret =mtd_device_register (mtd,NULL ,0 );if (ret) {dev_err (dev,"failed to register mtd device: %d\n" , ret); -nand_release (chip); +nand_cleanup (chip);return ret; }
Greg Kroah-Hartman
maintainerPATCH 133/215 mtd: rawnand: marvell: Fix probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit c525b7af96714f72e316c70781570a4a3e1c2856 upstream.
Ensure all chips are deregistered and cleaned in case of error during the probe.
--- drivers/mtd/nand/raw/marvell_nand.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
drivers/mtd/nand/raw/marvell_nand.c +14 -9
@@ -2673,6 +2673,16 @@ static int marvell_nand_chip_init(structreturn 0 ; } +static void marvell_nand_chips_cleanup (struct marvell_nfc *nfc) +{ +struct marvell_nand_chip *entry, *temp; + +list_for_each_entry_safe (entry, temp, &nfc->chips, node) { +nand_release (&entry->chip); +list_del (&entry->node); + } +} +static int marvell_nand_chips_init (struct device *dev,struct marvell_nfc *nfc) {struct device_node *np = dev->of_node;
@@ -2707,21 +2717,16 @@ static int marvell_nand_chips_init(struc ret =marvell_nand_chip_init (dev, nfc, nand_np);if (ret) {of_node_put (nand_np); -return ret; + goto cleanup_chips; } }return 0 ; -} -static void marvell_nand_chips_cleanup (struct marvell_nfc *nfc) -{ -struct marvell_nand_chip *entry, *temp; +cleanup_chips: +marvell_nand_chips_cleanup (nfc); -list_for_each_entry_safe (entry, temp, &nfc->chips, node) { -nand_release (&entry->chip); -list_del (&entry->node); - } +return ret; }static int marvell_nfc_init_dma (struct marvell_nfc *nfc)
Greg Kroah-Hartman
maintainerPATCH 134/215 mtd: rawnand: timings: Fix default tR_max and tCCS_min timings
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit 4d8ec041d9c454029f6cd90622f6d81eb61e781c upstream.
tR and tCCS are currently wrongly expressed in femtoseconds, while we expect these values to be expressed in picoseconds. Set right hardcoded values.
--- drivers/mtd/nand/raw/nand_timings.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/mtd/nand/raw/nand_timings.c +2 -3
@@ -314,10 +314,9 @@ int onfi_fill_data_interface(struct nand/* microseconds -> picoseconds */ timings->tPROG_max =1000000ULL *ONFI_DYN_TIMING_MAX ; timings->tBERS_max =1000000ULL *ONFI_DYN_TIMING_MAX ; - timings->tR_max =1000000ULL *200000000ULL ; -/* nanoseconds -> picoseconds */ - timings->tCCS_min =1000UL *500000 ; + timings->tR_max =200000000 ; + timings->tCCS_min =500000 ; }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 135/215 mtd: rawnand: brcmnand: correctly verify erased pages
In reply to Greg Kroah-HartmanFrom: Álvaro Fernández Rojas <[email protected]>
commit dcb351c03f2fa6a599de1061b174167e03ee312b upstream.
The current code checks that the whole OOB area is erased.
This is a problem when JFFS2 cleanmarkers are added to the OOB, since it will fail due to the usable OOB bytes not being 0xff.
Correct this by only checking that data and ECC bytes aren't 0xff.
--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/mtd/nand/raw/brcmnand/brcmnand.c +11 -8
@@ -1790,28 +1790,31 @@ static int brcmnand_read_by_pio(struct mstatic int brcmstb_nand_verify_erased_page (struct mtd_info *mtd,struct nand_chip *chip,void *buf,u64 addr) { -int i, sas; -void *oob = chip->oob_poi; +struct mtd_oob_region ecc; +int i;int bitflips =0 ;int page = addr >> chip->page_shift;int ret; +void *ecc_bytes;void *ecc_chunk;if (!buf) buf =nand_get_data_buf (chip); - sas = mtd->oobsize / chip->ecc.steps; -/* read without ecc for verification */ ret = chip->ecc.read_page_raw (chip, buf, true, page);if (ret)return ret; -for (i =0 ; i < chip->ecc.steps; i++, oob += sas) { +for (i =0 ; i < chip->ecc.steps; i++) { ecc_chunk = buf + chip->ecc.size * i; - ret =nand_check_erased_ecc_chunk (ecc_chunk, - chip->ecc.size, - oob, sas,NULL ,0 , + +mtd_ooblayout_ecc (mtd, i, &ecc); + ecc_bytes = chip->oob_poi + ecc.offset; + + ret =nand_check_erased_ecc_chunk (ecc_chunk, chip->ecc.size, + ecc_bytes, ecc.length, +NULL ,0 , chip->ecc.strength);if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 136/215 mtd: rawnand: brcmnand: fix CS0 layout
In reply to Greg Kroah-HartmanFrom: Álvaro Fernández Rojas <[email protected]>
commit 3d3fb3c5be9ce07fa85d8f67fb3922e4613b955b upstream.
Only v3.3-v5.0 have a different CS0 layout. Controllers before v3.3 use the same layout for every CS.
--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/brcmnand/brcmnand.c +3 -2
@@ -537,8 +537,9 @@ static int brcmnand_revision_init(struct }else { ctrl->cs_offsets = brcmnand_cs_offsets; -/* v5.0 and earlier has a different CS0 offset layout */ -if (ctrl->nand_version <=0x0500 ) +/* v3.3-5.0 have a different CS0 offset layout */ +if (ctrl->nand_version >=0x0303 && + ctrl->nand_version <=0x0500 ) ctrl->cs0_offsets = brcmnand_cs_offsets_cs0; }
Greg Kroah-Hartman
maintainerPATCH 137/215 mtd: rawnand: oxnas: Keep track of registered devices
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit 383fc3f613e7eac9f2e3c13b6f9fb8c1f39cb9d5 upstream.
All initialized and registered devices should be listed somewhere so that we can unregister/free them in the _remove() path.
This patch is not a fix per-se but is needed to apply three other fixes coming right after, explaining the Fixes/Cc: stable tags.
--- drivers/mtd/nand/raw/oxnas_nand.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/mtd/nand/raw/oxnas_nand.c +4 -4
@@ -32,6 +32,7 @@ struct oxnas_nand_ctrl {void __iomem *io_base;struct clk *clk;struct nand_chip *chips[OXNAS_NAND_MAX_CHIPS ]; +unsigned int nchips; };static uint8_t oxnas_nand_read_byte (struct nand_chip *chip)
@@ -79,7 +80,6 @@ static int oxnas_nand_probe(struct platfstruct nand_chip *chip;struct mtd_info *mtd;struct resource *res; -int nchips =0 ;int count =0 ;int err =0 ;
@@ -143,12 +143,12 @@ static int oxnas_nand_probe(struct platfif (err) goto err_cleanup_nand; - oxnas->chips[nchips] = chip; - ++nchips; + oxnas->chips[oxnas->nchips] = chip; + ++oxnas->nchips; }/* Exit if no chips found */ -if (!nchips) { +if (!oxnas->nchips) { err = -ENODEV ; goto err_clk_unprepare; }
Greg Kroah-Hartman
maintainerPATCH 138/215 mtd: rawnand: oxnas: Unregister all devices on error
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit b60391eb17b2956ff2fc4c348e5a464da21ff9cb upstream.
On error, the oxnas probe path just frees the device which failed and aborts the probe, leaving unreleased resources.
Fix this situation by calling mtd_device_unregister()/nand_cleanup() on these.
--- drivers/mtd/nand/raw/oxnas_nand.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/mtd/nand/raw/oxnas_nand.c +8 -0
@@ -82,6 +82,7 @@ static int oxnas_nand_probe(struct platfstruct resource *res;int count =0 ;int err =0 ; +int i;/* Allocate memory for the device structure (and zero it) */ oxnas = devm_kzalloc(&pdev->dev, sizeof(*oxnas),
@@ -161,6 +162,13 @@ err_cleanup_nand:nand_cleanup (chip); err_release_child:of_node_put (nand_np); + +for (i =0 ; i < oxnas->nchips; i++) { + chip = oxnas->chips[i]; +WARN_ON (mtd_device_unregister (nand_to_mtd (chip))); +nand_cleanup (chip); + } + err_clk_unprepare:clk_disable_unprepare (oxnas->clk);return err;
Greg Kroah-Hartman
maintainerPATCH 139/215 mtd: rawnand: oxnas: Release all devices in the _remove() path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit 0a5f45e57e35d0840bedb816974ce2e63406cd8b upstream.
oxnans_nand_remove() should release all MTD devices and clean all NAND devices, not only the first one registered.
--- drivers/mtd/nand/raw/oxnas_nand.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/oxnas_nand.c +6 -2
@@ -177,9 +177,13 @@ err_clk_unprepare:static int oxnas_nand_remove (struct platform_device *pdev) {struct oxnas_nand_ctrl *oxnas =platform_get_drvdata (pdev); +struct nand_chip *chip; +int i; -if (oxnas->chips[0 ]) -nand_release (oxnas->chips[0 ]); +for (i =0 ; i < oxnas->nchips; i++) { + chip = oxnas->chips[i]; +nand_release (chip); + }clk_disable_unprepare (oxnas->clk);
Greg Kroah-Hartman
maintainerPATCH 140/215 clk: qcom: gcc: Add GPU and NPU clocks for SM8150
In reply to Greg Kroah-HartmanFrom: Vinod Koul <[email protected]>
commit f73a4230d5bbc8fc7e1a2479ac997f786111c7bb upstream.
Add the GPU and NPU clocks for SM8150. They were missed in earlier addition of clock driver.
--- drivers/clk/qcom/gcc-sm8150.c | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+)
drivers/clk/qcom/gcc-sm8150.c +64 -0
@@ -1615,6 +1615,36 @@ static struct clk_branch gcc_gpu_cfg_ahb }, }; +static struct clk_branch gcc_gpu_gpll0_clk_src = { + .clkr = { + .enable_reg =0x52004 , + .enable_mask =BIT (15 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_gpu_gpll0_clk_src" , + .parent_hws = (const struct clk_hw *[]){ + &gpll0.clkr.hw }, + .num_parents =1 , + .flags =CLK_SET_RATE_PARENT , + .ops = &clk_branch2_ops, + }, + }, +}; + +static struct clk_branch gcc_gpu_gpll0_div_clk_src = { + .clkr = { + .enable_reg =0x52004 , + .enable_mask =BIT (16 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_gpu_gpll0_div_clk_src" , + .parent_hws = (const struct clk_hw *[]){ + &gcc_gpu_gpll0_clk_src.clkr.hw }, + .num_parents =1 , + .flags =CLK_SET_RATE_PARENT , + .ops = &clk_branch2_ops, + }, + }, +}; +static struct clk_branch gcc_gpu_iref_clk = { .halt_reg =0x8c010 , .halt_check =BRANCH_HALT ,
@@ -1697,6 +1727,36 @@ static struct clk_branch gcc_npu_cfg_ahb }, }; +static struct clk_branch gcc_npu_gpll0_clk_src = { + .clkr = { + .enable_reg =0x52004 , + .enable_mask =BIT (18 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_npu_gpll0_clk_src" , + .parent_hws = (const struct clk_hw *[]){ + &gpll0.clkr.hw }, + .num_parents =1 , + .flags =CLK_SET_RATE_PARENT , + .ops = &clk_branch2_ops, + }, + }, +}; + +static struct clk_branch gcc_npu_gpll0_div_clk_src = { + .clkr = { + .enable_reg =0x52004 , + .enable_mask =BIT (19 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_npu_gpll0_div_clk_src" , + .parent_hws = (const struct clk_hw *[]){ + &gcc_npu_gpll0_clk_src.clkr.hw }, + .num_parents =1 , + .flags =CLK_SET_RATE_PARENT , + .ops = &clk_branch2_ops, + }, + }, +}; +static struct clk_branch gcc_npu_trig_clk = { .halt_reg =0x4d00c , .halt_check =BRANCH_VOTED ,
@@ -3331,12 +3391,16 @@ static struct clk_regmap *gcc_sm8150_clo [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr, + [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, + [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, [GCC_GPU_IREF_CLK] = &gcc_gpu_iref_clk.clkr, [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr, [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, [GCC_NPU_AT_CLK] = &gcc_npu_at_clk.clkr, [GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr, [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr, + [GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr, + [GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr, [GCC_NPU_TRIG_CLK] = &gcc_npu_trig_clk.clkr, [GCC_PCIE0_PHY_REFGEN_CLK] = &gcc_pcie0_phy_refgen_clk.clkr, [GCC_PCIE1_PHY_REFGEN_CLK] = &gcc_pcie1_phy_refgen_clk.clkr,
Greg Kroah-Hartman
maintainerPATCH 141/215 clk: qcom: gcc: Add missing UFS clocks for SM8150
In reply to Greg Kroah-HartmanFrom: Vinod Koul <[email protected]>
commit 37c72e4cae37f0dace1abb3711ede7fbc6d0862a upstream.
Add the missing ufs card and ufs phy clocks for SM8150. They were missed in earlier addition of clock driver.
--- drivers/clk/qcom/gcc-sm8150.c | 84 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+)
drivers/clk/qcom/gcc-sm8150.c +84 -0
@@ -2871,6 +2871,45 @@ static struct clk_branch gcc_ufs_card_ph }, }; +/* external clocks so add BRANCH_HALT_SKIP */ +static struct clk_branch gcc_ufs_card_rx_symbol_0_clk = { + .halt_check =BRANCH_HALT_SKIP , + .clkr = { + .enable_reg =0x7501c , + .enable_mask =BIT (0 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_ufs_card_rx_symbol_0_clk" , + .ops = &clk_branch2_ops, + }, + }, +}; + +/* external clocks so add BRANCH_HALT_SKIP */ +static struct clk_branch gcc_ufs_card_rx_symbol_1_clk = { + .halt_check =BRANCH_HALT_SKIP , + .clkr = { + .enable_reg =0x750ac , + .enable_mask =BIT (0 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_ufs_card_rx_symbol_1_clk" , + .ops = &clk_branch2_ops, + }, + }, +}; + +/* external clocks so add BRANCH_HALT_SKIP */ +static struct clk_branch gcc_ufs_card_tx_symbol_0_clk = { + .halt_check =BRANCH_HALT_SKIP , + .clkr = { + .enable_reg =0x75018 , + .enable_mask =BIT (0 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_ufs_card_tx_symbol_0_clk" , + .ops = &clk_branch2_ops, + }, + }, +}; +static struct clk_branch gcc_ufs_card_unipro_core_clk = { .halt_reg =0x75058 , .halt_check =BRANCH_HALT ,
@@ -3051,6 +3090,45 @@ static struct clk_branch gcc_ufs_phy_phy }, }; +/* external clocks so add BRANCH_HALT_SKIP */ +static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { + .halt_check =BRANCH_HALT_SKIP , + .clkr = { + .enable_reg =0x7701c , + .enable_mask =BIT (0 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_ufs_phy_rx_symbol_0_clk" , + .ops = &clk_branch2_ops, + }, + }, +}; + +/* external clocks so add BRANCH_HALT_SKIP */ +static struct clk_branch gcc_ufs_phy_rx_symbol_1_clk = { + .halt_check =BRANCH_HALT_SKIP , + .clkr = { + .enable_reg =0x770ac , + .enable_mask =BIT (0 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_ufs_phy_rx_symbol_1_clk" , + .ops = &clk_branch2_ops, + }, + }, +}; + +/* external clocks so add BRANCH_HALT_SKIP */ +static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { + .halt_check =BRANCH_HALT_SKIP , + .clkr = { + .enable_reg =0x77018 , + .enable_mask =BIT (0 ), + .hw.init = &(struct clk_init_data ){ + .name ="gcc_ufs_phy_tx_symbol_0_clk" , + .ops = &clk_branch2_ops, + }, + }, +}; +static struct clk_branch gcc_ufs_phy_unipro_core_clk = { .halt_reg =0x77058 , .halt_check =BRANCH_HALT ,
@@ -3505,6 +3583,9 @@ static struct clk_regmap *gcc_sm8150_clo [GCC_UFS_CARD_PHY_AUX_CLK_SRC] = &gcc_ufs_card_phy_aux_clk_src.clkr, [GCC_UFS_CARD_PHY_AUX_HW_CTL_CLK ] = &gcc_ufs_card_phy_aux_hw_ctl_clk.clkr, + [GCC_UFS_CARD_RX_SYMBOL_0_CLK] = &gcc_ufs_card_rx_symbol_0_clk.clkr, + [GCC_UFS_CARD_RX_SYMBOL_1_CLK] = &gcc_ufs_card_rx_symbol_1_clk.clkr, + [GCC_UFS_CARD_TX_SYMBOL_0_CLK] = &gcc_ufs_card_tx_symbol_0_clk.clkr, [GCC_UFS_CARD_UNIPRO_CORE_CLK] = &gcc_ufs_card_unipro_core_clk.clkr, [GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC ] = &gcc_ufs_card_unipro_core_clk_src.clkr,
@@ -3522,6 +3603,9 @@ static struct clk_regmap *gcc_sm8150_clo [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, [GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK] = &gcc_ufs_phy_phy_aux_hw_ctl_clk.clkr, + [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, + [GCC_UFS_PHY_RX_SYMBOL_1_CLK] = &gcc_ufs_phy_rx_symbol_1_clk.clkr, + [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC ] = &gcc_ufs_phy_unipro_core_clk_src.clkr,
Greg Kroah-Hartman
maintainerPATCH 142/215 slimbus: core: Fix mismatch in of_node_get/put
In reply to Greg Kroah-HartmanFrom: Saravana Kannan <[email protected]>
commit 01360857486c0e4435dea3aa2f78b47213b7cf6a upstream.
Adding missing corresponding of_node_put
--- drivers/slimbus/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/slimbus/core.c +1 -0
@@ -283,6 +283,7 @@ EXPORT_SYMBOL_GPL(slim_register_controll/* slim_remove_device: Remove the effect of slim_add_device() */ static void slim_remove_device (struct slim_device *sbdev) { +of_node_put (sbdev->dev.of_node);device_unregister (&sbdev->dev); }