Linux 5.10.54
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.10.54 kernel.
All users of the 5.10 kernel series must upgrade.
The updated 5.10.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.10.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
------------
Documentation/arm64/tagged-address-abi.rst | 26 - Documentation/driver-api/early-userspace/early_userspace_support.rst | 8 Documentation/filesystems/ramfs-rootfs-initramfs.rst | 2 Documentation/networking/ip-sysctl.rst | 2 Documentation/trace/histogram.rst | 2 Makefile | 2 arch/nds32/mm/mmap.c | 2 arch/powerpc/kvm/book3s_hv.c | 2 arch/powerpc/kvm/book3s_hv_nested.c | 20 + arch/powerpc/kvm/book3s_rtas.c | 25 + arch/powerpc/kvm/powerpc.c | 4 arch/s390/boot/text_dma.S | 19 - arch/s390/include/asm/ftrace.h | 1 arch/s390/kernel/ftrace.c | 2 arch/s390/kernel/mcount.S | 4 arch/s390/net/bpf_jit_comp.c | 2 arch/x86/kvm/cpuid.c | 3 drivers/acpi/Kconfig | 2 drivers/base/core.c | 6 drivers/block/rbd.c | 32 - drivers/bus/mhi/core/main.c | 17 drivers/firmware/efi/efi.c | 13 drivers/firmware/efi/tpm.c | 8 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 1 drivers/gpu/drm/drm_ioctl.c | 3 drivers/gpu/drm/i915/gvt/handlers.c | 15 drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 drivers/media/pci/ngene/ngene-core.c | 2 drivers/media/pci/ngene/ngene.h | 14 drivers/misc/eeprom/at24.c | 17 drivers/mmc/core/host.c | 20 - drivers/net/bonding/bond_main.c | 183 ++++++++-- drivers/net/dsa/mv88e6xxx/chip.c | 10 drivers/net/dsa/mv88e6xxx/serdes.c | 6 drivers/net/dsa/sja1105/sja1105_main.c | 6 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 34 + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 9 drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c | 2 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 18 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 3 drivers/net/ethernet/google/gve/gve_main.c | 5 drivers/net/ethernet/hisilicon/hip04_eth.c | 6 drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h | 6 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 1 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 10 drivers/net/ethernet/intel/e1000e/netdev.c | 1 drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 1 drivers/net/ethernet/intel/iavf/iavf_main.c | 1 drivers/net/ethernet/intel/igb/igb_main.c | 15 drivers/net/ethernet/intel/igc/igc.h | 2 drivers/net/ethernet/intel/igc/igc_main.c | 3 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 drivers/net/ethernet/intel/ixgbevf/ipsec.c | 20 - drivers/net/ethernet/realtek/r8169_main.c | 3 drivers/net/ethernet/sfc/efx_channels.c | 13 drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 8 drivers/net/usb/hso.c | 33 + drivers/nvme/host/core.c | 5 drivers/nvme/host/pci.c | 5 drivers/pci/quirks.c | 4 drivers/pwm/pwm-sprd.c | 11 drivers/regulator/hi6421-regulator.c | 30 - drivers/scsi/scsi_transport_iscsi.c | 90 +--- drivers/spi/spi-bcm2835.c | 12 drivers/spi/spi-cadence.c | 14 drivers/spi/spi-imx.c | 37 +- drivers/spi/spi-mt65xx.c | 16 drivers/spi/spi-stm32.c | 9 drivers/target/target_core_sbc.c | 35 - drivers/usb/core/hub.c | 120 ++++-- drivers/usb/core/quirks.c | 4 drivers/usb/dwc2/gadget.c | 31 + drivers/usb/gadget/udc/tegra-xudc.c | 1 drivers/usb/host/ehci-hcd.c | 18 drivers/usb/host/max3421-hcd.c | 44 -- drivers/usb/host/xhci-hub.c | 3 drivers/usb/host/xhci-pci-renesas.c | 16 drivers/usb/host/xhci-pci.c | 7 drivers/usb/host/xhci-ring.c | 58 ++- drivers/usb/host/xhci.h | 3 drivers/usb/renesas_usbhs/fifo.c | 7 drivers/usb/serial/cp210x.c | 5 drivers/usb/serial/option.c | 3 drivers/usb/storage/unusual_uas.h | 7 drivers/usb/typec/stusb160x.c | 11 fs/afs/cmservice.c | 25 - fs/btrfs/extent-tree.c | 3 fs/ceph/mds_client.c | 2 fs/cifs/smb2ops.c | 49 ++ fs/hugetlbfs/inode.c | 2 fs/io_uring.c | 18 fs/proc/base.c | 2 fs/userfaultfd.c | 24 - include/drm/drm_ioctl.h | 1 include/linux/memblock.h | 4 include/linux/skbuff.h | 33 + include/net/bonding.h | 9 include/trace/events/afs.h | 67 +++ kernel/bpf/verifier.c | 2 kernel/dma/ops_helpers.c | 12 kernel/time/posix-cpu-timers.c | 10 kernel/time/timer.c | 8 kernel/trace/ring_buffer.c | 28 + kernel/trace/trace.c | 4 kernel/trace/trace_events_hist.c | 22 - kernel/trace/trace_synth.h | 2 kernel/tracepoint.c | 2 lib/Kconfig.debug | 1 mm/memblock.c | 3 net/bpf/test_run.c | 3 net/caif/caif_socket.c | 3 net/core/dev.c | 28 + net/core/skbuff.c | 12 net/core/skmsg.c | 16 net/decnet/af_decnet.c | 27 - net/ipv4/tcp_bpf.c | 2 net/ipv4/tcp_fastopen.c | 28 + net/ipv4/tcp_ipv4.c | 2 net/ipv4/udp_bpf.c | 2 net/ipv6/ip6_output.c | 4 net/ipv6/route.c | 2 net/mptcp/syncookies.c | 16 net/netrom/nr_timer.c | 20 - net/sched/act_skbmod.c | 12 net/sched/cls_api.c | 2 net/sched/cls_tcindex.c | 5 net/sctp/auth.c | 2 net/sctp/socket.c | 4 sound/core/pcm_native.c | 25 - sound/hda/intel-dsp-config.c | 4 sound/isa/sb/sb16_csp.c | 4 sound/pci/hda/patch_hdmi.c | 1 sound/pci/hda/patch_realtek.c | 1 sound/soc/codecs/rt5631.c | 2 sound/soc/codecs/wm_adsp.c | 2 sound/usb/mixer.c | 10 sound/usb/quirks.c | 3 tools/bpf/bpftool/common.c | 5 tools/perf/builtin-inject.c | 13 tools/perf/builtin-report.c | 33 + tools/perf/builtin-sched.c | 33 + tools/perf/builtin-script.c | 7 tools/perf/tests/event_update.c | 2 tools/perf/tests/maps.c | 2 tools/perf/tests/topology.c | 1 tools/perf/util/data.c | 2 tools/perf/util/dso.c | 4 tools/perf/util/env.c | 2 tools/perf/util/lzma.c | 8 tools/perf/util/map.c | 2 tools/perf/util/probe-event.c | 4 tools/perf/util/probe-file.c | 4 tools/perf/util/sort.c | 2 tools/perf/util/sort.h | 2 tools/testing/selftests/net/icmp_redirect.sh | 5 tools/testing/selftests/vm/userfaultfd.c | 6 156 files changed, 1400 insertions(+), 598 deletions(-)
Adrian Hunter (1):
driver core: Prevent warning when removing a device link from unregistered consumer
Alain Volmat (1):
spi: stm32: fixes pm_runtime calls in probe/remove
Alan Young (1):
ALSA: pcm: Call substream ack() method upon compat mmap commit
Aleksandr Loktionov (1):
igb: Check if num of q_vectors is smaller than max before array access
Aleksandr Nogikh (1):
net: add kcov handle to skb extensions
Alexander Egorenkov (1):
s390/boot: fix use of expolines in the DMA code
Alexander Tsoy (1):
ALSA: usb-audio: Add registration quirk for JBL Quantum headsets
Alexandru Tachici (1):
spi: spi-bcm2835: Fix deadlock
Amelie Delaunay (1):
usb: typec: stusb160x: register role switch before interrupt registration
Anand Jain (1):
btrfs: check for missing device in btrfs_trim_fs
Axel Lin (2):
regulator: hi6421: Use correct variable type for regmap api val argument
regulator: hi6421: Fix getting wrong drvdata
Bhaumik Bhatt (1):
bus: mhi: core: Validate channel ID when processing command completions
Casey Chen (1):
nvme-pci: do not call nvme_dev_remove_admin from nvme_remove
Charles Baylis (1):
drm: Return -ENOTTY for non-drm ioctls
Charles Keepax (1):
ASoC: wm_adsp: Correct wm_coeff_tlv_get handling
Chengwen Feng (1):
net: hns3: fix possible mismatches resp of mailbox
Christoph Hellwig (1):
nvme: set the PRACT bit when using Write Zeroes with T10 PI
Christophe JAILLET (7):
ixgbe: Fix an error handling path in 'ixgbe_probe()'
igc: Fix an error handling path in 'igc_probe()'
igb: Fix an error handling path in 'igb_probe()'
fm10k: Fix an error handling path in 'fm10k_probe()'
e1000e: Fix an error handling path in 'e1000_probe()'
iavf: Fix an error handling path in 'iavf_probe()'
gve: Fix an error handling path in 'gve_probe()'
Clark Wang (1):
spi: imx: add a check for speed_hz before calculating the clock
Colin Ian King (2):
liquidio: Fix unintentional sign extension issue on left shift of u16 s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1]
Colin Xu (1):
drm/i915/gvt: Clear d3_entered on elsp cmd submission.
Daniel Borkmann (1):
bpf: Fix tail_call_reachable rejection for interpreter when jit failed
David Howells (1):
afs: Fix tracepoint string placement with built-in AFS
David Jeffery (1):
usb: ehci: Prevent missed ehci interrupts with edge-triggered MSI
Dmitry Bogdanov (1):
scsi: target: Fix protect handling in WRITE SAME(32)
Dongliang Mu (1):
usb: hso: fix error handling code of hso_create_net_device
Eric Dumazet (1):
net/tcp_fastopen: fix data races around tfo_active_disable_stamp
Evan Quan (1):
PCI: Mark AMD Navi14 GPU ATS as broken
Florian Fainelli (1):
skbuff: Fix build with SKB extensions disabled
Frederic Weisbecker (1):
posix-cpu-timers: Fix rearm racing against process tick
Greg Kroah-Hartman (2):
nds32: fix up stack guard gap
Linux 5.10.54
Greg Thelen (1):
usb: xhci: avoid renesas_usb_fw.mem when it's unusable
Gustavo A. R. Silva (1):
media: ngene: Fix out-of-bounds bug in ngene_command_config_free_buf()
Hangbin Liu (2):
selftests: icmp_redirect: remove from checking for IPv6 route get
selftests: icmp_redirect: IPv6 PMTU info should be cleared after redirect
Haoran Luo (1):
tracing: Fix bug in rb_per_cpu_empty() that might cause deadloop.
Hui Wang (1):
ALSA: hda/realtek: Fix pop noise and 2 Front Mic issues on a machine
Ian Ray (1):
USB: serial: cp210x: fix comments for GE CS1000
Ilya Dryomov (2):
rbd: don't hold lock_rwsem while running_list is being drained
rbd: always kick acquire on "acquired" and "released" notifications
Jakub Sitnicki (1):
bpf, sockmap, udp: sk_prot needs inuse_idx set for proc stats
Jedrzej Jagielski (1):
igb: Fix position of assignment to *ring
Jian Shen (1):
net: hns3: fix rx VLAN offload state inconsistent issue
Jianguo Wu (1):
mptcp: fix warning in __skb_flow_dissect() when do syn cookie for subflow join
John Fastabend (2):
bpf, sockmap: Fix potential memory leak on unlikely error case bpf, sockmap, tcp: sk_prot needs inuse_idx set for proc stats
John Keeping (1):
USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick
Julian Sikorski (1):
USB: usb-storage: Add LaCie Rugged USB3-FW to IGNORE_UAS
Jérôme Glisse (1):
misc: eeprom: at24: Always append device id even if label property is set.
Kalesh AP (1):
bnxt_en: don't disable an already disabled PCI device
Like Xu (1):
KVM: x86/pmu: Clear anythread deprecated bit when 0xa leaf is unsupported on the SVM
Likun Gao (1):
drm/amdgpu: update golden setting for sienna_cichlid
Luis Henriques (1):
ceph: don't WARN if we're still opening a session to an MDS
Mahesh Bandewar (1):
bonding: fix build issue
Marc Zyngier (1):
firmware/efi: Tell memblock about EFI iomem reservations
Marcelo Henrique Cerri (1):
proc: Avoid mixing integer types in mem_rw()
Marco De Marco (1):
USB: serial: option: add support for u-blox LARA-R6 family
Marek Behún (2):
net: dsa: mv88e6xxx: enable SerDes RX stats for Topaz
net: dsa: mv88e6xxx: enable SerDes PCS register dump via ethtool -d on Topaz
Marek Vasut (1):
spi: cadence: Correct initialisation of runtime PM again
Mark Tomlinson (1):
usb: max-3421: Prevent corruption of freed memory
Markus Boehme (1):
ixgbe: Fix packet corruption due to missing DMA sync
Mathias Nyman (4):
xhci: Fix lost USB 2 remote wake
usb: hub: Disable USB 3 device initiated lpm if exit latency is too high
usb: hub: Fix link power management max exit latency (MEL) calculations
xhci: add xhci_get_virt_ep() helper
Maxim Schwalm (1):
ASoC: rt5631: Fix regcache sync errors on resume
Maxime Ripard (1):
drm/panel: raspberrypi-touchscreen: Prevent double-free
Michael Chan (3):
bnxt_en: Refresh RoCE capabilities in bnxt_ulp_probe()
bnxt_en: Add missing check for BNXT_STATE_ABORT_ERR in bnxt_fw_rset_task()
bnxt_en: Validate vlan protocol ID on RX packets
Michal Suchanek (1):
efi/tpm: Differentiate missing and invalid final event log table.
Mike Christie (1):
scsi: iscsi: Fix iface sysfs attr detection
Mike Kravetz (1):
hugetlbfs: fix mount mode command line processing
Mike Rapoport (1):
memblock: make for_each_mem_range() traverse MEMBLOCK_HOTPLUG regions
Minas Harutyunyan (2):
usb: dwc2: gadget: Fix GOUTNAK flow for Slave mode.
usb: dwc2: gadget: Fix sending zero length packet in DDMA mode.
Moritz Fischer (1):
Revert "usb: renesas-xhci: Fix handling of unknown ROM state"
Nguyen Dinh Phi (1):
netrom: Decrease sock refcount when sock timers expire
Nicholas Piggin (4):
KVM: PPC: Book3S: Fix CONFIG_TRANSACTIONAL_MEM=n crash
KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak
KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
KVM: PPC: Book3S HV Nested: Sanitise H_ENTER_NESTED TM state
Nicolas Dichtel (1):
ipv6: fix 'disable_policy' for fwd packets
Nicolas Saenz Julienne (1):
timers: Fix get_next_timer_interrupt() with no timers pending
Paolo Abeni (1):
ipv6: fix another slab-out-of-bounds in fib6_nh_flush_exceptions
Paul Blakey (1):
skbuff: Release nfct refcount on napi stolen or re-used skbs
Pavel Begunkov (2):
io_uring: explicitly count entries for poll reqs
io_uring: remove double poll entry on arm failure
Pavel Skripkin (1):
net: sched: fix memory leak in tcindex_partial_destroy_work
Peilin Ye (1):
net/sched: act_skbmod: Skip non-Ethernet packets
Peter Collingbourne (2):
selftest: use mmap instead of posix_memalign to allocate memory
userfaultfd: do not untag user pointers
Peter Hess (1):
spi: mediatek: fix fifo rx mode
Pierre-Louis Bossart (1):
ALSA: hda: intel-dsp-cfg: add missing ElkhartLake PCI ID
Randy Dunlap (1):
net: hisilicon: rename CACHE_LINE_MASK to avoid redefinition
Riccardo Mancini (15):
perf inject: Fix dso->nsinfo refcounting
perf map: Fix dso->nsinfo refcounting
perf probe: Fix dso->nsinfo refcounting
perf env: Fix sibling_dies memory leak
perf test session_topology: Delete session->evlist perf test event_update: Fix memory leak of evlist
perf dso: Fix memory leak in dso__new_map()
perf test maps__merge_in: Fix memory leak of maps
perf env: Fix memory leak of cpu_pmu_caps
perf report: Free generated help strings for sort option perf script: Fix memory 'threads' and 'cpus' leaks on exit perf lzma: Close lzma stream on exit
perf probe-file: Delete namelist in del_events() on the error path perf data: Close all files in close_dir()
perf inject: Close inject.output on exit
Robert Richter (2):
ACPI: Kconfig: Fix table override from built-in initrd
Documentation: Fix intiramfs script name
Roman Skakun (1):
dma-mapping: handle vmalloc addresses in dma_common_{mmap,get_sgtable}Ronnie Sahlberg (2):
cifs: only write 64kb at a time when fallocating a small region of a file
cifs: fix fallocate when trying to allocate a hole.
Sayanta Pattanayak (1):
r8169: Avoid duplicate sysfs entry creation error
Shahjada Abul Husain (1):
cxgb4: fix IRQ free race during driver unload
Somnath Kotur (1):
bnxt_en: Check abort error state in bnxt_half_open_nic()
Stephen Boyd (1):
mmc: core: Don't allocate IDA for OF aliases
Steven Rostedt (VMware) (3):
tracepoints: Update static_call before tp_funcs when adding a tracepoint tracing/histogram: Rename "cpu" to "common_cpu"
tracing: Synthetic event field_pos is an index not a boolean
Taehee Yoo (8):
bonding: fix suspicious RCU usage in bond_ipsec_add_sa()
bonding: fix null dereference in bond_ipsec_add_sa()
ixgbevf: use xso.real_dev instead of xso.dev in callback functions of struct xfrmdev_ops
bonding: fix suspicious RCU usage in bond_ipsec_del_sa()
bonding: disallow setting nested bonding + ipsec offload
bonding: Add struct bond_ipesc to manage SA
bonding: fix suspicious RCU usage in bond_ipsec_offload_ok()
bonding: fix incorrect return value of bond_ipsec_offload_ok()
Takashi Iwai (4):
ALSA: usb-audio: Add missing proc text entry for BESPOKEN type
ALSA: sb: Fix potential ABBA deadlock in CSP driver
ALSA: hdmi: Expose all pins on MSI MS-7C94 board
ALSA: pcm: Fix mmap capability check
Tobias Klauser (1):
bpftool: Check malloc return value in mount_bpffs_for_pin
Tom Rix (1):
igc: change default return of igc_read_phy_reg()
Uwe Kleine-König (1):
pwm: sprd: Ensure configuring period and duty_cycle isn't wrongly skipped
Vasily Gorbik (1):
s390/ftrace: fix ftrace_update_ftrace_func implementation
Vincent Palatin (1):
Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem"
Vinicius Costa Gomes (2):
igc: Fix use-after-free error during reset
igb: Fix use-after-free error during reset
Vladimir Oltean (1):
net: dsa: sja1105: make VID 4095 a bridge VLAN too
Wei Wang (1):
tcp: disable TFO blackhole logic by default
Xin Long (2):
sctp: trim optlen when it's a huge value in sctp_setsockopt
sctp: update active_key for asoc when old key is being replaced
Xuan Zhuo (2):
bpf, test: fix NULL pointer dereference on invalid expected_attach_type xdp, net: Fix use-after-free in bpf_xdp_link_release
Yajun Deng (2):
net: decnet: Fix sleeping inside in af_decnet
net: sched: cls_api: Fix the the wrong parameter
Yang Jihong (1):
perf sched: Fix record failure when CONFIG_SCHEDSTATS is not set
Yoshihiro Shimoda (1):
usb: renesas_usbhs: Fix superfluous irqs happen after usb_pkt_pop()
YueHaibing (1):
stmmac: platform: Fix signedness bug in stmmac_probe_config_dt()
Zhang Qilong (1):
usb: gadget: Fix Unbalanced pm_runtime_enable in tegra_xudc_probe
Zhihao Cheng (1):
nvme-pci: don't WARN_ON in nvme_reset_work if ctrl.state is not RESETTING
Ziyang Xuan (1):
net: fix uninit-value in caif_seqpkt_sendmsg
Íñigo Huguet (1):
sfc: ensure correct number of XDP queues
Greg Kroah-Hartman
maintainerDocumentation/arm64/tagged-address-abi.rst +18 -8
@@ -45,14 +45,24 @@ how the user addresses are used by the kernel: 1. User addresses not accessed by the kernel but used for address space management (e.g. ``mprotect()``, ``madvise()``). The use of valid - tagged pointers in this context is allowed with the exception of - ``brk()``, ``mmap()`` and the ``new_address`` argument to - ``mremap()`` as these have the potential to alias with existing - user addresses. - - NOTE: This behaviour changed in v5.6 and so some earlier kernels may - incorrectly accept valid tagged pointers for the ``brk()``, - ``mmap()`` and ``mremap()`` system calls. + tagged pointers in this context is allowed with these exceptions: + + - ``brk()``, ``mmap()`` and the ``new_address`` argument to + ``mremap()`` as these have the potential to alias with existing + user addresses. + + NOTE: This behaviour changed in v5.6 and so some earlier kernels may + incorrectly accept valid tagged pointers for the ``brk()``, + ``mmap()`` and ``mremap()`` system calls. + + - The ``range.start``, ``start`` and ``dst`` arguments to the + ``UFFDIO_*`` ``ioctl()``s used on a file descriptor obtained from + ``userfaultfd()``, as fault addresses subsequently obtained by reading + the file descriptor will be untagged, which may otherwise confuse + tag-unaware programs. + + NOTE: This behaviour changed in v5.14 and so some earlier kernels may + incorrectly accept valid tagged pointers for this system call. 2. User addresses accessed by the kernel (e.g. ``write()``). This ABI relaxation is disabled by default and the application thread needs to
Documentation/driver-api/early-userspace/early_userspace_support.rst +4 -4
@@ -69,17 +69,17 @@ early userspace image can be built by an unprivileged user. As a technical note, when directories and files are specified, the entire CONFIG_INITRAMFS_SOURCE is passed to -usr/gen_initramfs_list.sh. This means that CONFIG_INITRAMFS_SOURCE +usr/gen_initramfs.sh. This means that CONFIG_INITRAMFS_SOURCE can really be interpreted as any legal argument to -gen_initramfs_list.sh. If a directory is specified as an argument then +gen_initramfs.sh. If a directory is specified as an argument then the contents are scanned, uid/gid translation is performed, and usr/gen_init_cpio file directives are output. If a directory is -specified as an argument to usr/gen_initramfs_list.sh then the +specified as an argument to usr/gen_initramfs.sh then the contents of the file are simply copied to the output. All of the output directives from directory scanning and file contents copying are processed by usr/gen_init_cpio. -See also 'usr/gen_initramfs_list.sh -h'. +See also 'usr/gen_initramfs.sh -h'. Where's this all leading? =========================
Documentation/filesystems/ramfs-rootfs-initramfs.rst +1 -1
@@ -170,7 +170,7 @@ Documentation/driver-api/early-userspace/early_userspace_support.rst for more de The kernel does not depend on external cpio tools. If you specify a directory instead of a configuration file, the kernel's build infrastructure creates a configuration file from that directory (usr/Makefile calls -usr/gen_initramfs_list.sh), and proceeds to package up that directory +usr/gen_initramfs.sh), and proceeds to package up that directory using the config file (by feeding it to usr/gen_init_cpio, which is created from usr/gen_init_cpio.c). The kernel's build-time cpio creation code is entirely self-contained, and the kernel's boot-time extractor is also
Documentation/networking/ip-sysctl.rst +1 -1
@@ -751,7 +751,7 @@ tcp_fastopen_blackhole_timeout_sec - INTEGER initial value when the blackhole issue goes away. 0 to disable the blackhole detection. - By default, it is set to 1hr. + By default, it is set to 0 (feature is disabled). tcp_fastopen_key - list of comma separated 32-digit hexadecimal INTEGERs The list consists of a primary key and an optional backup key. The
Documentation/trace/histogram.rst +1 -1
@@ -191,7 +191,7 @@ Documentation written by Tom Zanussi with the event, in nanoseconds. May be modified by .usecs to have timestamps interpreted as microseconds. - cpu int the cpu on which the event occurred. + common_cpu int the cpu on which the event occurred. ====================== ==== ======================================= Extended error information
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 10 -SUBLEVEL = 53 +SUBLEVEL = 54 EXTRAVERSION = NAME = Dare mighty things
arch/nds32/mm/mmap.c +1 -1
@@ -59,7 +59,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/powerpc/kvm/book3s_hv.c +2 -0
@@ -2366,8 +2366,10 @@ static int kvmppc_core_vcpu_create_hv(struct kvm_vcpu *vcpu)HFSCR_DSCR |HFSCR_VECVSX |HFSCR_FP |HFSCR_PREFIX ;if (cpu_has_feature (CPU_FTR_HVMODE )) { vcpu->arch.hfscr &=mfspr (SPRN_HFSCR ); +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM if (cpu_has_feature (CPU_FTR_P9_TM_HV_ASSIST )) vcpu->arch.hfscr |=HFSCR_TM ; +#endif }if (cpu_has_feature (CPU_FTR_TM_COMP )) vcpu->arch.hfscr |=HFSCR_TM ;
arch/powerpc/kvm/book3s_hv_nested.c +20 -0
@@ -232,6 +232,9 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)if (vcpu->kvm->arch.l1_ptcr ==0 )return H_NOT_AVAILABLE ; +if (MSR_TM_TRANSACTIONAL (vcpu->arch.shregs.msr)) +return H_BAD_MODE ; +/* copy parameters in */ hv_ptr =kvmppc_get_gpr (vcpu,4 ); regs_ptr =kvmppc_get_gpr (vcpu,5 );
@@ -254,6 +257,23 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)if (l2_hv.vcpu_token >=NR_CPUS )return H_PARAMETER ; +/* +* L1 must have set up a suspended state to enter the L2 in a +* transactional state, and only in that case. These have to be +* filtered out here to prevent causing a TM Bad Thing in the +* host HRFID. We could synthesize a TM Bad Thing back to the L1 +* here but there doesn't seem like much point. +*/ +if (MSR_TM_SUSPENDED (vcpu->arch.shregs.msr)) { +if (!MSR_TM_ACTIVE (l2_regs.msr)) +return H_BAD_MODE ; + }else { +if (l2_regs.msr &MSR_TS_MASK ) +return H_BAD_MODE ; +if (WARN_ON_ONCE (vcpu->arch.shregs.msr &MSR_TS_MASK )) +return H_BAD_MODE ; + } +/* translate lpid */ l2 =kvmhv_get_nested (vcpu->kvm, l2_hv.lpid, true);if (!l2)
arch/powerpc/kvm/book3s_rtas.c +22 -3
@@ -242,6 +242,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)* value so we can restore it on the way out. */ orig_rets = args.rets; +if (be32_to_cpu (args.nargs) >=ARRAY_SIZE (args.args)) { +/* +* Don't overflow our args array: ensure there is room for +* at least rets[0] (even if the call specifies 0 nret). +* +* Each handler must then check for the correct nargs and nret +* values, but they may always return failure in rets[0]. +*/ + rc = -EINVAL ; + goto fail; + } args.rets = &args.args[be32_to_cpu (args.nargs)];mutex_lock (&vcpu->kvm->arch.rtas_token_lock);
@@ -269,9 +280,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) fail:/* * We only get here if the guest has called RTAS with a bogus -* args pointer. That means we can't get to the args, and so we -* can't fail the RTAS call. So fail right out to userspace, -* which should kill the guest. +* args pointer or nargs/nret values that would overflow the +* array. That means we can't get to the args, and so we can't +* fail the RTAS call. So fail right out to userspace, which +* should kill the guest. +* +* SLOF should actually pass the hcall return value from the +* rtas handler call in r3, so enter_rtas could be modified to +* return a failure indication in r3 and we could return such +* errors to the guest rather than failing to host userspace. +* However old guests that don't test for failure could then +* continue silently after errors, so for now we won't do this. */ return rc; }
arch/powerpc/kvm/powerpc.c +2 -2
@@ -2041,9 +2041,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp, {struct kvm_enable_cap cap; r = -EFAULT ; -vcpu_load (vcpu);if (copy_from_user (&cap, argp,sizeof (cap))) goto out; +vcpu_load (vcpu); r =kvm_vcpu_ioctl_enable_cap (vcpu, &cap);vcpu_put (vcpu);break ;
@@ -2067,9 +2067,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_DIRTY_TLB : {struct kvm_dirty_tlb dirty; r = -EFAULT ; -vcpu_load (vcpu);if (copy_from_user (&dirty, argp,sizeof (dirty))) goto out; +vcpu_load (vcpu); r =kvm_vcpu_ioctl_dirty_tlb (vcpu, &dirty);vcpu_put (vcpu);break ;
arch/s390/boot/text_dma.S +4 -15
@@ -9,16 +9,6 @@ #include <asm/errno.h> #include <asm/sigp.h> -#ifdef CC_USING_EXPOLINE - .pushsection .dma.text.__s390_indirect_jump_r14,"axG" -__dma__s390_indirect_jump_r14: - larl %r1,0f - ex 0,0(%r1) - j . -0: br %r14 - .popsection -#endif - .section .dma.text,"ax" /* * Simplified version of expoline thunk. The normal thunks can not be used here,
@@ -27,11 +17,10 @@ __dma__s390_indirect_jump_r14: * affects a few functions that are not performance-relevant. */ .macro BR_EX_DMA_r14 -#ifdef CC_USING_EXPOLINE - jg __dma__s390_indirect_jump_r14 -#else - br %r14 -#endif + larl %r1,0f + ex 0,0(%r1) + j . +0: br %r14 .endm /*
arch/s390/include/asm/ftrace.h +1 -0
@@ -27,6 +27,7 @@ void ftrace_caller(void);extern char ftrace_graph_caller_end;extern unsigned long ftrace_plt; +extern void *ftrace_func;struct dyn_arch_ftrace { };
arch/s390/kernel/ftrace.c +2 -0
@@ -57,6 +57,7 @@* > brasl %r0,ftrace_caller # offset 0 */ +void *ftrace_func__read_mostly = ftrace_stub;unsigned long ftrace_plt;static inline void ftrace_generate_orig_insn (struct ftrace_insn *insn)
@@ -120,6 +121,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)int ftrace_update_ftrace_func (ftrace_func_t func) { + ftrace_func = func;return 0 ; }
arch/s390/kernel/mcount.S +2 -2
@@ -67,13 +67,13 @@ ENTRY(ftrace_caller) #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES aghik %r2,%r0,-MCOUNT_INSN_SIZE lgrl %r4,function_trace_op - lgrl %r1,ftrace_trace_function + lgrl %r1,ftrace_func #else lgr %r2,%r0 aghi %r2,-MCOUNT_INSN_SIZE larl %r4,function_trace_op lg %r4,0(%r4) - larl %r1,ftrace_trace_function + larl %r1,ftrace_func lg %r1,0(%r1) #endif lgr %r3,%r14
arch/s390/net/bpf_jit_comp.c +1 -1
@@ -112,7 +112,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1) {u32 r1 = reg2hex[b1]; -if (!jit->seen_reg[r1] && r1 >=6 && r1 <=15 ) +if (r1 >=6 && r1 <=15 && !jit->seen_reg[r1]) jit->seen_reg[r1] =1 ; }
arch/x86/kvm/cpuid.c +2 -1
@@ -684,7 +684,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) edx.split.num_counters_fixed =min (cap.num_counters_fixed,MAX_FIXED_COUNTERS ); edx.split.bit_width_fixed = cap.bit_width_fixed; - edx.split.anythread_deprecated =1 ; +if (cap.version) + edx.split.anythread_deprecated =1 ; edx.split.reserved1 =0 ; edx.split.reserved2 =0 ;
drivers/acpi/Kconfig +1 -1
@@ -359,7 +359,7 @@ config ACPI_TABLE_UPGRADE config ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD bool "Override ACPI tables from built-in initrd" depends on ACPI_TABLE_UPGRADE - depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION="" + depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION_NONE help This option provides functionality to override arbitrary ACPI tables from built-in uncompressed initrd.
drivers/base/core.c +4 -2
@@ -449,8 +449,10 @@ static void devlink_remove_symlinks(struct device *dev,return ; } -snprintf (buf, len,"supplier:%s:%s" ,dev_bus_name (sup),dev_name (sup)); -sysfs_remove_link (&con->kobj, buf); +if (device_is_registered (con)) { +snprintf (buf, len,"supplier:%s:%s" ,dev_bus_name (sup),dev_name (sup)); +sysfs_remove_link (&con->kobj, buf); + }snprintf (buf, len,"consumer:%s:%s" ,dev_bus_name (con),dev_name (con));sysfs_remove_link (&sup->kobj, buf);kfree (buf);
drivers/block/rbd.c +12 -20
@@ -4147,8 +4147,6 @@ static void rbd_acquire_lock(struct work_struct *work)static bool rbd_quiesce_lock (struct rbd_device *rbd_dev) { -bool need_wait; -dout ("%s rbd_dev %p\n" , __func__, rbd_dev);lockdep_assert_held_write (&rbd_dev->lock_rwsem);
@@ -4160,11 +4158,11 @@ static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)*/ rbd_dev->lock_state =RBD_LOCK_STATE_RELEASING ;rbd_assert (!completion_done (&rbd_dev->releasing_wait)); - need_wait = !list_empty (&rbd_dev->running_list); -downgrade_write (&rbd_dev->lock_rwsem); -if (need_wait) -wait_for_completion (&rbd_dev->releasing_wait); -up_read (&rbd_dev->lock_rwsem); +if (list_empty (&rbd_dev->running_list)) +return true; + +up_write (&rbd_dev->lock_rwsem); +wait_for_completion (&rbd_dev->releasing_wait);down_write (&rbd_dev->lock_rwsem);if (rbd_dev->lock_state !=RBD_LOCK_STATE_RELEASING )
@@ -4250,15 +4248,11 @@ static void rbd_handle_acquired_lock(struct rbd_device *rbd_dev, u8 struct_v,if (!rbd_cid_equal (&cid, &rbd_empty_cid)) {down_write (&rbd_dev->lock_rwsem);if (rbd_cid_equal (&cid, &rbd_dev->owner_cid)) { -/* -* we already know that the remote client is -* the owner -*/ -up_write (&rbd_dev->lock_rwsem); -return ; +dout ("%s rbd_dev %p cid %llu-%llu == owner_cid\n" , + __func__, rbd_dev, cid.gid, cid.handle); + }else { +rbd_set_owner_cid (rbd_dev, &cid); } - -rbd_set_owner_cid (rbd_dev, &cid);downgrade_write (&rbd_dev->lock_rwsem); }else {down_read (&rbd_dev->lock_rwsem);
@@ -4283,14 +4277,12 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v,if (!rbd_cid_equal (&cid, &rbd_empty_cid)) {down_write (&rbd_dev->lock_rwsem);if (!rbd_cid_equal (&cid, &rbd_dev->owner_cid)) { -dout ("%s rbd_dev %p unexpected owner, cid %llu-%llu != owner_cid %llu-%llu\n" , +dout ("%s rbd_dev %p cid %llu-%llu != owner_cid %llu-%llu\n" , __func__, rbd_dev, cid.gid, cid.handle, rbd_dev->owner_cid.gid, rbd_dev->owner_cid.handle); -up_write (&rbd_dev->lock_rwsem); -return ; + }else { +rbd_set_owner_cid (rbd_dev, &rbd_empty_cid); } - -rbd_set_owner_cid (rbd_dev, &rbd_empty_cid);downgrade_write (&rbd_dev->lock_rwsem); }else {down_read (&rbd_dev->lock_rwsem);
drivers/bus/mhi/core/main.c +12 -5
@@ -706,11 +706,18 @@ static void mhi_process_cmd_completion(struct mhi_controller *mhi_cntrl, cmd_pkt =mhi_to_virtual (mhi_ring, ptr); chan =MHI_TRE_GET_CMD_CHID (cmd_pkt); - mhi_chan = &mhi_cntrl->mhi_chan[chan]; -write_lock_bh (&mhi_chan->lock); - mhi_chan->ccs =MHI_TRE_GET_EV_CODE (tre); -complete (&mhi_chan->completion); -write_unlock_bh (&mhi_chan->lock); + +if (chan < mhi_cntrl->max_chan && + mhi_cntrl->mhi_chan[chan].configured) { + mhi_chan = &mhi_cntrl->mhi_chan[chan]; +write_lock_bh (&mhi_chan->lock); + mhi_chan->ccs =MHI_TRE_GET_EV_CODE (tre); +complete (&mhi_chan->completion); +write_unlock_bh (&mhi_chan->lock); + }else { +dev_err (&mhi_cntrl->mhi_dev->dev, +"Completion packet for invalid channel ID: %d\n" , chan); + }mhi_del_ring_element (mhi_cntrl, mhi_ring); }
drivers/firmware/efi/efi.c +12 -1
@@ -896,6 +896,7 @@ static int __init efi_memreserve_map_root(void)static int efi_mem_reserve_iomem (phys_addr_t addr,u64 size) {struct resource *res, *parent; +int ret; res =kzalloc (sizeof (struct resource ),GFP_ATOMIC );if (!res)
@@ -908,7 +909,17 @@ static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)/* we expect a conflict with a 'System RAM' region */ parent =request_resource_conflict (&iomem_resource, res); -return parent ?request_resource (parent, res) :0 ; + ret = parent ?request_resource (parent, res) :0 ; + +/* +* Given that efi_mem_reserve_iomem() can be called at any +* time, only call memblock_reserve() if the architecture +* keeps the infrastructure around. +*/ +if (IS_ENABLED (CONFIG_ARCH_KEEP_MEMBLOCK ) && !ret) +memblock_reserve (addr, size); + +return ret; }int __ref efi_mem_reserve_persistent (phys_addr_t addr,u64 size)
drivers/firmware/efi/tpm.c +5 -3
@@ -62,9 +62,11 @@ int __init efi_tpm_eventlog_init(void) tbl_size =sizeof (*log_tbl) + log_tbl->size;memblock_reserve (efi.tpm_log, tbl_size); -if (efi.tpm_final_log ==EFI_INVALID_TABLE_ADDR || - log_tbl->version !=EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ) { -pr_warn (FW_BUG "TPM Final Events table missing or invalid\n" ); +if (efi.tpm_final_log ==EFI_INVALID_TABLE_ADDR ) { +pr_info ("TPM Final Events table not present\n" ); + goto out; + }else if (log_tbl->version !=EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ) { +pr_warn (FW_BUG "TPM Final Events table invalid\n" ); goto out; }
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +1 -0
@@ -3137,6 +3137,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3[] =SOC15_REG_GOLDEN_VALUE (GC ,0 , mmSQ_PERFCOUNTER7_SELECT,0xf0f001ff ,0x00000000 ),SOC15_REG_GOLDEN_VALUE (GC ,0 , mmSQ_PERFCOUNTER8_SELECT,0xf0f001ff ,0x00000000 ),SOC15_REG_GOLDEN_VALUE (GC ,0 , mmSQ_PERFCOUNTER9_SELECT,0xf0f001ff ,0x00000000 ), +SOC15_REG_GOLDEN_VALUE (GC ,0 , mmSX_DEBUG_1,0x00010000 ,0x00010020 ),SOC15_REG_GOLDEN_VALUE (GC ,0 , mmTA_CNTL_AUX,0xfff7ffff ,0x01030000 ), SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffbfffff, 0x00a00000) };
drivers/gpu/drm/drm_ioctl.c +3 -0
@@ -827,6 +827,9 @@ long drm_ioctl(struct file *filp,if (drm_dev_is_unplugged (dev))return -ENODEV ; +if (DRM_IOCTL_TYPE (cmd) !=DRM_IOCTL_BASE ) +return -ENOTTY ; + is_driver_ioctl = nr >=DRM_COMMAND_BASE && nr <DRM_COMMAND_END ;if (is_driver_ioctl) {
drivers/gpu/drm/i915/gvt/handlers.c +15 -0
@@ -1728,6 +1728,21 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,if (drm_WARN_ON (&i915->drm, !engine))return -EINVAL ; +/* +* Due to d3_entered is used to indicate skipping PPGTT invalidation on +* vGPU reset, it's set on D0->D3 on PCI config write, and cleared after +* vGPU reset if in resuming. +* In S0ix exit, the device power state also transite from D3 to D0 as +* S3 resume, but no vGPU reset (triggered by QEMU devic model). After +* S0ix exit, all engines continue to work. However the d3_entered +* remains set which will break next vGPU reset logic (miss the expected +* PPGTT invalidation). +* Engines can only work in D0. Thus the 1st elsp write gives GVT a +* chance to clear d3_entered. +*/ +if (vgpu->d3_entered) + vgpu->d3_entered = false; + execlist = &vgpu->submission.execlist[engine->id]; execlist->elsp_dwords.data[3 - execlist->elsp_dwords.index] = data;
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +0 -1
@@ -447,7 +447,6 @@ static int rpi_touchscreen_remove(struct i2c_client *i2c)drm_panel_remove (&ts->base);mipi_dsi_device_unregister (ts->dsi); -kfree (ts->dsi);return 0 ; }
drivers/media/pci/ngene/ngene-core.c +1 -1
@@ -385,7 +385,7 @@ static int ngene_command_config_free_buf(struct ngene *dev, u8 *config) com.cmd.hdr.Opcode =CMD_CONFIGURE_FREE_BUFFER ; com.cmd.hdr.Length =6 ; -memcpy (&com.cmd.ConfigureBuffers.config, config,6 ); +memcpy (&com.cmd.ConfigureFreeBuffers.config, config,6 ); com.in_len =6 ; com.out_len =0 ;
drivers/media/pci/ngene/ngene.h +8 -6
@@ -407,12 +407,14 @@ enum _BUFFER_CONFIGS {struct FW_CONFIGURE_FREE_BUFFERS {struct FW_HEADER hdr; -u8 UVI1_BufferLength; -u8 UVI2_BufferLength; -u8 TVO_BufferLength; -u8 AUD1_BufferLength; -u8 AUD2_BufferLength; -u8 TVA_BufferLength; +struct { +u8 UVI1_BufferLength; +u8 UVI2_BufferLength; +u8 TVO_BufferLength; +u8 AUD1_BufferLength; +u8 AUD2_BufferLength; +u8 TVA_BufferLength; + } __packed config; } __attribute__ ((__packed__ ));struct FW_CONFIGURE_UART {
drivers/misc/eeprom/at24.c +7 -10
@@ -714,23 +714,20 @@ static int at24_probe(struct i2c_client *client) }/* -* If the 'label' property is not present for the AT24 EEPROM, -* then nvmem_config.id is initialised to NVMEM_DEVID_AUTO, -* and this will append the 'devid' to the name of the NVMEM -* device. This is purely legacy and the AT24 driver has always -* defaulted to this. However, if the 'label' property is -* present then this means that the name is specified by the -* firmware and this name should be used verbatim and so it is -* not necessary to append the 'devid'. +* We initialize nvmem_config.id to NVMEM_DEVID_AUTO even if the +* label property is set as some platform can have multiple eeproms +* with same label and we can not register each of those with same +* label. Failing to register those eeproms trigger cascade failure +* on such platform. */ + nvmem_config.id =NVMEM_DEVID_AUTO ; +if (device_property_present (dev,"label" )) { - nvmem_config.id =NVMEM_DEVID_NONE ; err =device_property_read_string (dev,"label" , &nvmem_config.name);if (err)return err; }else { - nvmem_config.id =NVMEM_DEVID_AUTO ; nvmem_config.name =dev_name (dev); }
drivers/mmc/core/host.c +10 -10
@@ -74,7 +74,8 @@ static void mmc_host_classdev_release(struct device *dev) {struct mmc_host *host =cls_dev_to_mmc_host (dev);wakeup_source_unregister (host->ws); -ida_simple_remove (&mmc_host_ida, host->index); +if (of_alias_get_id (host->parent->of_node,"mmc" ) <0 ) +ida_simple_remove (&mmc_host_ida, host->index);kfree (host); }
@@ -436,7 +437,7 @@ static int mmc_first_nonreserved_index(void)*/ struct mmc_host *mmc_alloc_host (int extra,struct device *dev) { -int err; +int index;struct mmc_host *host;int alias_id, min_idx, max_idx;
@@ -449,20 +450,19 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) alias_id =of_alias_get_id (dev->of_node,"mmc" );if (alias_id >=0 ) { - min_idx = alias_id; - max_idx = alias_id +1 ; + index = alias_id; }else { min_idx =mmc_first_nonreserved_index (); max_idx =0 ; - } - err =ida_simple_get (&mmc_host_ida, min_idx, max_idx,GFP_KERNEL ); -if (err <0 ) { -kfree (host); -return NULL ; + index =ida_simple_get (&mmc_host_ida, min_idx, max_idx,GFP_KERNEL ); +if (index <0 ) { +kfree (host); +return NULL ; + } } - host->index = err; + host->index = index;dev_set_name (&host->class_dev,"mmc%d" , host->index); host->ws =wakeup_source_register (NULL ,dev_name (&host->class_dev));
drivers/net/bonding/bond_main.c +155 -28
258 lines not on this page · raw message
drivers/net/dsa/mv88e6xxx/chip.c +10 -0
@@ -3433,6 +3433,11 @@ static const struct mv88e6xxx_ops mv88e6141_ops = { .serdes_irq_enable = mv88e6390_serdes_irq_enable, .serdes_irq_status = mv88e6390_serdes_irq_status, .gpio_ops = &mv88e6352_gpio_ops, + .serdes_get_sset_count = mv88e6390_serdes_get_sset_count, + .serdes_get_strings = mv88e6390_serdes_get_strings, + .serdes_get_stats = mv88e6390_serdes_get_stats, + .serdes_get_regs_len = mv88e6390_serdes_get_regs_len, + .serdes_get_regs = mv88e6390_serdes_get_regs, .phylink_validate = mv88e6341_phylink_validate, };
@@ -4205,6 +4210,11 @@ static const struct mv88e6xxx_ops mv88e6341_ops = { .gpio_ops = &mv88e6352_gpio_ops, .avb_ops = &mv88e6390_avb_ops, .ptp_ops = &mv88e6352_ptp_ops, + .serdes_get_sset_count = mv88e6390_serdes_get_sset_count, + .serdes_get_strings = mv88e6390_serdes_get_strings, + .serdes_get_stats = mv88e6390_serdes_get_stats, + .serdes_get_regs_len = mv88e6390_serdes_get_regs_len, + .serdes_get_regs = mv88e6390_serdes_get_regs, .phylink_validate = mv88e6341_phylink_validate, };
drivers/net/dsa/mv88e6xxx/serdes.c +3 -3
@@ -590,7 +590,7 @@ static struct mv88e6390_serdes_hw_stat mv88e6390_serdes_hw_stats[] = {int mv88e6390_serdes_get_sset_count (struct mv88e6xxx_chip *chip,int port) { -if (mv88e6390_serdes_get_lane (chip, port) ==0 ) +if (mv88e6xxx_serdes_get_lane (chip, port) ==0 )return 0 ;return ARRAY_SIZE (mv88e6390_serdes_hw_stats);
@@ -602,7 +602,7 @@ int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip,struct mv88e6390_serdes_hw_stat *stat;int i; -if (mv88e6390_serdes_get_lane (chip, port) ==0 ) +if (mv88e6xxx_serdes_get_lane (chip, port) ==0 )return 0 ;for (i =0 ; i <ARRAY_SIZE (mv88e6390_serdes_hw_stats); i++) {
@@ -638,7 +638,7 @@ int mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,int lane;int i; - lane =mv88e6390_serdes_get_lane (chip, port); + lane =mv88e6xxx_serdes_get_lane (chip, port);if (lane ==0 )return 0 ;
drivers/net/dsa/sja1105/sja1105_main.c +6 -0
@@ -350,6 +350,12 @@ static int sja1105_init_static_vlan(struct sja1105_private *priv)if (dsa_is_cpu_port (ds, port)) v->pvid = true;list_add (&v->list, &priv->dsa_8021q_vlans); + + v =kmemdup (v,sizeof (*v),GFP_KERNEL ); +if (!v) +return -ENOMEM ; + +list_add (&v->list, &priv->bridge_vlans); } ((struct sja1105_vlan_lookup_entry *)table->entries)[0 ] = pvid;
drivers/net/ethernet/broadcom/bnxt/bnxt.c +28 -6
@@ -1633,11 +1633,16 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp,if ((tpa_info->flags2 &RX_CMP_FLAGS2_META_FORMAT_VLAN ) && (skb->dev->features &BNXT_HW_FEATURE_VLAN_ALL_RX )) { -u16 vlan_proto = tpa_info->metadata >> -RX_CMP_FLAGS2_METADATA_TPID_SFT ; +__be16 vlan_proto =htons (tpa_info->metadata >> +RX_CMP_FLAGS2_METADATA_TPID_SFT );u16 vtag = tpa_info->metadata &RX_CMP_FLAGS2_METADATA_TCI_MASK ; -__vlan_hwaccel_put_tag (skb,htons (vlan_proto), vtag); +if (eth_type_vlan (vlan_proto)) { +__vlan_hwaccel_put_tag (skb, vlan_proto, vtag); + }else { +dev_kfree_skb (skb); +return NULL ; + } }skb_checksum_none_assert (skb);
@@ -1858,9 +1863,15 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, (skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX)) {u32 meta_data =le32_to_cpu (rxcmp1->rx_cmp_meta_data);u16 vtag = meta_data &RX_CMP_FLAGS2_METADATA_TCI_MASK ; -u16 vlan_proto = meta_data >>RX_CMP_FLAGS2_METADATA_TPID_SFT ; +__be16 vlan_proto =htons (meta_data >> +RX_CMP_FLAGS2_METADATA_TPID_SFT ); -__vlan_hwaccel_put_tag (skb,htons (vlan_proto), vtag); +if (eth_type_vlan (vlan_proto)) { +__vlan_hwaccel_put_tag (skb, vlan_proto, vtag); + }else { +dev_kfree_skb (skb); + goto next_rx; + } }skb_checksum_none_assert (skb);
@@ -9830,6 +9841,12 @@ int bnxt_half_open_nic(struct bnxt *bp) {int rc =0 ; +if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +netdev_err (bp->dev,"A previous firmware reset has not completed, aborting half open\n" ); + rc = -ENODEV ; + goto half_open_err; + } + rc =bnxt_alloc_mem (bp, false);if (rc) {netdev_err (bp->dev,"bnxt_alloc_mem err: %x\n" , rc);
@@ -11480,6 +11497,10 @@ static void bnxt_fw_reset_task(struct work_struct *work) } bp->fw_reset_timestamp = jiffies;rtnl_lock (); +if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +rtnl_unlock (); + goto fw_reset_abort; + }bnxt_fw_reset_close (bp);if (bp->fw_cap &BNXT_FW_CAP_ERR_RECOVER_RELOAD ) { bp->fw_reset_state =BNXT_FW_RESET_STATE_POLL_FW_DOWN ;
@@ -12901,7 +12922,8 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,if (netif_running (netdev))bnxt_close (netdev); -pci_disable_device (pdev); +if (pci_is_enabled (pdev)) +pci_disable_device (pdev);bnxt_free_ctx_mem (bp);kfree (bp->ctx); bp->ctx =NULL ;
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +5 -4
@@ -479,15 +479,16 @@ struct bnxt_en_dev *bnxt_ulp_probe(struct net_device *dev)if (!edev)return ERR_PTR (-ENOMEM ); edev->en_ops = &bnxt_en_ops_tbl; -if (bp->flags &BNXT_FLAG_ROCEV1_CAP ) - edev->flags |=BNXT_EN_FLAG_ROCEV1_CAP ; -if (bp->flags &BNXT_FLAG_ROCEV2_CAP ) - edev->flags |=BNXT_EN_FLAG_ROCEV2_CAP ; edev->net = dev; edev->pdev = bp->pdev; edev->l2_db_size = bp->db_size; edev->l2_db_size_nc = bp->db_size; bp->edev = edev; } + edev->flags &= ~BNXT_EN_FLAG_ROCE_CAP ; +if (bp->flags &BNXT_FLAG_ROCEV1_CAP ) + edev->flags |=BNXT_EN_FLAG_ROCEV1_CAP ; +if (bp->flags &BNXT_FLAG_ROCEV2_CAP ) + edev->flags |=BNXT_EN_FLAG_ROCEV2_CAP ;return bp->edev; }
drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c +1 -1
@@ -420,7 +420,7 @@ static int cn23xx_pf_setup_global_input_regs(struct octeon_device *oct)* bits 32:47 indicate the PVF num. */ for (q_no =0 ; q_no < ern; q_no++) { - reg_val = oct->pcie_port <<CN23XX_PKT_INPUT_CTL_MAC_NUM_POS ; + reg_val = (u64 )oct->pcie_port <<CN23XX_PKT_INPUT_CTL_MAC_NUM_POS ;/* for VF assigned queues. */ if (q_no < oct->sriov_info.pf_srn) {
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +10 -8
@@ -2643,6 +2643,9 @@ static void detach_ulds(struct adapter *adap) {unsigned int i; +if (!is_uld (adap)) +return ; +mutex_lock (&uld_mutex);list_del (&adap->list_node);
@@ -7145,10 +7148,13 @@ static void remove_one(struct pci_dev *pdev)*/ destroy_workqueue (adapter->workq); -if (is_uld (adapter)) { -detach_ulds (adapter); -t4_uld_clean_up (adapter); - } +detach_ulds (adapter); + +for_each_port (adapter, i) +if (adapter->port[i]->reg_state ==NETREG_REGISTERED ) +unregister_netdev (adapter->port[i]); + +t4_uld_clean_up (adapter);adap_free_hma_mem (adapter);
@@ -7156,10 +7162,6 @@ static void remove_one(struct pci_dev *pdev)cxgb4_free_mps_ref_entries (adapter); -for_each_port (adapter, i) -if (adapter->port[i]->reg_state ==NETREG_REGISTERED ) -unregister_netdev (adapter->port[i]); -debugfs_remove_recursive (adapter->debugfs_root);if (!is_t4 (adapter->params.chip))
drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c +3 -0
@@ -581,6 +581,9 @@ void t4_uld_clean_up(struct adapter *adap) {unsigned int i; +if (!is_uld (adap)) +return ; +mutex_lock (&uld_mutex);for (i =0 ; i <CXGB4_ULD_MAX ; i++) {if (!adap->uld[i].handle)
drivers/net/ethernet/google/gve/gve_main.c +4 -1
@@ -1340,13 +1340,16 @@ static int gve_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err =register_netdev (dev);if (err) - goto abort_with_wq; + goto abort_with_gve_init;dev_info (&pdev->dev,"GVE version %s\n" , gve_version_str);gve_clear_probe_in_progress (priv);queue_work (priv->gve_wq, &priv->service_task);return 0 ; +abort_with_gve_init: +gve_teardown_priv_resources (priv); + abort_with_wq:destroy_workqueue (priv->gve_wq);
drivers/net/ethernet/hisilicon/hip04_eth.c +3 -3
@@ -131,7 +131,7 @@/* buf unit size is cache_line_size, which is 64, so the shift is 6 */ #define PPE_BUF_SIZE_SHIFT 6#define PPE_TX_BUF_HOLD BIT(31) -#define CACHE_LINE_MASK 0x3F +#define SOC_CACHE_LINE_MASK 0x3F#else #define PPE_CFG_QOS_VMID_GRP_SHIFT 8#define PPE_CFG_RX_CTRL_ALIGN_SHIFT 11
@@ -531,8 +531,8 @@ hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev)#if defined(CONFIG_HI13X1_GMAC ) desc->cfg = (__force u32 )cpu_to_be32 (TX_CLEAR_WB |TX_FINISH_CACHE_INV |TX_RELEASE_TO_PPE | priv->port <<TX_POOL_SHIFT ); - desc->data_offset = (__force u32 )cpu_to_be32 (phys &CACHE_LINE_MASK ); - desc->send_addr = (__force u32 )cpu_to_be32 (phys & ~CACHE_LINE_MASK ); + desc->data_offset = (__force u32 )cpu_to_be32 (phys &SOC_CACHE_LINE_MASK ); + desc->send_addr = (__force u32 )cpu_to_be32 (phys & ~SOC_CACHE_LINE_MASK );#else desc->cfg = (__force u32 )cpu_to_be32 (TX_CLEAR_WB |TX_FINISH_CACHE_INV ); desc->send_addr = (__force u32 )cpu_to_be32 (phys);
drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h +4 -2
@@ -134,7 +134,8 @@ struct hclge_mbx_vf_to_pf_cmd {u8 mbx_need_resp;u8 rsv1[1 ];u8 msg_len; -u8 rsv2[3 ]; +u8 rsv2; +u16 match_id;struct hclge_vf_to_pf_msg msg; };
@@ -144,7 +145,8 @@ struct hclge_mbx_pf_to_vf_cmd {u8 dest_vfid;u8 rsv[3 ];u8 msg_len; -u8 rsv1[3 ]; +u8 rsv1; +u16 match_id;struct hclge_pf_to_vf_msg msg; };
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +1 -0
@@ -47,6 +47,7 @@ static int hclge_gen_resp_to_vf(struct hclge_vport *vport, resp_pf_to_vf->dest_vfid = vf_to_pf_req->mbx_src_vfid; resp_pf_to_vf->msg_len = vf_to_pf_req->msg_len; + resp_pf_to_vf->match_id = vf_to_pf_req->match_id; resp_pf_to_vf->msg.code =HCLGE_MBX_PF_VF_RESP ; resp_pf_to_vf->msg.vf_mbx_msg_code = vf_to_pf_req->msg.code;
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +10 -0
@@ -2518,6 +2518,16 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)static int hclgevf_init_vlan_config (struct hclgevf_dev *hdev) { +struct hnae3_handle *nic = &hdev->nic; +int ret; + + ret =hclgevf_en_hw_strip_rxvtag (nic, true); +if (ret) { +dev_err (&hdev->pdev->dev, +"failed to enable rx vlan offload, ret = %d\n" , ret); +return ret; + } +return hclgevf_set_vlan_filter (&hdev->nic,htons (ETH_P_8021Q ),0 , false); }
drivers/net/ethernet/intel/e1000e/netdev.c +1 -0
@@ -7657,6 +7657,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/fm10k/fm10k_pci.c +1 -0
@@ -2227,6 +2227,7 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_netdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -0
@@ -3759,6 +3759,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/igb/igb_main.c +13 -2
@@ -931,6 +931,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)**/ static int igb_request_msix (struct igb_adapter *adapter) { +unsigned int num_q_vectors = adapter->num_q_vectors;struct net_device *netdev = adapter->netdev;int i, err =0 , vector =0 , free_vector =0 ;
@@ -939,7 +940,13 @@ static int igb_request_msix(struct igb_adapter *adapter)if (err) goto err_out; -for (i =0 ; i < adapter->num_q_vectors; i++) { +if (num_q_vectors >MAX_Q_VECTORS ) { + num_q_vectors =MAX_Q_VECTORS ; +dev_warn (&adapter->pdev->dev, +"The number of queue vectors (%d) is higher than max allowed (%d)\n" , + adapter->num_q_vectors,MAX_Q_VECTORS ); + } +for (i =0 ; i < num_q_vectors; i++) {struct igb_q_vector *q_vector = adapter->q_vector[i]; vector++;
@@ -1678,14 +1685,15 @@ static bool is_any_txtime_enabled(struct igb_adapter *adapter)**/ static void igb_config_tx_modes (struct igb_adapter *adapter,int queue) { -struct igb_ring *ring = adapter->tx_ring[queue];struct net_device *netdev = adapter->netdev;struct e1000_hw *hw = &adapter->hw; +struct igb_ring *ring;u32 tqavcc, tqavctrl;u16 value;WARN_ON (hw->mac.type != e1000_i210);WARN_ON (queue <0 || queue >1 ); + ring = adapter->tx_ring[queue];/* If any of the Qav features is enabled, configure queues as SR and * with HIGH PRIO. If none is, then configure them with LOW PRIO and
@@ -3616,6 +3624,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
@@ -4836,6 +4845,8 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring) DMA_TO_DEVICE); } + tx_buffer->next_to_watch =NULL ; +/* move us one more past the eop_desc for start of next pkt */ tx_buffer++; i++;
drivers/net/ethernet/intel/igc/igc.h +1 -1
@@ -532,7 +532,7 @@ static inline s32 igc_read_phy_reg(struct igc_hw *hw, u32 offset, u16 *data)if (hw->phy.ops.read_reg)return hw->phy.ops.read_reg (hw, offset, data); -return 0 ; +return -EOPNOTSUPP ; }void igc_reinit_locked (struct igc_adapter *);
drivers/net/ethernet/intel/igc/igc_main.c +3 -0
@@ -207,6 +207,8 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring) DMA_TO_DEVICE); } + tx_buffer->next_to_watch =NULL ; +/* move us one more past the eop_desc for start of next pkt */ tx_buffer++; i++;
@@ -5221,6 +5223,7 @@ static int igc_probe(struct pci_dev *pdev, err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +3 -1
@@ -1825,7 +1825,8 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring, struct sk_buff *skb) {if (ring_uses_build_skb (rx_ring)) { -unsigned long offset = (unsigned long )(skb->data) & ~PAGE_MASK ; +unsigned long mask = (unsigned long )ixgbe_rx_pg_size (rx_ring) -1 ; +unsigned long offset = (unsigned long )(skb->data) & mask; dma_sync_single_range_for_cpu(rx_ring->dev, IXGBE_CB(skb)->dma,
@@ -11081,6 +11082,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) disable_dev = !test_and_set_bit (__IXGBE_DISABLED, &adapter->state);free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/ixgbevf/ipsec.c +13 -7
@@ -211,7 +211,7 @@ struct xfrm_state *ixgbevf_ipsec_find_rx_state(struct ixgbevf_ipsec *ipsec,static int ixgbevf_ipsec_parse_proto_keys (struct xfrm_state *xs,u32 *mykey,u32 *mysalt) { -struct net_device *dev = xs->xso.dev; +struct net_device *dev = xs->xso.real_dev;unsigned char *key_data;char *alg_name =NULL ;int key_len;
@@ -260,12 +260,15 @@ static int ixgbevf_ipsec_parse_proto_keys(struct xfrm_state *xs,**/ static int ixgbevf_ipsec_add_sa (struct xfrm_state *xs) { -struct net_device *dev = xs->xso.dev; -struct ixgbevf_adapter *adapter =netdev_priv (dev); -struct ixgbevf_ipsec *ipsec = adapter->ipsec; +struct net_device *dev = xs->xso.real_dev; +struct ixgbevf_adapter *adapter; +struct ixgbevf_ipsec *ipsec;u16 sa_idx;int ret; + adapter =netdev_priv (dev); + ipsec = adapter->ipsec; +if (xs->id.proto !=IPPROTO_ESP && xs->id.proto !=IPPROTO_AH ) {netdev_err (dev,"Unsupported protocol 0x%04x for IPsec offload\n" , xs->id.proto);
@@ -383,11 +386,14 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs)**/ static void ixgbevf_ipsec_del_sa (struct xfrm_state *xs) { -struct net_device *dev = xs->xso.dev; -struct ixgbevf_adapter *adapter =netdev_priv (dev); -struct ixgbevf_ipsec *ipsec = adapter->ipsec; +struct net_device *dev = xs->xso.real_dev; +struct ixgbevf_adapter *adapter; +struct ixgbevf_ipsec *ipsec;u16 sa_idx; + adapter =netdev_priv (dev); + ipsec = adapter->ipsec; +if (xs->xso.flags &XFRM_OFFLOAD_INBOUND ) { sa_idx = xs->xso.offload_handle -IXGBE_IPSEC_BASE_RX_INDEX ;
drivers/net/ethernet/realtek/r8169_main.c +2 -1
@@ -5160,7 +5160,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp) new_bus->priv = tp; new_bus->parent = &pdev->dev; new_bus->irq[0 ] =PHY_IGNORE_INTERRUPT ; -snprintf (new_bus->id,MII_BUS_ID_SIZE ,"r8169-%x" ,pci_dev_id (pdev)); +snprintf (new_bus->id,MII_BUS_ID_SIZE ,"r8169-%x-%x" , +pci_domain_nr (pdev->bus),pci_dev_id (pdev)); new_bus->read = r8169_mdio_read_reg; new_bus->write = r8169_mdio_write_reg;
drivers/net/ethernet/sfc/efx_channels.c +8 -5
@@ -889,18 +889,20 @@ int efx_set_channels(struct efx_nic *efx)if (efx_channel_is_xdp_tx (channel)) {efx_for_each_channel_tx_queue (tx_queue, channel) { tx_queue->queue = next_queue++; -netif_dbg (efx, drv, efx->net_dev,"Channel %u TXQ %u is XDP %u, HW %u\n" , - channel->channel, tx_queue->label, - xdp_queue_number, tx_queue->queue); +/* We may have a few left-over XDP TX * queues owing to xdp_tx_queue_count * not dividing evenly by EFX_MAX_TXQ_PER_CHANNEL. * We still allocate and probe those * TXQs, but never use them. */ -if (xdp_queue_number < efx->xdp_tx_queue_count) +if (xdp_queue_number < efx->xdp_tx_queue_count) { +netif_dbg (efx, drv, efx->net_dev,"Channel %u TXQ %u is XDP %u, HW %u\n" , + channel->channel, tx_queue->label, + xdp_queue_number, tx_queue->queue); efx->xdp_tx_queues[xdp_queue_number] = tx_queue; - xdp_queue_number++; + xdp_queue_number++; + } } }else {efx_for_each_channel_tx_queue (tx_queue, channel) {
@@ -912,6 +914,7 @@ int efx_set_channels(struct efx_nic *efx) } } } +WARN_ON (xdp_queue_number != efx->xdp_tx_queue_count); rc =netif_set_real_num_tx_queues (efx->net_dev, efx->n_tx_channels);if (rc)
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +5 -3
@@ -399,6 +399,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)struct device_node *np = pdev->dev.of_node;struct plat_stmmacenet_data *plat;struct stmmac_dma_cfg *dma_cfg; +int phy_mode;int rc; plat =devm_kzalloc (&pdev->dev,sizeof (*plat),GFP_KERNEL );
@@ -413,10 +414,11 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) *mac =NULL ; } - plat->phy_interface =device_get_phy_mode (&pdev->dev); -if (plat->phy_interface <0 ) -return ERR_PTR (plat->phy_interface); + phy_mode =device_get_phy_mode (&pdev->dev); +if (phy_mode <0 ) +return ERR_PTR (phy_mode); + plat->phy_interface = phy_mode; plat->interface =stmmac_of_get_mac_mode (np);if (plat->interface <0 ) plat->interface = plat->phy_interface;
drivers/net/usb/hso.c +23 -10
@@ -2496,7 +2496,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, hso_net_init);if (!net) {dev_err (&interface->dev,"Unable to create ethernet device\n" ); - goto exit; + goto err_hso_dev; } hso_net =netdev_priv (net);
@@ -2509,13 +2509,13 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, USB_DIR_IN);if (!hso_net->in_endp) {dev_err (&interface->dev,"Can't find BULK IN endpoint\n" ); - goto exit; + goto err_net; } hso_net->out_endp =hso_get_ep (interface,USB_ENDPOINT_XFER_BULK ,USB_DIR_OUT );if (!hso_net->out_endp) {dev_err (&interface->dev,"Can't find BULK OUT endpoint\n" ); - goto exit; + goto err_net; }SET_NETDEV_DEV (net, &interface->dev);SET_NETDEV_DEVTYPE (net, &hso_type);
@@ -2524,18 +2524,18 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,for (i =0 ; i <MUX_BULK_RX_BUF_COUNT ; i++) { hso_net->mux_bulk_rx_urb_pool[i] =usb_alloc_urb (0 ,GFP_KERNEL );if (!hso_net->mux_bulk_rx_urb_pool[i]) - goto exit; + goto err_mux_bulk_rx; hso_net->mux_bulk_rx_buf_pool[i] =kzalloc (MUX_BULK_RX_BUF_SIZE ,GFP_KERNEL );if (!hso_net->mux_bulk_rx_buf_pool[i]) - goto exit; + goto err_mux_bulk_rx; } hso_net->mux_bulk_tx_urb =usb_alloc_urb (0 ,GFP_KERNEL );if (!hso_net->mux_bulk_tx_urb) - goto exit; + goto err_mux_bulk_rx; hso_net->mux_bulk_tx_buf =kzalloc (MUX_BULK_TX_BUF_SIZE ,GFP_KERNEL );if (!hso_net->mux_bulk_tx_buf) - goto exit; + goto err_free_tx_urb;add_net_device (hso_dev);
@@ -2543,7 +2543,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, result =register_netdev (net);if (result) {dev_err (&interface->dev,"Failed to register device\n" ); - goto exit; + goto err_free_tx_buf; }hso_log_port (hso_dev);
@@ -2551,8 +2551,21 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,hso_create_rfkill (hso_dev, interface);return hso_dev; -exit: -hso_free_net_device (hso_dev, true); + +err_free_tx_buf: +remove_net_device (hso_dev); +kfree (hso_net->mux_bulk_tx_buf); +err_free_tx_urb: +usb_free_urb (hso_net->mux_bulk_tx_urb); +err_mux_bulk_rx: +for (i =0 ; i <MUX_BULK_RX_BUF_COUNT ; i++) { +usb_free_urb (hso_net->mux_bulk_rx_urb_pool[i]); +kfree (hso_net->mux_bulk_rx_buf_pool[i]); + } +err_net: +free_netdev (net); +err_hso_dev: +kfree (hso_dev);return NULL ; }
drivers/nvme/host/core.c +4 -1
@@ -751,7 +751,10 @@ static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,cpu_to_le64 (nvme_sect_to_lba (ns,blk_rq_pos (req))); cmnd->write_zeroes.length =cpu_to_le16 ((blk_rq_bytes (req) >> ns->lba_shift) -1 ); - cmnd->write_zeroes.control =0 ; +if (nvme_ns_has_pi (ns)) + cmnd->write_zeroes.control =cpu_to_le16 (NVME_RW_PRINFO_PRACT ); +else + cmnd->write_zeroes.control =0 ;return BLK_STS_OK ; }
drivers/nvme/host/pci.c +3 -2
@@ -2596,7 +2596,9 @@ static void nvme_reset_work(struct work_struct *work)bool was_suspend = !!(dev->ctrl.ctrl_config &NVME_CC_SHN_NORMAL );int result; -if (WARN_ON (dev->ctrl.state !=NVME_CTRL_RESETTING )) { +if (dev->ctrl.state !=NVME_CTRL_RESETTING ) { +dev_warn (dev->ctrl.device,"ctrl state %d is not RESETTING\n" , + dev->ctrl.state); result = -ENODEV ; goto out; }
@@ -3003,7 +3005,6 @@ static void nvme_remove(struct pci_dev *pdev)if (!pci_device_is_present (pdev)) {nvme_change_ctrl_state (&dev->ctrl,NVME_CTRL_DEAD );nvme_dev_disable (dev, true); -nvme_dev_remove_admin (dev); }flush_work (&dev->ctrl.reset_work);
drivers/pci/quirks.c +3 -1
@@ -5264,7 +5264,8 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0422, quirk_no_ext_tags);static void quirk_amd_harvest_no_ats (struct pci_dev *pdev) {if ((pdev->device ==0x7312 && pdev->revision !=0x00 ) || - (pdev->device ==0x7340 && pdev->revision !=0xc5 )) + (pdev->device ==0x7340 && pdev->revision !=0xc5 ) || + (pdev->device ==0x7341 && pdev->revision !=0x00 ))return ;pci_info (pdev,"disabling ATS\n" );
@@ -5279,6 +5280,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, quirk_amd_harvest_no_ats);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x7312 , quirk_amd_harvest_no_ats);/* AMD Navi14 dGPU */ DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x7340 , quirk_amd_harvest_no_ats); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x7341 , quirk_amd_harvest_no_ats);#endif /* CONFIG_PCI_ATS */ /* Freescale PCIe doesn't support MSI in RC mode */
drivers/pwm/pwm-sprd.c +4 -7
@@ -180,13 +180,10 @@ static int sprd_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, } } -if (state->period != cstate->period || - state->duty_cycle != cstate->duty_cycle) { - ret =sprd_pwm_config (spc, pwm, state->duty_cycle, - state->period); -if (ret) -return ret; - } + ret =sprd_pwm_config (spc, pwm, state->duty_cycle, + state->period); +if (ret) +return ret;sprd_pwm_write (spc, pwm->hwpwm,SPRD_PWM_ENABLE ,1 ); }else if (cstate->enabled) {
drivers/regulator/hi6421-regulator.c +17 -13
@@ -366,9 +366,8 @@ static struct hi6421_regulator_infostatic int hi6421_regulator_enable (struct regulator_dev *rdev) { -struct hi6421_regulator_pdata *pdata; +struct hi6421_regulator_pdata *pdata =rdev_get_drvdata (rdev); - pdata =dev_get_drvdata (rdev->dev.parent);/* hi6421 spec requires regulator enablement must be serialized: * - Because when BUCK, LDO switching from off to on, it will have * a huge instantaneous current; so you can not turn on two or
@@ -385,9 +384,10 @@ static int hi6421_regulator_enable(struct regulator_dev *rdev)static unsigned int hi6421_regulator_ldo_get_mode (struct regulator_dev *rdev) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 reg_val; +struct hi6421_regulator_info *info; +unsigned int reg_val; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)return REGULATOR_MODE_IDLE ;
@@ -397,9 +397,10 @@ static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev)static unsigned int hi6421_regulator_buck_get_mode (struct regulator_dev *rdev) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 reg_val; +struct hi6421_regulator_info *info; +unsigned int reg_val; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)return REGULATOR_MODE_STANDBY ;
@@ -410,9 +411,10 @@ static unsigned int hi6421_regulator_buck_get_mode(struct regulator_dev *rdev)static int hi6421_regulator_ldo_set_mode (struct regulator_dev *rdev,unsigned int mode) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 new_mode; +struct hi6421_regulator_info *info; +unsigned int new_mode; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);switch (mode) {case REGULATOR_MODE_NORMAL : new_mode =0 ;
@@ -434,9 +436,10 @@ static int hi6421_regulator_ldo_set_mode(struct regulator_dev *rdev,static int hi6421_regulator_buck_set_mode (struct regulator_dev *rdev,unsigned int mode) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 new_mode; +struct hi6421_regulator_info *info; +unsigned int new_mode; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);switch (mode) {case REGULATOR_MODE_NORMAL : new_mode =0 ;
@@ -459,7 +462,9 @@ static unsigned int hi6421_regulator_ldo_get_optimum_mode(struct regulator_dev *rdev, int input_uV, int output_uV, int load_uA) { - struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); + struct hi6421_regulator_info *info; + + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);if (load_uA > info->eco_microamp)return REGULATOR_MODE_NORMAL ;
@@ -543,14 +548,13 @@ static int hi6421_regulator_probe(struct platform_device *pdev)if (!pdata)return -ENOMEM ;mutex_init (&pdata->lock); -platform_set_drvdata (pdev, pdata);for (i =0 ; i <ARRAY_SIZE (hi6421_regulator_info); i++) {/* assign per-regulator data */ info = &hi6421_regulator_info[i]; config.dev = pdev->dev.parent; - config.driver_data = info; + config.driver_data = pdata; config.regmap = pmic->regmap; rdev = devm_regulator_register(&pdev->dev, &info->desc,
drivers/scsi/scsi_transport_iscsi.c +34 -56
111 lines not on this page · raw message
drivers/spi/spi-bcm2835.c +7 -5
@@ -84,6 +84,7 @@ MODULE_PARM_DESC(polling_limit_us,* struct bcm2835_spi - BCM2835 SPI controller * @regs: base address of register map * @clk: core clock, divided to calculate serial clock +* @clk_hz: core clock cached speed * @irq: interrupt, signals TX FIFO empty or RX FIFO ¾ full * @tfr: SPI transfer currently processed * @ctlr: SPI controller reverse lookup
@@ -124,6 +125,7 @@ MODULE_PARM_DESC(polling_limit_us,struct bcm2835_spi {void __iomem *regs;struct clk *clk; +unsigned long clk_hz;int irq;struct spi_transfer *tfr;struct spi_controller *ctlr;
@@ -1082,19 +1084,18 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, struct spi_transfer *tfr) {struct bcm2835_spi *bs =spi_controller_get_devdata (ctlr); -unsigned long spi_hz, clk_hz, cdiv; +unsigned long spi_hz, cdiv;unsigned long hz_per_byte, byte_limit;u32 cs = bs->prepare_cs[spi->chip_select];/* set clock */ spi_hz = tfr->speed_hz; - clk_hz =clk_get_rate (bs->clk); -if (spi_hz >= clk_hz /2 ) { +if (spi_hz >= bs->clk_hz /2 ) { cdiv =2 ;/* clk_hz/2 is the fastest we can go */ }else if (spi_hz) {/* CDIV must be a multiple of two */ - cdiv =DIV_ROUND_UP (clk_hz, spi_hz); + cdiv =DIV_ROUND_UP (bs->clk_hz, spi_hz); cdiv += (cdiv %2 );if (cdiv >=65536 )
@@ -1102,7 +1103,7 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, }else { cdiv =0 ;/* 0 is the slowest we can go */ } - tfr->effective_speed_hz = cdiv ? (clk_hz / cdiv) : (clk_hz /65536 ); + tfr->effective_speed_hz = cdiv ? (bs->clk_hz / cdiv) : (bs->clk_hz /65536 );bcm2835_wr (bs,BCM2835_SPI_CLK , cdiv);/* handle all the 3-wire mode */
@@ -1318,6 +1319,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)return bs->irq ? bs->irq : -ENODEV ;clk_prepare_enable (bs->clk); + bs->clk_hz =clk_get_rate (bs->clk); err =bcm2835_dma_init (ctlr, &pdev->dev, bs);if (err)
drivers/spi/spi-cadence.c +9 -5
@@ -517,6 +517,12 @@ static int cdns_spi_probe(struct platform_device *pdev) goto clk_dis_apb; } +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_autosuspend_delay (&pdev->dev,SPI_AUTOSUSPEND_TIMEOUT ); +pm_runtime_get_noresume (&pdev->dev); +pm_runtime_set_active (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ret =of_property_read_u32 (pdev->dev.of_node,"num-cs" , &num_cs);if (ret <0 ) master->num_chipselect =CDNS_SPI_DEFAULT_NUM_CS ;
@@ -531,11 +537,6 @@ static int cdns_spi_probe(struct platform_device *pdev)/* SPI controller initializations */ cdns_spi_init_hw (xspi); -pm_runtime_set_active (&pdev->dev); -pm_runtime_enable (&pdev->dev); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_autosuspend_delay (&pdev->dev,SPI_AUTOSUSPEND_TIMEOUT ); - irq =platform_get_irq (pdev,0 );if (irq <=0 ) { ret = -ENXIO ;
@@ -566,6 +567,9 @@ static int cdns_spi_probe(struct platform_device *pdev) master->bits_per_word_mask =SPI_BPW_MASK (8 ); +pm_runtime_mark_last_busy (&pdev->dev); +pm_runtime_put_autosuspend (&pdev->dev); + ret =spi_register_master (master);if (ret) {dev_err (&pdev->dev,"spi_register_master failed\n" );
drivers/spi/spi-imx.c +21 -16
@@ -66,8 +66,7 @@ struct spi_imx_data;struct spi_imx_devtype_data {void (*intctrl)(struct spi_imx_data *,int );int (*prepare_message)(struct spi_imx_data *,struct spi_message *); -int (*prepare_transfer)(struct spi_imx_data *,struct spi_device *, -struct spi_transfer *); +int (*prepare_transfer)(struct spi_imx_data *,struct spi_device *);void (*trigger)(struct spi_imx_data *);int (*rx_available)(struct spi_imx_data *);void (*reset)(struct spi_imx_data *);
@@ -572,11 +571,10 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx, }static int mx51_ecspi_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {u32 ctrl =readl (spi_imx->base +MX51_ECSPI_CTRL ); -u32 clk = t->speed_hz, delay; +u32 clk, delay;/* Clear BL field and set the right value */ ctrl &= ~MX51_ECSPI_CTRL_BL_MASK ;
@@ -590,7 +588,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,/* set clock speed */ ctrl &= ~(0xf <<MX51_ECSPI_CTRL_POSTDIV_OFFSET |0xf <<MX51_ECSPI_CTRL_PREDIV_OFFSET ); - ctrl |=mx51_ecspi_clkdiv (spi_imx, t->speed_hz, &clk); + ctrl |=mx51_ecspi_clkdiv (spi_imx, spi_imx->spi_bus_clk, &clk); spi_imx->spi_bus_clk = clk;if (spi_imx->usedma)
@@ -702,13 +700,12 @@ static int mx31_prepare_message(struct spi_imx_data *spi_imx, }static int mx31_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {unsigned int reg =MX31_CSPICTRL_ENABLE |MX31_CSPICTRL_MASTER ;unsigned int clk; - reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, t->speed_hz, &clk) << + reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, spi_imx->spi_bus_clk, &clk) <<MX31_CSPICTRL_DR_SHIFT ; spi_imx->spi_bus_clk = clk;
@@ -807,14 +804,13 @@ static int mx21_prepare_message(struct spi_imx_data *spi_imx, }static int mx21_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {unsigned int reg =MX21_CSPICTRL_ENABLE |MX21_CSPICTRL_MASTER ;unsigned int max =is_imx27_cspi (spi_imx) ?16 :18 ;unsigned int clk; - reg |=spi_imx_clkdiv_1 (spi_imx->spi_clk, t->speed_hz, max, &clk) + reg |=spi_imx_clkdiv_1 (spi_imx->spi_clk, spi_imx->spi_bus_clk, max, &clk) <<MX21_CSPICTRL_DR_SHIFT ; spi_imx->spi_bus_clk = clk;
@@ -883,13 +879,12 @@ static int mx1_prepare_message(struct spi_imx_data *spi_imx, }static int mx1_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {unsigned int reg =MX1_CSPICTRL_ENABLE |MX1_CSPICTRL_MASTER ;unsigned int clk; - reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, t->speed_hz, &clk) << + reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, spi_imx->spi_bus_clk, &clk) <<MX1_CSPICTRL_DR_SHIFT ; spi_imx->spi_bus_clk = clk;
@@ -1195,6 +1190,16 @@ static int spi_imx_setupxfer(struct spi_device *spi,if (!t)return 0 ; +if (!t->speed_hz) { +if (!spi->max_speed_hz) { +dev_err (&spi->dev,"no speed_hz provided!\n" ); +return -EINVAL ; + } +dev_dbg (&spi->dev,"using spi->max_speed_hz!\n" ); + spi_imx->spi_bus_clk = spi->max_speed_hz; + }else + spi_imx->spi_bus_clk = t->speed_hz; + spi_imx->bits_per_word = t->bits_per_word;/*
@@ -1236,7 +1241,7 @@ static int spi_imx_setupxfer(struct spi_device *spi, spi_imx->slave_burst = t->len; } - spi_imx->devtype_data->prepare_transfer (spi_imx, spi, t); + spi_imx->devtype_data->prepare_transfer (spi_imx, spi);return 0 ; }
drivers/spi/spi-mt65xx.c +13 -3
@@ -434,13 +434,23 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,mtk_spi_setup_packet (master); cnt = xfer->len /4 ; -iowrite32_rep (mdata->base +SPI_TX_DATA_REG , xfer->tx_buf, cnt); +if (xfer->tx_buf) +iowrite32_rep (mdata->base +SPI_TX_DATA_REG , xfer->tx_buf, cnt); + +if (xfer->rx_buf) +ioread32_rep (mdata->base +SPI_RX_DATA_REG , xfer->rx_buf, cnt); remainder = xfer->len %4 ;if (remainder >0 ) { reg_val =0 ; -memcpy (®_val, xfer->tx_buf + (cnt *4 ), remainder); -writel (reg_val, mdata->base +SPI_TX_DATA_REG ); +if (xfer->tx_buf) { +memcpy (®_val, xfer->tx_buf + (cnt *4 ), remainder); +writel (reg_val, mdata->base +SPI_TX_DATA_REG ); + } +if (xfer->rx_buf) { + reg_val =readl (mdata->base +SPI_RX_DATA_REG ); +memcpy (xfer->rx_buf + (cnt *4 ), ®_val, remainder); + } }mtk_spi_enable_transfer (master);
drivers/spi/spi-stm32.c +8 -1
@@ -1946,6 +1946,7 @@ static int stm32_spi_probe(struct platform_device *pdev) master->can_dma = stm32_spi_can_dma;pm_runtime_set_active (&pdev->dev); +pm_runtime_get_noresume (&pdev->dev);pm_runtime_enable (&pdev->dev); ret =spi_register_master (master);
@@ -1967,6 +1968,8 @@ static int stm32_spi_probe(struct platform_device *pdev) err_pm_disable:pm_runtime_disable (&pdev->dev); +pm_runtime_put_noidle (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev); err_dma_release:if (spi->dma_tx)dma_release_channel (spi->dma_tx);
@@ -1983,9 +1986,14 @@ static int stm32_spi_remove(struct platform_device *pdev)struct spi_master *master =platform_get_drvdata (pdev);struct stm32_spi *spi =spi_master_get_devdata (master); +pm_runtime_get_sync (&pdev->dev); +spi_unregister_master (master); spi->cfg->disable (spi); +pm_runtime_disable (&pdev->dev); +pm_runtime_put_noidle (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev);if (master->dma_tx)dma_release_channel (master->dma_tx);if (master->dma_rx)
@@ -1993,7 +2001,6 @@ static int stm32_spi_remove(struct platform_device *pdev)clk_disable_unprepare (spi->clk); -pm_runtime_disable (&pdev->dev);pinctrl_pm_select_sleep_state (&pdev->dev);
drivers/target/target_core_sbc.c +17 -18
@@ -25,7 +25,7 @@#include "target_core_alua.h" static sense_reason_t -sbc_check_prot (struct se_device *,struct se_cmd *,unsigned char *,u32 ,bool ); +sbc_check_prot (struct se_device *,struct se_cmd *,unsigned char ,u32 ,bool );static sense_reason_t sbc_execute_unmap (struct se_cmd *cmd); static sense_reason_t
@@ -279,14 +279,14 @@ static inline unsigned long long transport_lba_64_ext(unsigned char *cdb) }static sense_reason_t -sbc_setup_write_same (struct se_cmd *cmd,unsigned char *flags,struct sbc_ops *ops) +sbc_setup_write_same (struct se_cmd *cmd,unsigned char flags,struct sbc_ops *ops) {struct se_device *dev = cmd->se_dev;sector_t end_lba = dev->transport->get_blocks (dev) +1 ;unsigned int sectors =sbc_get_write_same_sectors (cmd);sense_reason_t ret; -if ((flags[0 ] &0x04 ) || (flags[0 ] &0x02 )) { +if ((flags &0x04 ) || (flags &0x02 )) {pr_err ("WRITE_SAME PBDATA and LBDATA" " bits not supported for Block Discard" " Emulation\n" );
@@ -308,7 +308,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o }/* We always have ANC_SUP == 0 so setting ANCHOR is always an error */ -if (flags[0 ] &0x10 ) { +if (flags &0x10 ) {pr_warn ("WRITE SAME with ANCHOR not supported\n" );return TCM_INVALID_CDB_FIELD ; }
@@ -316,7 +316,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o* Special case for WRITE_SAME w/ UNMAP=1 that ends up getting * translated into block discard requests within backend code. */ -if (flags[0 ] &0x08 ) { +if (flags &0x08 ) {if (!ops->execute_unmap)return TCM_UNSUPPORTED_SCSI_OPCODE ;
@@ -331,7 +331,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *oif (!ops->execute_write_same)return TCM_UNSUPPORTED_SCSI_OPCODE ; - ret =sbc_check_prot (dev, cmd, &cmd->t_task_cdb[0 ], sectors, true); + ret =sbc_check_prot (dev, cmd, flags >>5 , sectors, true);if (ret)return ret;
@@ -686,10 +686,9 @@ sbc_set_prot_op_checks(u8 protect, bool fabric_prot, enum target_prot_type prot_ }static sense_reason_t -sbc_check_prot (struct se_device *dev,struct se_cmd *cmd,unsigned char *cdb, +sbc_check_prot (struct se_device *dev,struct se_cmd *cmd,unsigned char protect,u32 sectors,bool is_write) { -u8 protect = cdb[1 ] >>5 ;int sp_ops = cmd->se_sess->sup_prot_ops;int pi_prot_type = dev->dev_attrib.pi_prot_type;bool fabric_prot = false;
@@ -737,7 +736,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb, fallthrough;default :pr_err ("Unable to determine pi_prot_type for CDB: 0x%02x " -"PROTECT: 0x%02x\n" , cdb[0 ], protect); +"PROTECT: 0x%02x\n" , cmd->t_task_cdb[0 ], protect);return TCM_INVALID_CDB_FIELD ; }
@@ -812,7 +811,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -826,7 +825,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -840,7 +839,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -861,7 +860,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -875,7 +874,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -890,7 +889,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -949,7 +948,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) size =sbc_get_size (cmd,1 ); cmd->t_task_lba =get_unaligned_be64 (&cdb[12 ]); - ret =sbc_setup_write_same (cmd, &cdb[10 ], ops); + ret =sbc_setup_write_same (cmd, cdb[10 ], ops);if (ret)return ret;break ;
@@ -1048,7 +1047,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) size =sbc_get_size (cmd,1 ); cmd->t_task_lba =get_unaligned_be64 (&cdb[2 ]); - ret =sbc_setup_write_same (cmd, &cdb[1 ], ops); + ret =sbc_setup_write_same (cmd, cdb[1 ], ops);if (ret)return ret;break ;
@@ -1066,7 +1065,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)* Follow sbcr26 with WRITE_SAME (10) and check for the existence * of byte 1 bit 3 UNMAP instead of original reserved field */ - ret =sbc_setup_write_same (cmd, &cdb[1 ], ops); + ret =sbc_setup_write_same (cmd, cdb[1 ], ops);if (ret)return ret;break ;
drivers/usb/core/hub.c +84 -36
159 lines not on this page · raw message
drivers/usb/core/quirks.c +0 -4
@@ -502,10 +502,6 @@ static const struct usb_device_id usb_quirk_list[] = {/* DJI CineSSD */ { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, - /* Fibocom L850-GL LTE Modem */ - { USB_DEVICE(0x2cb7, 0x0007), .driver_info = - USB_QUIRK_IGNORE_REMOTE_WAKEUP }, - /* INTEL VALUE SSD */ { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
drivers/usb/dwc2/gadget.c +27 -4
@@ -2749,12 +2749,14 @@ static void dwc2_hsotg_complete_in(struct dwc2_hsotg *hsotg,return ; } -/* Zlp for all endpoints, for ep0 only in DATA IN stage */ +/* Zlp for all endpoints in non DDMA, for ep0 only in DATA IN stage */ if (hs_ep->send_zlp) { -dwc2_hsotg_program_zlp (hsotg, hs_ep); hs_ep->send_zlp =0 ; -/* transfer will be completed on next complete interrupt */ -return ; +if (!using_desc_dma (hsotg)) { +dwc2_hsotg_program_zlp (hsotg, hs_ep); +/* transfer will be completed on next complete interrupt */ +return ; + } }if (hs_ep->index ==0 && hsotg->ep0_state ==DWC2_EP0_DATA_IN ) {
@@ -3900,9 +3902,27 @@ static void dwc2_hsotg_ep_stop_xfr(struct dwc2_hsotg *hsotg, __func__); } }else { +/* Mask GINTSTS_GOUTNAKEFF interrupt */ +dwc2_hsotg_disable_gsint (hsotg,GINTSTS_GOUTNAKEFF ); +if (!(dwc2_readl (hsotg,GINTSTS ) &GINTSTS_GOUTNAKEFF ))dwc2_set_bit (hsotg,DCTL ,DCTL_SGOUTNAK ); +if (!using_dma (hsotg)) { +/* Wait for GINTSTS_RXFLVL interrupt */ +if (dwc2_hsotg_wait_bit_set (hsotg,GINTSTS , +GINTSTS_RXFLVL ,100 )) { +dev_warn (hsotg->dev,"%s: timeout GINTSTS.RXFLVL\n" , + __func__); + }else { +/* +* Pop GLOBAL OUT NAK status packet from RxFIFO +* to assert GOUTNAKEFF interrupt +*/ +dwc2_readl (hsotg,GRXSTSP ); + } + } +/* Wait for global nak to take effect */ if (dwc2_hsotg_wait_bit_set (hsotg,GINTSTS ,GINTSTS_GOUTNAKEFF ,100 ))
@@ -4348,6 +4368,9 @@ static int dwc2_hsotg_ep_sethalt(struct usb_ep *ep, int value, bool now) epctl =dwc2_readl (hs, epreg);if (value) { +/* Unmask GOUTNAKEFF interrupt */ +dwc2_hsotg_en_gsint (hs,GINTSTS_GOUTNAKEFF ); +if (!(dwc2_readl (hs,GINTSTS ) &GINTSTS_GOUTNAKEFF ))dwc2_set_bit (hs,DCTL ,DCTL_SGOUTNAK );// STALL bit will be set in GOUTNAKEFF interrupt handler
drivers/usb/gadget/udc/tegra-xudc.c +1 -0
@@ -3861,6 +3861,7 @@ static int tegra_xudc_probe(struct platform_device *pdev)return 0 ; free_eps: +pm_runtime_disable (&pdev->dev);tegra_xudc_free_eps (xudc); free_event_ring:tegra_xudc_free_event_ring (xudc);
drivers/usb/host/ehci-hcd.c +14 -4
@@ -703,7 +703,8 @@ EXPORT_SYMBOL_GPL(ehci_setup);static irqreturn_t ehci_irq (struct usb_hcd *hcd) {struct ehci_hcd *ehci =hcd_to_ehci (hcd); -u32 status, masked_status, pcd_status =0 , cmd; +u32 status, current_status, masked_status, pcd_status =0 ; +u32 cmd;int bh;unsigned long flags;
@@ -715,19 +716,22 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)*/ spin_lock_irqsave (&ehci->lock, flags); - status =ehci_readl (ehci, &ehci->regs->status); + status =0 ; + current_status =ehci_readl (ehci, &ehci->regs->status); +restart:/* e.g. cardbus physical eject */ -if (status == ~(u32 )0 ) { +if (current_status == ~(u32 )0 ) {ehci_dbg (ehci,"device removed\n" ); goto dead; } + status |= current_status;/* * We don't use STS_FLR, but some controllers don't like it to * remain on, so mask it out along with the other status bits. */ - masked_status = status & (INTR_MASK |STS_FLR ); + masked_status = current_status & (INTR_MASK |STS_FLR );/* Shared IRQ? */ if (!masked_status ||unlikely (ehci->rh_state ==EHCI_RH_HALTED )) {
@@ -737,6 +741,12 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)/* clear (just) interrupts */ ehci_writel (ehci, masked_status, &ehci->regs->status); + +/* For edge interrupts, don't race with an interrupt bit being raised */ + current_status =ehci_readl (ehci, &ehci->regs->status); +if (current_status &INTR_MASK ) + goto restart; + cmd =ehci_readl (ehci, &ehci->regs->command); bh =0 ;
drivers/usb/host/max3421-hcd.c +14 -30
95 lines not on this page · raw message
drivers/usb/host/xhci-hub.c +2 -1
@@ -1552,11 +1552,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)* Inform the usbcore about resume-in-progress by returning * a non-zero value even if there are no status changes. */ +spin_lock_irqsave (&xhci->lock, flags); + status = bus_state->resuming_ports; mask =PORT_CSC |PORT_PEC |PORT_OCC |PORT_PLC |PORT_WRC |PORT_CEC ; -spin_lock_irqsave (&xhci->lock, flags);/* For each port, did anything change? If so, set that bit in buf. */ for (i =0 ; i < max_ports; i++) { temp =readl (ports[i]->addr);
drivers/usb/host/xhci-pci-renesas.c +8 -8
@@ -207,8 +207,7 @@ static int renesas_check_rom_state(struct pci_dev *pdev)return 0 ;case RENESAS_ROM_STATUS_NO_RESULT :/* No result yet */ -dev_dbg (&pdev->dev,"Unknown ROM status ...\n" ); -break ; +return 0 ;case RENESAS_ROM_STATUS_ERROR :/* Error State */ default :/* All other states are marked as "Reserved states" */
@@ -225,12 +224,13 @@ static int renesas_fw_check_running(struct pci_dev *pdev)u8 fw_state;int err; -/* -* Only if device has ROM and loaded FW we can skip loading and -* return success. Otherwise (even unknown state), attempt to load FW. -*/ -if (renesas_check_rom (pdev) && !renesas_check_rom_state (pdev)) -return 0 ; +/* Check if device has ROM and loaded, if so skip everything */ + err =renesas_check_rom (pdev); +if (err) {/* we have rom */ + err =renesas_check_rom_state (pdev); +if (!err) +return err; + }/* * Test if the device is actually needing the firmware. As most
drivers/usb/host/xhci-pci.c +7 -0
@@ -631,7 +631,14 @@ static const struct pci_device_id pci_ids[] = { {/* end: all zeroes */ } };MODULE_DEVICE_TABLE (pci, pci_ids); + +/* +* Without CONFIG_USB_XHCI_PCI_RENESAS renesas_xhci_check_request_fw() won't +* load firmware, so don't encumber the xhci-pci driver with it. +*/ +#if IS_ENABLED (CONFIG_USB_XHCI_PCI_RENESAS )MODULE_FIRMWARE ("renesas_usb_fw.mem" ); +#endif /* pci driver glue; this is a "new style" PCI driver module */ static struct pci_driver xhci_pci_driver = {
drivers/usb/host/xhci-ring.c +45 -13
118 lines not on this page · raw message
drivers/usb/host/xhci.h +2 -1
@@ -993,6 +993,7 @@ struct xhci_interval_bw_table {unsigned int ss_bw_out; }; +#define EP_CTX_PER_DEV 31struct xhci_virt_device {struct usb_device *udev;
@@ -1007,7 +1008,7 @@ struct xhci_virt_device {struct xhci_container_ctx *out_ctx;/* Used for addressing devices and configuration changes */ struct xhci_container_ctx *in_ctx; -struct xhci_virt_ep eps[31 ]; +struct xhci_virt_ep eps[EP_CTX_PER_DEV ];u8 fake_port;u8 real_port;struct xhci_interval_bw_table *bw_table;
drivers/usb/renesas_usbhs/fifo.c +7 -0
@@ -101,6 +101,8 @@ static struct dma_chan *usbhsf_dma_chan_get(struct usbhs_fifo *fifo,#define usbhsf_dma_map (p) __usbhsf_dma_map_ctrl(p, 1)#define usbhsf_dma_unmap (p) __usbhsf_dma_map_ctrl(p, 0)static int __usbhsf_dma_map_ctrl (struct usbhs_pkt *pkt,int map); +static void usbhsf_tx_irq_ctrl (struct usbhs_pipe *pipe,int enable); +static void usbhsf_rx_irq_ctrl (struct usbhs_pipe *pipe,int enable);struct usbhs_pkt *usbhs_pkt_pop (struct usbhs_pipe *pipe,struct usbhs_pkt *pkt) {struct usbhs_priv *priv =usbhs_pipe_to_priv (pipe);
@@ -123,6 +125,11 @@ struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt)if (chan) {dmaengine_terminate_all (chan);usbhsf_dma_unmap (pkt); + }else { +if (usbhs_pipe_is_dir_in (pipe)) +usbhsf_rx_irq_ctrl (pipe,0 ); +else +usbhsf_tx_irq_ctrl (pipe,0 ); }usbhs_pipe_clear_without_sequence (pipe,0 ,0 );
drivers/usb/serial/cp210x.c +3 -2
@@ -159,6 +159,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor Bridge Controller */ { USB_DEVICE(0x10C4, 0x89FB) }, /* Qivicon ZigBee USB Radio Stick */ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ + { USB_DEVICE(0x10C4, 0x8A5B) }, /* CEL EM3588 ZigBee USB Stick */ { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */ { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */ { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
@@ -206,8 +207,8 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ { USB_DEVICE(0x1901, 0x0195) }, /* GE B850/B650/B450 CP2104 DP UART interface */ { USB_DEVICE(0x1901, 0x0196) }, /* GE B850 CP2105 DP UART interface */ - { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 Display serial interface */ - { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 M.2 Key E serial interface */ + { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 M.2 Key E serial interface */ + { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 Display serial interface */ { USB_DEVICE(0x199B, 0xBA30) }, /* LORD WSDA-200-USB */ { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
drivers/usb/serial/option.c +3 -0
@@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb);#define QUECTEL_PRODUCT_UC15 0x9090/* These u-blox products use Qualcomm's vendor ID */ #define UBLOX_PRODUCT_R410M 0x90b2 +#define UBLOX_PRODUCT_R6XX 0x90fa/* These Yuga products use Qualcomm's vendor ID */ #define YUGA_PRODUCT_CLM920_NC5 0x9625
@@ -1101,6 +1102,8 @@ static const struct usb_device_id option_ids[] = {/* u-blox products using Qualcomm vendor ID */ { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M), .driver_info = RSVD(1) | RSVD(3) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX), + .driver_info = RSVD(3) }, /* Quectel products using Quectel vendor ID */ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff), .driver_info = NUMEP2 },
drivers/usb/storage/unusual_uas.h +7 -0
@@ -45,6 +45,13 @@ UNUSUAL_DEV(0x059f, 0x105f, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME), +/* Reported-by: Julian Sikorski <[email protected]> */ +UNUSUAL_DEV (0x059f ,0x1061 ,0x0000 ,0x9999 , +"LaCie" , +"Rugged USB3-FW" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , + US_FL_IGNORE_UAS), +/* * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI * commands in UAS mode. Observed with the 1.28 firmware; are there others?
drivers/usb/typec/stusb160x.c +7 -4
@@ -739,10 +739,6 @@ static int stusb160x_probe(struct i2c_client *client)typec_set_pwr_opmode (chip->port, chip->pwr_opmode);if (client->irq) { - ret =stusb160x_irq_init (chip, client->irq); -if (ret) - goto port_unregister; - chip->role_sw =fwnode_usb_role_switch_get (fwnode);if (IS_ERR (chip->role_sw)) { ret =PTR_ERR (chip->role_sw);
@@ -752,6 +748,10 @@ static int stusb160x_probe(struct i2c_client *client) ret); goto port_unregister; } + + ret =stusb160x_irq_init (chip, client->irq); +if (ret) + goto role_sw_put; }else {/* * If Source or Dual power role, need to enable VDD supply
@@ -775,6 +775,9 @@ static int stusb160x_probe(struct i2c_client *client)return 0 ; +role_sw_put: +if (chip->role_sw) +usb_role_switch_put (chip->role_sw); port_unregister:typec_unregister_port (chip->port); all_reg_disable:
fs/afs/cmservice.c +7 -18
@@ -29,16 +29,11 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *);static int afs_deliver_yfs_cb_callback (struct afs_call *); -#define CM_NAME (name) \ - char afs_SRXCB##name##_name[] __tracepoint_string = \ - "CB." #name -/* * CB.CallBack operation type */ -static CM_NAME (CallBack);static const struct afs_call_type afs_SRXCBCallBack = { - .name = afs_SRXCBCallBack_name, + .name ="CB.CallBack" , .deliver = afs_deliver_cb_callback, .destructor = afs_cm_destructor, .work = SRXAFSCB_CallBack,
@@ -47,9 +42,8 @@ static const struct afs_call_type afs_SRXCBCallBack = {/* * CB.InitCallBackState operation type */ -static CM_NAME (InitCallBackState);static const struct afs_call_type afs_SRXCBInitCallBackState = { - .name = afs_SRXCBInitCallBackState_name, + .name ="CB.InitCallBackState" , .deliver = afs_deliver_cb_init_call_back_state, .destructor = afs_cm_destructor, .work = SRXAFSCB_InitCallBackState,
@@ -58,9 +52,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState = {/* * CB.InitCallBackState3 operation type */ -static CM_NAME (InitCallBackState3);static const struct afs_call_type afs_SRXCBInitCallBackState3 = { - .name = afs_SRXCBInitCallBackState3_name, + .name ="CB.InitCallBackState3" , .deliver = afs_deliver_cb_init_call_back_state3, .destructor = afs_cm_destructor, .work = SRXAFSCB_InitCallBackState,
@@ -69,9 +62,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState3 = {/* * CB.Probe operation type */ -static CM_NAME (Probe);static const struct afs_call_type afs_SRXCBProbe = { - .name = afs_SRXCBProbe_name, + .name ="CB.Probe" , .deliver = afs_deliver_cb_probe, .destructor = afs_cm_destructor, .work = SRXAFSCB_Probe,
@@ -80,9 +72,8 @@ static const struct afs_call_type afs_SRXCBProbe = {/* * CB.ProbeUuid operation type */ -static CM_NAME (ProbeUuid);static const struct afs_call_type afs_SRXCBProbeUuid = { - .name = afs_SRXCBProbeUuid_name, + .name ="CB.ProbeUuid" , .deliver = afs_deliver_cb_probe_uuid, .destructor = afs_cm_destructor, .work = SRXAFSCB_ProbeUuid,
@@ -91,9 +82,8 @@ static const struct afs_call_type afs_SRXCBProbeUuid = {/* * CB.TellMeAboutYourself operation type */ -static CM_NAME (TellMeAboutYourself);static const struct afs_call_type afs_SRXCBTellMeAboutYourself = { - .name = afs_SRXCBTellMeAboutYourself_name, + .name ="CB.TellMeAboutYourself" , .deliver = afs_deliver_cb_tell_me_about_yourself, .destructor = afs_cm_destructor, .work = SRXAFSCB_TellMeAboutYourself,
@@ -102,9 +92,8 @@ static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {/* * YFS CB.CallBack operation type */ -static CM_NAME (YFS_CallBack);static const struct afs_call_type afs_SRXYFSCB_CallBack = { - .name = afs_SRXCBYFS_CallBack_name, + .name ="YFSCB.CallBack" , .deliver = afs_deliver_yfs_cb_callback, .destructor = afs_cm_destructor, .work = SRXAFSCB_CallBack,
fs/btrfs/extent-tree.c +3 -0
@@ -5883,6 +5883,9 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)mutex_lock (&fs_info->fs_devices->device_list_mutex); devices = &fs_info->fs_devices->devices;list_for_each_entry (device, devices, dev_list) { +if (test_bit (BTRFS_DEV_STATE_MISSING , &device->dev_state)) +continue ; + ret =btrfs_trim_free_extents (device, &group_trimmed);if (ret) { dev_failed++;
fs/ceph/mds_client.c +1 -1
@@ -4401,7 +4401,7 @@ bool check_session_state(struct ceph_mds_session *s)break ;case CEPH_MDS_SESSION_CLOSING :/* Should never reach this when we're unmounting */ -WARN_ON_ONCE (true); +WARN_ON_ONCE (s->s_ttl); fallthrough;case CEPH_MDS_SESSION_NEW :case CEPH_MDS_SESSION_RESTARTING :
fs/cifs/smb2ops.c +37 -12
74 lines not on this page · raw message
fs/hugetlbfs/inode.c +1 -1
@@ -77,7 +77,7 @@ enum hugetlb_param {static const struct fs_parameter_spec hugetlb_fs_parameters[] = {fsparam_u32 ("gid" , Opt_gid),fsparam_string ("min_size" , Opt_min_size), -fsparam_u32 ("mode" , Opt_mode), +fsparam_u32oct ("mode" , Opt_mode),fsparam_string ("nr_inodes" , Opt_nr_inodes),fsparam_string ("pagesize" , Opt_pagesize),fsparam_string ("size" , Opt_size),
fs/io_uring.c +12 -6
@@ -4916,6 +4916,7 @@ static int io_connect(struct io_kiocb *req, bool force_nonblock,struct io_poll_table {struct poll_table_struct pt;struct io_kiocb *req; +int nr_entries;int error; };
@@ -5098,11 +5099,11 @@ static void __io_queue_proc(struct io_poll_iocb *poll, struct io_poll_table *pt,struct io_kiocb *req = pt->req;/* -* If poll->head is already set, it's because the file being polled -* uses multiple waitqueues for poll handling (eg one for read, one -* for write). Setup a separate io_poll_iocb if this happens. +* The file being polled uses multiple waitqueues for poll handling +* (e.g. one for read, one for write). Setup a separate io_poll_iocb +* if this happens. */ -if (unlikely (poll->head)) { +if (unlikely (pt->nr_entries)) {struct io_poll_iocb *poll_one = poll;/* already have a 2nd entry, fail a third attempt */
@@ -5124,7 +5125,7 @@ static void __io_queue_proc(struct io_poll_iocb *poll, struct io_poll_table *pt, *poll_ptr = poll; } - pt->error =0 ; + pt->nr_entries++; poll->head = head;if (poll->events &EPOLLEXCLUSIVE )
@@ -5210,11 +5211,16 @@ static __poll_t __io_arm_poll_handler(struct io_kiocb *req, ipt->pt._key = mask; ipt->req = req; - ipt->error = -EINVAL ; + ipt->error =0 ; + ipt->nr_entries =0 ; mask =vfs_poll (req->file, &ipt->pt) & poll->events; +if (unlikely (!ipt->nr_entries) && !ipt->error) + ipt->error = -EINVAL ;spin_lock_irq (&ctx->completion_lock); +if (ipt->error) +io_poll_remove_double (req);if (likely (poll->head)) {spin_lock (&poll->head->lock);if (unlikely (list_empty (&poll->wait.entry))) {
fs/proc/base.c +1 -1
@@ -855,7 +855,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf, flags =FOLL_FORCE | (write ?FOLL_WRITE :0 );while (count >0 ) { -int this_len =min_t (int, count,PAGE_SIZE ); +size_t this_len =min_t (size_t, count,PAGE_SIZE );if (write &©_from_user (page, buf, this_len)) { copied = -EFAULT ;
fs/userfaultfd.c +11 -13
@@ -1228,23 +1228,21 @@ static __always_inline void wake_userfault(struct userfaultfd_ctx *ctx, } static __always_inline int validate_range(struct mm_struct *mm, -__u64 *start,__u64 len) +__u64 start,__u64 len) {__u64 task_size = mm->task_size; - *start =untagged_addr (*start); - -if (*start & ~PAGE_MASK ) +if (start & ~PAGE_MASK )return -EINVAL ;if (len & ~PAGE_MASK )return -EINVAL ;if (!len)return -EINVAL ; -if (*start < mmap_min_addr) +if (start < mmap_min_addr)return -EINVAL ; -if (*start >= task_size) +if (start >= task_size)return -EINVAL ; -if (len > task_size - *start) +if (len > task_size - start)return -EINVAL ;return 0 ; }
@@ -1290,7 +1288,7 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx,if (uffdio_register.mode &UFFDIO_REGISTER_MODE_WP ) vm_flags |=VM_UFFD_WP ; - ret =validate_range (mm, &uffdio_register.range.start, + ret =validate_range (mm, uffdio_register.range.start, uffdio_register.range.len);if (ret) goto out;
@@ -1490,7 +1488,7 @@ static int userfaultfd_unregister(struct userfaultfd_ctx *ctx,if (copy_from_user (&uffdio_unregister, buf,sizeof (uffdio_unregister))) goto out; - ret =validate_range (mm, &uffdio_unregister.start, + ret =validate_range (mm, uffdio_unregister.start, uffdio_unregister.len);if (ret) goto out;
@@ -1639,7 +1637,7 @@ static int userfaultfd_wake(struct userfaultfd_ctx *ctx,if (copy_from_user (&uffdio_wake, buf,sizeof (uffdio_wake))) goto out; - ret =validate_range (ctx->mm, &uffdio_wake.start, uffdio_wake.len); + ret =validate_range (ctx->mm, uffdio_wake.start, uffdio_wake.len);if (ret) goto out;
@@ -1679,7 +1677,7 @@ static int userfaultfd_copy(struct userfaultfd_ctx *ctx, sizeof(uffdio_copy)-sizeof(__s64))) goto out; - ret =validate_range (ctx->mm, &uffdio_copy.dst, uffdio_copy.len); + ret =validate_range (ctx->mm, uffdio_copy.dst, uffdio_copy.len);if (ret) goto out;/*
@@ -1736,7 +1734,7 @@ static int userfaultfd_zeropage(struct userfaultfd_ctx *ctx, sizeof(uffdio_zeropage)-sizeof(__s64))) goto out; - ret =validate_range (ctx->mm, &uffdio_zeropage.range.start, + ret =validate_range (ctx->mm, uffdio_zeropage.range.start, uffdio_zeropage.range.len);if (ret) goto out;
@@ -1786,7 +1784,7 @@ static int userfaultfd_writeprotect(struct userfaultfd_ctx *ctx, sizeof(struct uffdio_writeprotect)))return -EFAULT ; - ret =validate_range (ctx->mm, &uffdio_wp.range.start, + ret =validate_range (ctx->mm, uffdio_wp.range.start, uffdio_wp.range.len);if (ret)return ret;
include/drm/drm_ioctl.h +1 -0
@@ -68,6 +68,7 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, unsigned long arg);#define DRM_IOCTL_NR (n) _IOC_NR(n) +#define DRM_IOCTL_TYPE (n) _IOC_TYPE(n)#define DRM_MAJOR 226/**
include/linux/memblock.h +2 -2
@@ -207,7 +207,7 @@ static inline void __next_physmem_range(u64 *idx, struct memblock_type *type,*/ #define for_each_mem_range (i, p_start, p_end) \ __for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE, \ - MEMBLOCK_NONE, p_start, p_end, NULL) + MEMBLOCK_HOTPLUG, p_start, p_end, NULL)
Lines of this file are not shown. View the raw message.
include/trace/events/afs.h +62 -5
67 lines not on this page · raw message
tools/testing/selftests/net/icmp_redirect.sh +3 -2
Lines of this file are not shown. View the raw message.
tools/testing/selftests/vm/userfaultfd.c +4 -2
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.