Linux 6.6.104
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.6.104 kernel.
All users of the 6.6 kernel series must upgrade.
The updated 6.6.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.6.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/devicetree/bindings/display/msm/qcom,mdp5.yaml | 1 Makefile | 2 arch/mips/boot/dts/lantiq/danube_easy50712.dts | 5 arch/mips/lantiq/xway/sysctrl.c | 10 arch/powerpc/kernel/kvm.c | 8 arch/x86/kernel/cpu/microcode/amd.c | 22 + arch/x86/kvm/lapic.c | 2 arch/x86/kvm/x86.c | 7 drivers/acpi/ec.c | 6 drivers/atm/atmtcp.c | 17 drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c | 4 drivers/gpu/drm/display/drm_dp_helper.c | 2 drivers/gpu/drm/msm/msm_gem_submit.c | 14 drivers/gpu/drm/nouveau/dispnv50/wndw.c | 4 drivers/gpu/drm/nouveau/nvkm/falcon/gm200.c | 15 drivers/hid/hid-asus.c | 8 drivers/hid/hid-ids.h | 3 drivers/hid/hid-input-test.c | 10 drivers/hid/hid-input.c | 51 +- drivers/hid/hid-logitech-dj.c | 4 drivers/hid/hid-logitech-hidpp.c | 2 drivers/hid/hid-mcp2221.c | 71 ++-- drivers/hid/hid-multitouch.c | 8 drivers/hid/hid-ntrig.c | 3 drivers/hid/hid-quirks.c | 2 drivers/hid/wacom_wac.c | 1 drivers/net/ethernet/dlink/dl2k.c | 2 drivers/net/ethernet/intel/ice/ice_txrx.c | 94 +++-- drivers/net/ethernet/intel/ice/ice_txrx.h | 19 - drivers/net/ethernet/intel/ice/ice_txrx_lib.h | 53 --- drivers/net/ethernet/mellanox/mlx5/core/devlink.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c | 3 drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h | 12 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 19 + drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c | 190 +++++++---- drivers/net/ethernet/mellanox/mlx5/core/fw_reset.h | 1 drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c | 87 ++--- drivers/net/ethernet/mellanox/mlx5/core/sf/sf.h | 6 drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 8 drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 13 drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 9 drivers/net/ethernet/stmicro/stmmac/hwif.h | 8 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 12 drivers/net/phy/mscc/mscc.h | 4 drivers/net/phy/mscc/mscc_main.c | 4 drivers/net/phy/mscc/mscc_ptp.c | 34 + drivers/net/usb/qmi_wwan.c | 3 drivers/of/dynamic.c | 29 - drivers/of/of_private.h | 1 drivers/of/overlay.c | 11 drivers/of/unittest.c | 12 drivers/pinctrl/Kconfig | 1 drivers/scsi/scsi_sysfs.c | 4 drivers/vhost/net.c | 9 fs/efivarfs/super.c | 4 fs/erofs/zdata.c | 13 fs/nfs/pagelist.c | 86 ---- fs/nfs/write.c | 146 +++++--- fs/smb/client/cifsfs.c | 14 fs/smb/client/inode.c | 34 + fs/smb/client/smb2inode.c | 7 fs/xfs/libxfs/xfs_attr_remote.c | 7 fs/xfs/libxfs/xfs_da_btree.c | 6 include/linux/atmdev.h | 1 include/linux/mlx5/mlx5_ifc.h | 11 include/linux/nfs_page.h | 2 include/net/bluetooth/hci_sync.h | 2 include/net/rose.h | 18 - kernel/dma/pool.c | 4 kernel/trace/trace.c | 4 net/atm/common.c | 15 net/bluetooth/hci_event.c | 20 + net/bluetooth/hci_sync.c | 6 net/bluetooth/mgmt.c | 5 net/ipv4/route.c | 10 net/rose/af_rose.c | 13 net/rose/rose_in.c | 12 net/rose/rose_route.c | 62 ++- net/rose/rose_timer.c | 2 net/sctp/ipv6.c | 2 sound/soc/codecs/lpass-tx-macro.c | 2 82 files changed, 890 insertions(+), 553 deletions(-)
Aleksander Jan Bajkowski (2):
mips: dts: lantiq: danube: add missing burst length property
mips: lantiq: xway: sysctrl: rename the etop node
Alex Deucher (1):
Revert "drm/amdgpu: fix incorrect vm flags to map bo"
Alexei Lazar (3):
net/mlx5e: Update and set Xon/Xoff upon MTU set net/mlx5e: Update and set Xon/Xoff upon port speed set net/mlx5e: Set local Xoff after FW update
Alexey Klimov (1):
ASoC: codecs: tx-macro: correct tx_macro_component_drv name
Antheas Kapenekakis (1):
HID: quirks: add support for Legion Go dual dinput modes
Borislav Petkov (AMD) (1):
x86/microcode/AMD: Handle the case of no BIOS microcode
Chris Mi (1):
net/mlx5: SF, Fix add port error handling
Christoph Hellwig (1):
nfs: fold nfs_page_group_lock_subrequests into nfs_lock_and_join_requests
Damien Le Moal (1):
scsi: core: sysfs: Correct sysfs attributes access rights
Dan Carpenter (1):
of: dynamic: Fix use after free in of_changeset_add_prop_helper()
Dmitry Baryshkov (1):
dt-bindings: display/msm: qcom,mdp5: drop lut clock
Eric Dumazet (2):
sctp: initialize more fields in sctp_v6_from_sk()
net: rose: fix a typo in rose_clear_routes()
Eric Sandeen (1):
xfs: do not propagate ENODATA disk errors into xattr code
Fabio Porcedda (1):
net: usb: qmi_wwan: add Telit Cinterion LE910C4-WWX new compositions
Greg Kroah-Hartman (1):
Linux 6.6.104
Hamish Martin (2):
HID: mcp2221: Don't set bus speed on every transfer
HID: mcp2221: Handle reads greater than 60 bytes
Horatiu Vultur (1):
phy: mscc: Fix when PTP clock is register and unregister
Imre Deak (1):
Revert "drm/dp: Change AUX DPCD probe address from DPCD_REV to LANE0_1_STATUS"
James Jones (1):
drm/nouveau/disp: Always accept linear modifier
Jiri Pirko (3):
net/mlx5: Call mlx5_sf_id_erase() once in mlx5_sf_dealloc() net/mlx5: Use devlink port pointer to get the pointer of container SF struct net/mlx5: Convert SF port_indices xarray to function_ids xarray
José Expósito (2):
HID: input: rename hidinput_set_battery_charge_status()
HID: input: report battery status changes immediately
Junli Liu (1):
erofs: fix atomic context detection when !CONFIG_DEBUG_LOCK_ALLOC
Kuniyuki Iwashima (1):
atm: atmtcp: Prevent arbitrary write in atmtcp_recv_control().
Larysa Zaremba (1):
ice: Introduce ice_xdp_buff
Li Nan (1):
efivarfs: Fix slab-out-of-bounds in efivarfs_d_compare
Lizhi Hou (1):
of: dynamic: Fix memleak when of_pci_add_properties() failed
Ludovico de Nittis (2):
Bluetooth: hci_event: Treat UNKNOWN_CONN_ID on disconnect as success
Bluetooth: hci_event: Mark connection as closed during suspend disconnect
Luiz Augusto von Dentz (1):
Bluetooth: hci_event: Detect if HCI_EV_NUM_COMP_PKTS is unbalanced
Maciej Fijalkowski (2):
ice: gather page_count()'s of each frag right before XDP prog call
ice: stop storing XDP verdict within ice_rx_buf
Madhavan Srinivasan (1):
powerpc/kvm: Fix ifdef to remove build warning
Matt Coffin (1):
HID: logitech: Add ids for G PRO 2 LIGHTSPEED
Michal Kubiak (1):
ice: fix incorrect counter for buffer allocation failures
Minjong Kim (1):
HID: hid-ntrig: fix unable to handle page fault in ntrig_report_version()
Moshe Shemesh (5):
net/mlx5: Reload auxiliary drivers on fw_activate net/mlx5: Add device cap for supporting hot reset in sync reset flow net/mlx5: Add support for sync reset using hot reset net/mlx5: Fix lockdep assertion on sync reset unload event net/mlx5: Nack sync reset when SFs are present
Nikolay Kuratov (1):
vhost/net: Protect ubufs with rcu read lock in vhost_net_ubuf_put()
Oscar Maes (1):
net: ipv4: fix regression in local-broadcast routes
Paulo Alcantara (2):
smb: client: fix race with concurrent opens in unlink(2)
smb: client: fix race with concurrent opens in rename(2)
Pavel Shpakovskiy (1):
Bluetooth: hci_sync: fix set_local_name race condition
Ping Cheng (1):
HID: wacom: Add a new Art Pen 2
Qasim Ijaz (2):
HID: asus: fix UAF via HID_CLAIMED_INPUT validation
HID: multitouch: fix slab out-of-bounds access in mt_report_fixup()
Randy Dunlap (1):
pinctrl: STMFX: add missing HAS_IOMEM dependency
Rob Clark (1):
drm/msm: Defer fd_install in SUBMIT ioctl
Rob Herring (1):
of: Add a helper to free property struct
Rohan G Thomas (3):
net: stmmac: xgmac: Do not enable RX FIFO Overflow interrupts
net: stmmac: xgmac: Correct supported speed modes
net: stmmac: Set CIC bit only for TX queues with COE
Serge Semin (1):
net: stmmac: Rename phylink_get_caps() callback to update_caps()
Shanker Donthineni (1):
dma/pool: Ensure DMA_DIRECT_REMAP allocations are decrypted
Shuhao Fu (1):
fs/smb: Fix inconsistent refcnt update
Steve French (1):
smb3 client: fix return code mapping of remap_file_range
Takamitsu Iwai (3):
net: rose: split remove and free operations in rose_remove_neigh()
net: rose: convert 'use' field to refcount_t
net: rose: include node references in rose_neigh refcount
Tengda Wu (1):
ftrace: Fix potential warning in trace_printk_seq during ftrace_dump
Thijs Raymakers (1):
KVM: x86: use array_index_nospec with indices that come from guest
Timur Tabi (2):
drm/nouveau: remove unused increment in gm200_flcn_pio_imem_wr drm/nouveau: remove unused memory target test
Trond Myklebust (1):
NFS: Fix a race when updating an existing write
Werner Sembach (1):
ACPI: EC: Add device to acpi_ec_no_wakeup[] qurik list
Yeounsu Moon (1):
net: dlink: fix multicast stats being counted incorrectly
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/display/msm/qcom,mdp5.yaml +0 -1
@@ -59,7 +59,6 @@ properties: - const: bus - const: core - const: vsync - - const: lut - const: tbu - const: tbu_rt # MSM8996 has additional iommu clock
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 6 -SUBLEVEL = 103 +SUBLEVEL = 104 EXTRAVERSION = NAME = Pinguïn Aangedreven
arch/mips/boot/dts/lantiq/danube_easy50712.dts +4 -1
@@ -82,13 +82,16 @@ conf_out { }; }; - etop@e180000 { + ethernet@e180000 { compatible = "lantiq,etop-xway"; reg = <0xe180000 0x40000>; interrupt-parent = <&icu0>; interrupts = <73 78>; + interrupt-names = "tx", "rx"; phy-mode = "rmii"; mac-address = [ 00 11 22 33 44 55 ]; + lantiq,rx-burst-length = <4>; + lantiq,tx-burst-length = <4>; }; stp0: stp@e100bb0 {
arch/mips/lantiq/xway/sysctrl.c +5 -5
@@ -478,7 +478,7 @@ void __init ltq_soc_init(void) ifccr =CGU_IFCCR_VR9 ; pcicr =CGU_PCICR_VR9 ; }else { -clkdev_add_pmu ("1e180000.etop" ,NULL ,1 ,0 ,PMU_PPE ); +clkdev_add_pmu ("1e180000.ethernet" ,NULL ,1 ,0 ,PMU_PPE ); }if (!of_machine_is_compatible ("lantiq,ase" ))
@@ -512,9 +512,9 @@ void __init ltq_soc_init(void) CLOCK_133M, CLOCK_133M);clkdev_add_pmu ("1e101000.usb" ,"otg" ,1 ,0 ,PMU_USB0 );clkdev_add_pmu ("1f203018.usb2-phy" ,"phy" ,1 ,0 ,PMU_USB0_P ); -clkdev_add_pmu ("1e180000.etop" ,"ppe" ,1 ,0 ,PMU_PPE ); -clkdev_add_cgu ("1e180000.etop" ,"ephycgu" ,CGU_EPHY ); -clkdev_add_pmu ("1e180000.etop" ,"ephy" ,1 ,0 ,PMU_EPHY ); +clkdev_add_pmu ("1e180000.ethernet" ,"ppe" ,1 ,0 ,PMU_PPE ); +clkdev_add_cgu ("1e180000.ethernet" ,"ephycgu" ,CGU_EPHY ); +clkdev_add_pmu ("1e180000.ethernet" ,"ephy" ,1 ,0 ,PMU_EPHY );clkdev_add_pmu ("1e103000.sdio" ,NULL ,1 ,0 ,PMU_ASE_SDIO );clkdev_add_pmu ("1e116000.mei" ,"dfe" ,1 ,0 ,PMU_DFE ); }else if (of_machine_is_compatible ("lantiq,grx390" )) {
@@ -573,7 +573,7 @@ void __init ltq_soc_init(void)clkdev_add_pmu ("1e101000.usb" ,"otg" ,1 ,0 ,PMU_USB0 |PMU_AHBM );clkdev_add_pmu ("1f203034.usb2-phy" ,"phy" ,1 ,0 ,PMU_USB1_P );clkdev_add_pmu ("1e106000.usb" ,"otg" ,1 ,0 ,PMU_USB1 |PMU_AHBM ); -clkdev_add_pmu ("1e180000.etop" ,"switch" ,1 ,0 ,PMU_SWITCH ); +clkdev_add_pmu ("1e180000.ethernet" ,"switch" ,1 ,0 ,PMU_SWITCH );clkdev_add_pmu ("1e103000.sdio" ,NULL ,1 ,0 ,PMU_SDIO );clkdev_add_pmu ("1e103100.deu" ,NULL ,1 ,0 ,PMU_DEU );clkdev_add_pmu ("1e116000.mei" ,"dfe" ,1 ,0 ,PMU_DFE );
arch/powerpc/kernel/kvm.c +4 -4
@@ -632,19 +632,19 @@ static void __init kvm_check_ins(u32 *inst, u32 features)#endif } -switch (inst_no_rt & ~KVM_MASK_RB ) {#ifdef CONFIG_PPC_BOOK3S_32 +switch (inst_no_rt & ~KVM_MASK_RB ) {case KVM_INST_MTSRIN :if (features &KVM_MAGIC_FEAT_SR ) {u32 inst_rb = _inst &KVM_MASK_RB ;kvm_patch_ins_mtsrin (inst, inst_rt, inst_rb); }break ; -#endif } +#endif -switch (_inst) {#ifdef CONFIG_BOOKE +switch (_inst) {case KVM_INST_WRTEEI_0 :kvm_patch_ins_wrteei_0 (inst);break ;
@@ -652,8 +652,8 @@ static void __init kvm_check_ins(u32 *inst, u32 features)case KVM_INST_WRTEEI_1 :kvm_patch_ins_wrtee (inst,0 ,1 ); break; -#endif } +#endif }extern u32 kvm_template_start[];
arch/x86/kernel/cpu/microcode/amd.c +20 -2
@@ -161,8 +161,28 @@ static int cmp_id(const void *key, const void *elem)return 1 ; } +static u32 cpuid_to_ucode_rev (unsigned int val) +{ +union zen_patch_rev p = {}; +union cpuid_1_eax c; + + c.full = val; + + p.stepping = c.stepping; + p.model = c.model; + p.ext_model = c.ext_model; + p.ext_fam = c.ext_fam; + +return p.ucode_rev; +} +static bool need_sha_check (u32 cur_rev) { +if (!cur_rev) { + cur_rev =cpuid_to_ucode_rev (bsp_cpuid_1_eax); +pr_info_once ("No current revision, generating the lowest one: 0x%x\n" , cur_rev); + } +switch (cur_rev >>8 ) {case 0x80012 :return cur_rev <=0x800126f ;break ;case 0x80082 :return cur_rev <=0x800820f ;break ;
@@ -744,8 +764,6 @@ static struct ucode_patch *cache_find_patch(struct ucode_cpu_info *uci, u16 equi n.equiv_cpu = equiv_cpu; n.patch_id = uci->cpu_sig.rev; -WARN_ON_ONCE (!n.patch_id); -list_for_each_entry (p, µcode_cache, plist)if (patch_cpus_equivalent (p, &n, false))return p;
arch/x86/kvm/lapic.c +2 -0
@@ -847,6 +847,8 @@ static int __pv_send_ipi(unsigned long *ipi_bitmap, struct kvm_apic_map *map,if (min > map->max_apic_id)return 0 ; + min =array_index_nospec (min, map->max_apic_id +1 ); +for_each_set_bit (i, ipi_bitmap,min ((u32 )BITS_PER_LONG , (map->max_apic_id - min +1 ))) {if (map->phys_map[min + i]) {
arch/x86/kvm/x86.c +5 -2
@@ -9802,8 +9802,11 @@ static void kvm_sched_yield(struct kvm_vcpu *vcpu, unsigned long dest_id)rcu_read_lock (); map =rcu_dereference (vcpu->kvm->arch.apic_map); -if (likely (map) && dest_id <= map->max_apic_id && map->phys_map[dest_id]) - target = map->phys_map[dest_id]->vcpu; +if (likely (map) && dest_id <= map->max_apic_id) { + dest_id =array_index_nospec (dest_id, map->max_apic_id +1 ); +if (map->phys_map[dest_id]) + target = map->phys_map[dest_id]->vcpu; + }rcu_read_unlock ();
drivers/acpi/ec.c +6 -0
@@ -2329,6 +2329,12 @@ static const struct dmi_system_id acpi_ec_no_wakeup[] = { DMI_MATCH(DMI_PRODUCT_NAME, "83Q3"), } }, + { +// TUXEDO InfinityBook Pro AMD Gen9 + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GXxHRXx"), + }, + }, { }, };
drivers/atm/atmtcp.c +14 -3
@@ -279,6 +279,19 @@ static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci)return NULL ; } +static int atmtcp_c_pre_send (struct atm_vcc *vcc,struct sk_buff *skb) +{ +struct atmtcp_hdr *hdr; + +if (skb->len <sizeof (struct atmtcp_hdr )) +return -EINVAL ; + + hdr = (struct atmtcp_hdr *)skb->data; +if (hdr->length ==ATMTCP_HDR_MAGIC ) +return -EINVAL ; + +return 0 ; +}static int atmtcp_c_send (struct atm_vcc *vcc,struct sk_buff *skb) {
@@ -288,9 +301,6 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)struct sk_buff *new_skb;int result =0 ; -if (skb->len <sizeof (struct atmtcp_hdr )) - goto done; - dev = vcc->dev_data; hdr = (struct atmtcp_hdr *) skb->data;if (hdr->length ==ATMTCP_HDR_MAGIC ) {
@@ -347,6 +357,7 @@ static const struct atmdev_ops atmtcp_v_dev_ops = {static const struct atmdev_ops atmtcp_c_dev_ops = { .close = atmtcp_c_close, + .pre_send = atmtcp_c_pre_send, .send = atmtcp_c_send };
drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c +2 -2
@@ -89,8 +89,8 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm, } r =amdgpu_vm_bo_map (adev, *bo_va, csa_addr,0 , size, -AMDGPU_VM_PAGE_READABLE |AMDGPU_VM_PAGE_WRITEABLE | -AMDGPU_VM_PAGE_EXECUTABLE ); +AMDGPU_PTE_READABLE |AMDGPU_PTE_WRITEABLE | +AMDGPU_PTE_EXECUTABLE );if (r) {DRM_ERROR ("failed to do bo_map on static CSA, err=%d\n" , r);
drivers/gpu/drm/display/drm_dp_helper.c +1 -1
@@ -663,7 +663,7 @@ ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,* monitor doesn't power down exactly after the throw away read. */ if (!aux->is_remote) { - ret =drm_dp_dpcd_probe (aux,DP_LANE0_1_STATUS ); + ret =drm_dp_dpcd_probe (aux,DP_DPCD_REV );if (ret <0 )return ret; }
drivers/gpu/drm/msm/msm_gem_submit.c +7 -7
@@ -981,12 +981,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,if (ret ==0 && args->flags &MSM_SUBMIT_FENCE_FD_OUT ) { sync_file =sync_file_create (submit->user_fence); -if (!sync_file) { +if (!sync_file) ret = -ENOMEM ; - }else { -fd_install (out_fence_fd, sync_file->file); - args->fence_fd = out_fence_fd; - } }submit_attach_object_fences (submit);
@@ -1013,10 +1009,14 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, out_unlock:mutex_unlock (&queue->lock); out_post_unlock: -if (ret && (out_fence_fd >=0 )) { -put_unused_fd (out_fence_fd); +if (ret) { +if (out_fence_fd >=0 ) +put_unused_fd (out_fence_fd);if (sync_file)fput (sync_file->file); + }else if (sync_file) { +fd_install (out_fence_fd, sync_file->file); + args->fence_fd = out_fence_fd; }if (!IS_ERR_OR_NULL (submit)) {
drivers/gpu/drm/nouveau/dispnv50/wndw.c +4 -0
@@ -663,6 +663,10 @@ static bool nv50_plane_format_mod_supported(struct drm_plane *plane,struct nouveau_drm *drm =nouveau_drm (plane->dev);uint8_t i; +/* All chipsets can display all formats in linear layout */ +if (modifier ==DRM_FORMAT_MOD_LINEAR ) +return true; +if (drm->client.device.info.chipset <0xc0 ) {const struct drm_format_info *info =drm_format_info (format);const uint8_t kind = (modifier >>12 ) &0xff ;
drivers/gpu/drm/nouveau/nvkm/falcon/gm200.c +4 -11
@@ -103,7 +103,7 @@ gm200_flcn_pio_imem_wr_init(struct nvkm_falcon *falcon, u8 port, bool sec, u32 istatic void gm200_flcn_pio_imem_wr (struct nvkm_falcon *falcon,u8 port,const u8 *img,int len,u16 tag) { -nvkm_falcon_wr32 (falcon,0x188 + (port *0x10 ), tag++); +nvkm_falcon_wr32 (falcon,0x188 + (port *0x10 ), tag);while (len >=4 ) {nvkm_falcon_wr32 (falcon,0x184 + (port *0x10 ), *(u32 *)img); img +=4 ;
@@ -249,9 +249,11 @@ int gm200_flcn_fw_load(struct nvkm_falcon_fw *fw) {struct nvkm_falcon *falcon = fw->falcon; -int target, ret; +int ret;if (fw->inst) { +int target; +nvkm_falcon_mask (falcon,0x048 ,0x00000001 ,0x00000001 );switch (nvkm_memory_target (fw->inst)) {
@@ -285,15 +287,6 @@ gm200_flcn_fw_load(struct nvkm_falcon_fw *fw) }if (fw->boot) { -switch (nvkm_memory_target (&fw->fw.mem.memory)) { -case NVKM_MEM_TARGET_VRAM : target =4 ;break ; -case NVKM_MEM_TARGET_HOST : target =5 ;break ; -case NVKM_MEM_TARGET_NCOH : target =6 ;break ; -default : -WARN_ON (1 ); -return -EINVAL ; - } - ret =nvkm_falcon_pio_wr (falcon, fw->boot,0 ,0 ,IMEM , falcon->code.limit - fw->boot_size, fw->boot_size, fw->boot_addr >>8 , false);
drivers/hid/hid-asus.c +7 -1
@@ -1108,7 +1108,13 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)return ret; } -if (!drvdata->input) { +/* +* Check that input registration succeeded. Checking that +* HID_CLAIMED_INPUT is set prevents a UAF when all input devices +* were freed during registration due to no usages being mapped, +* leaving drvdata->input pointing to freed memory. +*/ +if (!drvdata->input || !(hdev->claimed &HID_CLAIMED_INPUT )) {hid_err (hdev,"Asus input not registered\n" ); ret = -ENOMEM ; goto err_stop_hw;
drivers/hid/hid-ids.h +3 -0
@@ -818,6 +818,8 @@#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019 0x6019#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_602E 0x602e#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6093 0x6093 +#define USB_DEVICE_ID_LENOVO_LEGION_GO_DUAL_DINPUT 0x6184 +#define USB_DEVICE_ID_LENOVO_LEGION_GO2_DUAL_DINPUT 0x61ed#define USB_VENDOR_ID_LETSKETCH 0x6161#define USB_DEVICE_ID_WP9620N 0x4d15
@@ -891,6 +893,7 @@#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2 0xc534#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1 0xc539#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1 0xc53f +#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_2 0xc543#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY 0xc53a#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER 0xc548#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
drivers/hid/hid-input-test.c +5 -5
@@ -7,7 +7,7 @@#include <kunit/test.h> -static void hid_test_input_set_battery_charge_status (struct kunit *test) +static void hid_test_input_update_battery_charge_status (struct kunit *test) {struct hid_device *dev;bool handled;
@@ -15,15 +15,15 @@ static void hid_test_input_set_battery_charge_status(struct kunit *test) dev =kunit_kzalloc (test,sizeof (*dev),GFP_KERNEL );KUNIT_ASSERT_NOT_ERR_OR_NULL (test, dev); - handled =hidinput_set_battery_charge_status (dev,HID_DG_HEIGHT ,0 ); + handled =hidinput_update_battery_charge_status (dev,HID_DG_HEIGHT ,0 );KUNIT_EXPECT_FALSE (test, handled);KUNIT_EXPECT_EQ (test, dev->battery_charge_status,POWER_SUPPLY_STATUS_UNKNOWN ); - handled =hidinput_set_battery_charge_status (dev,HID_BAT_CHARGING ,0 ); + handled =hidinput_update_battery_charge_status (dev,HID_BAT_CHARGING ,0 );KUNIT_EXPECT_TRUE (test, handled);KUNIT_EXPECT_EQ (test, dev->battery_charge_status,POWER_SUPPLY_STATUS_DISCHARGING ); - handled =hidinput_set_battery_charge_status (dev,HID_BAT_CHARGING ,1 ); + handled =hidinput_update_battery_charge_status (dev,HID_BAT_CHARGING ,1 );KUNIT_EXPECT_TRUE (test, handled);KUNIT_EXPECT_EQ (test, dev->battery_charge_status,POWER_SUPPLY_STATUS_CHARGING ); }
@@ -63,7 +63,7 @@ static void hid_test_input_get_battery_property(struct kunit *test) }static struct kunit_case hid_input_tests[] = { -KUNIT_CASE (hid_test_input_set_battery_charge_status), +KUNIT_CASE (hid_test_input_update_battery_charge_status),KUNIT_CASE (hid_test_input_get_battery_property), { } };
drivers/hid/hid-input.c +24 -27
82 lines not on this page · raw message
drivers/hid/hid-logitech-dj.c +4 -0
@@ -1983,6 +1983,10 @@ static const struct hid_device_id logi_dj_receivers[] = { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1), .driver_data = recvr_type_gaming_hidpp}, + {/* Logitech lightspeed receiver (0xc543) */ +HID_USB_DEVICE (USB_VENDOR_ID_LOGITECH , + USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_2), + .driver_data = recvr_type_gaming_hidpp}, { /* Logitech 27 MHz HID++ 1.0 receiver (0xc513) */ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER),
drivers/hid/hid-logitech-hidpp.c +2 -0
@@ -4652,6 +4652,8 @@ static const struct hid_device_id hidpp_devices[] = { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC094) }, {/* Logitech G Pro X Superlight 2 Gaming Mouse over USB */ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC09b) }, + { /* Logitech G PRO 2 LIGHTSPEED Wireless Mouse over USB */ + HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xc09a) }, { /* G935 Gaming Headset */ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0x0a87),
drivers/hid/hid-mcp2221.c +49 -22
137 lines not on this page · raw message
drivers/hid/hid-multitouch.c +8 -0
@@ -1448,6 +1448,14 @@ static __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,if (hdev->vendor ==I2C_VENDOR_ID_GOODIX && (hdev->product ==I2C_DEVICE_ID_GOODIX_01E8 || hdev->product ==I2C_DEVICE_ID_GOODIX_01E9 )) { +if (*size <608 ) { +dev_info ( + &hdev->dev, +"GT7868Q fixup: report descriptor is only %u bytes, skipping\n" , + *size); +return rdesc; + } +if (rdesc[607 ] ==0x15 ) { rdesc[607 ] =0x25 ; dev_info(
drivers/hid/hid-ntrig.c +3 -0
@@ -144,6 +144,9 @@ static void ntrig_report_version(struct hid_device *hdev)struct usb_device *usb_dev =hid_to_usb_dev (hdev);unsigned char *data =kmalloc (8 ,GFP_KERNEL ); +if (!hid_is_usb (hdev)) +return ; +if (!data) goto err_free;
drivers/hid/hid-quirks.c +2 -0
@@ -124,6 +124,8 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_T609A), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_ODDOR_HANDBRAKE), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_LEGION_GO_DUAL_DINPUT), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_LEGION_GO2_DUAL_DINPUT), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL },
drivers/hid/wacom_wac.c +1 -0
@@ -684,6 +684,7 @@ static bool wacom_is_art_pen(int tool_id)case 0x885 :/* Intuos3 Marker Pen */ case 0x804 :/* Intuos4/5 13HD/24HD Marker Pen */ case 0x10804 :/* Intuos4/5 13HD/24HD Art Pen */ +case 0x204 :/* Art Pen 2 */ is_art_pen = true;break ; }
drivers/net/ethernet/dlink/dl2k.c +1 -1
@@ -1092,7 +1092,7 @@ get_stats (struct net_device *dev) dev->stats.rx_bytes +=dr32 (OctetRcvOk); dev->stats.tx_bytes +=dr32 (OctetXmtOk); - dev->stats.multicast =dr32 (McstFramesRcvdOk); + dev->stats.multicast +=dr32 (McstFramesRcvdOk); dev->stats.collisions +=dr32 (SingleColFrames) +dr32 (MultiColFrames);
drivers/net/ethernet/intel/ice/ice_txrx.c +66 -28
205 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_txrx.h +15 -4
@@ -201,7 +201,6 @@ struct ice_rx_buf {struct page *page;unsigned int page_offset;unsigned int pgcnt; -unsigned int act;unsigned int pagecnt_bias; };
@@ -257,6 +256,14 @@ enum ice_rx_dtype { ICE_RX_DTYPE_SPLIT_ALWAYS = 2, }; +struct ice_xdp_buff { +struct xdp_buff xdp_buff; +const union ice_32b_rx_flex_desc *eop_desc; +}; + +/* Required for compatibility with xdp_buffs from xsk_pool */ +static_assert (offsetof(struct ice_xdp_buff , xdp_buff) ==0 ); +/* indices into GLINT_ITR registers */ #define ICE_RX_ITR ICE_IDX_ITR0#define ICE_TX_ITR ICE_IDX_ITR1
@@ -298,7 +305,6 @@ enum ice_dynamic_itr {/* descriptor ring, associated with a VSI */ struct ice_rx_ring {/* CL1 - 1st cacheline starts here */ -struct ice_rx_ring *next;/* pointer to next ring in q_vector */ void *desc;/* Descriptor ring memory */ struct device *dev;/* Used for DMA mapping */ struct net_device *netdev;/* netdev ring maps to */
@@ -310,12 +316,16 @@ struct ice_rx_ring {u16 count;/* Number of descriptors */ u16 reg_idx;/* HW register index of the ring */ u16 next_to_alloc; -/* CL2 - 2nd cacheline starts here */ +union {struct ice_rx_buf *rx_buf;struct xdp_buff **xdp_buf; }; -struct xdp_buff xdp; +/* CL2 - 2nd cacheline starts here */ +union { +struct ice_xdp_buff xdp_ext; +struct xdp_buff xdp; + };/* CL3 - 3rd cacheline starts here */ struct bpf_prog *xdp_prog;u16 rx_offset;
@@ -332,6 +342,7 @@ struct ice_rx_ring {/* CL4 - 4th cacheline starts here */ struct ice_channel *ch;struct ice_tx_ring *xdp_ring; +struct ice_rx_ring *next;/* pointer to next ring in q_vector */ struct xsk_buff_pool *xsk_pool;u32 nr_frags;dma_addr_t dma;/* physical address of ring */
drivers/net/ethernet/intel/ice/ice_txrx_lib.h +10 -43
63 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/devlink.c +1 -1
@@ -107,7 +107,7 @@ static int mlx5_devlink_reload_fw_activate(struct devlink *devlink, struct netliif (err)return err; -mlx5_unload_one_devl_locked (dev, true); +mlx5_sync_reset_unload_flow (dev, true); err =mlx5_health_wait_pci_up (dev);if (err)NL_SET_ERR_MSG_MOD (extack,"FW activate aborted, PCI reads fail after reset" );
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c +2 -1
@@ -575,7 +575,6 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,if (err)return err; } - priv->dcbx.xoff = xoff;/* Apply the settings */ if (update_buffer) {
@@ -584,6 +583,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,return err; } + priv->dcbx.xoff = xoff; +if (update_prio2buffer) err =mlx5e_port_set_priority2buffer (priv->mdev, prio2buffer);
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h +12 -0
@@ -66,11 +66,23 @@ struct mlx5e_port_buffer {struct mlx5e_bufferx_reg buffer[MLX5E_MAX_NETWORK_BUFFER ]; }; +#ifdef CONFIG_MLX5_CORE_EN_DCB int mlx5e_port_manual_buffer_config (struct mlx5e_priv *priv,u32 change,unsigned int mtu,struct ieee_pfc *pfc,u32 *buffer_size,u8 *prio2buffer); +#else +static inline int +mlx5e_port_manual_buffer_config (struct mlx5e_priv *priv, +u32 change,unsigned int mtu, +void *pfc, +u32 *buffer_size, +u8 *prio2buffer) +{ +return 0 ; +} +#endif int mlx5e_port_query_buffer (struct mlx5e_priv *priv,struct mlx5e_port_buffer *port_buffer);
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +18 -1
@@ -44,6 +44,7 @@#include "eswitch.h" #include "en.h" #include "en/txrx.h" +#include "en/port_buffer.h" #include "en_tc.h" #include "en_rep.h" #include "en_accel/ipsec.h"
@@ -108,6 +109,8 @@ void mlx5e_update_carrier(struct mlx5e_priv *priv)if (up) {netdev_info (priv->netdev,"Link up\n" );netif_carrier_on (priv->netdev); +mlx5e_port_manual_buffer_config (priv,0 , priv->netdev->mtu, +NULL ,NULL ,NULL ); }else {netdev_info (priv->netdev,"Link down\n" );netif_carrier_off (priv->netdev);
@@ -2722,9 +2725,11 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)struct mlx5e_params *params = &priv->channels.params;struct net_device *netdev = priv->netdev;struct mlx5_core_dev *mdev = priv->mdev; -u16 mtu; +u16 mtu, prev_mtu;int err; +mlx5e_query_mtu (mdev, params, &prev_mtu); + err =mlx5e_set_mtu (mdev, params, params->sw_mtu);if (err)return err;
@@ -2734,6 +2739,18 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)netdev_warn (netdev,"%s: VPort MTU %d is different than netdev mtu %d\n" , __func__, mtu, params->sw_mtu); +if (mtu != prev_mtu &&MLX5_BUFFER_SUPPORTED (mdev)) { + err =mlx5e_port_manual_buffer_config (priv,0 , mtu, +NULL ,NULL ,NULL ); +if (err) { +netdev_warn (netdev,"%s: Failed to set Xon/Xoff values with MTU %d (err %d), setting back to previous MTU %d\n" , + __func__, mtu, err, prev_mtu); + +mlx5e_set_mtu (mdev, params, prev_mtu); +return err; + } + } + params->sw_mtu = mtu;return 0 ; }
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c +130 -60
313 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.h +1 -0
@@ -12,6 +12,7 @@ int mlx5_fw_reset_set_reset_sync(struct mlx5_core_dev *dev, u8 reset_type_sel,int mlx5_fw_reset_set_live_patch (struct mlx5_core_dev *dev);int mlx5_fw_reset_wait_reset_done (struct mlx5_core_dev *dev); +void mlx5_sync_reset_unload_flow (struct mlx5_core_dev *dev,bool locked);int mlx5_fw_reset_verify_fw_complete (struct mlx5_core_dev *dev,struct netlink_ext_ack *extack);void mlx5_fw_reset_events_start (struct mlx5_core_dev *dev);
drivers/net/ethernet/mellanox/mlx5/core/main.c +3 -0
@@ -627,6 +627,9 @@ static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)if (MLX5_CAP_GEN_MAX (dev, pci_sync_for_fw_update_with_driver_unload))MLX5_SET (cmd_hca_cap, set_hca_cap, pci_sync_for_fw_update_with_driver_unload,1 ); +if (MLX5_CAP_GEN_MAX (dev, pcie_reset_using_hotreset_method)) +MLX5_SET (cmd_hca_cap, set_hca_cap, + pcie_reset_using_hotreset_method,1 );if (MLX5_CAP_GEN_MAX (dev, num_vhca_ports)) MLX5_SET(cmd_hca_cap,
drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c +35 -52
204 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/sf/sf.h +6 -0
@@ -17,6 +17,7 @@ void mlx5_sf_hw_table_destroy(struct mlx5_core_dev *dev);int mlx5_sf_table_init (struct mlx5_core_dev *dev);void mlx5_sf_table_cleanup (struct mlx5_core_dev *dev); +bool mlx5_sf_table_empty (const struct mlx5_core_dev *dev); int mlx5_devlink_sf_port_new(struct devlink *devlink, const struct devlink_port_new_attrs *add_attr,
@@ -61,6 +62,11 @@ static inline void mlx5_sf_table_cleanup(struct mlx5_core_dev *dev) { } +static inline bool mlx5_sf_table_empty (const struct mlx5_core_dev *dev) +{ +return true; +} +#endif #endif
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +4 -4
@@ -69,7 +69,7 @@ static void dwmac4_core_init(struct mac_device_info *hw,init_waitqueue_head (&priv->tstamp_busy_wait); } -static void dwmac4_phylink_get_caps (struct stmmac_priv *priv) +static void dwmac4_update_caps (struct stmmac_priv *priv) {if (priv->plat->tx_queues_to_use >1 ) priv->hw->link.caps &= ~(MAC_10HD |MAC_100HD |MAC_1000HD );
@@ -1161,7 +1161,7 @@ static int dwmac4_config_l4_filter(struct mac_device_info *hw, u32 filter_no,const struct stmmac_ops dwmac4_ops = { .core_init = dwmac4_core_init, - .phylink_get_caps = dwmac4_phylink_get_caps, + .update_caps = dwmac4_update_caps, .set_mac = stmmac_set_mac, .rx_ipc = dwmac4_rx_ipc_enable, .rx_queue_enable = dwmac4_rx_queue_enable,
@@ -1204,7 +1204,7 @@ const struct stmmac_ops dwmac4_ops = {const struct stmmac_ops dwmac410_ops = { .core_init = dwmac4_core_init, - .phylink_get_caps = dwmac4_phylink_get_caps, + .update_caps = dwmac4_update_caps, .set_mac = stmmac_dwmac4_set_mac, .rx_ipc = dwmac4_rx_ipc_enable, .rx_queue_enable = dwmac4_rx_queue_enable,
@@ -1253,7 +1253,7 @@ const struct stmmac_ops dwmac410_ops = {const struct stmmac_ops dwmac510_ops = { .core_init = dwmac4_core_init, - .phylink_get_caps = dwmac4_phylink_get_caps, + .update_caps = dwmac4_update_caps, .set_mac = stmmac_dwmac4_set_mac, .rx_ipc = dwmac4_rx_ipc_enable, .rx_queue_enable = dwmac4_rx_queue_enable,
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +11 -2
@@ -47,6 +47,14 @@ static void dwxgmac2_core_init(struct mac_device_info *hw,writel (XGMAC_INT_DEFAULT_EN , ioaddr +XGMAC_INT_EN ); } +static void dwxgmac2_update_caps (struct stmmac_priv *priv) +{ +if (!priv->dma_cap.mbps_10_100) + priv->hw->link.caps &= ~(MAC_10 |MAC_100 ); +else if (!priv->dma_cap.half_duplex) + priv->hw->link.caps &= ~(MAC_10HD |MAC_100HD ); +} +static void dwxgmac2_set_mac (void __iomem *ioaddr,bool enable) {u32 tx =readl (ioaddr +XGMAC_TX_CONFIG );
@@ -1583,6 +1591,7 @@ static void dwxgmac3_fpe_configure(void __iomem *ioaddr, struct stmmac_fpe_cfg *const struct stmmac_ops dwxgmac210_ops = { .core_init = dwxgmac2_core_init, + .update_caps = dwxgmac2_update_caps, .set_mac = dwxgmac2_set_mac, .rx_ipc = dwxgmac2_rx_ipc, .rx_queue_enable = dwxgmac2_rx_queue_enable,
@@ -1705,8 +1714,8 @@ int dwxgmac2_setup(struct stmmac_priv *priv) mac->mcast_bits_log2 =ilog2 (mac->multicast_filter_bins); mac->link.caps =MAC_ASYM_PAUSE |MAC_SYM_PAUSE | -MAC_1000FD |MAC_2500FD |MAC_5000FD | -MAC_10000FD ; +MAC_10 |MAC_100 |MAC_1000FD | +MAC_2500FD |MAC_5000FD |MAC_10000FD ; mac->link.duplex =0 ; mac->link.speed10 =XGMAC_CONFIG_SS_10_MII ; mac->link.speed100 =XGMAC_CONFIG_SS_100_MII ;
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +5 -4
@@ -203,10 +203,6 @@ static void dwxgmac2_dma_rx_mode(struct stmmac_priv *priv, void __iomem *ioaddr, }writel (value, ioaddr +XGMAC_MTL_RXQ_OPMODE (channel)); - -/* Enable MTL RX overflow */ - value =readl (ioaddr +XGMAC_MTL_QINTEN (channel)); -writel (value |XGMAC_RXOIE , ioaddr +XGMAC_MTL_QINTEN (channel)); } static void dwxgmac2_dma_tx_mode(struct stmmac_priv *priv, void __iomem *ioaddr,
@@ -386,8 +382,11 @@ static int dwxgmac2_dma_interrupt(struct stmmac_priv *priv,static int dwxgmac2_get_hw_feature (void __iomem *ioaddr,struct dma_features *dma_cap) { +struct stmmac_priv *priv;u32 hw_cap; + priv = container_of(dma_cap, struct stmmac_priv, dma_cap); +/* MAC HW feature 0 */ hw_cap =readl (ioaddr +XGMAC_HW_FEATURE0 ); dma_cap->edma = (hw_cap &XGMAC_HWFEAT_EDMA ) >>31 ;
@@ -410,6 +409,8 @@ static int dwxgmac2_get_hw_feature(void __iomem *ioaddr, dma_cap->vlhash = (hw_cap &XGMAC_HWFEAT_VLHASH ) >>4 ; dma_cap->half_duplex = (hw_cap &XGMAC_HWFEAT_HDSEL ) >>3 ; dma_cap->mbps_1000 = (hw_cap &XGMAC_HWFEAT_GMIISEL ) >>1 ; +if (dma_cap->mbps_1000 && priv->synopsys_id >=DWXGMAC_CORE_2_20 ) + dma_cap->mbps_10_100 =1 ;/* MAC HW feature 1 */ hw_cap =readl (ioaddr +XGMAC_HW_FEATURE1 );
drivers/net/ethernet/stmicro/stmmac/hwif.h +4 -4
@@ -300,8 +300,8 @@ struct stmmac_est;struct stmmac_ops {/* MAC core initialization */ void (*core_init)(struct mac_device_info *hw,struct net_device *dev); -/* Get phylink capabilities */ -void (*phylink_get_caps)(struct stmmac_priv *priv); +/* Update MAC capabilities */ +void (*update_caps)(struct stmmac_priv *priv);/* Enable the MAC RX/TX */ void (*set_mac)(void __iomem *ioaddr,bool enable);/* Enable and verify that the IPC module is supported */
@@ -423,8 +423,8 @@ struct stmmac_ops { #define stmmac_core_init(__priv, __args...) \ stmmac_do_void_callback(__priv, mac, core_init, __args) -#define stmmac_mac_phylink_get_caps (__priv) \ - stmmac_do_void_callback(__priv, mac, phylink_get_caps, __priv) +#define stmmac_mac_update_caps (__priv) \ + stmmac_do_void_callback(__priv, mac, update_caps, __priv) #define stmmac_mac_set(__priv, __args...) \ stmmac_do_void_callback(__priv, mac, set_mac, __args) #define stmmac_rx_ipc(__priv, __args...) \
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +7 -5
@@ -1230,8 +1230,8 @@ static int stmmac_phy_setup(struct stmmac_priv *priv)xpcs_get_interfaces (priv->hw->xpcs, priv->phylink_config.supported_interfaces); -/* Get the MAC specific capabilities */ -stmmac_mac_phylink_get_caps (priv); +/* Refresh the MAC-specific capabilities */ +stmmac_mac_update_caps (priv); priv->phylink_config.mac_capabilities = priv->hw->link.caps;
@@ -2426,6 +2426,7 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)struct netdev_queue *nq =netdev_get_tx_queue (priv->dev, queue);struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue];struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[queue]; +bool csum = !priv->plat->tx_queues_cfg[queue].coe_unsupported;struct xsk_buff_pool *pool = tx_q->xsk_pool;unsigned int entry = tx_q->cur_tx;struct dma_desc *tx_desc =NULL ;
@@ -2496,7 +2497,7 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget) }stmmac_prepare_tx_desc (priv, tx_desc,1 , xdp_desc.len, - true, priv->mode, true, true, + csum, priv->mode, true, true, xdp_desc.len);stmmac_enable_dma_transmission (priv, priv->ioaddr);
@@ -4789,6 +4790,7 @@ static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue, {struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[queue];struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; +bool csum = !priv->plat->tx_queues_cfg[queue].coe_unsupported;unsigned int entry = tx_q->cur_tx;struct dma_desc *tx_desc;dma_addr_t dma_addr;
@@ -4833,7 +4835,7 @@ static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue,stmmac_set_desc_addr (priv, tx_desc, dma_addr);stmmac_prepare_tx_desc (priv, tx_desc,1 , xdpf->len, - true, priv->mode, true, true, + csum, priv->mode, true, true, xdpf->len); tx_q->tx_count_frames++;
@@ -7232,7 +7234,7 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt) priv->rss.table[i] =ethtool_rxfh_indir_default (i, rx_cnt); -stmmac_mac_phylink_get_caps (priv); +stmmac_mac_update_caps (priv); priv->phylink_config.mac_capabilities = priv->hw->link.caps;
drivers/net/phy/mscc/mscc.h +4 -0
@@ -476,6 +476,7 @@ static inline void vsc8584_config_macsec_intr(struct phy_device *phydev)void vsc85xx_link_change_notify (struct phy_device *phydev);void vsc8584_config_ts_intr (struct phy_device *phydev);int vsc8584_ptp_init (struct phy_device *phydev); +void vsc8584_ptp_deinit (struct phy_device *phydev);int vsc8584_ptp_probe_once (struct phy_device *phydev);int vsc8584_ptp_probe (struct phy_device *phydev);irqreturn_t vsc8584_handle_ts_interrupt (struct phy_device *phydev);
@@ -490,6 +491,9 @@ static inline int vsc8584_ptp_init(struct phy_device *phydev) {return 0 ; } +static inline void vsc8584_ptp_deinit (struct phy_device *phydev) +{ +}static inline int vsc8584_ptp_probe_once (struct phy_device *phydev) {return 0 ;
drivers/net/phy/mscc/mscc_main.c +1 -3
@@ -2337,9 +2337,7 @@ static int vsc85xx_probe(struct phy_device *phydev)static void vsc85xx_remove (struct phy_device *phydev) { -struct vsc8531_private *priv = phydev->priv; - -skb_queue_purge (&priv->rx_skbs_list); +vsc8584_ptp_deinit (phydev); }/* Microsemi VSC85xx PHYs */
drivers/net/phy/mscc/mscc_ptp.c +21 -13
@@ -1297,7 +1297,6 @@ static void vsc8584_set_input_clk_configured(struct phy_device *phydev)static int __vsc8584_init_ptp (struct phy_device *phydev) { -struct vsc8531_private *vsc8531 = phydev->priv;static const u32 ltc_seq_e[] = {0 ,400000 ,0 ,0 ,0 };static const u8 ltc_seq_a[] = {8 ,6 ,5 ,4 ,2 };u32 val;
@@ -1514,17 +1513,7 @@ static int __vsc8584_init_ptp(struct phy_device *phydev)vsc85xx_ts_eth_cmp1_sig (phydev); - vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp; - vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp; - vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp; - vsc8531->mii_ts.ts_info = vsc85xx_ts_info; - phydev->mii_ts = &vsc8531->mii_ts; - -memcpy (&vsc8531->ptp->caps, &vsc85xx_clk_caps,sizeof (vsc85xx_clk_caps)); - - vsc8531->ptp->ptp_clock =ptp_clock_register (&vsc8531->ptp->caps, - &phydev->mdio.dev); -return PTR_ERR_OR_ZERO (vsc8531->ptp->ptp_clock); +return 0 ; }void vsc8584_config_ts_intr (struct phy_device *phydev)
@@ -1551,6 +1540,16 @@ int vsc8584_ptp_init(struct phy_device *phydev)return 0 ; } +void vsc8584_ptp_deinit (struct phy_device *phydev) +{ +struct vsc8531_private *vsc8531 = phydev->priv; + +if (vsc8531->ptp->ptp_clock) { +ptp_clock_unregister (vsc8531->ptp->ptp_clock); +skb_queue_purge (&vsc8531->rx_skbs_list); + } +} +irqreturn_t vsc8584_handle_ts_interrupt (struct phy_device *phydev) {struct vsc8531_private *priv = phydev->priv;
@@ -1608,7 +1607,16 @@ int vsc8584_ptp_probe(struct phy_device *phydev) vsc8531->ptp->phydev = phydev; -return 0 ; + vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp; + vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp; + vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp; + vsc8531->mii_ts.ts_info = vsc85xx_ts_info; + phydev->mii_ts = &vsc8531->mii_ts; + +memcpy (&vsc8531->ptp->caps, &vsc85xx_clk_caps,sizeof (vsc85xx_clk_caps)); + vsc8531->ptp->ptp_clock =ptp_clock_register (&vsc8531->ptp->caps, + &phydev->mdio.dev); +return PTR_ERR_OR_ZERO (vsc8531->ptp->ptp_clock); }int vsc8584_ptp_probe_once (struct phy_device *phydev)
drivers/net/usb/qmi_wwan.c +3 -0
@@ -1363,6 +1363,9 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1034, 2)}, /* Telit LE910C4-WWX */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1037, 4)}, /* Telit LE910C4-WWX */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1038, 3)}, /* Telit LE910C4-WWX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */
drivers/of/dynamic.c +16 -13
@@ -306,15 +306,20 @@ int of_detach_node(struct device_node *np) }EXPORT_SYMBOL_GPL (of_detach_node); +void __of_prop_free (struct property *prop) +{ +kfree (prop->name); +kfree (prop->value); +kfree (prop); +} +static void property_list_free (struct property *prop_list) {struct property *prop, *next;for (prop = prop_list; prop !=NULL ; prop = next) { next = prop->next; -kfree (prop->name); -kfree (prop->value); -kfree (prop); +__of_prop_free (prop); } }
@@ -427,9 +432,7 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)return new; err_free: -kfree (new->name); -kfree (new->value); -kfree (new); +__of_prop_free (new);return NULL ; }
@@ -471,9 +474,7 @@ struct device_node *__of_node_dup(const struct device_node *np,if (!new_pp) goto err_prop;if (__of_add_property (node, new_pp)) { -kfree (new_pp->name); -kfree (new_pp->value); -kfree (new_pp); +__of_prop_free (new_pp); goto err_prop; } }
@@ -934,12 +935,14 @@ static int of_changeset_add_prop_helper(struct of_changeset *ocs, ret =of_changeset_add_property (ocs, np, new_pp);if (ret) { -kfree (new_pp->name); -kfree (new_pp->value); -kfree (new_pp); +__of_prop_free (new_pp); +return ret; } -return ret; + new_pp->next = np->deadprops; + np->deadprops = new_pp; + +return 0 ; }/**
drivers/of/of_private.h +1 -0
@@ -123,6 +123,7 @@ extern void *__unflatten_device_tree(const void *blob,* own the devtree lock or work on detached trees only. */ struct property *__of_prop_dup (const struct property *prop,gfp_t allocflags); +void __of_prop_free (struct property *prop);struct device_node *__of_node_dup (const struct device_node *np,const char *full_name);
drivers/of/overlay.c +3 -8
@@ -262,9 +262,7 @@ static struct property *dup_and_fixup_symbol_prop(return new_prop; err_free_new_prop: -kfree (new_prop->name); -kfree (new_prop->value); -kfree (new_prop); +__of_prop_free (new_prop); err_free_target_path:kfree (target_path);
@@ -361,11 +359,8 @@ static int add_changeset_property(struct overlay_changeset *ovcs,pr_err ("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n" , target->np, new_prop->name); -if (ret) { -kfree (new_prop->name); -kfree (new_prop->value); -kfree (new_prop); - } +if (ret) +__of_prop_free (new_prop);return ret; }
drivers/of/unittest.c +3 -9
@@ -800,15 +800,11 @@ static void __init of_unittest_property_copy(void) new =__of_prop_dup (&p1,GFP_KERNEL );unittest (new &&propcmp (&p1, new),"empty property didn't copy correctly\n" ); -kfree (new->value); -kfree (new->name); -kfree (new); +__of_prop_free (new); new =__of_prop_dup (&p2,GFP_KERNEL );unittest (new &&propcmp (&p2, new),"non-empty property didn't copy correctly\n" ); -kfree (new->value); -kfree (new->name); -kfree (new); +__of_prop_free (new);#endif }
@@ -3665,9 +3661,7 @@ static __init void of_unittest_overlay_high_level(void) goto err_unlock; }if (__of_add_property (of_symbols, new_prop)) { -kfree (new_prop->name); -kfree (new_prop->value); -kfree (new_prop); +__of_prop_free (new_prop);/* "name" auto-generated by unflatten */ if (!strcmp (prop->name,"name" ))continue ;
drivers/pinctrl/Kconfig +1 -0
@@ -438,6 +438,7 @@ config PINCTRL_STMFX tristate "STMicroelectronics STMFX GPIO expander pinctrl driver" depends on I2C depends on OF_GPIO + depends on HAS_IOMEM select GENERIC_PINCONF select GPIOLIB_IRQCHIP select MFD_STMFX
drivers/scsi/scsi_sysfs.c +2 -2
@@ -265,7 +265,7 @@ show_shost_supported_mode(struct device *dev, struct device_attribute *attr,return show_shost_mode (supported_mode, buf); } -static DEVICE_ATTR(supported_mode, S_IRUGO | S_IWUSR, show_shost_supported_mode, NULL); +static DEVICE_ATTR(supported_mode, S_IRUGO, show_shost_supported_mode, NULL); static ssize_t show_shost_active_mode(struct device *dev,
@@ -279,7 +279,7 @@ show_shost_active_mode(struct device *dev,return show_shost_mode (shost->active_mode, buf); } -static DEVICE_ATTR(active_mode, S_IRUGO | S_IWUSR, show_shost_active_mode, NULL); +static DEVICE_ATTR(active_mode, S_IRUGO, show_shost_active_mode, NULL);static int check_reset_type (const char *str) {
drivers/vhost/net.c +7 -2
@@ -96,6 +96,7 @@ struct vhost_net_ubuf_ref {atomic_t refcount;wait_queue_head_t wait;struct vhost_virtqueue *vq; +struct rcu_head rcu; };#define VHOST_NET_BATCH 64
@@ -249,9 +250,13 @@ vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool zcopy)static int vhost_net_ubuf_put (struct vhost_net_ubuf_ref *ubufs) { -int r =atomic_sub_return (1 , &ubufs->refcount); +int r; + +rcu_read_lock (); + r =atomic_sub_return (1 , &ubufs->refcount);if (unlikely (!r))wake_up (&ubufs->wait); +rcu_read_unlock ();return r; }
@@ -264,7 +269,7 @@ static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)static void vhost_net_ubuf_put_wait_and_free (struct vhost_net_ubuf_ref *ubufs) {vhost_net_ubuf_put_and_wait (ubufs); -kfree (ubufs); +kfree_rcu (ubufs, rcu); }static void vhost_net_clear_ubuf_info (struct vhost_net *n)
fs/efivarfs/super.c +4 -0
@@ -90,6 +90,10 @@ static int efivarfs_d_compare(const struct dentry *dentry, {int guid = len -EFI_VARIABLE_GUID_LEN ; +/* Parallel lookups may produce a temporary invalid filename */ +if (guid <=0 ) +return 1 ; +if (name->len != len)return 1 ;
fs/erofs/zdata.c +11 -2
@@ -1401,6 +1401,16 @@ static void z_erofs_decompressqueue_kthread_work(struct kthread_work *work) }#endif +/* Use (kthread_)work in atomic contexts to minimize scheduling overhead */ +static inline bool z_erofs_in_atomic (void ) +{ +if (IS_ENABLED (CONFIG_PREEMPTION ) &&rcu_preempt_depth ()) +return true; +if (!IS_ENABLED (CONFIG_PREEMPT_COUNT )) +return true; +return !preemptible (); +} +static void z_erofs_decompress_kickoff (struct z_erofs_decompressqueue *io,int bios) {
@@ -1415,8 +1425,7 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,if (atomic_add_return (bios, &io->pending_bios))return ; -/* Use (kthread_)work and sync decompression for atomic contexts only */ -if (!in_task () ||irqs_disabled () ||rcu_read_lock_any_held ()) { +if (z_erofs_in_atomic ()) {#ifdef CONFIG_EROFS_FS_PCPU_KTHREAD struct kthread_worker *worker;
fs/nfs/pagelist.c +5 -81
101 lines not on this page · raw message
fs/nfs/write.c +94 -52
199 lines not on this page · raw message
fs/smb/client/cifsfs.c +14 -0
@@ -1371,6 +1371,20 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,netfs_resize_file (&target_cifsi->netfs, new_size);fscache_resize_cookie (cifs_inode_cookie (target_inode), new_size); + }else if (rc == -EOPNOTSUPP ) { +/* +* copy_file_range syscall man page indicates EINVAL +* is returned e.g when "fd_in and fd_out refer to the +* same file and the source and target ranges overlap." +* Test generic/157 was what showed these cases where +* we need to remap EOPNOTSUPP to EINVAL +*/ +if (off >= src_inode->i_size) { + rc = -EINVAL ; + }else if (src_inode == target_inode) { +if (off + len > destoff) + rc = -EINVAL ; + } } }
fs/smb/client/inode.c +32 -2
@@ -1856,15 +1856,24 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)struct cifs_sb_info *cifs_sb =CIFS_SB (sb);struct tcon_link *tlink;struct cifs_tcon *tcon; +__u32 dosattr =0 , origattr =0 ;struct TCP_Server_Info *server;struct iattr *attrs =NULL ; -__u32 dosattr =0 , origattr =0 ; +bool rehash = false;cifs_dbg (FYI ,"cifs_unlink, dir=0x%p, dentry=0x%p\n" , dir, dentry);if (unlikely (cifs_forced_shutdown (cifs_sb)))return -EIO ; +/* Unhash dentry in advance to prevent any concurrent opens */ +spin_lock (&dentry->d_lock); +if (!d_unhashed (dentry)) { +__d_drop (dentry); + rehash = true; + } +spin_unlock (&dentry->d_lock); + tlink =cifs_sb_tlink (cifs_sb);if (IS_ERR (tlink))return PTR_ERR (tlink);
@@ -1915,7 +1924,8 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)cifs_drop_nlink (inode); } }else if (rc == -ENOENT ) { -d_drop (dentry); +if (simple_positive (dentry)) +d_delete (dentry); }else if (rc == -EBUSY ) {if (server->ops->rename_pending_delete) { rc = server->ops->rename_pending_delete(full_path,
@@ -1968,6 +1978,8 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)kfree (attrs);free_xid (xid);cifs_put_tlink (tlink); +if (rehash) +d_rehash (dentry);return rc; }
@@ -2367,6 +2379,7 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,struct cifs_sb_info *cifs_sb;struct tcon_link *tlink;struct cifs_tcon *tcon; +bool rehash = false;unsigned int xid;int rc, tmprc;int retry_count =0 ;
@@ -2382,6 +2395,17 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,if (unlikely (cifs_forced_shutdown (cifs_sb)))return -EIO ; +/* +* Prevent any concurrent opens on the target by unhashing the dentry. +* VFS already unhashes the target when renaming directories. +*/ +if (d_is_positive (target_dentry) && !d_is_dir (target_dentry)) { +if (!d_unhashed (target_dentry)) { +d_drop (target_dentry); + rehash = true; + } + } + tlink =cifs_sb_tlink (cifs_sb);if (IS_ERR (tlink))return PTR_ERR (tlink);
@@ -2421,6 +2445,8 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir, } } +if (!rc) + rehash = false;/* * No-replace is the natural behavior for CIFS, so skip unlink hacks. */
@@ -2479,12 +2505,16 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir, goto cifs_rename_exit; rc =cifs_do_rename (xid, source_dentry, from_name, target_dentry, to_name); +if (!rc) + rehash = false; }/* force revalidate to go get info when needed */ CIFS_I (source_dir)->time =CIFS_I (target_dir)->time =0 ; cifs_rename_exit: +if (rehash) +d_rehash (target_dentry);kfree (info_buf_source);free_dentry_path (page2);free_dentry_path (page1);
fs/smb/client/smb2inode.c +5 -2
@@ -206,8 +206,10 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, server =cifs_pick_channel (ses); vars =kzalloc (sizeof (*vars),GFP_ATOMIC ); -if (vars ==NULL ) -return -ENOMEM ; +if (vars ==NULL ) { + rc = -ENOMEM ; + goto out; + } rqst = &vars->rqst[0 ]; rsp_iov = &vars->rsp_iov[0 ];
@@ -828,6 +830,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, smb2_should_replay(tcon, &retries, &cur_sleep)) goto replay_again; +out:if (cfile)cifsFileInfo_put (cfile);
fs/xfs/libxfs/xfs_attr_remote.c +7 -0
@@ -418,6 +418,13 @@ xfs_attr_rmtval_get( dblkcnt =XFS_FSB_TO_BB (mp, map[i].br_blockcount); error =xfs_buf_read (mp->m_ddev_targp, dblkno, dblkcnt,0 , &bp, &xfs_attr3_rmt_buf_ops); +/* +* ENODATA from disk implies a disk medium failure; +* ENODATA for xattrs means attribute not found, so +* disambiguate that here. +*/ +if (error == -ENODATA ) + error = -EIO ;if (error)return error;
fs/xfs/libxfs/xfs_da_btree.c +6 -0
@@ -2649,6 +2649,12 @@ xfs_da_read_buf( error =xfs_trans_read_buf_map (mp, tp, mp->m_ddev_targp, mapp, nmap,0 , &bp, ops); +/* +* ENODATA from disk implies a disk medium failure; ENODATA for +* xattrs means attribute not found, so disambiguate that here. +*/ +if (error == -ENODATA && whichfork ==XFS_ATTR_FORK ) + error = -EIO ;if (error) goto out_free;
include/linux/atmdev.h +1 -0
@@ -185,6 +185,7 @@ struct atmdev_ops { /* only send is required */int (*compat_ioctl)(struct atm_dev *dev,unsigned int cmd,void __user *arg);#endif +int (*pre_send)(struct atm_vcc *vcc,struct sk_buff *skb);int (*send)(struct atm_vcc *vcc,struct sk_buff *skb);int (*send_bh)(struct atm_vcc *vcc,struct sk_buff *skb);int (*send_oam)(struct atm_vcc *vcc,void *cell,int flags);
include/linux/mlx5/mlx5_ifc.h +9 -2
@@ -1731,7 +1731,8 @@ struct mlx5_ifc_cmd_hca_cap_bits {u8 reserved_at_328[0x2 ];u8 relaxed_ordering_read[0x1 ];u8 log_max_pd[0x5 ]; -u8 reserved_at_330[0x6 ]; +u8 reserved_at_330[0x5 ]; +u8 pcie_reset_using_hotreset_method[0x1 ];u8 pci_sync_for_fw_update_with_driver_unload[0x1 ];u8 vnic_env_cnt_steering_fail[0x1 ];u8 vport_counter_local_loopback[0x1 ];
@@ -10824,6 +10825,11 @@ struct mlx5_ifc_mcda_reg_bits {u8 data[][0x20 ]; }; +enum { +MLX5_MFRL_REG_PCI_RESET_METHOD_LINK_TOGGLE =0 , +MLX5_MFRL_REG_PCI_RESET_METHOD_HOT_RESET =1 , +}; +enum {MLX5_MFRL_REG_RESET_STATE_IDLE =0 ,MLX5_MFRL_REG_RESET_STATE_IN_NEGOTIATION =1 ,
@@ -10851,7 +10857,8 @@ struct mlx5_ifc_mfrl_reg_bits {u8 pci_sync_for_fw_update_start[0x1 ];u8 pci_sync_for_fw_update_resp[0x2 ];u8 rst_type_sel[0x3 ]; -u8 reserved_at_28[0x4 ]; +u8 pci_reset_req_method[0x3 ]; +u8 reserved_at_2b[0x1 ];u8 reset_state[0x4 ];u8 reset_type[0x8 ];u8 reset_level[0x8 ];
include/linux/nfs_page.h +1 -1
@@ -156,13 +156,13 @@ extern int nfs_wait_on_request(struct nfs_page *);extern void nfs_unlock_request (struct nfs_page *req);extern void nfs_unlock_and_release_request (struct nfs_page *);extern struct nfs_page *nfs_page_group_lock_head (struct nfs_page *req); -extern int nfs_page_group_lock_subrequests (struct nfs_page *head);extern void nfs_join_page_group (struct nfs_page *head,struct nfs_commit_info *cinfo,struct inode *inode);extern int nfs_page_group_lock (struct nfs_page *);extern void nfs_page_group_unlock (struct nfs_page *);extern bool nfs_page_group_sync_on_bit (struct nfs_page *,unsigned int ); +extern bool nfs_page_group_sync_on_bit_locked (struct nfs_page *,unsigned int );extern int nfs_page_set_headlock (struct nfs_page *req);extern void nfs_page_clear_headlock (struct nfs_page *req);extern bool nfs_async_iocounter_wait (struct rpc_task *,struct nfs_lock_context *);
include/net/bluetooth/hci_sync.h +1 -1
@@ -72,7 +72,7 @@ int hci_update_class_sync(struct hci_dev *hdev);int hci_update_eir_sync (struct hci_dev *hdev);int hci_update_class_sync (struct hci_dev *hdev); -int hci_update_name_sync (struct hci_dev *hdev); +int hci_update_name_sync (struct hci_dev *hdev,const u8 *name);int hci_write_ssp_mode_sync (struct hci_dev *hdev,u8 mode); int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,
include/net/rose.h +17 -1
@@ -8,6 +8,7 @@#ifndef _ROSE_H#define _ROSE_H +#include <linux/refcount.h>#include <linux/rose.h> #include <net/ax25.h> #include <net/sock.h>
@@ -96,7 +97,7 @@ struct rose_neigh {ax25_cb *ax25;struct net_device *dev;unsigned short count; -unsigned short use; +refcount_t use;unsigned int number;char restarted;char dce_mode;
@@ -151,6 +152,21 @@ struct rose_sock {#define rose_sk (sk) ((struct rose_sock *)(sk)) +static inline void rose_neigh_hold (struct rose_neigh *rose_neigh) +{ +refcount_inc (&rose_neigh->use); +} + +static inline void rose_neigh_put (struct rose_neigh *rose_neigh) +{ +if (refcount_dec_and_test (&rose_neigh->use)) { +if (rose_neigh->ax25) +ax25_cb_put (rose_neigh->ax25); +kfree (rose_neigh->digipeat); +kfree (rose_neigh); + } +} +/* af_rose.c */ extern ax25_address rose_callsign;extern int sysctl_rose_restart_request_timeout;
kernel/dma/pool.c +2 -2
@@ -102,8 +102,8 @@ static int atomic_pool_expand(struct gen_pool *pool, size_t pool_size,#ifdef CONFIG_DMA_DIRECT_REMAP addr =dma_common_contiguous_remap (page, pool_size, -pgprot_dmacoherent (PAGE_KERNEL ), -__builtin_return_address (0 )); +pgprot_decrypted (pgprot_dmacoherent (PAGE_KERNEL )), +__builtin_return_address (0 ));if (!addr) goto free_page;#else
kernel/trace/trace.c +2 -2
@@ -10162,10 +10162,10 @@ void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) ret =print_trace_line (&iter);if (ret !=TRACE_TYPE_NO_CONSUME )trace_consume (&iter); + +trace_printk_seq (&iter.seq); }touch_nmi_watchdog (); - -trace_printk_seq (&iter.seq); }if (!cnt)
net/atm/common.c +12 -3
@@ -635,18 +635,27 @@ int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t size) skb->dev =NULL ;/* for paths shared with net_device interfaces */ if (!copy_from_iter_full (skb_put (skb, size), size, &m->msg_iter)) { -atm_return_tx (vcc, skb); -kfree_skb (skb); error = -EFAULT ; - goto out; + goto free_skb; }if (eff != size)memset (skb->data + size,0 , eff-size); + +if (vcc->dev->ops->pre_send) { + error = vcc->dev->ops->pre_send (vcc, skb); +if (error) + goto free_skb; + } + error = vcc->dev->ops->send (vcc, skb); error = error ? error : size; out:release_sock (sk);return error; +free_skb: +atm_return_tx (vcc, skb); +kfree_skb (skb); + goto out; }__poll_t vcc_poll (struct file *file,struct socket *sock,poll_table *wait)
net/bluetooth/hci_event.c +18 -2
@@ -2692,7 +2692,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)if (!conn) goto unlock; -if (status) { +if (status && status !=HCI_ERROR_UNKNOWN_CONN_ID ) {mgmt_disconnect_failed (hdev, &conn->dst, conn->type, conn->dst_type, status);
@@ -2707,6 +2707,12 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status) goto done; } +/* During suspend, mark connection as closed immediately +* since we might not receive HCI_EV_DISCONN_COMPLETE +*/ +if (hdev->suspended) + conn->state =BT_CLOSED ; + mgmt_conn =test_and_clear_bit (HCI_CONN_MGMT_CONNECTED , &conn->flags);if (conn->type ==ACL_LINK ) {
@@ -4386,7 +4392,17 @@ static void hci_num_comp_pkts_evt(struct hci_dev *hdev, void *data,if (!conn)continue ; - conn->sent -= count; +/* Check if there is really enough packets outstanding before +* attempting to decrease the sent counter otherwise it could +* underflow.. +*/ +if (conn->sent >= count) { + conn->sent -= count; + }else { +bt_dev_warn (hdev,"hcon %p sent %u < count %u" , + conn, conn->sent, count); + conn->sent =0 ; + }switch (conn->type) {case ACL_LINK :
net/bluetooth/hci_sync.c +3 -3
@@ -3491,13 +3491,13 @@ int hci_update_scan_sync(struct hci_dev *hdev)return hci_write_scan_enable_sync (hdev, scan); } -int hci_update_name_sync (struct hci_dev *hdev) +int hci_update_name_sync (struct hci_dev *hdev,const u8 *name) {struct hci_cp_write_local_name cp;memset (&cp,0 ,sizeof (cp)); -memcpy (cp.name, hdev->dev_name,sizeof (cp.name)); +memcpy (cp.name, name,sizeof (cp.name)); return __hci_cmd_sync_status(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp,
@@ -3550,7 +3550,7 @@ int hci_powered_update_sync(struct hci_dev *hdev)hci_write_fast_connectable_sync (hdev, false);hci_update_scan_sync (hdev);hci_update_class_sync (hdev); -hci_update_name_sync (hdev); +hci_update_name_sync (hdev, hdev->dev_name);hci_update_eir_sync (hdev); }
net/bluetooth/mgmt.c +4 -1
@@ -3819,8 +3819,11 @@ static void set_name_complete(struct hci_dev *hdev, void *data, int err)static int set_name_sync (struct hci_dev *hdev,void *data) { +struct mgmt_pending_cmd *cmd = data; +struct mgmt_cp_set_local_name *cp = cmd->param; +if (lmp_bredr_capable (hdev)) { -hci_update_name_sync (hdev); +hci_update_name_sync (hdev, cp->name);hci_update_eir_sync (hdev); }
net/ipv4/route.c +7 -3
@@ -2547,12 +2547,16 @@ static struct rtable *__mkroute_output(const struct fib_result *res, !netif_is_l3_master(dev_out))return ERR_PTR (-EINVAL ); -if (ipv4_is_lbcast (fl4->daddr)) +if (ipv4_is_lbcast (fl4->daddr)) { type =RTN_BROADCAST ; -else if (ipv4_is_multicast (fl4->daddr)) + +/* reset fi to prevent gateway resolution */ + fi =NULL ; + }else if (ipv4_is_multicast (fl4->daddr)) { type =RTN_MULTICAST ; -else if (ipv4_is_zeronet (fl4->daddr)) + }else if (ipv4_is_zeronet (fl4->daddr)) {return ERR_PTR (-EINVAL ); + }if (dev_out->flags &IFF_LOOPBACK ) flags |=RTCF_LOCAL ;
net/rose/af_rose.c +7 -6
@@ -170,7 +170,7 @@ void rose_kill_by_neigh(struct rose_neigh *neigh)if (rose->neighbour == neigh) {rose_disconnect (s,ENETUNREACH ,ROSE_OUT_OF_ORDER ,0 ); - rose->neighbour->use--; +rose_neigh_put (rose->neighbour); rose->neighbour =NULL ; } }
@@ -212,7 +212,7 @@ static void rose_kill_by_device(struct net_device *dev)if (rose->device == dev) {rose_disconnect (sk,ENETUNREACH ,ROSE_OUT_OF_ORDER ,0 );if (rose->neighbour) - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);netdev_put (rose->device, &rose->dev_tracker); rose->device =NULL ; }
@@ -655,7 +655,7 @@ static int rose_release(struct socket *sock)break ;case ROSE_STATE_2 : - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);release_sock (sk);rose_disconnect (sk,0 ,-1 ,-1 );lock_sock (sk);
@@ -823,6 +823,7 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le rose->lci =rose_new_lci (rose->neighbour);if (!rose->lci) { err = -ENETUNREACH ; +rose_neigh_put (rose->neighbour); goto out_release; }
@@ -834,12 +835,14 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le dev =rose_dev_first ();if (!dev) { err = -ENETUNREACH ; +rose_neigh_put (rose->neighbour); goto out_release; } user =ax25_findbyuid (current_euid ());if (!user) { err = -EINVAL ; +rose_neigh_put (rose->neighbour);dev_put (dev); goto out_release; }
@@ -874,8 +877,6 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le rose->state =ROSE_STATE_1 ; - rose->neighbour->use++; -rose_write_internal (sk,ROSE_CALL_REQUEST );rose_start_heartbeat (sk);rose_start_t1timer (sk);
@@ -1077,7 +1078,7 @@ int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct ros GFP_ATOMIC); make_rose->facilities = facilities; - make_rose->neighbour->use++; +rose_neigh_hold (make_rose->neighbour);if (rose_sk (sk)->defer) { make_rose->state =ROSE_STATE_5 ;
net/rose/rose_in.c +6 -6
@@ -56,7 +56,7 @@ static int rose_state1_machine(struct sock *sk, struct sk_buff *skb, int frametycase ROSE_CLEAR_REQUEST :rose_write_internal (sk,ROSE_CLEAR_CONFIRMATION );rose_disconnect (sk,ECONNREFUSED , skb->data[3 ], skb->data[4 ]); - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);break ;default :
@@ -79,12 +79,12 @@ static int rose_state2_machine(struct sock *sk, struct sk_buff *skb, int frametycase ROSE_CLEAR_REQUEST :rose_write_internal (sk,ROSE_CLEAR_CONFIRMATION );rose_disconnect (sk,0 , skb->data[3 ], skb->data[4 ]); - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);break ;case ROSE_CLEAR_CONFIRMATION :rose_disconnect (sk,0 ,-1 ,-1 ); - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);break ;default :
@@ -120,7 +120,7 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int frametycase ROSE_CLEAR_REQUEST :rose_write_internal (sk,ROSE_CLEAR_CONFIRMATION );rose_disconnect (sk,0 , skb->data[3 ], skb->data[4 ]); - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);break ;case ROSE_RR :
@@ -233,7 +233,7 @@ static int rose_state4_machine(struct sock *sk, struct sk_buff *skb, int frametycase ROSE_CLEAR_REQUEST :rose_write_internal (sk,ROSE_CLEAR_CONFIRMATION );rose_disconnect (sk,0 , skb->data[3 ], skb->data[4 ]); - rose->neighbour->use--; +rose_neigh_put (rose->neighbour);break ;default :
@@ -253,7 +253,7 @@ static int rose_state5_machine(struct sock *sk, struct sk_buff *skb, int frametyif (frametype ==ROSE_CLEAR_REQUEST ) {rose_write_internal (sk,ROSE_CLEAR_CONFIRMATION );rose_disconnect (sk,0 , skb->data[3 ], skb->data[4 ]); -rose_sk (sk)->neighbour->use--; +rose_neigh_put (rose_sk (sk)->neighbour); }return 0 ;
net/rose/rose_route.c +38 -24
147 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.