Linux 5.15.26
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.26 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/parisc/kernel/unaligned.c | 14 - arch/riscv/configs/nommu_k210_sdcard_defconfig | 2 arch/riscv/kernel/Makefile | 2 arch/riscv/kernel/entry.S | 10 arch/riscv/kernel/trace_irq.c | 27 ++ arch/riscv/kernel/trace_irq.h | 11 arch/x86/kernel/fpu/regset.c | 9 arch/x86/kernel/ptrace.c | 4 arch/x86/kvm/mmu/mmu.c | 13 + drivers/ata/pata_hpt37x.c | 14 + drivers/base/dd.c | 5 drivers/base/regmap/regmap-irq.c | 20 - drivers/clk/ingenic/jz4725b-cgu.c | 3 drivers/gpio/gpio-rockchip.c | 56 ++-- drivers/gpio/gpio-tegra186.c | 14 - drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 drivers/gpu/drm/amd/amdgpu/soc15.c | 9 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c | 2 drivers/gpu/drm/amd/display/dc/core/dc.c | 7 drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 32 ++ drivers/gpu/drm/drm_edid.c | 2 drivers/gpu/drm/i915/display/intel_bw.c | 18 + drivers/gpu/drm/i915/display/intel_bw.h | 8 drivers/gpu/drm/i915/display/intel_snps_phy.c | 2 drivers/gpu/drm/i915/intel_pm.c | 22 - drivers/gpu/drm/vc4/vc4_crtc.c | 8 drivers/gpu/host1x/syncpt.c | 19 - drivers/hwmon/hwmon.c | 14 - drivers/iio/accel/bmc150-accel-core.c | 5 drivers/iio/accel/fxls8962af-core.c | 12 - drivers/iio/accel/fxls8962af-i2c.c | 2 drivers/iio/accel/fxls8962af-spi.c | 2 drivers/iio/accel/fxls8962af.h | 3 drivers/iio/accel/kxcjk-1013.c | 5 drivers/iio/accel/mma9551.c | 5 drivers/iio/accel/mma9553.c | 5 drivers/iio/adc/ad7124.c | 2 drivers/iio/adc/men_z188_adc.c | 9 drivers/iio/adc/ti-tsc2046.c | 4 drivers/iio/gyro/bmg160_core.c | 5 drivers/iio/imu/adis16480.c | 7 drivers/iio/imu/kmx61.c | 5 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 6 drivers/iio/magnetometer/bmc150_magn.c | 5 drivers/infiniband/core/cma.c | 40 ++- drivers/infiniband/hw/qib/qib_sysfs.c | 2 drivers/infiniband/ulp/rtrs/rtrs-clt.c | 39 +-- drivers/infiniband/ulp/srp/ib_srp.c | 6 drivers/mtd/mtdcore.c | 2 drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 3 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 23 + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 15 + drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.c | 12 - drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.h | 2 drivers/net/ethernet/ibm/ibmvnic.c | 6 drivers/net/ethernet/intel/i40e/i40e_main.c | 12 - drivers/net/ethernet/intel/ice/ice.h | 1 drivers/net/ethernet/intel/ice/ice_common.c | 2 drivers/net/ethernet/intel/ice/ice_main.c | 2 drivers/net/ethernet/intel/ice/ice_ptp.c | 5 drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 65 ++++- drivers/net/ethernet/intel/ice/ice_virtchnl_pf.h | 5 drivers/net/ethernet/marvell/mv643xx_eth.c | 24 +- drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_mplsoudp.c | 28 -- drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 3 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 4 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 2 drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c | 3 drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c | 120 ++++++---- drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c | 20 - drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c | 32 ++ drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h | 10 drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h | 5 drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c | 4 drivers/net/ethernet/xilinx/ll_temac_main.c | 2 drivers/net/mdio/mdio-ipq4019.c | 6 drivers/net/usb/cdc_ether.c | 12 + drivers/net/usb/cdc_ncm.c | 8 drivers/net/usb/sr9700.c | 2 drivers/net/usb/zaurus.c | 12 + drivers/nvme/host/core.c | 6 drivers/nvmem/core.c | 2 drivers/pinctrl/pinctrl-k210.c | 4 drivers/platform/surface/surface3_power.c | 13 - drivers/spi/spi-zynq-qspi.c | 3 drivers/staging/fbtft/fb_st7789v.c | 2 drivers/tee/optee/core.c | 8 drivers/tee/optee/optee_private.h | 2 drivers/tee/optee/rpc.c | 8 drivers/tee/tee_core.c | 6 drivers/thermal/intel/int340x_thermal/int3400_thermal.c | 4 drivers/tty/n_gsm.c | 45 ++- drivers/tty/serial/sc16is7xx.c | 3 drivers/usb/dwc2/core.h | 2 drivers/usb/dwc2/drd.c | 6 drivers/usb/dwc3/dwc3-pci.c | 17 + drivers/usb/dwc3/gadget.c | 2 drivers/usb/gadget/function/rndis.c | 8 drivers/usb/gadget/function/rndis.h | 1 drivers/usb/gadget/udc/udc-xilinx.c | 6 drivers/usb/host/xhci.c | 28 +- drivers/usb/serial/ch341.c | 1 drivers/usb/serial/option.c | 12 + drivers/usb/typec/tipd/core.c | 7 drivers/vhost/vsock.c | 21 + fs/btrfs/lzo.c | 11 fs/btrfs/tree-checker.c | 15 + fs/configfs/dir.c | 14 + fs/io_uring.c | 24 +- fs/tracefs/inode.c | 5 include/linux/bpf.h | 9 include/linux/nvmem-provider.h | 4 include/linux/tee_drv.h | 14 + include/net/checksum.h | 50 ++-- include/net/netfilter/nf_tables.h | 2 include/net/netfilter/nf_tables_offload.h | 2 include/net/sock.h | 4 kernel/bpf/syscall.c | 3 kernel/cgroup/cgroup-v1.c | 6 kernel/cgroup/cpuset.c | 2 kernel/trace/trace_events_trigger.c | 59 ++++ mm/filemap.c | 8 mm/memblock.c | 10 net/can/j1939/transport.c | 2 net/core/filter.c | 3 net/core/skbuff.c | 6 net/core/sock.c | 4 net/ipv4/af_inet.c | 5 net/ipv4/ip_output.c | 2 net/ipv4/ping.c | 1 net/ipv4/udp_tunnel_nic.c | 2 net/ipv6/ip6_offload.c | 2 net/ipv6/ip6_output.c | 2 net/mptcp/mib.c | 2 net/mptcp/mib.h | 2 net/mptcp/pm.c | 8 net/mptcp/pm_netlink.c | 19 + net/netfilter/nf_tables_api.c | 16 + net/netfilter/nf_tables_offload.c | 3 net/netfilter/nft_dup_netdev.c | 6 net/netfilter/nft_fwd_netdev.c | 6 net/netfilter/nft_immediate.c | 12 - net/netfilter/xt_socket.c | 4 net/openvswitch/actions.c | 46 +++ net/sched/act_ct.c | 5 net/smc/smc_pnet.c | 42 +-- net/smc/smc_pnet.h | 2 net/tipc/name_table.c | 2 net/tipc/socket.c | 2 security/selinux/ima.c | 4 tools/perf/util/data.c | 7 tools/perf/util/evlist-hybrid.c | 4 tools/testing/selftests/bpf/progs/test_sockmap_kern.h | 26 +- tools/testing/selftests/net/mptcp/diag.sh | 44 +++ tools/testing/selftests/net/mptcp/mptcp_join.sh | 15 + 158 files changed, 1224 insertions(+), 520 deletions(-)
Alexey Bayduraev (1):
perf data: Fix double free in perf_session__delete()
Andy Lutomirski (1):
x86/ptrace: Fix xfpregs_set()'s incorrect xmm clearing
Ariel Levkovich (1):
net/mlx5: Fix wrong limitation of metadata match on ecpf
Bart Van Assche (1):
RDMA/ib_srp: Fix a deadlock
Baruch Siach (1):
net: mdio-ipq4019: add delay after clock enable
Bas Nieuwenhuizen (1):
drm/amd/display: Protect update_bw_bounding_box FPU code.
Brett Creeley (1):
ice: Fix race conditions between virtchnl handling and VF ndo ops
Changbin Du (1):
riscv: fix oops caused by irqsoff latency tracer
Chen Gong (1):
drm/amdgpu: do not enable asic reset for raven2
ChenXiaoSong (1):
configfs: fix a race in configfs_{,un}register_subsystem()
Chris Mi (1):
net/mlx5: Fix tc max supported prio for nic mode
Christoph Hellwig (1):
nvme: also mark passthrough-only namespaces ready in nvme_update_ns_info
Christophe JAILLET (2):
nfp: flower: Fix a potential leak in nfp_tunnel_add_shared_mac()
iio: adc: men_z188_adc: Fix a resource leak in an error handling path
Christophe Kerello (2):
nvmem: core: Fix a conflict between MTD and NVMEM on wp-gpios property
mtd: core: Fix a conflict between MTD and NVMEM on wp-gpios property
Christophe Leroy (1):
net: Force inlining of checksum functions in net/checksum.h
Chuansheng Liu (1):
thermal: int340x: fix memory leak in int3400_notify()
Cosmin Tanislav (1):
iio: adc: ad7124: fix mask used for setting AIN_BUFP & AIN_BUFM bits
Daehwan Jung (1):
usb: gadget: rndis: add spinlock for rndis response list
Damien Le Moal (1):
riscv: fix nommu_k210_sdcard_defconfig
Dan Carpenter (3):
tipc: Fix end of loop tests for list_for_each_entry()
udp_tunnel: Fix end of loop test in udp_tunnel_nic_unregister()
pinctrl: fix loop in k210_pinconf_get_drive()
Daniel Bristot de Oliveira (1):
tracing: Dump stacktrace trigger to the corresponding instance
Daniele Palmas (1):
USB: serial: option: add Telit LE910R1 compositions
Dmytro Bagrii (1):
Revert "USB: serial: ch341: add new Product ID for CH341A"
Dylan Yudaken (1):
io_uring: disallow modification of rsrc_data during quiesce
Dāvis Mosāns (1):
btrfs: prevent copying too big compressed lzo segment
Eric Dumazet (5):
netfilter: xt_socket: fix a typo in socket_mt_destroy()
bpf: Add schedule points in batch ops
io_uring: add a schedule point in io_add_buffers()
net: __pskb_pull_tail() & pskb_carve_frag_list() drop_monitor friends
net-timestamp: convert sk->sk_tskey to atomic_t
Evan Quan (2):
drm/amd/pm: fix some OEM SKU specific stability issues drm/amdgpu: disable MMHUB PG for Picasso
Fabio M. De Francesco (1):
net/smc: Use a mutex for locking "struct smc_pnettable"
Fabrice Gasnier (1):
usb: dwc2: drd: fix soft connect when gadget is unconfigured
Felix Maurer (2):
bpf: Do not try bpf_msg_push_data with len 0
selftests: bpf: Check bpf_msg_push_data return value
Florian Westphal (1):
netfilter: nf_tables: fix memory leak during stateful obj update
Gal Pressman (1):
net/mlx5e: Fix wrong return value on ioctl EEPROM query failure
Greg Kroah-Hartman (1):
Linux 5.15.26
Guenter Roeck (1):
hwmon: Handle failure to register sensor with thermal zone correctly
Hans de Goede (3):
surface: surface3_power: Fix battery readings on batteries without a serial number
usb: dwc3: pci: Add "snps,dis_u2_susphy_quirk" for Intel Bay Trail
usb: dwc3: pci: Fix Bay Trail phy GPIO mappings
Helge Deller (2):
parisc/unaligned: Fix fldd and fstd unaligned handlers on 32-bit kernel parisc/unaligned: Fix ldw() and stw() unalignment handlers
Hongyu Xie (1):
xhci: Prevent futile URB re-submissions due to incorrect return value.
Jacob Keller (1):
ice: fix concurrent reset and removal of VFs
Jason Gunthorpe (1):
RDMA/cma: Do not change route.addr.src_addr outside state checks
Jens Axboe (2):
io_uring: don't convert to jiffies for waiting on timeouts
tps6598x: clear int mask on probe failure
Jens Wiklander (2):
tee: export teedev_open() and teedev_close_context()
optee: use driver internal tee_context for some rpc
Kumar Kartikeya Dwivedi (1):
bpf: Fix crash due to incorrect copy_map_value
Liang Zhang (1):
KVM: x86/mmu: make apf token non-zero to fix bug
Lorenzo Bianconi (1):
iio: imu: st_lsm6dsx: wait for settling time in st_lsm6dsx_read_oneshot
Maher Sanalla (1):
net/mlx5: Update log_max_qp value to be 17 at most
Manish Chopra (1):
bnx2x: fix driver load from initrd
Maor Dickman (1):
net/mlx5e: MPLSoUDP decap, fix check for unsupported matches
Maor Gottlieb (1):
net/mlx5: Fix possible deadlock on rule deletion
Marc Zyngier (1):
gpio: tegra186: Fix chip_data type confusion
Mario Limonciello (1):
drm/amd: Check if ASPM is enabled from PCIe subsystem
Mateusz Palczewski (1):
Revert "i40e: Fix reset bw limit when DCB enabled with 1 TC"
Matt Roper (1):
drm/i915/dg2: Print PHY name properly on calibration error
Matthew Wilcox (Oracle) (1):
mm/filemap: Fix handling of THPs in generic_file_buffered_read()
Mauri Sandberg (1):
net: mv643xx_eth: process retval from of_get_mac_address
Maxime Ripard (2):
drm/edid: Always set RGB444
drm/vc4: crtc: Fix runtime_pm reference counting
Md Haris Iqbal (2):
RDMA/rtrs-clt: Fix possible double free in error case RDMA/rtrs-clt: Move free_permit from free_clt to rtrs_clt_close
Meir Lichtinger (1):
net/mlx5: Update the list of the PCI supported devices
Miaohe Lin (1):
memblock: use kfree() to release kmalloced memblock regions
Miaoqian Lin (1):
iio: Fix error handling for PM
Michael Chan (2):
bnxt_en: Fix offline ethtool selftest with RDMA enabled
bnxt_en: Increase firmware message response DMA wait time
Michal Koutný (1):
cgroup-v1: Correct privileges check in release_agent writes
Mike Marciniszyn (1):
IB/qib: Fix duplicate sysfs directory name
Mikko Perttunen (1):
gpu: host1x: Always return syncpoint value when waiting
Mårten Lindahl (1):
driver core: Free DMA range map when device is released
Nuno Sá (1):
iio:imu:adis16480: fix buffering for devices with no burst mode
Oleksij Rempel (1):
iio: adc: tsc2046: fix memory corruption by preventing array overflow
Oliver Graute (1):
staging: fbtft: fb_st7789v: reset display before initialization
Oliver Neukum (3):
sr9700: sanity check for packet length
USB: zaurus: support another broken Zaurus
CDC-NCM: avoid overflow in sanity checking
Ondrej Mosnacek (1):
selinux: fix misuse of mutex_is_locked()
Pablo Neira Ayuso (3):
netfilter: xt_socket: missing ifdef CONFIG_IP6_NF_IPTABLES dependency
netfilter: nf_tables_offload: incorrect flow offload action array size
netfilter: nf_tables: unregister flowtable hooks on netns exit
Paolo Abeni (4):
mptcp: fix race in incoming ADD_ADDR option processing
mptcp: add mibs counter for ignored incoming options
selftests: mptcp: fix diag instability
selftests: mptcp: be more conservative with cookie MPJ limits
Paul Blakey (2):
openvswitch: Fix setting ipv6 fields causing hw csum failure net/sched: act_ct: Fix flow table lookup after ct clear or switching zones
Pavan Chebbi (1):
bnxt_en: Fix incorrect multicast rx mask setting when not requested
Phil Elwell (1):
sc16is7xx: Fix for incorrect data being transmitted
Prasad Kumpatla (1):
regmap-irq: Update interrupt clear register for proper reset
Puma Hsu (1):
xhci: re-initialize the HC during resume if HCE was set
Samuel Holland (1):
gpio: rockchip: Reset int_bothedge when changing trigger
Sean Anderson (1):
pinctrl: k210: Fix bias-pull-up
Sean Nyekjaer (1):
iio: accel: fxls8962af: add padding to regmap for SPI
Sebastian Andrzej Siewior (1):
usb: dwc3: gadget: Let the interrupt handler disable bottom halves.
Sergey Shtylyov (1):
ata: pata_hpt37x: disable primary channel on HPT371
Siarhei Volkau (1):
clk: jz4725b: fix mmc0 clock gating
Slark Xiao (1):
USB: serial: option: add support for DW5829e
Somnath Kotur (1):
bnxt_en: Fix active FEC reporting to ethtool
Stefano Garzarella (1):
vhost/vsock: don't check owner in vhost_vsock_stop() while releasing
Steven Rostedt (Google) (2):
tracing: Have traceon and traceoff trigger honor the instance
tracefs: Set the group ownership in apply_options() not parse_options()
Su Yue (2):
btrfs: tree-checker: check item_size for inode_item
btrfs: tree-checker: check item_size for dev_item
Sukadev Bhattiprolu (1):
ibmvnic: schedule failover only if vioctl fails
Szymon Heidrich (1):
USB: gadget: validate endpoint index for xilinx udc
Tao Liu (1):
gso: do not skip outer ip header in case of ipip and net_failover
Tariq Toukan (1):
net/mlx5e: kTLS, Use CHECKSUM_UNNECESSARY for device-offloaded packets
Tom Rix (2):
ice: check the return of ice_ptp_gettimex64
ice: initialize local variable 'tlv'
Ville Syrjälä (3):
drm/i915: Widen the QGV point mask
drm/i915: Correctly populate use_sagv_wm for all pipes drm/i915: Fix bw atomic check when switching between SAGV vs. no SAGV
Xiaoke Wang (1):
net: ll_temac: check the return value of devm_kmalloc()
Xin Long (1):
ping: remove pr_err from ping_lookup
Yevgeny Kliteynik (3):
net/mlx5: DR, Cache STE shadow memory
net/mlx5: DR, Don't allow match on IP w/o matching on full ethertype/ip_version net/mlx5: DR, Fix the threshold that defines when pool sync is initiated
Yonghong Song (1):
bpf: Fix a bpf_timer initialization issue
Zhang Qiao (1):
cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug
Zhengjun Xing (1):
perf evlist: Fix failed to use cpu list for uncore events
Zhou Qingyang (1):
spi: spi-zynq-qspi: Fix a NULL pointer dereference in zynq_qspi_exec_mem_op()
[email protected] (6):
tty: n_gsm: fix encoding of control signal octet bit DV
tty: n_gsm: fix proper link termination after failed open
tty: n_gsm: fix NULL pointer access due to DLCI release
tty: n_gsm: fix wrong tty control line for flow control
tty: n_gsm: fix wrong modem processing in convergence layer type 2
tty: n_gsm: fix deadlock in gsmtty_open()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 25 +SUBLEVEL = 26 EXTRAVERSION = NAME = Trick or Treat
arch/parisc/kernel/unaligned.c +7 -7
@@ -340,7 +340,7 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop) : "r" (val), "r" (regs->ior), "r" (regs->isr) : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); -return 0 ; +return ret; }static int emulate_std (struct pt_regs *regs,int frreg,int flop) {
@@ -397,7 +397,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) __asm__ __volatile__ (" mtsp %4, %%sr1\n" " zdep %2, 29, 2, %%r19\n" -" dep %%r0, 31, 2, %2\n" +" dep %%r0, 31, 2, %3\n" " mtsar %%r19\n" " zvdepi -2, 32, %%r19\n" "1: ldw 0(%%sr1,%3),%%r20\n"
@@ -409,7 +409,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop)" andcm %%r21, %%r19, %%r21\n" " or %1, %%r20, %1\n" " or %2, %%r21, %2\n" -"3: stw %1,0(%%sr1,%1)\n" +"3: stw %1,0(%%sr1,%3)\n" "4: stw %%r1,4(%%sr1,%3)\n" "5: stw %2,8(%%sr1,%3)\n" " copy %%r0, %0\n"
@@ -596,7 +596,6 @@ void handle_unaligned(struct pt_regs *regs) ret =ERR_NOTHANDLED ;/* "undefined", but lets kill them. */ break ; } -#ifdef CONFIG_PA20 switch (regs->iir &OPCODE2_MASK ) {case OPCODE_FLDD_L :
@@ -607,22 +606,23 @@ void handle_unaligned(struct pt_regs *regs) flop=1 ; ret =emulate_std (regs,R2 (regs->iir),1 );break ; +#ifdef CONFIG_PA20 case OPCODE_LDD_L : ret =emulate_ldd (regs,R2 (regs->iir),0 );break ;case OPCODE_STD_L : ret =emulate_std (regs,R2 (regs->iir),0 );break ; - }#endif + }switch (regs->iir &OPCODE3_MASK ) {case OPCODE_FLDW_L : flop=1 ; - ret =emulate_ldw (regs,R2 (regs->iir),0 ); + ret =emulate_ldw (regs,R2 (regs->iir),1 );break ;case OPCODE_LDW_M : - ret =emulate_ldw (regs,R2 (regs->iir),1 ); + ret =emulate_ldw (regs,R2 (regs->iir),0 );break ;case OPCODE_FSTW_L :
arch/riscv/configs/nommu_k210_sdcard_defconfig +1 -1
@@ -23,7 +23,7 @@ CONFIG_SLOB=y CONFIG_SOC_CANAAN=y CONFIG_SMP=y CONFIG_NR_CPUS=2 -CONFIG_CMDLINE="earlycon console=ttySIF0 rootdelay=2 root=/dev/mmcblk0p1 ro" +CONFIG_CMDLINE="earlycon console=ttySIF0 root=/dev/mmcblk0p1 rootwait ro" CONFIG_CMDLINE_FORCE=y # CONFIG_SECCOMP is not set # CONFIG_STACKPROTECTOR is not set
arch/riscv/kernel/Makefile +2 -0
@@ -50,6 +50,8 @@ obj-$(CONFIG_MODULE_SECTIONS) += module-sections.o obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o obj-$(CONFIG_DYNAMIC_FTRACE) += mcount-dyn.o +obj-$(CONFIG_TRACE_IRQFLAGS) += trace_irq.o + obj-$(CONFIG_RISCV_BASE_PMU) += perf_event.o obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o
arch/riscv/kernel/entry.S +5 -5
@@ -108,7 +108,7 @@ _save_context: .option pop #ifdef CONFIG_TRACE_IRQFLAGS - call trace_hardirqs_off + call __trace_hardirqs_off #endif #ifdef CONFIG_CONTEXT_TRACKING
@@ -144,7 +144,7 @@ skip_context_tracking: li t0, EXC_BREAKPOINT beq s4, t0, 1f #ifdef CONFIG_TRACE_IRQFLAGS - call trace_hardirqs_on + call __trace_hardirqs_on #endif csrs CSR_STATUS, SR_IE
@@ -235,7 +235,7 @@ ret_from_exception: REG_L s0, PT_STATUS(sp) csrc CSR_STATUS, SR_IE #ifdef CONFIG_TRACE_IRQFLAGS - call trace_hardirqs_off + call __trace_hardirqs_off #endif #ifdef CONFIG_RISCV_M_MODE /* the MPP value is too large to be used as an immediate arg for addi */
@@ -271,10 +271,10 @@ restore_all: REG_L s1, PT_STATUS(sp) andi t0, s1, SR_PIE beqz t0, 1f - call trace_hardirqs_on + call __trace_hardirqs_on j 2f 1: - call trace_hardirqs_off + call __trace_hardirqs_off 2: #endif REG_L a0, PT_STATUS(sp)
arch/riscv/kernel/trace_irq.c new file +27 -0
@@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (C) 2022 Changbin Du <[email protected]> +*/ + +#include <linux/irqflags.h> +#include <linux/kprobes.h> +#include "trace_irq.h" + +/* +* trace_hardirqs_on/off require the caller to setup frame pointer properly. +* Otherwise, CALLER_ADDR1 might trigger an pagging exception in kernel. +* Here we add one extra level so they can be safely called by low +* level entry code which $fp is used for other purpose. +*/ + +void __trace_hardirqs_on (void ) +{ +trace_hardirqs_on (); +} +NOKPROBE_SYMBOL (__trace_hardirqs_on); + +void __trace_hardirqs_off (void ) +{ +trace_hardirqs_off (); +} +NOKPROBE_SYMBOL (__trace_hardirqs_off);
arch/riscv/kernel/trace_irq.h new file +11 -0
@@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* +* Copyright (C) 2022 Changbin Du <[email protected]> +*/ +#ifndef __TRACE_IRQ_H +#define __TRACE_IRQ_H + +void __trace_hardirqs_on (void ); +void __trace_hardirqs_off (void ); + +#endif /* __TRACE_IRQ_H */
arch/x86/kernel/fpu/regset.c +4 -5
@@ -87,11 +87,9 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset, const void *kbuf, const void __user *ubuf) { struct fpu *fpu = &target->thread.fpu; -struct user32_fxsr_struct newstate; +struct fxregs_state newstate;int ret; -BUILD_BUG_ON (sizeof (newstate) !=sizeof (struct fxregs_state )); -if (!cpu_feature_enabled (X86_FEATURE_FXSR ))return -ENODEV ;
@@ -112,9 +110,10 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,/* Copy the state */ memcpy (&fpu->state.fxsave, &newstate,sizeof (newstate)); -/* Clear xmm8..15 */ +/* Clear xmm8..15 for 32-bit callers */ BUILD_BUG_ON (sizeof (fpu->state.fxsave.xmm_space) !=16 *16 ); -memset (&fpu->state.fxsave.xmm_space[8 ],0 ,8 *16 ); +if (in_ia32_syscall ()) +memset (&fpu->state.fxsave.xmm_space[8 *4 ],0 ,8 *16 );/* Mark FP and SSE as in use when XSAVE is enabled */ if (use_xsave ())
arch/x86/kernel/ptrace.c +2 -2
@@ -1224,7 +1224,7 @@ static struct user_regset x86_64_regsets[] __ro_after_init = { }, [REGSET_FP] = { .core_note_type = NT_PRFPREG, - .n = sizeof(struct user_i387_struct) / sizeof(long), + .n = sizeof(struct fxregs_state) / sizeof(long), .size = sizeof(long), .align = sizeof(long), .active = regset_xregset_fpregs_active, .regset_get = xfpregs_get, .set = xfpregs_set },
@@ -1271,7 +1271,7 @@ static struct user_regset x86_32_regsets[] __ro_after_init = { }, [REGSET_XFP] = { .core_note_type = NT_PRXFPREG, - .n = sizeof(struct user32_fxsr_struct) / sizeof(u32), + .n = sizeof(struct fxregs_state) / sizeof(u32), .size = sizeof(u32), .align = sizeof(u32), .active = regset_xregset_fpregs_active, .regset_get = xfpregs_get, .set = xfpregs_set },
arch/x86/kvm/mmu/mmu.c +12 -1
@@ -3889,12 +3889,23 @@ static void shadow_page_table_clear_flood(struct kvm_vcpu *vcpu, gva_t addr)walk_shadow_page_lockless_end (vcpu); } +static u32 alloc_apf_token (struct kvm_vcpu *vcpu) +{ +/* make sure the token value is not 0 */ +u32 id = vcpu->arch.apf.id; + +if (id <<12 ==0 ) + vcpu->arch.apf.id =1 ; + +return (vcpu->arch.apf.id++ <<12 ) | vcpu->vcpu_id; +} +static bool kvm_arch_setup_async_pf (struct kvm_vcpu *vcpu,gpa_t cr2_or_gpa,gfn_t gfn) {struct kvm_arch_async_pf arch; - arch.token = (vcpu->arch.apf.id++ <<12 ) | vcpu->vcpu_id; + arch.token =alloc_apf_token (vcpu); arch.gfn = gfn; arch.direct_map = vcpu->arch.mmu->direct_map; arch.cr3 = vcpu->arch.mmu->get_guest_pgd (vcpu);
drivers/ata/pata_hpt37x.c +14 -0
@@ -919,6 +919,20 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) irqmask &= ~0x10 ;pci_write_config_byte (dev,0x5a , irqmask); +/* +* HPT371 chips physically have only one channel, the secondary one, +* but the primary channel registers do exist! Go figure... +* So, we manually disable the non-existing channel here +* (if the BIOS hasn't done this already). +*/ +if (dev->device ==PCI_DEVICE_ID_TTI_HPT371 ) { +u8 mcr1; + +pci_read_config_byte (dev,0x50 , &mcr1); + mcr1 &= ~0x04 ; +pci_write_config_byte (dev,0x50 , mcr1); + } +/* * default to pci clock. make sure MA15/16 are set to output * to prevent drives having problems with 40-pin cables. Needed
drivers/base/dd.c +5 -0
@@ -629,6 +629,9 @@ static int really_probe(struct device *dev, struct device_driver *drv) drv->remove (dev);devres_release_all (dev); +arch_teardown_dma_ops (dev); +kfree (dev->dma_range_map); + dev->dma_range_map =NULL ;driver_sysfs_remove (dev); dev->driver =NULL ;dev_set_drvdata (dev,NULL );
@@ -1208,6 +1211,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)devres_release_all (dev);arch_teardown_dma_ops (dev); +kfree (dev->dma_range_map); + dev->dma_range_map =NULL ; dev->driver =NULL ;dev_set_drvdata (dev,NULL );if (dev->pm_domain && dev->pm_domain->dismiss)
drivers/base/regmap/regmap-irq.c +6 -14
@@ -189,11 +189,9 @@ static void regmap_irq_sync_unlock(struct irq_data *data) ret =regmap_write (map, reg, d->mask_buf[i]);if (d->chip->clear_ack) {if (d->chip->ack_invert && !ret) - ret =regmap_write (map, reg, - d->mask_buf[i]); + ret =regmap_write (map, reg,UINT_MAX );else if (!ret) - ret =regmap_write (map, reg, - ~d->mask_buf[i]); + ret =regmap_write (map, reg,0 ); }if (ret !=0 ) dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
@@ -556,11 +554,9 @@ static irqreturn_t regmap_irq_thread(int irq, void *d) data->status_buf[i]);if (chip->clear_ack) {if (chip->ack_invert && !ret) - ret =regmap_write (map, reg, - data->status_buf[i]); + ret =regmap_write (map, reg,UINT_MAX );else if (!ret) - ret =regmap_write (map, reg, - ~data->status_buf[i]); + ret =regmap_write (map, reg,0 ); }if (ret !=0 ) dev_err(map->dev, "Failed to ack 0x%x: %d\n",
@@ -817,13 +813,9 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, d->status_buf[i] & d->mask_buf[i]);if (chip->clear_ack) {if (chip->ack_invert && !ret) - ret =regmap_write (map, reg, - (d->status_buf[i] & - d->mask_buf[i])); + ret =regmap_write (map, reg,UINT_MAX );else if (!ret) - ret =regmap_write (map, reg, - ~(d->status_buf[i] & - d->mask_buf[i])); + ret =regmap_write (map, reg,0 ); }if (ret !=0 ) { dev_err(map->dev, "Failed to ack 0x%x: %d\n",
drivers/clk/ingenic/jz4725b-cgu.c +1 -2
@@ -139,11 +139,10 @@ static const struct ingenic_cgu_clk_info jz4725b_cgu_clocks[] = { }, [JZ4725B_CLK_I2S] = { -"i2s" ,CGU_CLK_MUX |CGU_CLK_DIV |CGU_CLK_GATE , +"i2s" ,CGU_CLK_MUX |CGU_CLK_DIV , .parents = { JZ4725B_CLK_EXT, JZ4725B_CLK_PLL_HALF, -1, -1 }, .mux = { CGU_REG_CPCCR, 31, 1 }, .div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1 }, - .gate = { CGU_REG_CLKGR, 6 }, }, [JZ4725B_CLK_SPI] = {
drivers/gpio/gpio-rockchip.c +29 -27
69 lines not on this page · raw message
drivers/gpio/gpio-tegra186.c +10 -4
@@ -337,9 +337,12 @@ static int tegra186_gpio_of_xlate(struct gpio_chip *chip,return offset + pin; } +#define to_tegra_gpio (x) container_of((x), struct tegra_gpio, gpio) +static void tegra186_irq_ack (struct irq_data *data) { -struct tegra_gpio *gpio =irq_data_get_irq_chip_data (data); +struct gpio_chip *gc =irq_data_get_irq_chip_data (data); +struct tegra_gpio *gpio =to_tegra_gpio (gc);void __iomem *base; base =tegra186_gpio_get_base (gpio, data->hwirq);
@@ -351,7 +354,8 @@ static void tegra186_irq_ack(struct irq_data *data)static void tegra186_irq_mask (struct irq_data *data) { -struct tegra_gpio *gpio =irq_data_get_irq_chip_data (data); +struct gpio_chip *gc =irq_data_get_irq_chip_data (data); +struct tegra_gpio *gpio =to_tegra_gpio (gc);void __iomem *base;u32 value;
@@ -366,7 +370,8 @@ static void tegra186_irq_mask(struct irq_data *data)static void tegra186_irq_unmask (struct irq_data *data) { -struct tegra_gpio *gpio =irq_data_get_irq_chip_data (data); +struct gpio_chip *gc =irq_data_get_irq_chip_data (data); +struct tegra_gpio *gpio =to_tegra_gpio (gc);void __iomem *base;u32 value;
@@ -381,7 +386,8 @@ static void tegra186_irq_unmask(struct irq_data *data)static int tegra186_irq_set_type (struct irq_data *data,unsigned int type) { -struct tegra_gpio *gpio =irq_data_get_irq_chip_data (data); +struct gpio_chip *gc =irq_data_get_irq_chip_data (data); +struct tegra_gpio *gpio =to_tegra_gpio (gc);void __iomem *base;u32 value;
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +3 -0
@@ -1278,6 +1278,9 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,bool is_fw_fb;resource_size_t base, size; +if (amdgpu_aspm ==-1 && !pcie_aspm_enabled (pdev)) + amdgpu_aspm =0 ; +if (amdgpu_virtual_display ||amdgpu_device_asic_has_dc_support (flags &AMD_ASIC_MASK )) supports_atomic = true;
drivers/gpu/drm/amd/amdgpu/soc15.c +6 -3
@@ -607,8 +607,8 @@ soc15_asic_reset_method(struct amdgpu_device *adev)static int soc15_asic_reset (struct amdgpu_device *adev) {/* original raven doesn't have full asic reset */ -if ((adev->apu_flags &AMD_APU_IS_RAVEN ) && - !(adev->apu_flags &AMD_APU_IS_RAVEN2 )) +if ((adev->apu_flags &AMD_APU_IS_RAVEN ) || + (adev->apu_flags &AMD_APU_IS_RAVEN2 ))return 0 ;switch (soc15_asic_reset_method (adev)) {
@@ -1273,8 +1273,11 @@ static int soc15_common_early_init(void *handle)AMD_CG_SUPPORT_SDMA_LS |AMD_CG_SUPPORT_VCN_MGCG ; +/* +* MMHUB PG needs to be disabled for Picasso for +* stability reasons. +*/ adev->pg_flags =AMD_PG_SUPPORT_SDMA | -AMD_PG_SUPPORT_MMHUB |AMD_PG_SUPPORT_VCN ; }else { adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c +2 -0
@@ -437,8 +437,10 @@ static void dcn3_get_memclk_states_from_smu(struct clk_mgr *clk_mgr_base) clk_mgr_base->bw_params->clk_table.num_entries = num_levels ? num_levels :1 ;/* Refresh bounding box */ +DC_FP_START (); clk_mgr_base->ctx->dc->res_pool->funcs->update_bw_bounding_box ( clk_mgr->base.ctx->dc, clk_mgr_base->bw_params); +DC_FP_END (); }static bool dcn3_is_smu_present (struct clk_mgr *clk_mgr_base)
drivers/gpu/drm/amd/display/dc/core/dc.c +5 -2
@@ -891,10 +891,13 @@ static bool dc_construct(struct dc *dc, goto fail;#ifdef CONFIG_DRM_AMD_DC_DCN dc->clk_mgr->force_smu_not_present = init_params->force_smu_not_present; -#endif -if (dc->res_pool->funcs->update_bw_bounding_box) +if (dc->res_pool->funcs->update_bw_bounding_box) { +DC_FP_START (); dc->res_pool->funcs->update_bw_bounding_box (dc, dc->clk_mgr->bw_params); +DC_FP_END (); + } +#endif /* Creation of current_state must occur after dc->dml * is initialized in dc_create_resource_pool because
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +31 -1
@@ -418,6 +418,36 @@ static int sienna_cichlid_store_powerplay_table(struct smu_context *smu)return 0 ; } +static int sienna_cichlid_patch_pptable_quirk (struct smu_context *smu) +{ +struct amdgpu_device *adev = smu->adev; +uint32_t *board_reserved; +uint16_t *freq_table_gfx; +uint32_t i; + +/* Fix some OEM SKU specific stability issues */ +GET_PPTABLE_MEMBER (BoardReserved, &board_reserved); +if ((adev->pdev->device ==0x73DF ) && + (adev->pdev->revision ==0XC3 ) && + (adev->pdev->subsystem_device ==0x16C2 ) && + (adev->pdev->subsystem_vendor ==0x1043 )) + board_reserved[0 ] =1387 ; + +GET_PPTABLE_MEMBER (FreqTableGfx, &freq_table_gfx); +if ((adev->pdev->device ==0x73DF ) && + (adev->pdev->revision ==0XC3 ) && + ((adev->pdev->subsystem_device ==0x16C2 ) || + (adev->pdev->subsystem_device ==0x133C )) && + (adev->pdev->subsystem_vendor ==0x1043 )) { +for (i =0 ; i <NUM_GFXCLK_DPM_LEVELS ; i++) { +if (freq_table_gfx[i] >2500 ) + freq_table_gfx[i] =2500 ; + } + } + +return 0 ; +} +static int sienna_cichlid_setup_pptable (struct smu_context *smu) {int ret =0 ;
@@ -438,7 +468,7 @@ static int sienna_cichlid_setup_pptable(struct smu_context *smu)if (ret)return ret; -return ret; +return sienna_cichlid_patch_pptable_quirk (smu); }static int sienna_cichlid_tables_init (struct smu_context *smu)
drivers/gpu/drm/drm_edid.c +1 -1
@@ -5205,6 +5205,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *ediif (!(edid->input &DRM_EDID_INPUT_DIGITAL ))return quirks; + info->color_formats |=DRM_COLOR_FORMAT_RGB444 ;drm_parse_cea_ext (connector, edid);/*
@@ -5253,7 +5254,6 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *ediDRM_DEBUG ("%s: Assigning EDID-1.4 digital sink color depth as %d bpc.\n" , connector->name, info->bpc); - info->color_formats |=DRM_COLOR_FORMAT_RGB444 ;if (edid->features &DRM_EDID_FEATURE_RGB_YCRCB444 ) info->color_formats |=DRM_COLOR_FORMAT_YCRCB444 ;if (edid->features &DRM_EDID_FEATURE_RGB_YCRCB422 )
drivers/gpu/drm/i915/display/intel_bw.c +16 -2
@@ -681,6 +681,7 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)unsigned int max_bw_point =0 , max_bw =0 ;unsigned int num_qgv_points = dev_priv->max_bw[0 ].num_qgv_points;unsigned int num_psf_gv_points = dev_priv->max_bw[0 ].num_psf_gv_points; +bool changed = false;u32 mask =0 ;/* FIXME earlier gens need some checks too */
@@ -724,6 +725,8 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) new_bw_state->data_rate[crtc->pipe] = new_data_rate; new_bw_state->num_active_planes[crtc->pipe] = new_active_planes; + changed = true; + drm_dbg_kms(&dev_priv->drm, "pipe %c data rate %u num active planes %u\n", pipe_name(crtc->pipe),
@@ -731,7 +734,19 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) new_bw_state->num_active_planes[crtc->pipe]); } -if (!new_bw_state) + old_bw_state =intel_atomic_get_old_bw_state (state); + new_bw_state =intel_atomic_get_new_bw_state (state); + +if (new_bw_state && +intel_can_enable_sagv (dev_priv, old_bw_state) != +intel_can_enable_sagv (dev_priv, new_bw_state)) + changed = true; + +/* +* If none of our inputs (data rates, number of active +* planes, SAGV yes/no) changed then nothing to do here. +*/ +if (!changed)return 0 ; ret =intel_atomic_lock_global_state (&new_bw_state->base);
@@ -814,7 +829,6 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)*/ new_bw_state->qgv_points_mask = ~allowed_points & mask; - old_bw_state =intel_atomic_get_old_bw_state (state);/* * If the actual mask had changed we need to make sure that * the commits are serialized(in case this is a nomodeset, nonblocking)
drivers/gpu/drm/i915/display/intel_bw.h +4 -4
@@ -30,19 +30,19 @@ struct intel_bw_state {*/ u8 pipe_sagv_reject; +/* bitmask of active pipes */ +u8 active_pipes; +/* * Current QGV points mask, which restricts * some particular SAGV states, not to confuse * with pipe_sagv_mask. */ -u8 qgv_points_mask; +u16 qgv_points_mask;unsigned int data_rate[I915_MAX_PIPES ];u8 num_active_planes[I915_MAX_PIPES ]; -/* bitmask of active pipes */ -u8 active_pipes; -int min_cdclk; };
drivers/gpu/drm/i915/display/intel_snps_phy.c +1 -1
@@ -32,7 +32,7 @@ void intel_snps_phy_wait_for_calibration(struct drm_i915_private *dev_priv)if (intel_de_wait_for_clear (dev_priv,ICL_PHY_MISC (phy),DG2_PHY_DP_TX_ACK_MASK ,25 ))DRM_ERROR ("SNPS PHY %c failed to calibrate after 25ms.\n" , - phy); +phy_name (phy)); } }
drivers/gpu/drm/i915/intel_pm.c +11 -11
@@ -4020,6 +4020,17 @@ static int intel_compute_sagv_mask(struct intel_atomic_state *state)return ret; } +if (intel_can_enable_sagv (dev_priv, new_bw_state) != +intel_can_enable_sagv (dev_priv, old_bw_state)) { + ret =intel_atomic_serialize_global_state (&new_bw_state->base); +if (ret) +return ret; + }else if (new_bw_state->pipe_sagv_reject != old_bw_state->pipe_sagv_reject) { + ret =intel_atomic_lock_global_state (&new_bw_state->base); +if (ret) +return ret; + } +for_each_new_intel_crtc_in_state (state, crtc, new_crtc_state, i) {struct skl_pipe_wm *pipe_wm = &new_crtc_state->wm.skl.optimal;
@@ -4035,17 +4046,6 @@ static int intel_compute_sagv_mask(struct intel_atomic_state *state)intel_can_enable_sagv (dev_priv, new_bw_state); } -if (intel_can_enable_sagv (dev_priv, new_bw_state) != -intel_can_enable_sagv (dev_priv, old_bw_state)) { - ret =intel_atomic_serialize_global_state (&new_bw_state->base); -if (ret) -return ret; - }else if (new_bw_state->pipe_sagv_reject != old_bw_state->pipe_sagv_reject) { - ret =intel_atomic_lock_global_state (&new_bw_state->base); -if (ret) -return ret; - } -return 0 ; }
drivers/gpu/drm/vc4/vc4_crtc.c +5 -3
@@ -538,9 +538,11 @@ int vc4_crtc_disable_at_boot(struct drm_crtc *crtc)if (ret)return ret; - ret =pm_runtime_put (&vc4_hdmi->pdev->dev); -if (ret) -return ret; +/* +* post_crtc_powerdown will have called pm_runtime_put, so we +* don't need it here otherwise we'll get the reference counting +* wrong. +*/ return 0 ; }
drivers/gpu/host1x/syncpt.c +2 -17
@@ -225,27 +225,12 @@ int host1x_syncpt_wait(struct host1x_syncpt *sp, u32 thresh, long timeout,void *ref;struct host1x_waitlist *waiter;int err =0 , check_count =0 ; -u32 val;if (value) - *value =0 ; - -/* first check cache */ -if (host1x_syncpt_is_expired (sp, thresh)) { -if (value) - *value =host1x_syncpt_load (sp); + *value =host1x_syncpt_load (sp); +if (host1x_syncpt_is_expired (sp, thresh))return 0 ; - } - -/* try to read from register */ - val =host1x_hw_syncpt_load (sp->host, sp); -if (host1x_syncpt_is_expired (sp, thresh)) { -if (value) - *value = val; - - goto done; - }if (!timeout) { err = -EAGAIN ;
drivers/hwmon/hwmon.c +8 -6
@@ -214,12 +214,14 @@ static int hwmon_thermal_add_sensor(struct device *dev, int index) tzd =devm_thermal_zone_of_sensor_register (dev, index, tdata, &hwmon_thermal_ops); -/* -* If CONFIG_THERMAL_OF is disabled, this returns -ENODEV, -* so ignore that error but forward any other error. -*/ -if (IS_ERR (tzd) && (PTR_ERR (tzd) != -ENODEV )) -return PTR_ERR (tzd); +if (IS_ERR (tzd)) { +if (PTR_ERR (tzd) != -ENODEV ) +return PTR_ERR (tzd); +dev_info (dev,"temp%d_input not attached to any thermal zone\n" , + index +1 ); +devm_kfree (dev, tdata); +return 0 ; + } err =devm_add_action (dev, hwmon_thermal_remove_sensor, &tdata->node);if (err)
drivers/iio/accel/bmc150-accel-core.c +4 -1
@@ -1782,11 +1782,14 @@ int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"Unable to register iio device\n" ); - goto err_trigger_unregister; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_trigger_unregister:bmc150_accel_unregister_triggers (data,BMC150_ACCEL_TRIGGERS -1 ); err_buffer_cleanup:
drivers/iio/accel/fxls8962af-core.c +10 -2
@@ -154,12 +154,20 @@ struct fxls8962af_data {u8 watermark; }; -const struct regmap_config fxls8962af_regmap_conf = { +const struct regmap_config fxls8962af_i2c_regmap_conf = { .reg_bits =8 , .val_bits =8 , .max_register =FXLS8962AF_MAX_REG , }; -EXPORT_SYMBOL_GPL (fxls8962af_regmap_conf); +EXPORT_SYMBOL_GPL (fxls8962af_i2c_regmap_conf); + +const struct regmap_config fxls8962af_spi_regmap_conf = { + .reg_bits =8 , + .pad_bits =8 , + .val_bits =8 , + .max_register =FXLS8962AF_MAX_REG , +}; +EXPORT_SYMBOL_GPL (fxls8962af_spi_regmap_conf);enum { fxls8962af_idx_x,
drivers/iio/accel/fxls8962af-i2c.c +1 -1
@@ -18,7 +18,7 @@ static int fxls8962af_probe(struct i2c_client *client) {struct regmap *regmap; - regmap =devm_regmap_init_i2c (client, &fxls8962af_regmap_conf); + regmap =devm_regmap_init_i2c (client, &fxls8962af_i2c_regmap_conf);if (IS_ERR (regmap)) {dev_err (&client->dev,"Failed to initialize i2c regmap\n" );return PTR_ERR (regmap);
drivers/iio/accel/fxls8962af-spi.c +1 -1
@@ -18,7 +18,7 @@ static int fxls8962af_probe(struct spi_device *spi) {struct regmap *regmap; - regmap =devm_regmap_init_spi (spi, &fxls8962af_regmap_conf); + regmap =devm_regmap_init_spi (spi, &fxls8962af_spi_regmap_conf);if (IS_ERR (regmap)) {dev_err (&spi->dev,"Failed to initialize spi regmap\n" );return PTR_ERR (regmap);
drivers/iio/accel/fxls8962af.h +2 -1
@@ -17,6 +17,7 @@ int fxls8962af_core_probe(struct device *dev, struct regmap *regmap, int irq);int fxls8962af_core_remove (struct device *dev);extern const struct dev_pm_ops fxls8962af_pm_ops; -extern const struct regmap_config fxls8962af_regmap_conf; +extern const struct regmap_config fxls8962af_i2c_regmap_conf; +extern const struct regmap_config fxls8962af_spi_regmap_conf;#endif /* _FXLS8962AF_H_ */
drivers/iio/accel/kxcjk-1013.c +4 -1
@@ -1589,11 +1589,14 @@ static int kxcjk1013_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:
drivers/iio/accel/mma9551.c +4 -1
@@ -495,11 +495,14 @@ static int mma9551_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);
drivers/iio/accel/mma9553.c +4 -1
@@ -1134,12 +1134,15 @@ static int mma9553_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }dev_dbg (&indio_dev->dev,"Registered device %s\n" , name);return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);return ret;
drivers/iio/adc/ad7124.c +1 -1
@@ -76,7 +76,7 @@#define AD7124_CONFIG_REF_SEL (x) FIELD_PREP(AD7124_CONFIG_REF_SEL_MSK, x)#define AD7124_CONFIG_PGA_MSK GENMASK(2, 0)#define AD7124_CONFIG_PGA (x) FIELD_PREP(AD7124_CONFIG_PGA_MSK, x) -#define AD7124_CONFIG_IN_BUFF_MSK GENMASK(7, 6) +#define AD7124_CONFIG_IN_BUFF_MSK GENMASK(6, 5)#define AD7124_CONFIG_IN_BUFF (x) FIELD_PREP(AD7124_CONFIG_IN_BUFF_MSK, x)/* AD7124_FILTER_X */
drivers/iio/adc/men_z188_adc.c +8 -1
@@ -103,6 +103,7 @@ static int men_z188_probe(struct mcb_device *dev,struct z188_adc *adc;struct iio_dev *indio_dev;struct resource *mem; +int ret; indio_dev =devm_iio_device_alloc (&dev->dev,sizeof (struct z188_adc ));if (!indio_dev)
@@ -128,8 +129,14 @@ static int men_z188_probe(struct mcb_device *dev, adc->mem = mem;mcb_set_drvdata (dev, indio_dev); -return iio_device_register (indio_dev); + ret =iio_device_register (indio_dev); +if (ret) + goto err_unmap; + +return 0 ; +err_unmap: +iounmap (adc->base); err:mcb_release_mem (mem);return -ENXIO ;
drivers/iio/adc/ti-tsc2046.c +2 -2
@@ -388,7 +388,7 @@ static int tsc2046_adc_update_scan_mode(struct iio_dev *indio_dev,mutex_lock (&priv->slock); size =0 ; -for_each_set_bit (ch_idx, active_scan_mask, indio_dev->num_channels) { +for_each_set_bit (ch_idx, active_scan_mask,ARRAY_SIZE (priv->l)) { size +=tsc2046_adc_group_set_layout (priv, group, ch_idx);tsc2046_adc_group_set_cmd (priv, group, ch_idx); group++;
@@ -548,7 +548,7 @@ static int tsc2046_adc_setup_spi_msg(struct tsc2046_adc_priv *priv)* enabled. */ size =0 ; -for (ch_idx =0 ; ch_idx < priv->dcfg->num_channels; ch_idx++) +for (ch_idx =0 ; ch_idx <ARRAY_SIZE (priv->l); ch_idx++) size +=tsc2046_adc_group_set_layout (priv, ch_idx, ch_idx); priv->tx =devm_kzalloc (&priv->spi->dev, size,GFP_KERNEL );
drivers/iio/gyro/bmg160_core.c +4 -1
@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:
drivers/iio/imu/adis16480.c +6 -1
@@ -1403,6 +1403,7 @@ static int adis16480_probe(struct spi_device *spi) {const struct spi_device_id *id =spi_get_device_id (spi);const struct adis_data *adis16480_data; +irq_handler_t trigger_handler =NULL ;struct iio_dev *indio_dev;struct adis16480 *st;int ret;
@@ -1474,8 +1475,12 @@ static int adis16480_probe(struct spi_device *spi) st->clk_freq = st->chip_info->int_clk; } +/* Only use our trigger handler if burst mode is supported */ +if (adis16480_data->burst_len) + trigger_handler = adis16480_trigger_handler; + ret =devm_adis_setup_buffer_and_trigger (&st->adis, indio_dev, - adis16480_trigger_handler); + trigger_handler);if (ret)return ret;
drivers/iio/imu/kmx61.c +4 -1
@@ -1385,7 +1385,7 @@ static int kmx61_probe(struct i2c_client *client, ret =iio_device_register (data->acc_indio_dev);if (ret <0 ) {dev_err (&client->dev,"Failed to register acc iio device\n" ); - goto err_buffer_cleanup_mag; + goto err_pm_cleanup; } ret =iio_device_register (data->mag_indio_dev);
@@ -1398,6 +1398,9 @@ static int kmx61_probe(struct i2c_client *client, err_iio_unregister_acc:iio_device_unregister (data->acc_indio_dev); +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup_mag:if (client->irq >0 )iio_triggered_buffer_cleanup (data->mag_indio_dev);
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +5 -1
@@ -1372,8 +1372,12 @@ static int st_lsm6dsx_read_oneshot(struct st_lsm6dsx_sensor *sensor,if (err <0 )return err; +/* +* we need to wait for sensor settling time before +* reading data in order to avoid corrupted samples +*/ delay =1000000000 / sensor->odr; -usleep_range (delay,2 * delay); +usleep_range (3 * delay,4 * delay); err =st_lsm6dsx_read_locked (hw, addr, &data,sizeof (data));if (err <0 )
drivers/iio/magnetometer/bmc150_magn.c +3 -2
@@ -962,13 +962,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap *regmap, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_disable_runtime_pm; + goto err_pm_cleanup; }dev_dbg (dev,"Registered device %s\n" , name);return 0 ; -err_disable_runtime_pm: +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev);pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);
drivers/infiniband/core/cma.c +24 -16
@@ -3368,22 +3368,30 @@ static int cma_resolve_ib_addr(struct rdma_id_private *id_priv)static int cma_bind_addr (struct rdma_cm_id *id,struct sockaddr *src_addr,const struct sockaddr *dst_addr) { -if (!src_addr || !src_addr->sa_family) { - src_addr = (struct sockaddr *) &id->route.addr.src_addr; - src_addr->sa_family = dst_addr->sa_family; -if (IS_ENABLED (CONFIG_IPV6 ) && - dst_addr->sa_family ==AF_INET6 ) { -struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *) src_addr; -struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *) dst_addr; - src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id; -if (ipv6_addr_type (&dst_addr6->sin6_addr) &IPV6_ADDR_LINKLOCAL ) - id->route.addr.dev_addr.bound_dev_if = dst_addr6->sin6_scope_id; - }else if (dst_addr->sa_family ==AF_IB ) { - ((struct sockaddr_ib *) src_addr)->sib_pkey = - ((struct sockaddr_ib *) dst_addr)->sib_pkey; - } - } -return rdma_bind_addr (id, src_addr); +struct sockaddr_storage zero_sock = {}; + +if (src_addr && src_addr->sa_family) +return rdma_bind_addr (id, src_addr); + +/* +* When the src_addr is not specified, automatically supply an any addr +*/ + zero_sock.ss_family = dst_addr->sa_family; +if (IS_ENABLED (CONFIG_IPV6 ) && dst_addr->sa_family ==AF_INET6 ) { +struct sockaddr_in6 *src_addr6 = + (struct sockaddr_in6 *)&zero_sock; +struct sockaddr_in6 *dst_addr6 = + (struct sockaddr_in6 *)dst_addr; + + src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id; +if (ipv6_addr_type (&dst_addr6->sin6_addr) &IPV6_ADDR_LINKLOCAL ) + id->route.addr.dev_addr.bound_dev_if = + dst_addr6->sin6_scope_id; + }else if (dst_addr->sa_family ==AF_IB ) { + ((struct sockaddr_ib *)&zero_sock)->sib_pkey = + ((struct sockaddr_ib *)dst_addr)->sib_pkey; + } +return rdma_bind_addr (id, (struct sockaddr *)&zero_sock); }/*
drivers/infiniband/hw/qib/qib_sysfs.c +1 -1
@@ -541,7 +541,7 @@ static struct attribute *port_diagc_attributes[] = { };static const struct attribute_group port_diagc_group = { - .name ="linkcontrol" , + .name ="diag_counters" , .attrs = port_diagc_attributes, };
drivers/infiniband/ulp/rtrs/rtrs-clt.c +21 -18
@@ -2664,6 +2664,8 @@ static void rtrs_clt_dev_release(struct device *dev) { struct rtrs_clt *clt = container_of(dev, struct rtrs_clt, dev); +mutex_destroy (&clt->paths_ev_mutex); +mutex_destroy (&clt->paths_mutex);kfree (clt); }
@@ -2693,6 +2695,8 @@ static struct rtrs_clt *alloc_clt(const char *sessname, size_t paths_num,return ERR_PTR (-ENOMEM ); } + clt->dev.class = rtrs_clt_dev_class; + clt->dev.release = rtrs_clt_dev_release;uuid_gen (&clt->paths_uuid);INIT_LIST_HEAD_RCU (&clt->paths_list); clt->paths_num = paths_num;
@@ -2709,53 +2713,51 @@ static struct rtrs_clt *alloc_clt(const char *sessname, size_t paths_num,init_waitqueue_head (&clt->permits_wait);mutex_init (&clt->paths_ev_mutex);mutex_init (&clt->paths_mutex); +device_initialize (&clt->dev); - clt->dev.class = rtrs_clt_dev_class; - clt->dev.release = rtrs_clt_dev_release; err =dev_set_name (&clt->dev,"%s" , sessname);if (err) - goto err; + goto err_put; +/* * Suppress user space notification until * sysfs files are created */ dev_set_uevent_suppress (&clt->dev, true); - err =device_register (&clt->dev); -if (err) { -put_device (&clt->dev); - goto err; - } + err =device_add (&clt->dev); +if (err) + goto err_put; clt->kobj_paths =kobject_create_and_add ("paths" , &clt->dev.kobj);if (!clt->kobj_paths) { err = -ENOMEM ; - goto err_dev; + goto err_del; } err =rtrs_clt_create_sysfs_root_files (clt);if (err) {kobject_del (clt->kobj_paths);kobject_put (clt->kobj_paths); - goto err_dev; + goto err_del; }dev_set_uevent_suppress (&clt->dev, false);kobject_uevent (&clt->dev.kobj,KOBJ_ADD );return clt; -err_dev: -device_unregister (&clt->dev); -err: +err_del: +device_del (&clt->dev); +err_put:free_percpu (clt->pcpu_path); -kfree (clt); +put_device (&clt->dev);return ERR_PTR (err); }static void free_clt (struct rtrs_clt *clt) { -free_permits (clt);free_percpu (clt->pcpu_path); -mutex_destroy (&clt->paths_ev_mutex); -mutex_destroy (&clt->paths_mutex); -/* release callback will free clt in last put */ + +/* +* release callback will free clt and destroy mutexes in last put +*/ device_unregister (&clt->dev); }
@@ -2866,6 +2868,7 @@ void rtrs_clt_close(struct rtrs_clt *clt)rtrs_clt_destroy_sess_files (sess,NULL );kobject_put (&sess->kobj); } +free_permits (clt);free_clt (clt); }EXPORT_SYMBOL (rtrs_clt_close);
drivers/infiniband/ulp/srp/ib_srp.c +4 -2
@@ -4038,9 +4038,11 @@ static void srp_remove_one(struct ib_device *device, void *client_data)spin_unlock (&host->target_lock);/* -* Wait for tl_err and target port removal tasks. +* srp_queue_remove_work() queues a call to +* srp_remove_target(). The latter function cancels +* target->tl_err_work so waiting for the remove works to +* finish is sufficient. */ -flush_workqueue (system_long_wq);flush_workqueue (srp_remove_wq);kfree (host);
drivers/mtd/mtdcore.c +2 -0
@@ -546,6 +546,7 @@ static int mtd_nvmem_add(struct mtd_info *mtd) config.stride =1 ; config.read_only = true; config.root_only = true; + config.ignore_wp = true; config.no_of_node = !of_device_is_compatible (node,"nvmem-cells" ); config.priv = mtd;
@@ -830,6 +831,7 @@ static struct nvmem_device *mtd_otp_nvmem_register(struct mtd_info *mtd, config.owner =THIS_MODULE ; config.type =NVMEM_TYPE_OTP ; config.root_only = true; + config.ignore_wp = true; config.reg_read = reg_read; config.size = size; config.of_node = np;
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +3 -0
@@ -100,6 +100,9 @@ MODULE_LICENSE("GPL");MODULE_FIRMWARE (FW_FILE_NAME_E1 );MODULE_FIRMWARE (FW_FILE_NAME_E1H );MODULE_FIRMWARE (FW_FILE_NAME_E2 ); +MODULE_FIRMWARE (FW_FILE_NAME_E1_V15 ); +MODULE_FIRMWARE (FW_FILE_NAME_E1H_V15 ); +MODULE_FIRMWARE (FW_FILE_NAME_E2_V15 );int bnx2x_num_queues;module_param_named (num_queues, bnx2x_num_queues, int,0444 );
drivers/net/ethernet/broadcom/bnxt/bnxt.c +13 -10
@@ -4757,8 +4757,10 @@ static int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp, u16 vnic_id)return rc; req->vnic_id =cpu_to_le32 (vnic->fw_vnic_id); - req->num_mc_entries =cpu_to_le32 (vnic->mc_list_count); - req->mc_tbl_addr =cpu_to_le64 (vnic->mc_list_mapping); +if (vnic->rx_mask &CFA_L2_SET_RX_MASK_REQ_MASK_MCAST ) { + req->num_mc_entries =cpu_to_le32 (vnic->mc_list_count); + req->mc_tbl_addr =cpu_to_le64 (vnic->mc_list_mapping); + } req->mask =cpu_to_le32 (vnic->rx_mask);return hwrm_req_send_silent (bp, req); }
@@ -8624,7 +8626,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)if (bp->dev->flags &IFF_ALLMULTI ) { vnic->rx_mask |=CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST ; vnic->mc_list_count =0 ; - }else { + }else if (bp->dev->flags &IFF_MULTICAST ) {u32 mask =0 ;bnxt_mc_list_updated (bp, &mask);
@@ -10295,12 +10297,12 @@ int bnxt_half_open_nic(struct bnxt *bp) goto half_open_err; } - rc =bnxt_alloc_mem (bp, false); + rc =bnxt_alloc_mem (bp, true);if (rc) {netdev_err (bp->dev,"bnxt_alloc_mem err: %x\n" , rc); goto half_open_err; } - rc =bnxt_init_nic (bp, false); + rc =bnxt_init_nic (bp, true);if (rc) {netdev_err (bp->dev,"bnxt_init_nic err: %x\n" , rc); goto half_open_err;
@@ -10309,7 +10311,7 @@ int bnxt_half_open_nic(struct bnxt *bp) half_open_err:bnxt_free_skbs (bp); -bnxt_free_mem (bp, false); +bnxt_free_mem (bp, true);dev_close (bp->dev);return rc; }
@@ -10319,9 +10321,9 @@ int bnxt_half_open_nic(struct bnxt *bp)*/ void bnxt_half_close_nic (struct bnxt *bp) { -bnxt_hwrm_resource_free (bp, false, false); +bnxt_hwrm_resource_free (bp, false, true);bnxt_free_skbs (bp); -bnxt_free_mem (bp, false); +bnxt_free_mem (bp, true); }static void bnxt_reenable_sriov (struct bnxt *bp)
@@ -10737,7 +10739,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)if (dev->flags &IFF_ALLMULTI ) { mask |=CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST ; vnic->mc_list_count =0 ; - }else { + }else if (dev->flags &IFF_MULTICAST ) { mc_update =bnxt_mc_list_updated (bp, &mask); }
@@ -10805,9 +10807,10 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) !bnxt_promisc_ok(bp)) vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS ; rc =bnxt_hwrm_cfa_l2_set_rx_mask (bp,0 ); -if (rc && vnic->mc_list_count) { +if (rc && (vnic->rx_mask &CFA_L2_SET_RX_MASK_REQ_MASK_MCAST )) {netdev_info (bp->dev,"Failed setting MC filters rc: %d, turning on ALL_MCAST mode\n" , rc); + vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_MCAST ; vnic->rx_mask |=CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST ; vnic->mc_list_count =0 ; rc =bnxt_hwrm_cfa_l2_set_rx_mask (bp,0 );
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +12 -3
@@ -25,6 +25,7 @@#include "bnxt_hsi.h" #include "bnxt.h" #include "bnxt_hwrm.h" +#include "bnxt_ulp.h" #include "bnxt_xdp.h" #include "bnxt_ptp.h" #include "bnxt_ethtool.h"
@@ -1942,6 +1943,9 @@ static int bnxt_get_fecparam(struct net_device *dev,case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_RS272_IEEE_ACTIVE : fec->active_fec |=ETHTOOL_FEC_LLRS ;break ; +case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_NONE_ACTIVE : + fec->active_fec |=ETHTOOL_FEC_OFF ; +break ; }return 0 ; }
@@ -3499,9 +3503,12 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,if (!offline) {bnxt_run_fw_tests (bp, test_mask, &test_results); }else { - rc =bnxt_close_nic (bp, false, false); -if (rc) +bnxt_ulp_stop (bp); + rc =bnxt_close_nic (bp, true, false); +if (rc) { +bnxt_ulp_start (bp, rc);return ; + }bnxt_run_fw_tests (bp, test_mask, &test_results); buf[BNXT_MACLPBK_TEST_IDX ] =1 ;
@@ -3511,6 +3518,7 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,if (rc) {bnxt_hwrm_mac_loopback (bp, false); etest->flags |=ETH_TEST_FL_FAILED ; +bnxt_ulp_start (bp, rc);return ; }if (bnxt_run_loopback (bp))
@@ -3536,7 +3544,8 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest, }bnxt_hwrm_phy_loopback (bp, false, false);bnxt_half_close_nic (bp); - rc =bnxt_open_nic (bp, false, true); + rc =bnxt_open_nic (bp, true, true); +bnxt_ulp_start (bp, rc); }if (rc ||bnxt_test_irq (bp)) { buf[BNXT_IRQ_TEST_IDX ] =1 ;
drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.c +9 -3
@@ -595,18 +595,24 @@ static int __hwrm_send(struct bnxt *bp, struct bnxt_hwrm_ctx *ctx)/* Last byte of resp contains valid bit */ valid = ((u8 *)ctx->resp) + len -1 ; -for (j =0 ; j <HWRM_VALID_BIT_DELAY_USEC ; j++) { +for (j =0 ; j <HWRM_VALID_BIT_DELAY_USEC ; ) {/* make sure we read from updated DMA memory */ dma_rmb ();if (*valid)break ; -usleep_range (1 ,5 ); +if (j <10 ) { +udelay (1 ); + j++; + }else { +usleep_range (20 ,30 ); + j +=20 ; + } }if (j >=HWRM_VALID_BIT_DELAY_USEC ) {if (!(ctx->flags &BNXT_HWRM_CTX_SILENT ))netdev_err (bp->dev,"Error (timeout: %u) msg {0x%x 0x%x} len:%d v:%d\n" , -hwrm_total_timeout (i), +hwrm_total_timeout (i) + j,le16_to_cpu (ctx->req->req_type),le16_to_cpu (ctx->req->seq_id), len, *valid);
drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.h +1 -1
@@ -94,7 +94,7 @@ static inline unsigned int hwrm_total_timeout(unsigned int n) } -#define HWRM_VALID_BIT_DELAY_USEC 150 +#define HWRM_VALID_BIT_DELAY_USEC 50000static inline bool bnxt_cfa_hwrm_message (u16 req_type) {
drivers/net/ethernet/ibm/ibmvnic.c +5 -1
@@ -5733,10 +5733,14 @@ static ssize_t failover_store(struct device *dev, struct device_attribute *attr, be64_to_cpu(session_token)); rc =plpar_hcall_norets (H_VIOCTL , adapter->vdev->unit_address,H_SESSION_ERR_DETECTED , session_token,0 ,0 ); -if (rc) +if (rc) {netdev_err (netdev,"H_VIOCTL initiated failover failed, rc %ld\n" , rc); + goto last_resort; + } + +return count; last_resort:netdev_dbg (netdev,"Trying to send CRQ_CMD, the last resort\n" );
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -11
@@ -5372,15 +5372,7 @@ static int i40e_vsi_configure_bw_alloc(struct i40e_vsi *vsi, u8 enabled_tc,/* There is no need to reset BW when mqprio mode is on. */ if (pf->flags &I40E_FLAG_TC_MQPRIO )return 0 ; - -if (!vsi->mqprio_qopt.qopt.hw) { -if (pf->flags &I40E_FLAG_DCB_ENABLED ) - goto skip_reset; - -if (IS_ENABLED (CONFIG_I40E_DCB ) && -i40e_dcb_hw_get_num_tc (&pf->hw) ==1 ) - goto skip_reset; - +if (!vsi->mqprio_qopt.qopt.hw && !(pf->flags &I40E_FLAG_DCB_ENABLED )) { ret =i40e_set_bw_limit (vsi, vsi->seid,0 );if (ret) dev_info(&pf->pdev->dev,
@@ -5388,8 +5380,6 @@ static int i40e_vsi_configure_bw_alloc(struct i40e_vsi *vsi, u8 enabled_tc, vsi->seid);return ret; } - -skip_reset:memset (&bw_data,0 ,sizeof (bw_data)); bw_data.tc_valid_bits = enabled_tc;for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++)
drivers/net/ethernet/intel/ice/ice.h +0 -1
@@ -231,7 +231,6 @@ enum ice_pf_state {ICE_VFLR_EVENT_PENDING ,ICE_FLTR_OVERFLOW_PROMISC ,ICE_VF_DIS , -ICE_VF_DEINIT_IN_PROGRESS ,ICE_CFG_BUSY ,ICE_SERVICE_SCHED , ICE_SERVICE_DIS,
drivers/net/ethernet/intel/ice/ice_common.c +1 -1
@@ -3270,7 +3270,7 @@ ice_cfg_phy_fec(struct ice_port_info *pi, struct ice_aqc_set_phy_cfg_data *cfg,if (fec ==ICE_FEC_AUTO &&ice_fw_supports_link_override (hw) && !ice_fw_supports_report_dflt_cfg (hw)) { -struct ice_link_default_override_tlv tlv; +struct ice_link_default_override_tlv tlv = {0 }; status =ice_get_link_default_override (&tlv, pi);if (status)
drivers/net/ethernet/intel/ice/ice_main.c +2 -0
@@ -1679,7 +1679,9 @@ static void ice_handle_mdd_event(struct ice_pf *pf)* reset, so print the event prior to reset. */ ice_print_vf_rx_mdd_event (vf); +mutex_lock (&pf->vf[i].cfg_lock);ice_reset_vf (&pf->vf[i], false); +mutex_unlock (&pf->vf[i].cfg_lock); } } }
drivers/net/ethernet/intel/ice/ice_ptp.c +4 -1
@@ -846,9 +846,12 @@ ice_ptp_settime64(struct ptp_clock_info *info, const struct timespec64 *ts)static int ice_ptp_adjtime_nonatomic (struct ptp_clock_info *info,s64 delta) {struct timespec64 now, then; +int ret; then =ns_to_timespec64 (delta); -ice_ptp_gettimex64 (info, &now,NULL ); + ret =ice_ptp_gettimex64 (info, &now,NULL ); +if (ret) +return ret; now =timespec64_add (now, then);return ice_ptp_settime64 (info, (const struct timespec64 *)&now);
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +49 -16
181 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.h +5 -0
@@ -74,6 +74,11 @@ struct ice_mdd_vf_events {struct ice_vf {struct ice_pf *pf; +/* Used during virtchnl message handling and NDO ops against the VF +* that will trigger a VFR +*/ +struct mutex cfg_lock; +u16 vf_id;/* VF ID in the PF space */ u16 lan_vsi_idx;/* index into PF struct */ u16 ctrl_vsi_idx;
drivers/net/ethernet/marvell/mv643xx_eth.c +14 -10
@@ -2700,6 +2700,16 @@ MODULE_DEVICE_TABLE(of, mv643xx_eth_shared_ids);static struct platform_device *port_platdev[3 ]; +static void mv643xx_eth_shared_of_remove (void ) +{ +int n; + +for (n =0 ; n <3 ; n++) { +platform_device_del (port_platdev[n]); + port_platdev[n] =NULL ; + } +} +static int mv643xx_eth_shared_of_add_port (struct platform_device *pdev,struct device_node *pnp) {
@@ -2736,7 +2746,9 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,return -EINVAL ; } -of_get_mac_address (pnp, ppd.mac_addr); + ret =of_get_mac_address (pnp, ppd.mac_addr); +if (ret) +return ret;mv643xx_eth_property (pnp,"tx-queue-size" , ppd.tx_queue_size);mv643xx_eth_property (pnp,"tx-sram-addr" , ppd.tx_sram_addr);
@@ -2800,21 +2812,13 @@ static int mv643xx_eth_shared_of_probe(struct platform_device *pdev) ret =mv643xx_eth_shared_of_add_port (pdev, pnp);if (ret) {of_node_put (pnp); +mv643xx_eth_shared_of_remove ();return ret; } }return 0 ; } -static void mv643xx_eth_shared_of_remove (void ) -{ -int n; - -for (n =0 ; n <3 ; n++) { -platform_device_del (port_platdev[n]); - port_platdev[n] =NULL ; - } -}#else static inline int mv643xx_eth_shared_of_probe (struct platform_device *pdev) {
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_mplsoudp.c +11 -17
@@ -60,37 +60,31 @@ static int parse_tunnel(struct mlx5e_priv *priv, void *headers_v) {struct flow_rule *rule =flow_cls_offload_flow_rule (f); -struct flow_match_enc_keyid enc_keyid;struct flow_match_mpls match;void *misc2_c;void *misc2_v; - misc2_c =MLX5_ADDR_OF (fte_match_param, spec->match_criteria, - misc_parameters_2); - misc2_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, - misc_parameters_2); - -if (!flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_MPLS )) -return 0 ; - -if (!flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_KEYID )) -return 0 ; - -flow_rule_match_enc_keyid (rule, &enc_keyid); - -if (!enc_keyid.mask->keyid) -return 0 ; -if (!MLX5_CAP_ETH (priv->mdev, tunnel_stateless_mpls_over_udp) && !(MLX5_CAP_GEN (priv->mdev, flex_parser_protocols) &MLX5_FLEX_PROTO_CW_MPLS_UDP ))return -EOPNOTSUPP ; +if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_KEYID )) +return -EOPNOTSUPP ; + +if (!flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_MPLS )) +return 0 ; +flow_rule_match_mpls (rule, &match);/* Only support matching the first LSE */ if (match.mask->used_lses !=1 )return -EOPNOTSUPP ; + misc2_c =MLX5_ADDR_OF (fte_match_param, spec->match_criteria, + misc_parameters_2); + misc2_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, + misc_parameters_2); +MLX5_SET (fte_match_set_misc2, misc2_c, outer_first_mpls_over_udp.mpls_label, match.mask->ls[0 ].mpls_label);
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +1 -1
@@ -1754,7 +1754,7 @@ static int mlx5e_get_module_eeprom(struct net_device *netdev,if (size_read <0 ) {netdev_err (priv->netdev,"%s: mlx5_query_eeprom failed:0x%x\n" , __func__, size_read); -return 0 ; +return size_read; } i += size_read;
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +2 -1
@@ -987,7 +987,8 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, }/* True when explicitly set via priv flag, or XDP prog is loaded */ -if (test_bit (MLX5E_RQ_STATE_NO_CSUM_COMPLETE , &rq->state)) +if (test_bit (MLX5E_RQ_STATE_NO_CSUM_COMPLETE , &rq->state) || +get_cqe_tls_offload (cqe)) goto csum_unnecessary;/* CQE csum doesn't cover padding octets in short ethernet
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +0 -4
@@ -2784,10 +2784,6 @@ bool mlx5_esw_vport_match_metadata_supported(const struct mlx5_eswitch *esw)if (!MLX5_CAP_ESW_FLOWTABLE (esw->dev, flow_source))return false; -if (mlx5_core_is_ecpf_esw_manager (esw->dev) || -mlx5_ecpf_vport_exists (esw->dev)) -return false; -return true; }
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +2 -0
@@ -2041,6 +2041,8 @@ void mlx5_del_flow_rules(struct mlx5_flow_handle *handle) fte->node.del_hw_func =NULL ;up_write_ref_node (&fte->node, false);tree_put_node (&fte->node, false); + }else { +up_write_ref_node (&fte->node, false); }kfree (handle); }
drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c +3 -0
@@ -121,6 +121,9 @@ u32 mlx5_chains_get_nf_ft_chain(struct mlx5_fs_chains *chains)u32 mlx5_chains_get_prio_range (struct mlx5_fs_chains *chains) { +if (!mlx5_chains_prios_supported (chains)) +return 1 ; +if (mlx5_chains_ignore_flow_level_supported (chains))return UINT_MAX ;
drivers/net/ethernet/mellanox/mlx5/core/main.c +3 -1
@@ -516,7 +516,7 @@ static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)/* Check log_max_qp from HCA caps to set in current profile */ if (prof->log_max_qp ==LOG_MAX_SUPPORTED_QPS ) { - prof->log_max_qp =MLX5_CAP_GEN_MAX (dev, log_max_qp); + prof->log_max_qp =min_t (u8,17 ,MLX5_CAP_GEN_MAX (dev, log_max_qp)); }else if (MLX5_CAP_GEN_MAX (dev, log_max_qp) < prof->log_max_qp) { mlx5_core_warn(dev, "log_max_qp value in current profile is %d, changing it to HCA capability limit (%d)\n", prof->log_max_qp,
@@ -1762,10 +1762,12 @@ static const struct pci_device_id mlx5_core_pci_table[] = { { PCI_VDEVICE(MELLANOX, 0x101e), MLX5_PCI_DEV_IS_VF}, /* ConnectX Family mlx5Gen Virtual Function */ { PCI_VDEVICE(MELLANOX, 0x101f) }, /* ConnectX-6 LX */ { PCI_VDEVICE(MELLANOX, 0x1021) }, /* ConnectX-7 */ + { PCI_VDEVICE(MELLANOX, 0x1023) }, /* ConnectX-8 */ { PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */ { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */ { PCI_VDEVICE(MELLANOX, 0xa2d6) }, /* BlueField-2 integrated ConnectX-6 Dx network controller */ { PCI_VDEVICE(MELLANOX, 0xa2dc) }, /* BlueField-3 integrated ConnectX-7 network controller */ + { PCI_VDEVICE(MELLANOX, 0xa2df) }, /* BlueField-4 integrated ConnectX-8 network controller */ { 0, } };
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c +81 -39
182 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c +4 -16
@@ -13,18 +13,6 @@ static bool dr_mask_is_dmac_set(struct mlx5dr_match_spec *spec)return (spec->dmac_47_16 || spec->dmac_15_0); } -static bool dr_mask_is_src_addr_set (struct mlx5dr_match_spec *spec) -{ -return (spec->src_ip_127_96 || spec->src_ip_95_64 || - spec->src_ip_63_32 || spec->src_ip_31_0); -} - -static bool dr_mask_is_dst_addr_set (struct mlx5dr_match_spec *spec) -{ -return (spec->dst_ip_127_96 || spec->dst_ip_95_64 || - spec->dst_ip_63_32 || spec->dst_ip_31_0); -} -static bool dr_mask_is_l3_base_set (struct mlx5dr_match_spec *spec) { return (spec->ip_protocol || spec->frag || spec->tcp_flags ||
@@ -480,11 +468,11 @@ static int dr_matcher_set_ste_builders(struct mlx5dr_matcher *matcher, &mask, inner, rx);if (outer_ipv ==DR_RULE_IPV6 ) { -if (dr_mask_is_dst_addr_set (&mask.outer)) +if (DR_MASK_IS_DST_IP_SET (&mask.outer))mlx5dr_ste_build_eth_l3_ipv6_dst (ste_ctx, &sb[idx++], &mask, inner, rx); -if (dr_mask_is_src_addr_set (&mask.outer)) +if (DR_MASK_IS_SRC_IP_SET (&mask.outer))mlx5dr_ste_build_eth_l3_ipv6_src (ste_ctx, &sb[idx++], &mask, inner, rx);
@@ -580,11 +568,11 @@ static int dr_matcher_set_ste_builders(struct mlx5dr_matcher *matcher, &mask, inner, rx);if (inner_ipv ==DR_RULE_IPV6 ) { -if (dr_mask_is_dst_addr_set (&mask.inner)) +if (DR_MASK_IS_DST_IP_SET (&mask.inner))mlx5dr_ste_build_eth_l3_ipv6_dst (ste_ctx, &sb[idx++], &mask, inner, rx); -if (dr_mask_is_src_addr_set (&mask.inner)) +if (DR_MASK_IS_SRC_IP_SET (&mask.inner))mlx5dr_ste_build_eth_l3_ipv6_src (ste_ctx, &sb[idx++], &mask, inner, rx);
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c +31 -1
@@ -602,12 +602,34 @@ int mlx5dr_ste_set_action_decap_l3_list(struct mlx5dr_ste_ctx *ste_ctx, used_hw_action_num); } +static int dr_ste_build_pre_check_spec (struct mlx5dr_domain *dmn, +struct mlx5dr_match_spec *spec) +{ +if (spec->ip_version) { +if (spec->ip_version !=0xf ) { +mlx5dr_err (dmn, +"Partial ip_version mask with src/dst IP is not supported\n" ); +return -EINVAL ; + } + }else if (spec->ethertype !=0xffff && + (DR_MASK_IS_SRC_IP_SET (spec) ||DR_MASK_IS_DST_IP_SET (spec))) { +mlx5dr_err (dmn, +"Partial/no ethertype mask with src/dst IP is not supported\n" ); +return -EINVAL ; + } + +return 0 ; +} +int mlx5dr_ste_build_pre_check (struct mlx5dr_domain *dmn,u8 match_criteria,struct mlx5dr_match_param *mask,struct mlx5dr_match_param *value) { -if (!value && (match_criteria &DR_MATCHER_CRITERIA_MISC )) { +if (value) +return 0 ; + +if (match_criteria &DR_MATCHER_CRITERIA_MISC ) {if (mask->misc.source_port && mask->misc.source_port !=0xffff ) {mlx5dr_err (dmn,"Partial mask source_port is not supported\n" );
@@ -621,6 +643,14 @@ int mlx5dr_ste_build_pre_check(struct mlx5dr_domain *dmn, } } +if ((match_criteria &DR_MATCHER_CRITERIA_OUTER ) && +dr_ste_build_pre_check_spec (dmn, &mask->outer)) +return -EINVAL ; + +if ((match_criteria &DR_MATCHER_CRITERIA_INNER ) && +dr_ste_build_pre_check_spec (dmn, &mask->inner)) +return -EINVAL ; +return 0 ; }
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h +10 -0
@@ -740,6 +740,16 @@ struct mlx5dr_match_param { (_misc3)->icmpv4_code || \ (_misc3)->icmpv4_header_data) +#define DR_MASK_IS_SRC_IP_SET (_spec) ((_spec)->src_ip_127_96 || \ + (_spec)->src_ip_95_64 || \ + (_spec)->src_ip_63_32 || \ + (_spec)->src_ip_31_0) + +#define DR_MASK_IS_DST_IP_SET (_spec) ((_spec)->dst_ip_127_96 || \ + (_spec)->dst_ip_95_64 || \ + (_spec)->dst_ip_63_32 || \ + (_spec)->dst_ip_31_0) +struct mlx5dr_esw_caps {u64 drop_icm_address_rx;u64 drop_icm_address_tx;
drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h +5 -0
@@ -160,6 +160,11 @@ struct mlx5dr_icm_buddy_mem {* sync_ste command sets them free. */ struct list_head hot_list; + +/* Memory optimisation */ +struct mlx5dr_ste *ste_arr; +struct list_head *miss_list; +u8 *hw_ste_arr; }; int mlx5dr_buddy_init(struct mlx5dr_icm_buddy_mem *buddy,
drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c +2 -2
@@ -922,8 +922,8 @@ nfp_tunnel_add_shared_mac(struct nfp_app *app, struct net_device *netdev, int port, bool mod) {struct nfp_flower_priv *priv = app->priv; -int ida_idx =NFP_MAX_MAC_INDEX , err;struct nfp_tun_offloaded_mac *entry; +int ida_idx =-1 , err;u16 nfp_mac_idx =0 ; entry =nfp_tunnel_lookup_offloaded_macs (app, netdev->dev_addr);
@@ -997,7 +997,7 @@ nfp_tunnel_add_shared_mac(struct nfp_app *app, struct net_device *netdev, err_free_entry:kfree (entry); err_free_ida: -if (ida_idx !=NFP_MAX_MAC_INDEX ) +if (ida_idx !=-1 )ida_simple_remove (&priv->tun.mac_off_ids, ida_idx);return err;
drivers/net/ethernet/xilinx/ll_temac_main.c +2 -0
@@ -1427,6 +1427,8 @@ static int temac_probe(struct platform_device *pdev) lp->indirect_lock =devm_kmalloc (&pdev->dev,sizeof (*lp->indirect_lock),GFP_KERNEL ); +if (!lp->indirect_lock) +return -ENOMEM ;spin_lock_init (lp->indirect_lock); }
drivers/net/mdio/mdio-ipq4019.c +5 -1
@@ -200,7 +200,11 @@ static int ipq_mdio_reset(struct mii_bus *bus)if (ret)return ret; -return clk_prepare_enable (priv->mdio_clk); + ret =clk_prepare_enable (priv->mdio_clk); +if (ret ==0 ) +mdelay (10 ); + +return ret; }static int ipq4019_mdio_probe (struct platform_device *pdev)
drivers/net/usb/cdc_ether.c +12 -0
@@ -583,6 +583,11 @@ static const struct usb_device_id products[] = { .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ .bInterfaceProtocol = USB_CDC_PROTO_NONE +#define ZAURUS_FAKE_INTERFACE \ + .bInterfaceClass = USB_CLASS_COMM, \ + .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM, \ + .bInterfaceProtocol = USB_CDC_PROTO_NONE +/* SA-1100 based Sharp Zaurus ("collie"), or compatible; * wire-incompatible with true CDC Ethernet implementations. * (And, it seems, needlessly so...)
@@ -636,6 +641,13 @@ static const struct usb_device_id products[] = { .idProduct = 0x9032, /* SL-6000 */ZAURUS_MASTER_INTERFACE , .driver_info = 0, +}, { + .match_flags =USB_DEVICE_ID_MATCH_INT_INFO + |USB_DEVICE_ID_MATCH_DEVICE , + .idVendor = 0x04DD, + .idProduct = 0x9032, /* SL-6000 */ +ZAURUS_FAKE_INTERFACE , + .driver_info = 0, }, { .match_flags =USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE,
drivers/net/usb/cdc_ncm.c +4 -4
@@ -1715,10 +1715,10 @@ int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) {struct sk_buff *skb;struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0 ]; -int len; +unsigned int len;int nframes;int x; -int offset; +unsigned int offset;union {struct usb_cdc_ncm_ndp16 *ndp16;struct usb_cdc_ncm_ndp32 *ndp32;
@@ -1790,8 +1790,8 @@ int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)break ; } -/* sanity checking */ -if (((offset + len) > skb_in->len) || +/* sanity checking - watch out for integer wrap*/ +if ((offset > skb_in->len) || (len > skb_in->len - offset) || (len > ctx->rx_max) || (len <ETH_HLEN )) { netif_dbg(dev, rx_err, dev->net, "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n",
drivers/net/usb/sr9700.c +1 -1
@@ -410,7 +410,7 @@ static int sr9700_rx_fixup(struct usbnet *dev, struct sk_buff *skb)/* ignore the CRC length */ len = (skb->data[1 ] | (skb->data[2 ] <<8 )) -4 ; -if (len >ETH_FRAME_LEN ) +if (len >ETH_FRAME_LEN || len > skb->len)return 0 ;/* the last packet of current skb */
drivers/net/usb/zaurus.c +12 -0
@@ -256,6 +256,11 @@ static const struct usb_device_id products [] = { .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ .bInterfaceProtocol = USB_CDC_PROTO_NONE +#define ZAURUS_FAKE_INTERFACE \ + .bInterfaceClass = USB_CLASS_COMM, \ + .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM, \ + .bInterfaceProtocol = USB_CDC_PROTO_NONE +/* SA-1100 based Sharp Zaurus ("collie"), or compatible. */ { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
@@ -313,6 +318,13 @@ static const struct usb_device_id products [] = { .idProduct = 0x9032, /* SL-6000 */ZAURUS_MASTER_INTERFACE , .driver_info = ZAURUS_PXA_INFO, +}, { + .match_flags =USB_DEVICE_ID_MATCH_INT_INFO + |USB_DEVICE_ID_MATCH_DEVICE , + .idVendor = 0x04DD, + .idProduct = 0x9032, /* SL-6000 */ +ZAURUS_FAKE_INTERFACE , + .driver_info = (unsigned long)&bogus_mdlm_info, }, { .match_flags =USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE,
drivers/nvme/host/core.c +3 -3
@@ -1914,7 +1914,7 @@ static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_id_ns *id)if (blk_queue_is_zoned (ns->queue)) { ret =nvme_revalidate_zones (ns);if (ret && !nvme_first_scan (ns->disk)) - goto out; +return ret; }if (nvme_ns_head_multipath (ns->head)) {
@@ -1929,16 +1929,16 @@ static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_id_ns *id)return 0 ; out_unfreeze: -blk_mq_unfreeze_queue (ns->disk->queue); -out:/* * If probing fails due an unsupported feature, hide the block device, * but still allow other access. */ if (ret == -ENODEV ) { ns->disk->flags |=GENHD_FL_HIDDEN ; +set_bit (NVME_NS_READY , &ns->flags); ret =0 ; } +blk_mq_unfreeze_queue (ns->disk->queue);return ret; }
drivers/nvmem/core.c +1 -1
@@ -768,7 +768,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)if (config->wp_gpio) nvmem->wp_gpio = config->wp_gpio; -else +else if (!config->ignore_wp) nvmem->wp_gpio =gpiod_get_optional (config->dev,"wp" ,GPIOD_OUT_HIGH );if (IS_ERR (nvmem->wp_gpio)) {
drivers/pinctrl/pinctrl-k210.c +2 -2
@@ -482,7 +482,7 @@ static int k210_pinconf_get_drive(unsigned int max_strength_ua) {int i; -for (i =K210_PC_DRIVE_MAX ; i; i--) { +for (i =K210_PC_DRIVE_MAX ; i >=0 ; i--) {if (k210_pinconf_drive_strength[i] <= max_strength_ua)return i; }
@@ -527,7 +527,7 @@ static int k210_pinconf_set_param(struct pinctrl_dev *pctldev,case PIN_CONFIG_BIAS_PULL_UP :if (!arg)return -EINVAL ; - val |=K210_PC_PD ; + val |=K210_PC_PU ;break ;case PIN_CONFIG_DRIVE_STRENGTH : arg *=1000 ;
drivers/platform/surface/surface3_power.c +10 -3
@@ -233,14 +233,21 @@ static int mshw0011_bix(struct mshw0011_data *cdata, struct bix *bix) } bix->last_full_charg_capacity = ret; -/* get serial number */ +/* +* Get serial number, on some devices (with unofficial replacement +* battery?) reading any of the serial number range addresses gets +* nacked in this case just leave the serial number empty. +*/ ret =i2c_smbus_read_i2c_block_data (client,MSHW0011_BAT0_REG_SERIAL_NO ,sizeof (buf), buf); -if (ret !=sizeof (buf)) { +if (ret == -EREMOTEIO ) { +/* no serial number available */ + }else if (ret !=sizeof (buf)) {dev_err (&client->dev,"Error reading serial no: %d\n" , ret);return ret; + }else { +snprintf (bix->serial,ARRAY_SIZE (bix->serial),"%3pE%6pE" , buf +7 , buf); } -snprintf (bix->serial,ARRAY_SIZE (bix->serial),"%3pE%6pE" , buf +7 , buf);/* get cycle count */ ret =i2c_smbus_read_word_data (client,MSHW0011_BAT0_REG_CYCLE_CNT );
drivers/spi/spi-zynq-qspi.c +3 -0
@@ -570,6 +570,9 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,if (op->dummy.nbytes) { tmpbuf =kzalloc (op->dummy.nbytes,GFP_KERNEL ); +if (!tmpbuf) +return -ENOMEM ; +memset (tmpbuf,0xff , op->dummy.nbytes);reinit_completion (&xqspi->data_completion); xqspi->txbuf = tmpbuf;
drivers/staging/fbtft/fb_st7789v.c +2 -0
@@ -144,6 +144,8 @@ static int init_display(struct fbtft_par *par) {int rc; + par->fbtftops.reset (par); + rc =init_tearing_effect_line (par);if (rc)return rc;
drivers/tee/optee/core.c +8 -0
@@ -588,6 +588,7 @@ static int optee_remove(struct platform_device *pdev)/* Unregister OP-TEE specific client devices on TEE bus */ optee_unregister_devices (); +teedev_close_context (optee->ctx);/* * Ask OP-TEE to free all cached shared memory objects to decrease * reference counters and also avoid wild pointers in secure world
@@ -633,6 +634,7 @@ static int optee_probe(struct platform_device *pdev)struct optee *optee =NULL ;void *memremaped_shm =NULL ;struct tee_device *teedev; +struct tee_context *ctx;u32 sec_caps;int rc;
@@ -719,6 +721,12 @@ static int optee_probe(struct platform_device *pdev)optee_supp_init (&optee->supp); optee->memremaped_shm = memremaped_shm; optee->pool = pool; + ctx =teedev_open (optee->teedev); +if (IS_ERR (ctx)) { + rc =PTR_ERR (ctx); + goto err; + } + optee->ctx = ctx;/* * Ensure that there are no pre-existing shm objects before enabling
drivers/tee/optee/optee_private.h +2 -0
@@ -70,6 +70,7 @@ struct optee_supp {* struct optee - main service struct * @supp_teedev: supplicant device * @teedev: client device +* @ctx: driver internal TEE context * @invoke_fn: function to issue smc or hvc * @call_queue: queue of threads waiting to call @invoke_fn * @wait_queue: queue of threads from secure world waiting for a
@@ -87,6 +88,7 @@ struct optee {struct tee_device *supp_teedev;struct tee_device *teedev;optee_invoke_fn *invoke_fn; +struct tee_context *ctx;struct optee_call_queue call_queue;struct optee_wait_queue wait_queue;struct optee_supp supp;
drivers/tee/optee/rpc.c +5 -3
@@ -285,6 +285,7 @@ static struct tee_shm *cmd_alloc_suppl(struct tee_context *ctx, size_t sz) }static void handle_rpc_func_cmd_shm_alloc (struct tee_context *ctx, +struct optee *optee,struct optee_msg_arg *arg,struct optee_call_ctx *call_ctx) {
@@ -314,7 +315,8 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx, shm =cmd_alloc_suppl (ctx, sz);break ;case OPTEE_RPC_SHM_TYPE_KERNEL : - shm =tee_shm_alloc (ctx, sz,TEE_SHM_MAPPED |TEE_SHM_PRIV ); + shm =tee_shm_alloc (optee->ctx, sz, +TEE_SHM_MAPPED |TEE_SHM_PRIV );break ;default : arg->ret =TEEC_ERROR_BAD_PARAMETERS ;
@@ -471,7 +473,7 @@ static void handle_rpc_func_cmd(struct tee_context *ctx, struct optee *optee,break ;case OPTEE_RPC_CMD_SHM_ALLOC :free_pages_list (call_ctx); -handle_rpc_func_cmd_shm_alloc (ctx, arg, call_ctx); +handle_rpc_func_cmd_shm_alloc (ctx, optee, arg, call_ctx);break ;case OPTEE_RPC_CMD_SHM_FREE :handle_rpc_func_cmd_shm_free (ctx, arg);
@@ -502,7 +504,7 @@ void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param,switch (OPTEE_SMC_RETURN_GET_RPC_FUNC (param->a0)) {case OPTEE_SMC_RPC_FUNC_ALLOC : - shm =tee_shm_alloc (ctx, param->a1, + shm =tee_shm_alloc (optee->ctx, param->a1,TEE_SHM_MAPPED |TEE_SHM_PRIV );if (!IS_ERR (shm) && !tee_shm_get_pa (shm,0 , &pa)) {reg_pair_from_64 (¶m->a1, ¶m->a2, pa);
drivers/tee/tee_core.c +4 -2
@@ -43,7 +43,7 @@ static DEFINE_SPINLOCK(driver_lock);static struct class *tee_class;static dev_t tee_devt; -static struct tee_context *teedev_open (struct tee_device *teedev) +struct tee_context *teedev_open (struct tee_device *teedev) {int rc;struct tee_context *ctx;
@@ -70,6 +70,7 @@ static struct tee_context *teedev_open(struct tee_device *teedev)return ERR_PTR (rc); } +EXPORT_SYMBOL_GPL (teedev_open);void teedev_ctx_get (struct tee_context *ctx) {
@@ -96,13 +97,14 @@ void teedev_ctx_put(struct tee_context *ctx)kref_put (&ctx->refcount, teedev_ctx_release); } -static void teedev_close_context (struct tee_context *ctx) +void teedev_close_context (struct tee_context *ctx) {struct tee_device *teedev = ctx->teedev;teedev_ctx_put (ctx);tee_device_put (teedev); } +EXPORT_SYMBOL_GPL (teedev_close_context);static int tee_open (struct inode *inode,struct file *filp) {
drivers/thermal/intel/int340x_thermal/int3400_thermal.c +4 -0
@@ -405,6 +405,10 @@ static void int3400_notify(acpi_handle handle, thermal_prop[3 ] =kasprintf (GFP_KERNEL ,"EVENT=%d" , therm_event); thermal_prop[4 ] =NULL ;kobject_uevent_env (&priv->thermal->device.kobj,KOBJ_CHANGE , thermal_prop); +kfree (thermal_prop[0 ]); +kfree (thermal_prop[1 ]); +kfree (thermal_prop[2 ]); +kfree (thermal_prop[3 ]); } static int int3400_thermal_get_temp(struct thermal_zone_device *thermal,
drivers/tty/n_gsm.c +29 -16
136 lines not on this page · raw message
drivers/tty/serial/sc16is7xx.c +3 -0
@@ -734,12 +734,15 @@ static irqreturn_t sc16is7xx_irq(int irq, void *dev_id)static void sc16is7xx_tx_proc (struct kthread_work *ws) {struct uart_port *port = &(to_sc16is7xx_one (ws, tx_work)->port); +struct sc16is7xx_port *s =dev_get_drvdata (port->dev);if ((port->rs485.flags &SER_RS485_ENABLED ) && (port->rs485.delay_rts_before_send >0 ))msleep (port->rs485.delay_rts_before_send); +mutex_lock (&s->efr_lock);sc16is7xx_handle_tx (port); +mutex_unlock (&s->efr_lock); }static void sc16is7xx_reconf_rs485 (struct uart_port *port)
drivers/usb/dwc2/core.h +2 -0
@@ -1417,6 +1417,7 @@ void dwc2_hsotg_core_connect(struct dwc2_hsotg *hsotg);void dwc2_hsotg_disconnect (struct dwc2_hsotg *dwc2);int dwc2_hsotg_set_test_mode (struct dwc2_hsotg *hsotg,int testmode);#define dwc2_is_device_connected (hsotg) (hsotg->connected) +#define dwc2_is_device_enabled (hsotg) (hsotg->enabled)int dwc2_backup_device_registers (struct dwc2_hsotg *hsotg);int dwc2_restore_device_registers (struct dwc2_hsotg *hsotg,int remote_wakeup);int dwc2_gadget_enter_hibernation (struct dwc2_hsotg *hsotg);
@@ -1453,6 +1454,7 @@ static inline int dwc2_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode) {return 0 ; }#define dwc2_is_device_connected (hsotg) (0) +#define dwc2_is_device_enabled (hsotg) (0)static inline int dwc2_backup_device_registers (struct dwc2_hsotg *hsotg) {return 0 ; } static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg,
drivers/usb/dwc2/drd.c +4 -2
@@ -109,8 +109,10 @@ static int dwc2_drd_role_sw_set(struct usb_role_switch *sw, enum usb_role role) already =dwc2_ovr_avalid (hsotg, true); }else if (role ==USB_ROLE_DEVICE ) { already =dwc2_ovr_bvalid (hsotg, true); -/* This clear DCTL.SFTDISCON bit */ -dwc2_hsotg_core_connect (hsotg); +if (dwc2_is_device_enabled (hsotg)) { +/* This clear DCTL.SFTDISCON bit */ +dwc2_hsotg_core_connect (hsotg); + } }else {if (dwc2_is_device_mode (hsotg)) {if (!dwc2_ovr_bvalid (hsotg, false))
drivers/usb/dwc3/dwc3-pci.c +14 -3
@@ -85,8 +85,8 @@ static const struct acpi_gpio_mapping acpi_dwc3_byt_gpios[] = {static struct gpiod_lookup_table platform_bytcr_gpios = { .dev_id ="0000:00:16.0" , .table = { -GPIO_LOOKUP ("INT33FC:00" ,54 ,"reset" ,GPIO_ACTIVE_HIGH ), -GPIO_LOOKUP ("INT33FC:02" ,14 ,"cs" ,GPIO_ACTIVE_HIGH ), +GPIO_LOOKUP ("INT33FC:00" ,54 ,"cs" ,GPIO_ACTIVE_HIGH ), +GPIO_LOOKUP ("INT33FC:02" ,14 ,"reset" ,GPIO_ACTIVE_HIGH ), {} }, };
@@ -119,6 +119,13 @@ static const struct property_entry dwc3_pci_intel_properties[] = { {} }; +static const struct property_entry dwc3_pci_intel_byt_properties[] = { +PROPERTY_ENTRY_STRING ("dr_mode" ,"peripheral" ), +PROPERTY_ENTRY_BOOL ("snps,dis_u2_susphy_quirk" ), +PROPERTY_ENTRY_BOOL ("linux,sysdev_is_parent" ), + {} +}; +static const struct property_entry dwc3_pci_mrfld_properties[] = {PROPERTY_ENTRY_STRING ("dr_mode" ,"otg" ),PROPERTY_ENTRY_STRING ("linux,extcon-name" ,"mrfld_bcove_pwrsrc" ),
@@ -161,6 +168,10 @@ static const struct software_node dwc3_pci_intel_swnode = { .properties = dwc3_pci_intel_properties, }; +static const struct software_node dwc3_pci_intel_byt_swnode = { + .properties = dwc3_pci_intel_byt_properties, +}; +static const struct software_node dwc3_pci_intel_mrfld_swnode = { .properties = dwc3_pci_mrfld_properties, };
@@ -344,7 +355,7 @@ static const struct pci_device_id dwc3_pci_id_table[] = { (kernel_ulong_t) &dwc3_pci_intel_swnode, }, {PCI_VDEVICE (INTEL ,PCI_DEVICE_ID_INTEL_BYT ), - (kernel_ulong_t) &dwc3_pci_intel_swnode, }, + (kernel_ulong_t) &dwc3_pci_intel_byt_swnode, }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD), (kernel_ulong_t) &dwc3_pci_intel_mrfld_swnode, },
drivers/usb/dwc3/gadget.c +2 -0
@@ -4131,9 +4131,11 @@ static irqreturn_t dwc3_thread_interrupt(int irq, void *_evt)unsigned long flags;irqreturn_t ret =IRQ_NONE ; +local_bh_disable ();spin_lock_irqsave (&dwc->lock, flags); ret =dwc3_process_event_buf (evt);spin_unlock_irqrestore (&dwc->lock, flags); +local_bh_enable ();return ret; }
drivers/usb/gadget/function/rndis.c +8 -0
@@ -922,6 +922,7 @@ struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v) params->resp_avail = resp_avail; params->v = v;INIT_LIST_HEAD (¶ms->resp_queue); +spin_lock_init (¶ms->resp_lock);pr_debug ("%s: configNr = %d\n" , __func__, i);return params;
@@ -1015,12 +1016,14 @@ void rndis_free_response(struct rndis_params *params, u8 *buf) {rndis_resp_t *r, *n; +spin_lock (¶ms->resp_lock);list_for_each_entry_safe (r, n, ¶ms->resp_queue, list) {if (r->buf == buf) {list_del (&r->list);kfree (r); } } +spin_unlock (¶ms->resp_lock); }EXPORT_SYMBOL_GPL (rndis_free_response);
@@ -1030,14 +1033,17 @@ u8 *rndis_get_next_response(struct rndis_params *params, u32 *length)if (!length)return NULL ; +spin_lock (¶ms->resp_lock);list_for_each_entry_safe (r, n, ¶ms->resp_queue, list) {if (!r->send) { r->send =1 ; *length = r->length; +spin_unlock (¶ms->resp_lock);return r->buf; } } +spin_unlock (¶ms->resp_lock);return NULL ; }EXPORT_SYMBOL_GPL (rndis_get_next_response);
@@ -1054,7 +1060,9 @@ static rndis_resp_t *rndis_add_response(struct rndis_params *params, u32 length) r->length = length; r->send =0 ; +spin_lock (¶ms->resp_lock);list_add_tail (&r->list, ¶ms->resp_queue); +spin_unlock (¶ms->resp_lock);return r; }
drivers/usb/gadget/function/rndis.h +1 -0
@@ -174,6 +174,7 @@ typedef struct rndis_params {void (*resp_avail)(void *v);void *v;struct list_head resp_queue; +spinlock_t resp_lock; } rndis_params;/* RNDIS Message parser and other useless functions */
drivers/usb/gadget/udc/udc-xilinx.c +6 -0
@@ -1612,6 +1612,8 @@ static void xudc_getstatus(struct xusb_udc *udc)break ;case USB_RECIP_ENDPOINT : epnum = udc->setup.wIndex &USB_ENDPOINT_NUMBER_MASK ; +if (epnum >=XUSB_MAX_ENDPOINTS ) + goto stall; target_ep = &udc->ep[epnum]; epcfgreg = udc->read_fn (udc->addr + target_ep->offset); halt = epcfgreg &XUSB_EP_CFG_STALL_MASK ;
@@ -1679,6 +1681,10 @@ static void xudc_set_clear_feature(struct xusb_udc *udc)case USB_RECIP_ENDPOINT :if (!udc->setup.wValue) { endpoint = udc->setup.wIndex &USB_ENDPOINT_NUMBER_MASK ; +if (endpoint >=XUSB_MAX_ENDPOINTS ) { +xudc_ep0_stall (udc); +return ; + } target_ep = &udc->ep[endpoint]; outinbit = udc->setup.wIndex &USB_ENDPOINT_DIR_MASK ; outinbit = outinbit >>7 ;
drivers/usb/host/xhci.c +19 -9
@@ -1091,6 +1091,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)int retval =0 ;bool comp_timer_running = false;bool pending_portevent = false; +bool reinit_xhc = false;if (!hcd->state)return 0 ;
@@ -1107,10 +1108,11 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)set_bit (HCD_FLAG_HW_ACCESSIBLE , &xhci->shared_hcd->flags);spin_lock_irq (&xhci->lock); -if ((xhci->quirks &XHCI_RESET_ON_RESUME ) || xhci->broken_suspend) - hibernated = true; -if (!hibernated) { +if (hibernated || xhci->quirks &XHCI_RESET_ON_RESUME || xhci->broken_suspend) + reinit_xhc = true; + +if (!reinit_xhc) {/* * Some controllers might lose power during suspend, so wait * for controller not ready bit to clear, just as in xHC init.
@@ -1143,12 +1145,17 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)spin_unlock_irq (&xhci->lock);return -ETIMEDOUT ; } - temp =readl (&xhci->op_regs->status); } -/* If restore operation fails, re-initialize the HC during resume */ -if ((temp &STS_SRE ) || hibernated) { + temp =readl (&xhci->op_regs->status); +/* re-initialize the HC on Restore Error, or Host Controller Error */ +if (temp & (STS_SRE |STS_HCE )) { + reinit_xhc = true; +xhci_warn (xhci,"xHC error in resume, USBSTS 0x%x, Reinit\n" , temp); + } + +if (reinit_xhc) {if ((xhci->quirks &XHCI_COMP_MODE_QUIRK ) && !(xhci_all_ports_seen_u0 (xhci))) {del_timer_sync (&xhci->comp_mode_recovery_timer);
@@ -1604,9 +1611,12 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flagstruct urb_priv *urb_priv;int num_tds; -if (!urb ||xhci_check_args (hcd, urb->dev, urb->ep, - true, true, __func__) <=0 ) +if (!urb)return -EINVAL ; + ret =xhci_check_args (hcd, urb->dev, urb->ep, + true, true, __func__); +if (ret <=0 ) +return ret ? ret : -EINVAL ; slot_id = urb->dev->slot_id; ep_index =xhci_get_endpoint_index (&urb->ep->desc);
@@ -3323,7 +3333,7 @@ static int xhci_check_streams_endpoint(struct xhci_hcd *xhci,return -EINVAL ; ret =xhci_check_args (xhci_to_hcd (xhci), udev, ep,1 , true, __func__);if (ret <=0 ) -return -EINVAL ; +return ret ? ret : -EINVAL ;if (usb_ss_max_streams (&ep->ss_ep_comp) ==0 ) { xhci_warn(xhci, "WARN: SuperSpeed Endpoint Companion" " descriptor for ep 0x%x does not support streams\n",
drivers/usb/serial/ch341.c +0 -1
@@ -81,7 +81,6 @@#define CH341_QUIRK_SIMULATE_BREAK BIT(1)static const struct usb_device_id id_table[] = { - {USB_DEVICE (0x1a86 ,0x5512 ) }, {USB_DEVICE (0x1a86 ,0x5523 ) }, {USB_DEVICE (0x1a86 ,0x7522 ) }, {USB_DEVICE (0x1a86 ,0x7523 ) },
drivers/usb/serial/option.c +12 -0
@@ -198,6 +198,8 @@ static void option_instat_callback(struct urb *urb);#define DELL_PRODUCT_5821E 0x81d7#define DELL_PRODUCT_5821E_ESIM 0x81e0 +#define DELL_PRODUCT_5829E_ESIM 0x81e4 +#define DELL_PRODUCT_5829E 0x81e6#define KYOCERA_VENDOR_ID 0x0c88#define KYOCERA_PRODUCT_KPC650 0x17da
@@ -1063,6 +1065,10 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E_ESIM), .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E), + .driver_info = RSVD(0) | RSVD(6) }, + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM), + .driver_info = RSVD(0) | RSVD(6) }, { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
@@ -1273,10 +1279,16 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(2) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7011, 0xff), /* Telit LE910-S1 (ECM) */ .driver_info = NCTRL(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701a, 0xff), /* Telit LE910R1 (RNDIS) */ + .driver_info = NCTRL(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701b, 0xff), /* Telit LE910R1 (ECM) */ + .driver_info = NCTRL(2) }, { USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */ .driver_info = NCTRL(0) | ZLP }, { USB_DEVICE(TELIT_VENDOR_ID, 0x9200), /* Telit LE910S1 flashing device */ .driver_info = NCTRL(0) | ZLP }, + { USB_DEVICE(TELIT_VENDOR_ID, 0x9201), /* Telit LE910R1 flashing device */ + .driver_info = NCTRL(0) | ZLP }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), .driver_info = RSVD(1) },
drivers/usb/typec/tipd/core.c +4 -3
@@ -618,12 +618,12 @@ static int tps6598x_probe(struct i2c_client *client) ret =tps6598x_read32 (tps,TPS_REG_STATUS , &status);if (ret <0 ) -return ret; + goto err_clear_mask;trace_tps6598x_status (status); ret =tps6598x_read32 (tps,TPS_REG_SYSTEM_CONF , &conf);if (ret <0 ) -return ret; + goto err_clear_mask;/* * This fwnode has a "compatible" property, but is never populated as a
@@ -712,7 +712,8 @@ static int tps6598x_probe(struct i2c_client *client)usb_role_switch_put (tps->role_sw); err_fwnode_put:fwnode_handle_put (fwnode); - +err_clear_mask: +tps6598x_write64 (tps,TPS_REG_INT_MASK1 ,0 );return ret; }
drivers/vhost/vsock.c +14 -7
@@ -633,16 +633,18 @@ static int vhost_vsock_start(struct vhost_vsock *vsock)return ret; } -static int vhost_vsock_stop (struct vhost_vsock *vsock) +static int vhost_vsock_stop (struct vhost_vsock *vsock,bool check_owner) {size_t i; -int ret; +int ret =0 ;mutex_lock (&vsock->dev.mutex); - ret =vhost_dev_check_owner (&vsock->dev); -if (ret) - goto err; +if (check_owner) { + ret =vhost_dev_check_owner (&vsock->dev); +if (ret) + goto err; + }for (i =0 ; i <ARRAY_SIZE (vsock->vqs); i++) {struct vhost_virtqueue *vq = &vsock->vqs[i];
@@ -757,7 +759,12 @@ static int vhost_vsock_dev_release(struct inode *inode, struct file *file)* inefficient. Room for improvement here. */ vsock_for_each_connected_socket (vhost_vsock_reset_orphans); -vhost_vsock_stop (vsock); +/* Don't check the owner, because we are in the release path, so we +* need to stop the vsock device in any case. +* vhost_vsock_stop() can not fail in this case, so we don't need to +* check the return code. +*/ +vhost_vsock_stop (vsock, false);vhost_vsock_flush (vsock);vhost_dev_stop (&vsock->dev);
@@ -872,7 +879,7 @@ static long vhost_vsock_dev_ioctl(struct file *f, unsigned int ioctl,if (start)return vhost_vsock_start (vsock);else -return vhost_vsock_stop (vsock); +return vhost_vsock_stop (vsock, true);case VHOST_GET_FEATURES : features =VHOST_VSOCK_FEATURES ;if (copy_to_user (argp, &features,sizeof (features)))
fs/btrfs/lzo.c +11 -0
@@ -363,6 +363,17 @@ int lzo_decompress_bio(struct list_head *ws, struct compressed_bio *cb)kunmap (cur_page); cur_in +=LZO_LEN ; +if (seg_len >lzo1x_worst_compress (PAGE_SIZE )) { +/* +* seg_len shouldn't be larger than we have allocated +* for workspace->cbuf +*/ +btrfs_err (fs_info,"unexpectedly large lzo segment len %u" , + seg_len); + ret = -EIO ; + goto out; + } +/* Copy the compressed segment payload into workspace */ copy_compressed_segment (cb, workspace->cbuf, seg_len, &cur_in);
fs/btrfs/tree-checker.c +15 -0
@@ -965,6 +965,7 @@ static int check_dev_item(struct extent_buffer *leaf, struct btrfs_key *key, int slot) {struct btrfs_dev_item *ditem; +const u32 item_size =btrfs_item_size_nr (leaf, slot);if (unlikely (key->objectid !=BTRFS_DEV_ITEMS_OBJECTID )) { dev_item_err(leaf, slot,
@@ -972,6 +973,13 @@ static int check_dev_item(struct extent_buffer *leaf, key->objectid, BTRFS_DEV_ITEMS_OBJECTID);return -EUCLEAN ; } + +if (unlikely (item_size !=sizeof (*ditem))) { +dev_item_err (leaf, slot,"invalid item size: has %u expect %zu" , + item_size,sizeof (*ditem)); +return -EUCLEAN ; + } + ditem = btrfs_item_ptr(leaf, slot, struct btrfs_dev_item);if (unlikely (btrfs_device_id (leaf, ditem) != key->offset)) { dev_item_err(leaf, slot,
@@ -1007,6 +1015,7 @@ static int check_inode_item(struct extent_buffer *leaf,struct btrfs_inode_item *iitem;u64 super_gen =btrfs_super_generation (fs_info->super_copy);u32 valid_mask = (S_IFMT |S_ISUID |S_ISGID |S_ISVTX |0777 ); +const u32 item_size =btrfs_item_size_nr (leaf, slot);u32 mode;int ret;u32 flags;
@@ -1016,6 +1025,12 @@ static int check_inode_item(struct extent_buffer *leaf,if (unlikely (ret <0 ))return ret; +if (unlikely (item_size !=sizeof (*iitem))) { +generic_err (leaf, slot,"invalid item size: has %u expect %zu" , + item_size,sizeof (*iitem)); +return -EUCLEAN ; + } + iitem = btrfs_item_ptr(leaf, slot, struct btrfs_inode_item);/* Here we use super block generation + 1 to handle log tree */
fs/configfs/dir.c +14 -0
@@ -34,6 +34,14 @@*/ DEFINE_SPINLOCK (configfs_dirent_lock); +/* +* All of link_obj/unlink_obj/link_group/unlink_group require that +* subsys->su_mutex is held. +* But parent configfs_subsystem is NULL when config_item is root. +* Use this mutex when config_item is root. +*/ +static DEFINE_MUTEX (configfs_subsystem_mutex); +static void configfs_d_iput (struct dentry * dentry,struct inode * inode) {
@@ -1859,7 +1867,9 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) group->cg_item.ci_name = group->cg_item.ci_namebuf; sd = root->d_fsdata; +mutex_lock (&configfs_subsystem_mutex);link_group (to_config_group (sd->s_element), group); +mutex_unlock (&configfs_subsystem_mutex);inode_lock_nested (d_inode (root),I_MUTEX_PARENT );
@@ -1884,7 +1894,9 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)inode_unlock (d_inode (root));if (err) { +mutex_lock (&configfs_subsystem_mutex);unlink_group (group); +mutex_unlock (&configfs_subsystem_mutex);configfs_release_fs (); }put_fragment (frag);
@@ -1931,7 +1943,9 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys)dput (dentry); +mutex_lock (&configfs_subsystem_mutex);unlink_group (group); +mutex_unlock (&configfs_subsystem_mutex);configfs_release_fs (); }
fs/io_uring.c +17 -7
@@ -4454,6 +4454,7 @@ static int io_add_buffers(struct io_provide_buf *pbuf, struct io_buffer **head) }else {list_add_tail (&buf->list, &(*head)->list); } +cond_resched (); }return i ? i : -ENOMEM ;
@@ -7590,7 +7591,7 @@ static int io_run_task_work_sig(void)/* when returns >0, the caller should retry */ static inline int io_cqring_wait_schedule (struct io_ring_ctx *ctx,struct io_wait_queue *iowq, -signed long *timeout) +ktime_t timeout) {int ret;
@@ -7602,8 +7603,9 @@ static inline int io_cqring_wait_schedule(struct io_ring_ctx *ctx,if (test_bit (0 , &ctx->check_cq_overflow))return 1 ; - *timeout =schedule_timeout (*timeout); -return !*timeout ? -ETIME :1 ; +if (!schedule_hrtimeout (&timeout,HRTIMER_MODE_ABS )) +return -ETIME ; +return 1 ; }/*
@@ -7616,7 +7618,7 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, {struct io_wait_queue iowq;struct io_rings *rings = ctx->rings; -signed long timeout =MAX_SCHEDULE_TIMEOUT ; +ktime_t timeout =KTIME_MAX ;int ret; do {
@@ -7632,7 +7634,7 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,if (get_timespec64 (&ts, uts))return -EFAULT ; - timeout =timespec64_to_jiffies (&ts); + timeout =ktime_add_ns (timespec64_to_ktime (ts),ktime_get_ns ()); }if (sig) {
@@ -7664,7 +7666,7 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, }prepare_to_wait_exclusive (&ctx->cq_wait, &iowq.wq,TASK_INTERRUPTIBLE ); - ret =io_cqring_wait_schedule (ctx, &iowq, &timeout); + ret =io_cqring_wait_schedule (ctx, &iowq, timeout);finish_wait (&ctx->cq_wait, &iowq.wq);cond_resched (); }while (ret >0 );
@@ -7817,7 +7819,15 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, struct io_ring_ctx *ct ret =wait_for_completion_interruptible (&data->done);if (!ret) {mutex_lock (&ctx->uring_lock); -break ; +if (atomic_read (&data->refs) >0 ) { +/* +* it has been revived by another thread while +* we were unlocked +*/ +mutex_unlock (&ctx->uring_lock); + }else { +break ; + } }atomic_inc (&data->refs);
fs/tracefs/inode.c +3 -2
@@ -264,7 +264,6 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts)if (!gid_valid (gid))return -EINVAL ; opts->gid = gid; -set_gid (tracefs_mount->mnt_root, gid);break ;case Opt_mode:if (match_octal (&args[0 ], &option))
@@ -291,7 +290,9 @@ static int tracefs_apply_options(struct super_block *sb) inode->i_mode |= opts->mode; inode->i_uid = opts->uid; - inode->i_gid = opts->gid; + +/* Set all the group ids to the mount option */ +set_gid (sb->s_root, opts->gid);return 0 ; }
include/linux/bpf.h +4 -5
@@ -206,11 +206,9 @@ static inline bool map_value_has_timer(const struct bpf_map *map)static inline void check_and_init_map_value (struct bpf_map *map,void *dst) {if (unlikely (map_value_has_spin_lock (map))) - *(struct bpf_spin_lock *)(dst + map->spin_lock_off) = - (struct bpf_spin_lock ){}; +memset (dst + map->spin_lock_off,0 ,sizeof (struct bpf_spin_lock ));if (unlikely (map_value_has_timer (map))) - *(struct bpf_timer *)(dst + map->timer_off) = - (struct bpf_timer ){}; +memset (dst + map->timer_off,0 ,sizeof (struct bpf_timer )); }/* copy everything but bpf_spin_lock and bpf_timer. There could be one of each. */
@@ -221,7 +219,8 @@ static inline void copy_map_value(struct bpf_map *map, void *dst, void *src)if (unlikely (map_value_has_spin_lock (map))) { s_off = map->spin_lock_off; s_sz =sizeof (struct bpf_spin_lock ); - }else if (unlikely (map_value_has_timer (map))) { + } +if (unlikely (map_value_has_timer (map))) { t_off = map->timer_off; t_sz =sizeof (struct bpf_timer ); }
include/linux/nvmem-provider.h +3 -1
@@ -66,7 +66,8 @@ struct nvmem_keepout {* @word_size: Minimum read/write access granularity. * @stride: Minimum read/write access stride. * @priv: User context passed to read/write callbacks. -* @wp-gpio: Write protect pin +* @wp-gpio: Write protect pin +* @ignore_wp: Write Protect pin is managed by the provider. *
Lines of this file are not shown. View the raw message.
include/net/checksum.h +28 -22
50 lines not on this page · raw message
include/net/netfilter/nf_tables_offload.h +0 -2
Lines of this file are not shown. View the raw message.
kernel/trace/trace_events_trigger.c +52 -7
59 lines not on this page · raw message
net/openvswitch/actions.c +38 -8
46 lines not on this page · raw message
net/smc/smc_pnet.c +21 -21
42 lines not on this page · raw message
tools/testing/selftests/bpf/progs/test_sockmap_kern.h +18 -8
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/diag.sh +37 -7
44 lines not on this page · raw message
tools/testing/selftests/net/mptcp/mptcp_join.sh +12 -3
Lines of this file are not shown. View the 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.