commit: 39c60e26cf9b140173075799b67ca1bbce88f1a9 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Sat Jan 23 16:38:32 2021 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Sat Jan 23 16:38:32 2021 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=39c60e26
Linux patch 5.10.10 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1009_linux-5.10.10.patch | 1406 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1410 insertions(+) diff --git a/0000_README b/0000_README index e4c8bac..4ad6d69 100644 --- a/0000_README +++ b/0000_README @@ -79,6 +79,10 @@ Patch: 1008_linux-5.10.9.patch From: http://www.kernel.org Desc: Linux 5.10.9 +Patch: 1009_linux-5.10.10.patch +From: http://www.kernel.org +Desc: Linux 5.10.10 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1009_linux-5.10.10.patch b/1009_linux-5.10.10.patch new file mode 100644 index 0000000..70f7173 --- /dev/null +++ b/1009_linux-5.10.10.patch @@ -0,0 +1,1406 @@ +diff --git a/Documentation/devicetree/bindings/net/renesas,etheravb.yaml b/Documentation/devicetree/bindings/net/renesas,etheravb.yaml +index 244befb6402aa..de9dd574a2f95 100644 +--- a/Documentation/devicetree/bindings/net/renesas,etheravb.yaml ++++ b/Documentation/devicetree/bindings/net/renesas,etheravb.yaml +@@ -163,6 +163,7 @@ allOf: + enum: + - renesas,etheravb-r8a774a1 + - renesas,etheravb-r8a774b1 ++ - renesas,etheravb-r8a774e1 + - renesas,etheravb-r8a7795 + - renesas,etheravb-r8a7796 + - renesas,etheravb-r8a77961 +diff --git a/Makefile b/Makefile +index 1572ebd192a93..7d86ad6ad36cc 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 10 +-SUBLEVEL = 9 ++SUBLEVEL = 10 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c +index e04d90af4c27c..6fb8cb7b9bcc6 100644 +--- a/arch/x86/hyperv/hv_init.c ++++ b/arch/x86/hyperv/hv_init.c +@@ -312,6 +312,25 @@ static struct syscore_ops hv_syscore_ops = { + .resume = hv_resume, + }; + ++static void (* __initdata old_setup_percpu_clockev)(void); ++ ++static void __init hv_stimer_setup_percpu_clockev(void) ++{ ++ /* ++ * Ignore any errors in setting up stimer clockevents ++ * as we can run with the LAPIC timer as a fallback. ++ */ ++ (void)hv_stimer_alloc(); ++ ++ /* ++ * Still register the LAPIC timer, because the direct-mode STIMER is ++ * not supported by old versions of Hyper-V. This also allows users ++ * to switch to LAPIC timer via /sys, if they want to. ++ */ ++ if (old_setup_percpu_clockev) ++ old_setup_percpu_clockev(); ++} ++ + /* + * This function is to be invoked early in the boot sequence after the + * hypervisor has been detected. +@@ -390,10 +409,14 @@ void __init hyperv_init(void) + wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); + + /* +- * Ignore any errors in setting up stimer clockevents +- * as we can run with the LAPIC timer as a fallback. ++ * hyperv_init() is called before LAPIC is initialized: see ++ * apic_intr_mode_init() -> x86_platform.apic_post_init() and ++ * apic_bsp_setup() -> setup_local_APIC(). The direct-mode STIMER ++ * depends on LAPIC, so hv_stimer_alloc() should be called from ++ * x86_init.timers.setup_percpu_clockev. + */ +- (void)hv_stimer_alloc(); ++ old_setup_percpu_clockev = x86_init.timers.setup_percpu_clockev; ++ x86_init.timers.setup_percpu_clockev = hv_stimer_setup_percpu_clockev; + + hv_apic_init(); + +diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c +index 8892908ad58ce..788a4ba1e2e74 100644 +--- a/crypto/asymmetric_keys/public_key.c ++++ b/crypto/asymmetric_keys/public_key.c +@@ -356,7 +356,8 @@ int public_key_verify_signature(const struct public_key *pkey, + if (ret) + goto error_free_key; + +- if (strcmp(sig->pkey_algo, "sm2") == 0 && sig->data_size) { ++ if (sig->pkey_algo && strcmp(sig->pkey_algo, "sm2") == 0 && ++ sig->data_size) { + ret = cert_sig_digest_update(sig, tfm); + if (ret) + goto error_free_key; +diff --git a/drivers/gpu/drm/amd/display/Kconfig b/drivers/gpu/drm/amd/display/Kconfig +index 60dfdd432aba0..3c410d236c491 100644 +--- a/drivers/gpu/drm/amd/display/Kconfig ++++ b/drivers/gpu/drm/amd/display/Kconfig +@@ -6,7 +6,7 @@ config DRM_AMD_DC + bool "AMD DC - Enable new display engine" + default y + select SND_HDA_COMPONENT if SND_HDA_CORE +- select DRM_AMD_DC_DCN if (X86 || PPC64 || (ARM64 && KERNEL_MODE_NEON)) && !(KCOV_INSTRUMENT_ALL && KCOV_ENABLE_COMPARISONS) ++ select DRM_AMD_DC_DCN if (X86 || PPC64) && !(KCOV_INSTRUMENT_ALL && KCOV_ENABLE_COMPARISONS) + help + Choose this option if you want to use the new display engine + support for AMDGPU. This adds required support for Vega and +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +index 64f515d744103..4674aca8f2069 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +@@ -33,10 +33,6 @@ ifdef CONFIG_PPC64 + calcs_ccflags := -mhard-float -maltivec + endif + +-ifdef CONFIG_ARM64 +-calcs_rcflags := -mgeneral-regs-only +-endif +- + ifdef CONFIG_CC_IS_GCC + ifeq ($(call cc-ifversion, -lt, 0701, y), y) + IS_OLD_GCC = 1 +@@ -57,9 +53,6 @@ endif + CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calcs.o := $(calcs_ccflags) + CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calc_auto.o := $(calcs_ccflags) + CFLAGS_$(AMDDALPATH)/dc/calcs/dcn_calc_math.o := $(calcs_ccflags) -Wno-tautological-compare +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calcs.o := $(calcs_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calc_auto.o := $(calcs_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/calcs/dcn_calc_math.o := $(calcs_rcflags) + + BW_CALCS = dce_calcs.o bw_fixed.o custom_float.o + +diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile +index 1a495759a0343..52b1ce775a1e8 100644 +--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile +@@ -104,13 +104,6 @@ ifdef CONFIG_PPC64 + CFLAGS_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := $(call cc-option,-mno-gnu-attribute) + endif + +-# prevent build errors: +-# ...: '-mgeneral-regs-only' is incompatible with the use of floating-point types +-# this file is unused on arm64, just like on ppc64 +-ifdef CONFIG_ARM64 +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := -mgeneral-regs-only +-endif +- + AMD_DAL_CLK_MGR_DCN21 = $(addprefix $(AMDDALPATH)/dc/clk_mgr/dcn21/,$(CLK_MGR_DCN21)) + + AMD_DISPLAY_FILES += $(AMD_DAL_CLK_MGR_DCN21) +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile +index 733e6e6e43bd6..62ad1a11bff9c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile +@@ -31,11 +31,4 @@ DCN10 = dcn10_init.o dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \ + + AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10)) + +-# fix: +-# ...: '-mgeneral-regs-only' is incompatible with the use of floating-point types +-# aarch64 does not support soft-float, so use hard-float and handle this in code +-ifdef CONFIG_ARM64 +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn10/dcn10_resource.o := -mgeneral-regs-only +-endif +- + AMD_DISPLAY_FILES += $(AMD_DAL_DCN10) +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +index a78712caf1244..462d3d981ea5e 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +@@ -1339,47 +1339,6 @@ static uint32_t read_pipe_fuses(struct dc_context *ctx) + return value; + } + +-/* +- * Some architectures don't support soft-float (e.g. aarch64), on those +- * this function has to be called with hardfloat enabled, make sure not +- * to inline it so whatever fp stuff is done stays inside +- */ +-static noinline void dcn10_resource_construct_fp( +- struct dc *dc) +-{ +- if (dc->ctx->dce_version == DCN_VERSION_1_01) { +- struct dcn_soc_bounding_box *dcn_soc = dc->dcn_soc; +- struct dcn_ip_params *dcn_ip = dc->dcn_ip; +- struct display_mode_lib *dml = &dc->dml; +- +- dml->ip.max_num_dpp = 3; +- /* TODO how to handle 23.84? */ +- dcn_soc->dram_clock_change_latency = 23; +- dcn_ip->max_num_dpp = 3; +- } +- if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { +- dc->dcn_soc->urgent_latency = 3; +- dc->debug.disable_dmcu = true; +- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 41.60f; +- } +- +- +- dc->dcn_soc->number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width; +- ASSERT(dc->dcn_soc->number_of_channels < 3); +- if (dc->dcn_soc->number_of_channels == 0)/*old sbios bug*/ +- dc->dcn_soc->number_of_channels = 2; +- +- if (dc->dcn_soc->number_of_channels == 1) { +- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 19.2f; +- dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = 17.066f; +- dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = 14.933f; +- dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 12.8f; +- if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { +- dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 20.80f; +- } +- } +-} +- + static bool dcn10_resource_construct( + uint8_t num_virtual_links, + struct dc *dc, +@@ -1531,15 +1490,37 @@ static bool dcn10_resource_construct( + memcpy(dc->dcn_ip, &dcn10_ip_defaults, sizeof(dcn10_ip_defaults)); + memcpy(dc->dcn_soc, &dcn10_soc_defaults, sizeof(dcn10_soc_defaults)); + +-#if defined(CONFIG_ARM64) +- /* Aarch64 does not support -msoft-float/-mfloat-abi=soft */ +- DC_FP_START(); +- dcn10_resource_construct_fp(dc); +- DC_FP_END(); +-#else +- /* Other architectures we build for build this with soft-float */ +- dcn10_resource_construct_fp(dc); +-#endif ++ if (dc->ctx->dce_version == DCN_VERSION_1_01) { ++ struct dcn_soc_bounding_box *dcn_soc = dc->dcn_soc; ++ struct dcn_ip_params *dcn_ip = dc->dcn_ip; ++ struct display_mode_lib *dml = &dc->dml; ++ ++ dml->ip.max_num_dpp = 3; ++ /* TODO how to handle 23.84? */ ++ dcn_soc->dram_clock_change_latency = 23; ++ dcn_ip->max_num_dpp = 3; ++ } ++ if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { ++ dc->dcn_soc->urgent_latency = 3; ++ dc->debug.disable_dmcu = true; ++ dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 41.60f; ++ } ++ ++ ++ dc->dcn_soc->number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width; ++ ASSERT(dc->dcn_soc->number_of_channels < 3); ++ if (dc->dcn_soc->number_of_channels == 0)/*old sbios bug*/ ++ dc->dcn_soc->number_of_channels = 2; ++ ++ if (dc->dcn_soc->number_of_channels == 1) { ++ dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 19.2f; ++ dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = 17.066f; ++ dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = 14.933f; ++ dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 12.8f; ++ if (ASICREV_IS_RV1_F0(dc->ctx->asic_id.hw_internal_rev)) { ++ dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = 20.80f; ++ } ++ } + + pool->base.pp_smu = dcn10_pp_smu_create(ctx); + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile +index 624cb1341ef14..5fcaf78334ff9 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile +@@ -17,10 +17,6 @@ ifdef CONFIG_PPC64 + CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mhard-float -maltivec + endif + +-ifdef CONFIG_ARM64 +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mgeneral-regs-only +-endif +- + ifdef CONFIG_CC_IS_GCC + ifeq ($(call cc-ifversion, -lt, 0701, y), y) + IS_OLD_GCC = 1 +diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile +index 51a2f3d4c194b..07684d3e375ab 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile +@@ -13,10 +13,6 @@ ifdef CONFIG_PPC64 + CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mhard-float -maltivec + endif + +-ifdef CONFIG_ARM64 +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mgeneral-regs-only +-endif +- + ifdef CONFIG_CC_IS_GCC + ifeq ($(call cc-ifversion, -lt, 0701, y), y) + IS_OLD_GCC = 1 +diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile +index dbc7e2abe3795..417331438c306 100644 +--- a/drivers/gpu/drm/amd/display/dc/dml/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile +@@ -33,10 +33,6 @@ ifdef CONFIG_PPC64 + dml_ccflags := -mhard-float -maltivec + endif + +-ifdef CONFIG_ARM64 +-dml_rcflags := -mgeneral-regs-only +-endif +- + ifdef CONFIG_CC_IS_GCC + ifeq ($(call cc-ifversion, -lt, 0701, y), y) + IS_OLD_GCC = 1 +@@ -64,13 +60,6 @@ CFLAGS_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20v2.o := $(dml_ccflags) + CFLAGS_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20v2.o := $(dml_ccflags) + CFLAGS_$(AMDDALPATH)/dc/dml/dcn21/display_mode_vba_21.o := $(dml_ccflags) + CFLAGS_$(AMDDALPATH)/dc/dml/dcn21/display_rq_dlg_calc_21.o := $(dml_ccflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_mode_vba.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_mode_vba_20v2.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn20/display_rq_dlg_calc_20v2.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn21/display_mode_vba_21.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dcn21/display_rq_dlg_calc_21.o := $(dml_rcflags) + endif + ifdef CONFIG_DRM_AMD_DC_DCN3_0 + CFLAGS_$(AMDDALPATH)/dc/dml/dcn30/display_mode_vba_30.o := $(dml_ccflags) -Wframe-larger-than=2048 +@@ -78,8 +67,6 @@ CFLAGS_$(AMDDALPATH)/dc/dml/dcn30/display_rq_dlg_calc_30.o := $(dml_ccflags) + endif + CFLAGS_$(AMDDALPATH)/dc/dml/dml1_display_rq_dlg_calc.o := $(dml_ccflags) + CFLAGS_$(AMDDALPATH)/dc/dml/display_rq_dlg_helpers.o := $(dml_ccflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/dml1_display_rq_dlg_calc.o := $(dml_rcflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml/display_rq_dlg_helpers.o := $(dml_rcflags) + + DML = display_mode_lib.o display_rq_dlg_helpers.o dml1_display_rq_dlg_calc.o \ + +diff --git a/drivers/gpu/drm/amd/display/dc/dsc/Makefile b/drivers/gpu/drm/amd/display/dc/dsc/Makefile +index f2624a1156e5c..ea29cf95d470b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dsc/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dsc/Makefile +@@ -10,10 +10,6 @@ ifdef CONFIG_PPC64 + dsc_ccflags := -mhard-float -maltivec + endif + +-ifdef CONFIG_ARM64 +-dsc_rcflags := -mgeneral-regs-only +-endif +- + ifdef CONFIG_CC_IS_GCC + ifeq ($(call cc-ifversion, -lt, 0701, y), y) + IS_OLD_GCC = 1 +@@ -32,7 +28,6 @@ endif + endif + + CFLAGS_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_ccflags) +-CFLAGS_REMOVE_$(AMDDALPATH)/dc/dsc/rc_calc.o := $(dsc_rcflags) + + DSC = dc_dsc.o rc_calc.o rc_calc_dpi.o + +diff --git a/drivers/gpu/drm/amd/display/dc/os_types.h b/drivers/gpu/drm/amd/display/dc/os_types.h +index 95cb56929e79e..126c2f3a4dd3b 100644 +--- a/drivers/gpu/drm/amd/display/dc/os_types.h ++++ b/drivers/gpu/drm/amd/display/dc/os_types.h +@@ -55,10 +55,6 @@ + #include <asm/fpu/api.h> + #define DC_FP_START() kernel_fpu_begin() + #define DC_FP_END() kernel_fpu_end() +-#elif defined(CONFIG_ARM64) +-#include <asm/neon.h> +-#define DC_FP_START() kernel_neon_begin() +-#define DC_FP_END() kernel_neon_end() + #elif defined(CONFIG_PPC64) + #include <asm/switch_to.h> + #include <asm/cputable.h> +diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +index b6e377aa1131b..6ac1accade803 100644 +--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c ++++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +@@ -452,7 +452,7 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi) + dsi->lanes = 2; + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | +- MIPI_DSI_MODE_LPM; ++ MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS; + + drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs, + DRM_MODE_CONNECTOR_DSI); +diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +index 8a39be076e143..59de6b3b5f026 100644 +--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c ++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +@@ -1432,7 +1432,7 @@ mcp251xfd_handle_rxif_one(struct mcp251xfd_priv *priv, + else + skb = alloc_can_skb(priv->ndev, (struct can_frame **)&cfd); + +- if (!cfd) { ++ if (!skb) { + stats->rx_dropped++; + return 0; + } +diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h b/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h +index 92473dda55d9f..22a0220123ade 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h ++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h +@@ -40,6 +40,13 @@ + #define TCB_L2T_IX_M 0xfffULL + #define TCB_L2T_IX_V(x) ((x) << TCB_L2T_IX_S) + ++#define TCB_T_FLAGS_W 1 ++#define TCB_T_FLAGS_S 0 ++#define TCB_T_FLAGS_M 0xffffffffffffffffULL ++#define TCB_T_FLAGS_V(x) ((__u64)(x) << TCB_T_FLAGS_S) ++ ++#define TCB_FIELD_COOKIE_TFLAG 1 ++ + #define TCB_SMAC_SEL_W 0 + #define TCB_SMAC_SEL_S 24 + #define TCB_SMAC_SEL_M 0xffULL +diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h +index 2d3dfdd2a7163..a7c72fd2f024b 100644 +--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h ++++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h +@@ -573,7 +573,11 @@ int send_tx_flowc_wr(struct sock *sk, int compl, + void chtls_tcp_push(struct sock *sk, int flags); + int chtls_push_frames(struct chtls_sock *csk, int comp); + int chtls_set_tcb_tflag(struct sock *sk, unsigned int bit_pos, int val); ++void chtls_set_tcb_field_rpl_skb(struct sock *sk, u16 word, ++ u64 mask, u64 val, u8 cookie, ++ int through_l2t); + int chtls_setkey(struct chtls_sock *csk, u32 keylen, u32 mode, int cipher_type); ++void chtls_set_quiesce_ctrl(struct sock *sk, int val); + void skb_entail(struct sock *sk, struct sk_buff *skb, int flags); + unsigned int keyid_to_addr(int start_addr, int keyid); + void free_tls_keyid(struct sock *sk); +diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +index 07a956098e11f..5beec901713fb 100644 +--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c ++++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +@@ -32,6 +32,7 @@ + #include "chtls.h" + #include "chtls_cm.h" + #include "clip_tbl.h" ++#include "t4_tcb.h" + + /* + * State transitions and actions for close. Note that if we are in SYN_SENT +@@ -267,7 +268,9 @@ static void chtls_send_reset(struct sock *sk, int mode, struct sk_buff *skb) + if (sk->sk_state != TCP_SYN_RECV) + chtls_send_abort(sk, mode, skb); + else +- goto out; ++ chtls_set_tcb_field_rpl_skb(sk, TCB_T_FLAGS_W, ++ TCB_T_FLAGS_V(TCB_T_FLAGS_M), 0, ++ TCB_FIELD_COOKIE_TFLAG, 1); + + return; + out: +@@ -1948,6 +1951,8 @@ static void chtls_close_con_rpl(struct sock *sk, struct sk_buff *skb) + else if (tcp_sk(sk)->linger2 < 0 && + !csk_flag_nochk(csk, CSK_ABORT_SHUTDOWN)) + chtls_abort_conn(sk, skb); ++ else if (csk_flag_nochk(csk, CSK_TX_DATA_SENT)) ++ chtls_set_quiesce_ctrl(sk, 0); + break; + default: + pr_info("close_con_rpl in bad state %d\n", sk->sk_state); +@@ -2291,6 +2296,28 @@ static int chtls_wr_ack(struct chtls_dev *cdev, struct sk_buff *skb) + return 0; + } + ++static int chtls_set_tcb_rpl(struct chtls_dev *cdev, struct sk_buff *skb) ++{ ++ struct cpl_set_tcb_rpl *rpl = cplhdr(skb) + RSS_HDR; ++ unsigned int hwtid = GET_TID(rpl); ++ struct sock *sk; ++ ++ sk = lookup_tid(cdev->tids, hwtid); ++ ++ /* return EINVAL if socket doesn't exist */ ++ if (!sk) ++ return -EINVAL; ++ ++ /* Reusing the skb as size of cpl_set_tcb_field structure ++ * is greater than cpl_abort_req ++ */ ++ if (TCB_COOKIE_G(rpl->cookie) == TCB_FIELD_COOKIE_TFLAG) ++ chtls_send_abort(sk, CPL_ABORT_SEND_RST, NULL); ++ ++ kfree_skb(skb); ++ return 0; ++} ++ + chtls_handler_func chtls_handlers[NUM_CPL_CMDS] = { + [CPL_PASS_OPEN_RPL] = chtls_pass_open_rpl, + [CPL_CLOSE_LISTSRV_RPL] = chtls_close_listsrv_rpl, +@@ -2303,5 +2330,6 @@ chtls_handler_func chtls_handlers[NUM_CPL_CMDS] = { + [CPL_CLOSE_CON_RPL] = chtls_conn_cpl, + [CPL_ABORT_REQ_RSS] = chtls_conn_cpl, + [CPL_ABORT_RPL_RSS] = chtls_conn_cpl, +- [CPL_FW4_ACK] = chtls_wr_ack, ++ [CPL_FW4_ACK] = chtls_wr_ack, ++ [CPL_SET_TCB_RPL] = chtls_set_tcb_rpl, + }; +diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c +index a4fb463af22ac..1e67140b0f801 100644 +--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c ++++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c +@@ -88,6 +88,24 @@ static int chtls_set_tcb_field(struct sock *sk, u16 word, u64 mask, u64 val) + return ret < 0 ? ret : 0; + } + ++void chtls_set_tcb_field_rpl_skb(struct sock *sk, u16 word, ++ u64 mask, u64 val, u8 cookie, ++ int through_l2t) ++{ ++ struct sk_buff *skb; ++ unsigned int wrlen; ++ ++ wrlen = sizeof(struct cpl_set_tcb_field) + sizeof(struct ulptx_idata); ++ wrlen = roundup(wrlen, 16); ++ ++ skb = alloc_skb(wrlen, GFP_KERNEL | __GFP_NOFAIL); ++ if (!skb) ++ return; ++ ++ __set_tcb_field(sk, skb, word, mask, val, cookie, 0); ++ send_or_defer(sk, tcp_sk(sk), skb, through_l2t); ++} ++ + /* + * Set one of the t_flags bits in the TCB. + */ +@@ -113,6 +131,29 @@ static int chtls_set_tcb_quiesce(struct sock *sk, int val) + TF_RX_QUIESCE_V(val)); + } + ++void chtls_set_quiesce_ctrl(struct sock *sk, int val) ++{ ++ struct chtls_sock *csk; ++ struct sk_buff *skb; ++ unsigned int wrlen; ++ int ret; ++ ++ wrlen = sizeof(struct cpl_set_tcb_field) + sizeof(struct ulptx_idata); ++ wrlen = roundup(wrlen, 16); ++ ++ skb = alloc_skb(wrlen, GFP_ATOMIC); ++ if (!skb) ++ return; ++ ++ csk = rcu_dereference_sk_user_data(sk); ++ ++ __set_tcb_field(sk, skb, 1, TF_RX_QUIESCE_V(1), 0, 0, 1); ++ set_wr_txq(skb, CPL_PRIORITY_CONTROL, csk->port_id); ++ ret = cxgb4_ofld_send(csk->egress_dev, skb); ++ if (ret < 0) ++ kfree_skb(skb); ++} ++ + /* TLS Key bitmap processing */ + int chtls_init_kmap(struct chtls_dev *cdev, struct cxgb4_lld_info *lldi) + { +diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c +index e402c62eb3137..8557807b41717 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c +@@ -348,12 +348,12 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget) + * SBP is *not* set in PRT_SBPVSI (default not set). + */ + skb = i40e_construct_skb_zc(rx_ring, *bi); +- *bi = NULL; + if (!skb) { + rx_ring->rx_stats.alloc_buff_failed++; + break; + } + ++ *bi = NULL; + cleaned_count++; + i40e_inc_ntc(rx_ring); + +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +index 2dcdec3eacc36..d1f7b51cab620 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -5874,8 +5874,6 @@ static void mvpp2_phylink_validate(struct phylink_config *config, + + phylink_set(mask, Autoneg); + phylink_set_port_modes(mask); +- phylink_set(mask, Pause); +- phylink_set(mask, Asym_Pause); + + switch (state->interface) { + case PHY_INTERFACE_MODE_10GBASER: +diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +index 8fa286ccdd6bb..bf85ce9835d7f 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +@@ -19,7 +19,7 @@ + #define MLXSW_THERMAL_ASIC_TEMP_NORM 75000 /* 75C */ + #define MLXSW_THERMAL_ASIC_TEMP_HIGH 85000 /* 85C */ + #define MLXSW_THERMAL_ASIC_TEMP_HOT 105000 /* 105C */ +-#define MLXSW_THERMAL_ASIC_TEMP_CRIT 110000 /* 110C */ ++#define MLXSW_THERMAL_ASIC_TEMP_CRIT 140000 /* 140C */ + #define MLXSW_THERMAL_HYSTERESIS_TEMP 5000 /* 5C */ + #define MLXSW_THERMAL_MODULE_TEMP_SHIFT (MLXSW_THERMAL_HYSTERESIS_TEMP * 2) + #define MLXSW_THERMAL_ZONE_MAX_NAME 16 +@@ -176,6 +176,12 @@ mlxsw_thermal_module_trips_update(struct device *dev, struct mlxsw_core *core, + if (err) + return err; + ++ if (crit_temp > emerg_temp) { ++ dev_warn(dev, "%s : Critical threshold %d is above emergency threshold %d\n", ++ tz->tzdev->type, crit_temp, emerg_temp); ++ return 0; ++ } ++ + /* According to the system thermal requirements, the thermal zones are + * defined with four trip points. The critical and emergency + * temperature thresholds, provided by QSFP module are set as "active" +@@ -190,11 +196,8 @@ mlxsw_thermal_module_trips_update(struct device *dev, struct mlxsw_core *core, + tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temp = crit_temp; + tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temp = crit_temp; + tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temp = emerg_temp; +- if (emerg_temp > crit_temp) +- tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp + ++ tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp + + MLXSW_THERMAL_MODULE_TEMP_SHIFT; +- else +- tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp; + + return 0; + } +diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +index f21847739ef1f..d258e0ccf9465 100644 +--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c ++++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +@@ -564,11 +564,6 @@ static const struct net_device_ops netxen_netdev_ops = { + .ndo_set_features = netxen_set_features, + }; + +-static inline bool netxen_function_zero(struct pci_dev *pdev) +-{ +- return (PCI_FUNC(pdev->devfn) == 0) ? true : false; +-} +- + static inline void netxen_set_interrupt_mode(struct netxen_adapter *adapter, + u32 mode) + { +@@ -664,7 +659,7 @@ static int netxen_setup_intr(struct netxen_adapter *adapter) + netxen_initialize_interrupt_registers(adapter); + netxen_set_msix_bit(pdev, 0); + +- if (netxen_function_zero(pdev)) { ++ if (adapter->portnum == 0) { + if (!netxen_setup_msi_interrupts(adapter, num_msix)) + netxen_set_interrupt_mode(adapter, NETXEN_MSI_MODE); + else +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac5.c b/drivers/net/ethernet/stmicro/stmmac/dwmac5.c +index 67ba67ed0cb99..de5255b951e14 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac5.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac5.c +@@ -572,68 +572,24 @@ static int dwmac5_est_write(void __iomem *ioaddr, u32 reg, u32 val, bool gcl) + int dwmac5_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg, + unsigned int ptp_rate) + { +- u32 speed, total_offset, offset, ctrl, ctr_low; +- u32 extcfg = readl(ioaddr + GMAC_EXT_CONFIG); +- u32 mac_cfg = readl(ioaddr + GMAC_CONFIG); + int i, ret = 0x0; +- u64 total_ctr; +- +- if (extcfg & GMAC_CONFIG_EIPG_EN) { +- offset = (extcfg & GMAC_CONFIG_EIPG) >> GMAC_CONFIG_EIPG_SHIFT; +- offset = 104 + (offset * 8); +- } else { +- offset = (mac_cfg & GMAC_CONFIG_IPG) >> GMAC_CONFIG_IPG_SHIFT; +- offset = 96 - (offset * 8); +- } +- +- speed = mac_cfg & (GMAC_CONFIG_PS | GMAC_CONFIG_FES); +- speed = speed >> GMAC_CONFIG_FES_SHIFT; +- +- switch (speed) { +- case 0x0: +- offset = offset * 1000; /* 1G */ +- break; +- case 0x1: +- offset = offset * 400; /* 2.5G */ +- break; +- case 0x2: +- offset = offset * 100000; /* 10M */ +- break; +- case 0x3: +- offset = offset * 10000; /* 100M */ +- break; +- default: +- return -EINVAL; +- } +- +- offset = offset / 1000; ++ u32 ctrl; + + ret |= dwmac5_est_write(ioaddr, BTR_LOW, cfg->btr[0], false); + ret |= dwmac5_est_write(ioaddr, BTR_HIGH, cfg->btr[1], false); + ret |= dwmac5_est_write(ioaddr, TER, cfg->ter, false); + ret |= dwmac5_est_write(ioaddr, LLR, cfg->gcl_size, false); ++ ret |= dwmac5_est_write(ioaddr, CTR_LOW, cfg->ctr[0], false); ++ ret |= dwmac5_est_write(ioaddr, CTR_HIGH, cfg->ctr[1], false); + if (ret) + return ret; + +- total_offset = 0; + for (i = 0; i < cfg->gcl_size; i++) { +- ret = dwmac5_est_write(ioaddr, i, cfg->gcl[i] + offset, true); ++ ret = dwmac5_est_write(ioaddr, i, cfg->gcl[i], true); + if (ret) + return ret; +- +- total_offset += offset; + } + +- total_ctr = cfg->ctr[0] + cfg->ctr[1] * 1000000000ULL; +- total_ctr += total_offset; +- +- ctr_low = do_div(total_ctr, 1000000000); +- +- ret |= dwmac5_est_write(ioaddr, CTR_LOW, ctr_low, false); +- ret |= dwmac5_est_write(ioaddr, CTR_HIGH, total_ctr, false); +- if (ret) +- return ret; +- + ctrl = readl(ioaddr + MTL_EST_CONTROL); + ctrl &= ~PTOV; + ctrl |= ((1000000000 / ptp_rate) * 6) << PTOV_SHIFT; +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index c33db79cdd0ad..b3d6d8e3f4de9 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -2158,7 +2158,7 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan) + spin_lock_irqsave(&ch->lock, flags); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 0); + spin_unlock_irqrestore(&ch->lock, flags); +- __napi_schedule_irqoff(&ch->rx_napi); ++ __napi_schedule(&ch->rx_napi); + } + } + +@@ -2167,7 +2167,7 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan) + spin_lock_irqsave(&ch->lock, flags); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 0, 1); + spin_unlock_irqrestore(&ch->lock, flags); +- __napi_schedule_irqoff(&ch->tx_napi); ++ __napi_schedule(&ch->tx_napi); + } + } + +@@ -3996,6 +3996,7 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu) + { + struct stmmac_priv *priv = netdev_priv(dev); + int txfifosz = priv->plat->tx_fifo_size; ++ const int mtu = new_mtu; + + if (txfifosz == 0) + txfifosz = priv->dma_cap.tx_fifo_size; +@@ -4013,7 +4014,7 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu) + if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB)) + return -EINVAL; + +- dev->mtu = new_mtu; ++ dev->mtu = mtu; + + netdev_update_features(dev); + +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +index cc27d660a8185..06553d028d746 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +@@ -605,7 +605,8 @@ static int tc_setup_taprio(struct stmmac_priv *priv, + { + u32 size, wid = priv->dma_cap.estwid, dep = priv->dma_cap.estdep; + struct plat_stmmacenet_data *plat = priv->plat; +- struct timespec64 time; ++ struct timespec64 time, current_time; ++ ktime_t current_time_ns; + bool fpe = false; + int i, ret = 0; + u64 ctr; +@@ -700,7 +701,22 @@ static int tc_setup_taprio(struct stmmac_priv *priv, + } + + /* Adjust for real system time */ +- time = ktime_to_timespec64(qopt->base_time); ++ priv->ptp_clock_ops.gettime64(&priv->ptp_clock_ops, ¤t_time); ++ current_time_ns = timespec64_to_ktime(current_time); ++ if (ktime_after(qopt->base_time, current_time_ns)) { ++ time = ktime_to_timespec64(qopt->base_time); ++ } else { ++ ktime_t base_time; ++ s64 n; ++ ++ n = div64_s64(ktime_sub_ns(current_time_ns, qopt->base_time), ++ qopt->cycle_time); ++ base_time = ktime_add_ns(qopt->base_time, ++ (n + 1) * qopt->cycle_time); ++ ++ time = ktime_to_timespec64(base_time); ++ } ++ + priv->plat->est->btr[0] = (u32)time.tv_nsec; + priv->plat->est->btr[1] = (u32)time.tv_sec; + +diff --git a/drivers/net/ipa/ipa_modem.c b/drivers/net/ipa/ipa_modem.c +index e34fe2d77324e..9b08eb8239846 100644 +--- a/drivers/net/ipa/ipa_modem.c ++++ b/drivers/net/ipa/ipa_modem.c +@@ -216,6 +216,7 @@ int ipa_modem_start(struct ipa *ipa) + ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]->netdev = netdev; + ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]->netdev = netdev; + ++ SET_NETDEV_DEV(netdev, &ipa->pdev->dev); + priv = netdev_priv(netdev); + priv->ipa = ipa; + +diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c +index 0fc39ac5ca88b..10722fed666de 100644 +--- a/drivers/net/phy/smsc.c ++++ b/drivers/net/phy/smsc.c +@@ -284,7 +284,8 @@ static int smsc_phy_probe(struct phy_device *phydev) + /* Make clk optional to keep DTB backward compatibility. */ + priv->refclk = clk_get_optional(dev, NULL); + if (IS_ERR(priv->refclk)) +- dev_err_probe(dev, PTR_ERR(priv->refclk), "Failed to request clock\n"); ++ return dev_err_probe(dev, PTR_ERR(priv->refclk), ++ "Failed to request clock\n"); + + ret = clk_prepare_enable(priv->refclk); + if (ret) +diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c +index 6fa7a009a24a4..f9b359d4e2939 100644 +--- a/drivers/net/usb/rndis_host.c ++++ b/drivers/net/usb/rndis_host.c +@@ -387,7 +387,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) + reply_len = sizeof *phym; + retval = rndis_query(dev, intf, u.buf, + RNDIS_OID_GEN_PHYSICAL_MEDIUM, +- 0, (void **) &phym, &reply_len); ++ reply_len, (void **)&phym, &reply_len); + if (retval != 0 || !phym) { + /* OID is optional so don't fail here. */ + phym_unspec = cpu_to_le32(RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED); +diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c +index 70467b9d61baa..a3afd1b9ac567 100644 +--- a/drivers/spi/spi-cadence.c ++++ b/drivers/spi/spi-cadence.c +@@ -115,6 +115,7 @@ struct cdns_spi { + void __iomem *regs; + struct clk *ref_clk; + struct clk *pclk; ++ unsigned int clk_rate; + u32 speed_hz; + const u8 *txbuf; + u8 *rxbuf; +@@ -250,7 +251,7 @@ static void cdns_spi_config_clock_freq(struct spi_device *spi, + u32 ctrl_reg, baud_rate_val; + unsigned long frequency; + +- frequency = clk_get_rate(xspi->ref_clk); ++ frequency = xspi->clk_rate; + + ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); + +@@ -558,8 +559,9 @@ static int cdns_spi_probe(struct platform_device *pdev) + master->auto_runtime_pm = true; + master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; + ++ xspi->clk_rate = clk_get_rate(xspi->ref_clk); + /* Set to default valid value */ +- master->max_speed_hz = clk_get_rate(xspi->ref_clk) / 4; ++ master->max_speed_hz = xspi->clk_rate / 4; + xspi->speed_hz = master->max_speed_hz; + + master->bits_per_word_mask = SPI_BPW_MASK(8); +diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c +index 9494257e1c33f..6d8e0a05a5355 100644 +--- a/drivers/spi/spi-fsl-spi.c ++++ b/drivers/spi/spi-fsl-spi.c +@@ -115,14 +115,13 @@ static void fsl_spi_chipselect(struct spi_device *spi, int value) + { + struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); + struct fsl_spi_platform_data *pdata; +- bool pol = spi->mode & SPI_CS_HIGH; + struct spi_mpc8xxx_cs *cs = spi->controller_state; + + pdata = spi->dev.parent->parent->platform_data; + + if (value == BITBANG_CS_INACTIVE) { + if (pdata->cs_control) +- pdata->cs_control(spi, !pol); ++ pdata->cs_control(spi, false); + } + + if (value == BITBANG_CS_ACTIVE) { +@@ -134,7 +133,7 @@ static void fsl_spi_chipselect(struct spi_device *spi, int value) + fsl_spi_change_mode(spi); + + if (pdata->cs_control) +- pdata->cs_control(spi, pol); ++ pdata->cs_control(spi, true); + } + } + +diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c +index 2277f83da2501..716566da400e1 100644 +--- a/fs/nfsd/nfs3xdr.c ++++ b/fs/nfsd/nfs3xdr.c +@@ -863,9 +863,14 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp, + if (isdotent(name, namlen)) { + if (namlen == 2) { + dchild = dget_parent(dparent); +- /* filesystem root - cannot return filehandle for ".." */ ++ /* ++ * Don't return filehandle for ".." if we're at ++ * the filesystem or export root: ++ */ + if (dchild == dparent) + goto out; ++ if (dparent == exp->ex_path.dentry) ++ goto out; + } else + dchild = dget(dparent); + } else +diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c +index 6ec088a96302f..96555a8a2c545 100644 +--- a/kernel/bpf/cgroup.c ++++ b/kernel/bpf/cgroup.c +@@ -1391,12 +1391,13 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level, + if (ctx.optlen != 0) { + *optlen = ctx.optlen; + *kernel_optval = ctx.optval; ++ /* export and don't free sockopt buf */ ++ return 0; + } + } + + out: +- if (ret) +- sockopt_free_buf(&ctx); ++ sockopt_free_buf(&ctx); + return ret; + } + +diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c +index deda1185237b8..c489430cac78c 100644 +--- a/kernel/bpf/helpers.c ++++ b/kernel/bpf/helpers.c +@@ -108,7 +108,7 @@ BPF_CALL_2(bpf_map_peek_elem, struct bpf_map *, map, void *, value) + } + + const struct bpf_func_proto bpf_map_peek_elem_proto = { +- .func = bpf_map_pop_elem, ++ .func = bpf_map_peek_elem, + .gpl_only = false, + .ret_type = RET_INTEGER, + .arg1_type = ARG_CONST_MAP_PTR, +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index 53fe6ef6d931f..618cb1b451ade 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -2214,6 +2214,8 @@ static bool is_spillable_regtype(enum bpf_reg_type type) + case PTR_TO_RDWR_BUF: + case PTR_TO_RDWR_BUF_OR_NULL: + case PTR_TO_PERCPU_BTF_ID: ++ case PTR_TO_MEM: ++ case PTR_TO_MEM_OR_NULL: + return true; + default: + return false; +@@ -5255,7 +5257,7 @@ static bool signed_add_overflows(s64 a, s64 b) + return res < a; + } + +-static bool signed_add32_overflows(s64 a, s64 b) ++static bool signed_add32_overflows(s32 a, s32 b) + { + /* Do the add in u32, where overflow is well-defined */ + s32 res = (s32)((u32)a + (u32)b); +@@ -5265,7 +5267,7 @@ static bool signed_add32_overflows(s64 a, s64 b) + return res < a; + } + +-static bool signed_sub_overflows(s32 a, s32 b) ++static bool signed_sub_overflows(s64 a, s64 b) + { + /* Do the sub in u64, where overflow is well-defined */ + s64 res = (s64)((u64)a - (u64)b); +@@ -5277,7 +5279,7 @@ static bool signed_sub_overflows(s32 a, s32 b) + + static bool signed_sub32_overflows(s32 a, s32 b) + { +- /* Do the sub in u64, where overflow is well-defined */ ++ /* Do the sub in u32, where overflow is well-defined */ + s32 res = (s32)((u32)a - (u32)b); + + if (b < 0) +diff --git a/net/core/skbuff.c b/net/core/skbuff.c +index fbadd93b95ace..f0d6dba37b43d 100644 +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -496,13 +496,17 @@ EXPORT_SYMBOL(__netdev_alloc_skb); + struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + gfp_t gfp_mask) + { +- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); ++ struct napi_alloc_cache *nc; + struct sk_buff *skb; + void *data; + + len += NET_SKB_PAD + NET_IP_ALIGN; + +- if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) || ++ /* If requested length is either too small or too big, ++ * we use kmalloc() for skb->head allocation. ++ */ ++ if (len <= SKB_WITH_OVERHEAD(1024) || ++ len > SKB_WITH_OVERHEAD(PAGE_SIZE) || + (gfp_mask & (__GFP_DIRECT_RECLAIM | GFP_DMA))) { + skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE); + if (!skb) +@@ -510,6 +514,7 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + goto skb_success; + } + ++ nc = this_cpu_ptr(&napi_alloc_cache); + len += SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + len = SKB_DATA_ALIGN(len); + +@@ -3648,7 +3653,8 @@ struct sk_buff *skb_segment_list(struct sk_buff *skb, + unsigned int delta_truesize = 0; + unsigned int delta_len = 0; + struct sk_buff *tail = NULL; +- struct sk_buff *nskb; ++ struct sk_buff *nskb, *tmp; ++ int err; + + skb_push(skb, -skb_network_offset(skb) + offset); + +@@ -3658,11 +3664,28 @@ struct sk_buff *skb_segment_list(struct sk_buff *skb, + nskb = list_skb; + list_skb = list_skb->next; + ++ err = 0; ++ if (skb_shared(nskb)) { ++ tmp = skb_clone(nskb, GFP_ATOMIC); ++ if (tmp) { ++ consume_skb(nskb); ++ nskb = tmp; ++ err = skb_unclone(nskb, GFP_ATOMIC); ++ } else { ++ err = -ENOMEM; ++ } ++ } ++ + if (!tail) + skb->next = nskb; + else + tail->next = nskb; + ++ if (unlikely(err)) { ++ nskb->next = list_skb; ++ goto err_linearize; ++ } ++ + tail = nskb; + + delta_len += nskb->len; +diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c +index bbdd3c7b6cb5b..b065f0a103ed0 100644 +--- a/net/core/sock_reuseport.c ++++ b/net/core/sock_reuseport.c +@@ -293,7 +293,7 @@ select_by_hash: + i = j = reciprocal_scale(hash, socks); + while (reuse->socks[i]->sk_state == TCP_ESTABLISHED) { + i++; +- if (i >= reuse->num_socks) ++ if (i >= socks) + i = 0; + if (i == j) + goto out; +diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c +index 16014ad194066..a352ce4f878a3 100644 +--- a/net/dcb/dcbnl.c ++++ b/net/dcb/dcbnl.c +@@ -1765,6 +1765,8 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, + fn = &reply_funcs[dcb->cmd]; + if (!fn->cb) + return -EOPNOTSUPP; ++ if (fn->type == RTM_SETDCB && !netlink_capable(skb, CAP_NET_ADMIN)) ++ return -EPERM; + + if (!tb[DCB_ATTR_IFNAME]) + return -EINVAL; +diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c +index 183003e45762a..a47e0f9b20d0a 100644 +--- a/net/dsa/dsa2.c ++++ b/net/dsa/dsa2.c +@@ -353,9 +353,13 @@ static int dsa_port_devlink_setup(struct dsa_port *dp) + + static void dsa_port_teardown(struct dsa_port *dp) + { ++ struct devlink_port *dlp = &dp->devlink_port; ++ + if (!dp->setup) + return; + ++ devlink_port_type_clear(dlp); ++ + switch (dp->type) { + case DSA_PORT_TYPE_UNUSED: + break; +diff --git a/net/dsa/master.c b/net/dsa/master.c +index c91de041a91d8..3a44da35dfeba 100644 +--- a/net/dsa/master.c ++++ b/net/dsa/master.c +@@ -308,8 +308,18 @@ static struct lock_class_key dsa_master_addr_list_lock_key; + + int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp) + { ++ struct dsa_switch *ds = cpu_dp->ds; ++ struct device_link *consumer_link; + int ret; + ++ /* The DSA master must use SET_NETDEV_DEV for this to work. */ ++ consumer_link = device_link_add(ds->dev, dev->dev.parent, ++ DL_FLAG_AUTOREMOVE_CONSUMER); ++ if (!consumer_link) ++ netdev_err(dev, ++ "Failed to create a device link to DSA switch %s\n", ++ dev_name(ds->dev)); ++ + rtnl_lock(); + ret = dev_set_mtu(dev, ETH_DATA_LEN + cpu_dp->tag_ops->overhead); + rtnl_unlock(); +diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c +index 8b07f3a4f2db2..a3271ec3e1627 100644 +--- a/net/ipv4/esp4.c ++++ b/net/ipv4/esp4.c +@@ -443,7 +443,6 @@ static int esp_output_encap(struct xfrm_state *x, struct sk_buff *skb, + int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *esp) + { + u8 *tail; +- u8 *vaddr; + int nfrags; + int esph_offset; + struct page *page; +@@ -485,14 +484,10 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * + page = pfrag->page; + get_page(page); + +- vaddr = kmap_atomic(page); +- +- tail = vaddr + pfrag->offset; ++ tail = page_address(page) + pfrag->offset; + + esp_output_fill_trailer(tail, esp->tfclen, esp->plen, esp->proto); + +- kunmap_atomic(vaddr); +- + nfrags = skb_shinfo(skb)->nr_frags; + + __skb_fill_page_desc(skb, nfrags, page, pfrag->offset, +diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c +index 52c2f063529fb..2b804fcebcc65 100644 +--- a/net/ipv6/esp6.c ++++ b/net/ipv6/esp6.c +@@ -478,7 +478,6 @@ static int esp6_output_encap(struct xfrm_state *x, struct sk_buff *skb, + int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *esp) + { + u8 *tail; +- u8 *vaddr; + int nfrags; + int esph_offset; + struct page *page; +@@ -519,14 +518,10 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info + page = pfrag->page; + get_page(page); + +- vaddr = kmap_atomic(page); +- +- tail = vaddr + pfrag->offset; ++ tail = page_address(page) + pfrag->offset; + + esp_output_fill_trailer(tail, esp->tfclen, esp->plen, esp->proto); + +- kunmap_atomic(vaddr); +- + nfrags = skb_shinfo(skb)->nr_frags; + + __skb_fill_page_desc(skb, nfrags, page, pfrag->offset, +diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c +index 749ad72386b23..077d43af8226b 100644 +--- a/net/ipv6/ip6_output.c ++++ b/net/ipv6/ip6_output.c +@@ -125,8 +125,43 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff * + return -EINVAL; + } + ++static int ++ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk, ++ struct sk_buff *skb, unsigned int mtu) ++{ ++ struct sk_buff *segs, *nskb; ++ netdev_features_t features; ++ int ret = 0; ++ ++ /* Please see corresponding comment in ip_finish_output_gso ++ * describing the cases where GSO segment length exceeds the ++ * egress MTU. ++ */ ++ features = netif_skb_features(skb); ++ segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); ++ if (IS_ERR_OR_NULL(segs)) { ++ kfree_skb(skb); ++ return -ENOMEM; ++ } ++ ++ consume_skb(skb); ++ ++ skb_list_walk_safe(segs, segs, nskb) { ++ int err; ++ ++ skb_mark_not_on_list(segs); ++ err = ip6_fragment(net, sk, segs, ip6_finish_output2); ++ if (err && ret == 0) ++ ret = err; ++ } ++ ++ return ret; ++} ++ + static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) + { ++ unsigned int mtu; ++ + #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) + /* Policy lookup after SNAT yielded a new policy */ + if (skb_dst(skb)->xfrm) { +@@ -135,7 +170,11 @@ static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff + } + #endif + +- if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || ++ mtu = ip6_skb_dst_mtu(skb); ++ if (skb_is_gso(skb) && !skb_gso_validate_network_len(skb, mtu)) ++ return ip6_finish_output_gso_slowpath_drop(net, sk, skb, mtu); ++ ++ if ((skb->len > mtu && !skb_is_gso(skb)) || + dst_allfrag(skb_dst(skb)) || + (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size)) + return ip6_fragment(net, sk, skb, ip6_finish_output2); +diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c +index 5e7983cb61546..ff048cb8d8074 100644 +--- a/net/ipv6/sit.c ++++ b/net/ipv6/sit.c +@@ -1645,8 +1645,11 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev, + } + + #ifdef CONFIG_IPV6_SIT_6RD +- if (ipip6_netlink_6rd_parms(data, &ip6rd)) ++ if (ipip6_netlink_6rd_parms(data, &ip6rd)) { + err = ipip6_tunnel_update_6rd(nt, &ip6rd); ++ if (err < 0) ++ unregister_netdevice_queue(dev, NULL); ++ } + #endif + + return err; +diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c +index 56a4d0d20a267..ca1e9de388910 100644 +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -662,7 +662,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) + if (!skip_hw && tx->key && + tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) + info->control.hw_key = &tx->key->conf; +- } else if (!ieee80211_is_mgmt(hdr->frame_control) && tx->sta && ++ } else if (ieee80211_is_data_present(hdr->frame_control) && tx->sta && + test_sta_flag(tx->sta, WLAN_STA_USES_ENCRYPTION)) { + return TX_DROP; + } +@@ -3836,7 +3836,7 @@ void __ieee80211_schedule_txq(struct ieee80211_hw *hw, + * get immediately moved to the back of the list on the next + * call to ieee80211_next_txq(). + */ +- if (txqi->txq.sta && ++ if (txqi->txq.sta && local->airtime_flags && + wiphy_ext_feature_isset(local->hw.wiphy, + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) + list_add(&txqi->schedule_order, +diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c +index 667c44aa5a63c..dc201363f2c48 100644 +--- a/net/rxrpc/input.c ++++ b/net/rxrpc/input.c +@@ -430,7 +430,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + return; + } + +- if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) { ++ if (state == RXRPC_CALL_SERVER_RECV_REQUEST) { + unsigned long timo = READ_ONCE(call->next_req_timo); + unsigned long now, expect_req_by; + +diff --git a/net/rxrpc/key.c b/net/rxrpc/key.c +index 2e8bd3b97301e..979338a64c0ca 100644 +--- a/net/rxrpc/key.c ++++ b/net/rxrpc/key.c +@@ -1109,7 +1109,7 @@ static long rxrpc_read(const struct key *key, + default: /* we have a ticket we can't encode */ + pr_err("Unsupported key token type (%u)\n", + token->security_index); +- continue; ++ return -ENOPKG; + } + + _debug("token[%u]: toksize=%u", ntoks, toksize); +@@ -1224,7 +1224,9 @@ static long rxrpc_read(const struct key *key, + break; + + default: +- break; ++ pr_err("Unsupported key token type (%u)\n", ++ token->security_index); ++ return -ENOPKG; + } + + ASSERTCMP((unsigned long)xdr - (unsigned long)oldxdr, ==, +diff --git a/net/tipc/link.c b/net/tipc/link.c +index 06b880da2a8ea..c92e6984933cb 100644 +--- a/net/tipc/link.c ++++ b/net/tipc/link.c +@@ -996,7 +996,6 @@ void tipc_link_reset(struct tipc_link *l) + int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, + struct sk_buff_head *xmitq) + { +- struct tipc_msg *hdr = buf_msg(skb_peek(list)); + struct sk_buff_head *backlogq = &l->backlogq; + struct sk_buff_head *transmq = &l->transmq; + struct sk_buff *skb, *_skb; +@@ -1004,13 +1003,18 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, + u16 ack = l->rcv_nxt - 1; + u16 seqno = l->snd_nxt; + int pkt_cnt = skb_queue_len(list); +- int imp = msg_importance(hdr); + unsigned int mss = tipc_link_mss(l); + unsigned int cwin = l->window; + unsigned int mtu = l->mtu; ++ struct tipc_msg *hdr; + bool new_bundle; + int rc = 0; ++ int imp; ++ ++ if (pkt_cnt <= 0) ++ return 0; + ++ hdr = buf_msg(skb_peek(list)); + if (unlikely(msg_size(hdr) > mtu)) { + pr_warn("Too large msg, purging xmit list %d %d %d %d %d!\n", + skb_queue_len(list), msg_user(hdr), +@@ -1019,6 +1023,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, + return -EMSGSIZE; + } + ++ imp = msg_importance(hdr); + /* Allow oversubscription of one data msg per source at congestion */ + if (unlikely(l->backlog[imp].len >= l->backlog[imp].limit)) { + if (imp == TIPC_SYSTEM_IMPORTANCE) { +diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile +index 2c40e68853dde..e46df0a2d4f9d 100644 +--- a/scripts/kconfig/Makefile ++++ b/scripts/kconfig/Makefile +@@ -94,6 +94,16 @@ configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/c + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles) + $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig + ++PHONY += kvmconfig ++kvmconfig: kvm_guest.config ++ @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" ++ @echo >&2 " Please use 'make $<' instead." ++ ++PHONY += xenconfig ++xenconfig: xen.config ++ @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" ++ @echo >&2 " Please use 'make $<' instead." ++ + PHONY += tinyconfig + tinyconfig: + $(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config +diff --git a/tools/testing/selftests/bpf/progs/profiler.inc.h b/tools/testing/selftests/bpf/progs/profiler.inc.h +index 30982a7e4d0f7..4896fdf816f73 100644 +--- a/tools/testing/selftests/bpf/progs/profiler.inc.h ++++ b/tools/testing/selftests/bpf/progs/profiler.inc.h +@@ -256,6 +256,7 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data, + BPF_CORE_READ(task, nsproxy, cgroup_ns, root_cset, dfl_cgrp, kn); + struct kernfs_node* proc_kernfs = BPF_CORE_READ(task, cgroups, dfl_cgrp, kn); + ++#if __has_builtin(__builtin_preserve_enum_value) + if (ENABLE_CGROUP_V1_RESOLVER && CONFIG_CGROUP_PIDS) { + int cgrp_id = bpf_core_enum_value(enum cgroup_subsys_id___local, + pids_cgrp_id___local); +@@ -275,6 +276,7 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data, + } + } + } ++#endif + + cgroup_data->cgroup_root_inode = get_inode_from_kernfs(root_kernfs); + cgroup_data->cgroup_proc_inode = get_inode_from_kernfs(proc_kernfs);
