5.4.119-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 5.4.119-rc1 review
This is the start of the stable review cycle for the 5.4.119 release. There are 244 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 Fri, 14 May 2021 14:47:09 +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.119-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.119-rc1
Quentin Perret <[email protected]>
Revert "fdt: Properly handle "no-map" field in the memory region"
Quentin Perret <[email protected]>
Revert "of/fdt: Make sure no-map does not remove already reserved regions"
Xin Long <[email protected]>
sctp: delay auto_asconf init until binding the first addr
Xin Long <[email protected]>
Revert "net/sctp: fix race condition in sctp_destroy_sock"
Arnd Bergmann <[email protected]>
smp: Fix smp_call_function_single_async prototype
Jonathon Reinhart <[email protected]>
net: Only allow init netns to set default tcp cong to a restricted algo
Jane Chu <[email protected]>
mm/memory-failure: unnecessary amount of unmapping
Wang Wensheng <[email protected]>
mm/sparse: add the missing sparse_buffer_fini() in error branch
Dan Carpenter <[email protected]>
kfifo: fix ternary sign extension bugs
Lv Yunlong <[email protected]>
net:nfc:digital: Fix a double free in digital_tg_recv_dep_req
Linus Lüssing <[email protected]>
net: bridge: mcast: fix broken length + header check for MRDv6 Adv.
Lv Yunlong <[email protected]>
RDMA/bnxt_re: Fix a double free in bnxt_qplib_alloc_res
Lv Yunlong <[email protected]>
RDMA/siw: Fix a use after free in siw_alloc_mr
Lv Yunlong <[email protected]>
net:emac/emac-mac: Fix a use after free in emac_mac_tx_buf_send
Michael Chan <[email protected]>
bnxt_en: Fix RX consumer index logic in the error path.
Petr Machata <[email protected]>
selftests: net: mirror_gre_vlan_bridge_1q: Make an FDB entry static
Phillip Potter <[email protected]>
net: geneve: modify IP header check in geneve6_xmit_skb and geneve_xmit_skb
Kunihiko Hayashi <[email protected]>
arm64: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E
Kunihiko Hayashi <[email protected]>
ARM: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E
Dan Carpenter <[email protected]>
bnxt_en: fix ternary sign extension bug in bnxt_show_temp()
Christophe Leroy <[email protected]>
powerpc/52xx: Fix an invalid ASM expression ('addi' used instead of 'add')
Shuah Khan <[email protected]>
ath10k: Fix ath10k_wmi_tlv_op_pull_peer_stats_info() unlock without lock
Toke Høiland-Jørgensen <[email protected]>
ath9k: Fix error check in ath9k_hw_read_revisions() for PCI devices
Martin Schiller <[email protected]>
net: phy: intel-xway: enable integrated led functions
Yoshihiro Shimoda <[email protected]>
net: renesas: ravb: Fix a stuck issue when a lot of frames are received
Colin Ian King <[email protected]>
net: davinci_emac: Fix incorrect masking of tx and rx error channel
Colin Ian King <[email protected]>
ALSA: usb: midi: don't return -ENOMEM when usb_urb_ep_type_check fails
Sindhu Devale <[email protected]>
RDMA/i40iw: Fix error unwinding when i40iw_hmc_sd_one fails
Potnuri Bharat Teja <[email protected]>
RDMA/cxgb4: add missing qpid increment
Alexander Lobakin <[email protected]>
gro: fix napi_gro_frags() Fast GRO breakage due to IP alignment check
Stefano Garzarella <[email protected]>
vsock/vmci: log once the failed queue pair allocation
Lv Yunlong <[email protected]>
mwl8k: Fix a double Free in mwl8k_probe_hw
Sergey Shtylyov <[email protected]>
i2c: sh7760: fix IRQ error path
Ping-Ke Shih <[email protected]>
rtlwifi: 8821ae: upgrade PHY and RF parameters
Tyrel Datwyler <[email protected]>
powerpc/pseries: extract host bridge from pci_bus prior to bus removal
Ilya Lipnitskiy <[email protected]>
MIPS: pci-legacy: stop using of_pci_range_to_resource
Vitaly Chikunov <[email protected]>
perf beauty: Fix fsconfig generator
Dan Carpenter <[email protected]>
drm/i915/gvt: Fix error code in intel_gvt_init_device()
Shengjiu Wang <[email protected]>
ASoC: ak5558: correct reset polarity
Cédric Le Goater <[email protected]>
powerpc/xive: Fix xmon command "dxi"
Sergey Shtylyov <[email protected]>
i2c: sh7760: add IRQ check
Sergey Shtylyov <[email protected]>
i2c: jz4780: add IRQ check
Sergey Shtylyov <[email protected]>
i2c: emev2: add IRQ check
Sergey Shtylyov <[email protected]>
i2c: cadence: add IRQ check
Qinglang Miao <[email protected]>
i2c: sprd: fix reference leak when pm_runtime_get_sync fails
Qinglang Miao <[email protected]>
i2c: omap: fix reference leak when pm_runtime_get_sync fails
Qinglang Miao <[email protected]>
i2c: imx-lpi2c: fix reference leak when pm_runtime_get_sync fails
Qinglang Miao <[email protected]>
i2c: img-scb: fix reference leak when pm_runtime_get_sync fails
Wang Wensheng <[email protected]>
RDMA/srpt: Fix error return code in srpt_cm_req_recv()
Colin Ian King <[email protected]>
net: thunderx: Fix unintentional sign extension issue
Colin Ian King <[email protected]>
cxgb4: Fix unintentional sign extension issues
Wang Wensheng <[email protected]>
IB/hfi1: Fix error return code in parse_platform_config()
Wang Wensheng <[email protected]>
RDMA/qedr: Fix error return code in qedr_iw_connect()
Nicholas Piggin <[email protected]>
KVM: PPC: Book3S HV P9: Restore host CTRL SPR after guest exit
Colin Ian King <[email protected]>
mt7601u: fix always true expression
Johannes Berg <[email protected]>
mac80211: bail out if cipher schemes are invalid
Randy Dunlap <[email protected]>
powerpc: iommu: fix build when neither PCI or IBMVIO is set
Athira Rajeev <[email protected]>
powerpc/perf: Fix PMU constraint check for EBB events
Jordan Niethe <[email protected]>
powerpc/64s: Fix pte update for kernel memory on radix
Colin Ian King <[email protected]>
liquidio: Fix unintented sign extension of a left shift of a u16
Krzysztof Kozlowski <[email protected]>
ASoC: simple-card: fix possible uninitialized single_cpu local variable
Alexandru Elisei <[email protected]>
KVM: arm64: Initialize VCPU mdcr_el2 before loading it
Takashi Iwai <[email protected]>
ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls
Álvaro Fernández Rojas <[email protected]>
mips: bmips: fix syscon-reboot nodes
Salil Mehta <[email protected]>
net: hns3: Limiting the scope of vector_ring_chain variable
Dan Carpenter <[email protected]>
nfc: pn533: prevent potential memory corruption
Andrew Scull <[email protected]>
bug: Remove redundant condition check in report_bug
Jia Zhou <[email protected]>
ALSA: core: remove redundant spin_lock pair in snd_card_disconnect
Chen Huang <[email protected]>
powerpc: Fix HAVE_HARDLOCKUP_DETECTOR_ARCH build configuration
Eric Dumazet <[email protected]>
inet: use bigger hash table for IP ID generation
Nathan Chancellor <[email protected]>
powerpc/prom: Mark identical_pvr_fixup as __init
Nathan Chancellor <[email protected]>
powerpc/fadump: Mark fadump_calculate_reserve_size as __init
Xie He <[email protected]>
net: lapbether: Prevent racing when checking whether the netif is running
Arnaldo Carvalho de Melo <[email protected]>
perf symbols: Fix dso__fprintf_symbols_by_name() to return the number of printed chars
Maxim Mikityanskiy <[email protected]>
HID: plantronics: Workaround for double volume key presses
Lv Yunlong <[email protected]>
drivers/block/null_blk/main: Fix a double free in null_init.
Waiman Long <[email protected]>
sched/debug: Fix cgroup_path[] serialization
Nathan Chancellor <[email protected]>
x86/events/amd/iommu: Fix sysfs type mismatch
Dan Carpenter <[email protected]>
HSI: core: fix resource leaks in hsi_add_client_from_dt()
Niklas Cassel <[email protected]>
nvme-pci: don't simple map sgl when sgls are disabled
Fabrice Gasnier <[email protected]>
mfd: stm32-timers: Avoid clearing auto reload register
Brian King <[email protected]>
scsi: ibmvfc: Fix invalid state machine BUG_ON()
Sergey Shtylyov <[email protected]>
scsi: sni_53c710: Add IRQ check
Sergey Shtylyov <[email protected]>
scsi: sun3x_esp: Add IRQ check
Sergey Shtylyov <[email protected]>
scsi: jazz_esp: Add IRQ check
Sergey Shtylyov <[email protected]>
scsi: hisi_sas: Fix IRQ checks
Colin Ian King <[email protected]>
clk: uniphier: Fix potential infinite loop
Chen Hui <[email protected]>
clk: qcom: a53-pll: Add missing MODULE_DEVICE_TABLE
Quanyang Wang <[email protected]>
clk: zynqmp: move zynqmp_pll_set_mode out of round_rate callback
Jason Gunthorpe <[email protected]>
vfio/mdev: Do not allow a mdev_type to have a NULL parent pointer
Hans Verkuil <[email protected]>
media: v4l2-ctrls.c: fix race condition in hdl->requests list
Hannes Reinecke <[email protected]>
nvme: retrigger ANA log update if group descriptor isn't found
Sagi Grimberg <[email protected]>
nvmet-tcp: fix incorrect locking in state_change sk callback
Sagi Grimberg <[email protected]>
nvme-tcp: block BH in sk state_change sk callback
Sergey Shtylyov <[email protected]>
ata: libahci_platform: fix IRQ check
Sergey Shtylyov <[email protected]>
sata_mv: add IRQ checks
Sergey Shtylyov <[email protected]>
pata_ipx4xx_cf: fix IRQ check
Sergey Shtylyov <[email protected]>
pata_arasan_cf: fix IRQ check
Masami Hiramatsu <[email protected]>
x86/kprobes: Fix to check non boostable prefixes correctly
Felix Kuehling <[email protected]>
drm/amdkfd: fix build error with AMD_IOMMU_V2=m
Colin Ian King <[email protected]>
media: m88rs6000t: avoid potential out-of-bounds reads on arrays
Jia-Ju Bai <[email protected]>
media: platform: sunxi: sun6i-csi: fix error return code of sun6i_video_start_streaming()
Jae Hyun Yoo <[email protected]>
media: aspeed: fix clock handling logic
Yang Yingliang <[email protected]>
media: omap4iss: return error code when omap4iss_get() failed
Colin Ian King <[email protected]>
media: vivid: fix assignment of dev->fbuf_out_flags
Dan Carpenter <[email protected]>
soc: aspeed: fix a ternary sign expansion bug
Paul Durrant <[email protected]>
xen-blkback: fix compatibility bug with single page rings
Tetsuo Handa <[email protected]>
ttyprintk: Add TTY hangup callback.
Artur Petrosyan <[email protected]>
usb: dwc2: Fix hibernation between host and device modes.
Artur Petrosyan <[email protected]>
usb: dwc2: Fix host mode hibernation exit with remote wakeup flow.
Michael Kelley <[email protected]>
Drivers: hv: vmbus: Increase wait time for VMbus unload
Ingo Molnar <[email protected]>
x86/platform/uv: Fix !KEXEC build failure
Steffen Dirkwinkel <[email protected]>
platform/x86: pmc_atom: Match all Beckhoff Automation baytrail boards with critclk_systems DMI table
Ye Bin <[email protected]>
usbip: vudc: fix missing unlock on error in usbip_sockfd_store()
Dan Carpenter <[email protected]>
node: fix device cleanups in error handling code
He Ying <[email protected]>
firmware: qcom-scm: Fix QCOM_SCM configuration
Johan Hovold <[email protected]>
serial: core: return early on unsupported ioctls
Johan Hovold <[email protected]>
tty: fix return value for unsupported ioctls
Johan Hovold <[email protected]>
tty: actually undefine superseded ASYNC flags
Johan Hovold <[email protected]>
USB: cdc-acm: fix TIOCGSERIAL implementation
Johan Hovold <[email protected]>
USB: cdc-acm: fix unprivileged TIOCCSERIAL
Colin Ian King <[email protected]>
usb: gadget: r8a66597: Add missing null check on return from platform_get_resource
Wang Li <[email protected]>
spi: fsl-lpspi: Fix PM reference leak in lpspi_prepare_xfer_hardware()
Pali Rohár <[email protected]>
cpufreq: armada-37xx: Fix determining base CPU frequency
Pali Rohár <[email protected]>
cpufreq: armada-37xx: Fix driver cleanup when registration failed
Pali Rohár <[email protected]>
clk: mvebu: armada-37xx-periph: Fix workaround for switching from L1 to L0
Pali Rohár <[email protected]>
clk: mvebu: armada-37xx-periph: Fix switching CPU freq from 250 Mhz to 1 GHz
Pali Rohár <[email protected]>
cpufreq: armada-37xx: Fix the AVS value for load L1
Marek Behún <[email protected]>
clk: mvebu: armada-37xx-periph: remove .set_parent method for CPU PM clock
Marek Behún <[email protected]>
cpufreq: armada-37xx: Fix setting TBG parent for load levels
Lv Yunlong <[email protected]>
crypto: qat - Fix a double free in adf_create_ring
Nathan Chancellor <[email protected]>
ACPI: CPPC: Replace cppc_attr with kobj_attribute
Bjorn Andersson <[email protected]>
soc: qcom: mdt_loader: Detect truncated read of segments
Bjorn Andersson <[email protected]>
soc: qcom: mdt_loader: Validate that p_filesz < p_memsz
William A. Kennington III <[email protected]>
spi: Fix use-after-free with devm_spi_alloc_*
Dong Aisheng <[email protected]>
PM / devfreq: Use more accurate returned new_freq as resume_freq
Johan Hovold <[email protected]>
staging: greybus: uart: fix unprivileged TIOCCSERIAL
Colin Ian King <[email protected]>
staging: rtl8192u: Fix potential infinite loop
Arnd Bergmann <[email protected]>
irqchip/gic-v3: Fix OF_BAD_ADDR error handling
Lv Yunlong <[email protected]>
mtd: rawnand: gpmi: Fix a double free in gpmi_nand_init
Finn Thain <[email protected]>
m68k: mvme147,mvme16x: Don't wipe PCC timer config bits
Rander Wang <[email protected]>
soundwire: stream: fix memory leak in stream config error path
gexueyuan <[email protected]>
memory: pl353: fix mask of ECC page_size config register
Yang Yingliang <[email protected]>
USB: gadget: udc: fix wrong pointer passed to IS_ERR() and PTR_ERR()
Tao Ren <[email protected]>
usb: gadget: aspeed: fix dma map failure
Giovanni Cabiddu <[email protected]>
crypto: qat - fix error path in adf_isr_resource_alloc()
Geert Uytterhoeven <[email protected]>
phy: marvell: ARMADA375_USBCLUSTER_PHY should not default to y, unconditionally
Srinivas Kandagatla <[email protected]>
soundwire: bus: Fix device found flag correctly
Pan Bian <[email protected]>
bus: qcom: Put child node before return
Michael Walle <[email protected]>
mtd: require write permissions for locking and badblock ioctls
Fabian Vogt <[email protected]>
fotg210-udc: Complete OUT requests on short packets
Fabian Vogt <[email protected]>
fotg210-udc: Don't DMA more than the buffer can take
Fabian Vogt <[email protected]>
fotg210-udc: Mask GRP2 interrupts we don't handle
Fabian Vogt <[email protected]>
fotg210-udc: Remove a dubious condition leading to fotg210_done
Fabian Vogt <[email protected]>
fotg210-udc: Fix EP0 IN requests bigger than two packets
Fabian Vogt <[email protected]>
fotg210-udc: Fix DMA on EP0 for length > max packet size
Tong Zhang <[email protected]>
crypto: qat - ADF_STATUS_PF_RUNNING should be set after adf_dev_init
Tong Zhang <[email protected]>
crypto: qat - don't release uninitialized resources
Andy Shevchenko <[email protected]>
usb: gadget: pch_udc: Check for DMA mapping error
Andy Shevchenko <[email protected]>
usb: gadget: pch_udc: Check if driver is present before calling ->setup()
Andy Shevchenko <[email protected]>
usb: gadget: pch_udc: Replace cpu_to_le32() by lower_32_bits()
Otavio Pontes <[email protected]>
x86/microcode: Check for offline CPUs before requesting new microcode
Vladimir Barinov <[email protected]>
arm64: dts: renesas: r8a77980: Fix vin4-7 endpoint binding
Antonio Borneo <[email protected]>
spi: stm32: drop devres version of spi_register_master
Shawn Guo <[email protected]>
arm64: dts: qcom: sm8150: fix number of pins in 'gpio-ranges'
Manivannan Sadhasivam <[email protected]>
mtd: rawnand: qcom: Return actual error code instead of -ENODEV
Manivannan Sadhasivam <[email protected]>
mtd: Handle possible -EPROBE_DEFER from parse_mtd_partitions()
Álvaro Fernández Rojas <[email protected]>
mtd: rawnand: brcmnand: fix OOB R/W with Hamming ECC
Dan Carpenter <[email protected]>
mtd: rawnand: fsmc: Fix error code in fsmc_nand_probe()
Meng Li <[email protected]>
regmap: set debugfs_name to NULL after it is freed
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpci: Check ROLE_CONTROL while interpreting CC_STATUS
Erwan Le Ray <[email protected]>
serial: stm32: fix tx_empty condition
Erwan Le Ray <[email protected]>
serial: stm32: fix incorrect characters on console
Krzysztof Kozlowski <[email protected]>
ARM: dts: exynos: correct PMIC interrupt trigger level on Snow
Krzysztof Kozlowski <[email protected]>
ARM: dts: exynos: correct PMIC interrupt trigger level on SMDK5250
Krzysztof Kozlowski <[email protected]>
ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid X/U3 family
Krzysztof Kozlowski <[email protected]>
ARM: dts: exynos: correct PMIC interrupt trigger level on Midas family
Krzysztof Kozlowski <[email protected]>
ARM: dts: exynos: correct MUIC interrupt trigger level on Midas family
Krzysztof Kozlowski <[email protected]>
ARM: dts: exynos: correct fuel gauge interrupt trigger level on Midas family
Colin Ian King <[email protected]>
memory: gpmc: fix out of bounds read and dereference on gpmc_cs[]
Andy Shevchenko <[email protected]>
usb: gadget: pch_udc: Revert d3cb25a12138 completely
Dan Carpenter <[email protected]>
ovl: fix missing revert_creds() on error path
Jae Hyun Yoo <[email protected]>
Revert "i3c master: fix missing destroy_workqueue() on error in i3c_master_register"
Sean Christopherson <[email protected]>
KVM: Stop looking for coalesced MMIO zones if the bus is destroyed
Sean Christopherson <[email protected]>
KVM: nVMX: Truncate bits 63:32 of VMCS field on nested check in !64-bit
Claudio Imbrenda <[email protected]>
KVM: s390: split kvm_s390_real_to_abs
David Hildenbrand <[email protected]>
s390: fix detection of vector enhancements facility 1 vs. vector packed decimal facility
Heiko Carstens <[email protected]>
KVM: s390: fix guarded storage control register handling
Claudio Imbrenda <[email protected]>
KVM: s390: split kvm_s390_logical_to_effective
Sami Loone <[email protected]>
ALSA: hda/realtek: ALC285 Thinkpad jack pin quirk is unreachable
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Remove redundant entry for ALC861 Haier/Uniwill devices
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC662 quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order remaining ALC269 quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC269 Lenovo quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC269 Sony quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC269 ASUS quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC269 Dell quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC269 Acer quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC269 HP quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC882 Clevo quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC882 Sony quirk table entries
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Re-order ALC882 Acer quirk table entries
Harry Wentland <[email protected]>
drm/amd/display: Reject non-zero src_y and src_x for video planes
Colin Ian King <[email protected]>
drm/radeon: fix copy of uninitialized variable back to userspace
Boris Brezillon <[email protected]>
drm/panfrost: Don't try to map pages that are already mapped
Boris Brezillon <[email protected]>
drm/panfrost: Clear MMU irqs before handling the fault
Ping-Ke Shih <[email protected]>
rtw88: Fix array overrun in rtw_get_tx_power_params()
Johannes Berg <[email protected]>
cfg80211: scan: drop entry from hidden_list on overflow
Dan Carpenter <[email protected]>
ipw2x00: potential buffer overflow in libipw_wx_set_encodeext()
Maciej W. Rozycki <[email protected]>
MIPS: Reinstate platform `__div64_32' handler
Jan Glauber <[email protected]>
md: Fix missing unused status line of /proc/mdstat
Zhao Heming <[email protected]>
md: md_open returns -EBUSY when entering racing area
Christoph Hellwig <[email protected]>
md: factor out a mddev_find_locked helper from mddev_find
Christoph Hellwig <[email protected]>
md: split mddev_find
Heming Zhao <[email protected]>
md-cluster: fix use-after-free issue when removing rdev
Sudhakar Panneerselvam <[email protected]>
md/bitmap: wait for external bitmap writes to complete during tear down
Tetsuo Handa <[email protected]>
misc: vmw_vmci: explicitly initialize vmci_datagram payload
Tetsuo Handa <[email protected]>
misc: vmw_vmci: explicitly initialize vmci_notify_bm_set_msg struct
Hans de Goede <[email protected]>
misc: lis3lv02d: Fix false-positive WARN on various HP models
Jonathan Cameron <[email protected]>
iio:accel:adis16201: Fix wrong axis assignment that prevents loading
Arun Easi <[email protected]>
PCI: Allow VPD access for QLogic ISP2722
Maciej W. Rozycki <[email protected]>
FDDI: defxx: Bail out gracefully with unassigned PCI resource for CSR
Ilya Lipnitskiy <[email protected]>
MIPS: pci-rt2880: fix slot 0 configuration
Ilya Lipnitskiy <[email protected]>
MIPS: pci-mt7620: fix PLL lock check
Lukasz Majczak <[email protected]>
ASoC: Intel: kbl_da7219_max98927: Fix kabylake_ssp_fixup function
Pierre-Louis Bossart <[email protected]>
ASoC: samsung: tm2_wm5110: check of of_parse return value
Chunfeng Yun <[email protected]>
usb: xhci-mtk: improve bandwidth scheduling with TT
Chunfeng Yun <[email protected]>
usb: xhci-mtk: remove or operator for setting schedule parameters
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpm: update power supply once partner accepts
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpm: Address incorrect values of tcpm psy for pps supply
Badhri Jagan Sridharan <[email protected]>
usb: typec: tcpm: Address incorrect values of tcpm psy for fixed supply
Johan Hovold <[email protected]>
staging: fwserial: fix TIOCSSERIAL permission check
Johan Hovold <[email protected]>
tty: moxa: fix TIOCSSERIAL permission check
Johan Hovold <[email protected]>
staging: fwserial: fix TIOCSSERIAL jiffies conversions
Johan Hovold <[email protected]>
USB: serial: ti_usb_3410_5052: fix TIOCSSERIAL permission check
Johan Hovold <[email protected]>
staging: greybus: uart: fix TIOCSSERIAL jiffies conversions
Johan Hovold <[email protected]>
USB: serial: usb_wwan: fix TIOCSSERIAL jiffies conversions
Johan Hovold <[email protected]>
tty: amiserial: fix TIOCSSERIAL permission check
Johan Hovold <[email protected]>
tty: moxa: fix TIOCSSERIAL jiffies conversions
Johan Hovold <[email protected]>
Revert "USB: cdc-acm: fix rounding error in TIOCSSERIAL"
Or Cohen <[email protected]>
net/nfc: fix use-after-free llcp_sock_bind/connect
Lin Ma <[email protected]>
bluetooth: eliminate the potential race condition when removing the HCI controller
Taehee Yoo <[email protected]>
hsr: use netdev_err() instead of WARN_ONCE()
Archie Pusaka <[email protected]>
Bluetooth: verify AMP hci_chan before amp_destroy
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/exynos4412-midas.dtsi | 6 +- arch/arm/boot/dts/exynos4412-odroid-common.dtsi | 2 +- arch/arm/boot/dts/exynos5250-smdk5250.dts | 2 +- arch/arm/boot/dts/exynos5250-snow-common.dtsi | 2 +- arch/arm/boot/dts/uniphier-pxs2.dtsi | 2 +- arch/arm64/boot/dts/qcom/sm8150.dtsi | 2 +- arch/arm64/boot/dts/renesas/r8a77980.dtsi | 16 +- arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi | 2 +- arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi | 4 +- arch/arm64/include/asm/kvm_host.h | 1 + arch/arm64/kvm/debug.c | 88 ++-- arch/m68k/include/asm/mvme147hw.h | 3 + arch/m68k/mvme147/config.c | 14 +- arch/m68k/mvme16x/config.c | 14 +- arch/mips/boot/dts/brcm/bcm3368.dtsi | 2 +- arch/mips/boot/dts/brcm/bcm63268.dtsi | 2 +- arch/mips/boot/dts/brcm/bcm6358.dtsi | 2 +- arch/mips/boot/dts/brcm/bcm6362.dtsi | 2 +- arch/mips/boot/dts/brcm/bcm6368.dtsi | 2 +- arch/mips/include/asm/div64.h | 57 ++- arch/mips/pci/pci-legacy.c | 9 +- arch/mips/pci/pci-mt7620.c | 5 +- arch/mips/pci/pci-rt2880.c | 37 +- arch/powerpc/Kconfig | 2 +- arch/powerpc/Kconfig.debug | 1 + arch/powerpc/include/asm/book3s/64/radix.h | 6 +- arch/powerpc/kernel/fadump.c | 2 +- arch/powerpc/kernel/prom.c | 2 +- arch/powerpc/kvm/book3s_hv.c | 3 + arch/powerpc/mm/book3s64/radix_pgtable.c | 4 +- arch/powerpc/perf/isa207-common.c | 4 +- arch/powerpc/platforms/52xx/lite5200_sleep.S | 2 +- arch/powerpc/platforms/pseries/pci_dlpar.c | 4 +- arch/powerpc/sysdev/xive/common.c | 14 +- arch/s390/kernel/setup.c | 4 +- arch/s390/kvm/gaccess.h | 54 ++- arch/s390/kvm/kvm-s390.c | 4 +- arch/x86/Kconfig | 1 + arch/x86/events/amd/iommu.c | 6 +- arch/x86/kernel/cpu/microcode/core.c | 8 +- arch/x86/kernel/kprobes/core.c | 17 +- arch/x86/kvm/vmx/nested.c | 2 +- drivers/acpi/cppc_acpi.c | 14 +- drivers/ata/libahci_platform.c | 4 +- drivers/ata/pata_arasan_cf.c | 15 +- drivers/ata/pata_ixp4xx_cf.c | 6 +- drivers/ata/sata_mv.c | 4 + drivers/base/node.c | 26 +- drivers/base/regmap/regmap-debugfs.c | 1 + drivers/block/null_blk_zoned.c | 1 + drivers/block/xen-blkback/common.h | 1 + drivers/block/xen-blkback/xenbus.c | 38 +- drivers/bus/qcom-ebi2.c | 4 +- drivers/char/ttyprintk.c | 11 + drivers/clk/clk-ast2600.c | 4 +- drivers/clk/mvebu/armada-37xx-periph.c | 83 ++-- drivers/clk/qcom/a53-pll.c | 1 + drivers/clk/uniphier/clk-uniphier-mux.c | 4 +- drivers/clk/zynqmp/pll.c | 12 +- drivers/cpufreq/armada-37xx-cpufreq.c | 76 +++- drivers/crypto/qat/qat_c3xxxvf/adf_drv.c | 4 +- drivers/crypto/qat/qat_c62xvf/adf_drv.c | 4 +- drivers/crypto/qat/qat_common/adf_isr.c | 29 +- drivers/crypto/qat/qat_common/adf_transport.c | 1 + drivers/crypto/qat/qat_common/adf_vf_isr.c | 17 +- drivers/crypto/qat/qat_dh895xccvf/adf_drv.c | 4 +- drivers/devfreq/devfreq.c | 2 +- drivers/firmware/Kconfig | 1 + drivers/gpu/drm/amd/amdkfd/kfd_iommu.c | 6 + drivers/gpu/drm/amd/amdkfd/kfd_iommu.h | 9 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 17 + drivers/gpu/drm/i915/gvt/gvt.c | 8 +- drivers/gpu/drm/panfrost/panfrost_mmu.c | 13 +- drivers/gpu/drm/radeon/radeon_kms.c | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-plantronics.c | 60 ++- drivers/hsi/hsi_core.c | 3 +- drivers/hv/channel_mgmt.c | 30 +- drivers/i2c/busses/i2c-cadence.c | 5 +- drivers/i2c/busses/i2c-emev2.c | 5 +- drivers/i2c/busses/i2c-img-scb.c | 4 +- drivers/i2c/busses/i2c-imx-lpi2c.c | 2 +- drivers/i2c/busses/i2c-jz4780.c | 5 +- drivers/i2c/busses/i2c-omap.c | 8 +- drivers/i2c/busses/i2c-sh7760.c | 5 +- drivers/i2c/busses/i2c-sprd.c | 4 +- drivers/i3c/master.c | 5 +- drivers/iio/accel/adis16201.c | 2 +- drivers/infiniband/hw/bnxt_re/qplib_res.c | 1 + drivers/infiniband/hw/cxgb4/resource.c | 2 +- drivers/infiniband/hw/hfi1/firmware.c | 1 + drivers/infiniband/hw/i40iw/i40iw_pble.c | 6 +- drivers/infiniband/hw/qedr/qedr_iw_cm.c | 4 +- drivers/infiniband/sw/siw/siw_mem.c | 4 +- drivers/infiniband/ulp/srpt/ib_srpt.c | 1 + drivers/irqchip/irq-gic-v3-mbi.c | 2 +- drivers/md/md-bitmap.c | 2 + drivers/md/md.c | 73 +-- drivers/media/platform/aspeed-video.c | 9 +- .../media/platform/sunxi/sun6i-csi/sun6i_video.c | 4 +- drivers/media/platform/vivid/vivid-vid-out.c | 2 +- drivers/media/tuners/m88rs6000t.c | 6 +- drivers/media/v4l2-core/v4l2-ctrls.c | 17 +- drivers/memory/omap-gpmc.c | 7 +- drivers/memory/pl353-smc.c | 2 +- drivers/mfd/stm32-timers.c | 7 +- drivers/misc/lis3lv02d/lis3lv02d.c | 21 +- drivers/misc/vmw_vmci/vmci_doorbell.c | 2 +- drivers/misc/vmw_vmci/vmci_guest.c | 2 +- drivers/mtd/mtdchar.c | 8 +- drivers/mtd/mtdcore.c | 3 + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 6 + drivers/mtd/nand/raw/fsmc_nand.c | 2 + drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 2 +- drivers/mtd/nand/raw/qcom_nandc.c | 7 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 +- .../net/ethernet/cavium/liquidio/cn23xx_pf_regs.h | 2 +- drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 2 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 22 +- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 3 +- drivers/net/ethernet/qualcomm/emac/emac-mac.c | 4 +- drivers/net/ethernet/renesas/ravb_main.c | 35 +- drivers/net/ethernet/ti/davinci_emac.c | 4 +- drivers/net/fddi/defxx.c | 47 +- drivers/net/geneve.c | 4 +- drivers/net/phy/intel-xway.c | 21 + drivers/net/wan/lapbether.c | 32 +- drivers/net/wireless/ath/ath10k/wmi-tlv.c | 3 + drivers/net/wireless/ath/ath9k/htc_drv_init.c | 2 +- drivers/net/wireless/ath/ath9k/hw.c | 2 +- drivers/net/wireless/intel/ipw2x00/libipw_wx.c | 6 +- drivers/net/wireless/marvell/mwl8k.c | 1 + drivers/net/wireless/mediatek/mt7601u/eeprom.c | 2 +- .../net/wireless/realtek/rtlwifi/rtl8821ae/table.c | 500 +++++++++++++++------ drivers/net/wireless/realtek/rtw88/phy.c | 5 +- drivers/nfc/pn533/pn533.c | 3 + drivers/nvme/host/multipath.c | 4 + drivers/nvme/host/pci.c | 2 +- drivers/nvme/host/tcp.c | 4 +- drivers/nvme/target/tcp.c | 4 +- drivers/of/fdt.c | 12 +- drivers/pci/vpd.c | 1 - drivers/phy/marvell/Kconfig | 4 +- drivers/platform/x86/pmc_atom.c | 28 +- drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 6 +- drivers/scsi/ibmvscsi/ibmvfc.c | 57 ++- drivers/scsi/jazz_esp.c | 4 +- drivers/scsi/sni_53c710.c | 5 +- drivers/scsi/sun3x_esp.c | 4 +- drivers/soc/aspeed/aspeed-lpc-snoop.c | 4 +- drivers/soc/qcom/mdt_loader.c | 17 + drivers/soundwire/bus.c | 3 +- drivers/soundwire/stream.c | 10 +- drivers/spi/spi-fsl-lpspi.c | 2 +- drivers/spi/spi-stm32.c | 3 +- drivers/spi/spi.c | 9 +- drivers/staging/fwserial/fwserial.c | 10 +- drivers/staging/greybus/uart.c | 13 +- drivers/staging/media/omap4iss/iss.c | 4 +- drivers/staging/rtl8192u/r8192U_core.c | 2 +- drivers/tty/amiserial.c | 1 + drivers/tty/moxa.c | 18 +- drivers/tty/serial/serial_core.c | 6 +- drivers/tty/serial/stm32-usart.c | 17 +- drivers/tty/serial/stm32-usart.h | 3 - drivers/tty/tty_io.c | 8 +- drivers/usb/class/cdc-acm.c | 16 +- drivers/usb/dwc2/core_intr.c | 154 ++++--- drivers/usb/dwc2/hcd.c | 10 +- drivers/usb/gadget/udc/aspeed-vhub/core.c | 3 +- drivers/usb/gadget/udc/aspeed-vhub/epn.c | 2 +- drivers/usb/gadget/udc/fotg210-udc.c | 26 +- drivers/usb/gadget/udc/pch_udc.c | 49 +- drivers/usb/gadget/udc/r8a66597-udc.c | 2 + drivers/usb/gadget/udc/snps_udc_plat.c | 4 +- drivers/usb/host/xhci-mtk-sch.c | 80 +++- drivers/usb/host/xhci-mtk.h | 6 +- drivers/usb/serial/ti_usb_3410_5052.c | 9 +- drivers/usb/serial/usb_wwan.c | 9 +- drivers/usb/typec/tcpm/tcpci.c | 21 +- drivers/usb/typec/tcpm/tcpm.c | 105 +++-- drivers/usb/usbip/vudc_sysfs.c | 2 + drivers/vfio/mdev/mdev_sysfs.c | 2 +- fs/overlayfs/copy_up.c | 3 +- include/linux/hid.h | 2 + include/linux/kvm_host.h | 4 +- include/linux/smp.h | 2 +- include/linux/spi/spi.h | 3 + include/linux/tty_driver.h | 2 +- include/net/addrconf.h | 1 - include/net/bluetooth/hci_core.h | 1 + include/uapi/linux/tty_flags.h | 4 +- kernel/sched/debug.c | 42 +- kernel/smp.c | 10 +- kernel/up.c | 2 +- lib/bug.c | 33 +- mm/memory-failure.c | 2 +- mm/sparse.c | 1 + net/bluetooth/hci_event.c | 3 +- net/bluetooth/hci_request.c | 12 +- net/bridge/br_multicast.c | 33 +- net/core/dev.c | 8 +- net/hsr/hsr_framereg.c | 3 +- net/ipv4/route.c | 42 +- net/ipv4/tcp_cong.c | 4 + net/ipv6/mcast_snoop.c | 12 +- net/mac80211/main.c | 7 +- net/nfc/digital_dep.c | 2 + net/nfc/llcp_sock.c | 4 + net/sctp/socket.c | 38 +- net/vmw_vsock/vmci_transport.c | 3 +- net/wireless/scan.c | 2 + samples/kfifo/bytestream-example.c | 8 +- samples/kfifo/inttype-example.c | 8 +- samples/kfifo/record-example.c | 8 +- sound/core/init.c | 2 - sound/pci/hda/patch_realtek.c | 127 +++--- sound/soc/codecs/ak5558.c | 4 +- sound/soc/generic/audio-graph-card.c | 2 +- sound/soc/generic/simple-card.c | 2 +- sound/soc/intel/boards/kbl_da7219_max98927.c | 38 +- sound/soc/samsung/tm2_wm5110.c | 2 +- sound/usb/card.c | 14 +- sound/usb/midi.c | 2 +- sound/usb/quirks.c | 16 +- sound/usb/usbaudio.h | 2 + tools/perf/trace/beauty/fsconfig.sh | 7 +- tools/perf/util/symbol_fprintf.c | 2 +- .../net/forwarding/mirror_gre_vlan_bridge_1q.sh | 2 +- virt/kvm/arm/arm.c | 2 + virt/kvm/coalesced_mmio.c | 19 +- virt/kvm/kvm_main.c | 10 +- 233 files changed, 2110 insertions(+), 1110 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/244 Bluetooth: verify AMP hci_chan before amp_destroy
From: Archie Pusaka <[email protected]>
commit 5c4c8c9544099bb9043a10a5318130a943e32fc3 upstream.
hci_chan can be created in 2 places: hci_loglink_complete_evt() if it is an AMP hci_chan, or l2cap_conn_add() otherwise. In theory, Only AMP hci_chan should be removed by a call to hci_disconn_loglink_complete_evt(). However, the controller might mess up, call that function, and destroy an hci_chan which is not initiated by hci_loglink_complete_evt().
This patch adds a verification that the destroyed hci_chan must have been init'd by hci_loglink_complete_evt().
Example crash call trace:
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0xe3/0x144 lib/dump_stack.c:118
print_address_description+0x67/0x22a mm/kasan/report.c:256
kasan_report_error mm/kasan/report.c:354 [inline]
kasan_report mm/kasan/report.c:412 [inline]
kasan_report+0x251/0x28f mm/kasan/report.c:396
hci_send_acl+0x3b/0x56e net/bluetooth/hci_core.c:4072
l2cap_send_cmd+0x5af/0x5c2 net/bluetooth/l2cap_core.c:877
l2cap_send_move_chan_cfm_icid+0x8e/0xb1 net/bluetooth/l2cap_core.c:4661
l2cap_move_fail net/bluetooth/l2cap_core.c:5146 [inline]
l2cap_move_channel_rsp net/bluetooth/l2cap_core.c:5185 [inline]
l2cap_bredr_sig_cmd net/bluetooth/l2cap_core.c:5464 [inline]
l2cap_sig_channel net/bluetooth/l2cap_core.c:5799 [inline]
l2cap_recv_frame+0x1d12/0x51aa net/bluetooth/l2cap_core.c:7023
l2cap_recv_acldata+0x2ea/0x693 net/bluetooth/l2cap_core.c:7596
hci_acldata_packet net/bluetooth/hci_core.c:4606 [inline]
hci_rx_work+0x2bd/0x45e net/bluetooth/hci_core.c:4796
process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
kthread+0x2f0/0x304 kernel/kthread.c:253
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
Allocated by task 38:
set_track mm/kasan/kasan.c:460 [inline]
kasan_kmalloc+0x8d/0x9a mm/kasan/kasan.c:553
kmem_cache_alloc_trace+0x102/0x129 mm/slub.c:2787
kmalloc include/linux/slab.h:515 [inline]
kzalloc include/linux/slab.h:709 [inline]
hci_chan_create+0x86/0x26d net/bluetooth/hci_conn.c:1674
l2cap_conn_add.part.0+0x1c/0x814 net/bluetooth/l2cap_core.c:7062
l2cap_conn_add net/bluetooth/l2cap_core.c:7059 [inline]
l2cap_connect_cfm+0x134/0x852 net/bluetooth/l2cap_core.c:7381
hci_connect_cfm+0x9d/0x122 include/net/bluetooth/hci_core.h:1404
hci_remote_ext_features_evt net/bluetooth/hci_event.c:4161 [inline]
hci_event_packet+0x463f/0x72fa net/bluetooth/hci_event.c:5981
hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
kthread+0x2f0/0x304 kernel/kthread.c:253
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
Freed by task 1732:
set_track mm/kasan/kasan.c:460 [inline]
__kasan_slab_free mm/kasan/kasan.c:521 [inline]
__kasan_slab_free+0x106/0x128 mm/kasan/kasan.c:493
slab_free_hook mm/slub.c:1409 [inline]
slab_free_freelist_hook+0xaa/0xf6 mm/slub.c:1436
slab_free mm/slub.c:3009 [inline]
kfree+0x182/0x21e mm/slub.c:3972
hci_disconn_loglink_complete_evt net/bluetooth/hci_event.c:4891 [inline]
hci_event_packet+0x6a1c/0x72fa net/bluetooth/hci_event.c:6050
hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
kthread+0x2f0/0x304 kernel/kthread.c:253
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
The buggy address belongs to the object at ffff8881d7af9180
which belongs to the cache kmalloc-128 of size 128
The buggy address is located 24 bytes inside of
128-byte region [ffff8881d7af9180, ffff8881d7af9200)
The buggy address belongs to the page:
page:ffffea00075ebe40 count:1 mapcount:0 mapping:ffff8881da403200 index:0x0
flags: 0x8000000000000200(slab)
raw: 8000000000000200 dead000000000100 dead000000000200 ffff8881da403200
raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff8881d7af9080: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
ffff8881d7af9100: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
>ffff8881d7af9180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff8881d7af9200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff8881d7af9280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc--- include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_event.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-)
include/net/bluetooth/hci_core.h +1 -0
@@ -540,6 +540,7 @@ struct hci_chan {struct sk_buff_head data_q;unsigned int sent;__u8 state; +bool amp; };struct hci_conn_params {
net/bluetooth/hci_event.c +2 -1
@@ -4840,6 +4840,7 @@ static void hci_loglink_complete_evt(strreturn ; hchan->handle =le16_to_cpu (ev->handle); + hchan->amp = true;BT_DBG ("hcon %p mgr %p hchan %p" , hcon, hcon->amp_mgr, hchan);
@@ -4872,7 +4873,7 @@ static void hci_disconn_loglink_completehci_dev_lock (hdev); hchan =hci_chan_lookup_handle (hdev,le16_to_cpu (ev->handle)); -if (!hchan) +if (!hchan || !hchan->amp) goto unlock;amp_destroy_logical_link (hchan, ev->reason);
Greg Kroah-Hartman
maintainerPATCH 2/244 hsr: use netdev_err() instead of WARN_ONCE()
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
commit 4b793acdca0050739b99ace6a8b9e7f717f57c6b upstream.
When HSR interface is sending a frame, it finds a node with the destination ethernet address from the list.
If there is no node, it calls WARN_ONCE().
But, using WARN_ONCE() for this situation is a little bit overdoing. So, in this patch, the netdev_err() is used instead.
--- net/hsr/hsr_framereg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/hsr/hsr_framereg.c +2 -1
@@ -318,7 +318,8 @@ void hsr_addr_subst_dest(struct hsr_node node_dst =find_node_by_addr_A (&port->hsr->node_db,eth_hdr (skb)->h_dest);if (!node_dst) { -WARN_ONCE (1 ,"%s: Unknown node\n" , __func__); +if (net_ratelimit ()) +netdev_err (skb->dev,"%s: Unknown node\n" , __func__);return ; }if (port->type != node_dst->addr_B_port)
Greg Kroah-Hartman
maintainerPATCH 3/244 bluetooth: eliminate the potential race condition when removing the HCI controller
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
commit e2cb6b891ad2b8caa9131e3be70f45243df82a80 upstream.
There is a possible race condition vulnerability between issuing a HCI command and removing the cont. Specifically, functions hci_req_sync() and hci_dev_do_close() can race each other like below:
thread-A in hci_req_sync() | thread-B in hci_dev_do_close()
| hci_req_sync_lock(hdev);
test_bit(HCI_UP, &hdev->flags); |
... | test_and_clear_bit(HCI_UP, &hdev->flags)
hci_req_sync_lock(hdev); |
|In this commit we alter the sequence in function hci_req_sync(). Hence, the thread-A cannot issue th.
--- net/bluetooth/hci_request.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/bluetooth/hci_request.c +8 -4
@@ -271,12 +271,16 @@ int hci_req_sync(struct hci_dev *hdev, i {int ret; -if (!test_bit (HCI_UP , &hdev->flags)) -return -ENETDOWN ; -/* Serialize all requests */ hci_req_sync_lock (hdev); - ret =__hci_req_sync (hdev, req, opt, timeout, hci_status); +/* check the state after obtaing the lock to protect the HCI_UP +* against any races from hci_dev_do_close when the controller +* gets removed. +*/ +if (test_bit (HCI_UP , &hdev->flags)) + ret =__hci_req_sync (hdev, req, opt, timeout, hci_status); +else + ret = -ENETDOWN ;hci_req_sync_unlock (hdev);return ret;
Greg Kroah-Hartman
maintainerPATCH 4/244 net/nfc: fix use-after-free llcp_sock_bind/connect
In reply to Greg Kroah-HartmanFrom: Or Cohen <[email protected]>
commit c61760e6940dd4039a7f5e84a6afc9cdbf4d82b6 upstream.
Commits 8a4cd82d ("nfc: fix refcount leak in llcp_sock_connect()") and c33b1cc62 ("nfc: fix refcount leak in llcp_sock_bind()") fixed a refcount leak bug in bind/connect but introduced a use-after-free if the same local is assigned to 2 different sockets.
This can be triggered by the following simple program:
int sock1 = socket( AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP );
int sock2 = socket( AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP );
memset( &addr, 0, sizeof(struct sockaddr_nfc_llcp) );
addr.sa_family = AF_NFC;
addr.nfc_protocol = NFC_PROTO_NFC_DEP;
bind( sock1, (struct sockaddr*) &addr, sizeof(struct sockaddr_nfc_llcp) )
bind( sock2, (struct sockaddr*) &addr, sizeof(struct sockaddr_nfc_llcp) )
close(sock1);
close(sock2);Fix this by assigning NULL to llcp_sock->local after calling nfc_llcp_local_put.
This addresses CVE-2021-23134.
--- net/nfc/llcp_sock.c | 4 ++++ 1 file changed, 4 insertions(+)
net/nfc/llcp_sock.c +4 -0
@@ -109,12 +109,14 @@ static int llcp_sock_bind(struct socket GFP_KERNEL);if (!llcp_sock->service_name) {nfc_llcp_local_put (llcp_sock->local); + llcp_sock->local =NULL ; ret = -ENOMEM ; goto put_dev; } llcp_sock->ssap =nfc_llcp_get_sdp_ssap (local, llcp_sock);if (llcp_sock->ssap ==LLCP_SAP_MAX ) {nfc_llcp_local_put (llcp_sock->local); + llcp_sock->local =NULL ;kfree (llcp_sock->service_name); llcp_sock->service_name =NULL ; ret = -EADDRINUSE ;
@@ -709,6 +711,7 @@ static int llcp_sock_connect(struct sock llcp_sock->ssap =nfc_llcp_get_local_ssap (local);if (llcp_sock->ssap ==LLCP_SAP_MAX ) {nfc_llcp_local_put (llcp_sock->local); + llcp_sock->local =NULL ; ret = -ENOMEM ; goto put_dev; }
@@ -756,6 +759,7 @@ sock_unlink: sock_llcp_release:nfc_llcp_put_ssap (local, llcp_sock->ssap);nfc_llcp_local_put (llcp_sock->local); + llcp_sock->local =NULL ; put_dev:nfc_put_device (dev);
Greg Kroah-Hartman
maintainerPATCH 5/244 Revert "USB: cdc-acm: fix rounding error in TIOCSSERIAL"
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 729f7955cb987c5b7d7e54c87c5ad71c789934f7 upstream.
This reverts commit b401f8c4f492cbf74f3f59c9141e5be3071071bb.
The offending commit claimed that trying to set the values reported back by TIOCGSERIAL as a regular user could result in an -EPERM error when HZ is 250, but that was never the case.
With HZ=250, the default 0.5 second value of close_delay is converted to 125 jiffies when set and is converted back to 50 centiseconds by TIOCGSERIAL as expected (not 12 cs as was claimed, even if that was the case before an earlier fix).
Comparing the internal current and new jiffies values is just fine to determine if the value is about to change so drop the bogus workaround (which was also backported to stable).
For completeness: With different default values for these parameters or with a HZ value not divisible by two, the lack of rounding when setting the default values in tty_port_init() could result in an -EPERM being returned, but this is hardly something we need to worry about.
--- drivers/usb/class/cdc-acm.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/usb/class/cdc-acm.c +2 -9
@@ -941,7 +941,6 @@ static int set_serial_info(struct tty_st {struct acm *acm = tty->driver_data;unsigned int closing_wait, close_delay; -unsigned int old_closing_wait, old_close_delay;int retval =0 ; close_delay =msecs_to_jiffies (ss->close_delay *10 );
@@ -949,17 +948,11 @@ static int set_serial_info(struct tty_st ASYNC_CLOSING_WAIT_NONE :msecs_to_jiffies (ss->closing_wait *10 ); -/* we must redo the rounding here, so that the values match */ - old_close_delay =jiffies_to_msecs (acm->port.close_delay) /10 ; - old_closing_wait = acm->port.closing_wait ==ASYNC_CLOSING_WAIT_NONE ? -ASYNC_CLOSING_WAIT_NONE : -jiffies_to_msecs (acm->port.closing_wait) /10 ; -mutex_lock (&acm->port.mutex);if (!capable (CAP_SYS_ADMIN )) { -if ((ss->close_delay != old_close_delay) || - (ss->closing_wait != old_closing_wait)) +if ((close_delay != acm->port.close_delay) || + (closing_wait != acm->port.closing_wait)) retval = -EPERM ;else retval = -EOPNOTSUPP ;
Greg Kroah-Hartman
maintainerPATCH 6/244 tty: moxa: fix TIOCSSERIAL jiffies conversions
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 6e70b73ca5240c0059a1fbf8ccd4276d6cf71956 upstream.
The port close_delay parameter set by TIOCSSERIAL is specified in jiffies, while the value returned by TIOCGSERIAL is specified in centiseconds.
Add the missing conversions so that TIOCGSERIAL works as expected also when HZ is not 100.
--- drivers/tty/moxa.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/moxa.c +2 -2
@@ -2040,7 +2040,7 @@ static int moxa_get_serial_info(struct t ss->line = info->port.tty->index, ss->flags = info->port.flags, ss->baud_base =921600 , - ss->close_delay = info->port.close_delay; + ss->close_delay =jiffies_to_msecs (info->port.close_delay) /10 ;mutex_unlock (&info->port.mutex);return 0 ; }
@@ -2069,7 +2069,7 @@ static int moxa_set_serial_info(struct treturn -EPERM ; } } - info->port.close_delay = ss->close_delay *HZ /100 ; + info->port.close_delay =msecs_to_jiffies (ss->close_delay *10 );MoxaSetFifo (info, ss->type ==PORT_16550A );
Greg Kroah-Hartman
maintainerPATCH 7/244 tty: amiserial: fix TIOCSSERIAL permission check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 1d31a831cc04f5f942de3e7d91edaa52310d3c99 upstream.
Changing the port closing_wait parameter is a privileged operation.
Add the missing check to TIOCSSERIAL so that -EPERM is returned in case an unprivileged user tries to change the closing-wait setting.
--- drivers/tty/amiserial.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/amiserial.c +1 -0
@@ -1032,6 +1032,7 @@ static int set_serial_info(struct tty_stif (!serial_isroot ()) {if ((ss->baud_base != state->baud_base) || (ss->close_delay != port->close_delay) || + (ss->closing_wait != port->closing_wait) || (ss->xmit_fifo_size != state->xmit_fifo_size) || ((ss->flags & ~ASYNC_USR_MASK ) != (port->flags & ~ASYNC_USR_MASK ))) {
Greg Kroah-Hartman
maintainerPATCH 8/244 USB: serial: usb_wwan: fix TIOCSSERIAL jiffies conversions
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 3d732690d2267f4d0e19077b178dffbedafdf0c9 upstream.
The port close_delay and closing_wait parameters set by TIOCSSERIAL are specified in jiffies and not milliseconds.
Add the missing conversions so that the TIOCSSERIAL works as expected also when HZ is not 1000.
--- drivers/usb/serial/usb_wwan.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/usb/serial/usb_wwan.c +5 -4
@@ -140,10 +140,10 @@ int usb_wwan_get_serial_info(struct tty_ ss->line = port->minor; ss->port = port->port_number; ss->baud_base =tty_get_baud_rate (port->port.tty); - ss->close_delay = port->port.close_delay /10 ; + ss->close_delay =jiffies_to_msecs (port->port.close_delay) /10 ; ss->closing_wait = port->port.closing_wait ==ASYNC_CLOSING_WAIT_NONE ?ASYNC_CLOSING_WAIT_NONE : - port->port.closing_wait /10 ; +jiffies_to_msecs (port->port.closing_wait) /10 ;return 0 ; }EXPORT_SYMBOL (usb_wwan_get_serial_info);
@@ -155,9 +155,10 @@ int usb_wwan_set_serial_info(struct tty_unsigned int closing_wait, close_delay;int retval =0 ; - close_delay = ss->close_delay *10 ; + close_delay =msecs_to_jiffies (ss->close_delay *10 ); closing_wait = ss->closing_wait ==ASYNC_CLOSING_WAIT_NONE ? -ASYNC_CLOSING_WAIT_NONE : ss->closing_wait *10 ; +ASYNC_CLOSING_WAIT_NONE : +msecs_to_jiffies (ss->closing_wait *10 );mutex_lock (&port->port.mutex);
Greg Kroah-Hartman
maintainerPATCH 9/244 staging: greybus: uart: fix TIOCSSERIAL jiffies conversions
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit b71e571adaa58be4fd289abebc8997e05b4c6b40 upstream.
The port close_delay and closing_wait parameters set by TIOCSSERIAL are specified in jiffies and not milliseconds.
Add the missing conversions so that TIOCSSERIAL works as expected also when HZ is not 1000.
--- drivers/staging/greybus/uart.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/staging/greybus/uart.c +7 -4
@@ -625,10 +625,12 @@ static int get_serial_info(struct tty_st ss->line = gb_tty->minor; ss->xmit_fifo_size =16 ; ss->baud_base =9600 ; - ss->close_delay = gb_tty->port.close_delay /10 ; + ss->close_delay =jiffies_to_msecs (gb_tty->port.close_delay) /10 ; ss->closing_wait = gb_tty->port.closing_wait ==ASYNC_CLOSING_WAIT_NONE ? -ASYNC_CLOSING_WAIT_NONE : gb_tty->port.closing_wait /10 ; +ASYNC_CLOSING_WAIT_NONE : +jiffies_to_msecs (gb_tty->port.closing_wait) /10 ; +return 0 ; }
@@ -640,9 +642,10 @@ static int set_serial_info(struct tty_stunsigned int close_delay;int retval =0 ; - close_delay = ss->close_delay *10 ; + close_delay =msecs_to_jiffies (ss->close_delay *10 ); closing_wait = ss->closing_wait ==ASYNC_CLOSING_WAIT_NONE ? -ASYNC_CLOSING_WAIT_NONE : ss->closing_wait *10 ; +ASYNC_CLOSING_WAIT_NONE : +msecs_to_jiffies (ss->closing_wait *10 );mutex_lock (&gb_tty->port.mutex);if (!capable (CAP_SYS_ADMIN )) {
Greg Kroah-Hartman
maintainerPATCH 10/244 USB: serial: ti_usb_3410_5052: fix TIOCSSERIAL permission check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit d370c90dcd64e427a79a093a070117a1571d4cd8 upstream.
Changing the port closing-wait parameter is a privileged operation so make sure to return -EPERM if a regular user tries to change it.
--- drivers/usb/serial/ti_usb_3410_5052.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/usb/serial/ti_usb_3410_5052.c +7 -2
@@ -1420,14 +1420,19 @@ static int ti_set_serial_info(struct tty struct serial_struct *ss) {struct usb_serial_port *port = tty->driver_data; -struct ti_port *tport =usb_get_serial_port_data (port); +struct tty_port *tport = &port->port;unsigned cwait; cwait = ss->closing_wait;if (cwait !=ASYNC_CLOSING_WAIT_NONE ) cwait =msecs_to_jiffies (10 * ss->closing_wait); - tport->tp_port->port.closing_wait = cwait; +if (!capable (CAP_SYS_ADMIN )) { +if (cwait != tport->closing_wait) +return -EPERM ; + } + + tport->closing_wait = cwait;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 11/244 staging: fwserial: fix TIOCSSERIAL jiffies conversions
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 7a3791afdbd5a951b09a7689bba856bd9f6c6a9f upstream.
The port close_delay parameter set by TIOCSSERIAL is specified in jiffies, while the value returned by TIOCGSERIAL is specified in centiseconds.
Add the missing conversions so that TIOCGSERIAL works as expected also when HZ is not 100.
--- drivers/staging/fwserial/fwserial.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/fwserial/fwserial.c +2 -2
@@ -1223,7 +1223,7 @@ static int get_serial_info(struct tty_st ss->flags = port->port.flags; ss->xmit_fifo_size =FWTTY_PORT_TXFIFO_LEN ; ss->baud_base =400000000 ; - ss->close_delay = port->port.close_delay; + ss->close_delay =jiffies_to_msecs (port->port.close_delay) /10 ;mutex_unlock (&port->port.mutex);return 0 ; }
@@ -1245,7 +1245,7 @@ static int set_serial_info(struct tty_streturn -EPERM ; } } - port->port.close_delay = ss->close_delay *HZ /100 ; + port->port.close_delay =msecs_to_jiffies (ss->close_delay *10 );mutex_unlock (&port->port.mutex);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 12/244 tty: moxa: fix TIOCSSERIAL permission check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit dc8c8437658667be9b11ec25c4b5482ed2becdaa upstream.
Changing the port close delay or type are privileged operations so make sure to return -EPERM if a regular user tries to change them.
--- drivers/tty/moxa.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
drivers/tty/moxa.c +11 -5
@@ -2050,6 +2050,7 @@ static int moxa_set_serial_info(struct t struct serial_struct *ss) {struct moxa_port *info = tty->driver_data; +unsigned int close_delay;if (tty->index ==MAX_PORTS )return -EINVAL ;
@@ -2061,19 +2062,24 @@ static int moxa_set_serial_info(struct t ss->baud_base != 921600)return -EPERM ; + close_delay =msecs_to_jiffies (ss->close_delay *10 ); +mutex_lock (&info->port.mutex);if (!capable (CAP_SYS_ADMIN )) { -if (((ss->flags & ~ASYNC_USR_MASK ) != +if (close_delay != info->port.close_delay || + ss->type != info->type || + ((ss->flags & ~ASYNC_USR_MASK ) != (info->port.flags & ~ASYNC_USR_MASK ))) {mutex_unlock (&info->port.mutex);return -EPERM ; } - } - info->port.close_delay =msecs_to_jiffies (ss->close_delay *10 ); + }else { + info->port.close_delay = close_delay; -MoxaSetFifo (info, ss->type ==PORT_16550A ); +MoxaSetFifo (info, ss->type ==PORT_16550A ); - info->type = ss->type; + info->type = ss->type; + }mutex_unlock (&info->port.mutex);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 13/244 staging: fwserial: fix TIOCSSERIAL permission check
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 2104eb283df66a482b60254299acbe3c68c03412 upstream.
Changing the port close-delay parameter is a privileged operation so make sure to return -EPERM if a regular user tries to change it.
--- drivers/staging/fwserial/fwserial.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/staging/fwserial/fwserial.c +6 -2
@@ -1232,20 +1232,24 @@ static int set_serial_info(struct tty_st struct serial_struct *ss) {struct fwtty_port *port = tty->driver_data; +unsigned int cdelay;if (ss->irq !=0 || ss->port !=0 || ss->custom_divisor !=0 || ss->baud_base !=400000000 )return -EPERM ; + cdelay =msecs_to_jiffies (ss->close_delay *10 ); +mutex_lock (&port->port.mutex);if (!capable (CAP_SYS_ADMIN )) { -if (((ss->flags & ~ASYNC_USR_MASK ) != +if (cdelay != port->port.close_delay || + ((ss->flags & ~ASYNC_USR_MASK ) != (port->port.flags & ~ASYNC_USR_MASK ))) {mutex_unlock (&port->port.mutex);return -EPERM ; } } - port->port.close_delay =msecs_to_jiffies (ss->close_delay *10 ); + port->port.close_delay = cdelay;mutex_unlock (&port->port.mutex);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 14/244 usb: typec: tcpm: Address incorrect values of tcpm psy for fixed supply
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
commit f3dedafb8263ca4791a92a23f5230068f5bde008 upstream.
tcpm_pd_build_request overwrites current_limit and supply_voltage even before port partner accepts the requests. This leaves stale values in current_limit and supply_voltage that get exported by "tcpm-source-psy-". Solving this problem by caching the request values of current limit/supply voltage in req_current_limit and req_supply_voltage. current_limit/supply_voltage gets updated once the port partner accepts the request.
--- drivers/usb/typec/tcpm/tcpm.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +10 -7
@@ -285,7 +285,10 @@ struct tcpm_port {unsigned int operating_snk_mw;bool update_sink_caps; -/* Requested current / voltage */ +/* Requested current / voltage to the port partner */ +u32 req_current_limit; +u32 req_supply_voltage; +/* Actual current / voltage limit of the local port */ u32 current_limit;u32 supply_voltage;
@@ -1724,8 +1727,8 @@ static void tcpm_pd_ctrl_request(structcase SNK_TRANSITION_SINK :if (port->vbus_present) {tcpm_set_current_limit (port, - port->current_limit, - port->supply_voltage); + port->req_current_limit, + port->req_supply_voltage); port->explicit_contract = true;tcpm_set_state (port,SNK_READY ,0 ); }else {
@@ -1797,8 +1800,8 @@ static void tcpm_pd_ctrl_request(structbreak ;case SNK_NEGOTIATE_PPS_CAPABILITIES : port->pps_data.active = true; - port->supply_voltage = port->pps_data.out_volt; - port->current_limit = port->pps_data.op_curr; + port->req_supply_voltage = port->pps_data.out_volt; + port->req_current_limit = port->pps_data.op_curr;tcpm_set_state (port,SNK_TRANSITION_SINK ,0 );break ;case SOFT_RESET_SEND :
@@ -2402,8 +2405,8 @@ static int tcpm_pd_build_request(struct flags & RDO_CAP_MISMATCH ? " [mismatch]" : ""); } - port->current_limit = ma; - port->supply_voltage = mv; + port->req_current_limit = ma; + port->req_supply_voltage = mv;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 15/244 usb: typec: tcpm: Address incorrect values of tcpm psy for pps supply
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
commit e3a0720224873587954b55d193d5b4abb14f0443 upstream.
tcpm_pd_select_pps_apdo overwrites port->pps_data.min_volt, port->pps_data.max_volt, port->pps_data.max_curr even before port partner accepts the requests. This leaves incorrect values in current_limit and supply_voltage that get exported by "tcpm-source-psy-". Solving this problem by caching the request values in req_min_volt, req_max_volt, req_max_curr, req_out_volt, req_op_curr. min_volt, max_volt, max_curr gets updated once the partner accepts the request. current_limit, supply_voltage gets updated once local port's tcpm enters SNK_TRANSITION_SINK when the accepted current_limit and supply_voltage is enforced.
--- drivers/usb/typec/tcpm/tcpm.c | 88 +++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 35 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +53 -35
@@ -181,12 +181,27 @@ struct pd_mode_data {struct typec_altmode_desc altmode_desc[ALTMODE_DISCOVERY_MAX ]; }; +/* +* @min_volt: Actual min voltage at the local port +* @req_min_volt: Requested min voltage to the port partner +* @max_volt: Actual max voltage at the local port +* @req_max_volt: Requested max voltage to the port partner +* @max_curr: Actual max current at the local port +* @req_max_curr: Requested max current of the port partner +* @req_out_volt: Requested output voltage to the port partner +* @req_op_curr: Requested operating current to the port partner +* @supported: Parter has atleast one APDO hence supports PPS +* @active: PPS mode is active +*/ struct pd_pps_data {u32 min_volt; +u32 req_min_volt;u32 max_volt; +u32 req_max_volt;u32 max_curr; -u32 out_volt; -u32 op_curr; +u32 req_max_curr; +u32 req_out_volt; +u32 req_op_curr;bool supported;bool active; };
@@ -1767,8 +1782,8 @@ static void tcpm_pd_ctrl_request(structbreak ;case SNK_NEGOTIATE_PPS_CAPABILITIES :/* Revert data back from any requested PPS updates */ - port->pps_data.out_volt = port->supply_voltage; - port->pps_data.op_curr = port->current_limit; + port->pps_data.req_out_volt = port->supply_voltage; + port->pps_data.req_op_curr = port->current_limit; port->pps_status = (type ==PD_CTRL_WAIT ? -EAGAIN : -EOPNOTSUPP );tcpm_set_state (port,SNK_READY ,0 );
@@ -1800,8 +1815,11 @@ static void tcpm_pd_ctrl_request(structbreak ;case SNK_NEGOTIATE_PPS_CAPABILITIES : port->pps_data.active = true; - port->req_supply_voltage = port->pps_data.out_volt; - port->req_current_limit = port->pps_data.op_curr; + port->pps_data.min_volt = port->pps_data.req_min_volt; + port->pps_data.max_volt = port->pps_data.req_max_volt; + port->pps_data.max_curr = port->pps_data.req_max_curr; + port->req_supply_voltage = port->pps_data.req_out_volt; + port->req_current_limit = port->pps_data.req_op_curr;tcpm_set_state (port,SNK_TRANSITION_SINK ,0 );break ;case SOFT_RESET_SEND :
@@ -2315,16 +2333,16 @@ static unsigned int tcpm_pd_select_pps_a src = port->source_caps[src_pdo]; snk = port->snk_pdo[snk_pdo]; - port->pps_data.min_volt =max (pdo_pps_apdo_min_voltage (src), -pdo_pps_apdo_min_voltage (snk)); - port->pps_data.max_volt =min (pdo_pps_apdo_max_voltage (src), -pdo_pps_apdo_max_voltage (snk)); - port->pps_data.max_curr =min_pps_apdo_current (src, snk); - port->pps_data.out_volt =min (port->pps_data.max_volt, -max (port->pps_data.min_volt, - port->pps_data.out_volt)); - port->pps_data.op_curr =min (port->pps_data.max_curr, - port->pps_data.op_curr); + port->pps_data.req_min_volt =max (pdo_pps_apdo_min_voltage (src), +pdo_pps_apdo_min_voltage (snk)); + port->pps_data.req_max_volt =min (pdo_pps_apdo_max_voltage (src), +pdo_pps_apdo_max_voltage (snk)); + port->pps_data.req_max_curr =min_pps_apdo_current (src, snk); + port->pps_data.req_out_volt =min (port->pps_data.max_volt, +max (port->pps_data.min_volt, + port->pps_data.req_out_volt)); + port->pps_data.req_op_curr =min (port->pps_data.max_curr, + port->pps_data.req_op_curr);power_supply_changed (port->psy); }
@@ -2452,10 +2470,10 @@ static int tcpm_pd_build_pps_request(strtcpm_log (port,"Invalid APDO selected!" );return -EINVAL ; } - max_mv = port->pps_data.max_volt; - max_ma = port->pps_data.max_curr; - out_mv = port->pps_data.out_volt; - op_ma = port->pps_data.op_curr; + max_mv = port->pps_data.req_max_volt; + max_ma = port->pps_data.req_max_curr; + out_mv = port->pps_data.req_out_volt; + op_ma = port->pps_data.req_op_curr;break ;default :tcpm_log (port,"Invalid PDO selected!" );
@@ -2502,8 +2520,8 @@ static int tcpm_pd_build_pps_request(strtcpm_log (port,"Requesting APDO %d: %u mV, %u mA" , src_pdo_index, out_mv, op_ma); - port->pps_data.op_curr = op_ma; - port->pps_data.out_volt = out_mv; + port->pps_data.req_op_curr = op_ma; + port->pps_data.req_out_volt = out_mv;return 0 ; }
@@ -4174,7 +4192,7 @@ static int tcpm_try_role(const struct tyreturn ret; } -static int tcpm_pps_set_op_curr (struct tcpm_port *port,u16 op_curr) +static int tcpm_pps_set_op_curr (struct tcpm_port *port,u16 req_op_curr) {unsigned int target_mw;int ret;
@@ -4192,22 +4210,22 @@ static int tcpm_pps_set_op_curr(struct t goto port_unlock; } -if (op_curr > port->pps_data.max_curr) { +if (req_op_curr > port->pps_data.max_curr) { ret = -EINVAL ; goto port_unlock; } - target_mw = (op_curr * port->pps_data.out_volt) /1000 ; + target_mw = (req_op_curr * port->supply_voltage) /1000 ;if (target_mw < port->operating_snk_mw) { ret = -EINVAL ; goto port_unlock; }/* Round down operating current to align with PPS valid steps */ - op_curr = op_curr - (op_curr %RDO_PROG_CURR_MA_STEP ); + req_op_curr = req_op_curr - (req_op_curr %RDO_PROG_CURR_MA_STEP );reinit_completion (&port->pps_complete); - port->pps_data.op_curr = op_curr; + port->pps_data.req_op_curr = req_op_curr; port->pps_status =0 ; port->pps_pending = true;tcpm_set_state (port,SNK_NEGOTIATE_PPS_CAPABILITIES ,0 );
@@ -4229,7 +4247,7 @@ swap_unlock:return ret; } -static int tcpm_pps_set_out_volt (struct tcpm_port *port,u16 out_volt) +static int tcpm_pps_set_out_volt (struct tcpm_port *port,u16 req_out_volt) {unsigned int target_mw;int ret;
@@ -4247,23 +4265,23 @@ static int tcpm_pps_set_out_volt(struct goto port_unlock; } -if (out_volt < port->pps_data.min_volt || - out_volt > port->pps_data.max_volt) { +if (req_out_volt < port->pps_data.min_volt || + req_out_volt > port->pps_data.max_volt) { ret = -EINVAL ; goto port_unlock; } - target_mw = (port->pps_data.op_curr * out_volt) /1000 ; + target_mw = (port->current_limit * req_out_volt) /1000 ;if (target_mw < port->operating_snk_mw) { ret = -EINVAL ; goto port_unlock; }/* Round down output voltage to align with PPS valid steps */ - out_volt = out_volt - (out_volt %RDO_PROG_VOLT_MV_STEP ); + req_out_volt = req_out_volt - (req_out_volt %RDO_PROG_VOLT_MV_STEP );reinit_completion (&port->pps_complete); - port->pps_data.out_volt = out_volt; + port->pps_data.req_out_volt = req_out_volt; port->pps_status =0 ; port->pps_pending = true;tcpm_set_state (port,SNK_NEGOTIATE_PPS_CAPABILITIES ,0 );
@@ -4312,8 +4330,8 @@ static int tcpm_pps_activate(struct tcpm/* Trigger PPS request or move back to standard PDO contract */ if (activate) { - port->pps_data.out_volt = port->supply_voltage; - port->pps_data.op_curr = port->current_limit; + port->pps_data.req_out_volt = port->supply_voltage; + port->pps_data.req_op_curr = port->current_limit;tcpm_set_state (port,SNK_NEGOTIATE_PPS_CAPABILITIES ,0 ); }else {tcpm_set_state (port,SNK_NEGOTIATE_CAPABILITIES ,0 );
Greg Kroah-Hartman
maintainerPATCH 16/244 usb: typec: tcpm: update power supply once partner accepts
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
commit 4050f2683f2c3151dc3dd1501ac88c57caf810ff upstream.
power_supply_changed needs to be called to notify clients after the partner accepts the requested values for the pps case.
Also, remove the redundant power_supply_changed at the end of the tcpm_reset_port as power_supply_changed is already called right after usb_type is changed.
--- drivers/usb/typec/tcpm/tcpm.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +1 -3
@@ -1820,6 +1820,7 @@ static void tcpm_pd_ctrl_request(struct port->pps_data.max_curr = port->pps_data.req_max_curr; port->req_supply_voltage = port->pps_data.req_out_volt; port->req_current_limit = port->pps_data.req_op_curr; +power_supply_changed (port->psy);tcpm_set_state (port,SNK_TRANSITION_SINK ,0 );break ;case SOFT_RESET_SEND :
@@ -2343,7 +2344,6 @@ static unsigned int tcpm_pd_select_pps_a port->pps_data.req_out_volt)); port->pps_data.req_op_curr =min (port->pps_data.max_curr, port->pps_data.req_op_curr); -power_supply_changed (port->psy); }return src_pdo;
@@ -2743,8 +2743,6 @@ static void tcpm_reset_port(struct tcpm_ port->try_src_count =0 ; port->try_snk_count =0 ; port->usb_type =POWER_SUPPLY_USB_TYPE_C ; - -power_supply_changed (port->psy); }static void tcpm_detach (struct tcpm_port *port)
Greg Kroah-Hartman
maintainerPATCH 17/244 usb: xhci-mtk: remove or operator for setting schedule parameters
In reply to Greg Kroah-HartmanFrom: Chunfeng Yun <[email protected]>
commit 5fa5827566e3affa1657ccf9b22706c06a5d021a upstream.
Side effect may happen if use or operator to set schedule parameters when the parameters are already set before. Set them directly due to other bits are reserved.
--- drivers/usb/host/xhci-mtk-sch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/host/xhci-mtk-sch.c +3 -3
@@ -643,7 +643,7 @@ int xhci_mtk_add_ep_quirk(struct usb_hcd*/ if (usb_endpoint_xfer_int (&ep->desc) ||usb_endpoint_xfer_isoc (&ep->desc)) - ep_ctx->reserved[0 ] |=cpu_to_le32 (EP_BPKTS (1 )); + ep_ctx->reserved[0 ] =cpu_to_le32 (EP_BPKTS (1 ));return 0 ; }
@@ -730,10 +730,10 @@ int xhci_mtk_check_bandwidth(struct usb_list_move_tail (&sch_ep->endpoint, &sch_bw->bw_ep_list); ep_ctx =xhci_get_ep_ctx (xhci, virt_dev->in_ctx, ep_index); - ep_ctx->reserved[0 ] |=cpu_to_le32 (EP_BPKTS (sch_ep->pkts) + ep_ctx->reserved[0 ] =cpu_to_le32 (EP_BPKTS (sch_ep->pkts) |EP_BCSCOUNT (sch_ep->cs_count) |EP_BBM (sch_ep->burst_mode)); - ep_ctx->reserved[1 ] |=cpu_to_le32 (EP_BOFFSET (sch_ep->offset) + ep_ctx->reserved[1 ] =cpu_to_le32 (EP_BOFFSET (sch_ep->offset) |EP_BREPEAT (sch_ep->repeat)); xhci_dbg(xhci, " PKTS:%x, CSCOUNT:%x, BM:%x, OFFSET:%x, REPEAT:%x\n",
Greg Kroah-Hartman
maintainerPATCH 18/244 usb: xhci-mtk: improve bandwidth scheduling with TT
In reply to Greg Kroah-HartmanFrom: Chunfeng Yun <[email protected]>
commit e19ee44a3d07c232f9241024dab1ebd0748cdf5f upstream.
When the USB headset is plug into an external hub, sometimes can't set config due to not enough bandwidth, so need improve LS/FS INT/ISOC bandwidth scheduling with TT.
--- drivers/usb/host/xhci-mtk-sch.c | 74 ++++++++++++++++++++++++++++++++-------- drivers/usb/host/xhci-mtk.h | 6 ++- 2 files changed, 64 insertions(+), 16 deletions(-)
drivers/usb/host/xhci-mtk-sch.c +60 -14
@@ -378,6 +378,31 @@ static void update_bus_bw(struct mu3h_sc sch_ep->allocated = used; } +static int check_fs_bus_bw (struct mu3h_sch_ep_info *sch_ep,int offset) +{ +struct mu3h_sch_tt *tt = sch_ep->sch_tt; +u32 num_esit, tmp; +int base; +int i, j; + + num_esit =XHCI_MTK_MAX_ESIT / sch_ep->esit; +for (i =0 ; i < num_esit; i++) { + base = offset + i * sch_ep->esit; + +/* +* Compared with hs bus, no matter what ep type, +* the hub will always delay one uframe to send data +*/ +for (j =0 ; j < sch_ep->cs_count; j++) { + tmp = tt->fs_bus_bw[base + j] + sch_ep->bw_cost_per_microframe; +if (tmp >FS_PAYLOAD_MAX ) +return -ERANGE ; + } + } + +return 0 ; +} +static int check_sch_tt (struct usb_device *udev,struct mu3h_sch_ep_info *sch_ep,u32 offset) {
@@ -402,7 +427,7 @@ static int check_sch_tt(struct usb_devicreturn -ERANGE ;for (i =0 ; i < sch_ep->cs_count; i++) -if (test_bit (offset + i, tt->split_bit_map)) +if (test_bit (offset + i, tt->ss_bit_map))return -ERANGE ; }else {
@@ -432,7 +457,7 @@ static int check_sch_tt(struct usb_devic cs_count =7 ;/* HW limit */ for (i =0 ; i < cs_count +2 ; i++) { -if (test_bit (offset + i, tt->split_bit_map)) +if (test_bit (offset + i, tt->ss_bit_map))return -ERANGE ; }
@@ -448,24 +473,44 @@ static int check_sch_tt(struct usb_devic sch_ep->num_budget_microframes = sch_ep->esit; } -return 0 ; +return check_fs_bus_bw (sch_ep, offset); }static void update_sch_tt (struct usb_device *udev, -struct mu3h_sch_ep_info *sch_ep) +struct mu3h_sch_ep_info *sch_ep,bool used) {struct mu3h_sch_tt *tt = sch_ep->sch_tt;u32 base, num_esit; +int bw_updated; +int bits;int i, j; num_esit =XHCI_MTK_MAX_ESIT / sch_ep->esit; + bits = (sch_ep->ep_type ==ISOC_OUT_EP ) ? sch_ep->cs_count :1 ; + +if (used) + bw_updated = sch_ep->bw_cost_per_microframe; +else + bw_updated = -sch_ep->bw_cost_per_microframe; +for (i =0 ; i < num_esit; i++) { base = sch_ep->offset + i * sch_ep->esit; -for (j =0 ; j < sch_ep->num_budget_microframes; j++) -set_bit (base + j, tt->split_bit_map); + +for (j =0 ; j < bits; j++) { +if (used) +set_bit (base + j, tt->ss_bit_map); +else +clear_bit (base + j, tt->ss_bit_map); + } + +for (j =0 ; j < sch_ep->cs_count; j++) + tt->fs_bus_bw[base + j] += bw_updated; } -list_add_tail (&sch_ep->tt_endpoint, &tt->ep_list); +if (used) +list_add_tail (&sch_ep->tt_endpoint, &tt->ep_list); +else +list_del (&sch_ep->tt_endpoint); } static int check_sch_bw(struct usb_device *udev,
@@ -535,7 +580,7 @@ static int check_sch_bw(struct usb_devicif (!tt_offset_ok)return -ERANGE ; -update_sch_tt (udev, sch_ep); +update_sch_tt (udev, sch_ep,1 ); }/* update bus bandwidth info */
@@ -548,15 +593,16 @@ static void destroy_sch_ep(struct usb_de struct mu3h_sch_bw_info *sch_bw, struct mu3h_sch_ep_info *sch_ep) {/* only release ep bw check passed by check_sch_bw() */ -if (sch_ep->allocated) +if (sch_ep->allocated) {update_bus_bw (sch_bw, sch_ep,0 ); +if (sch_ep->sch_tt) +update_sch_tt (udev, sch_ep,0 ); + } -list_del (&sch_ep->endpoint); - -if (sch_ep->sch_tt) { -list_del (&sch_ep->tt_endpoint); +if (sch_ep->sch_tt)drop_tt (udev); - } + +list_del (&sch_ep->endpoint);kfree (sch_ep); }
drivers/usb/host/xhci-mtk.h +4 -2
@@ -20,13 +20,15 @@#define XHCI_MTK_MAX_ESIT 64/** -* @split_bit_map: used to avoid split microframes overlay +* @ss_bit_map: used to avoid start split microframes overlay +* @fs_bus_bw: array to keep track of bandwidth already used for FS * @ep_list: Endpoints using this TT * @usb_tt: usb TT related * @tt_port: TT port number */ struct mu3h_sch_tt { - DECLARE_BITMAP(split_bit_map, XHCI_MTK_MAX_ESIT); + DECLARE_BITMAP(ss_bit_map, XHCI_MTK_MAX_ESIT); +u32 fs_bus_bw[XHCI_MTK_MAX_ESIT ];struct list_head ep_list;struct usb_tt *usb_tt;int tt_port;
Greg Kroah-Hartman
maintainerPATCH 19/244 ASoC: samsung: tm2_wm5110: check of of_parse return value
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
commit d58970da324732686529655c21791cef0ee547c4 upstream.
cppcheck warning:
sound/soc/samsung/tm2_wm5110.c:605:6: style: Variable 'ret' is reassigned a value before the old one has been
used. [redundantAssignment]
ret = devm_snd_soc_register_component(dev, &tm2_component,
^
sound/soc/samsung/tm2_wm5110.c:554:7: note: ret is assigned
ret = of_parse_phandle_with_args(dev->of_node, "i2s-controller",
^
sound/soc/samsung/tm2_wm5110.c:605:6: note: ret is overwritten
ret = devm_snd_soc_register_component(dev, &tm2_component,
^The args is a stack variable, so it could have junk (uninitialized) therefore args.np could have a non-NULL and random value even though property was missing. Later could trigger invalid pointer dereference.
There's no need to check for args.np because args.np won't be initialized on errors.
--- sound/soc/samsung/tm2_wm5110.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/samsung/tm2_wm5110.c +1 -1
@@ -553,7 +553,7 @@ static int tm2_probe(struct platform_dev ret =of_parse_phandle_with_args (dev->of_node,"i2s-controller" , cells_name, i, &args); -if (!args.np) { +if (ret) {dev_err (dev,"i2s-controller property parse error: %d\n" , i); ret = -EINVAL ; goto dai_node_put;
Greg Kroah-Hartman
maintainerPATCH 20/244 ASoC: Intel: kbl_da7219_max98927: Fix kabylake_ssp_fixup function
In reply to Greg Kroah-HartmanFrom: Lukasz Majczak <[email protected]>
commit a523ef731ac6674dc07574f31bf44cc5bfa14e4d upstream.
kabylake_ssp_fixup function uses snd_soc_dpcm to identify the codecs DAIs. The HW parameters are changed based on the codec DAI of the stream. The earlier approach to get snd_soc_dpcm was using container_of() macro on snd_pcm_hw_params.
The structures have been modified over time and snd_soc_dpcm does not have snd_pcm_hw_params as a reference but as a copy. This causes the current driver to crash when used.
This patch changes the way snd_soc_dpcm is extracted. snd_soc_pcm_runtime holds 2 dpcm instances (one for playback and one for capture). 2 codecs on the SSP are dmic (capture) and speakers (playback). Based on the stream direction, snd_soc_dpcm is extracted from snd_soc_pcm_runtime.
Tested for all use cases of the driver.
Based on similar fix in kbl_rt5663_rt5514_max98927.c from Harsha Priya <[email protected]> and Vamshi Krishna Gopal <[email protected]>
--- sound/soc/intel/boards/kbl_da7219_max98927.c | 38 +++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-)
sound/soc/intel/boards/kbl_da7219_max98927.c +30 -8
@@ -282,12 +282,34 @@ static int kabylake_ssp_fixup(struct sndstruct snd_interval *channels =hw_param_interval (params,SNDRV_PCM_HW_PARAM_CHANNELS );struct snd_mask *fmt =hw_param_mask (params,SNDRV_PCM_HW_PARAM_FORMAT ); -struct snd_soc_dpcm *dpcm =container_of ( - params, struct snd_soc_dpcm, hw_params); -struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link; -struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link; +struct snd_soc_dpcm *dpcm, *rtd_dpcm =NULL ;/* +* The following loop will be called only for playback stream +* In this platform, there is only one playback device on every SSP +*/ +for_each_dpcm_fe (rtd,SNDRV_PCM_STREAM_PLAYBACK , dpcm) { + rtd_dpcm = dpcm; +break ; + } + +/* +* This following loop will be called only for capture stream +* In this platform, there is only one capture device on every SSP +*/ +for_each_dpcm_fe (rtd,SNDRV_PCM_STREAM_CAPTURE , dpcm) { + rtd_dpcm = dpcm; +break ; + } + +if (!rtd_dpcm) +return -EINVAL ; + +/* +* The above 2 loops are mutually exclusive based on the stream direction, +* thus rtd_dpcm variable will never be overwritten +*/ +/* * Topology for kblda7219m98373 & kblmax98373 supports only S24_LE, * where as kblda7219m98927 & kblmax98927 supports S16_LE by default. * Skipping the port wise FE and BE configuration for kblda7219m98373 &
@@ -309,9 +331,9 @@ static int kabylake_ssp_fixup(struct snd/* * The ADSP will convert the FE rate to 48k, stereo, 24 bit */ -if (!strcmp (fe_dai_link->name,"Kbl Audio Port" ) || - !strcmp (fe_dai_link->name,"Kbl Audio Headset Playback" ) || - !strcmp (fe_dai_link->name,"Kbl Audio Capture Port" )) { +if (!strcmp (rtd_dpcm->fe->dai_link->name,"Kbl Audio Port" ) || + !strcmp (rtd_dpcm->fe->dai_link->name,"Kbl Audio Headset Playback" ) || + !strcmp (rtd_dpcm->fe->dai_link->name,"Kbl Audio Capture Port" )) { rate->min = rate->max =48000 ; channels->min = channels->max =2 ;snd_mask_none (fmt);
@@ -322,7 +344,7 @@ static int kabylake_ssp_fixup(struct snd* The speaker on the SSP0 supports S16_LE and not S24_LE. * thus changing the mask here */ -if (!strcmp (be_dai_link->name,"SSP0-Codec" )) +if (!strcmp (rtd_dpcm->be->dai_link->name,"SSP0-Codec" ))snd_mask_set_format (fmt,SNDRV_PCM_FORMAT_S16_LE );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 21/244 MIPS: pci-mt7620: fix PLL lock check
In reply to Greg Kroah-HartmanFrom: Ilya Lipnitskiy <[email protected]>
commit c15b99ae2ba9ea30da3c7cd4765b8a4707e530a6 upstream.
Upstream a long-standing OpenWrt patch [0] that fixes MT7620 PCIe PLL lock check. The existing code checks the wrong register bit: PPLL_SW_SET is not defined in PPLL_CFG1 and bit 31 of PPLL_CFG1 is marked as reserved in the MT7620 Programming Guide. The correct bit to check for PLL lock is PPLL_LD (bit 23).
Also reword the error message for clarity.
Without this change it is unlikely that this driver ever worked with mainline kernel.
[0]: https://lists.infradead.org/pipermail/lede-commits/2017-July/004441.html
--- arch/mips/pci/pci-mt7620.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/mips/pci/pci-mt7620.c +3 -2
@@ -30,6 +30,7 @@#define RALINK_GPIOMODE 0x60#define PPLL_CFG1 0x9c +#define PPLL_LD BIT(23)#define PPLL_DRV 0xa0#define PDRV_SW_SET BIT(31)
@@ -239,8 +240,8 @@ static int mt7620_pci_hw_init(struct plart_sysc_m32 (0 ,RALINK_PCIE0_CLK_EN ,RALINK_CLKCFG1 );mdelay (100 ); -if (!(rt_sysc_r32 (PPLL_CFG1 ) &PDRV_SW_SET )) { -dev_err (&pdev->dev,"MT7620 PPLL unlock\n" ); +if (!(rt_sysc_r32 (PPLL_CFG1 ) &PPLL_LD )) { +dev_err (&pdev->dev,"pcie PLL not locked, aborting init\n" );reset_control_assert (rstpcie0);rt_sysc_m32 (RALINK_PCIE0_CLK_EN ,0 ,RALINK_CLKCFG1 );return -1 ;
Greg Kroah-Hartman
maintainerPATCH 22/244 MIPS: pci-rt2880: fix slot 0 configuration
In reply to Greg Kroah-HartmanFrom: Ilya Lipnitskiy <[email protected]>
commit 8e98b697006d749d745d3b174168a877bb96c500 upstream.
pci_fixup_irqs() used to call pcibios_map_irq on every PCI device, which for RT2880 included bus 0 slot 0. After pci_fixup_irqs() got removed, only slots/funcs with devices attached would be called. While arguably the right thing, that left no chance for this driver to ever initialize slot 0, effectively bricking PCI and USB on RT2880 devices such as the Belkin F5D8235-4 v1.
Slot 0 configuration needs to happen after PCI bus enumeration, but before any device at slot 0x11 (func 0 or 1) is talked to. That was determined empirically by testing on a Belkin F5D8235-4 v1 device. A minimal BAR 0 config write followed by read, then setting slot 0 PCI_COMMAND to MASTER | IO | MEMORY is all that seems to be required for proper functionality.
Tested by ensuring that full- and high-speed USB devices get enumerated on the Belkin F5D8235-4 v1 (with an out of tree DTS file from OpenWrt).
--- arch/mips/pci/pci-rt2880.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-)
arch/mips/pci/pci-rt2880.c +24 -13
@@ -180,7 +180,6 @@ static inline void rt2880_pci_write_u32(int pcibios_map_irq (const struct pci_dev *dev,u8 slot,u8 pin) { -u16 cmd;int irq =-1 ;if (dev->bus->number !=0 )
@@ -188,8 +187,6 @@ int pcibios_map_irq(const struct pci_devswitch (PCI_SLOT (dev->devfn)) {case 0x00 : -rt2880_pci_write_u32 (PCI_BASE_ADDRESS_0 ,0x08000000 ); - (void )rt2880_pci_read_u32 (PCI_BASE_ADDRESS_0 );break ;case 0x11 : irq =RT288X_CPU_IRQ_PCI ;
@@ -201,16 +198,6 @@ int pcibios_map_irq(const struct pci_devbreak ; } -pci_write_config_byte ((struct pci_dev *) dev, -PCI_CACHE_LINE_SIZE ,0x14 ); -pci_write_config_byte ((struct pci_dev *) dev,PCI_LATENCY_TIMER ,0xFF ); -pci_read_config_word ((struct pci_dev *) dev,PCI_COMMAND , &cmd); - cmd |=PCI_COMMAND_MASTER |PCI_COMMAND_IO |PCI_COMMAND_MEMORY | -PCI_COMMAND_INVALIDATE |PCI_COMMAND_FAST_BACK | -PCI_COMMAND_SERR |PCI_COMMAND_WAIT |PCI_COMMAND_PARITY ; -pci_write_config_word ((struct pci_dev *) dev,PCI_COMMAND , cmd); -pci_write_config_byte ((struct pci_dev *) dev,PCI_INTERRUPT_LINE , - dev->irq);return irq; }
@@ -251,6 +238,30 @@ static int rt288x_pci_probe(struct platfint pcibios_plat_dev_init (struct pci_dev *dev) { +static bool slot0_init; + +/* +* Nobody seems to initialize slot 0, but this platform requires it, so +* do it once when some other slot is being enabled. The PCI subsystem +* should configure other slots properly, so no need to do anything +* special for those. +*/ +if (!slot0_init && dev->bus->number ==0 ) { +u16 cmd; +u32 bar0; + + slot0_init = true; + +pci_bus_write_config_dword (dev->bus,0 ,PCI_BASE_ADDRESS_0 , +0x08000000 ); +pci_bus_read_config_dword (dev->bus,0 ,PCI_BASE_ADDRESS_0 , + &bar0); + +pci_bus_read_config_word (dev->bus,0 ,PCI_COMMAND , &cmd); + cmd |=PCI_COMMAND_MASTER |PCI_COMMAND_IO |PCI_COMMAND_MEMORY ; +pci_bus_write_config_word (dev->bus,0 ,PCI_COMMAND , cmd); + } +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 23/244 FDDI: defxx: Bail out gracefully with unassigned PCI resource for CSR
In reply to Greg Kroah-HartmanFrom: Maciej W. Rozycki <[email protected]>
commit f626ca682912fab55dff15469ce893ae16b65c7e upstream.
Recent versions of the PCI Express specification have deprecated support for I/O transactions and actually some PCIe host bridges, such as Power Systems Host Bridge 4 (PHB4), do not implement them.
For those systems the PCI BARs that request a mapping in the I/O space have the length recorded in the corresponding PCI resource set to zero, which makes it unassigned:
# lspci -s 0031:02:04.0 -v 0031:02:04.0 FDDI network controller: Digital Equipment Corporation PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) (rev 02) Subsystem: Digital Equipment Corporation FDDIcontroller/PCI (DEFPA) Flags: bus master, medium devsel, latency 136, IRQ 57, NUMA node 8 Memory at 620c080020000 (32-bit, non-prefetchable) [size=128] I/O ports at <unassigned> [disabled] Memory at 620c080030000 (32-bit, non-prefetchable) [size=64K] Capabilities: [50] Power Management version 2 Kernel driver in use: defxx Kernel modules: defxx
#
Regardless the driver goes ahead and requests it (here observed with a Raptor Talos II POWER9 system), resulting in an odd /proc/ioport entry:
# cat /proc/ioports 00000000-ffffffffffffffff : 0031:02:04.0 #
Furthermore, the system gets confused as the driver actually continues and pokes at those locations, causing a flood of messages being output to the system console by the underlying system firmware, like:
defxx: v1.11 2014/07/01 Lawrence V. Stefani and others defxx 0031:02:04.0: enabling device (0140 -> 0142) LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010000
IPMI: dropping non severe PEL event
LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010014
IPMI: dropping non severe PEL event
LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010014
IPMI: dropping non severe PEL event
and so on and so on (possibly intermixed actually, as there's no locking between the kernel and the firmware in console port access with this particular system, but cleaned up above for clarity), and once some 10k of such pairs of the latter two messages have been produced an interace eventually shows up in a useless state:
0031:02:04.0: DEFPA at I/O addr = 0x0, IRQ = 57, Hardware addr = 00-00-00-00-00-00
This was not expected to happen as resource handling was added to the driver a while ago, because it was not known at that time that a PCI system would be possible that cannot assign port I/O resources, and oddly enough `request_region' does not fail, which would have caught it.
Correct the problem then by checking for the length of zero for the CSR resource and bail out gracefully refusing to register an interface if that turns out to be the case, producing messages like:
defxx: v1.11 2014/07/01 Lawrence V. Stefani and others 0031:02:04.0: Cannot use I/O, no address set, aborting 0031:02:04.0: Recompile driver with "CONFIG_DEFXX_MMIO=y"
Keep the original check for the EISA MMIO resource as implemented, because in that case the length is hardwired to 0x400 as a consequence of how the compare/mask address decoding works in the ESIC chip and it is only the base address that is set to zero if MMIO has been disabled for the adapter in EISA configuration, which in turn could be a valid bus address in a legacy-free system implementing PCI, especially for port I/O.
Where the EISA MMIO resource has been disabled for the adapter in EISA configuration this arrangement keeps producing messages like:
eisa 00:05: EISA: slot 5: DEC3002 detected
defxx: v1.11 2014/07/01 Lawrence V. Stefani and others 00:05: Cannot use MMIO, no address set, aborting 00:05: Recompile driver with "CONFIG_DEFXX_MMIO=n" 00:05: Or run ECU and set adapter's MMIO location
with the last two lines now swapped for easier handling in the driver.
There is no need to check for and catch the case of a port I/O resource not having been assigned for EISA as the adapter uses the slot-specific I/O space, which gets assigned by how EISA has been specified and maps directly to the particular slot an option card has been placed in. And the EISA variant of the adapter has additional registers that are only accessible via the port I/O space anyway.
While at it factor out the error message calls into helpers and fix an argument order bug with the pr_err' call now in dfx_register_res_err'.
--- drivers/net/fddi/defxx.c | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-)
drivers/net/fddi/defxx.c +30 -17
@@ -495,6 +495,25 @@ static const struct net_device_ops dfx_n .ndo_set_mac_address = dfx_ctl_set_mac_address, }; +static void dfx_register_res_alloc_err (const char *print_name,bool mmio, +bool eisa) +{ +pr_err ("%s: Cannot use %s, no address set, aborting\n" , + print_name, mmio ?"MMIO" :"I/O" ); +pr_err ("%s: Recompile driver with \"CONFIG_DEFXX_MMIO=%c\"\n" , + print_name, mmio ?'n' :'y' ); +if (eisa && mmio) +pr_err ("%s: Or run ECU and set adapter's MMIO location\n" , + print_name); +} + +static void dfx_register_res_err (const char *print_name,bool mmio, +unsigned long start,unsigned long len) +{ +pr_err ("%s: Cannot reserve %s resource 0x%lx @ 0x%lx, aborting\n" , + print_name, mmio ?"MMIO" :"I/O" , len, start); +} +/* * ================ * = dfx_register =
@@ -568,15 +587,12 @@ static int dfx_register(struct device *bdev_set_drvdata (bdev, dev);dfx_get_bars (bdev, bar_start, bar_len); -if (dfx_bus_eisa && dfx_use_mmio && bar_start[0 ] ==0 ) { -pr_err ("%s: Cannot use MMIO, no address set, aborting\n" , - print_name); -pr_err ("%s: Run ECU and set adapter's MMIO location\n" , - print_name); -pr_err ("%s: Or recompile driver with \"CONFIG_DEFXX_MMIO=n\"" -"\n" , print_name); +if (bar_len[0 ] ==0 || + (dfx_bus_eisa && dfx_use_mmio && bar_start[0 ] ==0 )) { +dfx_register_res_alloc_err (print_name, dfx_use_mmio, + dfx_bus_eisa); err = -ENXIO ; - goto err_out; + goto err_out_disable; }if (dfx_use_mmio)
@@ -585,18 +601,16 @@ static int dfx_register(struct device *belse region =request_region (bar_start[0 ], bar_len[0 ], print_name);if (!region) { -pr_err ("%s: Cannot reserve %s resource 0x%lx @ 0x%lx, " -"aborting\n" , dfx_use_mmio ?"MMIO" :"I/O" , print_name, - (long )bar_len[0 ], (long )bar_start[0 ]); +dfx_register_res_err (print_name, dfx_use_mmio, + bar_start[0 ], bar_len[0 ]); err = -EBUSY ; goto err_out_disable; }if (bar_start[1 ] !=0 ) { region =request_region (bar_start[1 ], bar_len[1 ], print_name);if (!region) { -pr_err ("%s: Cannot reserve I/O resource " -"0x%lx @ 0x%lx, aborting\n" , print_name, - (long )bar_len[1 ], (long )bar_start[1 ]); +dfx_register_res_err (print_name,0 , + bar_start[1 ], bar_len[1 ]); err = -EBUSY ; goto err_out_csr_region; }
@@ -604,9 +618,8 @@ static int dfx_register(struct device *bif (bar_start[2 ] !=0 ) { region =request_region (bar_start[2 ], bar_len[2 ], print_name);if (!region) { -pr_err ("%s: Cannot reserve I/O resource " -"0x%lx @ 0x%lx, aborting\n" , print_name, - (long )bar_len[2 ], (long )bar_start[2 ]); +dfx_register_res_err (print_name,0 , + bar_start[2 ], bar_len[2 ]); err = -EBUSY ; goto err_out_bh_region; }
Greg Kroah-Hartman
maintainerPATCH 24/244 PCI: Allow VPD access for QLogic ISP2722
In reply to Greg Kroah-HartmanFrom: Arun Easi <[email protected]>
commit e00dc69b5f17c444a38cd9745a0f76bc989b3af4 upstream.
0d5370d1d852 ("PCI: Prevent VPD access for QLogic ISP2722") disabled access to VPD of the ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter because reading past the end of the VPD caused NMIs.
104daa71b396 ("PCI: Determine actual VPD size on first access") limits reads to the actual size of VPD, which should prevent these NMIs.
104daa71b396 was merged *before* 0d5370d1d852, but we think the testing that prompted 0d5370d1d852 ("PCI: Prevent VPD access for QLogic ISP2722") was done with a kernel that lacked 104daa71b396. See [1, 2].
Remove the quirk added by 0d5370d1d852 ("PCI: Prevent VPD access for QLogic ISP2722") so customers can read the HBA VPD.
[1] https://lore.kernel.org/linux-pci/alpine.LRH.2.21.9999.2012161641230.28924@irv1user01.caveonetworks.com/
[2] https://lore.kernel.org/linux-pci/alpine.LRH.2.21.9999.2104071535110.13940@irv1user01.caveonetworks.com/
--- drivers/pci/vpd.c | 1 - 1 file changed, 1 deletion(-)
drivers/pci/vpd.c +0 -1
@@ -570,7 +570,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSDECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_LSI_LOGIC ,0x005f , quirk_blacklist_vpd);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATTANSIC ,PCI_ANY_ID , quirk_blacklist_vpd); -DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_QLOGIC ,0x2261 , quirk_blacklist_vpd);/* * The Amazon Annapurna Labs 0x0031 device id is reused for other non Root Port * device types, so the quirk is registered for the PCI_CLASS_BRIDGE_PCI class.
Greg Kroah-Hartman
maintainerPATCH 25/244 iio:accel:adis16201: Fix wrong axis assignment that prevents loading
In reply to Greg Kroah-HartmanFrom: Jonathan Cameron <[email protected]>
commit 4e102429f3dc62dce546f6107e34a4284634196d upstream.
Whilst running some basic tests as part of writing up the dt-bindings for this driver (to follow), it became clear it doesn't actually load currently.
iio iio:device1: tried to double register : in_incli_x_index adis16201 spi0.0: Failed to create buffer sysfs interfaces
adis16201: probe of spi0.0 failed with error -16
Looks like a cut and paste / update bug. Fixes tag obviously not accurate but we don't want to bother carry thing back to before the driver moved out of staging.
--- drivers/iio/accel/adis16201.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/accel/adis16201.c +1 -1
@@ -215,7 +215,7 @@ static const struct iio_chan_spec adis16ADIS_AUX_ADC_CHAN (ADIS16201_AUX_ADC_REG ,ADIS16201_SCAN_AUX_ADC ,0 ,12 ),ADIS_INCLI_CHAN (X ,ADIS16201_XINCL_OUT_REG ,ADIS16201_SCAN_INCLI_X ,BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), -ADIS_INCLI_CHAN (X ,ADIS16201_YINCL_OUT_REG ,ADIS16201_SCAN_INCLI_Y , +ADIS_INCLI_CHAN (Y ,ADIS16201_YINCL_OUT_REG ,ADIS16201_SCAN_INCLI_Y ,BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), IIO_CHAN_SOFT_TIMESTAMP(7) };
Greg Kroah-Hartman
maintainerPATCH 26/244 misc: lis3lv02d: Fix false-positive WARN on various HP models
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 3641762c1c9c7cfd84a7061a0a73054f09b412e3 upstream.
Before this commit lis3lv02d_get_pwron_wait() had a WARN_ONCE() to catch a potential divide by 0. WARN macros should only be used to catch internal kernel bugs and that is not the case here. We have been receiving a lot of bug reports about kernel backtraces caused by this WARN.
The div value being checked comes from the lis3->odrs[] array. Which is sized to be a power-of-2 matching the number of bits in lis3->odr_mask.
The only lis3 model where this array is not entirely filled with non zero values. IOW the only model where we can hit the div == 0 check is the 3dc ("8 bits 3DC sensor") model:
int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
Note the 0 value at index 0, according to the datasheet an odr index of 0 means "Power-down mode". HP typically uses a lis3 accelerometer for HDD fall protection. What I believe is happening here is that on newer HP devices, which only contain a SDD, the BIOS is leaving the lis3 device powered-down since it is not used for HDD fall protection.
Note that the lis3_3dc_rates array initializer only specifies 10 values, which matches the datasheet. So it also contains 6 zero values at the end.
Replace the WARN with a normal check, which treats an odr index of 0 as power-down and uses a normal dev_err() to report the error in case odr index point past the initialized part of the array.
--- drivers/misc/lis3lv02d/lis3lv02d.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
drivers/misc/lis3lv02d/lis3lv02d.c +16 -5
@@ -208,7 +208,7 @@ static int lis3_3dc_rates[16] = {0, 1, 1static int lis3_3dlh_rates[4 ] = {50 ,100 ,400 ,1000 };/* ODR is Output Data Rate */ -static int lis3lv02d_get_odr (struct lis3lv02d *lis3) +static int lis3lv02d_get_odr_index (struct lis3lv02d *lis3) {u8 ctrl;int shift;
@@ -216,15 +216,23 @@ static int lis3lv02d_get_odr(struct lis3 lis3->read (lis3,CTRL_REG1 , &ctrl); ctrl &= lis3->odr_mask; shift =ffs (lis3->odr_mask) -1 ; -return lis3->odrs[(ctrl >> shift)]; +return (ctrl >> shift); }static int lis3lv02d_get_pwron_wait (struct lis3lv02d *lis3) { -int div =lis3lv02d_get_odr (lis3); +int odr_idx =lis3lv02d_get_odr_index (lis3); +int div = lis3->odrs[odr_idx]; -if (WARN_ONCE (div ==0 ,"device returned spurious data" )) +if (div ==0 ) { +if (odr_idx ==0 ) { +/* Power-down mode, not sampling no need to sleep */ +return 0 ; + } + +dev_err (&lis3->pdev->dev,"Error unknown odrs-index: %d\n" , odr_idx);return -ENXIO ; + }/* LIS3 power on delay is quite long */ msleep (lis3->pwron_delay / div);
@@ -807,9 +815,12 @@ static ssize_t lis3lv02d_rate_show(struc struct device_attribute *attr, char *buf) { struct lis3lv02d *lis3 = dev_get_drvdata(dev); +int odr_idx;lis3lv02d_sysfs_poweron (lis3); -return sprintf (buf,"%d\n" ,lis3lv02d_get_odr (lis3)); + + odr_idx =lis3lv02d_get_odr_index (lis3); +return sprintf (buf,"%d\n" , lis3->odrs[odr_idx]); } static ssize_t lis3lv02d_rate_set(struct device *dev,
Greg Kroah-Hartman
maintainerPATCH 27/244 misc: vmw_vmci: explicitly initialize vmci_notify_bm_set_msg struct
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit 376565b9717c30cd58ad33860fa42697615fa2e4 upstream.
KMSAN complains that the vmci_use_ppn64() == false path in vmci_dbell_register_notification_bitmap() left upper 32bits of bitmap_set_msg.bitmap_ppn64 member uninitialized.
=====================================================
BUG: KMSAN: uninit-value in kmsan_check_memory+0xd/0x10 CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.11.0-rc7+ #4 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 02/27/2020 Call Trace: dump_stack+0x21c/0x280 kmsan_report+0xfb/0x1e0 kmsan_internal_check_memory+0x484/0x520 kmsan_check_memory+0xd/0x10 iowrite8_rep+0x86/0x380 vmci_send_datagram+0x150/0x280 vmci_dbell_register_notification_bitmap+0x133/0x1e0 vmci_guest_probe_device+0xcab/0x1e70 pci_device_probe+0xab3/0xe70 really_probe+0xd16/0x24d0 driver_probe_device+0x29d/0x3a0 device_driver_attach+0x25a/0x490 __driver_attach+0x78c/0x840 bus_for_each_dev+0x210/0x340 driver_attach+0x89/0xb0 bus_add_driver+0x677/0xc40 driver_register+0x485/0x8e0 __pci_register_driver+0x1ff/0x350 vmci_guest_init+0x3e/0x41 vmci_drv_init+0x1d6/0x43f do_one_initcall+0x39c/0x9a0 do_initcall_level+0x1d7/0x259 do_initcalls+0x127/0x1cb do_basic_setup+0x33/0x36 kernel_init_freeable+0x29a/0x3ed kernel_init+0x1f/0x840 ret_from_fork+0x1f/0x30
Local variable ----bitmap_set_msg@vmci_dbell_register_notification_bitmap created at:
vmci_dbell_register_notification_bitmap+0x50/0x1e0 vmci_dbell_register_notification_bitmap+0x50/0x1e0
Bytes 28-31 of 32 are uninitialized
Memory access of size 32 starts at ffff88810098f570
=====================================================
--- drivers/misc/vmw_vmci/vmci_doorbell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/vmw_vmci/vmci_doorbell.c +1 -1
@@ -326,7 +326,7 @@ int vmci_dbell_host_context_notify(u32 sbool vmci_dbell_register_notification_bitmap (u64 bitmap_ppn) {int result; -struct vmci_notify_bm_set_msg bitmap_set_msg; +struct vmci_notify_bm_set_msg bitmap_set_msg = { }; bitmap_set_msg.hdr.dst =vmci_make_handle (VMCI_HYPERVISOR_CONTEXT_ID ,VMCI_SET_NOTIFY_BITMAP );
Greg Kroah-Hartman
maintainerPATCH 28/244 misc: vmw_vmci: explicitly initialize vmci_datagram payload
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit b2192cfeba8481224da0a4ec3b4a7ccd80b1623b upstream.
KMSAN complains that vmci_check_host_caps() left the payload part of check_msg uninitialized.
=====================================================
BUG: KMSAN: uninit-value in kmsan_check_memory+0xd/0x10 CPU: 1 PID: 1 Comm: swapper/0 Tainted: G B 5.11.0-rc7+ #4 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 02/27/2020 Call Trace: dump_stack+0x21c/0x280 kmsan_report+0xfb/0x1e0 kmsan_internal_check_memory+0x202/0x520 kmsan_check_memory+0xd/0x10 iowrite8_rep+0x86/0x380 vmci_guest_probe_device+0xf0b/0x1e70 pci_device_probe+0xab3/0xe70 really_probe+0xd16/0x24d0 driver_probe_device+0x29d/0x3a0 device_driver_attach+0x25a/0x490 __driver_attach+0x78c/0x840 bus_for_each_dev+0x210/0x340 driver_attach+0x89/0xb0 bus_add_driver+0x677/0xc40 driver_register+0x485/0x8e0 __pci_register_driver+0x1ff/0x350 vmci_guest_init+0x3e/0x41 vmci_drv_init+0x1d6/0x43f do_one_initcall+0x39c/0x9a0 do_initcall_level+0x1d7/0x259 do_initcalls+0x127/0x1cb do_basic_setup+0x33/0x36 kernel_init_freeable+0x29a/0x3ed kernel_init+0x1f/0x840 ret_from_fork+0x1f/0x30
Uninit was created at:
kmsan_internal_poison_shadow+0x5c/0xf0 kmsan_slab_alloc+0x8d/0xe0 kmem_cache_alloc+0x84f/0xe30 vmci_guest_probe_device+0xd11/0x1e70 pci_device_probe+0xab3/0xe70 really_probe+0xd16/0x24d0 driver_probe_device+0x29d/0x3a0 device_driver_attach+0x25a/0x490 __driver_attach+0x78c/0x840 bus_for_each_dev+0x210/0x340 driver_attach+0x89/0xb0 bus_add_driver+0x677/0xc40 driver_register+0x485/0x8e0 __pci_register_driver+0x1ff/0x350 vmci_guest_init+0x3e/0x41 vmci_drv_init+0x1d6/0x43f do_one_initcall+0x39c/0x9a0 do_initcall_level+0x1d7/0x259 do_initcalls+0x127/0x1cb do_basic_setup+0x33/0x36 kernel_init_freeable+0x29a/0x3ed kernel_init+0x1f/0x840 ret_from_fork+0x1f/0x30
Bytes 28-31 of 36 are uninitialized
Memory access of size 36 starts at ffff8881675e5f00
=====================================================
--- drivers/misc/vmw_vmci/vmci_guest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/vmw_vmci/vmci_guest.c +1 -1
@@ -168,7 +168,7 @@ static int vmci_check_host_caps(struct p VMCI_UTIL_NUM_RESOURCES * sizeof(u32);struct vmci_datagram *check_msg; - check_msg =kmalloc (msg_size,GFP_KERNEL ); + check_msg =kzalloc (msg_size,GFP_KERNEL );if (!check_msg) {dev_err (&pdev->dev,"%s: Insufficient memory\n" , __func__);return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 29/244 md/bitmap: wait for external bitmap writes to complete during tear down
In reply to Greg Kroah-HartmanFrom: Sudhakar Panneerselvam <[email protected]>
commit 404a8ef512587b2460107d3272c17a89aef75edf upstream.
NULL pointer dereference was observed in super_written() when it tries to access the mddev structure.
[The below stack trace is from an older kernel, but the problem described in this patch applies to the mainline kernel.]
[ 1194.474861] task: ffff8fdd20858000 task.stack: ffffb99d40790000 [ 1194.488000] RIP: 0010:super_written+0x29/0xe1 [ 1194.499688] RSP: 0018:ffff8ffb7fcc3c78 EFLAGS: 00010046 [ 1194.512477] RAX: 0000000000000000 RBX: ffff8ffb7bf4a000 RCX: ffff8ffb78991048 [ 1194.527325] RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff8ffb56b8a200 [ 1194.542576] RBP: ffff8ffb7fcc3c90 R08: 000000000000000b R09: 0000000000000000 [ 1194.558001] R10: ffff8ffb56b8a298 R11: 0000000000000000 R12: ffff8ffb56b8a200 [ 1194.573070] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 [ 1194.588117] FS: 0000000000000000(0000) GS:ffff8ffb7fcc0000(0000) knlGS:0000000000000000 [ 1194.604264] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1194.617375] CR2: 00000000000002b8 CR3: 00000021e040a002 CR4: 00000000007606e0 [ 1194.632327] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 1194.647865] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 1194.663316] PKRU: 55555554 [ 1194.674090] Call Trace: [ 1194.683735] <IRQ> [ 1194.692948] bio_endio+0xae/0x135 [ 1194.703580] blk_update_request+0xad/0x2fa [ 1194.714990] blk_update_bidi_request+0x20/0x72 [ 1194.726578] __blk_end_bidi_request+0x2c/0x4d [ 1194.738373] __blk_end_request_all+0x31/0x49 [ 1194.749344] blk_flush_complete_seq+0x377/0x383 [ 1194.761550] flush_end_io+0x1dd/0x2a7 [ 1194.772910] blk_finish_request+0x9f/0x13c [ 1194.784544] scsi_end_request+0x180/0x25c [ 1194.796149] scsi_io_completion+0xc8/0x610 [ 1194.807503] scsi_finish_command+0xdc/0x125 [ 1194.818897] scsi_softirq_done+0x81/0xde [ 1194.830062] blk_done_softirq+0xa4/0xcc [ 1194.841008] __do_softirq+0xd9/0x29f [ 1194.851257] irq_exit+0xe6/0xeb [ 1194.861290] do_IRQ+0x59/0xe3 [ 1194.871060] common_interrupt+0x1c6/0x382 [ 1194.881988] </IRQ> [ 1194.890646] RIP: 0010:cpuidle_enter_state+0xdd/0x2a5 [ 1194.902532] RSP: 0018:ffffb99d40793e68 EFLAGS: 00000246 ORIG_RAX: ffffffffffffff43 [ 1194.917317] RAX: ffff8ffb7fce27c0 RBX: ffff8ffb7fced800 RCX: 000000000000001f [ 1194.932056] RDX: 0000000000000000 RSI: 0000000000000004 RDI: 0000000000000000 [ 1194.946428] RBP: ffffb99d40793ea0 R08: 0000000000000004 R09: 0000000000002ed2 [ 1194.960508] R10: 0000000000002664 R11: 0000000000000018 R12: 0000000000000003 [ 1194.974454] R13: 000000000000000b R14: ffffffff925715a0 R15: 0000011610120d5a [ 1194.988607] ? cpuidle_enter_state+0xcc/0x2a5 [ 1194.999077] cpuidle_enter+0x17/0x19 [ 1195.008395] call_cpuidle+0x23/0x3a [ 1195.017718] do_idle+0x172/0x1d5 [ 1195.026358] cpu_startup_entry+0x73/0x75 [ 1195.035769] start_secondary+0x1b9/0x20b [ 1195.044894] secondary_startup_64+0xa5/0xa5 [ 1195.084921] RIP: super_written+0x29/0xe1 RSP: ffff8ffb7fcc3c78 [ 1195.096354] CR2: 00000000000002b8
bio in the above stack is a bitmap write whose completion is invoked after the tear down sequence sets the mddev structure to NULL in rdev.
During tear down, there is an attempt to flush the bitmap writes, but for external bitmaps, there is no explicit wait for all the bitmap writes to complete. For instance, md_bitmap_flush() is called to flush the bitmap writes, but the last call to md_bitmap_daemon_work() in md_bitmap_flush() could generate new bitmap writes for which there is no explicit wait to complete those writes. The call to md_bitmap_update_sb() will return simply for external bitmaps and the follow-up call to md_update_sb() is conditional and may not get called for external bitmaps. This results in a kernel panic when the completion routine, super_written() is called which tries to reference mddev in the rdev that has been set to NULL(in unbind_rdev_from_array() by tear down sequence).
The solution is to call md_super_wait() for external bitmaps after the last call to md_bitmap_daemon_work() in md_bitmap_flush() to ensure there are no pending bitmap writes before proceeding with the tear down.
--- drivers/md/md-bitmap.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/md/md-bitmap.c +2 -0
@@ -1726,6 +1726,8 @@ void md_bitmap_flush(struct mddev *mddevmd_bitmap_daemon_work (mddev); bitmap->daemon_lastrun -= sleep;md_bitmap_daemon_work (mddev); +if (mddev->bitmap_info.external) +md_super_wait (mddev);md_bitmap_update_sb (bitmap); }
Greg Kroah-Hartman
maintainerPATCH 30/244 md-cluster: fix use-after-free issue when removing rdev
In reply to Greg Kroah-HartmanFrom: Heming Zhao <[email protected]>
commit f7c7a2f9a23e5b6e0f5251f29648d0238bb7757e upstream.
md_kick_rdev_from_array will remove rdev, so we should use rdev_for_each_safe to search list.
How to trigger:
env: Two nodes on kvm-qemu x86_64 VMs (2C2G with 2 iscsi luns).
```
node2=192.168.0.3
for i in {1..20}; do
echo ==== $i `date` ====;
mdadm -Ss && ssh ${node2} "mdadm -Ss"
wipefs -a /dev/sda /dev/sdb
mdadm -CR /dev/md0 -b clustered -e 1.2 -n 2 -l 1 /dev/sda \
/dev/sdb --assume-clean
ssh ${node2} "mdadm -A /dev/md0 /dev/sda /dev/sdb"
mdadm --wait /dev/md0
ssh ${node2} "mdadm --wait /dev/md0"
mdadm --manage /dev/md0 --fail /dev/sda --remove /dev/sda
sleep 1
done
```Crash stack:
``` stack segment: 0000 [#1] SMP ... ... RIP: 0010:md_check_recovery+0x1e8/0x570 [md_mod] ... ... RSP: 0018:ffffb149807a7d68 EFLAGS: 00010207 RAX: 0000000000000000 RBX: ffff9d494c180800 RCX: ffff9d490fc01e50 RDX: fffff047c0ed8308 RSI: 0000000000000246 RDI: 0000000000000246 RBP: 6b6b6b6b6b6b6b6b R08: ffff9d490fc01e40 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000000 R13: ffff9d494c180818 R14: ffff9d493399ef38 R15: ffff9d4933a1d800 FS: 0000000000000000(0000) GS:ffff9d494f700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fe68cab9010 CR3: 000000004c6be001 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: raid1d+0x5c/0xd40 [raid1] ? finish_task_switch+0x75/0x2a0 ? lock_timer_base+0x67/0x80 ? try_to_del_timer_sync+0x4d/0x80 ? del_timer_sync+0x41/0x50 ? schedule_timeout+0x254/0x2d0 ? md_start_sync+0xe0/0xe0 [md_mod] ? md_thread+0x127/0x160 [md_mod] md_thread+0x127/0x160 [md_mod] ? wait_woken+0x80/0x80 kthread+0x10d/0x130 ? kthread_park+0xa0/0xa0 ret_from_fork+0x1f/0x40 ```
--- drivers/md/md.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/md/md.c +4 -4
@@ -9049,11 +9049,11 @@ void md_check_recovery(struct mddev *mdd }if (mddev_is_clustered (mddev)) { -struct md_rdev *rdev; +struct md_rdev *rdev, *tmp;/* kick the device if another node issued a * remove disk. */ -rdev_for_each (rdev, mddev) { +rdev_for_each_safe (rdev, tmp, mddev) {if (test_and_clear_bit (ClusterRemove, &rdev->flags) && rdev->raid_disk <0 )md_kick_rdev_from_array (rdev);
@@ -9366,7 +9366,7 @@ err_wq:static void check_sb_changes (struct mddev *mddev,struct md_rdev *rdev) {struct mdp_superblock_1 *sb =page_address (rdev->sb_page); -struct md_rdev *rdev2; +struct md_rdev *rdev2, *tmp;int role, ret;char b[BDEVNAME_SIZE ];
@@ -9383,7 +9383,7 @@ static void check_sb_changes(struct mdde }/* Check for change of roles in the active devices */ -rdev_for_each (rdev2, mddev) { +rdev_for_each_safe (rdev2, tmp, mddev) {if (test_bit (Faulty, &rdev2->flags))continue ;
Greg Kroah-Hartman
maintainerPATCH 31/244 md: split mddev_find
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
commit 65aa97c4d2bfd76677c211b9d03ef05a98c6d68e upstream.
Split mddev_find into a simple mddev_find that just finds an existing mddev by the unit number, and a more complicated mddev_find that deals with find or allocating a mddev.
This turns out to fix this bug reported by Zhao Heming.
----------------------------- snip ------------------------------ commit d3374825ce57 ("md: make devices disappear when they are no longer needed.") introduced protection between mddev creating & removing. The md_open shouldn't create mddev when all_mddevs list doesn't contain mddev. With currently code logic, there will be very easy to trigger soft lockup in non-preempt env.
--- drivers/md/md.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)
drivers/md/md.c +19 -5
@@ -649,6 +649,22 @@ EXPORT_SYMBOL_GPL(mddev_init);static struct mddev *mddev_find (dev_t unit) { +struct mddev *mddev; + +if (MAJOR (unit) !=MD_MAJOR ) + unit &= ~((1 << MdpMinorShift) -1 ); + +spin_lock (&all_mddevs_lock); + mddev =mddev_find_locked (unit); +if (mddev) +mddev_get (mddev); +spin_unlock (&all_mddevs_lock); + +return mddev; +} + +static struct mddev *mddev_find_or_alloc (dev_t unit) +{struct mddev *mddev, *new =NULL ;if (unit &&MAJOR (unit) !=MD_MAJOR )
@@ -5436,7 +5452,7 @@ static int md_alloc(dev_t dev, char *nam* writing to /sys/module/md_mod/parameters/new_array. */ static DEFINE_MUTEX (disks_mutex); -struct mddev *mddev =mddev_find (dev); +struct mddev *mddev =mddev_find_or_alloc (dev);struct gendisk *disk;int partitioned;int shift;
@@ -6312,11 +6328,9 @@ static void autorun_devices(int part)md_probe (dev,NULL ,NULL ); mddev =mddev_find (dev); -if (!mddev || !mddev->gendisk) { -if (mddev) -mddev_put (mddev); +if (!mddev)break ; - } +if (mddev_lock (mddev))pr_warn ("md: %s locked, cannot run\n" ,mdname (mddev)); else if (mddev->raid_disks || mddev->major_version
Greg Kroah-Hartman
maintainerPATCH 32/244 md: factor out a mddev_find_locked helper from mddev_find
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
commit 8b57251f9a91f5e5a599de7549915d2d226cc3af upstream.
Factor out a self-contained helper to just lookup a mddev by the dev_t "unit".
--- drivers/md/md.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-)
drivers/md/md.c +19 -13
@@ -647,6 +647,17 @@ void mddev_init(struct mddev *mddev) }EXPORT_SYMBOL_GPL (mddev_init); +static struct mddev *mddev_find_locked (dev_t unit) +{ +struct mddev *mddev; + +list_for_each_entry (mddev, &all_mddevs, all_mddevs) +if (mddev->unit == unit) +return mddev; + +return NULL ; +} +static struct mddev *mddev_find (dev_t unit) {struct mddev *mddev;
@@ -674,13 +685,13 @@ static struct mddev *mddev_find_or_allocspin_lock (&all_mddevs_lock);if (unit) { -list_for_each_entry (mddev, &all_mddevs, all_mddevs) -if (mddev->unit == unit) { -mddev_get (mddev); -spin_unlock (&all_mddevs_lock); -kfree (new); -return mddev; - } + mddev =mddev_find_locked (unit); +if (mddev) { +mddev_get (mddev); +spin_unlock (&all_mddevs_lock); +kfree (new); +return mddev; + }if (new) {list_add (&new->all_mddevs, &all_mddevs);
@@ -706,12 +717,7 @@ static struct mddev *mddev_find_or_allocreturn NULL ; } - is_free =1 ; -list_for_each_entry (mddev, &all_mddevs, all_mddevs) -if (mddev->unit == dev) { - is_free =0 ; -break ; - } + is_free = !mddev_find_locked (dev); } new->unit = dev; new->md_minor =MINOR (dev);
Greg Kroah-Hartman
maintainerPATCH 33/244 md: md_open returns -EBUSY when entering racing area
In reply to Greg Kroah-HartmanFrom: Zhao Heming <[email protected]>
commit 6a4db2a60306eb65bfb14ccc9fde035b74a4b4e7 upstream.
commit d3374825ce57 ("md: make devices disappear when they are no longer needed.") introduced protection between mddev creating & removing. The md_open shouldn't create mddev when all_mddevs list doesn't contain mddev. With currently code logic, there will be very easy to trigger soft lockup in non-preempt env.
This patch changes md_open returning from -ERESTARTSYS to -EBUSY, which will break the infinitely retry when md_open enter racing area.
This patch is partly fix soft lockup issue, full fix needs mddev_find is split into two functions: mddev_find & mddev_find_or_alloc. And md_open should call new mddev_find (it only does searching job).
For more detail, please refer with Christoph's "split mddev_find" patch in later commits.
--- drivers/md/md.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/md/md.c +1 -2
@@ -7638,8 +7638,7 @@ static int md_open(struct block_device */* Wait until bdev->bd_disk is definitely gone */ if (work_pending (&mddev->del_work))flush_workqueue (md_misc_wq); -/* Then retry the open from the top */ -return -ERESTARTSYS ; +return -EBUSY ; }BUG_ON (mddev != bdev->bd_disk->private_data);
Greg Kroah-Hartman
maintainerPATCH 34/244 md: Fix missing unused status line of /proc/mdstat
In reply to Greg Kroah-HartmanFrom: Jan Glauber <[email protected]>
commit 7abfabaf5f805f5171d133ce6af9b65ab766e76a upstream.
Reading /proc/mdstat with a read buffer size that would not fit the unused status line in the first read will skip this line from the output.
So 'dd if=/proc/mdstat bs=64 2>/dev/null' will not print something
like: unused devices: <none>
Don't return NULL immediately in start() for v=2 but call show() once to print the status line also for multiple reads.
--- drivers/md/md.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/md/md.c +5 -1
@@ -7971,7 +7971,11 @@ static void *md_seq_start(struct seq_filloff_t l = *pos;struct mddev *mddev; -if (l >=0x10000 ) +if (l ==0x10000 ) { + ++*pos; +return (void *)2 ; + } +if (l >0x10000 )return NULL ;if (!l--)/* header */
Greg Kroah-Hartman
maintainerPATCH 35/244 MIPS: Reinstate platform `__div64_32 handler
In reply to Greg Kroah-HartmanFrom: Maciej W. Rozycki <[email protected]>
commit c49f71f60754acbff37505e1d16ca796bf8a8140 upstream.
Our current MIPS platform __div64_32' handler is inactive, because it is incorrectly only enabled for 64-bit configurations, for which generic do_div' code does not call it anyway.
The handler is not suitable for being called from there though as it only calculates 32 bits of the quotient under the assumption the 64-bit divident has been suitably reduced. Code for such reduction used to be there, however it has been incorrectly removed with commit c21004cd5b4c ("MIPS: Rewrite <asm/div64.h> to work with gcc 4.4.0."), which should have only updated an obsoleted constraint for an inline asm involving $hi and $lo register outputs, while possibly wiring the original MIPS variant of the do_div' macro as __div64_32' handler for the generic `do_div' implementation
Correct the handler as follows then:
- Revert most of the commit referred, however retaining the current formatting, except for the final two instructions of the inline asm sequence, which the original commit missed. Omit the original 64-bit parts though.
- Rename the original do_div' macro to __div64_32'. Use the combined x' constraint referring to the MD accumulator as a whole, replacing the original individual h' and l' constraints used for $hi and $lo registers respectively, of which h' has been obsoleted with GCC 4.4. Update surrounding code accordingly.
We have since removed support for GCC versions before 4.9, so no need for a special arrangement here; GCC has supported the `x' constraint since forever anyway, or at least going back to 1991.
- Rename the __base' local variable in __div64_32' to __radix' to avoid a conflict with a local variable in do_div'.
- Actually enable this code for 32-bit rather than 64-bit configurations by qualifying it with BITS_PER_LONG being 32 instead of 64. Include <asm/bitsperlong.h> for this macro rather than <linux/types.h> as we don't need anything else.
- Finally include <asm-generic/div64.h> last rather than first.
This has passed correctness verification with test_div64 and reduced the module's average execution time down to 1.0668s and 0.2629s from 2.1529s and 0.5647s respectively for an R3400 CPU @40MHz and a 5Kc CPU @160MHz. For a reference 64-bit `do_div' code where we have the DDIVU instruction available to do the whole calculation right away averages at 0.0660s for the latter CPU.
--- arch/mips/include/asm/div64.h | 57 ++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 16 deletions(-)
arch/mips/include/asm/div64.h +41 -16
@@ -1,5 +1,5 @@/* -* Copyright (C) 2000, 2004 Maciej W. Rozycki +* Copyright (C) 2000, 2004, 2021 Maciej W. Rozycki * Copyright (C) 2003, 07 Ralf Baechle ([email protected]) * * This file is subject to the terms and conditions of the GNU General Public
@@ -9,25 +9,18 @@#ifndef __ASM_DIV64_H#define __ASM_DIV64_H -#include <asm-generic/div64.h> - -#if BITS_PER_LONG ==64 +#include <asm/bitsperlong.h> -#include <linux/types.h> +#if BITS_PER_LONG ==32 /* * No traps on overflows for any of these... */ -#define __div64_32 (n, base) \ -({ \ +#define do_div64_32 (res, high, low, base) ({ \ unsigned long __cf, __tmp, __tmp2, __i; \ unsigned long __quot32, __mod32; \ - unsigned long __high, __low; \ - unsigned long long __n; \ \ - __high = *__n >> 32; \ - __low = __n; \ __asm__( \ " .set push \n" \ " .set noat \n" \
@@ -51,18 +44,50 @@" subu %0, %0, %z6 \n" \" addiu %2, %2, 1 \n" \"3: \n" \ - " bnez %4, 0b\n\t" \ - " srl %5, %1, 0x1f\n\t" \ +" bnez %4, 0b \n" \ +" srl %5, %1, 0x1f \n" \" .set pop" \ : "=&r" (__mod32), "=&r" (__tmp), \ "=&r" (__quot32), "=&r" (__cf), \ "=&r" (__i), "=&r" (__tmp2) \ - : "Jr" (base), "0" (__high), "1" (__low)); \ + : "Jr" (base), "0" (high), "1" (low)); \ \ - (__n) = __quot32; \ + (res) = __quot32; \ __mod32; \ }) -#endif /* BITS_PER_LONG == 64 */ +#define __div64_32(n, base) ({ \ +unsigned long __upper, __low, __high, __radix; \ +unsigned long long __modquot; \ +unsigned long long __quot; \ +unsigned long long __div; \ +unsigned long __mod; \ + \ + __div = (*n); \ + __radix = (base); \ + \ + __high = __div >>32 ; \ + __low = __div; \ + __upper = __high; \ + \ +if (__high) { \ + __asm__("divu $0, %z1, %z2" \ + :"=x" (__modquot) \ + :"Jr" (__high),"Jr" (__radix)); \ + __upper = __modquot >>32 ; \ + __high = __modquot; \ + } \ + \ + __mod =do_div64_32 (__low, __upper, __low, __radix); \ + \ + __quot = __high; \ + __quot = __quot <<32 | __low; \ + (*n) = __quot; \ + __mod; \ +}) + +#endif /* BITS_PER_LONG == 32 */ + +#include <asm-generic/div64.h> #endif /* __ASM_DIV64_H */
Greg Kroah-Hartman
maintainerPATCH 36/244 ipw2x00: potential buffer overflow in libipw_wx_set_encodeext()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 260a9ad9446723d4063ed802989758852809714d upstream.
The "ext->key_len" is a u16 that comes from the user. If it's over SCM_KEY_LEN (32) that could lead to memory corruption.
--- drivers/net/wireless/intel/ipw2x00/libipw_wx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/ipw2x00/libipw_wx.c +4 -2
@@ -633,8 +633,10 @@ int libipw_wx_set_encodeext(struct libip }if (ext->alg !=IW_ENCODE_ALG_NONE ) { -memcpy (sec.keys[idx], ext->key, ext->key_len); - sec.key_sizes[idx] = ext->key_len; +int key_len =clamp_val (ext->key_len,0 ,SCM_KEY_LEN ); + +memcpy (sec.keys[idx], ext->key, key_len); + sec.key_sizes[idx] = key_len; sec.flags |= (1 << idx);if (ext->alg ==IW_ENCODE_ALG_WEP ) { sec.encode_alg[idx] =SEC_ALG_WEP ;
Greg Kroah-Hartman
maintainerPATCH 37/244 cfg80211: scan: drop entry from hidden_list on overflow
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
commit 010bfbe768f7ecc876ffba92db30432de4997e2a upstream.
If we overflow the maximum number of BSS entries and free the new entry, drop it from any hidden_list that it may have been added to in the code above or in cfg80211_combine_bsses().
--- net/wireless/scan.c | 2 ++ 1 file changed, 2 insertions(+)
net/wireless/scan.c +2 -0
@@ -1257,6 +1257,8 @@ cfg80211_bss_update(struct cfg80211_regiif (rdev->bss_entries >= bss_entries_limit && !cfg80211_bss_expire_oldest (rdev)) { +if (!list_empty (&new->hidden_list)) +list_del (&new->hidden_list);kfree (new); goto drop; }
Greg Kroah-Hartman
maintainerPATCH 38/244 rtw88: Fix array overrun in rtw_get_tx_power_params()
In reply to Greg Kroah-HartmanFrom: Ping-Ke Shih <[email protected]>
commit 2ff25985ea9ccc6c9af2c77b0b49045adcc62e0e upstream.
Using a kernel with the Undefined Behaviour Sanity Checker (UBSAN) enabled, the following array overrun is logged:
================================================================================
UBSAN: array-index-out-of-bounds in /home/finger/wireless-drivers-next/drivers/net/wireless/realtek/rtw88/phy.c:1789:34 index 5 is out of range for type 'u8 [5]' CPU: 2 PID: 84 Comm: kworker/u16:3 Tainted: G O 5.12.0-rc5-00086-gd88bba47038e-dirty #651 Hardware name: TOSHIBA TECRA A50-A/TECRA A50-A, BIOS Version 4.50 09/29/2014 Workqueue: phy0 ieee80211_scan_work [mac80211] Call Trace: dump_stack+0x64/0x7c ubsan_epilogue+0x5/0x40 __ubsan_handle_out_of_bounds.cold+0x43/0x48 rtw_get_tx_power_params+0x83a/drivers/net/wireless/realtek/rtw88/0xad0 [rtw_core] ? rtw_pci_read16+0x20/0x20 [rtw_pci] ? check_hw_ready+0x50/0x90 [rtw_core] rtw_phy_get_tx_power_index+0x4d/0xd0 [rtw_core] rtw_phy_set_tx_power_level+0xee/0x1b0 [rtw_core] rtw_set_channel+0xab/0x110 [rtw_core] rtw_ops_config+0x87/0xc0 [rtw_core] ieee80211_hw_config+0x9d/0x130 [mac80211] ieee80211_scan_state_set_channel+0x81/0x170 [mac80211] ieee80211_scan_work+0x19f/0x2a0 [mac80211] process_one_work+0x1dd/0x3a0 worker_thread+0x49/0x330 ? rescuer_thread+0x3a0/0x3a0 kthread+0x134/0x150 ? kthread_create_worker_on_cpu+0x70/0x70 ret_from_fork+0x22/0x30 ================================================================================
The statement where an array is being overrun is shown in the following snippet:
if (rate <= DESC_RATE11M) tx_power = pwr_idx_2g->cck_base[group]; else
====> tx_power = pwr_idx_2g->bw40_base[group];
The associated arrays are defined in main.h as follows:
struct rtw_2g_txpwr_idx {
u8 cck_base[6];
u8 bw40_base[5];
struct rtw_2g_1s_pwr_idx_diff ht_1s_diff;
struct rtw_2g_ns_pwr_idx_diff ht_2s_diff;
struct rtw_2g_ns_pwr_idx_diff ht_3s_diff;
struct rtw_2g_ns_pwr_idx_diff ht_4s_diff;
};The problem arises because the value of group is 5 for channel 14. The trivial increase in the dimension of bw40_base fails as this struct must match the layout of efuse. The fix is to add the rate as an argument to rtw_get_channel_group() and set the group for channel 14 to 4 if rate <= DESC_RATE11M.
This patch fixes commit fa6dfe6bff24 ("rtw88: resolve order of tx power setting routines")
--- drivers/net/wireless/realtek/rtw88/phy.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw88/phy.c +3 -2
@@ -1451,7 +1451,7 @@ void rtw_phy_load_tables(struct rtw_dev } } -static u8 rtw_get_channel_group (u8 channel) +static u8 rtw_get_channel_group (u8 channel,u8 rate) {switch (channel) {default :
@@ -1495,6 +1495,7 @@ static u8 rtw_get_channel_group(u8 channcase 106 :return 4 ;case 14 : +return rate <=DESC_RATE11M ?5 :4 ;case 108 :case 110 :case 112 :
@@ -1744,7 +1745,7 @@ void rtw_get_tx_power_params(struct rtw_s8 *limit = &pwr_param->pwr_limit; pwr_idx = &rtwdev->efuse.txpwr_idx_table[path]; - group =rtw_get_channel_group (ch); + group =rtw_get_channel_group (ch, rate);/* base power index for 2.4G/5G */ if (ch <=14 ) {
Greg Kroah-Hartman
maintainerPATCH 39/244 drm/panfrost: Clear MMU irqs before handling the fault
In reply to Greg Kroah-HartmanFrom: Boris Brezillon <[email protected]>
commit 3aa0a80fc692c9959c261f4c5bfe9c23ddd90562 upstream.
When a fault is handled it will unblock the GPU which will continue executing its shader and might fault almost immediately on a different page. If we clear interrupts after handling the fault we might miss new faults, so clear them before.
--- drivers/gpu/drm/panfrost/panfrost_mmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/panfrost/panfrost_mmu.c +2 -2
@@ -600,6 +600,8 @@ static irqreturn_t panfrost_mmu_irq_hand access_type = (fault_status >>8 ) &0x3 ; source_id = (fault_status >>16 ); +mmu_write (pfdev,MMU_INT_CLEAR , mask); +/* Page fault only */ ret =-1 ;if ((status & mask) ==BIT (i) && (exception_type &0xF8 ) ==0xC0 )
@@ -623,8 +625,6 @@ static irqreturn_t panfrost_mmu_irq_hand access_type,access_type_name (pfdev, fault_status), source_id); -mmu_write (pfdev,MMU_INT_CLEAR , mask); - status &= ~mask; }
Greg Kroah-Hartman
maintainerPATCH 40/244 drm/panfrost: Dont try to map pages that are already mapped
In reply to Greg Kroah-HartmanFrom: Boris Brezillon <[email protected]>
commit f45da8204ff1707c529a8769f5467ff16f504b26 upstream.
We allocate 2MB chunks at a time, so it might appear that a page fault has already been handled by a previous page fault when we reach panfrost_mmu_map_fault_addr(). Bail out in that case to avoid mapping the same area twice.
--- drivers/gpu/drm/panfrost/panfrost_mmu.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/gpu/drm/panfrost/panfrost_mmu.c +8 -1
@@ -494,8 +494,14 @@ static int panfrost_mmu_map_fault_addr(s } bo->base.pages = pages; bo->base.pages_use_count =1 ; - }else + }else { pages = bo->base.pages; +if (pages[page_offset]) { +/* Pages are already mapped, bail out. */ +mutex_unlock (&bo->base.pages_lock); + goto out; + } + } mapping = bo->base.base.filp->f_mapping;mapping_set_unevictable (mapping);
@@ -529,6 +535,7 @@ static int panfrost_mmu_map_fault_addr(sdev_dbg (pfdev->dev,"mapped page fault @ AS%d %llx" , as, addr); +out:panfrost_gem_mapping_put (bomapping);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 41/244 drm/radeon: fix copy of uninitialized variable back to userspace
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
commit 8dbc2ccac5a65c5b57e3070e36a3dc97c7970d96 upstream.
Currently the ioctl command RADEON_INFO_SI_BACKEND_ENABLED_MASK can copy back uninitialised data in value_tmp that pointer *value points to. This can occur when rdev->family is less than CHIP_BONAIRE and less than CHIP_TAHITI. Fix this by adding in a missing -EINVAL so that no invalid value is copied back to userspace.
Addresses-Coverity: ("Uninitialized scalar variable)
--- drivers/gpu/drm/radeon/radeon_kms.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/radeon/radeon_kms.c +1 -0
@@ -512,6 +512,7 @@ static int radeon_info_ioctl(struct drm_ *value = rdev->config.si.backend_enable_mask; }else {DRM_DEBUG_KMS ("BACKEND_ENABLED_MASK is si+ only!\n" ); +return -EINVAL ; }break ;case RADEON_INFO_MAX_SCLK :
Greg Kroah-Hartman
maintainerPATCH 42/244 drm/amd/display: Reject non-zero src_y and src_x for video planes
In reply to Greg Kroah-HartmanFrom: Harry Wentland <[email protected]>
commit d89f6048bdcb6a56abb396c584747d5eeae650db upstream.
[Why]
This hasn't been well tested and leads to complete system hangs on DCN1 based systems, possibly others.
The system hang can be reproduced by gesturing the video on the YouTube Android app on ChromeOS into full screen.
[How]
Reject atomic commits with non-zero drm_plane_state.src_x or src_y values.
v2:
- Add code comment describing the reason we're rejecting non-zero src_x and src_y
- Drop gerrit Change-Id
- Add stable CC
- Based on amd-staging-drm-next
v3: removed trailing whitespace
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +17 -0
@@ -2632,6 +2632,23 @@ static int fill_dc_scaling_info(const st scaling_info->src_rect.x = state->src_x >>16 ; scaling_info->src_rect.y = state->src_y >>16 ; +/* +* For reasons we don't (yet) fully understand a non-zero +* src_y coordinate into an NV12 buffer can cause a +* system hang. To avoid hangs (and maybe be overly cautious) +* let's reject both non-zero src_x and src_y. +* +* We currently know of only one use-case to reproduce a +* scenario with non-zero src_x and src_y for NV12, which +* is to gesture the YouTube Android app into full screen +* on ChromeOS. +*/ +if (state->fb && + state->fb->format->format ==DRM_FORMAT_NV12 && + (scaling_info->src_rect.x !=0 || + scaling_info->src_rect.y !=0 )) +return -EINVAL ; + scaling_info->src_rect.width = state->src_w >>16 ;if (scaling_info->src_rect.width ==0 )return -EINVAL ;
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Greg Kroah-Hartman
maintainerPATCH 43/244 ALSA: hda/realtek: Re-order ALC882 Acer quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit b265047ac56bad8c4f3d0c8bf9cb4e828ee0d28e upstream.
Just re-order the alc882_fixup_tbl[] entries for Acer devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/pci/hda/patch_realtek.c +3 -3
@@ -2460,13 +2460,13 @@ static const struct snd_pci_quirk alc882 ALC882_FIXUP_ACER_ASPIRE_8930G),SND_PCI_QUIRK (0x1025 ,0x0146 ,"Acer Aspire 6935G" ,ALC882_FIXUP_ACER_ASPIRE_8930G ), +SND_PCI_QUIRK (0x1025 ,0x0142 ,"Acer Aspire 7730G" , +ALC882_FIXUP_ACER_ASPIRE_4930G ), +SND_PCI_QUIRK (0x1025 ,0x0155 ,"Packard-Bell M5120" ,ALC882_FIXUP_PB_M5210 ),SND_PCI_QUIRK (0x1025 ,0x015e ,"Acer Aspire 6930G" ,ALC882_FIXUP_ACER_ASPIRE_4930G ),SND_PCI_QUIRK (0x1025 ,0x0166 ,"Acer Aspire 6530G" ,ALC882_FIXUP_ACER_ASPIRE_4930G ), -SND_PCI_QUIRK (0x1025 ,0x0142 ,"Acer Aspire 7730G" , -ALC882_FIXUP_ACER_ASPIRE_4930G ), -SND_PCI_QUIRK (0x1025 ,0x0155 ,"Packard-Bell M5120" ,ALC882_FIXUP_PB_M5210 ),SND_PCI_QUIRK (0x1025 ,0x021e ,"Acer Aspire 5739G" ,ALC882_FIXUP_ACER_ASPIRE_4930G ), SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
Greg Kroah-Hartman
maintainerPATCH 44/244 ALSA: hda/realtek: Re-order ALC882 Sony quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit b7529c18feecb1af92f9db08c8e7fe446a82d96d upstream.
Just re-order the alc882_fixup_tbl[] entries for Sony devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +2 -2
@@ -2479,11 +2479,11 @@ static const struct snd_pci_quirk alc882SND_PCI_QUIRK (0x1043 ,0x835f ,"Asus Eee 1601" ,ALC888_FIXUP_EEE1601 ),SND_PCI_QUIRK (0x1043 ,0x84bc ,"ASUS ET2700" ,ALC887_FIXUP_ASUS_BASS ),SND_PCI_QUIRK (0x1043 ,0x8691 ,"ASUS ROG Ranger VIII" ,ALC882_FIXUP_GPIO3 ), +SND_PCI_QUIRK (0x104d ,0x9043 ,"Sony Vaio VGC-LN51JGB" ,ALC882_FIXUP_NO_PRIMARY_HP ), +SND_PCI_QUIRK (0x104d ,0x9044 ,"Sony VAIO AiO" ,ALC882_FIXUP_NO_PRIMARY_HP ),SND_PCI_QUIRK (0x104d ,0x9047 ,"Sony Vaio TT" ,ALC889_FIXUP_VAIO_TT ),SND_PCI_QUIRK (0x104d ,0x905a ,"Sony Vaio Z" ,ALC882_FIXUP_NO_PRIMARY_HP ),SND_PCI_QUIRK (0x104d ,0x9060 ,"Sony Vaio VPCL14M1R" ,ALC882_FIXUP_NO_PRIMARY_HP ), -SND_PCI_QUIRK (0x104d ,0x9043 ,"Sony Vaio VGC-LN51JGB" ,ALC882_FIXUP_NO_PRIMARY_HP ), -SND_PCI_QUIRK (0x104d ,0x9044 ,"Sony VAIO AiO" ,ALC882_FIXUP_NO_PRIMARY_HP ),/* All Apple entries are in codec SSIDs */ SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
Greg Kroah-Hartman
maintainerPATCH 45/244 ALSA: hda/realtek: Re-order ALC882 Clevo quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 13e1a4cd490b959a4c72c9f4fb502ef56b190062 upstream.
Just re-order the alc882_fixup_tbl[] entries for Clevo devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also, user lower hex letters in the entry.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
sound/pci/hda/patch_realtek.c +11 -11
@@ -2526,9 +2526,19 @@ static const struct snd_pci_quirk alc882SND_PCI_QUIRK (0x1462 ,0xda57 ,"MSI Z270-Gaming" ,ALC1220_FIXUP_GB_DUAL_CODECS ),SND_PCI_QUIRK_VENDOR (0x1462 ,"MSI" ,ALC882_FIXUP_GPIO3 ),SND_PCI_QUIRK (0x147b ,0x107a ,"Abit AW9D-MAX" ,ALC882_FIXUP_ABIT_AW9D_MAX ), +SND_PCI_QUIRK (0x1558 ,0x50d3 ,"Clevo PC50[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x65d1 ,"Clevo PB51[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x65d2 ,"Clevo PB51R[CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x65e1 ,"Clevo PB51[ED][DF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x65e5 ,"Clevo PC50D[PRS](?:-D|-G)?" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x67d1 ,"Clevo PB71[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x67e1 ,"Clevo PB71[DE][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x67e5 ,"Clevo PC70D[PRS](?:-D|-G)?" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x70d1 ,"Clevo PC70[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x7714 ,"Clevo X170" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x9501 ,"Clevo P950HR" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1558 ,0x9506 ,"Clevo P955HQ" ,ALC1220_FIXUP_CLEVO_P950 ), -SND_PCI_QUIRK (0x1558 ,0x950A ,"Clevo P955H[PR]" ,ALC1220_FIXUP_CLEVO_P950 ), +SND_PCI_QUIRK (0x1558 ,0x950a ,"Clevo P955H[PR]" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1558 ,0x95e1 ,"Clevo P95xER" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1558 ,0x95e2 ,"Clevo P950ER" ,ALC1220_FIXUP_CLEVO_P950 ), SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
@@ -2538,16 +2548,6 @@ static const struct snd_pci_quirk alc882SND_PCI_QUIRK (0x1558 ,0x96e1 ,"Clevo P960[ER][CDFN]-K" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1558 ,0x97e1 ,"Clevo P970[ER][CDFN]" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1558 ,0x97e2 ,"Clevo P970RC-M" ,ALC1220_FIXUP_CLEVO_P950 ), -SND_PCI_QUIRK (0x1558 ,0x50d3 ,"Clevo PC50[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x65d1 ,"Clevo PB51[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x65d2 ,"Clevo PB51R[CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x65e1 ,"Clevo PB51[ED][DF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x65e5 ,"Clevo PC50D[PRS](?:-D|-G)?" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x67d1 ,"Clevo PB71[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x67e1 ,"Clevo PB71[DE][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x67e5 ,"Clevo PC70D[PRS](?:-D|-G)?" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x70d1 ,"Clevo PC70[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), -SND_PCI_QUIRK (0x1558 ,0x7714 ,"Clevo X170" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK_VENDOR (0x1558 ,"Clevo laptop" ,ALC882_FIXUP_EAPD ),SND_PCI_QUIRK (0x161f ,0x2054 ,"Medion laptop" ,ALC883_FIXUP_EAPD ), SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
Greg Kroah-Hartman
maintainerPATCH 46/244 ALSA: hda/realtek: Re-order ALC269 HP quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 45461e3b554c75ddff9703539f3711cc3dfb0422 upstream.
Just re-order the alc269_fixup_tbl[] entries for HP devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Formerly, some entries were grouped for the actual codec, but this doesn't seem reasonable to keep in that way. So now we simply keep the PCI SSID order for the whole.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 44 ++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 23 deletions(-)
sound/pci/hda/patch_realtek.c +21 -23
@@ -7864,35 +7864,18 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x1586 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC2 ),SND_PCI_QUIRK (0x103c ,0x18e6 ,"HP" ,ALC269_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x218b ,"HP" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED ), -SND_PCI_QUIRK (0x103c ,0x225f ,"HP" ,ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY ), -/* ALC282 */ SND_PCI_QUIRK (0x103c ,0x21f9 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2210 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2214 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x221b ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), +SND_PCI_QUIRK (0x103c ,0x221c ,"HP EliteBook 755 G2" ,ALC280_FIXUP_HP_HEADSET_MIC ), +SND_PCI_QUIRK (0x103c ,0x2221 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), +SND_PCI_QUIRK (0x103c ,0x2225 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2236 ,"HP" ,ALC269_FIXUP_HP_LINE1_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2237 ,"HP" ,ALC269_FIXUP_HP_LINE1_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2238 ,"HP" ,ALC269_FIXUP_HP_LINE1_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2239 ,"HP" ,ALC269_FIXUP_HP_LINE1_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x224b ,"HP" ,ALC269_FIXUP_HP_LINE1_MIC1_LED ), -SND_PCI_QUIRK (0x103c ,0x2268 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x226a ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x226b ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x226e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x2271 ,"HP" ,ALC286_FIXUP_HP_GPIO_LED ), -SND_PCI_QUIRK (0x103c ,0x2272 ,"HP" ,ALC280_FIXUP_HP_DOCK_PINS ), -SND_PCI_QUIRK (0x103c ,0x2273 ,"HP" ,ALC280_FIXUP_HP_DOCK_PINS ), -SND_PCI_QUIRK (0x103c ,0x229e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x22b2 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x22b7 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x22bf ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x22cf ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x22db ,"HP" ,ALC280_FIXUP_HP_9480M ), -SND_PCI_QUIRK (0x103c ,0x22dc ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), -SND_PCI_QUIRK (0x103c ,0x22fb ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), -/* ALC290 */ -SND_PCI_QUIRK (0x103c ,0x221b ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), -SND_PCI_QUIRK (0x103c ,0x2221 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), -SND_PCI_QUIRK (0x103c ,0x2225 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2253 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2254 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
@@ -7900,26 +7883,41 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x2257 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2259 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x225a ,"HP" ,ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED ), +SND_PCI_QUIRK (0x103c ,0x225f ,"HP" ,ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY ),SND_PCI_QUIRK (0x103c ,0x2260 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2263 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2264 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2265 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2268 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226a ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226b ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2271 ,"HP" ,ALC286_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x2272 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), +SND_PCI_QUIRK (0x103c ,0x2272 ,"HP" ,ALC280_FIXUP_HP_DOCK_PINS ),SND_PCI_QUIRK (0x103c ,0x2273 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), +SND_PCI_QUIRK (0x103c ,0x2273 ,"HP" ,ALC280_FIXUP_HP_DOCK_PINS ),SND_PCI_QUIRK (0x103c ,0x2278 ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x227f ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2282 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x228b ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x228e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x229e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x22b2 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x22b7 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x22bf ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x22c4 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x22c5 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x22c7 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x22c8 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x22c4 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x22cf ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x22db ,"HP" ,ALC280_FIXUP_HP_9480M ), +SND_PCI_QUIRK (0x103c ,0x22dc ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ), +SND_PCI_QUIRK (0x103c ,0x22fb ,"HP" ,ALC269_FIXUP_HP_GPIO_MIC1_LED ),SND_PCI_QUIRK (0x103c ,0x2334 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2335 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2336 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2337 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), -SND_PCI_QUIRK (0x103c ,0x221c ,"HP EliteBook 755 G2" ,ALC280_FIXUP_HP_HEADSET_MIC ),SND_PCI_QUIRK (0x103c ,0x802e ,"HP Z240 SFF" ,ALC221_FIXUP_HP_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x103c ,0x802f ,"HP Z240" ,ALC221_FIXUP_HP_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Greg Kroah-Hartman
maintainerPATCH 47/244 ALSA: hda/realtek: Re-order ALC269 Acer quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 433f894ec7fbd3b4bf1f3187b2ddd566078c4aef upstream.
Just re-order the alc269_fixup_tbl[] entries for Acer devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +1 -1
@@ -7786,12 +7786,12 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x0349 ,"Acer AOD260" ,ALC269_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1025 ,0x047c ,"Acer AC700" ,ALC269_FIXUP_ACER_AC700 ),SND_PCI_QUIRK (0x1025 ,0x072d ,"Acer Aspire V5-571G" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ), -SND_PCI_QUIRK (0x1025 ,0x080d ,"Acer Aspire V5-122P" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x0740 ,"Acer AO725" ,ALC271_FIXUP_HP_GATE_MIC_JACK ),SND_PCI_QUIRK (0x1025 ,0x0742 ,"Acer AO756" ,ALC271_FIXUP_HP_GATE_MIC_JACK ),SND_PCI_QUIRK (0x1025 ,0x0762 ,"Acer Aspire E1-472" ,ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),SND_PCI_QUIRK (0x1025 ,0x0775 ,"Acer Aspire E1-572" ,ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),SND_PCI_QUIRK (0x1025 ,0x079b ,"Acer Aspire V5-573G" ,ALC282_FIXUP_ASPIRE_V5_PINS ), +SND_PCI_QUIRK (0x1025 ,0x080d ,"Acer Aspire V5-122P" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x0840 ,"Acer Aspire E1" ,ALC269VB_FIXUP_ASPIRE_E1_COEF ),SND_PCI_QUIRK (0x1025 ,0x101c ,"Acer Veriton N2510G" ,ALC269_FIXUP_LIFEBOOK ), SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
Greg Kroah-Hartman
maintainerPATCH 48/244 ALSA: hda/realtek: Re-order ALC269 Dell quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit aa143ad39a52d968ac69e426d329bb74f270e6ca upstream.
Just re-order the alc269_fixup_tbl[] entries for Dell devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +2 -2
@@ -7844,8 +7844,8 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1028 ,0x0738 ,"Dell Precision 5820" ,ALC269_FIXUP_NO_SHUTUP ),SND_PCI_QUIRK (0x1028 ,0x075c ,"Dell XPS 27 7760" ,ALC298_FIXUP_SPK_VOLUME ),SND_PCI_QUIRK (0x1028 ,0x075d ,"Dell AIO" ,ALC298_FIXUP_SPK_VOLUME ), -SND_PCI_QUIRK (0x1028 ,0x07b0 ,"Dell Precision 7520" ,ALC295_FIXUP_DISABLE_DAC3 ),SND_PCI_QUIRK (0x1028 ,0x0798 ,"Dell Inspiron 17 7000 Gaming" ,ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER ), +SND_PCI_QUIRK (0x1028 ,0x07b0 ,"Dell Precision 7520" ,ALC295_FIXUP_DISABLE_DAC3 ),SND_PCI_QUIRK (0x1028 ,0x080c ,"Dell WYSE" ,ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x084b ,"Dell" ,ALC274_FIXUP_DELL_AIO_LINEOUT_VERB ), SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
@@ -7855,8 +7855,8 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1028 ,0x08ad ,"Dell WYSE AIO" ,ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x08ae ,"Dell WYSE NB" ,ALC225_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x0935 ,"Dell" ,ALC274_FIXUP_DELL_AIO_LINEOUT_VERB ), -SND_PCI_QUIRK (0x1028 ,0x097e ,"Dell Precision" ,ALC289_FIXUP_DUAL_SPK ),SND_PCI_QUIRK (0x1028 ,0x097d ,"Dell Precision" ,ALC289_FIXUP_DUAL_SPK ), +SND_PCI_QUIRK (0x1028 ,0x097e ,"Dell Precision" ,ALC289_FIXUP_DUAL_SPK ),SND_PCI_QUIRK (0x1028 ,0x098d ,"Dell Precision" ,ALC233_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x09bf ,"Dell Precision" ,ALC233_FIXUP_ASUS_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Greg Kroah-Hartman
maintainerPATCH 49/244 ALSA: hda/realtek: Re-order ALC269 ASUS quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 3cd0ed636dd19e7fbe3ebe8de8476e1718d5a8f1 upstream.
Just re-order the alc269_fixup_tbl[] entries for ASUS devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/pci/hda/patch_realtek.c +3 -3
@@ -7944,16 +7944,18 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1043 ,0x10d0 ,"ASUS X540LA/X540LJ" ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x115d ,"Asus 1015E" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x1043 ,0x11c0 ,"ASUS X556UR" ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x1043 ,0x125e ,"ASUS Q524UQK" ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1271 ,"ASUS X430UN" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1290 ,"ASUS X441SA" ,ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x12a0 ,"ASUS X441UV" ,ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE ), -SND_PCI_QUIRK (0x1043 ,0x12f0 ,"ASUS X541UV" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x12e0 ,"ASUS X541SA" ,ALC256_FIXUP_ASUS_MIC ), +SND_PCI_QUIRK (0x1043 ,0x12f0 ,"ASUS X541UV" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x13b0 ,"ASUS Z550SA" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x1427 ,"Asus Zenbook UX31E" ,ALC269VB_FIXUP_ASUS_ZENBOOK ),SND_PCI_QUIRK (0x1043 ,0x1517 ,"Asus Zenbook UX31A" ,ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A ),SND_PCI_QUIRK (0x1043 ,0x16e3 ,"ASUS UX50" ,ALC269_FIXUP_STEREO_DMIC ),SND_PCI_QUIRK (0x1043 ,0x17d1 ,"ASUS UX431FL" ,ALC294_FIXUP_ASUS_DUAL_SPK ), +SND_PCI_QUIRK (0x1043 ,0x1881 ,"ASUS Zephyrus S/M" ,ALC294_FIXUP_ASUS_GX502_PINS ),SND_PCI_QUIRK (0x1043 ,0x18b1 ,"Asus MJ401TA" ,ALC256_FIXUP_ASUS_HEADSET_MIC ),SND_PCI_QUIRK (0x1043 ,0x18f1 ,"Asus FX505DT" ,ALC256_FIXUP_ASUS_HEADSET_MIC ), SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
@@ -7966,13 +7968,11 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1043 ,0x1b13 ,"Asus U41SV" ,ALC269_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1043 ,0x1bbd ,"ASUS Z550MA" ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1c23 ,"Asus X55U" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), -SND_PCI_QUIRK (0x1043 ,0x125e ,"ASUS Q524UQK" ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1ccd ,"ASUS X555UB" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x1d4e ,"ASUS TM420" ,ALC256_FIXUP_ASUS_HPE ),SND_PCI_QUIRK (0x1043 ,0x1e11 ,"ASUS Zephyrus G15" ,ALC289_FIXUP_ASUS_GA502 ),SND_PCI_QUIRK (0x1043 ,0x1e8e ,"ASUS Zephyrus G15" ,ALC289_FIXUP_ASUS_GA401 ),SND_PCI_QUIRK (0x1043 ,0x1f11 ,"ASUS Zephyrus G14" ,ALC289_FIXUP_ASUS_GA401 ), -SND_PCI_QUIRK (0x1043 ,0x1881 ,"ASUS Zephyrus S/M" ,ALC294_FIXUP_ASUS_GX502_PINS ),SND_PCI_QUIRK (0x1043 ,0x3030 ,"ASUS ZN270IE" ,ALC256_FIXUP_ASUS_AIO_GPIO2 ),SND_PCI_QUIRK (0x1043 ,0x831a ,"ASUS P901" ,ALC269_FIXUP_STEREO_DMIC ), SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
Greg Kroah-Hartman
maintainerPATCH 50/244 ALSA: hda/realtek: Re-order ALC269 Sony quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit cab561f8d4bc9b196ae20c960aa5da89fd786ab5 upstream.
Just re-order the alc269_fixup_tbl[] entries for Sony devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +2 -2
@@ -7979,12 +7979,12 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1043 ,0x8398 ,"ASUS P1005" ,ALC269_FIXUP_STEREO_DMIC ),SND_PCI_QUIRK (0x1043 ,0x83ce ,"ASUS P1005" ,ALC269_FIXUP_STEREO_DMIC ),SND_PCI_QUIRK (0x1043 ,0x8516 ,"ASUS X101CH" ,ALC269_FIXUP_ASUS_X101 ), -SND_PCI_QUIRK (0x104d ,0x90b5 ,"Sony VAIO Pro 11" ,ALC286_FIXUP_SONY_MIC_NO_PRESENCE ), -SND_PCI_QUIRK (0x104d ,0x90b6 ,"Sony VAIO Pro 13" ,ALC286_FIXUP_SONY_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x104d ,0x9073 ,"Sony VAIO" ,ALC275_FIXUP_SONY_VAIO_GPIO2 ),SND_PCI_QUIRK (0x104d ,0x907b ,"Sony VAIO" ,ALC275_FIXUP_SONY_HWEQ ),SND_PCI_QUIRK (0x104d ,0x9084 ,"Sony VAIO" ,ALC275_FIXUP_SONY_HWEQ ),SND_PCI_QUIRK (0x104d ,0x9099 ,"Sony VAIO S13" ,ALC275_FIXUP_SONY_DISABLE_AAMIX ), +SND_PCI_QUIRK (0x104d ,0x90b5 ,"Sony VAIO Pro 11" ,ALC286_FIXUP_SONY_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x104d ,0x90b6 ,"Sony VAIO Pro 13" ,ALC286_FIXUP_SONY_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x10cf ,0x1475 ,"Lifebook" ,ALC269_FIXUP_LIFEBOOK ),SND_PCI_QUIRK (0x10cf ,0x159f ,"Lifebook E780" ,ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT ), SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Greg Kroah-Hartman
maintainerPATCH 51/244 ALSA: hda/realtek: Re-order ALC269 Lenovo quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit f552ff54c2a700616a02b038e4bf3cbf859f65b7 upstream.
Just re-order the alc269_fixup_tbl[] entries for Lenovo devices for avoiding the oversight of the duplicated or unapplied item in future. No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +2 -2
@@ -8059,9 +8059,9 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x21b8 ,"Thinkpad Edge 14" ,ALC269_FIXUP_SKU_IGNORE ),SND_PCI_QUIRK (0x17aa ,0x21ca ,"Thinkpad L412" ,ALC269_FIXUP_SKU_IGNORE ),SND_PCI_QUIRK (0x17aa ,0x21e9 ,"Thinkpad Edge 15" ,ALC269_FIXUP_SKU_IGNORE ), +SND_PCI_QUIRK (0x17aa ,0x21f3 ,"Thinkpad T430" ,ALC269_FIXUP_LENOVO_DOCK ),SND_PCI_QUIRK (0x17aa ,0x21f6 ,"Thinkpad T530" ,ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST ),SND_PCI_QUIRK (0x17aa ,0x21fa ,"Thinkpad X230" ,ALC269_FIXUP_LENOVO_DOCK ), -SND_PCI_QUIRK (0x17aa ,0x21f3 ,"Thinkpad T430" ,ALC269_FIXUP_LENOVO_DOCK ),SND_PCI_QUIRK (0x17aa ,0x21fb ,"Thinkpad T430s" ,ALC269_FIXUP_LENOVO_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2203 ,"Thinkpad X230 Tablet" ,ALC269_FIXUP_LENOVO_DOCK ), SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
@@ -8105,6 +8105,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x3902 ,"Lenovo E50-80" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ),SND_PCI_QUIRK (0x17aa ,0x3977 ,"IdeaPad S210" ,ALC283_FIXUP_INT_MIC ),SND_PCI_QUIRK (0x17aa ,0x3978 ,"Lenovo B50-70" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ), +SND_PCI_QUIRK (0x17aa ,0x3bf8 ,"Quanta FL1" ,ALC269_FIXUP_PCM_44K ),SND_PCI_QUIRK (0x17aa ,0x5013 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x17aa ,0x501a ,"Thinkpad" ,ALC283_FIXUP_INT_MIC ), SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
@@ -8123,7 +8124,6 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x5109 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x17aa ,0x511e ,"Thinkpad" ,ALC298_FIXUP_TPT470_DOCK ),SND_PCI_QUIRK (0x17aa ,0x511f ,"Thinkpad" ,ALC298_FIXUP_TPT470_DOCK ), -SND_PCI_QUIRK (0x17aa ,0x3bf8 ,"Quanta FL1" ,ALC269_FIXUP_PCM_44K ),SND_PCI_QUIRK (0x17aa ,0x9e54 ,"LENOVO NB" ,ALC269_FIXUP_LENOVO_EAPD ),SND_PCI_QUIRK (0x19e5 ,0x3204 ,"Huawei MACH-WX9" ,ALC256_FIXUP_HUAWEI_MACH_WX9_PINS ), SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
Greg Kroah-Hartman
maintainerPATCH 52/244 ALSA: hda/realtek: Re-order remaining ALC269 quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit c656f747df151a0a89756a5312f4ca2116758ba4 upstream.
Just re-order the alc269_fixup_tbl[] entries for FSC, Medion, Samsung and Lemote devices for avoiding the oversight of the duplicated or unapplied item in future.
No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
sound/pci/hda/patch_realtek.c +5 -5
@@ -7988,10 +7988,11 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x10cf ,0x1475 ,"Lifebook" ,ALC269_FIXUP_LIFEBOOK ),SND_PCI_QUIRK (0x10cf ,0x159f ,"Lifebook E780" ,ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT ),SND_PCI_QUIRK (0x10cf ,0x15dc ,"Lifebook T731" ,ALC269_FIXUP_LIFEBOOK_HP_PIN ), -SND_PCI_QUIRK (0x10cf ,0x1757 ,"Lifebook E752" ,ALC269_FIXUP_LIFEBOOK_HP_PIN ),SND_PCI_QUIRK (0x10cf ,0x1629 ,"Lifebook U7x7" , ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC), +SND_PCI_QUIRK (0x10cf ,0x1757 ,"Lifebook E752" ,ALC269_FIXUP_LIFEBOOK_HP_PIN ),SND_PCI_QUIRK (0x10cf ,0x1845 ,"Lifebook U904" ,ALC269_FIXUP_LIFEBOOK_EXTMIC ),SND_PCI_QUIRK (0x10ec ,0x10f2 ,"Intel Reference board" ,ALC700_FIXUP_INTEL_REFERENCE ), +SND_PCI_QUIRK (0x10ec ,0x118c ,"Medion EE4254 MD62100" ,ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE ),SND_PCI_QUIRK (0x10ec ,0x1230 ,"Intel Reference board" ,ALC295_FIXUP_CHROME_BOOK ),SND_PCI_QUIRK (0x10ec ,0x1252 ,"Intel Reference board" ,ALC295_FIXUP_CHROME_BOOK ), SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
@@ -8001,9 +8002,9 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x144d ,0xc176 ,"Samsung Notebook 9 Pro (NP930MBE-K04US)" ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ),SND_PCI_QUIRK (0x144d ,0xc189 ,"Samsung Galaxy Flex Book (NT950QCG-X716)" ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ),SND_PCI_QUIRK (0x144d ,0xc18a ,"Samsung Galaxy Book Ion (NP930XCJ-K01US)" ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ), -SND_PCI_QUIRK (0x144d ,0xc830 ,"Samsung Galaxy Book Ion (NT950XCJ-X716A)" ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ),SND_PCI_QUIRK (0x144d ,0xc740 ,"Samsung Ativ book 8 (NP870Z5G)" ,ALC269_FIXUP_ATIV_BOOK_8 ),SND_PCI_QUIRK (0x144d ,0xc812 ,"Samsung Notebook Pen S (NT950SBE-X58)" ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ), +SND_PCI_QUIRK (0x144d ,0xc830 ,"Samsung Galaxy Book Ion (NT950XCJ-X716A)" ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ),SND_PCI_QUIRK (0x1458 ,0xfa53 ,"Gigabyte BXBT-2807" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x1462 ,0xb120 ,"MSI Cubi MS-B120" ,ALC283_FIXUP_HEADSET_MIC ), SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
@@ -8130,13 +8131,12 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1b35 ,0x1236 ,"CZC TMI" ,ALC269_FIXUP_CZC_TMI ),SND_PCI_QUIRK (0x1b35 ,0x1237 ,"CZC L101" ,ALC269_FIXUP_CZC_L101 ),SND_PCI_QUIRK (0x1b7d ,0xa831 ,"Ordissimo EVE2 " ,ALC269VB_FIXUP_ORDISSIMO_EVE2 ),/* Also known as Malata PC-B1303 */ +SND_PCI_QUIRK (0x1c06 ,0x2013 ,"Lemote A1802" ,ALC269_FIXUP_LEMOTE_A1802 ), +SND_PCI_QUIRK (0x1c06 ,0x2015 ,"Lemote A190X" ,ALC269_FIXUP_LEMOTE_A190X ),SND_PCI_QUIRK (0x1d72 ,0x1602 ,"RedmiBook" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ),SND_PCI_QUIRK (0x1d72 ,0x1701 ,"XiaomiNotebook Pro" ,ALC298_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1d72 ,0x1901 ,"RedmiBook 14" ,ALC256_FIXUP_ASUS_HEADSET_MIC ),SND_PCI_QUIRK (0x1d72 ,0x1947 ,"RedmiBook Air" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ), -SND_PCI_QUIRK (0x10ec ,0x118c ,"Medion EE4254 MD62100" ,ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE ), -SND_PCI_QUIRK (0x1c06 ,0x2013 ,"Lemote A1802" ,ALC269_FIXUP_LEMOTE_A1802 ), -SND_PCI_QUIRK (0x1c06 ,0x2015 ,"Lemote A190X" ,ALC269_FIXUP_LEMOTE_A190X ),SND_PCI_QUIRK (0x8086 ,0x2074 ,"Intel NUC 8" ,ALC233_FIXUP_INTEL_NUC8_DMIC ),SND_PCI_QUIRK (0x8086 ,0x2080 ,"Intel NUC 8 Rugged" ,ALC256_FIXUP_INTEL_NUC8_RUGGED ), SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
Greg Kroah-Hartman
maintainerPATCH 53/244 ALSA: hda/realtek: Re-order ALC662 quirk table entries
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 9edeb1109d05953b2f0e24e5b2341a98c3fa78d5 upstream.
Just re-order the alc662_fixup_tbl[] entries for Acer and ASUS devices for avoiding the oversight of the duplicated or unapplied item in future.
No functional changes.
Also Cc-to-stable for the further patch applications.
--- sound/pci/hda/patch_realtek.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +2 -2
@@ -9880,6 +9880,7 @@ static const struct snd_pci_quirk alc662SND_PCI_QUIRK (0x1025 ,0x0349 ,"eMachines eM250" ,ALC662_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1025 ,0x034a ,"Gateway LT27" ,ALC662_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1025 ,0x038b ,"Acer Aspire 8943G" ,ALC662_FIXUP_ASPIRE ), +SND_PCI_QUIRK (0x1025 ,0x0566 ,"Acer Aspire Ethos 8951G" ,ALC669_FIXUP_ACER_ASPIRE_ETHOS ),SND_PCI_QUIRK (0x1025 ,0x123c ,"Acer Nitro N50-600" ,ALC662_FIXUP_ACER_NITRO_HEADSET_MODE ),SND_PCI_QUIRK (0x1025 ,0x124e ,"Acer 2660G" ,ALC662_FIXUP_ACER_X2660G_HEADSET_MODE ), SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
@@ -9896,9 +9897,9 @@ static const struct snd_pci_quirk alc662SND_PCI_QUIRK (0x103c ,0x873e ,"HP" ,ALC671_FIXUP_HP_HEADSET_MIC2 ),SND_PCI_QUIRK (0x1043 ,0x1080 ,"Asus UX501VW" ,ALC668_FIXUP_HEADSET_MODE ),SND_PCI_QUIRK (0x1043 ,0x11cd ,"Asus N550" , ALC662_FIXUP_ASUS_Nx50), -SND_PCI_QUIRK (0x1043 ,0x13df ,"Asus N550JX" ,ALC662_FIXUP_BASS_1A ),SND_PCI_QUIRK (0x1043 ,0x129d ,"Asus N750" , ALC662_FIXUP_ASUS_Nx50),SND_PCI_QUIRK (0x1043 ,0x12ff ,"ASUS G751" ,ALC668_FIXUP_ASUS_G751 ), +SND_PCI_QUIRK (0x1043 ,0x13df ,"Asus N550JX" ,ALC662_FIXUP_BASS_1A ),SND_PCI_QUIRK (0x1043 ,0x1477 ,"ASUS N56VZ" ,ALC662_FIXUP_BASS_MODE4_CHMAP ),SND_PCI_QUIRK (0x1043 ,0x15a7 ,"ASUS UX51VZH" ,ALC662_FIXUP_BASS_16 ), SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
@@ -9918,7 +9919,6 @@ static const struct snd_pci_quirk alc662SND_PCI_QUIRK (0x1b0a ,0x01b8 ,"ACER Veriton" ,ALC662_FIXUP_ACER_VERITON ),SND_PCI_QUIRK (0x1b35 ,0x1234 ,"CZC ET26" ,ALC662_FIXUP_CZC_ET26 ),SND_PCI_QUIRK (0x1b35 ,0x2206 ,"CZC P10T" ,ALC662_FIXUP_CZC_P10T ), -SND_PCI_QUIRK (0x1025 ,0x0566 ,"Acer Aspire Ethos 8951G" ,ALC669_FIXUP_ACER_ASPIRE_ETHOS ), #if 0/* Below is a quirk table taken from the old code.
Greg Kroah-Hartman
maintainerPATCH 54/244 ALSA: hda/realtek: Remove redundant entry for ALC861 Haier/Uniwill devices
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit defce244b01ee12534910a4544e11be5eb927d25 upstream.
The quirk entry for Uniwill ECS M31EI is with the PCI SSID device 0, which means matching with all. That is, it's essentially equivalent with SND_PCI_QUIRK_VENDOR(0x1584), which also matches with the previous entry for Haier W18 applying the very same quirk.
Let's unify them with the single vendor-quirk entry.
--- sound/pci/hda/patch_realtek.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +1 -2
@@ -9084,8 +9084,7 @@ static const struct snd_pci_quirk alc861SND_PCI_QUIRK (0x1043 ,0x1393 ,"ASUS A6Rp" ,ALC861_FIXUP_ASUS_A6RP ),SND_PCI_QUIRK_VENDOR (0x1043 ,"ASUS laptop" ,ALC861_FIXUP_AMP_VREF_0F ),SND_PCI_QUIRK (0x1462 ,0x7254 ,"HP DX2200" ,ALC861_FIXUP_NO_JACK_DETECT ), -SND_PCI_QUIRK (0x1584 ,0x2b01 ,"Haier W18" ,ALC861_FIXUP_AMP_VREF_0F ), -SND_PCI_QUIRK (0x1584 ,0x0000 ,"Uniwill ECS M31EI" ,ALC861_FIXUP_AMP_VREF_0F ), +SND_PCI_QUIRK_VENDOR (0x1584 ,"Haier/Uniwill" ,ALC861_FIXUP_AMP_VREF_0F ), SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505), {} };
Greg Kroah-Hartman
maintainerPATCH 55/244 ALSA: hda/realtek: ALC285 Thinkpad jack pin quirk is unreachable
In reply to Greg Kroah-HartmanFrom: Sami Loone <[email protected]>
commit 266fd994b2b0ab7ba3e5541868838ce30775964b upstream.
In 9bbb94e57df1 ("ALSA: hda/realtek: fix static noise on ALC285 Lenovo laptops") an existing Lenovo quirk was made more generic by removing a 0x12 pin requirement from the entry. This made the second chance table Thinkpad jack entry unreachable as the pin configurations became identical.
Revert the 0x12 pin requirement removal and move Thinkpad jack pin quirk back to the primary pin table as they can co-exist when more specific configurations come first.
Add a more targeted pin quirk for Lenovo devices that have 0x12 as 0x40000000.
Tested on Yoga 6 (AMD) laptop.
[ Corrected the commit ID -- tiwai ]
--- sound/pci/hda/patch_realtek.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
sound/pci/hda/patch_realtek.c +10 -4
@@ -8598,6 +8598,16 @@ static const struct snd_hda_pin_quirk al {0x19, 0x03a11020}, {0x21, 0x0321101f}),SND_HDA_PIN_QUIRK (0x10ec0285 ,0x17aa ,"Lenovo" ,ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE , + {0x12, 0x90a60130}, + {0x14, 0x90170110}, + {0x19, 0x04a11040}, + {0x21, 0x04211020}), +SND_HDA_PIN_QUIRK (0x10ec0285 ,0x17aa ,"Lenovo" ,ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE , + {0x14, 0x90170110}, + {0x19, 0x04a11040}, + {0x1d, 0x40600001}, + {0x21, 0x04211020}), +SND_HDA_PIN_QUIRK (0x10ec0285 ,0x17aa ,"Lenovo" ,ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK , {0x14, 0x90170110}, {0x19, 0x04a11040}, {0x21, 0x04211020}),
@@ -8765,10 +8775,6 @@ static const struct snd_hda_pin_quirk al SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, {0x19, 0x40000000}, {0x1a, 0x40000000}), -SND_HDA_PIN_QUIRK (0x10ec0285 ,0x17aa ,"Lenovo" ,ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK , - {0x14, 0x90170110}, - {0x19, 0x04a11040}, - {0x21, 0x04211020}), {} };
Greg Kroah-Hartman
maintainerPATCH 56/244 KVM: s390: split kvm_s390_logical_to_effective
In reply to Greg Kroah-HartmanFrom: Claudio Imbrenda <[email protected]>
commit f85f1baaa18932a041fd2b1c2ca6cfd9898c7d2b upstream.
Split kvm_s390_logical_to_effective to a generic function called _kvm_s390_logical_to_effective. The new function takes a PSW and an address and returns the address with the appropriate bits masked off. The old function now calls the new function with the appropriate PSW from the vCPU.
This is needed to avoid code duplication for vSIE.
--- arch/s390/kvm/gaccess.h | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-)
arch/s390/kvm/gaccess.h +24 -7
@@ -37,6 +37,29 @@ static inline unsigned long kvm_s390_rea }/** +* _kvm_s390_logical_to_effective - convert guest logical to effective address +* @psw: psw of the guest +* @ga: guest logical address +* +* Convert a guest logical address to an effective address by applying the +* rules of the addressing mode defined by bits 31 and 32 of the given PSW +* (extendended/basic addressing mode). +* +* Depending on the addressing mode, the upper 40 bits (24 bit addressing +* mode), 33 bits (31 bit addressing mode) or no bits (64 bit addressing +* mode) of @ga will be zeroed and the remaining bits will be returned. +*/ +static inline unsigned long _kvm_s390_logical_to_effective (psw_t *psw, +unsigned long ga) +{ +if (psw_bits (*psw).eaba ==PSW_BITS_AMODE_64BIT ) +return ga; +if (psw_bits (*psw).eaba ==PSW_BITS_AMODE_31BIT ) +return ga & ((1UL <<31 ) -1 ); +return ga & ((1UL <<24 ) -1 ); +} + +/** * kvm_s390_logical_to_effective - convert guest logical to effective address * @vcpu: guest virtual cpu * @ga: guest logical address
@@ -52,13 +75,7 @@ static inline unsigned long kvm_s390_reastatic inline unsigned long kvm_s390_logical_to_effective (struct kvm_vcpu *vcpu,unsigned long ga) { -psw_t *psw = &vcpu->arch.sie_block->gpsw; - -if (psw_bits (*psw).eaba ==PSW_BITS_AMODE_64BIT ) -return ga; -if (psw_bits (*psw).eaba ==PSW_BITS_AMODE_31BIT ) -return ga & ((1UL <<31 ) -1 ); -return ga & ((1UL <<24 ) -1 ); +return _kvm_s390_logical_to_effective (&vcpu->arch.sie_block->gpsw, ga); }/*
Greg Kroah-Hartman
maintainerPATCH 57/244 KVM: s390: fix guarded storage control register handling
In reply to Greg Kroah-HartmanFrom: Heiko Carstens <[email protected]>
commit 44bada28219031f9e8e86b84460606efa57b871e upstream.
store_regs_fmt2() has an ordering problem: first the guarded storage facility is enabled on the local cpu, then preemption disabled, and then the STGSC (store guarded storage controls) instruction is executed.
If the process gets scheduled away between enabling the guarded storage facility and before preemption is disabled, this might lead to a special operation exception and therefore kernel crash as soon as the process is scheduled back and the STGSC instruction is executed.
--- arch/s390/kvm/kvm-s390.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/s390/kvm/kvm-s390.c +2 -2
@@ -3980,16 +3980,16 @@ static void store_regs(struct kvm_vcpu * current->thread.fpu.fpc = vcpu->arch.host_fpregs.fpc; current->thread.fpu.regs = vcpu->arch.host_fpregs.regs;if (MACHINE_HAS_GS ) { +preempt_disable ();__ctl_set_bit (2 ,4 );if (vcpu->arch.gs_enabled)save_gs_cb (current->thread.gs_cb); -preempt_disable (); current->thread.gs_cb = vcpu->arch.host_gscb;restore_gs_cb (vcpu->arch.host_gscb); -preempt_enable ();if (!vcpu->arch.host_gscb)__ctl_clear_bit (2 ,4 ); vcpu->arch.host_gscb =NULL ; +preempt_enable (); }/* SIE will save etoken directly into SDNX and therefore kvm_run */ }
Greg Kroah-Hartman
maintainerPATCH 58/244 s390: fix detection of vector enhancements facility 1 vs. vector packed decimal facility
In reply to Greg Kroah-HartmanFrom: David Hildenbrand <[email protected]>
commit b208108638c4bd3215792415944467c36f5dfd97 upstream.
The PoP documents:
134: The vector packed decimal facility is installed in the
z/Architecture architectural mode. When bit 134 is one, bit 129 is also one.
135: The vector enhancements facility 1 is installed in
the z/Architecture architectural mode. When bit 135 is one, bit 129 is also one.
Looks like we confuse the vector enhancements facility 1 ("EXT") with the Vector packed decimal facility ("BCD"). Let's fix the facility checks.
Detected while working on QEMU/tcg z14 support and only unlocking the vector enhancements facility 1, but not the vector packed decimal facility.
--- arch/s390/kernel/setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/s390/kernel/setup.c +2 -2
@@ -922,9 +922,9 @@ static int __init setup_hwcaps(void)if (MACHINE_HAS_VX ) { elf_hwcap |=HWCAP_S390_VXRS ;if (test_facility (134 )) - elf_hwcap |=HWCAP_S390_VXRS_EXT ; -if (test_facility (135 )) elf_hwcap |=HWCAP_S390_VXRS_BCD ; +if (test_facility (135 )) + elf_hwcap |=HWCAP_S390_VXRS_EXT ;if (test_facility (148 )) elf_hwcap |=HWCAP_S390_VXRS_EXT2 ;if (test_facility (152 ))
Greg Kroah-Hartman
maintainerPATCH 59/244 KVM: s390: split kvm_s390_real_to_abs
In reply to Greg Kroah-HartmanFrom: Claudio Imbrenda <[email protected]>
commit c5d1f6b531e68888cbe6718b3f77a60115d58b9c upstream.
A new function _kvm_s390_real_to_abs will apply prefixing to a real address with a given prefix value.
The old kvm_s390_real_to_abs becomes now a wrapper around the new function.
This is needed to avoid code duplication in vSIE.
--- arch/s390/kvm/gaccess.h | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)
arch/s390/kvm/gaccess.h +17 -6
@@ -18,17 +18,14 @@/** * kvm_s390_real_to_abs - convert guest real address to guest absolute address -* @vcpu - guest virtual cpu +* @prefix - guest prefix * @gra - guest real address * * Returns the guest absolute address that corresponds to the passed guest real -* address @gra of a virtual guest cpu by applying its prefix. +* address @gra of by applying the given prefix. */ -static inline unsigned long kvm_s390_real_to_abs (struct kvm_vcpu *vcpu, -unsigned long gra) +static inline unsigned long _kvm_s390_real_to_abs (u32 prefix,unsigned long gra) { -unsigned long prefix =kvm_s390_get_prefix (vcpu); -if (gra <2 *PAGE_SIZE ) gra += prefix;else if (gra >= prefix && gra < prefix +2 *PAGE_SIZE )
@@ -37,6 +34,20 @@ static inline unsigned long kvm_s390_rea }/** +* kvm_s390_real_to_abs - convert guest real address to guest absolute address +* @vcpu - guest virtual cpu +* @gra - guest real address +* +* Returns the guest absolute address that corresponds to the passed guest real +* address @gra of a virtual guest cpu by applying its prefix. +*/ +static inline unsigned long kvm_s390_real_to_abs (struct kvm_vcpu *vcpu, +unsigned long gra) +{ +return _kvm_s390_real_to_abs (kvm_s390_get_prefix (vcpu), gra); +} + +/** * _kvm_s390_logical_to_effective - convert guest logical to effective address * @psw: psw of the guest * @ga: guest logical address
Greg Kroah-Hartman
maintainerPATCH 60/244 KVM: nVMX: Truncate bits 63:32 of VMCS field on nested check in !64-bit
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit ee050a577523dfd5fac95e6cc182ebe0293ead59 upstream.
Drop bits 63:32 of the VMCS field encoding when checking for a nested VM-Exit on VMREAD/VMWRITE in !64-bit mode. VMREAD and VMWRITE always use 32-bit operands outside of 64-bit mode.
The actual emulation of VMREAD/VMWRITE does the right thing, this bug is purely limited to incorrectly causing a nested VM-Exit if a GPR happens to have bits 63:32 set outside of 64-bit mode.
Message-Id: <[email protected]>
--- arch/x86/kvm/vmx/nested.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/vmx/nested.c +1 -1
@@ -5308,7 +5308,7 @@ static bool nested_vmx_exit_handled_vmcs/* Decode instruction info and find the field to access */ vmx_instruction_info =vmcs_read32 (VMX_INSTRUCTION_INFO ); - field =kvm_register_read (vcpu, (((vmx_instruction_info) >>28 ) &0xf )); + field =kvm_register_readl (vcpu, (((vmx_instruction_info) >>28 ) &0xf ));/* Out-of-range fields always cause a VM exit from L2 to L1 */ if (field >>15 )
Greg Kroah-Hartman
maintainerPATCH 61/244 KVM: Stop looking for coalesced MMIO zones if the bus is destroyed
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 5d3c4c79384af06e3c8e25b7770b6247496b4417 upstream.
Abort the walk of coalesced MMIO zones if kvm_io_bus_unregister_dev() fails to allocate memory for the new instance of the bus. If it can't instantiate a new bus, unregister_dev() destroys all devices _except_ the
target device. But, it doesn't tell the caller that it obliterated the
bus and invoked the destructor for all devices that were on the bus. In the coalesced MMIO case, this can result in a deleted list entry dereference due to attempting to continue iterating on coalesced_zones after future entries (in the walk) have been deleted.
Opportunistically add curly braces to the for-loop, which encompasses many lines but sneaks by without braces due to the guts being a single if statement.
Message-Id: <[email protected]>
--- include/linux/kvm_host.h | 4 ++-- virt/kvm/coalesced_mmio.c | 19 +++++++++++++++++-- virt/kvm/kvm_main.c | 10 +++++----- 3 files changed, 24 insertions(+), 9 deletions(-)
include/linux/kvm_host.h +2 -2
@@ -192,8 +192,8 @@ int kvm_io_bus_read(struct kvm_vcpu *vcp int len, void *val);int kvm_io_bus_register_dev (struct kvm *kvm,enum kvm_bus bus_idx,gpa_t addr,int len,struct kvm_io_device *dev); -void kvm_io_bus_unregister_dev (struct kvm *kvm,enum kvm_bus bus_idx, -struct kvm_io_device *dev); +int kvm_io_bus_unregister_dev (struct kvm *kvm,enum kvm_bus bus_idx, +struct kvm_io_device *dev);struct kvm_io_device *kvm_io_bus_get_dev (struct kvm *kvm,enum kvm_bus bus_idx,gpa_t addr);
virt/kvm/coalesced_mmio.c +17 -2
@@ -178,21 +178,36 @@ int kvm_vm_ioctl_unregister_coalesced_mm struct kvm_coalesced_mmio_zone *zone) {struct kvm_coalesced_mmio_dev *dev, *tmp; +int r;if (zone->pio !=1 && zone->pio !=0 )return -EINVAL ;mutex_lock (&kvm->slots_lock); -list_for_each_entry_safe (dev, tmp, &kvm->coalesced_zones, list) +list_for_each_entry_safe (dev, tmp, &kvm->coalesced_zones, list) {if (zone->pio == dev->zone.pio &&coalesced_mmio_in_range (dev, zone->addr, zone->size)) { -kvm_io_bus_unregister_dev (kvm, + r =kvm_io_bus_unregister_dev (kvm, zone->pio ?KVM_PIO_BUS :KVM_MMIO_BUS , &dev->dev);kvm_iodevice_destructor (&dev->dev); + +/* +* On failure, unregister destroys all devices on the +* bus _except_ the target device, i.e. coalesced_zones +* has been modified. No need to restart the walk as +* there aren't any zones left. +*/ +if (r) +break ; } + }mutex_unlock (&kvm->slots_lock); +/* +* Ignore the result of kvm_io_bus_unregister_dev(), from userspace's +* perspective, the coalesced MMIO is most definitely unregistered. +*/ return 0 ; }
virt/kvm/kvm_main.c +5 -5
@@ -4017,15 +4017,15 @@ int kvm_io_bus_register_dev(struct kvm * }/* Caller must hold slots_lock. */ -void kvm_io_bus_unregister_dev (struct kvm *kvm,enum kvm_bus bus_idx, -struct kvm_io_device *dev) +int kvm_io_bus_unregister_dev (struct kvm *kvm,enum kvm_bus bus_idx, +struct kvm_io_device *dev) {int i, j;struct kvm_io_bus *new_bus, *bus; bus =kvm_get_bus (kvm, bus_idx);if (!bus) -return ; +return 0 ;for (i =0 ; i < bus->dev_count; i++)if (bus->range[i].dev == dev) {
@@ -4033,7 +4033,7 @@ void kvm_io_bus_unregister_dev(struct kv }if (i == bus->dev_count) -return ; +return 0 ; new_bus =kmalloc (struct_size (bus, range, bus->dev_count -1 ),GFP_KERNEL_ACCOUNT );
@@ -4054,7 +4054,7 @@ void kvm_io_bus_unregister_dev(struct kvrcu_assign_pointer (kvm->buses[bus_idx], new_bus);synchronize_srcu_expedited (&kvm->srcu);kfree (bus); -return ; +return new_bus ?0 : -ENOMEM ; } struct kvm_io_device *kvm_io_bus_get_dev(struct kvm *kvm, enum kvm_bus bus_idx,
Greg Kroah-Hartman
maintainerPATCH 62/244 Revert "i3c master: fix missing destroy_workqueue() on error in i3c_master_register"
In reply to Greg Kroah-HartmanFrom: Jae Hyun Yoo <[email protected]>
commit 0d95f41ebde40d552bb4fea64b1d618607915fd6 upstream.
Adding the destroy_workqueue call in i3c_master_register introduced below kernel warning because it makes duplicate destroy_workqueue calls when i3c_master_register fails after allocating the workqueue. The workqueue will be destroyed by i3c_masterdev_release which is called by put_device at the end of the i3c_master_register function eventually in failure cases so the workqueue doesn't need to be destroyed in i3c_master_register.
[ 6.972952] WARNING: CPU: 1 PID: 1 at lib/list_debug.c:48 __list_del_entry_valid+0x9c/0xf4 [ 6.982205] list_del corruption, 8fe03c08->prev is LIST_POISON2 (00000122) [ 6.989910] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W 5.10.23-c12838a-dirty-31dc772 #1 [ 7.000295] Hardware name: Generic DT based system [ 7.005638] Backtrace: [ 7.008369] [<809133f0>] (dump_backtrace) from [<80913644>] (show_stack+0x20/0x24) [ 7.016819] r7:00000030 r6:60000013 r5:00000000 r4:813b5d40 [ 7.023137] [<80913624>] (show_stack) from [<8091e1a0>] (dump_stack+0x9c/0xb0) [ 7.031201] [<8091e104>] (dump_stack) from [<8011fa30>] (__warn+0xf8/0x154) [ 7.038972] r7:00000030 r6:00000009 r5:804fa1c8 r4:80b6eca4 [ 7.045289] [<8011f938>] (__warn) from [<80913d14>] (warn_slowpath_fmt+0x8c/0xc0) [ 7.053641] r7:00000030 r6:80b6eca4 r5:80b6ed74 r4:818cc000 [ 7.059960] [<80913c8c>] (warn_slowpath_fmt) from [<804fa1c8>] (__list_del_entry_valid+0x9c/0xf4) [ 7.069866] r9:96becf8c r8:818cc000 r7:8fe03c10 r6:8fe03c00 r5:8fe03ba0 r4:ff7ead4c [ 7.078513] [<804fa12c>] (__list_del_entry_valid) from [<8013f0b4>] (destroy_workqueue+0x1c4/0x23c) [ 7.088615] [<8013eef0>] (destroy_workqueue) from [<806aa124>] (i3c_masterdev_release+0x40/0xb0) [ 7.098421] r7:00000000 r6:81a43b80 r5:8fe65360 r4:8fe65048 [ 7.104740] [<806aa0e4>] (i3c_masterdev_release) from [<805f3f04>] (device_release+0x40/0xb0) [ 7.114254] r5:00000000 r4:8fe65048 [ 7.118245] [<805f3ec4>] (device_release) from [<808fe754>] (kobject_put+0xc8/0x204) [ 7.126885] r5:813978dc r4:8fe65048 [ 7.130877] [<808fe68c>] (kobject_put) from [<805f5fbc>] (put_device+0x20/0x24) [ 7.139037] r7:8fe65358 r6:8fe65368 r5:8fe65358 r4:8fe65048 [ 7.145355] [<805f5f9c>] (put_device) from [<806abac4>] (i3c_master_register+0x338/0xb00) [ 7.154487] [<806ab78c>] (i3c_master_register) from [<806ae084>] (dw_i3c_probe+0x224/0x24c) [ 7.163811] r10:00000000 r9:8fe7a100 r8:00000032 r7:819fa810 r6:819fa800 r5:8fe65040 [ 7.172547] r4:00000000 [ 7.175376] [<806ade60>] (dw_i3c_probe) from [<805fdc14>] (platform_drv_probe+0x44/0x80) [ 7.184409] r9:813a25c0 r8:00000000 r7:815ec114 r6:00000000 r5:813a25c0 r4:819fa810 [ 7.193053] [<805fdbd0>] (platform_drv_probe) from [<805fb83c>] (really_probe+0x108/0x50c) [ 7.202275] r5:815ec004 r4:819fa810 [ 7.206265] [<805fb734>] (really_probe) from [<805fc180>] (driver_probe_device+0xb4/0x190) [ 7.215492] r10:813dc000 r9:80c4385c r8:000000d9 r7:813a25c0 r6:819fa810 r5:00000000 [ 7.224228] r4:813a25c0 [ 7.227055] [<805fc0cc>] (driver_probe_device) from [<805fc5cc>] (device_driver_attach+0xb8/0xc0) [ 7.236959] r9:80c4385c r8:000000d9 r7:813a25c0 r6:819fa854 r4:819fa810 [ 7.244439] [<805fc514>] (device_driver_attach) from [<805fc65c>] (__driver_attach+0x88/0x16c) [ 7.254051] r7:00000000 r6:819fa810 r5:00000000 r4:813a25c0 [ 7.260369] [<805fc5d4>] (__driver_attach) from [<805f954c>] (bus_for_each_dev+0x88/0xc8) [ 7.269489] r7:00000000 r6:818cc000 r5:805fc5d4 r4:813a25c0 [ 7.275806] [<805f94c4>] (bus_for_each_dev) from [<805fc76c>] (driver_attach+0x2c/0x30) [ 7.284739] r7:81397c98 r6:00000000 r5:8fe7db80 r4:813a25c0 [ 7.291057] [<805fc740>] (driver_attach) from [<805f9eec>] (bus_add_driver+0x120/0x200) [ 7.299984] [<805f9dcc>] (bus_add_driver) from [<805fce44>] (driver_register+0x98/0x128) [ 7.309005] r7:80c4383c r6:00000000 r5:00000000 r4:813a25c0 [ 7.315323] [<805fcdac>] (driver_register) from [<805fedb4>] (__platform_driver_register+0x50/0x58) [ 7.325410] r5:818cc000 r4:81397c98 [ 7.329404] [<805fed64>] (__platform_driver_register) from [<80c23398>] (dw_i3c_driver_init+0x24/0x28) [ 7.339790] r5:818cc000 r4:80c23374 [ 7.343784] [<80c23374>] (dw_i3c_driver_init) from [<80c01300>] (do_one_initcall+0xac/0x1d0) [ 7.353206] [<80c01254>] (do_one_initcall) from [<80c01630>] (kernel_init_freeable+0x1a8/0x204) [ 7.362916] r8:000000d9 r7:80c4383c r6:00000007 r5:819ca2c0 r4:80c67680 [ 7.370398] [<80c01488>] (kernel_init_freeable) from [<8091eb18>] (kernel_init+0x18/0x12c) [ 7.379616] r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:8091eb00 [ 7.388343] r4:00000000 [ 7.391170] [<8091eb00>] (kernel_init) from [<80100148>] (ret_from_fork+0x14/0x2c) [ 7.399607] Exception stack(0x818cdfb0 to 0x818cdff8) [ 7.405243] dfa0: 00000000 00000000 00000000 00000000 [ 7.414371] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 7.423499] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 7.430879] r5:8091eb00 r4:00000000
This reverts commit 59165d16c699182b86b5c65181013f1fd88feb62.
--- drivers/i3c/master.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/i3c/master.c +1 -4
@@ -2492,7 +2492,7 @@ int i3c_master_register(struct i3c_maste ret =i3c_master_bus_init (master);if (ret) - goto err_destroy_wq; + goto err_put_dev; ret =device_add (&master->dev);if (ret)
@@ -2523,9 +2523,6 @@ err_del_dev: err_cleanup_bus:i3c_master_bus_cleanup (master); -err_destroy_wq: -destroy_workqueue (master->wq); - err_put_dev:put_device (&master->dev);
Greg Kroah-Hartman
maintainerPATCH 63/244 ovl: fix missing revert_creds() on error path
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 7b279bbfd2b230c7a210ff8f405799c7e46bbf48 upstream.
Smatch complains about missing that the ovl_override_creds() doesn't have a matching revert_creds() if the dentry is disconnected. Fix this by moving the ovl_override_creds() until after the disconnected check.
--- fs/overlayfs/copy_up.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/overlayfs/copy_up.c +2 -1
@@ -852,7 +852,7 @@ static int ovl_copy_up_one(struct dentryint ovl_copy_up_flags (struct dentry *dentry,int flags) {int err =0 ; -const struct cred *old_cred =ovl_override_creds (dentry->d_sb); +const struct cred *old_cred;bool disconnected = (dentry->d_flags &DCACHE_DISCONNECTED );/*
@@ -863,6 +863,7 @@ int ovl_copy_up_flags(struct dentry *denif (WARN_ON (disconnected &&d_is_dir (dentry)))return -EIO ; + old_cred =ovl_override_creds (dentry->d_sb);while (!err) {struct dentry *next;struct dentry *parent =NULL ;
Greg Kroah-Hartman
maintainerPATCH 64/244 usb: gadget: pch_udc: Revert d3cb25a12138 completely
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
commit 50a318cc9b54a36f00beadf77e578a50f3620477 upstream.
The commit d3cb25a12138 ("usb: gadget: udc: fix spin_lock in pch_udc") obviously was not thought through and had made the situation even worse than it was before. Two changes after almost reverted it. but a few leftovers have been left as it. With this revert d3cb25a12138 completely.
While at it, narrow down the scope of unlocked section to prevent potential race when prot_stall is assigned.
--- drivers/usb/gadget/udc/pch_udc.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/usb/gadget/udc/pch_udc.c +13 -4
@@ -600,18 +600,22 @@ static void pch_udc_reconnect(struct pchstatic inline void pch_udc_vbus_session (struct pch_udc_dev *dev,int is_active) { +unsigned long iflags; + +spin_lock_irqsave (&dev->lock, iflags);if (is_active) {pch_udc_reconnect (dev); dev->vbus_session =1 ; }else {if (dev->driver && dev->driver->disconnect) { -spin_lock (&dev->lock); +spin_unlock_irqrestore (&dev->lock, iflags); dev->driver->disconnect (&dev->gadget); -spin_unlock (&dev->lock); +spin_lock_irqsave (&dev->lock, iflags); }pch_udc_set_disconnect (dev); dev->vbus_session =0 ; } +spin_unlock_irqrestore (&dev->lock, iflags); }/**
@@ -1168,20 +1172,25 @@ static int pch_udc_pcd_selfpowered(strucstatic int pch_udc_pcd_pullup (struct usb_gadget *gadget,int is_on) {struct pch_udc_dev *dev; +unsigned long iflags;if (!gadget)return -EINVAL ; + dev = container_of(gadget, struct pch_udc_dev, gadget); + +spin_lock_irqsave (&dev->lock, iflags);if (is_on) {pch_udc_reconnect (dev); }else {if (dev->driver && dev->driver->disconnect) { -spin_lock (&dev->lock); +spin_unlock_irqrestore (&dev->lock, iflags); dev->driver->disconnect (&dev->gadget); -spin_unlock (&dev->lock); +spin_lock_irqsave (&dev->lock, iflags); }pch_udc_set_disconnect (dev); } +spin_unlock_irqrestore (&dev->lock, iflags);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 65/244 memory: gpmc: fix out of bounds read and dereference on gpmc_cs[]
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit e004c3e67b6459c99285b18366a71af467d869f5 ]
Currently the array gpmc_cs is indexed by cs before it cs is range checked and the pointer read from this out-of-index read is dereferenced. Fix this by performing the range check on cs before the read and the following pointer dereference.
Addresses-Coverity: ("Negative array index read")
--- drivers/memory/omap-gpmc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/memory/omap-gpmc.c +5 -2
@@ -1026,8 +1026,8 @@ EXPORT_SYMBOL(gpmc_cs_request);void gpmc_cs_free (int cs) { -struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; -struct resource *res = &gpmc->mem; +struct gpmc_cs_data *gpmc; +struct resource *res;spin_lock (&gpmc_mem_lock);if (cs >= gpmc_cs_num || cs <0 || !gpmc_cs_reserved (cs)) {
@@ -1036,6 +1036,9 @@ void gpmc_cs_free(int cs)spin_unlock (&gpmc_mem_lock);return ; } + gpmc = &gpmc_cs[cs]; + res = &gpmc->mem; +gpmc_cs_disable_mem (cs);if (res->flags)release_resource (res);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 66/244 ARM: dts: exynos: correct fuel gauge interrupt trigger level on Midas family
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 8a45f33bd36efbb624198cfa9fdf1f66fd1c3d26 ]
The Maxim fuel gauge datasheets describe the interrupt line as active low with a requirement of acknowledge from the CPU. The falling edge interrupt will mostly work but it's not correct.
--- arch/arm/boot/dts/exynos4412-midas.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos4412-midas.dtsi +1 -1
@@ -187,7 +187,7 @@ max77693-fuel-gauge@36 { compatible = "maxim,max17047"; interrupt-parent = <&gpx2>; - interrupts = <3 IRQ_TYPE_EDGE_FALLING>; + interrupts = <3 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&max77693_fuel_irq>; reg = <0x36>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 67/244 ARM: dts: exynos: correct MUIC interrupt trigger level on Midas family
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 15107e443ab8c6cb35eff10438993e4bc944d9ae ]
The Maxim MUIC datasheets describe the interrupt line as active low with a requirement of acknowledge from the CPU. Without specifying the interrupt type in Devicetree, kernel might apply some fixed configuration, not necessarily working for this hardware.
Additionally, the interrupt line is shared so using level sensitive interrupt is here especially important to avoid races.
--- arch/arm/boot/dts/exynos4412-midas.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos4412-midas.dtsi +1 -1
@@ -139,7 +139,7 @@ max77693@66 { compatible = "maxim,max77693"; interrupt-parent = <&gpx1>; - interrupts = <5 IRQ_TYPE_EDGE_FALLING>; + interrupts = <5 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&max77693_irq>; reg = <0x66>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 68/244 ARM: dts: exynos: correct PMIC interrupt trigger level on Midas family
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit e52dcd6e70fab51f53292e53336ecb007bb60889 ]
The Maxim PMIC datasheets describe the interrupt line as active low with a requirement of acknowledge from the CPU. Without specifying the interrupt type in Devicetree, kernel might apply some fixed configuration, not necessarily working for this hardware.
Additionally, the interrupt line is shared so using level sensitive interrupt is here especially important to avoid races.
--- arch/arm/boot/dts/exynos4412-midas.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos4412-midas.dtsi +1 -1
@@ -588,7 +588,7 @@ max77686: max77686_pmic@9 { compatible = "maxim,max77686"; interrupt-parent = <&gpx0>; - interrupts = <7 IRQ_TYPE_NONE>; + interrupts = <7 IRQ_TYPE_LEVEL_LOW>; pinctrl-0 = <&max77686_irq>; pinctrl-names = "default"; reg = <0x09>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 69/244 ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid X/U3 family
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 6503c568e97a52f8b7a3109718db438e52e59485 ]
The Maxim PMIC datasheets describe the interrupt line as active low with a requirement of acknowledge from the CPU. Without specifying the interrupt type in Devicetree, kernel might apply some fixed configuration, not necessarily working for this hardware.
Additionally, the interrupt line is shared so using level sensitive interrupt is here especially important to avoid races.
--- arch/arm/boot/dts/exynos4412-odroid-common.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos4412-odroid-common.dtsi +1 -1
@@ -274,7 +274,7 @@ max77686: pmic@9 { compatible = "maxim,max77686"; interrupt-parent = <&gpx3>; - interrupts = <2 IRQ_TYPE_NONE>; + interrupts = <2 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&max77686_irq>; reg = <0x09>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 70/244 ARM: dts: exynos: correct PMIC interrupt trigger level on SMDK5250
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit f6368c60561370e4a92fac22982a3bd656172170 ]
The Maxim PMIC datasheets describe the interrupt line as active low with a requirement of acknowledge from the CPU. Without specifying the interrupt type in Devicetree, kernel might apply some fixed configuration, not necessarily working for this hardware.
Additionally, the interrupt line is shared so using level sensitive interrupt is here especially important to avoid races.
--- arch/arm/boot/dts/exynos5250-smdk5250.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos5250-smdk5250.dts +1 -1
@@ -133,7 +133,7 @@ compatible = "maxim,max77686"; reg = <0x09>; interrupt-parent = <&gpx3>; - interrupts = <2 IRQ_TYPE_NONE>; + interrupts = <2 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&max77686_irq>; wakeup-source;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 71/244 ARM: dts: exynos: correct PMIC interrupt trigger level on Snow
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 8987efbb17c2522be8615085df9a14da2ab53d34 ]
The Maxim PMIC datasheets describe the interrupt line as active low with a requirement of acknowledge from the CPU. Without specifying the interrupt type in Devicetree, kernel might apply some fixed configuration, not necessarily working for this hardware.
Additionally, the interrupt line is shared so using level sensitive interrupt is here especially important to avoid races.
--- arch/arm/boot/dts/exynos5250-snow-common.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos5250-snow-common.dtsi +1 -1
@@ -292,7 +292,7 @@ max77686: max77686@9 { compatible = "maxim,max77686"; interrupt-parent = <&gpx3>; - interrupts = <2 IRQ_TYPE_NONE>; + interrupts = <2 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&max77686_irq>; wakeup-source;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 72/244 serial: stm32: fix incorrect characters on console
In reply to Greg Kroah-HartmanFrom: Erwan Le Ray <[email protected]>
[ Upstream commit f264c6f6aece81a9f8fbdf912b20bd3feb476a7a ]
Incorrect characters are observed on console during boot. This issue occurs when init/main.c is modifying termios settings to open /dev/console on the rootfs.
This patch adds a waiting loop in set_termios to wait for TX shift register empty (and TX FIFO if any) before stopping serial port.
--- drivers/tty/serial/stm32-usart.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/tty/serial/stm32-usart.c +11 -1
@@ -688,8 +688,9 @@ static void stm32_set_termios(struct uart_port *port, struct ktermios *termios,unsigned int baud, bits;u32 usartdiv, mantissa, fraction, oversampling;tcflag_t cflag = termios->c_cflag; -u32 cr1, cr2, cr3; +u32 cr1, cr2, cr3, isr;unsigned long flags; +int ret;if (!stm32_port->hw_flow_control) cflag &= ~CRTSCTS ;
@@ -698,6 +699,15 @@ static void stm32_set_termios(struct uart_port *port, struct ktermios *termios,spin_lock_irqsave (&port->lock, flags); + ret =readl_relaxed_poll_timeout_atomic (port->membase + ofs->isr, + isr, + (isr &USART_SR_TC ), +10 ,100000 ); + +/* Send the TC error message only when ISR_TC is not set. */ +if (ret) +dev_err (port->dev,"Transmission is not complete\n" ); +/* Stop serial port and reset value */ writel_relaxed (0 , port->membase + ofs->cr1);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 73/244 serial: stm32: fix tx_empty condition
In reply to Greg Kroah-HartmanFrom: Erwan Le Ray <[email protected]>
[ Upstream commit 3db1d52466dc11dca4e47ef12a6e6e97f846af62 ]
In "tx_empty", we should poll TC bit in both DMA and PIO modes (instead of TXE) to check transmission data register has been transmitted independently of the FIFO mode. TC indicates that both transmit register and shift register are empty. When shift register is empty, tx_empty should return TIOCSER_TEMT instead of TC value.
Cleans the USART_CR_TC TCCF register define (transmission complete clear flag) as it is duplicate of USART_ICR_TCCF.
--- drivers/tty/serial/stm32-usart.c | 5 ++++- drivers/tty/serial/stm32-usart.h | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/tty/serial/stm32-usart.c +4 -1
@@ -502,7 +502,10 @@ static unsigned int stm32_tx_empty(struct uart_port *port)struct stm32_port *stm32_port =to_stm32_port (port);struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; -return readl_relaxed (port->membase + ofs->isr) &USART_SR_TXE ; +if (readl_relaxed (port->membase + ofs->isr) &USART_SR_TC ) +return TIOCSER_TEMT ; + +return 0 ; }static void stm32_set_mctrl (struct uart_port *port,unsigned int mctrl)
drivers/tty/serial/stm32-usart.h +0 -3
@@ -127,9 +127,6 @@ struct stm32_usart_info stm32h7_info = {/* Dummy bits */ #define USART_SR_DUMMY_RX BIT(16) -/* USART_ICR (F7) */ -#define USART_CR_TC BIT(6) -/* USART_DR */ #define USART_DR_MASK GENMASK(8, 0)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 74/244 usb: typec: tcpci: Check ROLE_CONTROL while interpreting CC_STATUS
In reply to Greg Kroah-HartmanFrom: Badhri Jagan Sridharan <[email protected]>
[ Upstream commit 19c234a14eafca78e0bc14ffb8be3891096ce147 ]
While interpreting CC_STATUS, ROLE_CONTROL has to be read to make sure that CC1/CC2 is not forced presenting Rp/Rd.
Quoted 1 line
From the TCPCI spec:
4.4.5.2 ROLE_CONTROL (Normative):
The TCPM shall write B6 (DRP) = 0b and B3..0 (CC1/CC2) if it wishes to control the Rp/Rd directly instead of having the TCPC perform DRP toggling autonomously. When controlling Rp/Rd directly, the TCPM writes to B3..0 (CC1/CC2) each time it wishes to change the CC1/CC2 values. This control is used for TCPM-TCPC implementing Source or Sink only as well as when a connection has been detected via DRP toggling but the TCPM wishes to attempt Try.Src or Try.Snk.
Table 4-22. CC_STATUS Register Definition:
If (ROLE_CONTROL.CC1 = Rd) or ConnectResult=1)
00b: SNK.Open (Below maximum vRa)
01b: SNK.Default (Above minimum vRd-Connect)
10b: SNK.Power1.5 (Above minimum vRd-Connect) Detects Rp-1.5A 11b: SNK.Power3.0 (Above minimum vRd-Connect) Detects Rp-3.0A
If (ROLE_CONTROL.CC2=Rd) or (ConnectResult=1)
00b: SNK.Open (Below maximum vRa)
01b: SNK.Default (Above minimum vRd-Connect)
10b: SNK.Power1.5 (Above minimum vRd-Connect) Detects Rp 1.5A 11b: SNK.Power3.0 (Above minimum vRd-Connect) Detects Rp 3.0A
--- drivers/usb/typec/tcpm/tcpci.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
drivers/usb/typec/tcpm/tcpci.c +18 -3
@@ -20,6 +20,15 @@#define PD_RETRY_COUNT 3 +#define tcpc_presenting_cc1_rd (reg) \ + (!(TCPC_ROLE_CTRL_DRP & (reg)) && \ + (((reg) & (TCPC_ROLE_CTRL_CC1_MASK << TCPC_ROLE_CTRL_CC1_SHIFT)) == \ + (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC1_SHIFT))) +#define tcpc_presenting_cc2_rd (reg) \ + (!(TCPC_ROLE_CTRL_DRP & (reg)) && \ + (((reg) & (TCPC_ROLE_CTRL_CC2_MASK << TCPC_ROLE_CTRL_CC2_SHIFT)) == \ + (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC2_SHIFT))) +struct tcpci {struct device *dev;
@@ -168,19 +177,25 @@ static int tcpci_get_cc(struct tcpc_dev *tcpc, enum typec_cc_status *cc1, enum typec_cc_status *cc2) { struct tcpci *tcpci = tcpc_to_tcpci(tcpc); -unsigned int reg; +unsigned int reg, role_control;int ret; + ret =regmap_read (tcpci->regmap,TCPC_ROLE_CTRL , &role_control); +if (ret <0 ) +return ret; + ret =regmap_read (tcpci->regmap,TCPC_CC_STATUS , ®);if (ret <0 )return ret; *cc1 =tcpci_to_typec_cc ((reg >>TCPC_CC_STATUS_CC1_SHIFT ) &TCPC_CC_STATUS_CC1_MASK , - reg &TCPC_CC_STATUS_TERM ); + reg &TCPC_CC_STATUS_TERM || +tcpc_presenting_cc1_rd (role_control)); *cc2 =tcpci_to_typec_cc ((reg >>TCPC_CC_STATUS_CC2_SHIFT ) &TCPC_CC_STATUS_CC2_MASK , - reg &TCPC_CC_STATUS_TERM ); + reg &TCPC_CC_STATUS_TERM || +tcpc_presenting_cc2_rd (role_control));return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 75/244 regmap: set debugfs_name to NULL after it is freed
In reply to Greg Kroah-HartmanFrom: Meng Li <[email protected]>
[ Upstream commit e41a962f82e7afb5b1ee644f48ad0b3aee656268 ]
There is a upstream commit cffa4b2122f5("regmap:debugfs:
Fix a memory leak when calling regmap_attach_dev") that adds a if condition when create name for debugfs_name. With below function invoking logical, debugfs_name is freed in regmap_debugfs_exit(), but it is not created again because of the if condition introduced by above commit. regmap_reinit_cache()
regmap_debugfs_exit() ... regmap_debugfs_init()
So, set debugfs_name to NULL after it is freed.
--- drivers/base/regmap/regmap-debugfs.c | 1 + 1 file changed, 1 insertion(+)
drivers/base/regmap/regmap-debugfs.c +1 -0
@@ -661,6 +661,7 @@ void regmap_debugfs_exit(struct regmap *map)regmap_debugfs_free_dump_cache (map);mutex_unlock (&map->cache_lock);kfree (map->debugfs_name); + map->debugfs_name =NULL ; }else {struct regmap_debugfs_node *node, *tmp;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 76/244 mtd: rawnand: fsmc: Fix error code in fsmc_nand_probe()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit e7a97528e3c787802d8c643d6ab2f428511bb047 ]
If dma_request_channel() fails then the probe fails and it should return a negative error code, but currently it returns success.
--- drivers/mtd/nand/raw/fsmc_nand.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mtd/nand/raw/fsmc_nand.c +2 -0
@@ -1066,11 +1066,13 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) host->read_dma_chan =dma_request_channel (mask, filter,NULL );if (!host->read_dma_chan) {dev_err (&pdev->dev,"Unable to get read dma channel\n" ); + ret = -ENODEV ; goto disable_clk; } host->write_dma_chan =dma_request_channel (mask, filter,NULL );if (!host->write_dma_chan) {dev_err (&pdev->dev,"Unable to get write dma channel\n" ); + ret = -ENODEV ; goto release_dma_read_chan; } }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 77/244 mtd: rawnand: brcmnand: fix OOB R/W with Hamming ECC
In reply to Greg Kroah-HartmanFrom: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit f5200c14242fb8fa4a9b93f7fd4064d237e58785 ]
Hamming ECC doesn't cover the OOB data, so reading or writing OOB shall always be done without ECC enabled.
This is a problem when adding JFFS2 cleanmarkers to erased blocks. If JFFS2 clenmarkers are added to the OOB with ECC enabled, OOB bytes will be changed from ff ff ff to 00 00 00, reporting incorrect ECC errors.
--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/mtd/nand/raw/brcmnand/brcmnand.c +6 -0
@@ -2364,6 +2364,12 @@ static int brcmnand_attach_chip(struct nand_chip *chip) ret =brcmstb_choose_ecc_layout (host); +/* If OOB is written with ECC enabled it will cause ECC errors */ +if (is_hamming_ecc (host->ctrl, &host->hwcfg)) { + chip->ecc.write_oob = brcmnand_write_oob_raw; + chip->ecc.read_oob = brcmnand_read_oob_raw; + } +return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 78/244 mtd: Handle possible -EPROBE_DEFER from parse_mtd_partitions()
In reply to Greg Kroah-HartmanFrom: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 08608adb520e51403be7592c2214846fa440a23a ]
There are chances that the parse_mtd_partitions() function will return -EPROBE_DEFER in mtd_device_parse_register(). This might happen when the dependency is not available for the parser. For instance, on SDX55 the MTD_QCOMSMEM_PARTS parser depends on the QCOM_SMEM driver to parse the partitions defined in the shared memory region. With the current flow, the error returned from parse_mtd_partitions() will be discarded in favor of trying to add the fallback partition.
This will prevent the driver to end up in probe deferred pool and the partitions won't be parsed even after the QCOM_SMEM driver is available.
Fix this issue by bailing out of mtd_device_parse_register() when -EPROBE_DEFER error is returned from parse_mtd_partitions() function and propagate the error code to the driver core for probing later.
--- drivers/mtd/mtdcore.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mtd/mtdcore.c +3 -0
@@ -825,6 +825,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,/* Prefer parsed partitions over driver-provided fallback */ ret =parse_mtd_partitions (mtd, types, parser_data); +if (ret == -EPROBE_DEFER ) + goto out; +if (ret >0 ) ret =0 ;else if (nr_parts)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 79/244 mtd: rawnand: qcom: Return actual error code instead of -ENODEV
In reply to Greg Kroah-HartmanFrom: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 55fbb9ba4f06cb6aff32daca1e1910173c13ec51 ]
In qcom_probe_nand_devices() function, the error code returned by qcom_nand_host_init_and_register() is converted to -ENODEV in the case of failure. This poses issue if -EPROBE_DEFER is returned when the dependency is not available for a component like parser.
So let's restructure the error handling logic a bit and return the actual error code in case of qcom_nand_host_init_and_register() failure.
--- drivers/mtd/nand/raw/qcom_nandc.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/mtd/nand/raw/qcom_nandc.c +2 -5
@@ -2850,7 +2850,7 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)struct device *dev = nandc->dev;struct device_node *dn = dev->of_node, *child;struct qcom_nand_host *host; -int ret; +int ret = -ENODEV ;for_each_available_child_of_node (dn, child) { host =devm_kzalloc (dev,sizeof (*host),GFP_KERNEL );
@@ -2868,10 +2868,7 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)list_add_tail (&host->node, &nandc->host_list); } -if (list_empty (&nandc->host_list)) -return -ENODEV ; - -return 0 ; +return ret; }/* parse custom DT properties here */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 80/244 arm64: dts: qcom: sm8150: fix number of pins in gpio-ranges
In reply to Greg Kroah-HartmanFrom: Shawn Guo <[email protected]>
[ Upstream commit de3abdf3d15c6e7f456e2de3f9da78f3a31414cc ]
The last cell of 'gpio-ranges' should be number of GPIO pins, and in case of qcom platform it should match msm_pinctrl_soc_data.ngpio rather than msm_pinctrl_soc_data.ngpio - 1.
This fixes the problem that when the last GPIO pin in the range is configured with the following call sequence, it always fails with -EPROBE_DEFER.
pinctrl_gpio_set_config()
pinctrl_get_device_gpio_range()
pinctrl_match_gpio_range()
--- arch/arm64/boot/dts/qcom/sm8150.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/sm8150.dtsi +1 -1
@@ -336,7 +336,7 @@ <0x0 0x03D00000 0x0 0x300000>; reg-names = "west", "east", "north", "south"; interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>; - gpio-ranges = <&tlmm 0 0 175>; + gpio-ranges = <&tlmm 0 0 176>; gpio-controller; #gpio-cells = <2>; interrupt-controller;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 81/244 spi: stm32: drop devres version of spi_register_master
In reply to Greg Kroah-HartmanFrom: Antonio Borneo <[email protected]>
[ Upstream commit 8d559a64f00b59af9cc02b803ff52f6e6880a651 ]
A call to spi_unregister_master() triggers calling remove() for all the spi devices binded to the spi master.
Some spi device driver requires to "talk" with the spi device during the remove(), e.g.:
- a LCD panel like drivers/gpu/drm/panel/panel-lg-lg4573.c will turn off the backlighting sending a command over spi.
This implies that the spi master must be fully functional when spi_unregister_master() is called, either if it is called explicitly in the master's remove() code or implicitly by the devres framework.
Devres calls devres_release_all() to release all the resources "after" the remove() of the spi master driver (check code of __device_release_driver() in drivers/base/dd.c).
If the spi master driver has an empty remove() then there would be no issue; the devres_release_all() will release everything in reverse order w.r.t. probe().
But if code in spi master driver remove() disables the spi or makes it not functional (like in this spi-stm32), then devres cannot be used safely for unregistering the spi master and the binded spi devices.
Replace devm_spi_register_master() with spi_register_master() and add spi_unregister_master() as first action in remove().
--- drivers/spi/spi-stm32.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/spi/spi-stm32.c +2 -1
@@ -1926,7 +1926,7 @@ static int stm32_spi_probe(struct platform_device *pdev)pm_runtime_set_active (&pdev->dev);pm_runtime_enable (&pdev->dev); - ret =devm_spi_register_master (&pdev->dev, master); + ret =spi_register_master (master);if (ret) {dev_err (&pdev->dev,"spi master registration failed: %d\n" , ret);
@@ -1980,6 +1980,7 @@ static int stm32_spi_remove(struct platform_device *pdev)struct spi_master *master =platform_get_drvdata (pdev);struct stm32_spi *spi =spi_master_get_devdata (master); +spi_unregister_master (master); spi->cfg->disable (spi);if (master->dma_tx)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 82/244 arm64: dts: renesas: r8a77980: Fix vin4-7 endpoint binding
In reply to Greg Kroah-HartmanFrom: Vladimir Barinov <[email protected]>
[ Upstream commit c8aebc1346522d3569690867ce3996642ad52e01 ]
This fixes the bindings in media framework:
The CSI40 is endpoint number 2
The CSI41 is endpoint number 3
--- arch/arm64/boot/dts/renesas/r8a77980.dtsi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
arch/arm64/boot/dts/renesas/r8a77980.dtsi +8 -8
@@ -990,8 +990,8 @@ reg = <1>; - vin4csi41: endpoint@2 { - reg = <2>; + vin4csi41: endpoint@3 { + reg = <3>; remote-endpoint = <&csi41vin4>; }; };
@@ -1018,8 +1018,8 @@ reg = <1>; - vin5csi41: endpoint@2 { - reg = <2>; + vin5csi41: endpoint@3 { + reg = <3>; remote-endpoint = <&csi41vin5>; }; };
@@ -1046,8 +1046,8 @@ reg = <1>; - vin6csi41: endpoint@2 { - reg = <2>; + vin6csi41: endpoint@3 { + reg = <3>; remote-endpoint = <&csi41vin6>; }; };
@@ -1074,8 +1074,8 @@ reg = <1>; - vin7csi41: endpoint@2 { - reg = <2>; + vin7csi41: endpoint@3 { + reg = <3>; remote-endpoint = <&csi41vin7>; }; };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 83/244 x86/microcode: Check for offline CPUs before requesting new microcode
In reply to Greg Kroah-HartmanFrom: Otavio Pontes <[email protected]>
[ Upstream commit 7189b3c11903667808029ec9766a6e96de5012a5 ]
Currently, the late microcode loading mechanism checks whether any CPUs are offlined, and, in such a case, aborts the load attempt.
However, this must be done before the kernel caches new microcode from the filesystem. Otherwise, when offlined CPUs are onlined later, those cores are going to be updated through the CPU hotplug notifier callback with the new microcode, while CPUs previously onine will continue to run with the older microcode.
For example:
Turn off one core (2 threads):
echo 0 > /sys/devices/system/cpu/cpu3/online
echo 0 > /sys/devices/system/cpu/cpu1/online
Install the ucode fails because a primary SMT thread is offline:
cp intel-ucode/06-8e-09 /lib/firmware/intel-ucode/ echo 1 > /sys/devices/system/cpu/microcode/reload
bash: echo: write error: Invalid argument
Turn the core back on
echo 1 > /sys/devices/system/cpu/cpu3/online
echo 1 > /sys/devices/system/cpu/cpu1/online
cat /proc/cpuinfo |grep microcode
microcode : 0x30
microcode : 0xde
microcode : 0x30
microcode : 0xde
The rationale for why the update is aborted when at least one primary thread is offline is because even if that thread is soft-offlined and idle, it will still have to participate in broadcasted MCE's synchronization dance or enter SMM, and in both examples it will execute instructions so it better have the same microcode revision as the other cores.
[ bp: Heavily edit and extend commit message with the reasoning behind all
this. ]
--- arch/x86/kernel/cpu/microcode/core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/x86/kernel/cpu/microcode/core.c +4 -4
@@ -626,16 +626,16 @@ static ssize_t reload_store(struct device *dev,if (val !=1 )return size; - tmp_ret = microcode_ops->request_microcode_fw (bsp, µcode_pdev->dev, true); -if (tmp_ret !=UCODE_NEW ) -return size; -get_online_cpus (); ret =check_online_cpus ();if (ret) goto put; + tmp_ret = microcode_ops->request_microcode_fw (bsp, µcode_pdev->dev, true); +if (tmp_ret !=UCODE_NEW ) + goto put; +mutex_lock (µcode_mutex); ret =microcode_reload_late ();mutex_unlock (µcode_mutex);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 84/244 usb: gadget: pch_udc: Replace cpu_to_le32() by lower_32_bits()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 91356fed6afd1c83bf0d3df1fc336d54e38f0458 ]
Either way ~0 will be in the correct byte order, hence replace cpu_to_le32() by lower_32_bits(). Moreover, it makes sparse happy, otherwise it complains:
.../pch_udc.c:1813:27: warning: incorrect type in assignment (different base types).../pch_udc.c:1813:27: expected unsigned int [usertype] dataptr.../pch_udc.c:1813:27: got restricted __le32 [usertype]
--- drivers/usb/gadget/udc/pch_udc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/pch_udc.c +1 -1
@@ -1782,7 +1782,7 @@ static struct usb_request *pch_udc_alloc_request(struct usb_ep *usbep, }/* prevent from using desc. - set HOST BUSY */ dma_desc->status |=PCH_UDC_BS_HST_BSY ; - dma_desc->dataptr =cpu_to_le32 (DMA_ADDR_INVALID ); + dma_desc->dataptr =lower_32_bits (DMA_ADDR_INVALID ); req->td_data = dma_desc; req->td_data_last = dma_desc; req->chain_len =1 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 85/244 usb: gadget: pch_udc: Check if driver is present before calling ->setup()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit fbdbbe6d3ee502b3bdeb4f255196bb45003614be ]
Since we have a separate routine for VBUS sense, the interrupt may occur before gadget driver is present. Hence, ->setup() call may oops the kernel:
[ 55.245843] BUG: kernel NULL pointer dereference, address: 00000010 ... [ 55.245843] EIP: pch_udc_isr.cold+0x162/0x33f ... [ 55.245843] <IRQ> [ 55.245843] ? pch_udc_svc_data_out+0x160/0x160
Check if driver is present before calling ->setup().
--- drivers/usb/gadget/udc/pch_udc.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
drivers/usb/gadget/udc/pch_udc.c +18 -10
@@ -2325,6 +2325,21 @@ static void pch_udc_svc_data_out(struct pch_udc_dev *dev, int ep_num)pch_udc_set_dma (dev,DMA_DIR_RX ); } +static int pch_udc_gadget_setup (struct pch_udc_dev *dev) + __must_hold(&dev->lock) +{ +int rc; + +/* In some cases we can get an interrupt before driver gets setup */ +if (!dev->driver) +return -ESHUTDOWN ; + +spin_unlock (&dev->lock); + rc = dev->driver->setup (&dev->gadget, &dev->setup_data); +spin_lock (&dev->lock); +return rc; +} +/** * pch_udc_svc_control_in() - Handle Control IN endpoint interrupts * @dev: Reference to the device structure
@@ -2396,15 +2411,12 @@ static void pch_udc_svc_control_out(struct pch_udc_dev *dev) dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX ].ep; else /* OUT */ dev->gadget.ep0 = &ep->ep; -spin_lock (&dev->lock);/* If Mass storage Reset */ if ((dev->setup_data.bRequestType ==0x21 ) && (dev->setup_data.bRequest ==0xFF )) dev->prot_stall =0 ;/* call gadget with setup data received */ - setup_supported = dev->driver->setup (&dev->gadget, - &dev->setup_data); -spin_unlock (&dev->lock); + setup_supported =pch_udc_gadget_setup (dev);if (dev->setup_data.bRequestType &USB_DIR_IN ) { ep->td_data->status = (ep->td_data->status &
@@ -2652,9 +2664,7 @@ static void pch_udc_svc_intf_interrupt(struct pch_udc_dev *dev) dev->ep[i].halted =0 ; } dev->stall =0 ; -spin_unlock (&dev->lock); - dev->driver->setup (&dev->gadget, &dev->setup_data); -spin_lock (&dev->lock); +pch_udc_gadget_setup (dev); }/**
@@ -2689,9 +2699,7 @@ static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev) dev->stall =0 ;/* call gadget zero with setup data received */ -spin_unlock (&dev->lock); - dev->driver->setup (&dev->gadget, &dev->setup_data); -spin_lock (&dev->lock); +pch_udc_gadget_setup (dev); }/**
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 86/244 usb: gadget: pch_udc: Check for DMA mapping error
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 4a28d77e359009b846951b06f7c0d8eec8dce298 ]
DMA mapping might fail, we have to check it with dma_mapping_error(). Otherwise DMA-API is not happy:
DMA-API: pch_udc 0000:02:02.4: device driver failed to check map error[device address=0x00000000027ee678] [size=64 bytes] [mapped as single]
--- drivers/usb/gadget/udc/pch_udc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/pch_udc.c +1 -1
@@ -2973,7 +2973,7 @@ static int init_dma_pools(struct pch_udc_dev *dev) dev->dma_addr =dma_map_single (&dev->pdev->dev, ep0out_buf,UDC_EP0OUT_BUFF_SIZE *4 ,DMA_FROM_DEVICE ); -return 0 ; +return dma_mapping_error (&dev->pdev->dev, dev->dma_addr); } static int pch_udc_start(struct usb_gadget *g,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 87/244 crypto: qat - dont release uninitialized resources
In reply to Greg Kroah-HartmanFrom: Tong Zhang <[email protected]>
[ Upstream commit b66accaab3791e15ac99c92f236d0d3a6d5bd64e ]
adf_vf_isr_resource_alloc() is not unwinding correctly when error happens and it want to release uninitialized resources. To fix this, only release initialized resources.
[ 1.792845] Trying to free already-free IRQ 11 [ 1.793091] WARNING: CPU: 0 PID: 182 at kernel/irq/manage.c:1821 free_irq+0x202/0x380 [ 1.801340] Call Trace: [ 1.801477] adf_vf_isr_resource_free+0x32/0xb0 [intel_qat] [ 1.801785] adf_vf_isr_resource_alloc+0x14d/0x150 [intel_qat] [ 1.802105] adf_dev_init+0xba/0x140 [intel_qat]
--- drivers/crypto/qat/qat_common/adf_vf_isr.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/crypto/qat/qat_common/adf_vf_isr.c +13 -4
@@ -304,17 +304,26 @@ int adf_vf_isr_resource_alloc(struct adf_accel_dev *accel_dev) goto err_out;if (adf_setup_pf2vf_bh (accel_dev)) - goto err_out; + goto err_disable_msi;if (adf_setup_bh (accel_dev)) - goto err_out; + goto err_cleanup_pf2vf_bh;if (adf_request_msi_irq (accel_dev)) - goto err_out; + goto err_cleanup_bh;return 0 ; + +err_cleanup_bh: +adf_cleanup_bh (accel_dev); + +err_cleanup_pf2vf_bh: +adf_cleanup_pf2vf_bh (accel_dev); + +err_disable_msi: +adf_disable_msi (accel_dev); + err_out: -adf_vf_isr_resource_free (accel_dev);return -EFAULT ; }EXPORT_SYMBOL_GPL (adf_vf_isr_resource_alloc);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 88/244 crypto: qat - ADF_STATUS_PF_RUNNING should be set after adf_dev_init
In reply to Greg Kroah-HartmanFrom: Tong Zhang <[email protected]>
[ Upstream commit 8609f5cfdc872fc3a462efa6a3eca5cb1e2f6446 ]
ADF_STATUS_PF_RUNNING is (only) used and checked by adf_vf2pf_shutdown() before calling adf_iov_putmsg()->mutex_lock(vf2pf_lock), however the vf2pf_lock is initialized in adf_dev_init(), which can fail and when it fail, the vf2pf_lock is either not initialized or destroyed, a subsequent use of vf2pf_lock will cause issue.
To fix this issue, only set this flag if adf_dev_init() returns 0.
[ 7.178404] BUG: KASAN: user-memory-access in __mutex_lock.isra.0+0x1ac/0x7c0 [ 7.180345] Call Trace: [ 7.182576] mutex_lock+0xc9/0xd0 [ 7.183257] adf_iov_putmsg+0x118/0x1a0 [intel_qat] [ 7.183541] adf_vf2pf_shutdown+0x4d/0x7b [intel_qat] [ 7.183834] adf_dev_shutdown+0x172/0x2b0 [intel_qat] [ 7.184127] adf_probe+0x5e9/0x600 [qat_dh895xccvf]
--- drivers/crypto/qat/qat_c3xxxvf/adf_drv.c | 4 ++-- drivers/crypto/qat/qat_c62xvf/adf_drv.c | 4 ++-- drivers/crypto/qat/qat_dh895xccvf/adf_drv.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/crypto/qat/qat_c3xxxvf/adf_drv.c +2 -2
@@ -233,12 +233,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)if (ret) goto out_err_free_reg; -set_bit (ADF_STATUS_PF_RUNNING , &accel_dev->status); - ret =adf_dev_init (accel_dev);if (ret) goto out_err_dev_shutdown; +set_bit (ADF_STATUS_PF_RUNNING , &accel_dev->status); + ret =adf_dev_start (accel_dev);if (ret) goto out_err_dev_stop;
drivers/crypto/qat/qat_c62xvf/adf_drv.c +2 -2
@@ -233,12 +233,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)if (ret) goto out_err_free_reg; -set_bit (ADF_STATUS_PF_RUNNING , &accel_dev->status); - ret =adf_dev_init (accel_dev);if (ret) goto out_err_dev_shutdown; +set_bit (ADF_STATUS_PF_RUNNING , &accel_dev->status); + ret =adf_dev_start (accel_dev);if (ret) goto out_err_dev_stop;
drivers/crypto/qat/qat_dh895xccvf/adf_drv.c +2 -2
@@ -233,12 +233,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)if (ret) goto out_err_free_reg; -set_bit (ADF_STATUS_PF_RUNNING , &accel_dev->status); - ret =adf_dev_init (accel_dev);if (ret) goto out_err_dev_shutdown; +set_bit (ADF_STATUS_PF_RUNNING , &accel_dev->status); + ret =adf_dev_start (accel_dev);if (ret) goto out_err_dev_stop;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 89/244 fotg210-udc: Fix DMA on EP0 for length > max packet size
In reply to Greg Kroah-HartmanFrom: Fabian Vogt <[email protected]>
[ Upstream commit 755915fc28edfc608fa89a163014acb2f31c1e19 ]
For a 75 Byte request, it would send the first 64 separately, then detect that the remaining 11 Byte fit into a single DMA, but due to this bug set the length to the original 75 Bytes. This leads to a DMA failure (which is ignored...) and the request completes without the remaining bytes having been sent.
--- drivers/usb/gadget/udc/fotg210-udc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/fotg210-udc.c +1 -1
@@ -346,7 +346,7 @@ static void fotg210_start_dma(struct fotg210_ep *ep,if (req->req.length - req->req.actual > ep->ep.maxpacket) length = ep->ep.maxpacket;else - length = req->req.length; + length = req->req.length - req->req.actual; } d = dma_map_single(dev, buffer, length,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 90/244 fotg210-udc: Fix EP0 IN requests bigger than two packets
In reply to Greg Kroah-HartmanFrom: Fabian Vogt <[email protected]>
[ Upstream commit 078ba935651e149c92c41161e0322e3372cc2705 ]
For a 134 Byte packet, it sends the first two 64 Byte packets just fine, but then notice that less than a packet is remaining and call fotg210_done without actually sending the rest.
--- drivers/usb/gadget/udc/fotg210-udc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/fotg210-udc.c +1 -1
@@ -820,7 +820,7 @@ static void fotg210_ep0in(struct fotg210_udc *fotg210)if (req->req.length)fotg210_start_dma (ep, req); -if ((req->req.length - req->req.actual) < ep->ep.maxpacket) +if (req->req.actual == req->req.length)fotg210_done (ep, req,0 ); }else {fotg210_set_cxdone (fotg210);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 91/244 fotg210-udc: Remove a dubious condition leading to fotg210_done
In reply to Greg Kroah-HartmanFrom: Fabian Vogt <[email protected]>
[ Upstream commit c7f755b243494d6043aadcd9a2989cb157958b95 ]
When the EP0 IN request was not completed but less than a packet sent, it would complete the request successfully. That doesn't make sense and can't really happen as fotg210_start_dma always sends min(length, maxpkt) bytes.
--- drivers/usb/gadget/udc/fotg210-udc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/gadget/udc/fotg210-udc.c +1 -2
@@ -379,8 +379,7 @@ static void fotg210_ep0_queue(struct fotg210_ep *ep, }if (ep->dir_in) {/* if IN */ fotg210_start_dma (ep, req); -if ((req->req.length == req->req.actual) || - (req->req.actual < ep->ep.maxpacket)) +if (req->req.length == req->req.actual)fotg210_done (ep, req,0 ); }else {/* OUT */ u32 value =ioread32 (ep->fotg210->reg +FOTG210_DMISGR0 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 92/244 fotg210-udc: Mask GRP2 interrupts we dont handle
In reply to Greg Kroah-HartmanFrom: Fabian Vogt <[email protected]>
[ Upstream commit 9aee3a23d6455200702f3a57e731fa11e8408667 ]
Currently it leaves unhandled interrupts unmasked, but those are never acked. In the case of a "device idle" interrupt, this leads to an effectively frozen system until plugging it in.
--- drivers/usb/gadget/udc/fotg210-udc.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/usb/gadget/udc/fotg210-udc.c +6 -0
@@ -1026,6 +1026,12 @@ static void fotg210_init(struct fotg210_udc *fotg210) value &= ~DMCR_GLINT_EN ;iowrite32 (value, fotg210->reg +FOTG210_DMCR ); +/* enable only grp2 irqs we handle */ +iowrite32 (~(DISGR2_DMA_ERROR |DISGR2_RX0BYTE_INT |DISGR2_TX0BYTE_INT + |DISGR2_ISO_SEQ_ABORT_INT |DISGR2_ISO_SEQ_ERR_INT + |DISGR2_RESM_INT |DISGR2_SUSP_INT |DISGR2_USBRST_INT ), + fotg210->reg +FOTG210_DMISGR2 ); +/* disable all fifo interrupt */ iowrite32 (~(u32 )0 , fotg210->reg +FOTG210_DMISGR1 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 93/244 fotg210-udc: Dont DMA more than the buffer can take
In reply to Greg Kroah-HartmanFrom: Fabian Vogt <[email protected]>
[ Upstream commit 3e7c2510bdfe89a9ec223dd7acd6bfc8bb1cbeb6 ]
Before this, it wrote as much as available into the buffer, even if it didn't fit.
--- drivers/usb/gadget/udc/fotg210-udc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/fotg210-udc.c +3 -2
@@ -338,8 +338,9 @@ static void fotg210_start_dma(struct fotg210_ep *ep, }else { buffer = req->req.buf + req->req.actual; length =ioread32 (ep->fotg210->reg + -FOTG210_FIBCR (ep->epnum -1 )); - length &=FIBCR_BCFX ; +FOTG210_FIBCR (ep->epnum -1 )) &FIBCR_BCFX ; +if (length > req->req.length - req->req.actual) + length = req->req.length - req->req.actual; } }else { buffer = req->req.buf + req->req.actual;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 94/244 fotg210-udc: Complete OUT requests on short packets
In reply to Greg Kroah-HartmanFrom: Fabian Vogt <[email protected]>
[ Upstream commit 75bb93be0027123b5db6cbcce89eb62f0f6b3c5b ]
A short packet indicates the end of a transfer and marks the request as complete.
--- drivers/usb/gadget/udc/fotg210-udc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/fotg210-udc.c +6 -2
@@ -849,12 +849,16 @@ static void fotg210_out_fifo_handler(struct fotg210_ep *ep) {struct fotg210_request *req =list_entry (ep->queue.next, struct fotg210_request, queue); +int disgr1 =ioread32 (ep->fotg210->reg +FOTG210_DISGR1 );fotg210_start_dma (ep, req); -/* finish out transfer */ +/* Complete the request when it's full or a short packet arrived. +* Like other drivers, short_not_ok isn't handled. +*/ +if (req->req.length == req->req.actual || - req->req.actual < ep->ep.maxpacket) + (disgr1 &DISGR1_SPK_INT (ep->epnum -1 )))fotg210_done (ep, req,0 ); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 95/244 mtd: require write permissions for locking and badblock ioctls
In reply to Greg Kroah-HartmanFrom: Michael Walle <[email protected]>
[ Upstream commit 1e97743fd180981bef5f01402342bb54bf1c6366 ]
MEMLOCK, MEMUNLOCK and OTPLOCK modify protection bits. Thus require write permission. Depending on the hardware MEMLOCK might even be write-once, e.g. for SPI-NOR flashes with their WP# tied to GND. OTPLOCK is always write-once.
MEMSETBADBLOCK modifies the bad block table.
--- drivers/mtd/mtdchar.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/mtd/mtdchar.c +4 -4
@@ -649,16 +649,12 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)case MEMGETINFO :case MEMREADOOB :case MEMREADOOB64 : -case MEMLOCK : -case MEMUNLOCK :case MEMISLOCKED :case MEMGETOOBSEL :case MEMGETBADBLOCK : -case MEMSETBADBLOCK :case OTPSELECT :case OTPGETREGIONCOUNT :case OTPGETREGIONINFO : -case OTPLOCK :case ECCGETLAYOUT :case ECCGETSTATS :case MTDFILEMODE :
@@ -669,9 +665,13 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)/* "dangerous" commands */ case MEMERASE :case MEMERASE64 : +case MEMLOCK : +case MEMUNLOCK : +case MEMSETBADBLOCK :case MEMWRITEOOB :case MEMWRITEOOB64 :case MEMWRITE : +case OTPLOCK :if (!(file->f_mode &FMODE_WRITE ))return -EPERM ;break ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 96/244 bus: qcom: Put child node before return
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit ac6ad7c2a862d682bb584a4bc904d89fa7721af8 ]
Put child node before return to fix potential reference count leak. Generally, the reference count of child is incremented and decremented automatically in the macro for_each_available_child_of_node() and should be decremented manually if the loop is broken in loop body.
--- drivers/bus/qcom-ebi2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/bus/qcom-ebi2.c +3 -1
@@ -353,8 +353,10 @@ static int qcom_ebi2_probe(struct platform_device *pdev)/* Figure out the chipselect */ ret =of_property_read_u32 (child,"reg" , &csindex); -if (ret) +if (ret) { +of_node_put (child);return ret; + }if (csindex >5 ) { dev_err(dev,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 97/244 soundwire: bus: Fix device found flag correctly
In reply to Greg Kroah-HartmanFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit f03690f4f6992225d05dbd1171212e5be5a370dd ]
found flag is used to indicate SoundWire devices that are both enumerated on the bus and available in the device list. However this flag is not reset correctly after one iteration, This could miss some of the devices that are enumerated on the bus but not in device list. So reset this correctly to fix this issue!
--- drivers/soundwire/bus.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/soundwire/bus.c +2 -1
@@ -525,7 +525,7 @@ static int sdw_program_device_num(struct sdw_bus *bus)struct sdw_slave *slave, *_s;struct sdw_slave_id id;struct sdw_msg msg; -bool found = false; +bool found;int count =0 , ret;u64 addr;
@@ -557,6 +557,7 @@ static int sdw_program_device_num(struct sdw_bus *bus)sdw_extract_slave_id (bus, addr, &id); + found = false;/* Now compare with entries */ list_for_each_entry_safe (slave, _s, &bus->slaves, node) {if (sdw_compare_devid (slave, id) ==0 ) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 98/244 phy: marvell: ARMADA375_USBCLUSTER_PHY should not default to y, unconditionally
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 6cb17707aad869de163d7bf42c253caf501be4e2 ]
Merely enabling CONFIG_COMPILE_TEST should not enable additional code. To fix this, restrict the automatic enabling of ARMADA375_USBCLUSTER_PHY to MACH_ARMADA_375, and ask the user in case of compile-testing.
--- drivers/phy/marvell/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/phy/marvell/Kconfig +2 -2
@@ -3,8 +3,8 @@ # Phy drivers for Marvell platforms # config ARMADA375_USBCLUSTER_PHY - def_bool y - depends on MACH_ARMADA_375 || COMPILE_TEST + bool "Armada 375 USB cluster PHY support" if COMPILE_TEST + default y if MACH_ARMADA_375 depends on OF && HAS_IOMEM select GENERIC_PHY
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 99/244 crypto: qat - fix error path in adf_isr_resource_alloc()
In reply to Greg Kroah-HartmanFrom: Giovanni Cabiddu <[email protected]>
[ Upstream commit 83dc1173d73f80cbce2fee4d308f51f87b2f26ae ]
The function adf_isr_resource_alloc() is not unwinding correctly in case of error.
This patch fixes the error paths and propagate the errors to the caller.
--- drivers/crypto/qat/qat_common/adf_isr.c | 29 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-)
drivers/crypto/qat/qat_common/adf_isr.c +21 -8
@@ -330,19 +330,32 @@ int adf_isr_resource_alloc(struct adf_accel_dev *accel_dev) ret =adf_isr_alloc_msix_entry_table (accel_dev);if (ret) -return ret; -if (adf_enable_msix (accel_dev)) goto err_out; -if (adf_setup_bh (accel_dev)) - goto err_out; + ret =adf_enable_msix (accel_dev); +if (ret) + goto err_free_msix_table; -if (adf_request_irqs (accel_dev)) - goto err_out; + ret =adf_setup_bh (accel_dev); +if (ret) + goto err_disable_msix; + + ret =adf_request_irqs (accel_dev); +if (ret) + goto err_cleanup_bh;return 0 ; + +err_cleanup_bh: +adf_cleanup_bh (accel_dev); + +err_disable_msix: +adf_disable_msix (&accel_dev->accel_pci_dev); + +err_free_msix_table: +adf_isr_free_msix_entry_table (accel_dev); + err_out: -adf_isr_resource_free (accel_dev); -return -EFAULT ; +return ret; }EXPORT_SYMBOL_GPL (adf_isr_resource_alloc);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 100/244 usb: gadget: aspeed: fix dma map failure
In reply to Greg Kroah-HartmanFrom: Tao Ren <[email protected]>
[ Upstream commit bd4d607044b961cecbf8c4c2f3bb5da4fb156993 ]
Currently the virtual port_dev device is passed to DMA API, and this is wrong because the device passed to DMA API calls must be the actual hardware device performing the DMA.
The patch replaces usb_gadget_map_request/usb_gadget_unmap_request APIs with usb_gadget_map_request_by_dev/usb_gadget_unmap_request_by_dev APIs so the DMA capable platform device can be passed to the DMA APIs.
The patch fixes below backtrace detected on Facebook AST2500 OpenBMC platforms:
[<80106550>] show_stack+0x20/0x24 [<80106868>] dump_stack+0x28/0x30 [<80823540>] __warn+0xfc/0x110 [<8011ac30>] warn_slowpath_fmt+0xb0/0xc0 [<8011ad44>] dma_map_page_attrs+0x24c/0x314 [<8016a27c>] usb_gadget_map_request_by_dev+0x100/0x1e4 [<805cedd8>] usb_gadget_map_request+0x1c/0x20 [<805cefbc>] ast_vhub_epn_queue+0xa0/0x1d8 [<7f02f710>] usb_ep_queue+0x48/0xc4 [<805cd3e8>] ecm_do_notify+0xf8/0x248 [<7f145920>] ecm_set_alt+0xc8/0x1d0 [<7f145c34>] composite_setup+0x680/0x1d30 [<7f00deb8>] ast_vhub_ep0_handle_setup+0xa4/0x1bc [<7f02ee94>] ast_vhub_dev_irq+0x58/0x84 [<7f0309e0>] ast_vhub_irq+0xb0/0x1c8 [<7f02e118>] __handle_irq_event_percpu+0x50/0x19c [<8015e5bc>] handle_irq_event_percpu+0x38/0x8c [<8015e758>] handle_irq_event+0x38/0x4c
--- drivers/usb/gadget/udc/aspeed-vhub/core.c | 3 ++- drivers/usb/gadget/udc/aspeed-vhub/epn.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/aspeed-vhub/core.c +2 -1
@@ -36,6 +36,7 @@ void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req, int status) {bool internal = req->internal; +struct ast_vhub *vhub = ep->vhub;EPVDBG (ep,"completing request @%p, status %d\n" , req, status);
@@ -46,7 +47,7 @@ void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req,if (req->req.dma) {if (!WARN_ON (!ep->dev)) -usb_gadget_unmap_request (&ep->dev->gadget, +usb_gadget_unmap_request_by_dev (&vhub->pdev->dev, &req->req, ep->epn.is_in); req->req.dma =0 ; }
drivers/usb/gadget/udc/aspeed-vhub/epn.c +1 -1
@@ -376,7 +376,7 @@ static int ast_vhub_epn_queue(struct usb_ep* u_ep, struct usb_request *u_req,if (ep->epn.desc_mode || ((((unsigned long )u_req->buf &7 ) ==0 ) && (ep->epn.is_in || !(u_req->length & (u_ep->maxpacket -1 ))))) { - rc =usb_gadget_map_request (&ep->dev->gadget, u_req, + rc =usb_gadget_map_request_by_dev (&vhub->pdev->dev, u_req, ep->epn.is_in);if (rc) { dev_warn(&vhub->pdev->dev,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 101/244 USB: gadget: udc: fix wrong pointer passed to IS_ERR() and PTR_ERR()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 2e3d055bf27d70204cae349335a62a4f9b7c165a ]
IS_ERR() and PTR_ERR() use wrong pointer, it should be udc->virt_addr, fix it.
--- drivers/usb/gadget/udc/snps_udc_plat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/snps_udc_plat.c +2 -2
@@ -114,8 +114,8 @@ static int udc_plat_probe(struct platform_device *pdev) res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); udc->virt_addr =devm_ioremap_resource (dev, res); -if (IS_ERR (udc->regs)) -return PTR_ERR (udc->regs); +if (IS_ERR (udc->virt_addr)) +return PTR_ERR (udc->virt_addr);/* udc csr registers base */ udc->csr = udc->virt_addr +UDC_CSR_ADDR ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 102/244 memory: pl353: fix mask of ECC page_size config register
In reply to Greg Kroah-HartmanFrom: gexueyuan <[email protected]>
[ Upstream commit 25dcca7fedcd4e31cb368ad846bfd738c0c6307c ]
The mask for page size of ECC Configuration Register should be 0x3, according to the datasheet of PL353 smc.
--- drivers/memory/pl353-smc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/memory/pl353-smc.c +1 -1
@@ -63,7 +63,7 @@/* ECC memory config register specific constants */ #define PL353_SMC_ECC_MEMCFG_MODE_MASK 0xC#define PL353_SMC_ECC_MEMCFG_MODE_SHIFT 2 -#define PL353_SMC_ECC_MEMCFG_PGSIZE_MASK 0xC +#define PL353_SMC_ECC_MEMCFG_PGSIZE_MASK 0x3#define PL353_SMC_DC_UPT_NAND_REGS ((4 << 23) |/* CS: NAND chip */ \ (2 << 21)) /* UpdateRegs operation */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 103/244 soundwire: stream: fix memory leak in stream config error path
In reply to Greg Kroah-HartmanFrom: Rander Wang <[email protected]>
[ Upstream commit 48f17f96a81763c7c8bf5500460a359b9939359f ]
When stream config is failed, master runtime will release all slave runtime in the slave_rt_list, but slave runtime is not added to the list at this time. This patch frees slave runtime in the config error path to fix the memory leak.
--- drivers/soundwire/stream.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/soundwire/stream.c +9 -1
@@ -1357,8 +1357,16 @@ int sdw_stream_add_slave(struct sdw_slave *slave, } ret =sdw_config_stream (&slave->dev, stream, stream_config, true); -if (ret) +if (ret) { +/* +* sdw_release_master_stream will release s_rt in slave_rt_list in +* stream_error case, but s_rt is only added to slave_rt_list +* when sdw_config_stream is successful, so free s_rt explicitly +* when sdw_config_stream is failed. +*/ +kfree (s_rt); goto stream_error; + }list_add_tail (&s_rt->m_rt_node, &m_rt->slave_rt_list);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 104/244 m68k: mvme147,mvme16x: Dont wipe PCC timer config bits
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 43262178c043032e7c42d00de44c818ba05f9967 ]
Don't clear the timer 1 configuration bits when clearing the interrupt flag and counter overflow. As Michael reported, "This results in no timer interrupts being delivered after the first. Initialization then hangs in calibrate_delay as the jiffies counter is not updated."
On mvme16x, enable the timer after requesting the irq, consistent with mvme147.
--- arch/m68k/include/asm/mvme147hw.h | 3 +++ arch/m68k/mvme147/config.c | 14 ++++++++------ arch/m68k/mvme16x/config.c | 14 ++++++++------ 3 files changed, 19 insertions(+), 12 deletions(-)
arch/m68k/include/asm/mvme147hw.h +3 -0
@@ -66,6 +66,9 @@ struct pcc_regs {#define PCC_INT_ENAB 0x08#define PCC_TIMER_INT_CLR 0x80 + +#define PCC_TIMER_TIC_EN 0x01 +#define PCC_TIMER_COC_EN 0x02#define PCC_TIMER_CLR_OVF 0x04#define PCC_LEVEL_ABORT 0x07
arch/m68k/mvme147/config.c +8 -6
@@ -117,8 +117,10 @@ static irqreturn_t mvme147_timer_int (int irq, void *dev_id)unsigned long flags;local_irq_save (flags); - m147_pcc->t1_int_cntrl =PCC_TIMER_INT_CLR ; - m147_pcc->t1_cntrl =PCC_TIMER_CLR_OVF ; + m147_pcc->t1_cntrl =PCC_TIMER_CLR_OVF |PCC_TIMER_COC_EN | +PCC_TIMER_TIC_EN ; + m147_pcc->t1_int_cntrl =PCC_INT_ENAB |PCC_TIMER_INT_CLR | +PCC_LEVEL_TIMER1 ; clk_total +=PCC_TIMER_CYCLES ;timer_routine (0 ,NULL );local_irq_restore (flags);
@@ -136,10 +138,10 @@ void mvme147_sched_init (irq_handler_t timer_routine)/* Init the clock with a value */ /* The clock counter increments until 0xFFFF then reloads */ m147_pcc->t1_preload =PCC_TIMER_PRELOAD ; - m147_pcc->t1_cntrl =0x0 ;/* clear timer */ - m147_pcc->t1_cntrl =0x3 ;/* start timer */ - m147_pcc->t1_int_cntrl =PCC_TIMER_INT_CLR ;/* clear pending ints */ - m147_pcc->t1_int_cntrl =PCC_INT_ENAB |PCC_LEVEL_TIMER1 ; + m147_pcc->t1_cntrl =PCC_TIMER_CLR_OVF |PCC_TIMER_COC_EN | +PCC_TIMER_TIC_EN ; + m147_pcc->t1_int_cntrl =PCC_INT_ENAB |PCC_TIMER_INT_CLR | +PCC_LEVEL_TIMER1 ;clocksource_register_hz (&mvme147_clk,PCC_TIMER_CLOCK_FREQ ); }
arch/m68k/mvme16x/config.c +8 -6
@@ -368,6 +368,7 @@ static u32 clk_total;#define PCCTOVR1_COC_EN 0x02#define PCCTOVR1_OVR_CLR 0x04 +#define PCCTIC1_INT_LEVEL 6#define PCCTIC1_INT_CLR 0x08#define PCCTIC1_INT_EN 0x10
@@ -377,8 +378,8 @@ static irqreturn_t mvme16x_timer_int (int irq, void *dev_id)unsigned long flags;local_irq_save (flags); -out_8 (PCCTIC1 ,in_8 (PCCTIC1 ) |PCCTIC1_INT_CLR ); -out_8 (PCCTOVR1 ,PCCTOVR1_OVR_CLR ); +out_8 (PCCTOVR1 ,PCCTOVR1_OVR_CLR |PCCTOVR1_TIC_EN |PCCTOVR1_COC_EN ); +out_8 (PCCTIC1 ,PCCTIC1_INT_EN |PCCTIC1_INT_CLR |PCCTIC1_INT_LEVEL ); clk_total +=PCC_TIMER_CYCLES ;timer_routine (0 ,NULL );local_irq_restore (flags);
@@ -392,14 +393,15 @@ void mvme16x_sched_init (irq_handler_t timer_routine)int irq;/* Using PCCchip2 or MC2 chip tick timer 1 */ -out_be32 (PCCTCNT1 ,0 ); -out_be32 (PCCTCMP1 ,PCC_TIMER_CYCLES ); -out_8 (PCCTOVR1 ,in_8 (PCCTOVR1 ) |PCCTOVR1_TIC_EN |PCCTOVR1_COC_EN ); -out_8 (PCCTIC1 ,PCCTIC1_INT_EN |6 );if (request_irq (MVME16x_IRQ_TIMER, mvme16x_timer_int,IRQF_TIMER ,"timer" , timer_routine))panic ("Couldn't register timer int" ); +out_be32 (PCCTCNT1 ,0 ); +out_be32 (PCCTCMP1 ,PCC_TIMER_CYCLES ); +out_8 (PCCTOVR1 ,PCCTOVR1_OVR_CLR |PCCTOVR1_TIC_EN |PCCTOVR1_COC_EN ); +out_8 (PCCTIC1 ,PCCTIC1_INT_EN |PCCTIC1_INT_CLR |PCCTIC1_INT_LEVEL ); +clocksource_register_hz (&mvme16x_clk,PCC_TIMER_CLOCK_FREQ );if (brdno ==0x0162 || brdno ==0x172 )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 105/244 mtd: rawnand: gpmi: Fix a double free in gpmi_nand_init
In reply to Greg Kroah-HartmanFrom: Lv Yunlong <[email protected]>
[ Upstream commit 076de75de1e53160e9b099f75872c1f9adf41a0b ]
If the callee gpmi_alloc_dma_buffer() failed to alloc memory for this->raw_buffer, gpmi_free_dma_buffer() will be called to free this->auxiliary_virt. But this->auxiliary_virt is still a non-NULL and valid ptr.
Then gpmi_alloc_dma_buffer() returns err and gpmi_free_dma_buffer() is called again to free this->auxiliary_virt in err_out. This causes a double free.
As gpmi_free_dma_buffer() has already called in gpmi_alloc_dma_buffer's error path, so it should return err directly instead of releasing the dma buffer again.
--- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +1 -1
@@ -2598,7 +2598,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) this->bch_geometry.auxiliary_size =128 ; ret =gpmi_alloc_dma_buffer (this);if (ret) - goto err_out; +return ret;nand_controller_init (&this->base); this->base.ops = &gpmi_nand_controller_ops;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 106/244 irqchip/gic-v3: Fix OF_BAD_ADDR error handling
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 8e13d96670a4c050d4883e6743a9e9858e5cfe10 ]
When building with extra warnings enabled, clang points out a mistake in the error handling:
drivers/irqchip/irq-gic-v3-mbi.c:306:21: error: result of comparison of constant 18446744073709551615 with expression of type 'phys_addr_t' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (mbi_phys_base == OF_BAD_ADDR) {Truncate the constant to the same type as the variable it gets compared to, to shut make the check work and void the warning.
--- drivers/irqchip/irq-gic-v3-mbi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-gic-v3-mbi.c +1 -1
@@ -303,7 +303,7 @@ int __init mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent) reg =of_get_property (np,"mbi-alias" ,NULL );if (reg) { mbi_phys_base =of_translate_address (np, reg); -if (mbi_phys_base ==OF_BAD_ADDR ) { +if (mbi_phys_base == (phys_addr_t )OF_BAD_ADDR ) { ret = -ENXIO ; goto err_free_mbi; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 107/244 staging: rtl8192u: Fix potential infinite loop
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit f9b9263a25dc3d2eaaa829e207434db6951ca7bc ]
The for-loop iterates with a u8 loop counter i and compares this with the loop upper limit of riv->ieee80211->LinkDetectInfo.SlotNum that is a u16 type. There is a potential infinite loop if SlotNum is larger than the u8 loop counter. Fix this by making the loop counter the same type as SlotNum.
Addresses-Coverity: ("Infinite loop")
--- drivers/staging/rtl8192u/r8192U_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/rtl8192u/r8192U_core.c +1 -1
@@ -3248,7 +3248,7 @@ static void rtl819x_update_rxcounts(struct r8192_priv *priv, u32 *TotalRxBcnNum, u32 *TotalRxDataNum) {u16 SlotIndex; -u8 i; +u16 i; *TotalRxBcnNum =0 ; *TotalRxDataNum =0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 108/244 staging: greybus: uart: fix unprivileged TIOCCSERIAL
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 60c6b305c11b5fd167ce5e2ce42f3a9098c388f0 ]
TIOCSSERIAL is a horrid, underspecified, legacy interface which for most serial devices is only useful for setting the close_delay and closing_wait parameters.
A non-privileged user has only ever been able to set the since long deprecated ASYNC_SPD flags and trying to change any other *supported* feature should result in -EPERM being returned. Setting the current values for any supported features should return success.
Fix the greybus implementation which instead indicated that the TIOCSSERIAL ioctl was not even implemented when a non-privileged user set the current values.
--- drivers/staging/greybus/uart.c | 2 -- 1 file changed, 2 deletions(-)
drivers/staging/greybus/uart.c +0 -2
@@ -652,8 +652,6 @@ static int set_serial_info(struct tty_struct *tty,if ((close_delay != gb_tty->port.close_delay) || (closing_wait != gb_tty->port.closing_wait)) retval = -EPERM ; -else - retval = -EOPNOTSUPP ; }else { gb_tty->port.close_delay = close_delay; gb_tty->port.closing_wait = closing_wait;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 109/244 PM / devfreq: Use more accurate returned new_freq as resume_freq
In reply to Greg Kroah-HartmanFrom: Dong Aisheng <[email protected]>
[ Upstream commit 62453f1ba5d5def9d58e140a50f3f168f028da38 ]
Use the more accurate returned new_freq as resume_freq. It's the same as how devfreq->previous_freq was updated.
--- drivers/devfreq/devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/devfreq/devfreq.c +1 -1
@@ -319,7 +319,7 @@ static int devfreq_set_target(struct devfreq *devfreq, unsigned long new_freq, devfreq->previous_freq = new_freq;if (devfreq->suspend_freq) - devfreq->resume_freq = cur_freq; + devfreq->resume_freq = new_freq;return err; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 110/244 spi: Fix use-after-free with devm_spi_alloc_*
In reply to Greg Kroah-HartmanFrom: William A. Kennington III <[email protected]>
[ Upstream commit 794aaf01444d4e765e2b067cba01cc69c1c68ed9 ]
We can't rely on the contents of the devres list during spi_unregister_controller(), as the list is already torn down at the time we perform devres_find() for devm_spi_release_controller. This causes devices registered with devm_spi_alloc_{master,slave}() to be mistakenly identified as legacy, non-devm managed devices and have their reference counters decremented below 0.
------------[ cut here ]------------ WARNING: CPU: 1 PID: 660 at lib/refcount.c:28 refcount_warn_saturate+0x108/0x174 [<b0396f04>] (refcount_warn_saturate) from [<b03c56a4>] (kobject_put+0x90/0x98) [<b03c5614>] (kobject_put) from [<b0447b4c>] (put_device+0x20/0x24) r4:b6700140 [<b0447b2c>] (put_device) from [<b07515e8>] (devm_spi_release_controller+0x3c/0x40) [<b07515ac>] (devm_spi_release_controller) from [<b045343c>] (release_nodes+0x84/0xc4) r5:b6700180 r4:b6700100 [<b04533b8>] (release_nodes) from [<b0454160>] (devres_release_all+0x5c/0x60) r8:b1638c54 r7:b117ad94 r6:b1638c10 r5:b117ad94 r4:b163dc10 [<b0454104>] (devres_release_all) from [<b044e41c>] (__device_release_driver+0x144/0x1ec) r5:b117ad94 r4:b163dc10 [<b044e2d8>] (__device_release_driver) from [<b044f70c>] (device_driver_detach+0x84/0xa0) r9:00000000 r8:00000000 r7:b117ad94 r6:b163dc54 r5:b1638c10 r4:b163dc10 [<b044f688>] (device_driver_detach) from [<b044d274>] (unbind_store+0xe4/0xf8)
Instead, determine the devm allocation state as a flag on the controller which is guaranteed to be stable during cleanup.
--- drivers/spi/spi.c | 9 ++------- include/linux/spi/spi.h | 3 +++ 2 files changed, 5 insertions(+), 7 deletions(-)
drivers/spi/spi.c +2 -7
@@ -2291,6 +2291,7 @@ struct spi_controller *__devm_spi_alloc_controller(struct device *dev, ctlr =__spi_alloc_controller (dev, size, slave);if (ctlr) { + ctlr->devm_allocated = true; *ptr = ctlr;devres_add (dev, ptr); }else {
@@ -2620,11 +2621,6 @@ int devm_spi_register_controller(struct device *dev, }EXPORT_SYMBOL_GPL (devm_spi_register_controller); -static int devm_spi_match_controller (struct device *dev,void *res,void *ctlr) -{ -return *(struct spi_controller **)res == ctlr; -} -static int __unregister (struct device *dev,void *null) {spi_unregister_device (to_spi_device (dev));
@@ -2671,8 +2667,7 @@ void spi_unregister_controller(struct spi_controller *ctlr)/* Release the last reference on the controller if its driver * has not yet been converted to devm_spi_alloc_master/slave(). */ -if (!devres_find (ctlr->dev.parent, devm_spi_release_controller, - devm_spi_match_controller, ctlr)) +if (!ctlr->devm_allocated)put_device (&ctlr->dev);/* free bus id */
include/linux/spi/spi.h +3 -0
@@ -466,6 +466,9 @@ struct spi_controller {#define SPI_MASTER_GPIO_SS BIT(5)/* GPIO CS must select slave */ +/* flag indicating this is a non-devres managed controller */ +bool devm_allocated; +/* flag indicating this is an SPI slave controller */ bool slave;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 111/244 soc: qcom: mdt_loader: Validate that p_filesz < p_memsz
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 84168d1b54e76a1bcb5192991adde5176abe02e3 ]
The code validates that segments of p_memsz bytes of a segment will fit in the provided memory region, but does not validate that p_filesz bytes will, which means that an incorrectly crafted ELF header might write beyond the provided memory region.
--- drivers/soc/qcom/mdt_loader.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/soc/qcom/mdt_loader.c +8 -0
@@ -230,6 +230,14 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw,break ; } +if (phdr->p_filesz > phdr->p_memsz) { +dev_err (dev, +"refusing to load segment %d with p_filesz > p_memsz\n" , + i); + ret = -EINVAL ; +break ; + } + ptr = mem_region + offset;if (phdr->p_filesz && phdr->p_offset < fw->size) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 112/244 soc: qcom: mdt_loader: Detect truncated read of segments
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 0648c55e3a21ccd816e99b6600d6199fbf39d23a ]
Given that no validation of how much data the firmware loader read in for a given segment truncated segment files would best case result in a hash verification failure, without any indication of what went wrong.
Improve this by validating that the firmware loader did return the amount of data requested.
--- drivers/soc/qcom/mdt_loader.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/soc/qcom/mdt_loader.c +9 -0
@@ -261,6 +261,15 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw,break ; } +if (seg_fw->size != phdr->p_filesz) { +dev_err (dev, +"failed to load segment %d from truncated file %s\n" , + i, fw_name); +release_firmware (seg_fw); + ret = -EINVAL ; +break ; + } +release_firmware (seg_fw); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 113/244 ACPI: CPPC: Replace cppc_attr with kobj_attribute
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 2bc6262c6117dd18106d5aa50d53e945b5d99c51 ]
All of the CPPC sysfs show functions are called via indirect call in kobj_attr_show(), where they should be of type
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
because that is the type of the ->show() member in 'struct kobj_attribute' but they are actually of type
ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buf);
because of the ->show() member in 'struct cppc_attr', resulting in a Control Flow Integrity violation [1].
$ cat /sys/devices/system/cpu/cpu0/acpi_cppc/highest_perf 3400
$ dmesg | grep "CFI failure" [ 175.970559] CFI failure (target: show_highest_perf+0x0/0x8):
As far as I can tell, the only difference between 'struct cppc_attr' and 'struct kobj_attribute' aside from the type of the attr parameter is the type of the count parameter in the ->store() member (ssize_t vs. size_t), which does not actually matter because all of these nodes are read-only.
Eliminate 'struct cppc_attr' in favor of 'struct kobj_attribute' to fix the violation.
[1]: https://lore.kernel.org/r/[email protected]/
--- drivers/acpi/cppc_acpi.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/acpi/cppc_acpi.c +3 -11
@@ -118,23 +118,15 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr);*/ #define NUM_RETRIES 500ULL -struct cppc_attr { -struct attribute attr; -ssize_t (*show)(struct kobject *kobj, -struct attribute *attr,char *buf); -ssize_t (*store)(struct kobject *kobj, -struct attribute *attr,const char *c,ssize_t count); -}; -#define define_one_cppc_ro (_name) \ -static struct cppc_attr _name = \ +static struct kobj_attribute _name = \ __ATTR(_name, 0444, show_##_name, NULL)#define to_cpc_desc (a) container_of(a, struct cpc_desc, kobj)#define show_cppc_data (access_fn, struct_name, member_name) \ static ssize_t show_##member_name(struct kobject *kobj, \ - struct attribute *attr, char *buf) \ + struct kobj_attribute *attr, char *buf) \ { \ struct cpc_desc *cpc_ptr = to_cpc_desc(kobj); \ struct struct_name st_name = {0}; \
@@ -160,7 +152,7 @@ show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, reference_perf);show_cppc_data (cppc_get_perf_ctrs, cppc_perf_fb_ctrs, wraparound_time);static ssize_t show_feedback_ctrs (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {struct cpc_desc *cpc_ptr =to_cpc_desc (kobj);struct cppc_perf_fb_ctrs fb_ctrs = {0 };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 114/244 crypto: qat - Fix a double free in adf_create_ring
In reply to Greg Kroah-HartmanFrom: Lv Yunlong <[email protected]>
[ Upstream commit f7cae626cabb3350b23722b78fe34dd7a615ca04 ]
In adf_create_ring, if the callee adf_init_ring() failed, the callee will free the ring->base_addr by dma_free_coherent() and return -EFAULT. Then adf_create_ring will goto err and the ring->base_addr will be freed again in adf_cleanup_ring().
My patch sets ring->base_addr to NULL after the first freed to avoid the double free.
--- drivers/crypto/qat/qat_common/adf_transport.c | 1 + 1 file changed, 1 insertion(+)
drivers/crypto/qat/qat_common/adf_transport.c +1 -0
@@ -197,6 +197,7 @@ static int adf_init_ring(struct adf_etr_ring_data *ring)dev_err (&GET_DEV (accel_dev),"Ring address not aligned\n" );dma_free_coherent (&GET_DEV (accel_dev), ring_size_bytes, ring->base_addr, ring->dma_addr); + ring->base_addr =NULL ;return -EFAULT ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 115/244 cpufreq: armada-37xx: Fix setting TBG parent for load levels
In reply to Greg Kroah-HartmanFrom: Marek Behún <[email protected]>
[ Upstream commit 22592df194e31baf371906cc720da38fa0ab68f5 ]
With CPU frequency determining software [1] we have discovered that after this driver does one CPU frequency change, the base frequency of the CPU is set to the frequency of TBG-A-P clock, instead of the TBG that is parent to the CPU.
This can be reproduced on EspressoBIN and Turris MOX:
cd /sys/devices/system/cpu/cpufreq/policy0 echo powersave >scaling_governor
echo performance >scaling_governor
Running the mhz tool before this driver is loaded reports 1000 MHz, and after loading the driver and executing commands above the tool reports 800 MHz.
The change of TBG clock selector is supposed to happen in function armada37xx_cpufreq_dvfs_setup. Before the function returns, it does this:
parent = clk_get_parent(clk);
clk_set_parent(clk, parent);
The armada-37xx-periph clock driver has the .set_parent method implemented correctly for this, so if the method was actually called, this would work. But since the introduction of the common clock framework in commit b2476490ef11 ("clk: introduce the common clock..."), the clk_set_parent function checks whether the parent is actually changing, and if the requested new parent is same as the old parent (which is obviously the case for the code above), the .set_parent method is not called at all.
This patch fixes this issue by filling the correct TBG clock selector directly in the armada37xx_cpufreq_dvfs_setup during the filling of other registers at the same address. But the determination of CPU TBG index cannot be done via the common clock framework, therefore we need to access the North Bridge Peripheral Clock registers directly in this driver.
[1] https://github.com/wtarreau/mhz
--- drivers/cpufreq/armada-37xx-cpufreq.c | 35 ++++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-)
drivers/cpufreq/armada-37xx-cpufreq.c +23 -12
@@ -25,6 +25,10 @@#include "cpufreq-dt.h" +/* Clk register set */ +#define ARMADA_37XX_CLK_TBG_SEL 0 +#define ARMADA_37XX_CLK_TBG_SEL_CPU_OFF 22 +/* Power management in North Bridge register set */ #define ARMADA_37XX_NB_L0L1 0x18#define ARMADA_37XX_NB_L2L3 0x1C
@@ -120,10 +124,15 @@ static struct armada_37xx_dvfs *armada_37xx_cpu_freq_info_get(u32 freq)* will be configured then the DVFS will be enabled. */ static void __init armada37xx_cpufreq_dvfs_setup (struct regmap *base, -struct clk *clk,u8 *divider) +struct regmap *clk_base,u8 *divider) { +u32 cpu_tbg_sel;int load_lvl; -struct clk *parent; + +/* Determine to which TBG clock is CPU connected */ +regmap_read (clk_base,ARMADA_37XX_CLK_TBG_SEL , &cpu_tbg_sel); + cpu_tbg_sel >>=ARMADA_37XX_CLK_TBG_SEL_CPU_OFF ; + cpu_tbg_sel &=ARMADA_37XX_NB_TBG_SEL_MASK ;for (load_lvl =0 ; load_lvl <LOAD_LEVEL_NR ; load_lvl++) {unsigned int reg, mask, val, offset =0 ;
@@ -142,6 +151,11 @@ static void __init armada37xx_cpufreq_dvfs_setup(struct regmap *base, mask = (ARMADA_37XX_NB_CLK_SEL_MASK <<ARMADA_37XX_NB_CLK_SEL_OFF ); +/* Set TBG index, for all levels we use the same TBG */ + val = cpu_tbg_sel <<ARMADA_37XX_NB_TBG_SEL_OFF ; + mask = (ARMADA_37XX_NB_TBG_SEL_MASK + <<ARMADA_37XX_NB_TBG_SEL_OFF ); +/* * Set cpu divider based on the pre-computed array in * order to have balanced step.
@@ -160,14 +174,6 @@ static void __init armada37xx_cpufreq_dvfs_setup(struct regmap *base,regmap_update_bits (base, reg, mask, val); } - -/* -* Set cpu clock source, for all the level we keep the same -* clock source that the one already configured. For this one -* we need to use the clock framework -*/ - parent =clk_get_parent (clk); -clk_set_parent (clk, parent); }/*
@@ -358,11 +364,16 @@ static int __init armada37xx_cpufreq_driver_init(void)struct platform_device *pdev;unsigned long freq;unsigned int cur_frequency, base_frequency; -struct regmap *nb_pm_base, *avs_base; +struct regmap *nb_clk_base, *nb_pm_base, *avs_base;struct device *cpu_dev;int load_lvl, ret;struct clk *clk, *parent; + nb_clk_base = +syscon_regmap_lookup_by_compatible ("marvell,armada-3700-periph-clock-nb" ); +if (IS_ERR (nb_clk_base)) +return -ENODEV ; + nb_pm_base =syscon_regmap_lookup_by_compatible ("marvell,armada-3700-nb-pm" );
@@ -439,7 +450,7 @@ static int __init armada37xx_cpufreq_driver_init(void)armada37xx_cpufreq_avs_configure (avs_base, dvfs);armada37xx_cpufreq_avs_setup (avs_base, dvfs); -armada37xx_cpufreq_dvfs_setup (nb_pm_base, clk, dvfs->divider); +armada37xx_cpufreq_dvfs_setup (nb_pm_base, nb_clk_base, dvfs->divider);clk_put (clk); for (load_lvl = ARMADA_37XX_DVFS_LOAD_0; load_lvl < LOAD_LEVEL_NR;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 116/244 clk: mvebu: armada-37xx-periph: remove .set_parent method for CPU PM clock
In reply to Greg Kroah-HartmanFrom: Marek Behún <[email protected]>
[ Upstream commit 4e435a9dd26c46ac018997cc0562d50b1a96f372 ]
Remove the .set_parent method in clk_pm_cpu_ops.
This method was supposed to be needed by the armada-37xx-cpufreq driver, but was never actually called due to wrong assumptions in the cpufreq driver. After this was fixed in the cpufreq driver, this method is not needed anymore.
--- drivers/clk/mvebu/armada-37xx-periph.c | 28 -------------------------- 1 file changed, 28 deletions(-)
drivers/clk/mvebu/armada-37xx-periph.c +0 -28
@@ -438,33 +438,6 @@ static u8 clk_pm_cpu_get_parent(struct clk_hw *hw)return val; } -static int clk_pm_cpu_set_parent (struct clk_hw *hw,u8 index) -{ -struct clk_pm_cpu *pm_cpu =to_clk_pm_cpu (hw); -struct regmap *base = pm_cpu->nb_pm_base; -int load_level; - -/* -* We set the clock parent only if the DVFS is available but -* not enabled. -*/ -if (IS_ERR (base) ||armada_3700_pm_dvfs_is_enabled (base)) -return -EINVAL ; - -/* Set the parent clock for all the load level */ -for (load_level =0 ; load_level <LOAD_LEVEL_NR ; load_level++) { -unsigned int reg, mask, val, - offset =ARMADA_37XX_NB_TBG_SEL_OFF ; - -armada_3700_pm_dvfs_update_regs (load_level, ®, &offset); - - val = index << offset; - mask =ARMADA_37XX_NB_TBG_SEL_MASK << offset; -regmap_update_bits (base, reg, mask, val); - } -return 0 ; -} -static unsigned long clk_pm_cpu_recalc_rate (struct clk_hw *hw,unsigned long parent_rate) {
@@ -590,7 +563,6 @@ static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate,static const struct clk_ops clk_pm_cpu_ops = { .get_parent = clk_pm_cpu_get_parent, - .set_parent = clk_pm_cpu_set_parent, .round_rate = clk_pm_cpu_round_rate, .set_rate = clk_pm_cpu_set_rate, .recalc_rate = clk_pm_cpu_recalc_rate,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 117/244 cpufreq: armada-37xx: Fix the AVS value for load L1
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit d118ac2062b5b8331c8768ac81e016617e0996ee ]
The original CPU voltage value for load L1 is too low for Armada 37xx SoC when base CPU frequency is 1000 or 1200 MHz. It leads to instabilities where CPU gets stuck soon after dynamic voltage scaling from load L1 to L0.
Update the CPU voltage value for load L1 accordingly when base frequency is 1000 or 1200 MHz. The minimal L1 value for base CPU frequency 1000 MHz is updated from the original 1.05V to 1.108V and for 1200 MHz is updated to 1.155V. This minimal L1 value is used only in the case when it is lower than value for L0.
This change fixes CPU instability issues on 1 GHz and 1.2 GHz variants of Espressobin and 1 GHz Turris Mox.
Marvell previously for 1 GHz variant of Espressobin provided a patch [1] suitable only for their Marvell Linux kernel 4.4 fork which workarounded this issue. Patch forced CPU voltage value to 1.108V in all loads. But such change does not fix CPU instability issues on 1.2 GHz variants of Armada 3720 SoC.
During testing we come to the conclusion that using 1.108V as minimal value for L1 load makes 1 GHz variants of Espressobin and Turris Mox boards stable. And similarly 1.155V for 1.2 GHz variant of Espressobin.
These two values 1.108V and 1.155V are documented in Armada 3700 Hardware Specifications as typical initial CPU voltage values.
Discussion about this issue is also at the Armbian forum [2].
[1] - https://github.com/MarvellEmbeddedProcessors/linux-marvell/commit/dc33b62c90696afb6adc7dbcc4ebbd48bedec269
[2] - https://forum.armbian.com/topic/10429-how-to-make-espressobin-v7-stable/
--- drivers/cpufreq/armada-37xx-cpufreq.c | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
drivers/cpufreq/armada-37xx-cpufreq.c +37 -0
@@ -73,6 +73,8 @@#define LOAD_LEVEL_NR 4#define MIN_VOLT_MV 1000 +#define MIN_VOLT_MV_FOR_L1_1000MHZ 1108 +#define MIN_VOLT_MV_FOR_L1_1200MHZ 1155/* AVS value for the corresponding voltage (in mV) */ static int avs_map[] = {
@@ -208,6 +210,8 @@ static u32 armada_37xx_avs_val_match(int target_vm)* - L2 & L3 voltage should be about 150mv smaller than L0 voltage. * This function calculates L1 & L2 & L3 AVS values dynamically based * on L0 voltage and fill all AVS values to the AVS value table. +* When base CPU frequency is 1000 or 1200 MHz then there is additional +* minimal avs value for load L1. */ static void __init armada37xx_cpufreq_avs_configure (struct regmap *base,struct armada_37xx_dvfs *dvfs)
@@ -239,6 +243,19 @@ static void __init armada37xx_cpufreq_avs_configure(struct regmap *base,for (load_level =1 ; load_level <LOAD_LEVEL_NR ; load_level++) dvfs->avs[load_level] = avs_min; +/* +* Set the avs values for load L0 and L1 when base CPU frequency +* is 1000/1200 MHz to its typical initial values according to +* the Armada 3700 Hardware Specifications. +*/ +if (dvfs->cpu_freq_max >=1000 *1000 *1000 ) { +if (dvfs->cpu_freq_max >=1200 *1000 *1000 ) + avs_min =armada_37xx_avs_val_match (MIN_VOLT_MV_FOR_L1_1200MHZ ); +else + avs_min =armada_37xx_avs_val_match (MIN_VOLT_MV_FOR_L1_1000MHZ ); + dvfs->avs[0 ] = dvfs->avs[1 ] = avs_min; + } +return ; }
@@ -258,6 +275,26 @@ static void __init armada37xx_cpufreq_avs_configure(struct regmap *base, target_vm = avs_map[l0_vdd_min] -150 ; target_vm = target_vm >MIN_VOLT_MV ? target_vm :MIN_VOLT_MV ; dvfs->avs[2 ] = dvfs->avs[3 ] =armada_37xx_avs_val_match (target_vm); + +/* +* Fix the avs value for load L1 when base CPU frequency is 1000/1200 MHz, +* otherwise the CPU gets stuck when switching from load L1 to load L0. +* Also ensure that avs value for load L1 is not higher than for L0. +*/ +if (dvfs->cpu_freq_max >=1000 *1000 *1000 ) { +u32 avs_min_l1; + +if (dvfs->cpu_freq_max >=1200 *1000 *1000 ) + avs_min_l1 =armada_37xx_avs_val_match (MIN_VOLT_MV_FOR_L1_1200MHZ ); +else + avs_min_l1 =armada_37xx_avs_val_match (MIN_VOLT_MV_FOR_L1_1000MHZ ); + +if (avs_min_l1 > dvfs->avs[0 ]) + avs_min_l1 = dvfs->avs[0 ]; + +if (dvfs->avs[1 ] < avs_min_l1) + dvfs->avs[1 ] = avs_min_l1; + } } static void __init armada37xx_cpufreq_avs_setup(struct regmap *base,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 118/244 clk: mvebu: armada-37xx-periph: Fix switching CPU freq from 250 Mhz to 1 GHz
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 4decb9187589f61fe9fc2bc4d9b01160b0a610c5 ]
It was observed that the workaround introduced by commit 61c40f35f5cd ("clk: mvebu: armada-37xx-periph: Fix switching CPU rate from 300Mhz to 1.2GHz") when base CPU frequency is 1.2 GHz is also required when base CPU frequency is 1 GHz. Otherwise switching CPU frequency directly from L2 (250 MHz) to L0 (1 GHz) causes a crash.
When base CPU frequency is just 800 MHz no crashed were observed during switch from L2 to L0.
--- drivers/clk/mvebu/armada-37xx-periph.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/clk/mvebu/armada-37xx-periph.c +7 -5
@@ -485,8 +485,10 @@ static long clk_pm_cpu_round_rate(struct clk_hw *hw, unsigned long rate, }/* -* Switching the CPU from the L2 or L3 frequencies (300 and 200 Mhz -* respectively) to L0 frequency (1.2 Ghz) requires a significant +* Workaround when base CPU frequnecy is 1000 or 1200 MHz +* +* Switching the CPU from the L2 or L3 frequencies (250/300 or 200 MHz +* respectively) to L0 frequency (1/1.2 GHz) requires a significant * amount of time to let VDD stabilize to the appropriate * voltage. This amount of time is large enough that it cannot be * covered by the hardware countdown register. Due to this, the CPU
@@ -496,15 +498,15 @@ static long clk_pm_cpu_round_rate(struct clk_hw *hw, unsigned long rate,* To work around this problem, we prevent switching directly from the * L2/L3 frequencies to the L0 frequency, and instead switch to the L1 * frequency in-between. The sequence therefore becomes: -* 1. First switch from L2/L3(200/300MHz) to L1(600MHZ) +* 1. First switch from L2/L3 (200/250/300 MHz) to L1 (500/600 MHz) * 2. Sleep 20ms for stabling VDD voltage -* 3. Then switch from L1(600MHZ) to L0(1200Mhz). +* 3. Then switch from L1 (500/600 MHz) to L0 (1000/1200 MHz). */ static void clk_pm_cpu_set_rate_wa (unsigned long rate,struct regmap *base) {unsigned int cur_level; -if (rate !=1200 *1000 *1000 ) +if (rate <1000 *1000 *1000 )return ;regmap_read (base,ARMADA_37XX_NB_CPU_LOAD , &cur_level);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 119/244 clk: mvebu: armada-37xx-periph: Fix workaround for switching from L1 to L0
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit e93033aff684641f71a436ca7a9d2a742126baaf ]
When CPU frequency is at 250 MHz and set_rate() is called with 500 MHz (L1) quickly followed by a call with 1 GHz (L0), the CPU does not necessarily stay in L1 for at least 20ms as is required by Marvell errata.
This situation happens frequently with the ondemand cpufreq governor and can be also reproduced with userspace governor. In most cases it causes CPU to crash.
This change fixes the above issue and ensures that the CPU always stays in L1 for at least 20ms when switching from any state to L0.
--- drivers/clk/mvebu/armada-37xx-periph.c | 45 ++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 6 deletions(-)
drivers/clk/mvebu/armada-37xx-periph.c +39 -6
@@ -84,6 +84,7 @@ struct clk_pm_cpu {void __iomem *reg_div;u8 shift_div;struct regmap *nb_pm_base; +unsigned long l1_expiration; };#define to_clk_double_div (_hw) container_of(_hw, struct clk_double_div, hw)
@@ -502,22 +503,52 @@ static long clk_pm_cpu_round_rate(struct clk_hw *hw, unsigned long rate,* 2. Sleep 20ms for stabling VDD voltage * 3. Then switch from L1 (500/600 MHz) to L0 (1000/1200 MHz). */ -static void clk_pm_cpu_set_rate_wa (unsigned long rate,struct regmap *base) +static void clk_pm_cpu_set_rate_wa (struct clk_pm_cpu *pm_cpu, +unsigned int new_level,unsigned long rate, +struct regmap *base) {unsigned int cur_level; -if (rate <1000 *1000 *1000 ) -return ; -regmap_read (base,ARMADA_37XX_NB_CPU_LOAD , &cur_level); cur_level &=ARMADA_37XX_NB_CPU_LOAD_MASK ; -if (cur_level <=ARMADA_37XX_DVFS_LOAD_1 ) + +if (cur_level == new_level) +return ; + +/* +* System wants to go to L1 on its own. If we are going from L2/L3, +* remember when 20ms will expire. If from L0, set the value so that +* next switch to L0 won't have to wait. +*/ +if (new_level ==ARMADA_37XX_DVFS_LOAD_1 ) { +if (cur_level ==ARMADA_37XX_DVFS_LOAD_0 ) + pm_cpu->l1_expiration = jiffies; +else + pm_cpu->l1_expiration = jiffies +msecs_to_jiffies (20 );return ; + } + +/* +* If we are setting to L2/L3, just invalidate L1 expiration time, +* sleeping is not needed. +*/ +if (rate <1000 *1000 *1000 ) + goto invalidate_l1_exp; + +/* +* We are going to L0 with rate >= 1GHz. Check whether we have been at +* L1 for long enough time. If not, go to L1 for 20ms. +*/ +if (pm_cpu->l1_expiration && jiffies >= pm_cpu->l1_expiration) + goto invalidate_l1_exp;regmap_update_bits (base,ARMADA_37XX_NB_CPU_LOAD ,ARMADA_37XX_NB_CPU_LOAD_MASK ,ARMADA_37XX_DVFS_LOAD_1 );msleep (20 ); + +invalidate_l1_exp: + pm_cpu->l1_expiration =0 ; } static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -551,7 +582,9 @@ static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate, reg =ARMADA_37XX_NB_CPU_LOAD ; mask =ARMADA_37XX_NB_CPU_LOAD_MASK ; -clk_pm_cpu_set_rate_wa (rate, base); +/* Apply workaround when base CPU frequency is 1000 or 1200 MHz */ +if (parent_rate >=1000 *1000 *1000 ) +clk_pm_cpu_set_rate_wa (pm_cpu, load_level, rate, base);regmap_update_bits (base, reg, mask, load_level);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 120/244 cpufreq: armada-37xx: Fix driver cleanup when registration failed
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 92963903a8e11b9576eb7249f8e81eefa93b6f96 ]
Commit 8db82563451f ("cpufreq: armada-37xx: fix frequency calculation for opp") changed calculation of frequency passed to the dev_pm_opp_add() function call. But the code for dev_pm_opp_remove() function call was not updated, so the driver cleanup phase does not work when registration fails.
This fixes the issue by using the same frequency in both calls.
--- drivers/cpufreq/armada-37xx-cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/armada-37xx-cpufreq.c +1 -1
@@ -521,7 +521,7 @@ disable_dvfs: remove_opp:/* clean-up the already added opp before leaving */ while (load_lvl-- >ARMADA_37XX_DVFS_LOAD_0 ) { - freq = cur_frequency / dvfs->divider[load_lvl]; + freq = base_frequency / dvfs->divider[load_lvl];dev_pm_opp_remove (cpu_dev, freq); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 121/244 cpufreq: armada-37xx: Fix determining base CPU frequency
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 8bad3bf23cbc40abe1d24cec08a114df6facf858 ]
When current CPU load is not L0 then loading armada-37xx-cpufreq.ko driver fails with following error:
# modprobe armada-37xx-cpufreq
[ 502.702097] Unsupported CPU frequency 250 MHzThis issue was partially fixed by commit 8db82563451f ("cpufreq:
armada-37xx: fix frequency calculation for opp"), but only for calculating CPU frequency for opp.
Fix this also for determination of base CPU frequency.
--- drivers/cpufreq/armada-37xx-cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/armada-37xx-cpufreq.c +1 -1
@@ -469,7 +469,7 @@ static int __init armada37xx_cpufreq_driver_init(void)return -EINVAL ; } - dvfs =armada_37xx_cpu_freq_info_get (cur_frequency); + dvfs =armada_37xx_cpu_freq_info_get (base_frequency);if (!dvfs) {clk_put (clk);return -EINVAL ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 122/244 spi: fsl-lpspi: Fix PM reference leak in lpspi_prepare_xfer_hardware()
In reply to Greg Kroah-HartmanFrom: Wang Li <[email protected]>
[ Upstream commit a03675497970a93fcf25d81d9d92a59c2d7377a7 ]
pm_runtime_get_sync will increment pm usage counter even it failed. Forgetting to putting operation will result in reference leak here. Fix it by replacing it with pm_runtime_resume_and_get to keep usage counter balanced.
--- drivers/spi/spi-fsl-lpspi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-fsl-lpspi.c +1 -1
@@ -207,7 +207,7 @@ static int lpspi_prepare_xfer_hardware(struct spi_controller *controller)spi_controller_get_devdata (controller);int ret; - ret =pm_runtime_get_sync (fsl_lpspi->dev); + ret =pm_runtime_resume_and_get (fsl_lpspi->dev);if (ret <0 ) {dev_err (fsl_lpspi->dev,"failed to enable clock\n" );return ret;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 123/244 usb: gadget: r8a66597: Add missing null check on return from platform_get_resource
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 9c2076090c2815fe7c49676df68dde7e60a9b9fc ]
The call to platform_get_resource can potentially return a NULL pointer on failure, so add this check and return -EINVAL if it fails.
Addresses-Coverity: ("Dereference null return")
--- drivers/usb/gadget/udc/r8a66597-udc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/gadget/udc/r8a66597-udc.c +2 -0
@@ -1852,6 +1852,8 @@ static int r8a66597_probe(struct platform_device *pdev)return PTR_ERR (reg); ires =platform_get_resource (pdev,IORESOURCE_IRQ ,0 ); +if (!ires) +return -EINVAL ; irq = ires->start; irq_trigger = ires->flags &IRQF_TRIGGER_MASK ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 124/244 USB: cdc-acm: fix unprivileged TIOCCSERIAL
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit dd5619582d60007139f0447382d2839f4f9e339b ]
TIOCSSERIAL is a horrid, underspecified, legacy interface which for most serial devices is only useful for setting the close_delay and closing_wait parameters.
A non-privileged user has only ever been able to set the since long deprecated ASYNC_SPD flags and trying to change any other *supported* feature should result in -EPERM being returned. Setting the current values for any supported features should return success.
Fix the cdc-acm implementation which instead indicated that the TIOCSSERIAL ioctl was not even implemented when a non-privileged user set the current values.
--- drivers/usb/class/cdc-acm.c | 2 -- 1 file changed, 2 deletions(-)
drivers/usb/class/cdc-acm.c +0 -2
@@ -954,8 +954,6 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)if ((close_delay != acm->port.close_delay) || (closing_wait != acm->port.closing_wait)) retval = -EPERM ; -else - retval = -EOPNOTSUPP ; }else { acm->port.close_delay = close_delay; acm->port.closing_wait = closing_wait;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 125/244 USB: cdc-acm: fix TIOCGSERIAL implementation
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 496960274153bdeb9d1f904ff1ea875cef8232c1 ]
TIOCSSERIAL is a horrid, underspecified, legacy interface which for most serial devices is only useful for setting the close_delay and closing_wait parameters.
The xmit_fifo_size parameter could be used to set the hardware transmit fifo size of a legacy UART when it could not be detected, but the interface is limited to eight bits and should be left unset when it is not used.
Similarly, baud_base could be used to set the UART base clock when it could not be detected, but might as well be left unset when it is not known (which is the case for CDC).
Fix the cdc-acm TIOCGSERIAL implementation by dropping its custom interpretation of the unused xmit_fifo_size and baud_base fields, which overflowed the former with the URB buffer size and set the latter to the current line speed. Also return the port line number, which is the only other value used besides the close parameters.
Note that the current line speed can still be retrieved through the standard termios interfaces.
--- drivers/usb/class/cdc-acm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/class/cdc-acm.c +1 -2
@@ -928,8 +928,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss) {struct acm *acm = tty->driver_data; - ss->xmit_fifo_size = acm->writesize; - ss->baud_base =le32_to_cpu (acm->line.dwDTERate); + ss->line = acm->minor; ss->close_delay =jiffies_to_msecs (acm->port.close_delay) /10 ; ss->closing_wait = acm->port.closing_wait ==ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE :
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 126/244 tty: actually undefine superseded ASYNC flags
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit d09845e98a05850a8094ea8fd6dd09a8e6824fff ]
Some kernel-internal ASYNC flags have been superseded by tty-port flags and should no longer be used by kernel drivers.
Fix the misspelled "__KERNEL__" compile guards which failed their sole purpose to break out-of-tree drivers that have not yet been updated.
--- include/uapi/linux/tty_flags.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/uapi/linux/tty_flags.h +2 -2
@@ -39,7 +39,7 @@* WARNING: These flags are no longer used and have been superceded by the * TTY_PORT_ flags in the iflags field (and not userspace-visible) */ -#ifndef _KERNEL_ +#ifndef __KERNEL__#define ASYNCB_INITIALIZED 31/* Serial port was initialized */ #define ASYNCB_SUSPENDED 30/* Serial port is suspended */ #define ASYNCB_NORMAL_ACTIVE 29/* Normal device is active */
@@ -81,7 +81,7 @@#define ASYNC_SPD_WARP (ASYNC_SPD_HI|ASYNC_SPD_SHI)#define ASYNC_SPD_MASK (ASYNC_SPD_HI|ASYNC_SPD_VHI|ASYNC_SPD_SHI) -#ifndef _KERNEL_ +#ifndef __KERNEL__/* These flags are no longer used (and were always masked from userspace) */ #define ASYNC_INITIALIZED (1U << ASYNCB_INITIALIZED)#define ASYNC_NORMAL_ACTIVE (1U << ASYNCB_NORMAL_ACTIVE)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 127/244 tty: fix return value for unsupported ioctls
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 1b8b20868a6d64cfe8174a21b25b74367bdf0560 ]
Drivers should return -ENOTTY ("Inappropriate I/O control operation") when an ioctl isn't supported, while -EINVAL is used for invalid arguments.
Fix up the TIOCMGET, TIOCMSET and TIOCGICOUNT helpers which returned -EINVAL when a tty driver did not implement the corresponding operations.
Note that the TIOCMGET and TIOCMSET helpers predate git and do not get a corresponding Fixes tag below.
--- drivers/tty/tty_io.c | 8 ++++---- include/linux/tty_driver.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/tty/tty_io.c +4 -4
@@ -2407,14 +2407,14 @@ out:* @p: pointer to result * * Obtain the modem status bits from the tty driver if the feature -* is supported. Return -EINVAL if it is not available. +* is supported. Return -ENOTTY if it is not available. * * Locking: none (up to the driver) */ static int tty_tiocmget (struct tty_struct *tty,int __user *p) { -int retval = -EINVAL ; +int retval = -ENOTTY ;if (tty->ops->tiocmget) { retval = tty->ops->tiocmget (tty);
@@ -2432,7 +2432,7 @@ static int tty_tiocmget(struct tty_struct *tty, int __user *p)* @p: pointer to desired bits * * Set the modem status bits from the tty driver if the feature -* is supported. Return -EINVAL if it is not available. +* is supported. Return -ENOTTY if it is not available. * * Locking: none (up to the driver) */
@@ -2444,7 +2444,7 @@ static int tty_tiocmset(struct tty_struct *tty, unsigned int cmd,unsigned int set, clear, val;if (tty->ops->tiocmset ==NULL ) -return -EINVAL ; +return -ENOTTY ; retval =get_user (val, p);if (retval)
include/linux/tty_driver.h +1 -1
@@ -236,7 +236,7 @@* * Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel * structure to complete. This method is optional and will only be called -* if provided (otherwise EINVAL will be returned). +* if provided (otherwise ENOTTY will be returned). */ #include <linux/export.h>
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 128/244 serial: core: return early on unsupported ioctls
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 79c5966cec7b148199386ef9933c31b999379065 ]
Drivers can return -ENOIOCTLCMD when an ioctl is not recognised to tell the upper layers to continue looking for a handler.
This is not the case for the RS485 and ISO7816 ioctls whose handlers should return -ENOTTY directly in case a serial driver does not implement the corresponding methods.
--- drivers/tty/serial/serial_core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/tty/serial/serial_core.c +3 -3
@@ -1304,7 +1304,7 @@ static int uart_set_rs485_config(struct uart_port *port,unsigned long flags;if (!port->rs485_config) -return -ENOIOCTLCMD ; +return -ENOTTY ;if (copy_from_user (&rs485, rs485_user,sizeof (*rs485_user)))return -EFAULT ;
@@ -1328,7 +1328,7 @@ static int uart_get_iso7816_config(struct uart_port *port,struct serial_iso7816 aux;if (!port->iso7816_config) -return -ENOIOCTLCMD ; +return -ENOTTY ;spin_lock_irqsave (&port->lock, flags); aux = port->iso7816;
@@ -1348,7 +1348,7 @@ static int uart_set_iso7816_config(struct uart_port *port,unsigned long flags;if (!port->iso7816_config) -return -ENOIOCTLCMD ; +return -ENOTTY ;if (copy_from_user (&iso7816, iso7816_user,sizeof (*iso7816_user)))return -EFAULT ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 129/244 firmware: qcom-scm: Fix QCOM_SCM configuration
In reply to Greg Kroah-HartmanFrom: He Ying <[email protected]>
[ Upstream commit 2954a6f12f250890ec2433cec03ba92784d613e8 ]
When CONFIG_QCOM_SCM is y and CONFIG_HAVE_ARM_SMCCC is not set, compiling errors are encountered as follows:
drivers/firmware/qcom_scm-smc.o: In function `__scm_smc_do_quirk':
qcom_scm-smc.c:(.text+0x36): undefined reference to __arm_smccc_smc' drivers/firmware/qcom_scm-legacy.o: In function scm_legacy_call':
qcom_scm-legacy.c:(.text+0xe2): undefined reference to __arm_smccc_smc' drivers/firmware/qcom_scm-legacy.o: In function scm_legacy_call_atomic':
qcom_scm-legacy.c:(.text+0x1f0): undefined reference to `__arm_smccc_smc'
Note that __arm_smccc_smc is defined when HAVE_ARM_SMCCC is y. So add dependency on HAVE_ARM_SMCCC in QCOM_SCM configuration.
--- drivers/firmware/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/firmware/Kconfig +1 -0
@@ -237,6 +237,7 @@ config INTEL_STRATIX10_RSU config QCOM_SCM bool depends on ARM || ARM64 + depends on HAVE_ARM_SMCCC select RESET_CONTROLLER config QCOM_SCM_32
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 130/244 node: fix device cleanups in error handling code
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 4ce535ec0084f0d712317cb99d383cad3288e713 ]
We can't use kfree() to free device managed resources so the kfree(dev) is against the rules.
It's easier to write this code if we open code the device_register() as a device_initialize() and device_add(). That way if dev_set_name() set name fails we can call put_device() and it will clean up correctly.
--- drivers/base/node.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-)
drivers/base/node.c +12 -14
@@ -262,21 +262,20 @@ static void node_init_cache_dev(struct node *node)if (!dev)return ; +device_initialize (dev); dev->parent = &node->dev; dev->release = node_cache_release;if (dev_set_name (dev,"memory_side_cache" )) - goto free_dev; + goto put_device; -if (device_register (dev)) - goto free_name; +if (device_add (dev)) + goto put_device;pm_runtime_no_callbacks (dev); node->cache_dev = dev;return ; -free_name: -kfree_const (dev->kobj.name); -free_dev: -kfree (dev); +put_device: +put_device (dev); }/**
@@ -313,25 +312,24 @@ void node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs)return ; dev = &info->dev; +device_initialize (dev); dev->parent = node->cache_dev; dev->release = node_cacheinfo_release; dev->groups = cache_groups;if (dev_set_name (dev,"index%d" , cache_attrs->level)) - goto free_cache; + goto put_device; info->cache_attrs = *cache_attrs; -if (device_register (dev)) { +if (device_add (dev)) {dev_warn (&node->dev,"failed to add cache level:%d\n" , cache_attrs->level); - goto free_name; + goto put_device; }pm_runtime_no_callbacks (dev);list_add_tail (&info->node, &node->cache_attrs);return ; -free_name: -kfree_const (dev->kobj.name); -free_cache: -kfree (info); +put_device: +put_device (dev); }static void node_remove_caches (struct node *node)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 131/244 usbip: vudc: fix missing unlock on error in usbip_sockfd_store()
In reply to Greg Kroah-HartmanFrom: Ye Bin <[email protected]>
[ Upstream commit 1d08ed588c6a85a35a24c82eb4cf0807ec2b366a ]
Add the missing unlock before return from function usbip_sockfd_store() in the error handling case.
--- drivers/usb/usbip/vudc_sysfs.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/usbip/vudc_sysfs.c +2 -0
@@ -156,12 +156,14 @@ static ssize_t usbip_sockfd_store(struct device *dev, tcp_rx =kthread_create (&v_rx_loop, &udc->ud,"vudc_rx" );if (IS_ERR (tcp_rx)) {sockfd_put (socket); +mutex_unlock (&udc->ud.sysfs_lock);return -EINVAL ; } tcp_tx =kthread_create (&v_tx_loop, &udc->ud,"vudc_tx" );if (IS_ERR (tcp_tx)) {kthread_stop (tcp_rx);sockfd_put (socket); +mutex_unlock (&udc->ud.sysfs_lock);return -EINVAL ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 132/244 platform/x86: pmc_atom: Match all Beckhoff Automation baytrail boards with critclk_systems DMI table
In reply to Greg Kroah-HartmanFrom: Steffen Dirkwinkel <[email protected]>
[ Upstream commit d21e5abd3a005253eb033090aab2e43bce090d89 ]
pmc_plt_clk* clocks are used for ethernet controllers, so need to stay turned on. This adds the affected board family to critclk_systems DMI table, so the clocks are marked as CLK_CRITICAL and not turned off.
This replaces the previously listed boards with a match for the whole device family CBxx63. CBxx63 matches only baytrail devices. There are new affected boards that would otherwise need to be listed. There are unaffected boards in the family, but having the clocks turned on is not an issue.
--- drivers/platform/x86/pmc_atom.c | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-)
drivers/platform/x86/pmc_atom.c +2 -26
@@ -393,34 +393,10 @@ static const struct dmi_system_id critclk_systems[] = { }, {/* pmc_plt_clk* - are used for ethernet controllers */ - .ident = "Beckhoff CB3163", + .ident = "Beckhoff Baytrail", .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"Beckhoff Automation" ), - DMI_MATCH(DMI_BOARD_NAME, "CB3163"), - }, - }, - { -/* pmc_plt_clk* - are used for ethernet controllers */ - .ident ="Beckhoff CB4063" , - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Beckhoff Automation" ), - DMI_MATCH(DMI_BOARD_NAME, "CB4063"), - }, - }, - { -/* pmc_plt_clk* - are used for ethernet controllers */ - .ident ="Beckhoff CB6263" , - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Beckhoff Automation" ), - DMI_MATCH(DMI_BOARD_NAME, "CB6263"), - }, - }, - { -/* pmc_plt_clk* - are used for ethernet controllers */ - .ident ="Beckhoff CB6363" , - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Beckhoff Automation" ), - DMI_MATCH(DMI_BOARD_NAME, "CB6363"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "CBxx63"), }, }, {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 133/244 x86/platform/uv: Fix !KEXEC build failure
In reply to Greg Kroah-HartmanFrom: Ingo Molnar <[email protected]>
[ Upstream commit c2209ea55612efac75de0a58ef5f7394fae7fa0f ]
When KEXEC is disabled, the UV build fails:
arch/x86/platform/uv/uv_nmi.c:875:14: error: ‘uv_nmi_kexec_failed’ undeclared (first use in this function)
Since uv_nmi_kexec_failed is only defined in the KEXEC_CORE #ifdef branch, this code cannot ever have been build tested:
if (main)
pr_err("UV: NMI kdump: KEXEC not supported in this kernel\n");
atomic_set(&uv_nmi_kexec_failed, 1);Nor is this use possible in uv_handle_nmi():
atomic_set(&uv_nmi_kexec_failed, 0);
These bugs were introduced in this commit:
d0a9964e9873: ("x86/platform/uv: Implement simple dump failover if kdump fails")
Which added the uv_nmi_kexec_failed assignments to !KEXEC code, while making the definition KEXEC-only - apparently without testing the !KEXEC case.
Instead of complicating the #ifdef maze, simplify the code by requiring X86_UV to depend on KEXEC_CORE. This pattern is present in other architectures as well.
( We'll remove the untested, 7 years old !KEXEC complications from the file in a
separate commit. )
--- arch/x86/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/x86/Kconfig +1 -0
@@ -550,6 +550,7 @@ config X86_UV depends on X86_EXTENDED_PLATFORM depends on NUMA depends on EFI + depends on KEXEC_CORE depends on X86_X2APIC depends on PCI ---help---
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 134/244 Drivers: hv: vmbus: Increase wait time for VMbus unload
In reply to Greg Kroah-HartmanFrom: Michael Kelley <[email protected]>
[ Upstream commit 77db0ec8b7764cb9b09b78066ebfd47b2c0c1909 ]
When running in Azure, disks may be connected to a Linux VM with read/write caching enabled. If a VM panics and issues a VMbus UNLOAD request to Hyper-V, the response is delayed until all dirty data in the disk cache is flushed. In extreme cases, this flushing can take 10's of seconds, depending on the disk speed and the amount of dirty data. If kdump is configured for the VM, the current 10 second timeout in vmbus_wait_for_unload() may be exceeded, and the UNLOAD complete message may arrive well after the kdump kernel is already running, causing problems. Note that no problem occurs if kdump is not enabled because Hyper-V waits for the cache flush before doing a reboot through the BIOS/UEFI code.
Fix this problem by increasing the timeout in vmbus_wait_for_unload() to 100 seconds. Also output periodic messages so that if anyone is watching the serial console, they won't think the VM is completely hung.
--- drivers/hv/channel_mgmt.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-)
drivers/hv/channel_mgmt.c +25 -5
@@ -763,6 +763,12 @@ static void init_vp_index(struct vmbus_channel *channel, u16 dev_type)free_cpumask_var (available_mask); } +#define UNLOAD_DELAY_UNIT_MS 10/* 10 milliseconds */ +#define UNLOAD_WAIT_MS (100*1000)/* 100 seconds */ +#define UNLOAD_WAIT_LOOPS (UNLOAD_WAIT_MS/UNLOAD_DELAY_UNIT_MS) +#define UNLOAD_MSG_MS (5*1000)/* Every 5 seconds */ +#define UNLOAD_MSG_LOOPS (UNLOAD_MSG_MS/UNLOAD_DELAY_UNIT_MS) +static void vmbus_wait_for_unload (void ) {int cpu;
@@ -780,12 +786,17 @@ static void vmbus_wait_for_unload(void)* vmbus_connection.unload_event. If not, the last thing we can do is * read message pages for all CPUs directly. * -* Wait no more than 10 seconds so that the panic path can't get -* hung forever in case the response message isn't seen. +* Wait up to 100 seconds since an Azure host must writeback any dirty +* data in its disk cache before the VMbus UNLOAD request will +* complete. This flushing has been empirically observed to take up +* to 50 seconds in cases with a lot of dirty data, so allow additional +* leeway and for inaccuracies in mdelay(). But eventually time out so +* that the panic path can't get hung forever in case the response +* message isn't seen. */ -for (i =0 ; i <1000 ; i++) { +for (i =1 ; i <=UNLOAD_WAIT_LOOPS ; i++) {if (completion_done (&vmbus_connection.unload_event)) -break ; + goto completed;for_each_online_cpu (cpu) {struct hv_per_cpu_context *hv_cpu
@@ -808,9 +819,18 @@ static void vmbus_wait_for_unload(void)vmbus_signal_eom (msg, message_type); } -mdelay (10 ); +/* +* Give a notice periodically so someone watching the +* serial output won't think it is completely hung. +*/ +if (!(i %UNLOAD_MSG_LOOPS )) +pr_notice ("Waiting for VMBus UNLOAD to complete\n" ); + +mdelay (UNLOAD_DELAY_UNIT_MS ); } +pr_err ("Continuing even though VMBus UNLOAD did not complete\n" ); +completed:/* * We're crashing and already got the UNLOAD_RESPONSE, cleanup all * maybe-pending messages on all CPUs to be able to receive new
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 135/244 usb: dwc2: Fix host mode hibernation exit with remote wakeup flow.
In reply to Greg Kroah-HartmanFrom: Artur Petrosyan <[email protected]>
[ Upstream commit c2db8d7b9568b10e014af83b3c15e39929e3579e ]
Added setting "port_connect_status_change" flag to "1" in order to re-enumerate, because after exit from hibernation port connection status is not detected.
--- drivers/usb/dwc2/hcd.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/usb/dwc2/hcd.c +9 -1
@@ -5580,7 +5580,15 @@ int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup,return ret; } -dwc2_hcd_rem_wakeup (hsotg); +if (rem_wakeup) { +dwc2_hcd_rem_wakeup (hsotg); +/* +* Change "port_connect_status_change" flag to re-enumerate, +* because after exit from hibernation port connection status +* is not detected. +*/ + hsotg->flags.b.port_connect_status_change =1 ; + } hsotg->hibernated =0 ; hsotg->bus_suspended =0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 136/244 usb: dwc2: Fix hibernation between host and device modes.
In reply to Greg Kroah-HartmanFrom: Artur Petrosyan <[email protected]>
[ Upstream commit 24d209dba5a3959b2ebde7cf3ad40c8015e814cf ]
When core is in hibernation in host mode and a device cable was connected then driver exited from device hibernation. However, registers saved for host mode and when exited from device hibernation register restore would be done for device register which was wrong because there was no device registers stored to restore.
- Added dwc_handle_gpwrdn_disc_det() function which handles gpwrdn disconnect detect flow and exits hibernation without restoring the registers.
- Updated exiting from hibernation in GPWRDN_STS_CHGINT with calling dwc_handle_gpwrdn_disc_det() function. Here no register is restored which is the solution described above.
--- drivers/usb/dwc2/core_intr.c | 154 +++++++++++++++++++---------------- 1 file changed, 83 insertions(+), 71 deletions(-)
drivers/usb/dwc2/core_intr.c +83 -71
@@ -665,6 +665,71 @@ static u32 dwc2_read_common_intr(struct dwc2_hsotg *hsotg)return 0 ; } +/** +* dwc_handle_gpwrdn_disc_det() - Handles the gpwrdn disconnect detect. +* Exits hibernation without restoring registers. +* +* @hsotg: Programming view of DWC_otg controller +* @gpwrdn: GPWRDN register +*/ +static inline void dwc_handle_gpwrdn_disc_det (struct dwc2_hsotg *hsotg, +u32 gpwrdn) +{ +u32 gpwrdn_tmp; + +/* Switch-on voltage to the core */ + gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); + gpwrdn_tmp &= ~GPWRDN_PWRDNSWTCH ; +dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); +udelay (5 ); + +/* Reset core */ + gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); + gpwrdn_tmp &= ~GPWRDN_PWRDNRSTN ; +dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); +udelay (5 ); + +/* Disable Power Down Clamp */ + gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); + gpwrdn_tmp &= ~GPWRDN_PWRDNCLMP ; +dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); +udelay (5 ); + +/* Deassert reset core */ + gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); + gpwrdn_tmp |=GPWRDN_PWRDNRSTN ; +dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); +udelay (5 ); + +/* Disable PMU interrupt */ + gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); + gpwrdn_tmp &= ~GPWRDN_PMUINTSEL ; +dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); + +/* De-assert Wakeup Logic */ + gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); + gpwrdn_tmp &= ~GPWRDN_PMUACTV ; +dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); + + hsotg->hibernated =0 ; + hsotg->bus_suspended =0 ; + +if (gpwrdn &GPWRDN_IDSTS ) { + hsotg->op_state =OTG_STATE_B_PERIPHERAL ; +dwc2_core_init (hsotg, false); +dwc2_enable_global_interrupts (hsotg); +dwc2_hsotg_core_init_disconnected (hsotg, false); +dwc2_hsotg_core_connect (hsotg); + }else { + hsotg->op_state =OTG_STATE_A_HOST ; + +/* Initialize the Core for Host mode */ +dwc2_core_init (hsotg, false); +dwc2_enable_global_interrupts (hsotg); +dwc2_hcd_start (hsotg); + } +} +/* * GPWRDN interrupt handler. *
@@ -686,64 +751,14 @@ static void dwc2_handle_gpwrdn_intr(struct dwc2_hsotg *hsotg)if ((gpwrdn &GPWRDN_DISCONN_DET ) && (gpwrdn &GPWRDN_DISCONN_DET_MSK ) && !linestate) { -u32 gpwrdn_tmp; -dev_dbg (hsotg->dev,"%s: GPWRDN_DISCONN_DET\n" , __func__); - -/* Switch-on voltage to the core */ - gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); - gpwrdn_tmp &= ~GPWRDN_PWRDNSWTCH ; -dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); -udelay (10 ); - -/* Reset core */ - gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); - gpwrdn_tmp &= ~GPWRDN_PWRDNRSTN ; -dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); -udelay (10 ); - -/* Disable Power Down Clamp */ - gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); - gpwrdn_tmp &= ~GPWRDN_PWRDNCLMP ; -dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); -udelay (10 ); - -/* Deassert reset core */ - gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); - gpwrdn_tmp |=GPWRDN_PWRDNRSTN ; -dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); -udelay (10 ); - -/* Disable PMU interrupt */ - gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); - gpwrdn_tmp &= ~GPWRDN_PMUINTSEL ; -dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); - -/* De-assert Wakeup Logic */ - gpwrdn_tmp =dwc2_readl (hsotg,GPWRDN ); - gpwrdn_tmp &= ~GPWRDN_PMUACTV ; -dwc2_writel (hsotg, gpwrdn_tmp,GPWRDN ); - - hsotg->hibernated =0 ; - -if (gpwrdn &GPWRDN_IDSTS ) { - hsotg->op_state =OTG_STATE_B_PERIPHERAL ; -dwc2_core_init (hsotg, false); -dwc2_enable_global_interrupts (hsotg); -dwc2_hsotg_core_init_disconnected (hsotg, false); -dwc2_hsotg_core_connect (hsotg); - }else { - hsotg->op_state =OTG_STATE_A_HOST ; - -/* Initialize the Core for Host mode */ -dwc2_core_init (hsotg, false); -dwc2_enable_global_interrupts (hsotg); -dwc2_hcd_start (hsotg); - } - } - -if ((gpwrdn &GPWRDN_LNSTSCHG ) && - (gpwrdn &GPWRDN_LNSTSCHG_MSK ) && linestate) { +/* +* Call disconnect detect function to exit from +* hibernation +*/ +dwc_handle_gpwrdn_disc_det (hsotg, gpwrdn); + }else if ((gpwrdn &GPWRDN_LNSTSCHG ) && + (gpwrdn &GPWRDN_LNSTSCHG_MSK ) && linestate) {dev_dbg (hsotg->dev,"%s: GPWRDN_LNSTSCHG\n" , __func__);if (hsotg->hw_params.hibernation && hsotg->hibernated) {
@@ -754,24 +769,21 @@ static void dwc2_handle_gpwrdn_intr(struct dwc2_hsotg *hsotg)dwc2_exit_hibernation (hsotg,1 ,0 ,1 ); } } - } -if ((gpwrdn &GPWRDN_RST_DET ) && (gpwrdn &GPWRDN_RST_DET_MSK )) { + }else if ((gpwrdn &GPWRDN_RST_DET ) && + (gpwrdn &GPWRDN_RST_DET_MSK )) {dev_dbg (hsotg->dev,"%s: GPWRDN_RST_DET\n" , __func__);if (!linestate && (gpwrdn &GPWRDN_BSESSVLD ))dwc2_exit_hibernation (hsotg,0 ,1 ,0 ); - } -if ((gpwrdn &GPWRDN_STS_CHGINT ) && - (gpwrdn &GPWRDN_STS_CHGINT_MSK ) && linestate) { + }else if ((gpwrdn &GPWRDN_STS_CHGINT ) && + (gpwrdn &GPWRDN_STS_CHGINT_MSK )) {dev_dbg (hsotg->dev,"%s: GPWRDN_STS_CHGINT\n" , __func__); -if (hsotg->hw_params.hibernation && - hsotg->hibernated) { -if (gpwrdn &GPWRDN_IDSTS ) { -dwc2_exit_hibernation (hsotg,0 ,0 ,0 ); -call_gadget (hsotg, resume); - }else { -dwc2_exit_hibernation (hsotg,1 ,0 ,1 ); - } - } +/* +* As GPWRDN_STS_CHGINT exit from hibernation flow is +* the same as in GPWRDN_DISCONN_DET flow. Call +* disconnect detect helper function to exit from +* hibernation. +*/ +dwc_handle_gpwrdn_disc_det (hsotg, gpwrdn); } }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 137/244 ttyprintk: Add TTY hangup callback.
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
[ Upstream commit c0070e1e60270f6a1e09442a9ab2335f3eaeaad2 ]
syzbot is reporting hung task due to flood of
tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__,
port->count);
message [1], for ioctl(TIOCVHANGUP) prevents tty_port_close() from decrementing port->count due to tty_hung_up_p() == true.
----------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i;
int fd[10];
for (i = 0; i < 10; i++)
fd[i] = open("/dev/ttyprintk", O_WRONLY);
ioctl(fd[0], TIOCVHANGUP);
for (i = 0; i < 10; i++)
close(fd[i]);
close(open("/dev/ttyprintk", O_WRONLY));
return 0;
}----------
When TTY hangup happens, port->count needs to be reset via "struct tty_operations"->hangup callback.
[1] https://syzkaller.appspot.com/bug?id=39ea6caa479af471183997376dc7e90bc7d64a6a
--- drivers/char/ttyprintk.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/char/ttyprintk.c +11 -0
@@ -158,12 +158,23 @@ static int tpk_ioctl(struct tty_struct *tty,return 0 ; } +/* +* TTY operations hangup function. +*/ +static void tpk_hangup (struct tty_struct *tty) +{ +struct ttyprintk_port *tpkp = tty->driver_data; + +tty_port_hangup (&tpkp->port); +} +static const struct tty_operations ttyprintk_ops = { .open = tpk_open, .close = tpk_close, .write = tpk_write, .write_room = tpk_write_room, .ioctl = tpk_ioctl, + .hangup = tpk_hangup, };static const struct tty_port_operations null_ops = { };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 138/244 xen-blkback: fix compatibility bug with single page rings
In reply to Greg Kroah-HartmanFrom: Paul Durrant <[email protected]>
[ Upstream commit d75e7f63b7c95c527cde42efb5d410d7f961498f ]
Prior to commit 4a8c31a1c6f5 ("xen/blkback: rework connect_ring() to avoid inconsistent xenstore 'ring-page-order' set by malicious blkfront"), the behaviour of xen-blkback when connecting to a frontend was:
- read 'ring-page-order'
- if not present then expect a single page ring specified by 'ring-ref'
- else expect a ring specified by 'ring-refX' where X is between 0 and 1 << ring-page-order
This was correct behaviour, but was broken by the afforementioned commit to become:
- read 'ring-page-order'
- if not present then expect a single page ring (i.e. ring-page-order = 0)
- expect a ring specified by 'ring-refX' where X is between 0 and 1 << ring-page-order
- if that didn't work then see if there's a single page ring specified by 'ring-ref'
This incorrect behaviour works most of the time but fails when a frontend that sets 'ring-page-order' is unloaded and replaced by one that does not because, instead of reading 'ring-ref', xen-blkback will read the stale 'ring-ref0' left around by the previous frontend will try to map the wrong grant reference.
This patch restores the original behaviour.
--- drivers/block/xen-blkback/common.h | 1 + drivers/block/xen-blkback/xenbus.c | 38 +++++++++++++----------------- 2 files changed, 17 insertions(+), 22 deletions(-)
drivers/block/xen-blkback/common.h +1 -0
@@ -316,6 +316,7 @@ struct xen_blkif {struct work_struct free_work;unsigned int nr_ring_pages; +bool multi_ref;/* All rings for this device. */ struct xen_blkif_ring *rings;unsigned int nr_rings;
drivers/block/xen-blkback/xenbus.c +16 -22
@@ -949,14 +949,17 @@ static int read_per_ring_refs(struct xen_blkif_ring *ring, const char *dir)for (i =0 ; i < nr_grefs; i++) {char ring_ref_name[RINGREF_NAME_LEN ]; -snprintf (ring_ref_name,RINGREF_NAME_LEN ,"ring-ref%u" , i); +if (blkif->multi_ref) +snprintf (ring_ref_name,RINGREF_NAME_LEN ,"ring-ref%u" , i); +else { +WARN_ON (i !=0 ); +snprintf (ring_ref_name,RINGREF_NAME_LEN ,"ring-ref" ); + } + err =xenbus_scanf (XBT_NIL , dir, ring_ref_name,"%u" , &ring_ref[i]);if (err !=1 ) { -if (nr_grefs ==1 ) -break ; - err = -EINVAL ;xenbus_dev_fatal (dev, err,"reading %s/%s" , dir, ring_ref_name);
@@ -964,18 +967,6 @@ static int read_per_ring_refs(struct xen_blkif_ring *ring, const char *dir) } } -if (err !=1 ) { -WARN_ON (nr_grefs !=1 ); - - err =xenbus_scanf (XBT_NIL , dir,"ring-ref" ,"%u" , - &ring_ref[0 ]); -if (err !=1 ) { - err = -EINVAL ; -xenbus_dev_fatal (dev, err,"reading %s/ring-ref" , dir); -return err; - } - } - err = -ENOMEM ;for (i =0 ; i < nr_grefs *XEN_BLKIF_REQS_PER_PAGE ; i++) { req =kzalloc (sizeof (*req),GFP_KERNEL );
@@ -1079,10 +1070,15 @@ static int connect_ring(struct backend_info *be) blkif->nr_rings, blkif->blk_protocol, protocol, pers_grants ? "persistent grants" : ""); - ring_page_order =xenbus_read_unsigned (dev->otherend, -"ring-page-order" ,0 ); - -if (ring_page_order > xen_blkif_max_ring_order) { + err =xenbus_scanf (XBT_NIL , dev->otherend,"ring-page-order" ,"%u" , + &ring_page_order); +if (err !=1 ) { + blkif->nr_ring_pages =1 ; + blkif->multi_ref = false; + }else if (ring_page_order <= xen_blkif_max_ring_order) { + blkif->nr_ring_pages =1 << ring_page_order; + blkif->multi_ref = true; + }else { err = -EINVAL ; xenbus_dev_fatal(dev, err, "requested ring page order %d exceed max:%d",
@@ -1091,8 +1087,6 @@ static int connect_ring(struct backend_info *be)return err; } - blkif->nr_ring_pages =1 << ring_page_order; -if (blkif->nr_rings ==1 )return read_per_ring_refs (&blkif->rings[0 ], dev->otherend);else {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 139/244 soc: aspeed: fix a ternary sign expansion bug
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 5ffa828534036348fa90fb3079ccc0972d202c4a ]
The intent here was to return negative error codes but it actually returns positive values. The problem is that type promotion with ternary operations is quite complicated.
"ret" is an int. "copied" is a u32. And the snoop_file_read() function returns long. What happens is that "ret" is cast to u32 and becomes positive then it's cast to long and it's still positive.
Fix this by removing the ternary so that "ret" is type promoted directly to long.
--- drivers/soc/aspeed/aspeed-lpc-snoop.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/soc/aspeed/aspeed-lpc-snoop.c +3 -1
@@ -95,8 +95,10 @@ static ssize_t snoop_file_read(struct file *file, char __user *buffer,return -EINTR ; } ret =kfifo_to_user (&chan->fifo, buffer, count, &copied); +if (ret) +return ret; -return ret ? ret : copied; +return copied; } static __poll_t snoop_file_poll(struct file *file,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 140/244 media: vivid: fix assignment of dev->fbuf_out_flags
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 5cde22fcc7271812a7944c47b40100df15908358 ]
Currently the chroma_flags and alpha_flags are being zero'd with a bit-wise mask and the following statement should be bit-wise or'ing in the new flag bits but instead is making a direct assignment. Fix this by using the |= operator rather than an assignment.
Addresses-Coverity: ("Unused value")
--- drivers/media/platform/vivid/vivid-vid-out.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/vivid/vivid-vid-out.c +1 -1
@@ -1025,7 +1025,7 @@ int vivid_vid_out_s_fbuf(struct file *file, void *fh,return -EINVAL ; } dev->fbuf_out_flags &= ~(chroma_flags | alpha_flags); - dev->fbuf_out_flags = a->flags & (chroma_flags | alpha_flags); + dev->fbuf_out_flags |= a->flags & (chroma_flags | alpha_flags);return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 141/244 media: omap4iss: return error code when omap4iss_get() failed
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 8938c48fa25b491842ece9eb38f0bea0fcbaca44 ]
If omap4iss_get() failed, it need return error code in iss_probe().
--- drivers/staging/media/omap4iss/iss.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/staging/media/omap4iss/iss.c +3 -1
@@ -1240,8 +1240,10 @@ static int iss_probe(struct platform_device *pdev)if (ret <0 ) goto error; -if (!omap4iss_get (iss)) +if (!omap4iss_get (iss)) { + ret = -EINVAL ; goto error; + } ret =iss_reset (iss);if (ret <0 )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 142/244 media: aspeed: fix clock handling logic
In reply to Greg Kroah-HartmanFrom: Jae Hyun Yoo <[email protected]>
[ Upstream commit 3536169f8531c2c5b153921dc7d1ac9fd570cda7 ]
Video engine uses eclk and vclk for its clock sources and its reset control is coupled with eclk so the current clock enabling sequence works like below.
Enable eclk
De-assert Video Engine reset
10ms delay
Enable vclk
It introduces improper reset on the Video Engine hardware and eventually the hardware generates unexpected DMA memory transfers that can corrupt memory region in random and sporadic patterns. This issue is observed very rarely on some specific AST2500 SoCs but it causes a critical kernel panic with making a various shape of signature so it's extremely hard to debug. Moreover, the issue is observed even when the video engine is not actively used because udevd turns on the video engine hardware for a short time to make a query in every boot.
To fix this issue, this commit changes the clock handling logic to make the reset de-assertion triggered after enabling both eclk and vclk. Also, it adds clk_unprepare call for a case when probe fails.
clk: ast2600: fix reset settings for eclk and vclk
Video engine reset setting should be coupled with eclk to match it with the setting for previous Aspeed SoCs which is defined in clk-aspeed.c since all Aspeed SoCs are sharing a single video engine driver. Also, reset bit 6 is defined as 'Video Engine' reset in datasheet so it should be de-asserted when eclk is enabled. This commit fixes the setting.
--- drivers/clk/clk-ast2600.c | 4 ++-- drivers/media/platform/aspeed-video.c | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-)
drivers/clk/clk-ast2600.c +2 -2
@@ -58,10 +58,10 @@ static void __iomem *scu_g6_base;static const struct aspeed_gate_data aspeed_g6_gates[] = {/* clk rst name parent flags */ [ASPEED_CLK_GATE_MCLK ] = {0 ,-1 ,"mclk-gate" ,"mpll" ,CLK_IS_CRITICAL },/* SDRAM */ - [ASPEED_CLK_GATE_ECLK ] = {1 ,-1 ,"eclk-gate" ,"eclk" ,0 },/* Video Engine */ + [ASPEED_CLK_GATE_ECLK ] = {1 ,6 ,"eclk-gate" ,"eclk" ,0 },/* Video Engine */ [ASPEED_CLK_GATE_GCLK ] = {2 ,7 ,"gclk-gate" ,NULL ,0 },/* 2D engine */ /* vclk parent - dclk/d1clk/hclk/mclk */ - [ASPEED_CLK_GATE_VCLK ] = {3 ,6 ,"vclk-gate" ,NULL ,0 },/* Video Capture */ + [ASPEED_CLK_GATE_VCLK ] = {3 ,-1 ,"vclk-gate" ,NULL ,0 },/* Video Capture */ [ASPEED_CLK_GATE_BCLK ] = {4 ,8 ,"bclk-gate" ,"bclk" ,0 },/* PCIe/PCI */ /* From dpll */ [ASPEED_CLK_GATE_DCLK ] = {5 ,-1 ,"dclk-gate" ,NULL ,CLK_IS_CRITICAL },/* DAC */
drivers/media/platform/aspeed-video.c +6 -3
@@ -491,8 +491,8 @@ static void aspeed_video_off(struct aspeed_video *video)aspeed_video_write (video,VE_INTERRUPT_STATUS ,0xffffffff );/* Turn off the relevant clocks */ -clk_disable (video->vclk);clk_disable (video->eclk); +clk_disable (video->vclk);clear_bit (VIDEO_CLOCKS_ON , &video->flags); }
@@ -503,8 +503,8 @@ static void aspeed_video_on(struct aspeed_video *video)return ;/* Turn on the relevant clocks */ -clk_enable (video->eclk);clk_enable (video->vclk); +clk_enable (video->eclk);set_bit (VIDEO_CLOCKS_ON , &video->flags); }
@@ -1684,8 +1684,11 @@ static int aspeed_video_probe(struct platform_device *pdev)return rc; rc =aspeed_video_setup_video (video); -if (rc) +if (rc) { +clk_unprepare (video->vclk); +clk_unprepare (video->eclk);return rc; + }return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 143/244 media: platform: sunxi: sun6i-csi: fix error return code of sun6i_video_start_streaming()
In reply to Greg Kroah-HartmanFrom: Jia-Ju Bai <[email protected]>
[ Upstream commit f3d384e36630e2a552d874e422835606d9cf230a ]
When sun6i_video_remote_subdev() returns NULL to subdev, no error return code of sun6i_video_start_streaming() is assigned.
To fix this bug, ret is assigned with -EINVAL in this case.
--- drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c +3 -1
@@ -151,8 +151,10 @@ static int sun6i_video_start_streaming(struct vb2_queue *vq, unsigned int count) } subdev =sun6i_video_remote_subdev (video,NULL ); -if (!subdev) +if (!subdev) { + ret = -EINVAL ; goto stop_media_pipeline; + } config.pixelformat = video->fmt.fmt.pix.pixelformat; config.code = video->mbus_code;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 144/244 media: m88rs6000t: avoid potential out-of-bounds reads on arrays
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 9baa3d64e8e2373ddd11c346439e5dfccb2cbb0d ]
There a 3 array for-loops that don't check the upper bounds of the index into arrays and this may lead to potential out-of-bounds reads. Fix this by adding array size upper bounds checks to be full safe.
Addresses-Coverity: ("Out-of-bounds read")
--- drivers/media/tuners/m88rs6000t.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/media/tuners/m88rs6000t.c +3 -3
@@ -525,7 +525,7 @@ static int m88rs6000t_get_rf_strength(struct dvb_frontend *fe, u16 *strength) PGA2_cri =PGA2_GC >>2 ; PGA2_crf =PGA2_GC &0x03 ; -for (i =0 ; i <=RF_GC ; i++) +for (i =0 ; i <=RF_GC && i <ARRAY_SIZE (RFGS ); i++)RFG +=RFGS [i];if (RF_GC ==0 )
@@ -537,12 +537,12 @@ static int m88rs6000t_get_rf_strength(struct dvb_frontend *fe, u16 *strength)if (RF_GC ==3 )RFG +=100 ; -for (i =0 ; i <=IF_GC ; i++) +for (i =0 ; i <=IF_GC && i <ARRAY_SIZE (IFGS ); i++)IFG +=IFGS [i];TIAG =TIA_GC *TIA_GS ; -for (i =0 ; i <=BB_GC ; i++) +for (i =0 ; i <=BB_GC && i <ARRAY_SIZE (BBGS ); i++)BBG +=BBGS [i];PGA2G = PGA2_cri * PGA2_cri_GS + PGA2_crf * PGA2_crf_GS;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 145/244 drm/amdkfd: fix build error with AMD_IOMMU_V2=m
In reply to Greg Kroah-HartmanFrom: Felix Kuehling <[email protected]>
[ Upstream commit 1e87068570a2cc4db5f95a881686add71729e769 ]
Using 'imply AMD_IOMMU_V2' does not guarantee that the driver can link against the exported functions. If the GPU driver is built-in but the IOMMU driver is a loadable module, the kfd_iommu.c file is indeed built but does not work:
x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_bind_process_to_device':
kfd_iommu.c:(.text+0x516): undefined reference to `amd_iommu_bind_pasid'
x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_unbind_process':
kfd_iommu.c:(.text+0x691): undefined reference to `amd_iommu_unbind_pasid'
x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_suspend':
kfd_iommu.c:(.text+0x966): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
x86_64-linux-ld: kfd_iommu.c:(.text+0x97f): undefined reference to `amd_iommu_set_invalid_ppr_cb'
x86_64-linux-ld: kfd_iommu.c:(.text+0x9a4): undefined reference to `amd_iommu_free_device'
x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_resume':
kfd_iommu.c:(.text+0xa9a): undefined reference to `amd_iommu_init_device'
x86_64-linux-ld: kfd_iommu.c:(.text+0xadc): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
x86_64-linux-ld: kfd_iommu.c:(.text+0xaff): undefined reference to `amd_iommu_set_invalid_ppr_cb'
x86_64-linux-ld: kfd_iommu.c:(.text+0xc72): undefined reference to `amd_iommu_bind_pasid'
x86_64-linux-ld: kfd_iommu.c:(.text+0xe08): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
x86_64-linux-ld: kfd_iommu.c:(.text+0xe26): undefined reference to `amd_iommu_set_invalid_ppr_cb'
x86_64-linux-ld: kfd_iommu.c:(.text+0xe42): undefined reference to `amd_iommu_free_device'
Use IS_REACHABLE to only build IOMMU-V2 support if the amd_iommu symbols are reachable by the amdkfd driver. Output a warning if they are not, because that may not be what the user was expecting.
--- drivers/gpu/drm/amd/amdkfd/kfd_iommu.c | 6 ++++++ drivers/gpu/drm/amd/amdkfd/kfd_iommu.h | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_iommu.c +6 -0
@@ -20,6 +20,10 @@* OTHER DEALINGS IN THE SOFTWARE. */ +#include <linux/kconfig.h> + +#if IS_REACHABLE (CONFIG_AMD_IOMMU_V2 ) +#include <linux/printk.h> #include <linux/device.h> #include <linux/slab.h>
@@ -358,3 +362,5 @@ int kfd_iommu_add_perf_counters(struct kfd_topology_device *kdev) return 0; } + +#endif
drivers/gpu/drm/amd/amdkfd/kfd_iommu.h +7 -2
@@ -23,7 +23,9 @@#ifndef __KFD_IOMMU_H__#define __KFD_IOMMU_H__ -#if defined(CONFIG_AMD_IOMMU_V2_MODULE ) || defined(CONFIG_AMD_IOMMU_V2 ) +#include <linux/kconfig.h> + +#if IS_REACHABLE (CONFIG_AMD_IOMMU_V2 )#define KFD_SUPPORT_IOMMU_V2
@@ -46,6 +48,9 @@ static inline int kfd_iommu_check_device(struct kfd_dev *kfd) }static inline int kfd_iommu_device_init (struct kfd_dev *kfd) { +#if IS_MODULE (CONFIG_AMD_IOMMU_V2 ) +WARN_ONCE (1 ,"iommu_v2 module is not usable by built-in KFD" ); +#endif return 0 ; }
@@ -73,6 +78,6 @@ static inline int kfd_iommu_add_perf_counters(struct kfd_topology_device *kdev)return 0 ; } -#endif /* defined(CONFIG_AMD_IOMMU_V2) */ +#endif /* IS_REACHABLE(CONFIG_AMD_IOMMU_V2) */ #endif /* __KFD_IOMMU_H__ */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 146/244 x86/kprobes: Fix to check non boostable prefixes correctly
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit 6dd3b8c9f58816a1354be39559f630cd1bd12159 ]
There are 2 bugs in the can_boost() function because of using x86 insn decoder. Since the insn->opcode never has a prefix byte, it can not find CS override prefix in it. And the insn->attr is the attribute of the opcode, thus inat_is_address_size_prefix( insn->attr) always returns false.
Fix those by checking each prefix bytes with for_each_insn_prefix loop and getting the correct attribute for each prefix byte. Also, this removes unlikely, because this is a slow path.
--- arch/x86/kernel/kprobes/core.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
arch/x86/kernel/kprobes/core.c +12 -5
@@ -157,6 +157,8 @@ NOKPROBE_SYMBOL(skip_prefixes);int can_boost (struct insn *insn,void *addr) {kprobe_opcode_t opcode; +insn_byte_t prefix; +int i;if (search_exception_tables ((unsigned long )addr))return 0 ;/* Page fault may occur on this address. */
@@ -169,9 +171,14 @@ int can_boost(struct insn *insn, void *addr)if (insn->opcode.nbytes !=1 )return 0 ; -/* Can't boost Address-size override prefix */ -if (unlikely (inat_is_address_size_prefix (insn->attr))) -return 0 ; +for_each_insn_prefix (insn, i, prefix) { +insn_attr_t attr; + + attr =inat_get_opcode_attribute (prefix); +/* Can't boost Address-size override prefix and CS override prefix */ +if (prefix ==0x2e ||inat_is_address_size_prefix (attr)) +return 0 ; + } opcode = insn->opcode.bytes[0 ];
@@ -196,8 +203,8 @@ int can_boost(struct insn *insn, void *addr)/* clear and set flags are boostable */ return (opcode ==0xf5 || (0xf7 < opcode && opcode <0xfe ));default : -/* CS override prefix and call are not boostable */ -return (opcode !=0x2e && opcode !=0x9a ); +/* call is not boostable */ +return opcode !=0x9a ; } }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 147/244 pata_arasan_cf: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit c7e8f404d56b99c80990b19a402c3f640d74be05 ]
The driver's probe() method is written as if platform_get_irq() returns 0 on error, while actually it returns a negative error code (with all the other values considered valid IRQs). Rewrite the driver's IRQ checking code to pass the positive IRQ #s to ata_host_activate(), propagate upstream -EPROBE_DEFER, and set up the driver to polling mode on (negative) errors and IRQ0 (libata treats IRQ #0 as a polling mode anyway)...
--- drivers/ata/pata_arasan_cf.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/ata/pata_arasan_cf.c +11 -4
@@ -817,12 +817,19 @@ static int arasan_cf_probe(struct platform_device *pdev)else quirk =CF_BROKEN_UDMA ;/* as it is on spear1340 */ -/* if irq is 0, support only PIO */ - acdev->irq =platform_get_irq (pdev,0 ); -if (acdev->irq) +/* +* If there's an error getting IRQ (or we do get IRQ0), +* support only PIO +*/ + ret =platform_get_irq (pdev,0 ); +if (ret >0 ) { + acdev->irq = ret; irq_handler = arasan_cf_interrupt; -else + }else if (ret == -EPROBE_DEFER ) { +return ret; + }else { quirk |=CF_BROKEN_MWDMA |CF_BROKEN_UDMA ; + } acdev->pbase = res->start; acdev->vbase = devm_ioremap_nocache(&pdev->dev, res->start,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 148/244 pata_ipx4xx_cf: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit e379b40cc0f179403ce0b82b7e539f635a568da5 ]
The driver's probe() method is written as if platform_get_irq() returns 0 on error, while actually it returns a negative error code (with all the other values considered valid IRQs). Rewrite the driver's IRQ checking code to pass the positive IRQ #s to ata_host_activate(), propagate errors upstream, and treat IRQ0 as error, returning -EINVAL, as the libata code treats 0 as an indication that polling should be used anyway...
--- drivers/ata/pata_ixp4xx_cf.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/ata/pata_ixp4xx_cf.c +5 -1
@@ -165,8 +165,12 @@ static int ixp4xx_pata_probe(struct platform_device *pdev)return -ENOMEM ; irq =platform_get_irq (pdev,0 ); -if (irq) +if (irq >0 )irq_set_irq_type (irq,IRQ_TYPE_EDGE_RISING ); +else if (irq <0 ) +return irq; +else +return -EINVAL ;/* Setup expansion bus chip selects */ *data->cs0_cfg = data->cs0_bits;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 149/244 sata_mv: add IRQ checks
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit e6471a65fdd5efbb8dd2732dd0f063f960685ceb ]
The function mv_platform_probe() neglects to check the results of the calls to platform_get_irq() and irq_of_parse_and_map() and blithely passes them to ata_host_activate() -- while the latter only checks for IRQ0 (treating it as a polling mode indicattion) and passes the negative values to devm_request_irq() causing it to fail as it takes unsigned values for the IRQ #...
Add to mv_platform_probe() the proper IRQ checks to pass the positive IRQ #s to ata_host_activate(), propagate upstream the negative error codes, and override the IRQ0 with -EINVAL (as we don't want the polling mode).
--- drivers/ata/sata_mv.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/ata/sata_mv.c +4 -0
@@ -4097,6 +4097,10 @@ static int mv_platform_probe(struct platform_device *pdev) n_ports = mv_platform_data->n_ports; irq =platform_get_irq (pdev,0 ); } +if (irq <0 ) +return irq; +if (!irq) +return -EINVAL ; host =ata_host_alloc_pinfo (&pdev->dev, ppi, n_ports); hpriv =devm_kzalloc (&pdev->dev,sizeof (*hpriv),GFP_KERNEL );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 150/244 ata: libahci_platform: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit b30d0040f06159de97ad9c0b1536f47250719d7d ]
Iff platform_get_irq() returns 0, ahci_platform_init_host() would return 0 early (as if the call was successful). Override IRQ0 with -EINVAL instead as the 'libata' regards 0 as "no IRQ" (thus polling) anyway...
--- drivers/ata/libahci_platform.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/ata/libahci_platform.c +3 -1
@@ -582,11 +582,13 @@ int ahci_platform_init_host(struct platform_device *pdev,int i, irq, n_ports, rc; irq =platform_get_irq (pdev,0 ); -if (irq <=0 ) { +if (irq <0 ) {if (irq != -EPROBE_DEFER )dev_err (dev,"no irq\n" );return irq; } +if (!irq) +return -EINVAL ; hpriv->irq = irq;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 151/244 nvme-tcp: block BH in sk state_change sk callback
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit 8b73b45d54a14588f86792869bfb23098ea254cb ]
The TCP stack can run from process context for a long time so we should disable BH here.
--- drivers/nvme/host/tcp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/nvme/host/tcp.c +2 -2
@@ -816,7 +816,7 @@ static void nvme_tcp_state_change(struct sock *sk) {struct nvme_tcp_queue *queue; -read_lock (&sk->sk_callback_lock); +read_lock_bh (&sk->sk_callback_lock); queue = sk->sk_user_data;if (!queue) goto done;
@@ -838,7 +838,7 @@ static void nvme_tcp_state_change(struct sock *sk) queue->state_change (sk); done: -read_unlock (&sk->sk_callback_lock); +read_unlock_bh (&sk->sk_callback_lock); }static inline void nvme_tcp_done_send_req (struct nvme_tcp_queue *queue)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 152/244 nvmet-tcp: fix incorrect locking in state_change sk callback
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit b5332a9f3f3d884a1b646ce155e664cc558c1722 ]
We are not changing anything in the TCP connection state so we should not take a write_lock but rather a read lock.
This caused a deadlock when running nvmet-tcp and nvme-tcp on the same system, where state_change callbacks on the host and on the controller side have causal relationship and made lockdep report on this with blktests:
================================
WARNING: inconsistent lock state
5.12.0-rc3 #1 Tainted: G I
--------------------------------
inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-R} usage.
nvme/1324 [HC0[0]:SC0[0]:HE1:SE1] takes:ffff888363151000 (clock-AF_INET){++-?}-{2:2}, at: nvme_tcp_state_change+0x21/0x150 [nvme_tcp] {IN-SOFTIRQ-W} state was registered at:
__lock_acquire+0x79b/0x18d0 lock_acquire+0x1ca/0x480 _raw_write_lock_bh+0x39/0x80 nvmet_tcp_state_change+0x21/0x170 [nvmet_tcp] tcp_fin+0x2a8/0x780 tcp_data_queue+0xf94/0x1f20 tcp_rcv_established+0x6ba/0x1f00 tcp_v4_do_rcv+0x502/0x760 tcp_v4_rcv+0x257e/0x3430 ip_protocol_deliver_rcu+0x69/0x6a0 ip_local_deliver_finish+0x1e2/0x2f0 ip_local_deliver+0x1a2/0x420 ip_rcv+0x4fb/0x6b0 __netif_receive_skb_one_core+0x162/0x1b0 process_backlog+0x1ff/0x770 __napi_poll.constprop.0+0xa9/0x5c0 net_rx_action+0x7b3/0xb30 __do_softirq+0x1f0/0x940 do_softirq+0xa1/0xd0 __local_bh_enable_ip+0xd8/0x100 ip_finish_output2+0x6b7/0x18a0 __ip_queue_xmit+0x706/0x1aa0 __tcp_transmit_skb+0x2068/0x2e20 tcp_write_xmit+0xc9e/0x2bb0 __tcp_push_pending_frames+0x92/0x310 inet_shutdown+0x158/0x300 __nvme_tcp_stop_queue+0x36/0x270 [nvme_tcp] nvme_tcp_stop_queue+0x87/0xb0 [nvme_tcp] nvme_tcp_teardown_admin_queue+0x69/0xe0 [nvme_tcp] nvme_do_delete_ctrl+0x100/0x10c [nvme_core] nvme_sysfs_delete.cold+0x8/0xd [nvme_core] kernfs_fop_write_iter+0x2c7/0x460 new_sync_write+0x36c/0x610 vfs_write+0x5c0/0x870 ksys_write+0xf9/0x1d0 do_syscall_64+0x33/0x40 entry_SYSCALL_64_after_hwframe+0x44/0xae irq event stamp: 10687 hardirqs last enabled at (10687): [<ffffffff9ec376bd>] _raw_spin_unlock_irqrestore+0x2d/0x40 hardirqs last disabled at (10686): [<ffffffff9ec374d8>] _raw_spin_lock_irqsave+0x68/0x90 softirqs last enabled at (10684): [<ffffffff9f000608>] __do_softirq+0x608/0x940 softirqs last disabled at (10649): [<ffffffff9cdedd31>] do_softirq+0xa1/0xd0
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(clock-AF_INET);
<Interrupt>
lock(clock-AF_INET);*** DEADLOCK ***
5 locks held by nvme/1324:
#0: ffff8884a01fe470 (sb_writers#4){.+.+}-{0:0}, at: ksys_write+0xf9/0x1d0
#1: ffff8886e435c090 (&of->mutex){+.+.}-{3:3}, at: kernfs_fop_write_iter+0x216/0x460 #2: ffff888104d90c38 (kn->active#255){++++}-{0:0}, at: kernfs_remove_self+0x22d/0x330 #3: ffff8884634538d0 (&queue->queue_lock){+.+.}-{3:3}, at: nvme_tcp_stop_queue+0x52/0xb0 [nvme_tcp] #4: ffff888363150d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: inet_shutdown+0x59/0x300
stack backtrace: CPU: 26 PID: 1324 Comm: nvme Tainted: G I 5.12.0-rc3 #1 Hardware name: Dell Inc. PowerEdge R640/06NR82, BIOS 2.10.0 11/12/2020 Call Trace: dump_stack+0x93/0xc2 mark_lock_irq.cold+0x2c/0xb3 ? verify_lock_unused+0x390/0x390 ? stack_trace_consume_entry+0x160/0x160 ? lock_downgrade+0x100/0x100 ? save_trace+0x88/0x5e0 ? _raw_spin_unlock_irqrestore+0x2d/0x40 mark_lock+0x530/0x1470 ? mark_lock_irq+0x1d10/0x1d10 ? enqueue_timer+0x660/0x660 mark_usage+0x215/0x2a0 __lock_acquire+0x79b/0x18d0 ? tcp_schedule_loss_probe.part.0+0x38c/0x520 lock_acquire+0x1ca/0x480 ? nvme_tcp_state_change+0x21/0x150 [nvme_tcp] ? rcu_read_unlock+0x40/0x40 ? tcp_mtu_probe+0x1ae0/0x1ae0 ? kmalloc_reserve+0xa0/0xa0 ? sysfs_file_ops+0x170/0x170 _raw_read_lock+0x3d/0xa0 ? nvme_tcp_state_change+0x21/0x150 [nvme_tcp] nvme_tcp_state_change+0x21/0x150 [nvme_tcp] ? sysfs_file_ops+0x170/0x170 inet_shutdown+0x189/0x300 __nvme_tcp_stop_queue+0x36/0x270 [nvme_tcp] nvme_tcp_stop_queue+0x87/0xb0 [nvme_tcp] nvme_tcp_teardown_admin_queue+0x69/0xe0 [nvme_tcp] nvme_do_delete_ctrl+0x100/0x10c [nvme_core] nvme_sysfs_delete.cold+0x8/0xd [nvme_core] kernfs_fop_write_iter+0x2c7/0x460 new_sync_write+0x36c/0x610 ? new_sync_read+0x600/0x600 ? lock_acquire+0x1ca/0x480 ? rcu_read_unlock+0x40/0x40 ? lock_is_held_type+0x9a/0x110 vfs_write+0x5c0/0x870 ksys_write+0xf9/0x1d0 ? __ia32_sys_read+0xa0/0xa0 ? lockdep_hardirqs_on_prepare.part.0+0x198/0x340 ? syscall_enter_from_user_mode+0x27/0x70 do_syscall_64+0x33/0x40 entry_SYSCALL_64_after_hwframe+0x44/0xae
--- drivers/nvme/target/tcp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/nvme/target/tcp.c +2 -2
@@ -1402,7 +1402,7 @@ static void nvmet_tcp_state_change(struct sock *sk) {struct nvmet_tcp_queue *queue; -write_lock_bh (&sk->sk_callback_lock); +read_lock_bh (&sk->sk_callback_lock); queue = sk->sk_user_data;if (!queue) goto done;
@@ -1420,7 +1420,7 @@ static void nvmet_tcp_state_change(struct sock *sk) queue->idx, sk->sk_state); } done: -write_unlock_bh (&sk->sk_callback_lock); +read_unlock_bh (&sk->sk_callback_lock); }static int nvmet_tcp_set_queue_sock (struct nvmet_tcp_queue *queue)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 153/244 nvme: retrigger ANA log update if group descriptor isnt found
In reply to Greg Kroah-HartmanFrom: Hannes Reinecke <[email protected]>
[ Upstream commit dd8f7fa908f66dd44abcd83cbb50410524b9f8ef ]
If ANA is enabled but no ANA group descriptor is found when creating a new namespace the ANA log is most likely out of date, so trigger a re-read. The namespace will be tagged with the NS_ANA_PENDING flag to exclude it from path selection until the ANA log has been re-read.
--- drivers/nvme/host/multipath.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/nvme/host/multipath.c +4 -0
@@ -677,6 +677,10 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id)if (desc.state) {/* found the group desc: update */ nvme_update_ns_ana_state (&desc, ns); + }else { +/* group desc not found: trigger a re-read */ +set_bit (NVME_NS_ANA_PENDING , &ns->flags); +queue_work (nvme_wq, &ns->ctrl->ana_work); } }else { ns->ana_state =NVME_ANA_OPTIMIZED ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 154/244 media: v4l2-ctrls.c: fix race condition in hdl->requests list
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit be7e8af98f3af729aa9f08b1053f9533a5cceb91 ]
When a request is re-inited it will release all control handler objects that are still in the request. It does that by unbinding and putting all those objects. When the object is unbound the obj->req pointer is set to NULL, and the object's unbind op is called. When the object it put the object's release op is called to free the memory.
For a request object that contains a control handler that means that v4l2_ctrl_handler_free() is called in the release op.
A control handler used in a request has a pointer to the main control handler that is created by the driver and contains the current state of all controls. If the device is unbound (due to rmmod or a forced unbind), then that main handler is freed, again by calling v4l2_ctrl_handler_free(), and any outstanding request objects that refer to that main handler have to be unbound and put as well.
It does that by this test:
if (!hdl->req_obj.req && !list_empty(&hdl->requests)) {I.e. the handler has no pointer to a request, so is the main handler, and one or more request objects refer to this main handler.
However, this test is wrong since hdl->req_obj.req is actually NULL when re-initing a request (the object unbind will set req to NULL), and the only reason this seemingly worked is that the requests list is typically empty since the request's unbind op will remove the handler from the requests list.
But if another thread is at the same time adding a new control to a request, then there is a race condition where one thread is removing a control handler object from the requests list and another thread is adding one. The result is that hdl->requests is no longer empty and the code thinks that a main handler is being freed instead of a control handler that is part of a request.
There are two bugs here: first the test for hdl->req_obj.req: this should be hdl->req_obj.ops since only the main control handler will have a NULL pointer there.
The second is that adding or deleting request objects from the requests list of the main handler isn't protected by taking the main handler's lock.
--- drivers/media/v4l2-core/v4l2-ctrls.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/media/v4l2-core/v4l2-ctrls.c +14 -3
@@ -2155,7 +2155,15 @@ void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)if (hdl ==NULL || hdl->buckets ==NULL )return ; -if (!hdl->req_obj.req && !list_empty (&hdl->requests)) { +/* +* If the main handler is freed and it is used by handler objects in +* outstanding requests, then unbind and put those objects before +* freeing the main handler. +* +* The main handler can be identified by having a NULL ops pointer in +* the request object. +*/ +if (!hdl->req_obj.ops && !list_empty (&hdl->requests)) {struct v4l2_ctrl_handler *req, *next_req;list_for_each_entry_safe (req, next_req, &hdl->requests, requests) {
@@ -3186,8 +3194,8 @@ static void v4l2_ctrl_request_unbind(struct media_request_object *obj) container_of(obj, struct v4l2_ctrl_handler, req_obj);struct v4l2_ctrl_handler *main_hdl = obj->priv; -list_del_init (&hdl->requests);mutex_lock (main_hdl->lock); +list_del_init (&hdl->requests);if (hdl->request_is_queued) {list_del_init (&hdl->requests_queued); hdl->request_is_queued = false;
@@ -3246,8 +3254,11 @@ static int v4l2_ctrl_request_bind(struct media_request *req,if (!ret) { ret =media_request_object_bind (req, &req_ops, from, false, &hdl->req_obj); -if (!ret) +if (!ret) { +mutex_lock (from->lock);list_add_tail (&hdl->requests, &from->requests); +mutex_unlock (from->lock); + } }return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 155/244 vfio/mdev: Do not allow a mdev_type to have a NULL parent pointer
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit b5a1f8921d5040bb788492bf33a66758021e4be5 ]
There is a small race where the parent is NULL even though the kobj has already been made visible in sysfs.
For instance the attribute_group is made visible in sysfs_create_files() and the mdev_type_attr_show() does:
ret = attr->show(kobj, type->parent->dev, buf);
Which will crash on NULL parent. Move the parent setup to before the type pointer leaves the stack frame.
Message-Id: <[email protected]>
--- drivers/vfio/mdev/mdev_sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/vfio/mdev/mdev_sysfs.c +1 -1
@@ -105,6 +105,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,return ERR_PTR (-ENOMEM ); type->kobj.kset = parent->mdev_types_kset; + type->parent = parent; ret = kobject_init_and_add(&type->kobj, &mdev_type_ktype, NULL, "%s-%s", dev_driver_string(parent->dev),
@@ -132,7 +133,6 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, } type->group = group; - type->parent = parent;return type; attrs_failed:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 156/244 clk: zynqmp: move zynqmp_pll_set_mode out of round_rate callback
In reply to Greg Kroah-HartmanFrom: Quanyang Wang <[email protected]>
[ Upstream commit d7fd3f9f53df8bb2212dff70f66f12cae0e1a653 ]
The round_rate callback should only perform rate calculation and not involve calling zynqmp_pll_set_mode to change the pll mode. So let's move zynqmp_pll_set_mode out of round_rate and to set_rate callback.
--- drivers/clk/zynqmp/pll.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/clk/zynqmp/pll.c +6 -6
@@ -103,9 +103,7 @@ static long zynqmp_pll_round_rate(struct clk_hw *hw, unsigned long rate,/* Enable the fractional mode if needed */ rate_div = (rate *FRAC_DIV ) / *prate; f = rate_div %FRAC_DIV ; -zynqmp_pll_set_mode (hw, !!f); - -if (zynqmp_pll_get_mode (hw) ==PLL_MODE_FRAC ) { +if (f) {if (rate >PS_PLL_VCO_MAX ) { fbdiv = rate /PS_PLL_VCO_MAX ; rate = rate / (fbdiv +1 );
@@ -179,10 +177,12 @@ static int zynqmp_pll_set_rate(struct clk_hw *hw, unsigned long rate,int ret;const struct zynqmp_eemi_ops *eemi_ops =zynqmp_pm_get_eemi_ops (); -if (zynqmp_pll_get_mode (hw) ==PLL_MODE_FRAC ) { - rate_div = (rate *FRAC_DIV ) / parent_rate; + rate_div = (rate *FRAC_DIV ) / parent_rate; + f = rate_div %FRAC_DIV ; +zynqmp_pll_set_mode (hw, !!f); + +if (f) { m = rate_div /FRAC_DIV ; - f = rate_div %FRAC_DIV ; m =clamp_t (u32, m, (PLL_FBDIV_MIN ), (PLL_FBDIV_MAX )); rate = parent_rate * m; frac = (parent_rate * f) /FRAC_DIV ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 157/244 clk: qcom: a53-pll: Add missing MODULE_DEVICE_TABLE
In reply to Greg Kroah-HartmanFrom: Chen Hui <[email protected]>
[ Upstream commit 790b516ada10a4dcc0f0a56dc0ced475d86d5820 ]
CONFIG_QCOM_A53PLL is tristate option and therefore this driver can be compiled as a module. This patch adds missing MODULE_DEVICE_TABLE definition which generates correct modalias for automatic loading of this driver when it is built as an external module.
--- drivers/clk/qcom/a53-pll.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/a53-pll.c +1 -0
@@ -93,6 +93,7 @@ static const struct of_device_id qcom_a53pll_match_table[] = { { .compatible = "qcom,msm8916-a53pll" }, { } }; +MODULE_DEVICE_TABLE (of, qcom_a53pll_match_table);static struct platform_driver qcom_a53pll_driver = { .probe = qcom_a53pll_probe,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 158/244 clk: uniphier: Fix potential infinite loop
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit f6b1340dc751a6caa2a0567b667d0f4f4172cd58 ]
The for-loop iterates with a u8 loop counter i and compares this with the loop upper limit of num_parents that is an int type. There is a potential infinite loop if num_parents is larger than the u8 loop counter. Fix this by making the loop counter the same type as num_parents. Also make num_parents an unsigned int to match the return type of the call to clk_hw_get_num_parents.
Addresses-Coverity: ("Infinite loop")
--- drivers/clk/uniphier/clk-uniphier-mux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/uniphier/clk-uniphier-mux.c +2 -2
@@ -31,10 +31,10 @@ static int uniphier_clk_mux_set_parent(struct clk_hw *hw, u8 index)static u8 uniphier_clk_mux_get_parent (struct clk_hw *hw) {struct uniphier_clk_mux *mux =to_uniphier_clk_mux (hw); -int num_parents =clk_hw_get_num_parents (hw); +unsigned int num_parents =clk_hw_get_num_parents (hw);int ret;unsigned int val; -u8 i; +unsigned int i; ret =regmap_read (mux->regmap, mux->reg, &val);if (ret)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 159/244 scsi: hisi_sas: Fix IRQ checks
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 6c11dc060427e07ca144eacaccd696106b361b06 ]
Commit df2d8213d9e3 ("hisi_sas: use platform_get_irq()") failed to take into account that irq_of_parse_and_map() and platform_get_irq() have a different way of indicating an error: the former returns 0 and the latter returns a negative error code. Fix up the IRQ checks!
--- drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +3 -3
@@ -1645,7 +1645,7 @@ static int interrupt_init_v1_hw(struct hisi_hba *hisi_hba) idx = i *HISI_SAS_PHY_INT_NR ;for (j =0 ; j <HISI_SAS_PHY_INT_NR ; j++, idx++) { irq =platform_get_irq (pdev, idx); -if (!irq) { +if (irq <0 ) {dev_err (dev,"irq init: fail map phy interrupt %d\n" , idx);return -ENOENT ;
@@ -1664,7 +1664,7 @@ static int interrupt_init_v1_hw(struct hisi_hba *hisi_hba) idx = hisi_hba->n_phy *HISI_SAS_PHY_INT_NR ;for (i =0 ; i < hisi_hba->queue_count; i++, idx++) { irq =platform_get_irq (pdev, idx); -if (!irq) { +if (irq <0 ) {dev_err (dev,"irq init: could not map cq interrupt %d\n" , idx);return -ENOENT ;
@@ -1682,7 +1682,7 @@ static int interrupt_init_v1_hw(struct hisi_hba *hisi_hba) idx = (hisi_hba->n_phy *HISI_SAS_PHY_INT_NR ) + hisi_hba->queue_count;for (i =0 ; i <HISI_SAS_FATAL_INT_NR ; i++, idx++) { irq =platform_get_irq (pdev, idx); -if (!irq) { +if (irq <0 ) {dev_err (dev,"irq init: could not map fatal interrupt %d\n" , idx);return -ENOENT ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 160/244 scsi: jazz_esp: Add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 38fca15c29db6ed06e894ac194502633e2a7d1fb ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding the real error code. Stop calling request_irq() with the invalid IRQ #s.
--- drivers/scsi/jazz_esp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/jazz_esp.c +3 -1
@@ -143,7 +143,9 @@ static int esp_jazz_probe(struct platform_device *dev)if (!esp->command_block) goto fail_unmap_regs; - host->irq =platform_get_irq (dev,0 ); + host->irq = err =platform_get_irq (dev,0 ); +if (err <0 ) + goto fail_unmap_command_block; err =request_irq (host->irq, scsi_esp_intr,IRQF_SHARED ,"ESP" , esp);if (err <0 ) goto fail_unmap_command_block;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 161/244 scsi: sun3x_esp: Add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 14b321380eb333c82853d7d612d0995f05f88fdc ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding the real error code. Stop calling request_irq() with the invalid IRQ #s.
--- drivers/scsi/sun3x_esp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/sun3x_esp.c +3 -1
@@ -206,7 +206,9 @@ static int esp_sun3x_probe(struct platform_device *dev)if (!esp->command_block) goto fail_unmap_regs_dma; - host->irq =platform_get_irq (dev,0 ); + host->irq = err =platform_get_irq (dev,0 ); +if (err <0 ) + goto fail_unmap_command_block; err =request_irq (host->irq, scsi_esp_intr,IRQF_SHARED ,"SUN3X ESP" , esp);if (err <0 )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 162/244 scsi: sni_53c710: Add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 1160d61bc51e87e509cfaf9da50a0060f67b6de4 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #s), causing it to fail with -EINVAL (overridden by -ENODEV further below). Stop calling request_irq() with the invalid IRQ #s.
--- drivers/scsi/sni_53c710.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/scsi/sni_53c710.c +4 -1
@@ -59,6 +59,7 @@ static int snirm710_probe(struct platform_device *dev)struct NCR_700_Host_Parameters *hostdata;struct Scsi_Host *host;struct resource *res; +int rc; res =platform_get_resource (dev,IORESOURCE_MEM ,0 );if (!res)
@@ -84,7 +85,9 @@ static int snirm710_probe(struct platform_device *dev) goto out_kfree; host->this_id =7 ; host->base = base; - host->irq =platform_get_irq (dev,0 ); + host->irq = rc =platform_get_irq (dev,0 ); +if (rc <0 ) + goto out_put_host;if (request_irq (host->irq, NCR_700_intr,IRQF_SHARED ,"snirm710" , host)) {printk (KERN_ERR "snirm710: request_irq failed!\n" ); goto out_put_host;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 163/244 scsi: ibmvfc: Fix invalid state machine BUG_ON()
In reply to Greg Kroah-HartmanFrom: Brian King <[email protected]>
[ Upstream commit 15cfef8623a449d40d16541687afd58e78033be3 ]
This fixes an issue hitting the BUG_ON() in ibmvfc_do_work(). When going through a host action of IBMVFC_HOST_ACTION_RESET, we change the action to IBMVFC_HOST_ACTION_TGT_DEL, then drop the host lock, and reset the CRQ, which changes the host state to IBMVFC_NO_CRQ. If, prior to setting the host state to IBMVFC_NO_CRQ, ibmvfc_init_host() is called, it can then end up changing the host action to IBMVFC_HOST_ACTION_INIT. If we then change the host state to IBMVFC_NO_CRQ, we will then hit the BUG_ON().
Make a couple of changes to avoid this. Leave the host action to be IBMVFC_HOST_ACTION_RESET or IBMVFC_HOST_ACTION_REENABLE until after we drop the host lock and reset or reenable the CRQ. Also harden the host state machine to ensure we cannot leave the reset / reenable state until we've finished processing the reset or reenable.
--- drivers/scsi/ibmvscsi/ibmvfc.c | 57 ++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 19 deletions(-)
drivers/scsi/ibmvscsi/ibmvfc.c +38 -19
@@ -493,8 +493,17 @@ static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,if (vhost->action ==IBMVFC_HOST_ACTION_ALLOC_TGTS ) vhost->action = action;break ; +case IBMVFC_HOST_ACTION_REENABLE : +case IBMVFC_HOST_ACTION_RESET : + vhost->action = action; +break ;case IBMVFC_HOST_ACTION_INIT :case IBMVFC_HOST_ACTION_TGT_DEL : +case IBMVFC_HOST_ACTION_LOGO : +case IBMVFC_HOST_ACTION_QUERY_TGTS : +case IBMVFC_HOST_ACTION_TGT_DEL_FAILED : +case IBMVFC_HOST_ACTION_NONE : +default :switch (vhost->action) {case IBMVFC_HOST_ACTION_RESET :case IBMVFC_HOST_ACTION_REENABLE :
@@ -504,15 +513,6 @@ static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,break ; }break ; -case IBMVFC_HOST_ACTION_LOGO : -case IBMVFC_HOST_ACTION_QUERY_TGTS : -case IBMVFC_HOST_ACTION_TGT_DEL_FAILED : -case IBMVFC_HOST_ACTION_NONE : -case IBMVFC_HOST_ACTION_RESET : -case IBMVFC_HOST_ACTION_REENABLE : -default : - vhost->action = action; -break ; } }
@@ -4339,26 +4339,45 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)case IBMVFC_HOST_ACTION_INIT_WAIT :break ;case IBMVFC_HOST_ACTION_RESET : - vhost->action =IBMVFC_HOST_ACTION_TGT_DEL ;spin_unlock_irqrestore (vhost->host->host_lock, flags); rc =ibmvfc_reset_crq (vhost); +spin_lock_irqsave (vhost->host->host_lock, flags); -if (rc ==H_CLOSED ) +if (!rc || rc ==H_CLOSED )vio_enable_interrupts (to_vio_dev (vhost->dev)); -if (rc || (rc =ibmvfc_send_crq_init (vhost)) || - (rc =vio_enable_interrupts (to_vio_dev (vhost->dev)))) { -ibmvfc_link_down (vhost,IBMVFC_LINK_DEAD ); -dev_err (vhost->dev,"Error after reset (rc=%d)\n" , rc); +if (vhost->action ==IBMVFC_HOST_ACTION_RESET ) { +/* +* The only action we could have changed to would have +* been reenable, in which case, we skip the rest of +* this path and wait until we've done the re-enable +* before sending the crq init. +*/ + vhost->action =IBMVFC_HOST_ACTION_TGT_DEL ; + +if (rc || (rc =ibmvfc_send_crq_init (vhost)) || + (rc =vio_enable_interrupts (to_vio_dev (vhost->dev)))) { +ibmvfc_link_down (vhost,IBMVFC_LINK_DEAD ); +dev_err (vhost->dev,"Error after reset (rc=%d)\n" , rc); + } }break ;case IBMVFC_HOST_ACTION_REENABLE : - vhost->action =IBMVFC_HOST_ACTION_TGT_DEL ;spin_unlock_irqrestore (vhost->host->host_lock, flags); rc =ibmvfc_reenable_crq_queue (vhost); +spin_lock_irqsave (vhost->host->host_lock, flags); -if (rc || (rc =ibmvfc_send_crq_init (vhost))) { -ibmvfc_link_down (vhost,IBMVFC_LINK_DEAD ); -dev_err (vhost->dev,"Error after enable (rc=%d)\n" , rc); +if (vhost->action ==IBMVFC_HOST_ACTION_REENABLE ) { +/* +* The only action we could have changed to would have +* been reset, in which case, we skip the rest of this +* path and wait until we've done the reset before +* sending the crq init. +*/ + vhost->action =IBMVFC_HOST_ACTION_TGT_DEL ; +if (rc || (rc =ibmvfc_send_crq_init (vhost))) { +ibmvfc_link_down (vhost,IBMVFC_LINK_DEAD ); +dev_err (vhost->dev,"Error after enable (rc=%d)\n" , rc); + } }break ;case IBMVFC_HOST_ACTION_LOGO :
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 164/244 mfd: stm32-timers: Avoid clearing auto reload register
In reply to Greg Kroah-HartmanFrom: Fabrice Gasnier <[email protected]>
[ Upstream commit 4917e498c6894ba077867aff78f82cffd5ffbb5c ]
The ARR register is cleared unconditionally upon probing, after the maximum value has been read. This initial condition is rather not intuitive, when considering the counter child driver. It rather expects the maximum value by default:
- The counter interface shows a zero value by default for 'ceiling' attribute.
- Enabling the counter without any prior configuration makes it doesn't count.
The reset value of ARR register is the maximum. So Choice here is to backup it, and restore it then, instead of clearing its value. It also fixes the initial condition seen by the counter driver.
--- drivers/mfd/stm32-timers.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/mfd/stm32-timers.c +6 -1
@@ -158,13 +158,18 @@ static const struct regmap_config stm32_timers_regmap_cfg = {static void stm32_timers_get_arr_size (struct stm32_timers *ddata) { +u32 arr; + +/* Backup ARR to restore it after getting the maximum value */ +regmap_read (ddata->regmap,TIM_ARR , &arr); +/* * Only the available bits will be written so when readback * we get the maximum value of auto reload register */ regmap_write (ddata->regmap,TIM_ARR , ~0L );regmap_read (ddata->regmap,TIM_ARR , &ddata->max_arr); -regmap_write (ddata->regmap,TIM_ARR ,0x0 ); +regmap_write (ddata->regmap,TIM_ARR , arr); } static void stm32_timers_dma_probe(struct device *dev,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 165/244 nvme-pci: dont simple map sgl when sgls are disabled
In reply to Greg Kroah-HartmanFrom: Niklas Cassel <[email protected]>
[ Upstream commit e51183be1fa96dc6d3cd11b3c25a0f595807315e ]
According to the module parameter description for sgl_threshold, a value of 0 means that SGLs are disabled.
If SGLs are disabled, we should respect that, even for the case where the request is made up of a single physical segment.
--- drivers/nvme/host/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/pci.c +1 -1
@@ -838,7 +838,7 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,return nvme_setup_prp_simple (dev, req, &cmnd->rw, &bv); -if (iod->nvmeq->qid && +if (iod->nvmeq->qid && sgl_threshold && dev->ctrl.sgls & ((1 <<0 ) | (1 <<1 )))return nvme_setup_sgl_simple (dev, req, &cmnd->rw, &bv);
Signature · 1 line
2.30.2