Linux 5.15.105
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.105 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/boot/dts/e60k02.dtsi | 1 arch/arm/boot/dts/imx6sl-tolino-shine2hd.dts | 1 arch/arm64/boot/dts/freescale/imx8mm-nitrogen-r2.dts | 2 arch/arm64/boot/dts/freescale/imx8mn.dtsi | 5 arch/m68k/kernel/traps.c | 4 arch/riscv/Kconfig | 22 + arch/riscv/Makefile | 10 arch/riscv/include/asm/tlbflush.h | 2 arch/riscv/include/uapi/asm/setup.h | 8 arch/riscv/mm/context.c | 2 arch/riscv/mm/tlbflush.c | 2 arch/sh/include/asm/processor_32.h | 1 arch/sh/kernel/signal_32.c | 3 arch/x86/kvm/hyperv.c | 15 - drivers/acpi/x86/utils.c | 37 +-- drivers/atm/idt77252.c | 11 drivers/bluetooth/btqcomsmd.c | 17 + drivers/bluetooth/btsdio.c | 1 drivers/firmware/arm_scmi/mailbox.c | 37 +++ drivers/firmware/efi/sysfb_efi.c | 5 drivers/firmware/sysfb.c | 4 drivers/firmware/sysfb_simplefb.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 15 + drivers/gpu/drm/amd/amdgpu/nv.c | 2 drivers/gpu/drm/amd/amdgpu/vi.c | 17 - drivers/gpu/drm/bridge/lontium-lt8912b.c | 4 drivers/gpu/drm/i915/display/intel_display.c | 1 drivers/gpu/drm/i915/gt/intel_gt.c | 4 drivers/gpu/drm/i915/i915_active.c | 3 drivers/gpu/drm/meson/meson_drv.c | 13 - drivers/gpu/drm/tiny/cirrus.c | 2 drivers/hid/hid-cp2112.c | 1 drivers/hid/intel-ish-hid/ipc/ipc.c | 9 drivers/hwmon/hwmon.c | 7 drivers/hwmon/it87.c | 4 drivers/i2c/busses/i2c-hisi.c | 6 drivers/i2c/busses/i2c-imx-lpi2c.c | 4 drivers/i2c/busses/i2c-xgene-slimpro.c | 3 drivers/interconnect/qcom/osm-l3.c | 2 drivers/md/dm-crypt.c | 16 - drivers/md/dm-stats.c | 7 drivers/md/dm-stats.h | 2 drivers/md/dm-thin.c | 2 drivers/md/dm.c | 4 drivers/net/dsa/b53/b53_mmap.c | 2 drivers/net/dsa/mt7530.c | 49 ++-- drivers/net/ethernet/google/gve/gve_ethtool.c | 5 drivers/net/ethernet/intel/i40e/i40e_txrx.c | 8 drivers/net/ethernet/intel/iavf/iavf_common.c | 2 drivers/net/ethernet/intel/iavf/iavf_main.c | 5 drivers/net/ethernet/intel/iavf/iavf_txrx.c | 2 drivers/net/ethernet/intel/igb/igb_main.c | 2 drivers/net/ethernet/intel/igbvf/netdev.c | 8 drivers/net/ethernet/intel/igbvf/vf.c | 13 - drivers/net/ethernet/intel/igc/igc_main.c | 20 - drivers/net/ethernet/marvell/octeontx2/nic/otx2_vf.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 6 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 6 drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c | 3 drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 1 drivers/net/ethernet/natsemi/sonic.c | 4 drivers/net/ethernet/qlogic/qed/qed_sriov.c | 5 drivers/net/ethernet/qualcomm/emac/emac.c | 6 drivers/net/ethernet/toshiba/ps3_gelic_net.c | 41 +-- drivers/net/ethernet/toshiba/ps3_gelic_net.h | 5 drivers/net/ethernet/xircom/xirc2ps_cs.c | 5 drivers/net/ieee802154/ca8210.c | 2 drivers/net/mdio/acpi_mdio.c | 10 drivers/net/mdio/mdio-thunder.c | 1 drivers/net/mdio/of_mdio.c | 12 - drivers/net/phy/mdio_devres.c | 11 drivers/net/phy/phy.c | 23 + drivers/net/usb/cdc_mbim.c | 5 drivers/net/usb/qmi_wwan.c | 1 drivers/net/usb/smsc95xx.c | 6 drivers/platform/chrome/cros_ec_chardev.c | 2 drivers/power/supply/bq24190_charger.c | 64 +---- drivers/power/supply/da9150-charger.c | 1 drivers/scsi/device_handler/scsi_dh_alua.c | 6 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 drivers/scsi/lpfc/lpfc_init.c | 2 drivers/scsi/lpfc/lpfc_sli.c | 12 - drivers/scsi/qla2xxx/qla_isr.c | 3 drivers/scsi/qla2xxx/qla_os.c | 11 drivers/scsi/scsi_devinfo.c | 1 drivers/scsi/storvsc_drv.c | 16 + drivers/scsi/ufs/ufshcd.c | 1 drivers/target/iscsi/iscsi_target_parameters.c | 12 - drivers/tee/amdtee/core.c | 29 +- drivers/thunderbolt/nhi.c | 49 ++-- drivers/thunderbolt/nhi_regs.h | 6 drivers/thunderbolt/retimer.c | 23 + drivers/thunderbolt/sb_regs.h | 1 drivers/thunderbolt/switch.c | 4 drivers/thunderbolt/tb.h | 1 drivers/thunderbolt/usb4.c | 36 ++- drivers/tty/hvc/hvc_xen.c | 19 + drivers/tty/serial/8250/Kconfig | 4 drivers/tty/serial/fsl_lpuart.c | 19 - drivers/usb/cdns3/cdns3-pci-wrap.c | 5 drivers/usb/cdns3/cdnsp-ep0.c | 19 - drivers/usb/cdns3/cdnsp-pci.c | 27 -- drivers/usb/chipidea/ci.h | 2 drivers/usb/chipidea/core.c | 11 drivers/usb/chipidea/otg.c | 5 drivers/usb/dwc2/platform.c | 16 - drivers/usb/gadget/function/u_audio.c | 2 drivers/usb/storage/unusual_uas.h | 7 drivers/usb/typec/tcpm/tcpm.c | 19 + drivers/usb/typec/ucsi/ucsi.c | 11 fs/cifs/cifs_debug.c | 5 fs/cifs/smb2ops.c | 2 fs/ksmbd/connection.c | 7 fs/ksmbd/smb2pdu.c | 20 + fs/ksmbd/smb_common.c | 27 +- fs/ksmbd/smb_common.h | 30 -- fs/lockd/clnt4xdr.c | 9 fs/lockd/xdr4.c | 13 + fs/nfsd/nfs4proc.c | 22 - fs/nilfs2/ioctl.c | 2 fs/ocfs2/aops.c | 18 + fs/super.c | 15 + fs/verity/verify.c | 12 - include/linux/acpi_mdio.h | 9 include/linux/entry-kvm.h | 2 include/linux/kthread.h | 25 ++ include/linux/lockd/xdr4.h | 1 include/linux/nvme-tcp.h | 5 include/linux/of_mdio.h | 22 + include/linux/sysfb.h | 9 include/linux/thread_info.h | 14 + kernel/bpf/core.c | 2 kernel/entry/common.c | 5 kernel/entry/kvm.c | 4 kernel/events/core.c | 4 kernel/kthread.c | 1 kernel/sched/core.c | 3 kernel/sched/fair.c | 54 ++++ kernel/trace/trace_hwlat.c | 12 - mm/kfence/Makefile | 2 mm/kfence/core.c | 8 mm/slab.c | 2 net/bluetooth/l2cap_core.c | 117 ++++++---- net/dsa/tag_brcm.c | 10 net/ipv4/ip_gre.c | 4 net/ipv6/ip6_gre.c | 4 net/mac80211/wme.c | 6 net/sched/act_mirred.c | 23 + net/tls/tls_main.c | 9 net/xdp/xdp_umem.c | 13 - security/keys/request_key.c | 9 tools/bootconfig/test-bootconfig.sh | 12 - tools/testing/selftests/bpf/prog_tests/btf.c | 28 ++ tools/testing/selftests/net/forwarding/tc_actions.sh | 49 ++++ 156 files changed, 1148 insertions(+), 545 deletions(-)
AKASHI Takahiro (1):
igc: fix the validation logic for taprio's gate list
Adrien Thierry (1):
scsi: ufs: core: Add soft dependency on governor_simpleondemand
Akihiko Odaki (1):
igbvf: Regard vf reset nack as success
Al Viro (1):
sh: sanitize the flags on sigreturn
Alexander Aring (1):
ca8210: fix mac_len negative array access
Alexander Lobakin (2):
iavf: fix inverted Rx hash condition leading to disabled hash
iavf: fix non-tunneled IPv6 UDP packet type and hashing
Alexander Stein (1):
i2c: imx-lpi2c: check only for enabled interrupt flags
Alexander Sverdlin (1):
tty: serial: fsl_lpuart: fix race on RX DMA shutdown
Alexandr Sapozhnikov (1):
drm/cirrus: NULL-check pipe->plane.state->fb in cirrus_pipe_update()
Alexandre Ghiti (1):
riscv: Bump COMMAND_LINE_SIZE value to 1024
Alvin Šipraga (1):
usb: gadget: u_audio: don't let userspace block driver unbind
Andrzej Hajda (1):
drm/i915/gt: perform uc late init after probe error injection
Arınç ÜNAL (3):
net: dsa: mt7530: move enabling disabling core clock to mt7530_pll_setup()
net: dsa: mt7530: move lowering TRGMII driving to mt7530_setup()
net: dsa: mt7530: move setting ssc_delta to PHY_INTERFACE_MODE_TRGMII case
Cai Huoqing (2):
kthread: add the helper function kthread_run_on_cpu() trace/hwlat: make use of the helper function kthread_run_on_cpu()
Caleb Sander (1):
nvme-tcp: fix nvme_tcp_term_pdu to match spec
ChenXiaoSong (1):
ksmbd: fix possible refcount leak in smb2_open()
Coly Li (1):
dm thin: fix deadlock when swapping to thin device
Costa Shulyupin (1):
tracing/hwlat: Replace sched_setaffinity with set_cpus_allowed_ptr
Cristian Marussi (1):
firmware: arm_scmi: Fix device node validation for mailbox transport
Dai Ngo (1):
NFSD: fix use-after-free in __nfs42_ssc_open()
Dan Carpenter (1):
net/mlx5: E-Switch, Fix an Oops in error handling code
Daniel Borkmann (1):
bpf: Adjust insufficient default bpf_jit_limit
Daniil Tatianin (1):
qed/qed_sriov: guard against NULL derefs from qed_iov_get_vf_info
Danny Kaehn (1):
HID: cp2112: Fix driver not registering GPIO IRQ chip as threaded
David Howells (1):
keys: Do not cache key in task struct if key is requested from kernel thread
Davide Caratti (2):
net/sched: act_mirred: better wording on protection against excessive stack growth
act_mirred: use the backlog for nested calls to mirred ingress
Dmitry Baryshkov (1):
interconnect: qcom: osm-l3: fix icc_onecell_data allocation
Dylan Jhong (1):
riscv: mm: Fix incorrect ASID argument when flushing TLB
Enrico Sau (2):
net: usb: cdc_mbim: avoid altsetting toggling for Telit FE990
net: usb: qmi_wwan: add Telit 0x1080 composition
Eric Biggers (1):
fscrypt: destroy keyring after security_sb_delete()
Eric Dumazet (1):
erspan: do not use skb_mac_header() in ndo_start_xmit()
Fabrice Gasnier (1):
usb: dwc2: fix a devres leak in hw_enable upon suspend resume
Felix Fietkau (1):
wifi: mac80211: fix qos on mesh interfaces
Florian Fainelli (2):
net: phy: Ensure state transitions are processed from phy_stop()
net: mdio: fix owner field for mdio buses registered using ACPI
Frank Crawford (1):
hwmon (it87): Fix voltage scaling for chips with 10.9mV ADCs
Frederic Weisbecker (1):
entry/rcu: Check TIF_RESCHED _after_ delayed RCU wake-up
Gaosheng Cui (1):
intel/igbvf: free irq on the error path in igbvf_request_msix()
Gavin Li (1):
net/mlx5e: Set uplink rep as NETNS_LOCAL
Geert Uytterhoeven (2):
serial: 8250: SERIAL_8250_ASPEED_VUART should depend on ARCH_ASPEED mm/slab: Fix undefined init_cache_node_node() for NUMA and !SMP
Geoff Levand (2):
net/ps3_gelic_net: Fix RX sk_buff length
net/ps3_gelic_net: Use dma_mapping_error
Gil Fine (1):
thunderbolt: Add missing UNSET_INBOUND_SBTX for retimer access
Greg Kroah-Hartman (1):
Linux 5.15.105
Hangyu Hua (1):
net: tls: fix possible race condition between do_tls_getsockopt_conf() and do_tls_setsockopt_conf()
Hans de Goede (2):
efi: sysfb_efi: Fix DMI quirks not working for simpledrm
usb: ucsi: Fix NULL pointer deref in ucsi_connector_change()
Jakob Koschel (1):
scsi: lpfc: Avoid usage of list iterator variable after loop
Jan Kara via Ocfs2-devel (1):
ocfs2: fix data corruption after failed write
Jason Wang (1):
serial: fsl_lpuart: Fix comment typo
Jeff Layton (1):
lockd: set file_lock start and end when decoding nlm4 testargs
Jiasheng Jiang (2):
octeontx2-vf: Add missing free for alloc_percpu dm stats: check for and propagate alloc_percpu failure
Joel Selvaraj (1):
scsi: core: Add BLIST_SKIP_VPD_PAGES for SKhynix H28U74301AMR
Johan Hovold (1):
drm/meson: fix missing component unbind on bind errors
Joshua Washington (1):
gve: Cache link_speed value from device
Justin Tee (1):
scsi: lpfc: Check kzalloc() in lpfc_sli4_cgn_params_read()
Kai-Heng Feng (1):
drm/amdgpu/nv: Apply ASPM quirk on Intel ADL + AMD Navi
Kal Conley (1):
xsk: Add missing overflow check in xdp_umem_reg
Kang Chen (1):
scsi: hisi_sas: Check devm_add_action() return value
Krzysztof Kozlowski (1):
arm64: dts: imx8mm-nitrogen-r2: fix WM8960 clock name
Lama Kayal (1):
net/mlx5: Fix steering rules cleanup
Li Zetao (1):
atm: idt77252: fix kmemleak when rmmod idt77252
Liang He (1):
net: mdio: thunder: Add missing fwnode_handle_put()
Lin Ma (1):
igb: revert rtnl_lock() that causes deadlock
Lorenz Bauer (1):
selftests/bpf: check that modifier resolves after pointer
Luiz Augusto von Dentz (1):
Bluetooth: L2CAP: Fix responding with wrong PDU type
Maher Sanalla (1):
net/mlx5: Read the TC mapping of all priorities on ETS query
Marco Elver (1):
kfence: avoid passing -g for test
Marek Vasut (1):
arm64: dts: imx8mn: specify #sound-dai-cells for SAI nodes
Mario Limonciello (3):
thunderbolt: Disable interrupt auto clear for rings
thunderbolt: Use const qualifier for ring_interrupt_index
ACPI: x86: utils: Add Cezanne to the list for forcing StorageD3Enable
Mark Rutland (2):
thread_info: Add helpers to snapshot thread flags
entry: Snapshot thread flags
Masami Hiramatsu (Google) (1):
bootconfig: Fix testcase to increase max node
Matheus Castello (1):
drm/bridge: lt8912b: return EPROBE_DEFER if bridge is not found
Maurizio Lombardi (1):
scsi: target: iscsi: Fix an error message in iscsi_check_key()
Maxime Bizon (1):
net: mdio: fix owner field for mdio buses registered using device-tree
Michael Kelley (1):
scsi: storvsc: Handle BlockSize change in Hyper-V VHD/VHDX file
Michael Schmitz (1):
m68k: Only force 030 bus error if PC not in exception table
Mika Westerberg (2):
thunderbolt: Use scale field when allocating USB3 bandwidth
thunderbolt: Call tb_check_quirks() after initializing adapters
Mike Snitzer (1):
dm crypt: avoid accessing uninitialized tasklet
Mikulas Patocka (1):
dm crypt: add cond_resched() to dmcrypt_write()
Minghao Chi (1):
power: supply: bq24190_charger: using pm_runtime_resume_and_get instead of pm_runtime_get_sync
Muchun Song (1):
mm: kfence: fix using kfence_metadata without initialization in show_object()
Namjae Jeon (5):
ksmbd: add low bound validation to FSCTL_SET_ZERO_DATA
ksmbd: add low bound validation to FSCTL_QUERY_ALLOCATED_RANGES
ksmbd: set FILE_NAMED_STREAMS attribute in FS_ATTRIBUTE_INFORMATION
ksmbd: return STATUS_NOT_SUPPORTED on unsupported smb2.0 dialect
ksmbd: return unsupported error on smb1 mount
Nathan Chancellor (1):
riscv: Handle zicsr/zifencei issues between clang and binutils
Nathan Huckleberry (1):
fsverity: Remove WQ_UNBOUND from fsverity read workqueue
Nilesh Javali (1):
scsi: qla2xxx: Perform lockless command completion in abort path
Nirmoy Das (1):
drm/i915/active: Fix missing debug object activation
Pawel Laszczak (3):
usb: cdns3: Fix issue with using incorrect PCI device function
usb: cdnsp: Fixes issue with redundant Status Stage
usb: cdnsp: changes PCI Device ID to fix conflict with CNDS3 driver
Peng Fan (2):
ARM: dts: imx6sll: e60k02: fix usbotg1 pinctrl
ARM: dts: imx6sl: tolino-shine2hd: fix usbotg1 pinctrl
Phinex Hung (1):
hwmon: fix potential sensor registration fail if of_node is missing
Quinn Tran (1):
scsi: qla2xxx: Synchronize the IOCB count to be in order
Radoslaw Tyl (1):
i40e: fix flow director packet filter programming
Randy Dunlap (1):
serial: 8250: ASPEED_VUART: select REGMAP instead of depending on it
Reka Norman (1):
HID: intel-ish-hid: ipc: Fix potential use-after-free in work function
Rijo Thomas (1):
tee: amdtee: fix race condition in amdtee_open_session
Roger Pau Monne (1):
hvc/xen: prevent concurrent accesses to the shared ring
Ryusuke Konishi (1):
nilfs2: fix kernel-infoleak in nilfs_ioctl_wrap_copy()
Sherry Sun (1):
tty: serial: fsl_lpuart: switch to new dmaengine_terminate_* API
Shyam Prasad N (2):
cifs: empty interface list when server doesn't support query interfaces
cifs: print session id while listing open files
Song Liu (1):
perf: fix perf_event_context->time
Stefan Assmann (1):
iavf: fix hang on reboot with ice
Stephan Gerhold (1):
Bluetooth: btqcomsmd: Fix command timeout after setting BD address
Szymon Heidrich (1):
net: usb: smsc95xx: Limit packet length to skb->len
Tero Kristo (1):
trace/hwlat: Do not start per-cpu thread if it is already running
Tom Rix (1):
thunderbolt: Rename shadowed variables bit to interrupt_bit and auto_clear_bit
Tzung-Bi Shih (1):
platform/chrome: cros_ec_chardev: fix kernel data leak from ioctl
Ville Syrjälä (1):
drm/i915: Preserve crtc_state->inherited during state clearing
Vincent Guittot (1):
sched/fair: Sanitize vruntime of entity being migrated
Vitaly Kuznetsov (1):
KVM: x86: hyper-v: Avoid calling kvm_make_vcpus_request_mask() with vcpu_mask==NULL
Wei Chen (1):
i2c: xgene-slimpro: Fix out-of-bounds bug in xgene_slimpro_i2c_xfer()
Xu Yang (3):
usb: typec: tcpm: fix warning when handle discover_identity message
usb: chipdea: core: fix return -EINVAL if request role is the same with current role
usb: chipidea: core: fix possible concurrent when switch role
Yang Jihong (1):
perf/core: Fix perf_output_begin parameter is incorrectly invoked in perf_event_bpf_output
Yaroslav Furman (1):
uas: Add US_FL_NO_REPORT_OPCODES for JMicron JMS583Gen 2
Yicong Yang (1):
i2c: hisi: Only use the completion interrupt to finish the transfer
Yu Kuai (1):
scsi: scsi_dh_alua: Fix memleak for 'qdata' in alua_activate()
Zhang Changzhong (1):
net/sonic: use dma_mapping_error() for error check
Zhang Qiao (1):
sched/fair: sanitize vruntime of entity being placed
Zheng Wang (5):
power: supply: bq24190: Fix use after free bug in bq24190_remove due to race condition
power: supply: da9150: Fix use after free bug in da9150_charger_remove due to race condition
xirc2ps_cs: Fix use after free bug in xirc2ps_detach
net: qcom/emac: Fix use after free bug in emac_remove due to race condition
Bluetooth: btsdio: fix use after free bug in btsdio_remove due to unfinished work
Álvaro Fernández Rojas (2):
net: dsa: b53: mmap: fix device tree support
net: dsa: tag_brcm: legacy: fix daisy-chained switches
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 104 +SUBLEVEL = 105 EXTRAVERSION = NAME = Trick or Treat
arch/arm/boot/dts/e60k02.dtsi +1 -0
@@ -302,6 +302,7 @@ &usdhc3 { &usbotg1 { pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_usbotg1>; disable-over-current; srp-disable; hnp-disable;
arch/arm/boot/dts/imx6sl-tolino-shine2hd.dts +1 -0
@@ -597,6 +597,7 @@ &usdhc3 { &usbotg1 { pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_usbotg1>; disable-over-current; srp-disable; hnp-disable;
arch/arm64/boot/dts/freescale/imx8mm-nitrogen-r2.dts +1 -1
@@ -247,7 +247,7 @@ wm8960: codec@1a { compatible = "wlf,wm8960"; reg = <0x1a>; clocks = <&clk IMX8MM_CLK_SAI1_ROOT>; - clock-names = "mclk1"; + clock-names = "mclk"; wlf,shared-lrclk; #sound-dai-cells = <0>; };
arch/arm64/boot/dts/freescale/imx8mn.dtsi +5 -0
@@ -265,6 +265,7 @@ spba2: spba-bus@30000000 { sai2: sai@30020000 { compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; reg = <0x30020000 0x10000>; + #sound-dai-cells = <0>; interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk IMX8MN_CLK_SAI2_IPG>, <&clk IMX8MN_CLK_DUMMY>,
@@ -279,6 +280,7 @@ sai2: sai@30020000 { sai3: sai@30030000 { compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; reg = <0x30030000 0x10000>; + #sound-dai-cells = <0>; interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk IMX8MN_CLK_SAI3_IPG>, <&clk IMX8MN_CLK_DUMMY>,
@@ -293,6 +295,7 @@ sai3: sai@30030000 { sai5: sai@30050000 { compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; reg = <0x30050000 0x10000>; + #sound-dai-cells = <0>; interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk IMX8MN_CLK_SAI5_IPG>, <&clk IMX8MN_CLK_DUMMY>,
@@ -309,6 +312,7 @@ sai5: sai@30050000 { sai6: sai@30060000 { compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; reg = <0x30060000 0x10000>; + #sound-dai-cells = <0>; interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk IMX8MN_CLK_SAI6_IPG>, <&clk IMX8MN_CLK_DUMMY>,
@@ -366,6 +370,7 @@ spdif1: spdif@30090000 { sai7: sai@300b0000 { compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; reg = <0x300b0000 0x10000>; + #sound-dai-cells = <0>; interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk IMX8MN_CLK_SAI7_IPG>, <&clk IMX8MN_CLK_DUMMY>,
arch/m68k/kernel/traps.c +3 -1
@@ -30,6 +30,7 @@#include <linux/init.h> #include <linux/ptrace.h> #include <linux/kallsyms.h> +#include <linux/extable.h> #include <asm/setup.h> #include <asm/fpu.h>
@@ -544,7 +545,8 @@ static inline void bus_error030 (struct frame *fp) errorcode |=2 ;if (mmusr & (MMU_I |MMU_WP )) { -if (ssw &4 ) { +/* We might have an exception table for this PC */ +if (ssw &4 && !search_exception_tables (fp->ptregs.pc)) { pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n", ssw & RW ? "read" : "write", fp->un.fmtb.daddr,
arch/riscv/Kconfig +22 -0
@@ -361,6 +361,28 @@ config RISCV_BASE_PMU endmenu +config TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI + def_bool y + # https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=aed44286efa8ae8717a77d94b51ac3614e2ca6dc + depends on AS_IS_GNU && AS_VERSION >= 23800 + help + Newer binutils versions default to ISA spec version 20191213 which + moves some instructions from the I extension to the Zicsr and Zifencei + extensions. + +config TOOLCHAIN_NEEDS_OLD_ISA_SPEC + def_bool y + depends on TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI + # https://github.com/llvm/llvm-project/commit/22e199e6afb1263c943c0c0d4498694e15bf8a16 + depends on CC_IS_CLANG && CLANG_VERSION < 170000 + help + Certain versions of clang do not support zicsr and zifencei via -march + but newer versions of binutils require it for the reasons noted in the + help text of CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI. This + option causes an older ISA spec compatible with these older versions + of clang to be passed to GAS, which has the same result as passing zicsr + and zifencei to -march. + config FPU bool "FPU support" default y
arch/riscv/Makefile +6 -4
@@ -59,10 +59,12 @@ riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c -# Newer binutils versions default to ISA spec version 20191213 which moves some -# instructions from the I extension to the Zicsr and Zifencei extensions. -toolchain-need-zicsr-zifencei := $(call cc-option-yn, -march=$(riscv-march-y)_zicsr_zifencei) -riscv-march-$(toolchain-need-zicsr-zifencei) := $(riscv-march-y)_zicsr_zifencei +ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC +KBUILD_CFLAGS += -Wa,-misa-spec=2.2 +KBUILD_AFLAGS += -Wa,-misa-spec=2.2 +else +riscv-march-$(CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI) := $(riscv-march-y)_zicsr_zifencei +endif KBUILD_CFLAGS += -march=$(subst fd,,$(riscv-march-y)) KBUILD_AFLAGS += -march=$(riscv-march-y)
arch/riscv/include/asm/tlbflush.h +2 -0
@@ -12,6 +12,8 @@#include <asm/errata_list.h> #ifdef CONFIG_MMU +extern unsigned long asid_mask; +static inline void local_flush_tlb_all (void ) { __asm__ __volatile__ ("sfence.vma" : : :"memory" );
arch/riscv/include/uapi/asm/setup.h new file +8 -0
@@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ + +#ifndef _UAPI_ASM_RISCV_SETUP_H +#define _UAPI_ASM_RISCV_SETUP_H + +#define COMMAND_LINE_SIZE 1024 + +#endif /* _UAPI_ASM_RISCV_SETUP_H */
arch/riscv/mm/context.c +1 -1
@@ -22,7 +22,7 @@ DEFINE_STATIC_KEY_FALSE(use_asid_allocator);static unsigned long asid_bits;static unsigned long num_asids; -static unsigned long asid_mask; +unsigned long asid_mask;static atomic_long_t current_version;
arch/riscv/mm/tlbflush.c +1 -1
@@ -43,7 +43,7 @@ static void __sbi_tlb_flush_range(struct mm_struct *mm, unsigned long start,/* check if the tlbflush needs to be sent to other CPUs */ broadcast =cpumask_any_but (cmask, cpuid) < nr_cpu_ids;if (static_branch_unlikely (&use_asid_allocator)) { -unsigned long asid =atomic_long_read (&mm->context.id); +unsigned long asid =atomic_long_read (&mm->context.id) & asid_mask;if (broadcast) {riscv_cpuid_to_hartid_mask (cmask, &hmask);
arch/sh/include/asm/processor_32.h +1 -0
@@ -50,6 +50,7 @@#define SR_FD 0x00008000#define SR_MD 0x40000000 +#define SR_USER_MASK 0x00000303 // M, Q, S, T bits/* * DSP structure and data */
arch/sh/kernel/signal_32.c +3 -0
@@ -115,6 +115,7 @@ static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p) { unsigned int err = 0; +unsigned int sr = regs->sr & ~SR_USER_MASK ;#define COPY (x) err |= __get_user(regs->x, &sc->sc_##x)COPY (regs[1 ]);
@@ -130,6 +131,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_pCOPY (sr);COPY (pc);#undef COPY + regs->sr = (regs->sr &SR_USER_MASK ) | sr; +#ifdef CONFIG_SH_FPU if (boot_cpu_data.flags &CPU_HAS_FPU ) {int owned_fp;
arch/x86/kvm/hyperv.c +9 -6
@@ -1846,16 +1846,19 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)cpumask_clear (&hv_vcpu->tlb_flush); - vcpu_mask = all_cpus ?NULL : -sparse_set_to_vcpu_mask (kvm, sparse_banks, valid_bank_mask, - vp_bitmap, vcpu_bitmap); -/* * vcpu->arch.cr3 may not be up-to-date for running vCPUs so we can't * analyze it here, flush TLB regardless of the specified address space. */ -kvm_make_vcpus_request_mask (kvm,KVM_REQ_TLB_FLUSH_GUEST , -NULL , vcpu_mask, &hv_vcpu->tlb_flush); +if (all_cpus) { +kvm_make_all_cpus_request (kvm,KVM_REQ_TLB_FLUSH_GUEST ); + }else { + vcpu_mask =sparse_set_to_vcpu_mask (kvm, sparse_banks, valid_bank_mask, + vp_bitmap, vcpu_bitmap); + +kvm_make_vcpus_request_mask (kvm,KVM_REQ_TLB_FLUSH_GUEST , +NULL , vcpu_mask, &hv_vcpu->tlb_flush); + } ret_success:/* We always do full TLB flush, set 'Reps completed' = 'Rep Count' */
drivers/acpi/x86/utils.c +13 -24
@@ -191,37 +191,26 @@ bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *s* a hardcoded allowlist for D3 support, which was used for these platforms. * * This allows quirking on Linux in a similar fashion. +* +* Cezanne systems shouldn't *normally* need this as the BIOS includes +* StorageD3Enable. But for two reasons we have added it. +* 1) The BIOS on a number of Dell systems have ambiguity +* between the same value used for _ADR on ACPI nodes GPP1.DEV0 and GPP1.NVME. +* GPP1.NVME is needed to get StorageD3Enable node set properly. +* https://bugzilla.kernel.org/show_bug.cgi?id=216440 +* https://bugzilla.kernel.org/show_bug.cgi?id=216773 +* https://bugzilla.kernel.org/show_bug.cgi?id=217003 +* 2) On at least one HP system StorageD3Enable is missing on the second NVME +disk in the system. */ static const struct x86_cpu_id storage_d3_cpu_ids[] = {X86_MATCH_VENDOR_FAM_MODEL (AMD ,23 ,96 ,NULL ),/* Renoir */ X86_MATCH_VENDOR_FAM_MODEL (AMD ,23 ,104 ,NULL ),/* Lucienne */ - {} -}; - -static const struct dmi_system_id force_storage_d3_dmi[] = { - { -/* -* _ADR is ambiguous between GPP1.DEV0 and GPP1.NVME -* but .NVME is needed to get StorageD3Enable node -* https://bugzilla.kernel.org/show_bug.cgi?id=216440 -*/ - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Inspiron 14 7425 2-in-1" ), - } - }, - { - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), -DMI_MATCH (DMI_PRODUCT_NAME ,"Inspiron 16 5625" ), - } - }, +X86_MATCH_VENDOR_FAM_MODEL (AMD ,25 ,80 ,NULL ),/* Cezanne */ {} };bool force_storage_d3 (void ) { -const struct dmi_system_id *dmi_id =dmi_first_match (force_storage_d3_dmi); - -return dmi_id ||x86_match_cpu (storage_d3_cpu_ids); +return x86_match_cpu (storage_d3_cpu_ids); }
drivers/atm/idt77252.c +11 -0
@@ -2909,6 +2909,7 @@ close_card_oam(struct idt77252_dev *card)recycle_rx_pool_skb (card, &vc->rcv.rx_pool); } +kfree (vc); } } }
@@ -2952,6 +2953,15 @@ open_card_ubr0(struct idt77252_dev *card)return 0 ; } +static void +close_card_ubr0 (struct idt77252_dev *card) +{ +struct vc_map *vc = card->vcs[0 ]; + +free_scq (card, vc->scq); +kfree (vc); +} +static int idt77252_dev_open (struct idt77252_dev *card) {
@@ -3001,6 +3011,7 @@ static void idt77252_dev_close(struct atm_dev *dev)struct idt77252_dev *card = dev->dev_data;u32 conf; +close_card_ubr0 (card);close_card_oam (card); conf = SAR_CFG_RXPTH | /* enable receive path */
drivers/bluetooth/btqcomsmd.c +16 -1
@@ -122,6 +122,21 @@ static int btqcomsmd_setup(struct hci_dev *hdev)return 0 ; } +static int btqcomsmd_set_bdaddr (struct hci_dev *hdev,const bdaddr_t *bdaddr) +{ +int ret; + + ret =qca_set_bdaddr_rome (hdev, bdaddr); +if (ret) +return ret; + +/* The firmware stops responding for a while after setting the bdaddr, +* causing timeouts for subsequent commands. Sleep a bit to avoid this. +*/ +usleep_range (1000 ,10000 ); +return 0 ; +} +static int btqcomsmd_probe (struct platform_device *pdev) {struct btqcomsmd *btq;
@@ -162,7 +177,7 @@ static int btqcomsmd_probe(struct platform_device *pdev) hdev->close = btqcomsmd_close; hdev->send = btqcomsmd_send; hdev->setup = btqcomsmd_setup; - hdev->set_bdaddr = qca_set_bdaddr_rome; + hdev->set_bdaddr = btqcomsmd_set_bdaddr; ret =hci_register_dev (hdev);if (ret <0 )
drivers/bluetooth/btsdio.c +1 -0
@@ -352,6 +352,7 @@ static void btsdio_remove(struct sdio_func *func)BT_DBG ("func %p" , func); +cancel_work_sync (&data->work);if (!data)return ;
drivers/firmware/arm_scmi/mailbox.c +37 -0
@@ -52,6 +52,39 @@ static bool mailbox_chan_available(struct device *dev, int idx) "#mbox-cells", idx, NULL); } +static int mailbox_chan_validate (struct device *cdev) +{ +int num_mb, num_sh, ret =0 ; +struct device_node *np = cdev->of_node; + + num_mb =of_count_phandle_with_args (np,"mboxes" ,"#mbox-cells" ); + num_sh =of_count_phandle_with_args (np,"shmem" ,NULL ); +/* Bail out if mboxes and shmem descriptors are inconsistent */ +if (num_mb <=0 || num_sh >2 || num_mb != num_sh) { +dev_warn (cdev,"Invalid channel descriptor for '%s'\n" , +of_node_full_name (np)); +return -EINVAL ; + } + +if (num_sh >1 ) { +struct device_node *np_tx, *np_rx; + + np_tx =of_parse_phandle (np,"shmem" ,0 ); + np_rx =of_parse_phandle (np,"shmem" ,1 ); +/* SCMI Tx and Rx shared mem areas have to be distinct */ +if (!np_tx || !np_rx || np_tx == np_rx) { +dev_warn (cdev,"Invalid shmem descriptor for '%s'\n" , +of_node_full_name (np)); + ret = -EINVAL ; + } + +of_node_put (np_tx); +of_node_put (np_rx); + } + +return ret; +} +static int mailbox_chan_setup (struct scmi_chan_info *cinfo,struct device *dev,bool tx) {
@@ -64,6 +97,10 @@ static int mailbox_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,resource_size_t size;struct resource res; + ret =mailbox_chan_validate (cdev); +if (ret) +return ret; + smbox =devm_kzalloc (dev,sizeof (*smbox),GFP_KERNEL );if (!smbox)return -ENOMEM ;
drivers/firmware/efi/sysfb_efi.c +4 -1
@@ -343,7 +343,7 @@ static const struct fwnode_operations efifb_fwnode_ops = {#ifdef CONFIG_EFI static struct fwnode_handle efifb_fwnode; -__init void sysfb_apply_efi_quirks (struct platform_device *pd) +__init void sysfb_apply_efi_quirks (void ) {if (screen_info.orig_video_isVGA !=VIDEO_TYPE_EFI || !(screen_info.capabilities &VIDEO_CAPABILITY_SKIP_QUIRKS ))
@@ -357,7 +357,10 @@ __init void sysfb_apply_efi_quirks(struct platform_device *pd) screen_info.lfb_height = temp; screen_info.lfb_linelength =4 * screen_info.lfb_width; } +} +__init void sysfb_set_efifb_fwnode (struct platform_device *pd) +{if (screen_info.orig_video_isVGA ==VIDEO_TYPE_EFI &&IS_ENABLED (CONFIG_PCI )) {fwnode_init (&efifb_fwnode, &efifb_fwnode_ops); pd->dev.fwnode = &efifb_fwnode;
drivers/firmware/sysfb.c +3 -1
@@ -81,6 +81,8 @@ static __init int sysfb_init(void)if (disabled) goto unlock_mutex; +sysfb_apply_efi_quirks (); +/* try to create a simple-framebuffer device */ compatible =sysfb_parse_mode (si, &mode);if (compatible) {
@@ -103,7 +105,7 @@ static __init int sysfb_init(void) goto unlock_mutex; } -sysfb_apply_efi_quirks (pd); +sysfb_set_efifb_fwnode (pd); ret =platform_device_add_data (pd, si,sizeof (*si));if (ret)
drivers/firmware/sysfb_simplefb.c +1 -1
@@ -110,7 +110,7 @@ __init struct platform_device *sysfb_create_simplefb(const struct screen_info *sif (!pd)return ERR_PTR (-ENOMEM ); -sysfb_apply_efi_quirks (pd); +sysfb_set_efifb_fwnode (pd); ret =platform_device_add_resources (pd, &res,1 );if (ret)
drivers/gpu/drm/amd/amdgpu/amdgpu.h +1 -0
@@ -1286,6 +1286,7 @@ void amdgpu_device_pci_config_reset(struct amdgpu_device *adev);int amdgpu_device_pci_reset (struct amdgpu_device *adev);bool amdgpu_device_need_post (struct amdgpu_device *adev);bool amdgpu_device_should_use_aspm (struct amdgpu_device *adev); +bool amdgpu_device_aspm_support_quirk (void );void amdgpu_cs_report_moved_bytes (struct amdgpu_device *adev,u64 num_bytes,u64 num_vis_bytes);
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +15 -0
@@ -75,6 +75,10 @@#include <drm/drm_drv.h> +#if IS_ENABLED (CONFIG_X86 ) +#include <asm/intel-family.h> +#endif +MODULE_FIRMWARE ("amdgpu/vega10_gpu_info.bin" );MODULE_FIRMWARE ("amdgpu/vega12_gpu_info.bin" );MODULE_FIRMWARE ("amdgpu/raven_gpu_info.bin" );
@@ -1337,6 +1341,17 @@ bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev)return pcie_aspm_enabled (adev->pdev); } +bool amdgpu_device_aspm_support_quirk (void ) +{ +#if IS_ENABLED (CONFIG_X86 ) +struct cpuinfo_x86 *c = &cpu_data (0 ); + +return !(c->x86 ==6 && c->x86_model ==INTEL_FAM6_ALDERLAKE ); +#else +return true; +#endif +} +/* if we get transitioned to only one device, take VGA back */ /** * amdgpu_device_vga_set_decode - enable/disable vga decode
drivers/gpu/drm/amd/amdgpu/nv.c +1 -1
@@ -584,7 +584,7 @@ static void nv_pcie_gen3_enable(struct amdgpu_device *adev)static void nv_program_aspm (struct amdgpu_device *adev) { -if (!amdgpu_device_should_use_aspm (adev)) +if (!amdgpu_device_should_use_aspm (adev) || !amdgpu_device_aspm_support_quirk ())return ; if (!(adev->flags & AMD_IS_APU) &&
drivers/gpu/drm/amd/amdgpu/vi.c +1 -16
@@ -81,10 +81,6 @@#include "mxgpu_vi.h" #include "amdgpu_dm.h" -#if IS_ENABLED (CONFIG_X86 ) -#include <asm/intel-family.h> -#endif -#define ixPCIE_LC_L1_PM_SUBSTATE 0x100100C6#define PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK 0x00000001L#define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK 0x00000002L
@@ -1138,24 +1134,13 @@ static void vi_enable_aspm(struct amdgpu_device *adev)WREG32_PCIE (ixPCIE_LC_CNTL, data); } -static bool aspm_support_quirk_check (void ) -{ -#if IS_ENABLED (CONFIG_X86 ) -struct cpuinfo_x86 *c = &cpu_data (0 ); - -return !(c->x86 ==6 && c->x86_model ==INTEL_FAM6_ALDERLAKE ); -#else -return true; -#endif -} -static void vi_program_aspm (struct amdgpu_device *adev) {u32 data, data1, orig;bool bL1SS = false;bool bClkReqSupport = true; -if (!amdgpu_device_should_use_aspm (adev) || !aspm_support_quirk_check ()) +if (!amdgpu_device_should_use_aspm (adev) || !amdgpu_device_aspm_support_quirk ())return ; if (adev->flags & AMD_IS_APU ||
drivers/gpu/drm/bridge/lontium-lt8912b.c +2 -2
@@ -670,8 +670,8 @@ static int lt8912_parse_dt(struct lt8912 *lt) lt->hdmi_port =of_drm_find_bridge (port_node);if (!lt->hdmi_port) { -dev_err (lt->dev,"%s: Failed to get hdmi port\n" , __func__); - ret = -ENODEV ; + ret = -EPROBE_DEFER ; +dev_err_probe (lt->dev, ret,"%s: Failed to get hdmi port\n" , __func__); goto err_free_host_node; }
drivers/gpu/drm/i915/display/intel_display.c +1 -0
@@ -7824,6 +7824,7 @@ intel_crtc_prepare_cleared_state(struct intel_atomic_state *state,* only fields that are know to not cause problems are preserved. */ saved_state->uapi = crtc_state->uapi; + saved_state->inherited = crtc_state->inherited; saved_state->scaler_state = crtc_state->scaler_state; saved_state->shared_dpll = crtc_state->shared_dpll; saved_state->dpll_hw_state = crtc_state->dpll_hw_state;
drivers/gpu/drm/i915/gt/intel_gt.c +2 -2
@@ -709,12 +709,12 @@ int intel_gt_init(struct intel_gt *gt)if (err) goto err_gt; -intel_uc_init_late (>->uc); - err =i915_inject_probe_error (gt->i915, -EIO );if (err) goto err_gt; +intel_uc_init_late (>->uc); +intel_migrate_init (>->migrate, gt); goto out_fw;
drivers/gpu/drm/i915/i915_active.c +1 -2
@@ -92,8 +92,7 @@ static void debug_active_init(struct i915_active *ref)static void debug_active_activate (struct i915_active *ref) {lockdep_assert_held (&ref->tree_lock); -if (!atomic_read (&ref->count))/* before the first inc */ -debug_object_activate (ref, &active_debug_desc); +debug_object_activate (ref, &active_debug_desc); }static void debug_active_deactivate (struct i915_active *ref)
drivers/gpu/drm/meson/meson_drv.c +8 -5
@@ -324,23 +324,23 @@ static int meson_drv_bind_master(struct device *dev, bool has_components) ret =meson_encoder_hdmi_init (priv);if (ret) - goto exit_afbcd; + goto unbind_all; ret =meson_plane_create (priv);if (ret) - goto exit_afbcd; + goto unbind_all; ret =meson_overlay_create (priv);if (ret) - goto exit_afbcd; + goto unbind_all; ret =meson_crtc_create (priv);if (ret) - goto exit_afbcd; + goto unbind_all; ret =request_irq (priv->vsync_irq, meson_irq,0 , drm->driver->name, drm);if (ret) - goto exit_afbcd; + goto unbind_all;drm_mode_config_reset (drm);
@@ -358,6 +358,9 @@ static int meson_drv_bind_master(struct device *dev, bool has_components) uninstall_irq:free_irq (priv->vsync_irq, drm); +unbind_all: +if (has_components) +component_unbind_all (drm->dev, drm); exit_afbcd:if (priv->afbcd.ops) priv->afbcd.ops->exit (priv);
drivers/gpu/drm/tiny/cirrus.c +1 -1
@@ -450,7 +450,7 @@ static void cirrus_pipe_update(struct drm_simple_display_pipe *pipe,if (state->fb && cirrus->cpp !=cirrus_cpp (state->fb))cirrus_mode_set (cirrus, &crtc->mode, state->fb); -if (drm_atomic_helper_damage_merged (old_state, state, &rect)) +if (state->fb &&drm_atomic_helper_damage_merged (old_state, state, &rect))cirrus_fb_blit_rect (state->fb, &shadow_plane_state->data[0 ], &rect); }
drivers/hid/hid-cp2112.c +1 -0
@@ -1352,6 +1352,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id) girq->parents =NULL ; girq->default_type =IRQ_TYPE_NONE ; girq->handler = handle_simple_irq; + girq->threaded = true; ret =gpiochip_add_data (&dev->gc, dev);if (ret <0 ) {
drivers/hid/intel-ish-hid/ipc/ipc.c +8 -1
@@ -5,6 +5,7 @@* Copyright (c) 2014-2016, Intel Corporation. */ +#include <linux/devm-helpers.h> #include <linux/sched.h> #include <linux/spinlock.h> #include <linux/delay.h>
@@ -621,7 +622,6 @@ static void recv_ipc(struct ishtp_device *dev, uint32_t doorbell_val)case MNG_RESET_NOTIFY :if (!ishtp_dev) { ishtp_dev = dev; -INIT_WORK (&fw_reset_work, fw_reset_work_fn); }schedule_work (&fw_reset_work);break ;
@@ -936,6 +936,7 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev) {struct ishtp_device *dev;int i; +int ret; dev = devm_kzalloc(&pdev->dev, sizeof(struct ishtp_device) + sizeof(struct ish_hw),
@@ -971,6 +972,12 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)list_add_tail (&tx_buf->link, &dev->wr_free_list); } + ret =devm_work_autocancel (&pdev->dev, &fw_reset_work, fw_reset_work_fn); +if (ret) { +dev_err (dev->devc,"Failed to initialise FW reset work\n" ); +return NULL ; + } + dev->ops = &ish_hw_ops; dev->devc = &pdev->dev; dev->mtu =IPC_PAYLOAD_SIZE -sizeof (struct ishtp_msg_hdr );
drivers/hwmon/hwmon.c +5 -2
@@ -736,6 +736,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, {struct hwmon_device *hwdev;struct device *hdev; +struct device *tdev = dev;int i, err, id;/* Complain about invalid characters in hwmon name attribute */
@@ -793,7 +794,9 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, hwdev->name = name; hdev->class = &hwmon_class; hdev->parent = dev; - hdev->of_node = dev ? dev->of_node :NULL ; +while (tdev && !tdev->of_node) + tdev = tdev->parent; + hdev->of_node = tdev ? tdev->of_node :NULL ; hwdev->chip = chip;dev_set_drvdata (hdev, drvdata);dev_set_name (hdev,HWMON_ID_FORMAT , id);
@@ -805,7 +808,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,INIT_LIST_HEAD (&hwdev->tzdata); -if (dev && dev->of_node && chip && chip->ops->read && +if (hdev->of_node && chip && chip->ops->read && chip->info[0 ]->type == hwmon_chip && (chip->info[0 ]->config[0 ] &HWMON_C_REGISTER_TZ )) { err =hwmon_thermal_register_sensors (hdev);
drivers/hwmon/it87.c +3 -1
@@ -486,6 +486,8 @@ static const struct it87_devices it87_devices[] = {#define has_pwm_freq2 (data) ((data)->features & FEAT_PWM_FREQ2)#define has_six_temp (data) ((data)->features & FEAT_SIX_TEMP)#define has_vin3_5v (data) ((data)->features & FEAT_VIN3_5V) +#define has_scaling (data) ((data)->features & (FEAT_12MV_ADC | \ + FEAT_10_9MV_ADC))struct it87_sio_data {int sioaddr;
@@ -3098,7 +3100,7 @@ static int it87_probe(struct platform_device *pdev) "Detected broken BIOS defaults, disabling PWM interface\n");/* Starting with IT8721F, we handle scaling of internal voltages */ -if (has_12mv_adc (data)) { +if (has_scaling (data)) {if (sio_data->internal &BIT (0 )) data->in_scaled |=BIT (3 );/* in3 is AVCC */ if (sio_data->internal &BIT (1 ))
drivers/i2c/busses/i2c-hisi.c +5 -1
@@ -340,7 +340,11 @@ static irqreturn_t hisi_i2c_irq(int irq, void *context)hisi_i2c_read_rx_fifo (ctlr); out: -if (int_stat &HISI_I2C_INT_TRANS_CPLT || ctlr->xfer_err) { +/* +* Only use TRANS_CPLT to indicate the completion. On error cases we'll +* get two interrupts, INT_ERR first then TRANS_CPLT. +*/ +if (int_stat &HISI_I2C_INT_TRANS_CPLT ) {hisi_i2c_disable_int (ctlr,HISI_I2C_INT_ALL );hisi_i2c_clear_int (ctlr,HISI_I2C_INT_ALL );complete (ctlr->completion);
drivers/i2c/busses/i2c-imx-lpi2c.c +4 -0
@@ -502,10 +502,14 @@ static int lpi2c_imx_xfer(struct i2c_adapter *adapter,static irqreturn_t lpi2c_imx_isr (int irq,void *dev_id) {struct lpi2c_imx_struct *lpi2c_imx = dev_id; +unsigned int enabled;unsigned int temp; + enabled =readl (lpi2c_imx->base +LPI2C_MIER ); +lpi2c_imx_intctrl (lpi2c_imx,0 ); temp =readl (lpi2c_imx->base +LPI2C_MSR ); + temp &= enabled;if (temp &MSR_RDF )lpi2c_imx_read_rxfifo (lpi2c_imx);
drivers/i2c/busses/i2c-xgene-slimpro.c +3 -0
@@ -307,6 +307,9 @@ static int slimpro_i2c_blkwr(struct slimpro_i2c_dev *ctx, u32 chip,u32 msg[3 ];int rc; +if (writelen >I2C_SMBUS_BLOCK_MAX ) +return -EINVAL ; +memcpy (ctx->dma_buffer, data, writelen); paddr =dma_map_single (ctx->dev, ctx->dma_buffer, writelen,DMA_TO_DEVICE );
drivers/interconnect/qcom/osm-l3.c +1 -1
@@ -275,7 +275,7 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) qnodes = desc->nodes; num_nodes = desc->num_nodes; - data =devm_kcalloc (&pdev->dev, num_nodes,sizeof (*node),GFP_KERNEL ); + data =devm_kzalloc (&pdev->dev,struct_size (data, nodes, num_nodes),GFP_KERNEL );if (!data)return -ENOMEM ;
drivers/md/dm-crypt.c +10 -6
@@ -68,7 +68,9 @@ struct dm_crypt_io {struct crypt_config *cc;struct bio *base_bio;u8 *integrity_metadata; -bool integrity_metadata_from_pool; + bool integrity_metadata_from_pool:1; + bool in_tasklet:1; +struct work_struct work;struct tasklet_struct tasklet;
@@ -1723,6 +1725,7 @@ static void crypt_io_init(struct dm_crypt_io *io, struct crypt_config *cc, io->ctx.r.req =NULL ; io->integrity_metadata =NULL ; io->integrity_metadata_from_pool = false; + io->in_tasklet = false;atomic_set (&io->io_pending,0 ); }
@@ -1768,14 +1771,13 @@ static void crypt_dec_pending(struct dm_crypt_io *io)* our tasklet. In this case we need to delay bio_endio() * execution to after the tasklet is done and dequeued. */ -if (tasklet_trylock (&io->tasklet)) { -tasklet_unlock (&io->tasklet); -bio_endio (base_bio); +if (io->in_tasklet) { +INIT_WORK (&io->work, kcryptd_io_bio_endio); +queue_work (cc->io_queue, &io->work);return ; } -INIT_WORK (&io->work, kcryptd_io_bio_endio); -queue_work (cc->io_queue, &io->work); +bio_endio (base_bio); }/*
@@ -1935,6 +1937,7 @@ static int dmcrypt_write(void *data) io =crypt_io_from_node (rb_first (&write_tree));rb_erase (&io->rb_node, &write_tree);kcryptd_io_write (io); +cond_resched (); }while (!RB_EMPTY_ROOT (&write_tree));blk_finish_plug (&plug); }
@@ -2228,6 +2231,7 @@ static void kcryptd_queue_crypt(struct dm_crypt_io *io)* it is being executed with irqs disabled. */ if (in_hardirq () ||irqs_disabled ()) { + io->in_tasklet = true;tasklet_init (&io->tasklet, kcryptd_crypt_tasklet, (unsigned long )&io->work);tasklet_schedule (&io->tasklet);return ;
drivers/md/dm-stats.c +6 -1
@@ -188,7 +188,7 @@ static int dm_stat_in_flight(struct dm_stat_shared *shared)atomic_read (&shared->in_flight[WRITE ]); } -void dm_stats_init (struct dm_stats *stats) +int dm_stats_init (struct dm_stats *stats) {int cpu;struct dm_stats_last_position *last;
@@ -197,11 +197,16 @@ void dm_stats_init(struct dm_stats *stats)INIT_LIST_HEAD (&stats->list); stats->precise_timestamps = false; stats->last = alloc_percpu(struct dm_stats_last_position); +if (!stats->last) +return -ENOMEM ; +for_each_possible_cpu (cpu) { last =per_cpu_ptr (stats->last, cpu); last->last_sector = (sector_t )ULLONG_MAX ; last->last_rw =UINT_MAX ; } + +return 0 ; }void dm_stats_cleanup (struct dm_stats *stats)
drivers/md/dm-stats.h +1 -1
@@ -21,7 +21,7 @@ struct dm_stats_aux {unsigned long long duration_ns; }; -void dm_stats_init (struct dm_stats *st); +int dm_stats_init (struct dm_stats *st);void dm_stats_cleanup (struct dm_stats *st);struct mapped_device ;
drivers/md/dm-thin.c +2 -0
@@ -3383,6 +3383,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) pt->low_water_blocks = low_water_blocks; pt->adjusted_pf = pt->requested_pf = pf; ti->num_flush_bios =1 ; + ti->limit_swap_bios = true;/* * Only need to enable discards if the pool should pass
@@ -4263,6 +4264,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) goto bad; ti->num_flush_bios =1 ; + ti->limit_swap_bios = true; ti->flush_supported = true; ti->per_io_data_size =sizeof (struct dm_thin_endio_hook );
drivers/md/dm.c +3 -1
@@ -1818,7 +1818,9 @@ static struct mapped_device *alloc_dev(int minor)if (!md->pending_io) goto bad; -dm_stats_init (&md->stats); + r =dm_stats_init (&md->stats); +if (r <0 ) + goto bad;/* Populate the mapping, nobody knows we exist yet */ spin_lock (&_minor_lock);
drivers/net/dsa/b53/b53_mmap.c +1 -1
@@ -263,7 +263,7 @@ static int b53_mmap_probe_of(struct platform_device *pdev,if (of_property_read_u32 (of_port,"reg" , ®))continue ; -if (reg <B53_CPU_PORT ) +if (reg <B53_N_PORTS ) pdata->enabled_ports |=BIT (reg); }
drivers/net/dsa/mt7530.c +27 -22
95 lines not on this page · raw message
drivers/net/ethernet/google/gve/gve_ethtool.c +4 -1
@@ -526,7 +526,10 @@ static int gve_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *cmd) {struct gve_priv *priv =netdev_priv (netdev); -int err =gve_adminq_report_link_speed (priv); +int err =0 ; + +if (priv->link_speed ==0 ) + err =gve_adminq_report_link_speed (priv); cmd->base.speed = priv->link_speed;return err;
drivers/net/ethernet/intel/i40e/i40e_txrx.c +4 -4
@@ -170,10 +170,10 @@ static char *i40e_create_dummy_packet(u8 *dummy_packet, bool ipv4, u8 l4proto, struct i40e_fdir_filter *data) {bool is_vlan = !!data->vlan_tag; -struct vlan_hdr vlan; -struct ipv6hdr ipv6; -struct ethhdr eth; -struct iphdr ip; +struct vlan_hdr vlan = {}; +struct ipv6hdr ipv6 = {}; +struct ethhdr eth = {}; +struct iphdr ip = {};u8 *tmp;if (ipv4) {
drivers/net/ethernet/intel/iavf/iavf_common.c +1 -1
@@ -661,7 +661,7 @@ struct iavf_rx_ptype_decoded iavf_ptype_lookup[BIT(8)] = {/* Non Tunneled IPv6 */ IAVF_PTT (88 ,IP ,IPV6 ,FRG ,NONE ,NONE ,NOF ,NONE ,PAY3 ),IAVF_PTT (89 ,IP ,IPV6 ,NOF ,NONE ,NONE ,NOF ,NONE ,PAY3 ), -IAVF_PTT (90 ,IP ,IPV6 ,NOF ,NONE ,NONE ,NOF ,UDP ,PAY3 ), +IAVF_PTT (90 ,IP ,IPV6 ,NOF ,NONE ,NONE ,NOF ,UDP ,PAY4 ),IAVF_PTT_UNUSED_ENTRY (91 ),IAVF_PTT (92 ,IP ,IPV6 ,NOF ,NONE ,NONE ,NOF ,TCP ,PAY4 ), IAVF_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
drivers/net/ethernet/intel/iavf/iavf_main.c +5 -0
@@ -4213,6 +4213,11 @@ static void iavf_remove(struct pci_dev *pdev)mutex_unlock (&adapter->crit_lock);break ; } +/* Simply return if we already went through iavf_shutdown */ +if (adapter->state == __IAVF_REMOVE) { +mutex_unlock (&adapter->crit_lock); +return ; + }mutex_unlock (&adapter->crit_lock);usleep_range (500 ,1000 );
drivers/net/ethernet/intel/iavf/iavf_txrx.c +1 -1
@@ -1061,7 +1061,7 @@ static inline void iavf_rx_hash(struct iavf_ring *ring,cpu_to_le64 ((u64 )IAVF_RX_DESC_FLTSTAT_RSS_HASH <<IAVF_RX_DESC_STATUS_FLTSTAT_SHIFT ); -if (ring->netdev->features &NETIF_F_RXHASH ) +if (!(ring->netdev->features &NETIF_F_RXHASH ))return ;if ((rx_desc->wb.qword1.status_error_len & rss_mask) == rss_mask) {
drivers/net/ethernet/intel/igb/igb_main.c +0 -2
@@ -3820,9 +3820,7 @@ static void igb_remove(struct pci_dev *pdev)igb_release_hw_control (adapter);#ifdef CONFIG_PCI_IOV -rtnl_lock ();igb_disable_sriov (pdev); -rtnl_unlock ();#endif unregister_netdev (netdev);
drivers/net/ethernet/intel/igbvf/netdev.c +6 -2
@@ -1074,7 +1074,7 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter) igbvf_intr_msix_rx,0 , adapter->rx_ring->name, netdev);if (err) - goto out; + goto free_irq_tx; adapter->rx_ring->itr_register =E1000_EITR (vector); adapter->rx_ring->itr_val = adapter->current_itr;
@@ -1083,10 +1083,14 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter) err =request_irq (adapter->msix_entries[vector].vector, igbvf_msix_other,0 , netdev->name, netdev);if (err) - goto out; + goto free_irq_rx;igbvf_configure_msix (adapter);return 0 ; +free_irq_rx: +free_irq (adapter->msix_entries[--vector].vector, netdev); +free_irq_tx: +free_irq (adapter->msix_entries[--vector].vector, netdev); out:return err; }
drivers/net/ethernet/intel/igbvf/vf.c +10 -3
@@ -1,6 +1,8 @@// SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 2009 - 2018 Intel Corporation. */ +#include <linux/etherdevice.h> +#include "vf.h" static s32 e1000_check_for_link_vf (struct e1000_hw *hw);
@@ -131,11 +133,16 @@ static s32 e1000_reset_hw_vf(struct e1000_hw *hw)/* set our "perm_addr" based on info provided by PF */ ret_val = mbx->ops.read_posted (hw, msgbuf,3 );if (!ret_val) { -if (msgbuf[0 ] == (E1000_VF_RESET | -E1000_VT_MSGTYPE_ACK )) +switch (msgbuf[0 ]) { +case E1000_VF_RESET |E1000_VT_MSGTYPE_ACK :memcpy (hw->mac.perm_addr, addr,ETH_ALEN ); -else +break ; +case E1000_VF_RESET |E1000_VT_MSGTYPE_NACK : +eth_zero_addr (hw->mac.perm_addr); +break ; +default : ret_val = -E1000_ERR_MAC_INIT ; + } } }
drivers/net/ethernet/intel/igc/igc_main.c +10 -10
@@ -5951,18 +5951,18 @@ static bool validate_schedule(struct igc_adapter *adapter,if (e->command !=TC_TAPRIO_CMD_SET_GATES )return false; -for (i =0 ; i < adapter->num_tx_queues; i++) { -if (e->gate_mask &BIT (i)) +for (i =0 ; i < adapter->num_tx_queues; i++) +if (e->gate_mask &BIT (i)) { queue_uses[i]++; -/* There are limitations: A single queue cannot be -* opened and closed multiple times per cycle unless the -* gate stays open. Check for it. -*/ -if (queue_uses[i] >1 && - !(prev->gate_mask &BIT (i))) -return false; - } +/* There are limitations: A single queue cannot +* be opened and closed multiple times per cycle +* unless the gate stays open. Check for it. +*/ +if (queue_uses[i] >1 && + !(prev->gate_mask &BIT (i))) +return false; + } }return true;
drivers/net/ethernet/marvell/octeontx2/nic/otx2_vf.c +2 -0
@@ -704,6 +704,7 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id) err_unreg_netdev:unregister_netdev (netdev); err_detach_rsrc: +free_percpu (vf->hw.lmt_info);if (test_bit (CN10K_LMTST , &vf->hw.cap_flag))qmem_free (vf->dev, vf->dync_lmt);otx2_detach_resources (&vf->mbox);
@@ -738,6 +739,7 @@ static void otx2vf_remove(struct pci_dev *pdev)destroy_workqueue (vf->otx2_wq);otx2vf_disable_mbox_intr (vf);otx2_detach_resources (&vf->mbox); +free_percpu (vf->hw.lmt_info);if (test_bit (CN10K_LMTST , &vf->hw.cap_flag))qmem_free (vf->dev, vf->dync_lmt);otx2vf_vfaf_mbox_destroy (vf);
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +4 -2
@@ -117,12 +117,14 @@ static int mlx5e_dcbnl_ieee_getets(struct net_device *netdev,if (!MLX5_CAP_GEN (priv->mdev, ets))return -EOPNOTSUPP ; - ets->ets_cap =mlx5_max_tc (priv->mdev) +1 ; -for (i =0 ; i < ets->ets_cap; i++) { +for (i =0 ; i <IEEE_8021QAZ_MAX_TCS ; i++) { err =mlx5_query_port_prio_tc (mdev, i, &ets->prio_tc[i]);if (err)return err; + } + ets->ets_cap =mlx5_max_tc (priv->mdev) +1 ; +for (i =0 ; i < ets->ets_cap; i++) { err =mlx5_query_port_tc_group (mdev, i, &tc_group[i]);if (err)return err;
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +5 -1
@@ -3527,8 +3527,12 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev,netdev_warn (netdev,"Disabling rxhash, not supported when CQE compress is active\n" ); } -if (mlx5e_is_uplink_rep (priv)) +if (mlx5e_is_uplink_rep (priv)) { features =mlx5e_fix_uplink_rep_features (netdev, features); + features |=NETIF_F_NETNS_LOCAL ; + }else { + features &= ~NETIF_F_NETNS_LOCAL ; + }mutex_unlock (&priv->state_lock);
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c +1 -2
@@ -301,8 +301,7 @@ int mlx5_esw_acl_ingress_vport_bond_update(struct mlx5_eswitch *esw, u16 vport_nif (WARN_ON_ONCE (IS_ERR (vport))) {esw_warn (esw->dev,"vport(%d) invalid!\n" , vport_num); - err =PTR_ERR (vport); - goto out; +return PTR_ERR (vport); }esw_acl_ingress_ofld_rules_destroy (esw, vport);
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +1 -0
@@ -918,6 +918,7 @@ void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num)*/ esw_vport_change_handle_locked (vport); vport->enabled_events =0 ; +esw_apply_vport_rx_mode (esw, vport, false, false);esw_vport_cleanup (esw, vport); esw->enabled_vports--;
drivers/net/ethernet/natsemi/sonic.c +2 -2
@@ -292,7 +292,7 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)*/ laddr =dma_map_single (lp->device, skb->data, length,DMA_TO_DEVICE ); -if (!laddr) { +if (dma_mapping_error (lp->device, laddr)) {pr_err_ratelimited ("%s: failed to map tx DMA buffer.\n" , dev->name);dev_kfree_skb_any (skb);return NETDEV_TX_OK ;
@@ -509,7 +509,7 @@ static bool sonic_alloc_rb(struct net_device *dev, struct sonic_local *lp, *new_addr =dma_map_single (lp->device,skb_put (*new_skb,SONIC_RBSIZE ),SONIC_RBSIZE ,DMA_FROM_DEVICE ); -if (!*new_addr) { +if (dma_mapping_error (lp->device, *new_addr)) {dev_kfree_skb (*new_skb); *new_skb =NULL ;return false;
drivers/net/ethernet/qlogic/qed/qed_sriov.c +4 -1
@@ -4378,6 +4378,9 @@ qed_iov_configure_min_tx_rate(struct qed_dev *cdev, int vfid, u32 rate) } vf =qed_iov_get_vf_info (QED_LEADING_HWFN (cdev), (u16 )vfid, true); +if (!vf) +return -EINVAL ; + vport_id = vf->vport_id;return qed_configure_vport_wfq (cdev, vport_id, rate);
@@ -5124,7 +5127,7 @@ static void qed_iov_handle_trust_change(struct qed_hwfn *hwfn)/* Validate that the VF has a configured vport */ vf =qed_iov_get_vf_info (hwfn, i, true); -if (!vf->vport_instance) +if (!vf || !vf->vport_instance)continue ;memset (¶ms,0 ,sizeof (params));
drivers/net/ethernet/qualcomm/emac/emac.c +6 -0
@@ -728,9 +728,15 @@ static int emac_remove(struct platform_device *pdev)struct net_device *netdev =dev_get_drvdata (&pdev->dev);struct emac_adapter *adpt =netdev_priv (netdev); +netif_carrier_off (netdev); +netif_tx_disable (netdev); +unregister_netdev (netdev);netif_napi_del (&adpt->rx_q.napi); +free_irq (adpt->irq.irq, &adpt->irq); +cancel_work_sync (&adpt->work_thread); +emac_clks_teardown (adpt);put_device (&adpt->phydev->mdio.dev);
drivers/net/ethernet/toshiba/ps3_gelic_net.c +22 -19
88 lines not on this page · raw message
drivers/net/ethernet/toshiba/ps3_gelic_net.h +3 -2
@@ -19,8 +19,9 @@#define GELIC_NET_RX_DESCRIPTORS 128/* num of descriptors */ #define GELIC_NET_TX_DESCRIPTORS 128/* num of descriptors */ -#define GELIC_NET_MAX_MTU VLAN_ETH_FRAME_LEN -#define GELIC_NET_MIN_MTU VLAN_ETH_ZLEN +#define GELIC_NET_MAX_FRAME 2312 +#define GELIC_NET_MAX_MTU 2294 +#define GELIC_NET_MIN_MTU 64#define GELIC_NET_RXBUF_ALIGN 128#define GELIC_CARD_RX_CSUM_DEFAULT 1/* hw chksum */ #define GELIC_NET_WATCHDOG_TIMEOUT 5*HZ
drivers/net/ethernet/xircom/xirc2ps_cs.c +5 -0
@@ -503,6 +503,11 @@ static void xirc2ps_detach(struct pcmcia_device *link) {struct net_device *dev = link->priv; +struct local_info *local =netdev_priv (dev); + +netif_carrier_off (dev); +netif_tx_disable (dev); +cancel_work_sync (&local->tx_timeout_task);dev_dbg (&link->dev,"detach\n" );
drivers/net/ieee802154/ca8210.c +2 -0
@@ -1956,6 +1956,8 @@ static int ca8210_skb_tx(* packet */ mac_len =ieee802154_hdr_peek_addrs (skb, &header); +if (mac_len <0 ) +return mac_len; secspec.security_level = header.sec.level; secspec.key_id_mode = header.sec.key_id_mode;
drivers/net/mdio/acpi_mdio.c +6 -4
@@ -18,16 +18,18 @@ MODULE_AUTHOR("Calvin Johnson <[email protected]>");MODULE_LICENSE ("GPL" );/** -* acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL. +* __acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL. * @mdio: pointer to mii_bus structure * @fwnode: pointer to fwnode of MDIO bus. This fwnode is expected to represent +* @owner: module owning this @mdio object. * an ACPI device object corresponding to the MDIO bus and its children are * expected to correspond to the PHY devices on that bus. * * This function registers the mii_bus structure and registers a phy_device * for each child node of @fwnode. */ -int acpi_mdiobus_register (struct mii_bus *mdio,struct fwnode_handle *fwnode) +int __acpi_mdiobus_register (struct mii_bus *mdio,struct fwnode_handle *fwnode, +struct module *owner) {struct fwnode_handle *child;u32 addr;
@@ -35,7 +37,7 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)/* Mask out all PHYs from auto probing. */ mdio->phy_mask =GENMASK (31 ,0 ); - ret =mdiobus_register (mdio); + ret =__mdiobus_register (mdio, owner);if (ret)return ret;
@@ -55,4 +57,4 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) }return 0 ; } -EXPORT_SYMBOL (acpi_mdiobus_register); +EXPORT_SYMBOL (__acpi_mdiobus_register);
drivers/net/mdio/mdio-thunder.c +1 -0
@@ -104,6 +104,7 @@ static int thunder_mdiobus_pci_probe(struct pci_dev *pdev,if (i >=ARRAY_SIZE (nexus->buses))break ; } +fwnode_handle_put (fwn);return 0 ; err_release_regions:
drivers/net/mdio/of_mdio.c +7 -5
@@ -139,21 +139,23 @@ bool of_mdiobus_child_is_phy(struct device_node *child)EXPORT_SYMBOL (of_mdiobus_child_is_phy);/** -* of_mdiobus_register - Register mii_bus and create PHYs from the device tree +* __of_mdiobus_register - Register mii_bus and create PHYs from the device tree * @mdio: pointer to mii_bus structure * @np: pointer to device_node of MDIO bus. +* @owner: module owning the @mdio object. * * This function registers the mii_bus structure and registers a phy_device * for each child node of @np. */ -int of_mdiobus_register (struct mii_bus *mdio,struct device_node *np) +int __of_mdiobus_register (struct mii_bus *mdio,struct device_node *np, +struct module *owner) {struct device_node *child;bool scanphys = false;int addr, rc;if (!np) -return mdiobus_register (mdio); +return __mdiobus_register (mdio, owner);/* Do not continue if the node is disabled */ if (!of_device_is_available (np))
@@ -172,7 +174,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)of_property_read_u32 (np,"reset-post-delay-us" , &mdio->reset_post_delay_us);/* Register the MDIO bus */ - rc =mdiobus_register (mdio); + rc =__mdiobus_register (mdio, owner);if (rc)return rc;
@@ -236,7 +238,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)mdiobus_unregister (mdio);return rc; } -EXPORT_SYMBOL (of_mdiobus_register); +EXPORT_SYMBOL (__of_mdiobus_register);/** * of_mdio_find_device - Given a device tree node, find the mdio_device
drivers/net/phy/mdio_devres.c +6 -5
@@ -98,13 +98,14 @@ EXPORT_SYMBOL(__devm_mdiobus_register);#if IS_ENABLED (CONFIG_OF_MDIO )/** -* devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register() +* __devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register() * @dev: Device to register mii_bus for * @mdio: MII bus structure to register * @np: Device node to parse +* @owner: Owning module */ -int devm_of_mdiobus_register (struct device *dev,struct mii_bus *mdio, -struct device_node *np) +int __devm_of_mdiobus_register (struct device *dev,struct mii_bus *mdio, +struct device_node *np,struct module *owner) {struct mdiobus_devres *dr;int ret;
@@ -117,7 +118,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,if (!dr)return -ENOMEM ; - ret =of_mdiobus_register (mdio, np); + ret =__of_mdiobus_register (mdio, np, owner);if (ret) {devres_free (dr);return ret;
@@ -127,7 +128,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,devres_add (dev, dr); return 0; } -EXPORT_SYMBOL (devm_of_mdiobus_register); +EXPORT_SYMBOL (__devm_of_mdiobus_register);#endif /* CONFIG_OF_MDIO */ MODULE_LICENSE ("GPL" );
drivers/net/phy/phy.c +16 -7
@@ -57,6 +57,18 @@ static const char *phy_state_to_str(enum phy_state st)return NULL ; } +static void phy_process_state_change (struct phy_device *phydev, +enum phy_state old_state) +{ +if (old_state != phydev->state) { +phydev_dbg (phydev,"PHY state change %s -> %s\n" , +phy_state_to_str (old_state), +phy_state_to_str (phydev->state)); +if (phydev->drv && phydev->drv->link_change_notify) + phydev->drv->link_change_notify (phydev); + } +} +static void phy_link_up (struct phy_device *phydev) { phydev->phy_link_change (phydev, true);
@@ -1061,6 +1073,7 @@ EXPORT_SYMBOL(phy_free_interrupt);void phy_stop (struct phy_device *phydev) {struct net_device *dev = phydev->attached_dev; +enum phy_state old_state;if (!phy_is_started (phydev) && phydev->state !=PHY_DOWN ) { WARN(1, "called from state %s\n",
@@ -1069,6 +1082,7 @@ void phy_stop(struct phy_device *phydev) }mutex_lock (&phydev->lock); + old_state = phydev->state;if (phydev->state ==PHY_CABLETEST ) {phy_abort_cable_test (phydev);
@@ -1079,6 +1093,7 @@ void phy_stop(struct phy_device *phydev)sfp_upstream_stop (phydev->sfp_bus); phydev->state =PHY_HALTED ; +phy_process_state_change (phydev, old_state);mutex_unlock (&phydev->lock);
@@ -1196,13 +1211,7 @@ void phy_state_machine(struct work_struct *work)if (err <0 )phy_error (phydev); -if (old_state != phydev->state) { -phydev_dbg (phydev,"PHY state change %s -> %s\n" , -phy_state_to_str (old_state), -phy_state_to_str (phydev->state)); -if (phydev->drv && phydev->drv->link_change_notify) - phydev->drv->link_change_notify (phydev); - } +phy_process_state_change (phydev, old_state);/* Only re-schedule a PHY state machine change if we are polling the * PHY, if PHY_MAC_INTERRUPT is set, then we will be moving
drivers/net/usb/cdc_mbim.c +5 -0
@@ -664,6 +664,11 @@ static const struct usb_device_id mbim_devs[] = { .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle, }, +/* Telit FE990 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1081, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), + .driver_info = (unsigned long )&cdc_mbim_info_avoid_altsetting_toggle, + }, + /* default entry */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), .driver_info = (unsigned long)&cdc_mbim_info_zlp,
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1358,6 +1358,7 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1080, 2)}, /* Telit FE990 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
drivers/net/usb/smsc95xx.c +6 -0
@@ -1808,6 +1808,12 @@ static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb) size = (u16)((header &RX_STS_FL_ ) >>16 ); align_count = (4 - ((size +NET_IP_ALIGN ) %4 )) %4 ; +if (unlikely (size > skb->len)) { +netif_dbg (dev, rx_err, dev->net, +"size err header=0x%08x\n" , header); +return 0 ; + } +if (unlikely (header &RX_STS_ES_ )) {netif_dbg (dev, rx_err, dev->net,"Error header=0x%08x\n" , header);
drivers/platform/chrome/cros_ec_chardev.c +1 -1
@@ -284,7 +284,7 @@ static long cros_ec_chardev_ioctl_xcmd(struct cros_ec_dev *ec, void __user *arg) u_cmd.insize > EC_MAX_MSG_BYTES)return -EINVAL ; - s_cmd =kmalloc (sizeof (*s_cmd) +max (u_cmd.outsize, u_cmd.insize), + s_cmd =kzalloc (sizeof (*s_cmd) +max (u_cmd.outsize, u_cmd.insize),GFP_KERNEL );if (!s_cmd)return -ENOMEM ;
drivers/power/supply/bq24190_charger.c +22 -42
151 lines not on this page · raw message
drivers/power/supply/da9150-charger.c +1 -0
@@ -662,6 +662,7 @@ static int da9150_charger_remove(struct platform_device *pdev)if (!IS_ERR_OR_NULL (charger->usb_phy))usb_unregister_notifier (charger->usb_phy, &charger->otg_nb); +cancel_work_sync (&charger->otg_work);power_supply_unregister (charger->battery);power_supply_unregister (charger->usb);
drivers/scsi/device_handler/scsi_dh_alua.c +4 -2
@@ -1117,10 +1117,12 @@ static int alua_activate(struct scsi_device *sdev,rcu_read_unlock ();mutex_unlock (&h->init_mutex); -if (alua_rtpg_queue (pg, sdev, qdata, true)) +if (alua_rtpg_queue (pg, sdev, qdata, true)) { fn =NULL ; -else + }else { +kfree (qdata); err =SCSI_DH_DEV_OFFLINED ; + }kref_put (&pg->kref, release_port_group); out:if (fn)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +1 -2
@@ -2424,8 +2424,7 @@ static int interrupt_preinit_v3_hw(struct hisi_hba *hisi_hba) hisi_hba->cq_nvecs = vectors -BASE_VECTORS_V3_HW ; shost->nr_hw_queues = hisi_hba->cq_nvecs; -devm_add_action (&pdev->dev, hisi_sas_v3_free_vectors, pdev); -return 0 ; +return devm_add_action (&pdev->dev, hisi_sas_v3_free_vectors, pdev); }static int interrupt_init_v3_hw (struct hisi_hba *hisi_hba)
drivers/scsi/lpfc/lpfc_init.c +2 -0
@@ -7056,6 +7056,8 @@ lpfc_sli4_cgn_params_read(struct lpfc_hba *phba)/* Find out if the FW has a new set of congestion parameters. */ len =sizeof (struct lpfc_cgn_param ); pdata =kzalloc (len,GFP_KERNEL ); +if (!pdata) +return -ENOMEM ; ret =lpfc_read_object (phba, (char *)LPFC_PORT_CFG_NAME , pdata, len);
drivers/scsi/lpfc/lpfc_sli.c +4 -8
@@ -22166,20 +22166,20 @@ lpfc_get_io_buf_from_private_pool(struct lpfc_hba *phba,static struct lpfc_io_buf *lpfc_get_io_buf_from_expedite_pool (struct lpfc_hba *phba) { -struct lpfc_io_buf *lpfc_ncmd; +struct lpfc_io_buf *lpfc_ncmd =NULL , *iter;struct lpfc_io_buf *lpfc_ncmd_next;unsigned long iflag;struct lpfc_epd_pool *epd_pool; epd_pool = &phba->epd_pool; - lpfc_ncmd =NULL ;spin_lock_irqsave (&epd_pool->lock, iflag);if (epd_pool->count >0 ) { -list_for_each_entry_safe (lpfc_ncmd, lpfc_ncmd_next, +list_for_each_entry_safe (iter, lpfc_ncmd_next, &epd_pool->list, list) { -list_del (&lpfc_ncmd->list); +list_del (&iter->list); epd_pool->count--; + lpfc_ncmd = iter;break ; } }
@@ -22376,10 +22376,6 @@ lpfc_read_object(struct lpfc_hba *phba, char *rdobject, uint32_t *datap,struct lpfc_dmabuf *pcmd;u32 rd_object_name[LPFC_MBX_OBJECT_NAME_LEN_DW ] = {0 }; -/* sanity check on queue memory */ -if (!datap) -return -ENODEV ; - mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!mbox)return -ENOMEM ;
drivers/scsi/qla2xxx/qla_isr.c +2 -1
@@ -1897,6 +1897,8 @@ qla2x00_get_sp_from_handle(scsi_qla_host_t *vha, const char *func, } req->outstanding_cmds[index] =NULL ; + +qla_put_fw_resources (sp->qpair, &sp->iores);return sp; }
@@ -3099,7 +3101,6 @@ qla25xx_process_bidir_status_iocb(scsi_qla_host_t *vha, void *pkt, } bsg_reply->reply_payload_rcv_len =0 ; -qla_put_fw_resources (sp->qpair, &sp->iores); done:/* Return the vendor specific reply to API */ bsg_reply->reply_data.vendor_reply.vendor_rsp[0 ] = rval;
drivers/scsi/qla2xxx/qla_os.c +11 -0
@@ -1845,6 +1845,17 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)for (cnt =1 ; cnt < req->num_outstanding_cmds; cnt++) { sp = req->outstanding_cmds[cnt];if (sp) { +/* +* perform lockless completion during driver unload +*/ +if (qla2x00_chip_is_down (vha)) { + req->outstanding_cmds[cnt] =NULL ; +spin_unlock_irqrestore (qp->qp_lock_ptr, flags); + sp->done (sp, res); +spin_lock_irqsave (qp->qp_lock_ptr, flags); +continue ; + } +switch (sp->cmd_type) {case TYPE_SRB :qla2x00_abort_srb (qp, sp, res, &flags);
drivers/scsi/scsi_devinfo.c +1 -0
@@ -233,6 +233,7 @@ static struct { {"SGI", "RAID5", "*", BLIST_SPARSELUN}, {"SGI", "TP9100", "*", BLIST_REPORTLUN2}, {"SGI", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, + {"SKhynix", "H28U74301AMR", NULL, BLIST_SKIP_VPD_PAGES}, {"IBM", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, {"SUN", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, {"DELL", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
drivers/scsi/storvsc_drv.c +16 -0
@@ -1050,6 +1050,22 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb, goto do_work; } +/* +* Check for "Operating parameters have changed" +* due to Hyper-V changing the VHD/VHDX BlockSize +* when adding/removing a differencing disk. This +* causes discard_granularity to change, so do a +* rescan to pick up the new granularity. We don't +* want scsi_report_sense() to output a message +* that a sysadmin wouldn't know what to do with. +*/ +if ((asc ==0x3f ) && (ascq !=0x03 ) && + (ascq !=0x0e )) { + process_err_fn = storvsc_device_scan; +set_host_byte (scmnd,DID_REQUEUE ); + goto do_work; + } +/* * Otherwise, let upper layer deal with the * error when sense message is present
drivers/scsi/ufs/ufshcd.c +1 -0
@@ -9734,5 +9734,6 @@ module_exit(ufshcd_core_exit);MODULE_AUTHOR ("Santosh Yaragnavi <[email protected]>" );MODULE_AUTHOR ("Vinayak Holikatti <[email protected]>" );MODULE_DESCRIPTION ("Generic UFS host controller driver Core" ); +MODULE_SOFTDEP ("pre: governor_simpleondemand" );MODULE_LICENSE ("GPL" );MODULE_VERSION (UFSHCD_DRIVER_VERSION );
drivers/target/iscsi/iscsi_target_parameters.c +7 -5
@@ -1262,18 +1262,20 @@ static struct iscsi_param *iscsi_check_key(return param;if (!(param->phase & phase)) { -pr_err ("Key \"%s\" may not be negotiated during " , - param->name); +char *phase_name; +switch (phase) {case PHASE_SECURITY : -pr_debug ("Security phase.\n" ); + phase_name ="Security" ;break ;case PHASE_OPERATIONAL : -pr_debug ("Operational phase.\n" ); + phase_name ="Operational" ;break ;default : -pr_debug ("Unknown phase.\n" ); + phase_name ="Unknown" ; } +pr_err ("Key \"%s\" may not be negotiated during %s phase.\n" , + param->name, phase_name);return NULL ; }
drivers/tee/amdtee/core.c +14 -15
@@ -267,35 +267,34 @@ int amdtee_open_session(struct tee_context *ctx, goto out; } +/* Open session with loaded TA */ +handle_open_session (arg, &session_info, param); +if (arg->ret !=TEEC_SUCCESS ) { +pr_err ("open_session failed %d\n" , arg->ret); +handle_unload_ta (ta_handle); +kref_put (&sess->refcount, destroy_session); + goto out; + } +/* Find an empty session index for the given TA */ spin_lock (&sess->lock); i =find_first_zero_bit (sess->sess_mask,TEE_NUM_SESSIONS ); -if (i <TEE_NUM_SESSIONS ) +if (i <TEE_NUM_SESSIONS ) { + sess->session_info[i] = session_info; +set_session_id (ta_handle, i, &arg->session);set_bit (i, sess->sess_mask); + }spin_unlock (&sess->lock);if (i >=TEE_NUM_SESSIONS ) {pr_err ("reached maximum session count %d\n" ,TEE_NUM_SESSIONS ); +handle_close_session (ta_handle, session_info);handle_unload_ta (ta_handle);kref_put (&sess->refcount, destroy_session); rc = -ENOMEM ; goto out; } -/* Open session with loaded TA */ -handle_open_session (arg, &session_info, param); -if (arg->ret !=TEEC_SUCCESS ) { -pr_err ("open_session failed %d\n" , arg->ret); -spin_lock (&sess->lock); -clear_bit (i, sess->sess_mask); -spin_unlock (&sess->lock); -handle_unload_ta (ta_handle); -kref_put (&sess->refcount, destroy_session); - goto out; - } - - sess->session_info[i] = session_info; -set_session_id (ta_handle, i, &arg->session); out:free_pages ((u64 )ta,get_order (ta_size));return rc;
drivers/thunderbolt/nhi.c +30 -19
89 lines not on this page · raw message
drivers/thunderbolt/nhi_regs.h +4 -2
@@ -77,12 +77,13 @@ struct ring_desc {/* * three bitfields: tx, rx, rx overflow -* Every bitfield contains one bit for every hop (REG_HOP_COUNT). Registers are -* cleared on read. New interrupts are fired only after ALL registers have been +* Every bitfield contains one bit for every hop (REG_HOP_COUNT). +* New interrupts are fired only after ALL registers have been * read (even those containing only disabled rings). */ #define REG_RING_NOTIFY_BASE 0x37800#define RING_NOTIFY_REG_COUNT (nhi) ((31 + 3 * nhi->hop_count) / 32) +#define REG_RING_INT_CLEAR 0x37808/* * two bitfields: rx, tx
@@ -105,6 +106,7 @@ struct ring_desc {#define REG_DMA_MISC 0x39864#define REG_DMA_MISC_INT_AUTO_CLEAR BIT(2) +#define REG_DMA_MISC_DISABLE_AUTO_CLEAR BIT(17)#define REG_INMAIL_DATA 0x39900
drivers/thunderbolt/retimer.c +21 -2
@@ -208,6 +208,22 @@ static ssize_t nvm_authenticate_show(struct device *dev,return ret; } +static void tb_retimer_set_inbound_sbtx (struct tb_port *port) +{ +int i; + +for (i =1 ; i <=TB_MAX_RETIMER_INDEX ; i++) +usb4_port_retimer_set_inbound_sbtx (port, i); +} + +static void tb_retimer_unset_inbound_sbtx (struct tb_port *port) +{ +int i; + +for (i =TB_MAX_RETIMER_INDEX ; i >=1 ; i--) +usb4_port_retimer_unset_inbound_sbtx (port, i); +} +static ssize_t nvm_authenticate_store (struct device *dev,struct device_attribute *attr,const char *buf,size_t count) {
@@ -234,6 +250,7 @@ static ssize_t nvm_authenticate_store(struct device *dev, rt->auth_status =0 ;if (val) { +tb_retimer_set_inbound_sbtx (rt->port);if (val ==AUTHENTICATE_ONLY ) { ret =tb_retimer_nvm_authenticate (rt, true); }else {
@@ -253,6 +270,7 @@ static ssize_t nvm_authenticate_store(struct device *dev, } exit_unlock: +tb_retimer_unset_inbound_sbtx (rt->port);mutex_unlock (&rt->tb->lock); exit_rpm:pm_runtime_mark_last_busy (&rt->dev);
@@ -466,8 +484,7 @@ int tb_retimer_scan(struct tb_port *port, bool add)* Enable sideband channel for each retimer. We can do this * regardless whether there is device connected or not. */ -for (i =1 ; i <=TB_MAX_RETIMER_INDEX ; i++) -usb4_port_retimer_set_inbound_sbtx (port, i); +tb_retimer_set_inbound_sbtx (port);/* * Before doing anything else, read the authentication status.
@@ -490,6 +507,8 @@ int tb_retimer_scan(struct tb_port *port, bool add)break ; } +tb_retimer_unset_inbound_sbtx (port); +if (!last_idx)return 0 ;
drivers/thunderbolt/sb_regs.h +1 -0
@@ -20,6 +20,7 @@ enum usb4_sb_opcode {USB4_SB_OPCODE_ROUTER_OFFLINE =0x4e45534c ,/* "LSEN" */ USB4_SB_OPCODE_ENUMERATE_RETIMERS =0x4d554e45 ,/* "ENUM" */ USB4_SB_OPCODE_SET_INBOUND_SBTX =0x5055534c ,/* "LSUP" */ +USB4_SB_OPCODE_UNSET_INBOUND_SBTX =0x50555355 ,/* "USUP" */ USB4_SB_OPCODE_QUERY_LAST_RETIMER =0x5453414c ,/* "LAST" */ USB4_SB_OPCODE_GET_NVM_SECTOR_SIZE =0x53534e47 ,/* "GNSS" */ USB4_SB_OPCODE_NVM_SET_OFFSET = 0x53504f42, /* "BOPS" */
drivers/thunderbolt/switch.c +2 -2
@@ -2750,8 +2750,6 @@ int tb_switch_add(struct tb_switch *sw) }tb_sw_dbg (sw,"uid: %#llx\n" , sw->uid); -tb_check_quirks (sw); - ret =tb_switch_set_uuid (sw);if (ret) {dev_err (&sw->dev,"failed to set UUID\n" );
@@ -2770,6 +2768,8 @@ int tb_switch_add(struct tb_switch *sw) } } +tb_check_quirks (sw); +tb_switch_default_link_ports (sw); ret =tb_switch_update_link_attributes (sw);
drivers/thunderbolt/tb.h +1 -0
@@ -1080,6 +1080,7 @@ int usb4_port_router_online(struct tb_port *port);int usb4_port_enumerate_retimers (struct tb_port *port);int usb4_port_retimer_set_inbound_sbtx (struct tb_port *port,u8 index); +int usb4_port_retimer_unset_inbound_sbtx (struct tb_port *port,u8 index);int usb4_port_retimer_read (struct tb_port *port,u8 index,u8 reg,void *buf,u8 size); int usb4_port_retimer_write(struct tb_port *port, u8 index, u8 reg,
drivers/thunderbolt/usb4.c +31 -5
@@ -1441,6 +1441,20 @@ int usb4_port_retimer_set_inbound_sbtx(struct tb_port *port, u8 index) 500); } +/** +* usb4_port_retimer_unset_inbound_sbtx() - Disable sideband channel transactions +* @port: USB4 port +* @index: Retimer index +* +* Disables sideband channel transations on SBTX. The reverse of +* usb4_port_retimer_set_inbound_sbtx(). +*/ +int usb4_port_retimer_unset_inbound_sbtx (struct tb_port *port,u8 index) +{ +return usb4_port_retimer_op (port, index, +USB4_SB_OPCODE_UNSET_INBOUND_SBTX ,500 ); +} +/** * usb4_port_retimer_read() - Read from retimer sideband registers * @port: USB4 port
@@ -1930,18 +1944,30 @@ static int usb4_usb3_port_write_allocated_bandwidth(struct tb_port *port, int downstream_bw) {u32 val, ubw, dbw, scale; -int ret; +int ret, max_bw; -/* Read the used scale, hardware default is 0 */ - ret =tb_port_read (port, &scale,TB_CFG_PORT , - port->cap_adap +ADP_USB3_CS_3 ,1 ); +/* Figure out suitable scale */ + scale =0 ; + max_bw =max (upstream_bw, downstream_bw); +while (scale <64 ) { +if (mbps_to_usb3_bw (max_bw, scale) <4096 ) +break ; + scale++; + } + +if (WARN_ON (scale >=64 )) +return -EINVAL ; + + ret =tb_port_write (port, &scale,TB_CFG_PORT , + port->cap_adap +ADP_USB3_CS_3 ,1 );if (ret)return ret; - scale &=ADP_USB3_CS_3_SCALE_MASK ; ubw =mbps_to_usb3_bw (upstream_bw, scale); dbw =mbps_to_usb3_bw (downstream_bw, scale); +tb_port_dbg (port,"scaled bandwidth %u/%u, scale %u\n" , ubw, dbw, scale); + ret =tb_port_read (port, &val,TB_CFG_PORT , port->cap_adap +ADP_USB3_CS_2 ,1 );if (ret)
drivers/tty/hvc/hvc_xen.c +17 -2
@@ -43,6 +43,7 @@ struct xencons_info {int irq;int vtermno;grant_ref_t gntref; +spinlock_t ring_lock; };static LIST_HEAD (xenconsoles);
@@ -89,12 +90,15 @@ static int __write_console(struct xencons_info *xencons,XENCONS_RING_IDX cons, prod;struct xencons_interface *intf = xencons->intf;int sent =0 ; +unsigned long flags; +spin_lock_irqsave (&xencons->ring_lock, flags); cons = intf->out_cons; prod = intf->out_prod;mb ();/* update queue values before going on */ if ((prod - cons) >sizeof (intf->out)) { +spin_unlock_irqrestore (&xencons->ring_lock, flags);pr_err_once ("xencons: Illegal ring page indices" );return -EINVAL ; }
@@ -104,6 +108,7 @@ static int __write_console(struct xencons_info *xencons,wmb ();/* write ring before updating pointer */ intf->out_prod = prod; +spin_unlock_irqrestore (&xencons->ring_lock, flags);if (sent)notify_daemon (xencons);
@@ -146,16 +151,19 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len)int recv =0 ;struct xencons_info *xencons =vtermno_to_xencons (vtermno);unsigned int eoiflag =0 ; +unsigned long flags;if (xencons ==NULL )return -EINVAL ; intf = xencons->intf; +spin_lock_irqsave (&xencons->ring_lock, flags); cons = intf->in_cons; prod = intf->in_prod;mb ();/* get pointers before reading ring */ if ((prod - cons) >sizeof (intf->in)) { +spin_unlock_irqrestore (&xencons->ring_lock, flags);pr_err_once ("xencons: Illegal ring page indices" );return -EINVAL ; }
@@ -179,10 +187,13 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len) xencons->out_cons = intf->out_cons; xencons->out_cons_same =0 ; } +if (!recv && xencons->out_cons_same++ >1 ) { + eoiflag =XEN_EOI_FLAG_SPURIOUS ; + } +spin_unlock_irqrestore (&xencons->ring_lock, flags); +if (recv) {notify_daemon (xencons); - }else if (xencons->out_cons_same++ >1 ) { - eoiflag =XEN_EOI_FLAG_SPURIOUS ; }xen_irq_lateeoi (xencons->irq, eoiflag);
@@ -239,6 +250,7 @@ static int xen_hvm_console_init(void) info =kzalloc (sizeof (struct xencons_info ),GFP_KERNEL );if (!info)return -ENOMEM ; +spin_lock_init (&info->ring_lock); }else if (info->intf !=NULL ) {/* already configured */ return 0 ;
@@ -275,6 +287,7 @@ static int xen_hvm_console_init(void)static int xencons_info_pv_init (struct xencons_info *info,int vtermno) { +spin_lock_init (&info->ring_lock); info->evtchn = xen_start_info->console.domU.evtchn;/* GFN == MFN for PV guest */ info->intf =gfn_to_virt (xen_start_info->console.domU.mfn);
@@ -325,6 +338,7 @@ static int xen_initial_domain_console_init(void) info =kzalloc (sizeof (struct xencons_info ),GFP_KERNEL );if (!info)return -ENOMEM ; +spin_lock_init (&info->ring_lock); } info->irq =bind_virq_to_irq (VIRQ_CONSOLE ,0 , false);
@@ -482,6 +496,7 @@ static int xencons_probe(struct xenbus_device *dev, info =kzalloc (sizeof (struct xencons_info ),GFP_KERNEL );if (!info)return -ENOMEM ; +spin_lock_init (&info->ring_lock);dev_set_drvdata (&dev->dev, info); info->xbdev = dev; info->vtermno =xenbus_devid_to_vtermno (devid);
drivers/tty/serial/8250/Kconfig +3 -1
@@ -253,7 +253,9 @@ config SERIAL_8250_ASPEED_VUART tristate "Aspeed Virtual UART" depends on SERIAL_8250 depends on OF - depends on REGMAP && MFD_SYSCON + depends on MFD_SYSCON + depends on ARCH_ASPEED || COMPILE_TEST + select REGMAP help If you want to use the virtual UART (VUART) device on Aspeed BMC platforms, enable this option. This enables the 16550A-
drivers/tty/serial/fsl_lpuart.c +7 -12
@@ -573,7 +573,7 @@ static void lpuart_flush_buffer(struct uart_port *port) sport->dma_tx_nents, DMA_TO_DEVICE); sport->dma_tx_in_progress = false; } -dmaengine_terminate_all (chan); +dmaengine_terminate_async (chan); }if (lpuart_is_32 (sport)) {
@@ -1307,7 +1307,8 @@ static void lpuart_dma_rx_free(struct uart_port *port) struct lpuart_port, port);struct dma_chan *chan = sport->dma_rx_chan; -dmaengine_terminate_all (chan); +dmaengine_terminate_sync (chan); +del_timer_sync (&sport->lpuart_timer);dma_unmap_sg (chan->device->dev, &sport->rx_sgl,1 ,DMA_FROM_DEVICE );kfree (sport->rx_ring.buf); sport->rx_ring.tail =0 ;
@@ -1773,7 +1774,6 @@ static int lpuart32_startup(struct uart_port *port)static void lpuart_dma_shutdown (struct lpuart_port *sport) {if (sport->lpuart_dma_rx_use) { -del_timer_sync (&sport->lpuart_timer);lpuart_dma_rx_free (&sport->port); sport->lpuart_dma_rx_use = false; }
@@ -1782,7 +1782,7 @@ static void lpuart_dma_shutdown(struct lpuart_port *sport)if (wait_event_interruptible (sport->dma_wait, !sport->dma_tx_in_progress) != false) { sport->dma_tx_in_progress = false; -dmaengine_terminate_all (sport->dma_tx_chan); +dmaengine_terminate_sync (sport->dma_tx_chan); } sport->lpuart_dma_tx_use = false; }
@@ -1933,10 +1933,8 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,* Since timer function acqures sport->port.lock, need to stop before * acquring same lock because otherwise del_timer_sync() can deadlock. */ -if (old && sport->lpuart_dma_rx_use) { -del_timer_sync (&sport->lpuart_timer); +if (old && sport->lpuart_dma_rx_use)lpuart_dma_rx_free (&sport->port); - }spin_lock_irqsave (&sport->port.lock, flags);
@@ -2171,10 +2169,8 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,* Since timer function acqures sport->port.lock, need to stop before * acquring same lock because otherwise del_timer_sync() can deadlock. */ -if (old && sport->lpuart_dma_rx_use) { -del_timer_sync (&sport->lpuart_timer); +if (old && sport->lpuart_dma_rx_use)lpuart_dma_rx_free (&sport->port); - }spin_lock_irqsave (&sport->port.lock, flags);
@@ -2866,11 +2862,10 @@ static int __maybe_unused lpuart_suspend(struct device *dev)* EDMA driver during suspend will forcefully release any * non-idle DMA channels. If port wakeup is enabled or if port * is console port or 'no_console_suspend' is set the Rx DMA -* cannot resume as as expected, hence gracefully release the +* cannot resume as expected, hence gracefully release the * Rx DMA path before suspend and start Rx DMA path on resume. */ if (irq_wake) { -del_timer_sync (&sport->lpuart_timer);lpuart_dma_rx_free (&sport->port); }
drivers/usb/cdns3/cdns3-pci-wrap.c +5 -0
@@ -60,6 +60,11 @@ static struct pci_dev *cdns3_get_second_fun(struct pci_dev *pdev)return NULL ; } +if (func->devfn !=PCI_DEV_FN_HOST_DEVICE && + func->devfn !=PCI_DEV_FN_OTG ) { +return NULL ; + } +return func; }
drivers/usb/cdns3/cdnsp-ep0.c +1 -18
@@ -403,20 +403,6 @@ static int cdnsp_ep0_std_request(struct cdnsp_device *pdev,case USB_REQ_SET_ISOCH_DELAY : ret =cdnsp_ep0_set_isoch_delay (pdev, ctrl);break ; -case USB_REQ_SET_INTERFACE : -/* -* Add request into pending list to block sending status stage -* by libcomposite. -*/ -list_add_tail (&pdev->ep0_preq.list, - &pdev->ep0_preq.pep->pending_list); - - ret =cdnsp_ep0_delegate_req (pdev, ctrl); -if (ret == -EBUSY ) - ret =0 ; - -list_del (&pdev->ep0_preq.list); -break ;default : ret =cdnsp_ep0_delegate_req (pdev, ctrl);break ;
@@ -474,9 +460,6 @@ void cdnsp_setup_analyze(struct cdnsp_device *pdev)else ret =cdnsp_ep0_delegate_req (pdev, ctrl); -if (!len) - pdev->ep0_stage =CDNSP_STATUS_STAGE ; -if (ret ==USB_GADGET_DELAYED_STATUS ) {trace_cdnsp_ep0_status_stage ("delayed" );return ;
@@ -484,6 +467,6 @@ void cdnsp_setup_analyze(struct cdnsp_device *pdev) out:if (ret <0 )cdnsp_ep0_stall (pdev); -else if (pdev->ep0_stage ==CDNSP_STATUS_STAGE ) +else if (!len && pdev->ep0_stage !=CDNSP_STATUS_STAGE )cdnsp_status_stage (pdev); }
drivers/usb/cdns3/cdnsp-pci.c +11 -16
@@ -29,30 +29,23 @@#define PLAT_DRIVER_NAME "cdns-usbssp"#define CDNS_VENDOR_ID 0x17cd -#define CDNS_DEVICE_ID 0x0100 +#define CDNS_DEVICE_ID 0x0200 +#define CDNS_DRD_ID 0x0100#define CDNS_DRD_IF (PCI_CLASS_SERIAL_USB << 8 | 0x80)static struct pci_dev *cdnsp_get_second_fun (struct pci_dev *pdev) { -struct pci_dev *func; -/* * Gets the second function. -* It's little tricky, but this platform has two function. -* The fist keeps resources for Host/Device while the second -* keeps resources for DRD/OTG. +* Platform has two function. The fist keeps resources for +* Host/Device while the secon keeps resources for DRD/OTG. */ - func =pci_get_device (pdev->vendor, pdev->device,NULL ); -if (!func) -return NULL ; +if (pdev->device ==CDNS_DEVICE_ID ) +return pci_get_device (pdev->vendor,CDNS_DRD_ID ,NULL ); +else if (pdev->device ==CDNS_DRD_ID ) +return pci_get_device (pdev->vendor,CDNS_DEVICE_ID ,NULL ); -if (func->devfn == pdev->devfn) { - func =pci_get_device (pdev->vendor, pdev->device, func); -if (!func) -return NULL ; - } - -return func; +return NULL ; } static int cdnsp_pci_probe(struct pci_dev *pdev,
@@ -232,6 +225,8 @@ static const struct pci_device_id cdnsp_pci_ids[] = { PCI_CLASS_SERIAL_USB_DEVICE, PCI_ANY_ID }, { PCI_VENDOR_ID_CDNS, CDNS_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, CDNS_DRD_IF, PCI_ANY_ID }, + { PCI_VENDOR_ID_CDNS, CDNS_DRD_ID, PCI_ANY_ID, PCI_ANY_ID, + CDNS_DRD_IF, PCI_ANY_ID }, { 0, } };
drivers/usb/chipidea/ci.h +2 -0
@@ -203,6 +203,7 @@ struct hw_bank {* @in_lpm: if the core in low power mode * @wakeup_int: if wakeup interrupt occur * @rev: The revision number for controller +* @mutex: protect code from concorrent running when doing role switch */ struct ci_hdrc {struct device *dev;
@@ -255,6 +256,7 @@ struct ci_hdrc {bool in_lpm;bool wakeup_int;enum ci_revision rev; +struct mutex mutex; };static inline struct ci_role_driver *ci_role (struct ci_hdrc *ci)
drivers/usb/chipidea/core.c +10 -1
@@ -974,9 +974,16 @@ static ssize_t role_store(struct device *dev, strlen(ci->roles[role]->name)))break ; -if (role ==CI_ROLE_END || role == ci->role) +if (role ==CI_ROLE_END )return -EINVAL ; +mutex_lock (&ci->mutex); + +if (role == ci->role) { +mutex_unlock (&ci->mutex); +return n; + } +pm_runtime_get_sync (dev);disable_irq (ci->irq);ci_role_stop (ci);
@@ -985,6 +992,7 @@ static ssize_t role_store(struct device *dev,ci_handle_vbus_change (ci);enable_irq (ci->irq);pm_runtime_put_sync (dev); +mutex_unlock (&ci->mutex);return (ret ==0 ) ? n : ret; }
@@ -1020,6 +1028,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)return -ENOMEM ;spin_lock_init (&ci->lock); +mutex_init (&ci->mutex); ci->dev = dev; ci->platdata =dev_get_platdata (dev); ci->imx28_write_fix = !!(ci->platdata->flags &
drivers/usb/chipidea/otg.c +4 -1
@@ -167,8 +167,10 @@ static int hw_wait_vbus_lower_bsv(struct ci_hdrc *ci)static void ci_handle_id_switch (struct ci_hdrc *ci) { -enum ci_role role =ci_otg_role (ci); +enum ci_role role; +mutex_lock (&ci->mutex); + role =ci_otg_role (ci);if (role != ci->role) {dev_dbg (ci->dev,"switching from %s to %s\n" ,ci_role (ci)->name, ci->roles[role]->name);
@@ -198,6 +200,7 @@ static void ci_handle_id_switch(struct ci_hdrc *ci)if (role ==CI_ROLE_GADGET )ci_handle_vbus_change (ci); } +mutex_unlock (&ci->mutex); }/** * ci_otg_work - perform otg (vbus/id) event handle
drivers/usb/dwc2/platform.c +2 -14
@@ -121,13 +121,6 @@ static int dwc2_get_dr_mode(struct dwc2_hsotg *hsotg)return 0 ; } -static void __dwc2_disable_regulators (void *data) -{ -struct dwc2_hsotg *hsotg = data; - -regulator_bulk_disable (ARRAY_SIZE (hsotg->supplies), hsotg->supplies); -} -static int __dwc2_lowlevel_hw_enable (struct dwc2_hsotg *hsotg) {struct platform_device *pdev =to_platform_device (hsotg->dev);
@@ -138,11 +131,6 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)if (ret)return ret; - ret =devm_add_action_or_reset (&pdev->dev, - __dwc2_disable_regulators, hsotg); -if (ret) -return ret; -if (hsotg->clk) { ret =clk_prepare_enable (hsotg->clk);if (ret)
@@ -198,7 +186,7 @@ static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg)if (hsotg->clk)clk_disable_unprepare (hsotg->clk); -return 0 ; +return regulator_bulk_disable (ARRAY_SIZE (hsotg->supplies), hsotg->supplies); }/**
@@ -658,7 +646,7 @@ static int dwc2_driver_probe(struct platform_device *dev)if (hsotg->params.activate_stm_id_vb_detection)regulator_disable (hsotg->usb33d); error: -if (hsotg->dr_mode !=USB_DR_MODE_PERIPHERAL ) +if (hsotg->ll_hw_enabled)dwc2_lowlevel_hw_disable (hsotg);return retval; }
drivers/usb/gadget/function/u_audio.c +1 -1
@@ -1174,7 +1174,7 @@ void g_audio_cleanup(struct g_audio *g_audio) uac = g_audio->uac; card = uac->card;if (card) -snd_card_free (card); +snd_card_free_when_closed (card);kfree (uac->p_prm.reqs);kfree (uac->c_prm.reqs);
drivers/usb/storage/unusual_uas.h +7 -0
@@ -111,6 +111,13 @@ UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_BROKEN_FUA), +/* Reported by: Yaroslav Furman <[email protected]> */ +UNUSUAL_DEV (0x152d ,0x0583 ,0x0000 ,0x9999 , +"JMicron" , +"JMS583Gen 2" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_NO_REPORT_OPCODES ), +/* Reported-by: Thinh Nguyen <[email protected]> */ UNUSUAL_DEV(0x154b, 0xf00b, 0x0000, 0x9999, "PNY",
drivers/usb/typec/tcpm/tcpm.c +15 -4
@@ -1428,10 +1428,18 @@ static int tcpm_ams_start(struct tcpm_port *port, enum tcpm_ams ams)static void tcpm_queue_vdm (struct tcpm_port *port,const u32 header,const u32 *data,int cnt) { +u32 vdo_hdr = port->vdo_data[0 ]; +WARN_ON (!mutex_is_locked (&port->lock)); -/* Make sure we are not still processing a previous VDM packet */ -WARN_ON (port->vdm_state >VDM_STATE_DONE ); +/* If is sending discover_identity, handle received message first */ +if (PD_VDO_SVDM (vdo_hdr) &&PD_VDO_CMD (vdo_hdr) ==CMD_DISCOVER_IDENT ) { + port->send_discover = true; +mod_send_discover_delayed_work (port,SEND_DISCOVER_RETRY_MS ); + }else { +/* Make sure we are not still processing a previous VDM packet */ +WARN_ON (port->vdm_state >VDM_STATE_DONE ); + } port->vdo_count = cnt +1 ; port->vdo_data[0 ] = header;
@@ -1934,11 +1942,13 @@ static void vdm_run_state_machine(struct tcpm_port *port)switch (PD_VDO_CMD (vdo_hdr)) {case CMD_DISCOVER_IDENT : res =tcpm_ams_start (port,DISCOVER_IDENTITY ); -if (res ==0 ) +if (res ==0 ) { port->send_discover = false; -else if (res == -EAGAIN ) + }else if (res == -EAGAIN ) { + port->vdo_data[0 ] =0 ;mod_send_discover_delayed_work (port,SEND_DISCOVER_RETRY_MS ); + }break ;case CMD_DISCOVER_SVID : res =tcpm_ams_start (port,DISCOVER_SVIDS );
@@ -2021,6 +2031,7 @@ static void vdm_run_state_machine(struct tcpm_port *port)unsigned long timeout; port->vdm_retries =0 ; + port->vdo_data[0 ] =0 ; port->vdm_state =VDM_STATE_BUSY ; timeout =vdm_ready_timeout (vdo_hdr);mod_vdm_delayed_work (port, timeout);
drivers/usb/typec/ucsi/ucsi.c +6 -5
@@ -1202,7 +1202,7 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)static int ucsi_init (struct ucsi *ucsi) {struct ucsi_connector *con; -u64 command; +u64 command, ntfy;int ret;int i;
@@ -1214,8 +1214,8 @@ static int ucsi_init(struct ucsi *ucsi) }/* Enable basic notifications */ - ucsi->ntfy =UCSI_ENABLE_NTFY_CMD_COMPLETE |UCSI_ENABLE_NTFY_ERROR ; - command =UCSI_SET_NOTIFICATION_ENABLE | ucsi->ntfy; + ntfy =UCSI_ENABLE_NTFY_CMD_COMPLETE |UCSI_ENABLE_NTFY_ERROR ; + command =UCSI_SET_NOTIFICATION_ENABLE | ntfy; ret =ucsi_send_command (ucsi, command,NULL ,0 );if (ret <0 ) goto err_reset;
@@ -1247,12 +1247,13 @@ static int ucsi_init(struct ucsi *ucsi) }/* Enable all notifications */ - ucsi->ntfy =UCSI_ENABLE_NTFY_ALL ; - command =UCSI_SET_NOTIFICATION_ENABLE | ucsi->ntfy; + ntfy =UCSI_ENABLE_NTFY_ALL ; + command =UCSI_SET_NOTIFICATION_ENABLE | ntfy; ret =ucsi_send_command (ucsi, command,NULL ,0 );if (ret <0 ) goto err_unregister; + ucsi->ntfy = ntfy;return 0 ; err_unregister:
fs/cifs/cifs_debug.c +3 -2
@@ -173,7 +173,7 @@ static int cifs_debug_files_proc_show(struct seq_file *m, void *v)seq_puts (m,"# Version:1\n" );seq_puts (m,"# Format:\n" ); -seq_puts (m,"# <tree id> <persistent fid> <flags> <count> <pid> <uid>" ); +seq_puts (m,"# <tree id> <ses id> <persistent fid> <flags> <count> <pid> <uid>" );#ifdef CONFIG_CIFS_DEBUG2 seq_printf (m," <filename> <mid>\n" );#else
@@ -190,8 +190,9 @@ static int cifs_debug_files_proc_show(struct seq_file *m, void *v) cfile = list_entry(tmp2, struct cifsFileInfo, tlist); seq_printf(m, - "0x%x 0x%llx 0x%x %d %d %d %pd", + "0x%x 0x%llx 0x%llx 0x%x %d %d %d %pd", tcon->tid, + ses->Suid, cfile->fid.persistent_fid, cfile->f_flags, cfile->count,
fs/cifs/smb2ops.c +1 -1
@@ -653,7 +653,7 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)if (rc == -EOPNOTSUPP ) {cifs_dbg (FYI ,"server does not support query network interfaces\n" ); - goto out; + ret_data_len =0 ; }else if (rc !=0 ) {cifs_tcon_dbg (VFS ,"error %d on ioctl to get interface list\n" , rc); goto out;
fs/ksmbd/connection.c +2 -5
@@ -313,13 +313,10 @@ int ksmbd_conn_handler_loop(void *p) }/* -* Check if pdu size is valid (min : smb header size, -* max : 0x00FFFFFF). +* Check maximum pdu size(0x00FFFFFF). */ -if (pdu_size < __SMB2_HEADER_STRUCTURE_SIZE || - pdu_size >MAX_STREAM_PROT_LEN ) { +if (pdu_size >MAX_STREAM_PROT_LEN )break ; - }/* 4 for rfc1002 length field */ size = pdu_size +4 ;
fs/ksmbd/smb2pdu.c +15 -5
@@ -2979,8 +2979,11 @@ int smb2_open(struct ksmbd_work *work)sizeof (struct smb_acl ) +sizeof (struct smb_ace ) * ace_num *2 , GFP_KERNEL); -if (!pntsd) +if (!pntsd) { +posix_acl_release (fattr.cf_acls); +posix_acl_release (fattr.cf_dacls); goto err_out; + } rc = build_sec_desc(user_ns, pntsd, NULL, 0,
@@ -4920,6 +4923,10 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work, info->Attributes |=cpu_to_le32 (server_conf.share_fake_fscaps); +if (test_share_config_flag (work->tcon->share_conf, +KSMBD_SHARE_FLAG_STREAMS )) + info->Attributes |=cpu_to_le32 (FILE_NAMED_STREAMS ); + info->MaxPathNameComponentLength =cpu_to_le32 (stfs.f_namelen); len =smbConvertToUTF16 ((__le16 *)info->FileSystemName,"NTFS" ,PATH_MAX , conn->local_nls,0 );
@@ -7415,13 +7422,16 @@ static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id,if (in_count ==0 )return -EINVAL ; + start =le64_to_cpu (qar_req->file_offset); + length =le64_to_cpu (qar_req->length); + +if (start <0 || length <0 ) +return -EINVAL ; + fp =ksmbd_lookup_fd_fast (work, id);if (!fp)return -ENOENT ; - start =le64_to_cpu (qar_req->file_offset); - length =le64_to_cpu (qar_req->length); - ret =ksmbd_vfs_fqar_lseek (fp, start, length, qar_rsp, in_count, out_count);if (ret && ret != -E2BIG )
@@ -7725,7 +7735,7 @@ int smb2_ioctl(struct ksmbd_work *work) off =le64_to_cpu (zero_data->FileOffset); bfz =le64_to_cpu (zero_data->BeyondFinalZero); -if (off > bfz) { +if (off <0 || bfz <0 || off > bfz) { ret = -EINVAL ; goto out; }
fs/ksmbd/smb_common.c +22 -5
@@ -434,7 +434,7 @@ int ksmbd_extract_shortname(struct ksmbd_conn *conn, const char *longname,static int __smb2_negotiate (struct ksmbd_conn *conn) { -return (conn->dialect >=SMB21_PROT_ID && +return (conn->dialect >=SMB20_PROT_ID && conn->dialect <=SMB311_PROT_ID ); }
@@ -442,9 +442,26 @@ static int smb_handle_negotiate(struct ksmbd_work *work) {struct smb_negotiate_rsp *neg_rsp = work->response_buf; -ksmbd_debug (SMB ,"Unsupported SMB protocol\n" ); - neg_rsp->hdr.Status.CifsError =STATUS_INVALID_LOGON_TYPE ; -return -EINVAL ; +ksmbd_debug (SMB ,"Unsupported SMB1 protocol\n" ); + +/* +* Remove 4 byte direct TCP header, add 2 byte bcc and +* 2 byte DialectIndex. +*/ + *(__be32 *)work->response_buf = +cpu_to_be32 (sizeof (struct smb_hdr ) -4 +2 +2 ); + neg_rsp->hdr.Status.CifsError =STATUS_SUCCESS ; + + neg_rsp->hdr.Command =SMB_COM_NEGOTIATE ; + *(__le32 *)neg_rsp->hdr.Protocol =SMB1_PROTO_NUMBER ; + neg_rsp->hdr.Flags =SMBFLG_RESPONSE ; + neg_rsp->hdr.Flags2 =SMBFLG2_UNICODE |SMBFLG2_ERR_STATUS | +SMBFLG2_EXT_SEC |SMBFLG2_IS_LONG_NAME ; + + neg_rsp->hdr.WordCount =1 ; + neg_rsp->DialectIndex =cpu_to_le16 (work->conn->dialect); + neg_rsp->ByteCount =0 ; +return 0 ; }int ksmbd_smb_negotiate_common (struct ksmbd_work *work,unsigned int command)
@@ -464,7 +481,7 @@ int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command) } } -if (command ==SMB2_NEGOTIATE_HE &&__smb2_negotiate (conn)) { +if (command ==SMB2_NEGOTIATE_HE ) { ret =smb2_handle_negotiate (work);init_smb2_neg_rsp (work);return ret;
fs/ksmbd/smb_common.h +8 -22
@@ -205,8 +205,15 @@#define SMB1_PROTO_NUMBER cpu_to_le32(0x424d53ff)#define SMB_COM_NEGOTIATE 0x72 -#define SMB1_CLIENT_GUID_SIZE (16) + +#define SMBFLG_RESPONSE 0x80/* this PDU is a response from server */ + +#define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40) +#define SMBFLG2_EXT_SEC cpu_to_le16(0x800) +#define SMBFLG2_ERR_STATUS cpu_to_le16(0x4000) +#define SMBFLG2_UNICODE cpu_to_le16(0x8000) +struct smb_hdr {__be32 smb_buf_length;__u8 Protocol[4 ];
@@ -246,28 +253,7 @@ struct smb_negotiate_req {struct smb_negotiate_rsp {struct smb_hdr hdr;/* wct = 17 */ __le16 DialectIndex;/* 0xFFFF = no dialect acceptable */ -__u8 SecurityMode; -__le16 MaxMpxCount; -__le16 MaxNumberVcs; -__le32 MaxBufferSize; -__le32 MaxRawSize; -__le32 SessionKey; -__le32 Capabilities;/* see below */ -__le32 SystemTimeLow; -__le32 SystemTimeHigh; -__le16 ServerTimeZone; -__u8 EncryptionKeyLength;__le16 ByteCount; -union { -unsigned char EncryptionKey[8 ];/* cap extended security off */ -/* followed by Domain name - if extended security is off */ -/* followed by 16 bytes of server GUID */ -/* then security blob if cap_extended_security negotiated */ -struct { -unsigned char GUID[SMB1_CLIENT_GUID_SIZE ]; -unsigned char SecurityBlob[1 ]; - } __packed extended_response; - } __packed u; } __packed;struct filesystem_attribute_info {
fs/lockd/clnt4xdr.c +1 -8
@@ -261,7 +261,6 @@ static int decode_nlm4_holder(struct xdr_stream *xdr, struct nlm_res *result)u32 exclusive;int error;__be32 *p; -s32 end;memset (lock,0 ,sizeof (*lock));locks_init_lock (fl);
@@ -285,13 +284,7 @@ static int decode_nlm4_holder(struct xdr_stream *xdr, struct nlm_res *result) fl->fl_type = exclusive !=0 ?F_WRLCK :F_RDLCK ; p =xdr_decode_hyper (p, &l_offset);xdr_decode_hyper (p, &l_len); - end = l_offset + l_len -1 ; - - fl->fl_start = (loff_t )l_offset; -if (l_len ==0 || end <0 ) - fl->fl_end =OFFSET_MAX ; -else - fl->fl_end = (loff_t )end; +nlm4svc_set_file_lock_range (fl, l_offset, l_len); error =0 ; out:return error;
fs/lockd/xdr4.c +12 -1
@@ -33,6 +33,17 @@ loff_t_to_s64(loff_t offset)return res; } +void nlm4svc_set_file_lock_range (struct file_lock *fl,u64 off,u64 len) +{ +s64 end = off + len -1 ; + + fl->fl_start = off; +if (len ==0 || end <0 ) + fl->fl_end =OFFSET_MAX ; +else + fl->fl_end = end; +} +/* * NLM file handles are defined by specification to be a variable-length * XDR opaque no longer than 1024 bytes. However, this implementation
@@ -80,7 +91,7 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)locks_init_lock (fl); fl->fl_flags =FL_POSIX ; fl->fl_type =F_RDLCK ; - +nlm4svc_set_file_lock_range (fl, lock->lock_start, lock->lock_len);return true; }
fs/nfsd/nfs4proc.c +6 -16
@@ -1351,13 +1351,6 @@ nfsd4_interssc_connect(struct nl4_server *nss, struct svc_rqst *rqstp,return status; } -static void -nfsd4_interssc_disconnect (struct vfsmount *ss_mnt) -{ -nfs_do_sb_deactive (ss_mnt->mnt_sb); -mntput (ss_mnt); -} -/* * Verify COPY destination stateid. *
@@ -1460,11 +1453,6 @@ nfsd4_cleanup_inter_ssc(struct vfsmount *ss_mnt, struct nfsd_file *src, { } -static void -nfsd4_interssc_disconnect (struct vfsmount *ss_mnt) -{ -} -static struct file *nfs42_ssc_open (struct vfsmount *ss_mnt,struct nfs_fh *src_fh,nfs4_stateid *stateid)
@@ -1622,14 +1610,14 @@ static int nfsd4_do_async_copy(void *data) copy->nf_src =kzalloc (sizeof (struct nfsd_file ),GFP_KERNEL );if (!copy->nf_src) { copy->nfserr = nfserr_serverfault; -nfsd4_interssc_disconnect (copy->ss_mnt); +/* ss_mnt will be unmounted by the laundromat */ goto do_callback; } copy->nf_src->nf_file =nfs42_ssc_open (copy->ss_mnt, ©->c_fh, ©->stateid);if (IS_ERR (copy->nf_src->nf_file)) { copy->nfserr = nfserr_offload_denied; -nfsd4_interssc_disconnect (copy->ss_mnt); +/* ss_mnt will be unmounted by the laundromat */ goto do_callback; } }
@@ -1714,8 +1702,10 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,if (async_copy)cleanup_async_copy (async_copy); status =nfserrno (-ENOMEM ); -if (!copy->cp_intra) -nfsd4_interssc_disconnect (copy->ss_mnt); +/* +* source's vfsmount of inter-copy will be unmounted +* by the laundromat +*/ goto out; }
fs/nilfs2/ioctl.c +1 -1
@@ -71,7 +71,7 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,if (argv->v_index > ~(__u64 )0 - argv->v_nmembs)return -EINVAL ; - buf = (void *)__get_free_pages (GFP_NOFS ,0 ); + buf = (void *)get_zeroed_page (GFP_NOFS );if (unlikely (!buf))return -ENOMEM ; maxmembs =PAGE_SIZE / argv->v_size;
fs/ocfs2/aops.c +16 -2
@@ -1978,11 +1978,25 @@ int ocfs2_write_end_nolock(struct address_space *mapping, }if (unlikely (copied < len) && wc->w_target_page) { +loff_t new_isize; +if (!PageUptodate (wc->w_target_page)) copied =0 ; -ocfs2_zero_new_buffers (wc->w_target_page, start+copied, - start+len); + new_isize =max_t (loff_t,i_size_read (inode), pos + copied); +if (new_isize >page_offset (wc->w_target_page)) +ocfs2_zero_new_buffers (wc->w_target_page, start+copied, + start+len); +else { +/* +* When page is fully beyond new isize (data copy +* failed), do not bother zeroing the page. Invalidate +* it instead so that writeback does not get confused +* put page & buffer dirty bits into inconsistent +* state. +*/ +block_invalidatepage (wc->w_target_page,0 ,PAGE_SIZE ); + } }if (wc->w_target_page)flush_dcache_page (wc->w_target_page);
fs/super.c +12 -3
@@ -450,13 +450,22 @@ void generic_shutdown_super(struct super_block *sb)cgroup_writeback_umount (); -/* evict all inodes with zero refcount */ +/* Evict all inodes with zero refcount. */ evict_inodes (sb); -/* only nonzero refcount inodes can have marks */ + +/* +* Clean up and evict any inodes that still have references due +* to fsnotify or the security policy. +*/ fsnotify_sb_delete (sb); -fscrypt_destroy_keyring (sb);security_sb_delete (sb); +/* +* Now that all potentially-encrypted inodes have been evicted, +* the fscrypt keyring can be destroyed. +*/ +fscrypt_destroy_keyring (sb); +if (sb->s_dio_done_wq) {destroy_workqueue (sb->s_dio_done_wq); sb->s_dio_done_wq =NULL ;
fs/verity/verify.c +6 -6
@@ -279,15 +279,15 @@ EXPORT_SYMBOL_GPL(fsverity_enqueue_verify_work);int __init fsverity_init_workqueue (void ) {/* -* Use an unbound workqueue to allow bios to be verified in parallel -* even when they happen to complete on the same CPU. This sacrifices -* locality, but it's worthwhile since hashing is CPU-intensive. +* Use a high-priority workqueue to prioritize verification work, which +* blocks reads from completing, over regular application tasks. * -* Also use a high-priority workqueue to prioritize verification work, -* which blocks reads from completing, over regular application tasks. +* For performance reasons, don't use an unbound workqueue. Using an +* unbound workqueue for crypto operations causes excessive scheduler +* latency on ARM64. */ fsverity_read_workqueue =alloc_workqueue ("fsverity_read_queue" , -WQ_UNBOUND |WQ_HIGHPRI , +WQ_HIGHPRI ,num_online_cpus ());if (!fsverity_read_workqueue)return -ENOMEM ;
include/linux/acpi_mdio.h +8 -1
@@ -9,7 +9,14 @@#include <linux/phy.h> #if IS_ENABLED (CONFIG_ACPI_MDIO ) -int acpi_mdiobus_register (struct mii_bus *mdio,struct fwnode_handle *fwnode); +int __acpi_mdiobus_register (struct mii_bus *mdio,struct fwnode_handle *fwnode, +struct module *owner); + +static inline int +acpi_mdiobus_register (struct mii_bus *mdio,struct fwnode_handle *handle) +{ +return __acpi_mdiobus_register (mdio, handle,THIS_MODULE ); +}#else /* CONFIG_ACPI_MDIO */ static inline int acpi_mdiobus_register (struct mii_bus *mdio,struct fwnode_handle *fwnode)
include/linux/entry-kvm.h +1 -1
@@ -75,7 +75,7 @@ static inline void xfer_to_guest_mode_prepare(void)*/ static inline bool __xfer_to_guest_mode_work_pending (void ) { -unsigned long ti_work =READ_ONCE (current_thread_info ()->flags); +unsigned long ti_work =read_thread_flags ();return !!(ti_work &XFER_TO_GUEST_MODE_WORK ); }
include/linux/kthread.h +25 -0
@@ -56,6 +56,31 @@ bool kthread_is_per_cpu(struct task_struct *k); __k; \ }) +/** +* kthread_run_on_cpu - create and wake a cpu bound thread. +* @threadfn: the function to run until signal_pending(current). +* @data: data ptr for @threadfn. +* @cpu: The cpu on which the thread should be bound, +* @namefmt: printf-style name for the thread. Format is restricted +* to "name.*%u". Code fills in cpu number. +* +* Description: Convenient wrapper for kthread_create_on_cpu() +* followed by wake_up_process(). Returns the kthread or +* ERR_PTR(-ENOMEM). +*/ +static inline struct task_struct * +kthread_run_on_cpu (int (*threadfn)(void *data),void *data, +unsigned int cpu,const char *namefmt) +{ +struct task_struct *p; + + p =kthread_create_on_cpu (threadfn, data, cpu, namefmt); +if (!IS_ERR (p)) +wake_up_process (p); + +return p; +} +void free_kthread_struct (struct task_struct *k);void kthread_bind (struct task_struct *k,unsigned int cpu);void kthread_bind_mask (struct task_struct *k,const struct cpumask *mask);
include/linux/lockd/xdr4.h +1 -0
@@ -24,6 +24,7 @@ +void nlm4svc_set_file_lock_range (struct file_lock *fl,u64 off,u64 len);int nlm4svc_decode_testargs (struct svc_rqst *,__be32 *);int nlm4svc_encode_testres (struct svc_rqst *,__be32 *);int nlm4svc_decode_lockargs (struct svc_rqst *,__be32 *);
include/linux/nvme-tcp.h +3 -2
@@ -114,8 +114,9 @@ struct nvme_tcp_icresp_pdu {struct nvme_tcp_term_pdu {struct nvme_tcp_hdr hdr;__le16 fes; -__le32 fei; -__u8 rsvd[8 ]; +__le16 feil; +__le16 feiu; +__u8 rsvd[10 ]; };/**
include/linux/of_mdio.h +19 -3
@@ -14,9 +14,25 @@#if IS_ENABLED (CONFIG_OF_MDIO )bool of_mdiobus_child_is_phy (struct device_node *child); -int of_mdiobus_register (struct mii_bus *mdio,struct device_node *np); -int devm_of_mdiobus_register (struct device *dev,struct mii_bus *mdio, -struct device_node *np); +int __of_mdiobus_register (struct mii_bus *mdio,struct device_node *np, +struct module *owner); + +static inline int of_mdiobus_register (struct mii_bus *mdio, +struct device_node *np) +{ +return __of_mdiobus_register (mdio, np,THIS_MODULE ); +} + +int __devm_of_mdiobus_register (struct device *dev,struct mii_bus *mdio, +struct device_node *np,struct module *owner); + +static inline int devm_of_mdiobus_register (struct device *dev, +struct mii_bus *mdio, +struct device_node *np) +{ +return __devm_of_mdiobus_register (dev, mdio, np,THIS_MODULE );
Lines of this file are not shown. View the raw message.
kernel/sched/fair.c +49 -5
54 lines not on this page · raw message
net/bluetooth/l2cap_core.c +79 -38
117 lines not on this page · raw message
tools/testing/selftests/bpf/prog_tests/btf.c +28 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/forwarding/tc_actions.sh +48 -1
49 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.