mirror of
https://github.com/armbian/build.git
synced 2025-08-15 23:56:57 +02:00
9041 lines
300 KiB
Diff
9041 lines
300 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 1391d545aee9b0..1d777c3eb7fb97 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 6
|
|
PATCHLEVEL = 6
|
|
-SUBLEVEL = 77
|
|
+SUBLEVEL = 78
|
|
EXTRAVERSION =
|
|
NAME = Pinguïn Aangedreven
|
|
|
|
diff --git a/arch/arm/boot/dts/ti/omap/dra7-l4.dtsi b/arch/arm/boot/dts/ti/omap/dra7-l4.dtsi
|
|
index 5733e3a4ea8e71..3fdb79b0e8bfe7 100644
|
|
--- a/arch/arm/boot/dts/ti/omap/dra7-l4.dtsi
|
|
+++ b/arch/arm/boot/dts/ti/omap/dra7-l4.dtsi
|
|
@@ -12,6 +12,7 @@ &l4_cfg { /* 0x4a000000 */
|
|
ranges = <0x00000000 0x4a000000 0x100000>, /* segment 0 */
|
|
<0x00100000 0x4a100000 0x100000>, /* segment 1 */
|
|
<0x00200000 0x4a200000 0x100000>; /* segment 2 */
|
|
+ dma-ranges;
|
|
|
|
segment@0 { /* 0x4a000000 */
|
|
compatible = "simple-pm-bus";
|
|
@@ -557,6 +558,7 @@ segment@100000 { /* 0x4a100000 */
|
|
<0x0007e000 0x0017e000 0x001000>, /* ap 124 */
|
|
<0x00059000 0x00159000 0x001000>, /* ap 125 */
|
|
<0x0005a000 0x0015a000 0x001000>; /* ap 126 */
|
|
+ dma-ranges;
|
|
|
|
target-module@2000 { /* 0x4a102000, ap 27 3c.0 */
|
|
compatible = "ti,sysc";
|
|
diff --git a/arch/arm/boot/dts/ti/omap/omap3-gta04.dtsi b/arch/arm/boot/dts/ti/omap/omap3-gta04.dtsi
|
|
index b6b27e93857f56..bf770c7026d79b 100644
|
|
--- a/arch/arm/boot/dts/ti/omap/omap3-gta04.dtsi
|
|
+++ b/arch/arm/boot/dts/ti/omap/omap3-gta04.dtsi
|
|
@@ -446,6 +446,7 @@ &omap3_pmx_core2 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <
|
|
&hsusb2_2_pins
|
|
+ &mcspi3hog_pins
|
|
>;
|
|
|
|
hsusb2_2_pins: hsusb2-2-pins {
|
|
@@ -459,6 +460,15 @@ OMAP3630_CORE2_IOPAD(0x25fa, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d15.hsusb2_d
|
|
>;
|
|
};
|
|
|
|
+ mcspi3hog_pins: mcspi3hog-pins {
|
|
+ pinctrl-single,pins = <
|
|
+ OMAP3630_CORE2_IOPAD(0x25dc, PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* etk_d0 */
|
|
+ OMAP3630_CORE2_IOPAD(0x25de, PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* etk_d1 */
|
|
+ OMAP3630_CORE2_IOPAD(0x25e0, PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* etk_d2 */
|
|
+ OMAP3630_CORE2_IOPAD(0x25e2, PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* etk_d3 */
|
|
+ >;
|
|
+ };
|
|
+
|
|
spi_gpio_pins: spi-gpio-pinmux-pins {
|
|
pinctrl-single,pins = <
|
|
OMAP3630_CORE2_IOPAD(0x25d8, PIN_OUTPUT | MUX_MODE4) /* clk */
|
|
diff --git a/arch/arm64/boot/dts/nvidia/tegra234.dtsi b/arch/arm64/boot/dts/nvidia/tegra234.dtsi
|
|
index be30072fb7471f..bcc36055ef97e6 100644
|
|
--- a/arch/arm64/boot/dts/nvidia/tegra234.dtsi
|
|
+++ b/arch/arm64/boot/dts/nvidia/tegra234.dtsi
|
|
@@ -1709,7 +1709,7 @@ sce-fabric@b600000 {
|
|
compatible = "nvidia,tegra234-sce-fabric";
|
|
reg = <0x0 0xb600000 0x0 0x40000>;
|
|
interrupts = <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>;
|
|
- status = "okay";
|
|
+ status = "disabled";
|
|
};
|
|
|
|
rce-fabric@be00000 {
|
|
@@ -1889,7 +1889,7 @@ bpmp-fabric@d600000 {
|
|
};
|
|
|
|
dce-fabric@de00000 {
|
|
- compatible = "nvidia,tegra234-sce-fabric";
|
|
+ compatible = "nvidia,tegra234-dce-fabric";
|
|
reg = <0x0 0xde00000 0x0 0x40000>;
|
|
interrupts = <GIC_SPI 381 IRQ_TYPE_LEVEL_HIGH>;
|
|
status = "okay";
|
|
@@ -1912,6 +1912,8 @@ gic: interrupt-controller@f400000 {
|
|
#redistributor-regions = <1>;
|
|
#interrupt-cells = <3>;
|
|
interrupt-controller;
|
|
+
|
|
+ #address-cells = <0>;
|
|
};
|
|
|
|
smmu_iso: iommu@10000000 {
|
|
diff --git a/arch/arm64/boot/dts/qcom/sm6115.dtsi b/arch/arm64/boot/dts/qcom/sm6115.dtsi
|
|
index 821db9b8518557..5c6fcf725473c1 100644
|
|
--- a/arch/arm64/boot/dts/qcom/sm6115.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/sm6115.dtsi
|
|
@@ -1667,7 +1667,7 @@ dispcc: clock-controller@5f00000 {
|
|
|
|
remoteproc_mpss: remoteproc@6080000 {
|
|
compatible = "qcom,sm6115-mpss-pas";
|
|
- reg = <0x0 0x06080000 0x0 0x100>;
|
|
+ reg = <0x0 0x06080000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 307 IRQ_TYPE_EDGE_RISING>,
|
|
<&modem_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -2310,9 +2310,9 @@ funnel_apss1_in: endpoint {
|
|
};
|
|
};
|
|
|
|
- remoteproc_adsp: remoteproc@ab00000 {
|
|
+ remoteproc_adsp: remoteproc@a400000 {
|
|
compatible = "qcom,sm6115-adsp-pas";
|
|
- reg = <0x0 0x0ab00000 0x0 0x100>;
|
|
+ reg = <0x0 0x0a400000 0x0 0x4040>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 282 IRQ_TYPE_EDGE_RISING>,
|
|
<&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -2384,7 +2384,7 @@ compute-cb@7 {
|
|
|
|
remoteproc_cdsp: remoteproc@b300000 {
|
|
compatible = "qcom,sm6115-cdsp-pas";
|
|
- reg = <0x0 0x0b300000 0x0 0x100000>;
|
|
+ reg = <0x0 0x0b300000 0x0 0x4040>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 265 IRQ_TYPE_EDGE_RISING>,
|
|
<&cdsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
diff --git a/arch/arm64/boot/dts/qcom/sm6350.dtsi b/arch/arm64/boot/dts/qcom/sm6350.dtsi
|
|
index f271b69485c5ce..f9739841406901 100644
|
|
--- a/arch/arm64/boot/dts/qcom/sm6350.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/sm6350.dtsi
|
|
@@ -935,7 +935,7 @@ uart1: serial@884000 {
|
|
power-domains = <&rpmhpd SM6350_CX>;
|
|
operating-points-v2 = <&qup_opp_table>;
|
|
interconnects = <&clk_virt MASTER_QUP_CORE_0 0 &clk_virt SLAVE_QUP_CORE_0 0>,
|
|
- <&aggre1_noc MASTER_QUP_0 0 &clk_virt SLAVE_EBI_CH0 0>;
|
|
+ <&gem_noc MASTER_AMPSS_M0 0 &config_noc SLAVE_QUP_0 0>;
|
|
interconnect-names = "qup-core", "qup-config";
|
|
status = "disabled";
|
|
};
|
|
@@ -1259,7 +1259,7 @@ tcsr_mutex: hwlock@1f40000 {
|
|
|
|
adsp: remoteproc@3000000 {
|
|
compatible = "qcom,sm6350-adsp-pas";
|
|
- reg = <0 0x03000000 0 0x100>;
|
|
+ reg = <0x0 0x03000000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&pdc 6 IRQ_TYPE_LEVEL_HIGH>,
|
|
<&smp2p_adsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -1480,7 +1480,7 @@ gpucc: clock-controller@3d90000 {
|
|
|
|
mpss: remoteproc@4080000 {
|
|
compatible = "qcom,sm6350-mpss-pas";
|
|
- reg = <0x0 0x04080000 0x0 0x4040>;
|
|
+ reg = <0x0 0x04080000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 136 IRQ_TYPE_EDGE_RISING>,
|
|
<&modem_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
diff --git a/arch/arm64/boot/dts/qcom/sm6375.dtsi b/arch/arm64/boot/dts/qcom/sm6375.dtsi
|
|
index c5f7715626a09b..3903df8336e35d 100644
|
|
--- a/arch/arm64/boot/dts/qcom/sm6375.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/sm6375.dtsi
|
|
@@ -1471,9 +1471,9 @@ gpucc: clock-controller@5990000 {
|
|
#power-domain-cells = <1>;
|
|
};
|
|
|
|
- remoteproc_mss: remoteproc@6000000 {
|
|
+ remoteproc_mss: remoteproc@6080000 {
|
|
compatible = "qcom,sm6375-mpss-pas";
|
|
- reg = <0 0x06000000 0 0x4040>;
|
|
+ reg = <0x0 0x06080000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 307 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_modem_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -1514,7 +1514,7 @@ IPCC_MPROC_SIGNAL_GLINK_QMP
|
|
|
|
remoteproc_adsp: remoteproc@a400000 {
|
|
compatible = "qcom,sm6375-adsp-pas";
|
|
- reg = <0 0x0a400000 0 0x100>;
|
|
+ reg = <0 0x0a400000 0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 282 IRQ_TYPE_LEVEL_HIGH>,
|
|
<&smp2p_adsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -1550,9 +1550,9 @@ IPCC_MPROC_SIGNAL_GLINK_QMP
|
|
};
|
|
};
|
|
|
|
- remoteproc_cdsp: remoteproc@b000000 {
|
|
+ remoteproc_cdsp: remoteproc@b300000 {
|
|
compatible = "qcom,sm6375-cdsp-pas";
|
|
- reg = <0x0 0x0b000000 0x0 0x100000>;
|
|
+ reg = <0x0 0x0b300000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 265 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_cdsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
diff --git a/arch/arm64/boot/dts/qcom/sm8350.dtsi b/arch/arm64/boot/dts/qcom/sm8350.dtsi
|
|
index dded95fa52f075..2a4d950ac02bfe 100644
|
|
--- a/arch/arm64/boot/dts/qcom/sm8350.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/sm8350.dtsi
|
|
@@ -1819,6 +1819,142 @@ tcsr_mutex: hwlock@1f40000 {
|
|
#hwlock-cells = <1>;
|
|
};
|
|
|
|
+ adsp: remoteproc@3000000 {
|
|
+ compatible = "qcom,sm8350-adsp-pas";
|
|
+ reg = <0x0 0x03000000 0x0 0x10000>;
|
|
+
|
|
+ interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_adsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_adsp_in 1 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_adsp_in 2 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_adsp_in 3 IRQ_TYPE_EDGE_RISING>;
|
|
+ interrupt-names = "wdog", "fatal", "ready",
|
|
+ "handover", "stop-ack";
|
|
+
|
|
+ clocks = <&rpmhcc RPMH_CXO_CLK>;
|
|
+ clock-names = "xo";
|
|
+
|
|
+ power-domains = <&rpmhpd RPMHPD_LCX>,
|
|
+ <&rpmhpd RPMHPD_LMX>;
|
|
+ power-domain-names = "lcx", "lmx";
|
|
+
|
|
+ memory-region = <&pil_adsp_mem>;
|
|
+
|
|
+ qcom,qmp = <&aoss_qmp>;
|
|
+
|
|
+ qcom,smem-states = <&smp2p_adsp_out 0>;
|
|
+ qcom,smem-state-names = "stop";
|
|
+
|
|
+ status = "disabled";
|
|
+
|
|
+ glink-edge {
|
|
+ interrupts-extended = <&ipcc IPCC_CLIENT_LPASS
|
|
+ IPCC_MPROC_SIGNAL_GLINK_QMP
|
|
+ IRQ_TYPE_EDGE_RISING>;
|
|
+ mboxes = <&ipcc IPCC_CLIENT_LPASS
|
|
+ IPCC_MPROC_SIGNAL_GLINK_QMP>;
|
|
+
|
|
+ label = "lpass";
|
|
+ qcom,remote-pid = <2>;
|
|
+
|
|
+ apr {
|
|
+ compatible = "qcom,apr-v2";
|
|
+ qcom,glink-channels = "apr_audio_svc";
|
|
+ qcom,domain = <APR_DOMAIN_ADSP>;
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+
|
|
+ service@3 {
|
|
+ reg = <APR_SVC_ADSP_CORE>;
|
|
+ compatible = "qcom,q6core";
|
|
+ qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
+ };
|
|
+
|
|
+ q6afe: service@4 {
|
|
+ compatible = "qcom,q6afe";
|
|
+ reg = <APR_SVC_AFE>;
|
|
+ qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
+
|
|
+ q6afedai: dais {
|
|
+ compatible = "qcom,q6afe-dais";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ #sound-dai-cells = <1>;
|
|
+ };
|
|
+
|
|
+ q6afecc: clock-controller {
|
|
+ compatible = "qcom,q6afe-clocks";
|
|
+ #clock-cells = <2>;
|
|
+ };
|
|
+ };
|
|
+
|
|
+ q6asm: service@7 {
|
|
+ compatible = "qcom,q6asm";
|
|
+ reg = <APR_SVC_ASM>;
|
|
+ qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
+
|
|
+ q6asmdai: dais {
|
|
+ compatible = "qcom,q6asm-dais";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ #sound-dai-cells = <1>;
|
|
+ iommus = <&apps_smmu 0x1801 0x0>;
|
|
+
|
|
+ dai@0 {
|
|
+ reg = <0>;
|
|
+ };
|
|
+
|
|
+ dai@1 {
|
|
+ reg = <1>;
|
|
+ };
|
|
+
|
|
+ dai@2 {
|
|
+ reg = <2>;
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
+ q6adm: service@8 {
|
|
+ compatible = "qcom,q6adm";
|
|
+ reg = <APR_SVC_ADM>;
|
|
+ qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
+
|
|
+ q6routing: routing {
|
|
+ compatible = "qcom,q6adm-routing";
|
|
+ #sound-dai-cells = <0>;
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
+ fastrpc {
|
|
+ compatible = "qcom,fastrpc";
|
|
+ qcom,glink-channels = "fastrpcglink-apps-dsp";
|
|
+ label = "adsp";
|
|
+ qcom,non-secure-domain;
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+
|
|
+ compute-cb@3 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <3>;
|
|
+ iommus = <&apps_smmu 0x1803 0x0>;
|
|
+ };
|
|
+
|
|
+ compute-cb@4 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <4>;
|
|
+ iommus = <&apps_smmu 0x1804 0x0>;
|
|
+ };
|
|
+
|
|
+ compute-cb@5 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <5>;
|
|
+ iommus = <&apps_smmu 0x1805 0x0>;
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
lpass_tlmm: pinctrl@33c0000 {
|
|
compatible = "qcom,sm8350-lpass-lpi-pinctrl";
|
|
reg = <0 0x033c0000 0 0x20000>,
|
|
@@ -2020,7 +2156,7 @@ lpass_ag_noc: interconnect@3c40000 {
|
|
|
|
mpss: remoteproc@4080000 {
|
|
compatible = "qcom,sm8350-mpss-pas";
|
|
- reg = <0x0 0x04080000 0x0 0x4040>;
|
|
+ reg = <0x0 0x04080000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 264 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_modem_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -2299,6 +2435,115 @@ compute_noc: interconnect@a0c0000 {
|
|
qcom,bcm-voters = <&apps_bcm_voter>;
|
|
};
|
|
|
|
+ cdsp: remoteproc@a300000 {
|
|
+ compatible = "qcom,sm8350-cdsp-pas";
|
|
+ reg = <0x0 0x0a300000 0x0 0x10000>;
|
|
+
|
|
+ interrupts-extended = <&intc GIC_SPI 578 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_cdsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_cdsp_in 1 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_cdsp_in 2 IRQ_TYPE_EDGE_RISING>,
|
|
+ <&smp2p_cdsp_in 3 IRQ_TYPE_EDGE_RISING>;
|
|
+ interrupt-names = "wdog", "fatal", "ready",
|
|
+ "handover", "stop-ack";
|
|
+
|
|
+ clocks = <&rpmhcc RPMH_CXO_CLK>;
|
|
+ clock-names = "xo";
|
|
+
|
|
+ power-domains = <&rpmhpd RPMHPD_CX>,
|
|
+ <&rpmhpd RPMHPD_MXC>;
|
|
+ power-domain-names = "cx", "mxc";
|
|
+
|
|
+ interconnects = <&compute_noc MASTER_CDSP_PROC 0 &mc_virt SLAVE_EBI1 0>;
|
|
+
|
|
+ memory-region = <&pil_cdsp_mem>;
|
|
+
|
|
+ qcom,qmp = <&aoss_qmp>;
|
|
+
|
|
+ qcom,smem-states = <&smp2p_cdsp_out 0>;
|
|
+ qcom,smem-state-names = "stop";
|
|
+
|
|
+ status = "disabled";
|
|
+
|
|
+ glink-edge {
|
|
+ interrupts-extended = <&ipcc IPCC_CLIENT_CDSP
|
|
+ IPCC_MPROC_SIGNAL_GLINK_QMP
|
|
+ IRQ_TYPE_EDGE_RISING>;
|
|
+ mboxes = <&ipcc IPCC_CLIENT_CDSP
|
|
+ IPCC_MPROC_SIGNAL_GLINK_QMP>;
|
|
+
|
|
+ label = "cdsp";
|
|
+ qcom,remote-pid = <5>;
|
|
+
|
|
+ fastrpc {
|
|
+ compatible = "qcom,fastrpc";
|
|
+ qcom,glink-channels = "fastrpcglink-apps-dsp";
|
|
+ label = "cdsp";
|
|
+ qcom,non-secure-domain;
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+
|
|
+ compute-cb@1 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <1>;
|
|
+ iommus = <&apps_smmu 0x2161 0x0400>,
|
|
+ <&apps_smmu 0x1181 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@2 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <2>;
|
|
+ iommus = <&apps_smmu 0x2162 0x0400>,
|
|
+ <&apps_smmu 0x1182 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@3 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <3>;
|
|
+ iommus = <&apps_smmu 0x2163 0x0400>,
|
|
+ <&apps_smmu 0x1183 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@4 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <4>;
|
|
+ iommus = <&apps_smmu 0x2164 0x0400>,
|
|
+ <&apps_smmu 0x1184 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@5 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <5>;
|
|
+ iommus = <&apps_smmu 0x2165 0x0400>,
|
|
+ <&apps_smmu 0x1185 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@6 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <6>;
|
|
+ iommus = <&apps_smmu 0x2166 0x0400>,
|
|
+ <&apps_smmu 0x1186 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@7 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <7>;
|
|
+ iommus = <&apps_smmu 0x2167 0x0400>,
|
|
+ <&apps_smmu 0x1187 0x0420>;
|
|
+ };
|
|
+
|
|
+ compute-cb@8 {
|
|
+ compatible = "qcom,fastrpc-compute-cb";
|
|
+ reg = <8>;
|
|
+ iommus = <&apps_smmu 0x2168 0x0400>,
|
|
+ <&apps_smmu 0x1188 0x0420>;
|
|
+ };
|
|
+
|
|
+ /* note: secure cb9 in downstream */
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
usb_1: usb@a6f8800 {
|
|
compatible = "qcom,sm8350-dwc3", "qcom,dwc3";
|
|
reg = <0 0x0a6f8800 0 0x400>;
|
|
@@ -3204,142 +3449,6 @@ apps_smmu: iommu@15000000 {
|
|
<GIC_SPI 707 IRQ_TYPE_LEVEL_HIGH>;
|
|
};
|
|
|
|
- adsp: remoteproc@17300000 {
|
|
- compatible = "qcom,sm8350-adsp-pas";
|
|
- reg = <0 0x17300000 0 0x100>;
|
|
-
|
|
- interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_adsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_adsp_in 1 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_adsp_in 2 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_adsp_in 3 IRQ_TYPE_EDGE_RISING>;
|
|
- interrupt-names = "wdog", "fatal", "ready",
|
|
- "handover", "stop-ack";
|
|
-
|
|
- clocks = <&rpmhcc RPMH_CXO_CLK>;
|
|
- clock-names = "xo";
|
|
-
|
|
- power-domains = <&rpmhpd RPMHPD_LCX>,
|
|
- <&rpmhpd RPMHPD_LMX>;
|
|
- power-domain-names = "lcx", "lmx";
|
|
-
|
|
- memory-region = <&pil_adsp_mem>;
|
|
-
|
|
- qcom,qmp = <&aoss_qmp>;
|
|
-
|
|
- qcom,smem-states = <&smp2p_adsp_out 0>;
|
|
- qcom,smem-state-names = "stop";
|
|
-
|
|
- status = "disabled";
|
|
-
|
|
- glink-edge {
|
|
- interrupts-extended = <&ipcc IPCC_CLIENT_LPASS
|
|
- IPCC_MPROC_SIGNAL_GLINK_QMP
|
|
- IRQ_TYPE_EDGE_RISING>;
|
|
- mboxes = <&ipcc IPCC_CLIENT_LPASS
|
|
- IPCC_MPROC_SIGNAL_GLINK_QMP>;
|
|
-
|
|
- label = "lpass";
|
|
- qcom,remote-pid = <2>;
|
|
-
|
|
- apr {
|
|
- compatible = "qcom,apr-v2";
|
|
- qcom,glink-channels = "apr_audio_svc";
|
|
- qcom,domain = <APR_DOMAIN_ADSP>;
|
|
- #address-cells = <1>;
|
|
- #size-cells = <0>;
|
|
-
|
|
- service@3 {
|
|
- reg = <APR_SVC_ADSP_CORE>;
|
|
- compatible = "qcom,q6core";
|
|
- qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
- };
|
|
-
|
|
- q6afe: service@4 {
|
|
- compatible = "qcom,q6afe";
|
|
- reg = <APR_SVC_AFE>;
|
|
- qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
-
|
|
- q6afedai: dais {
|
|
- compatible = "qcom,q6afe-dais";
|
|
- #address-cells = <1>;
|
|
- #size-cells = <0>;
|
|
- #sound-dai-cells = <1>;
|
|
- };
|
|
-
|
|
- q6afecc: clock-controller {
|
|
- compatible = "qcom,q6afe-clocks";
|
|
- #clock-cells = <2>;
|
|
- };
|
|
- };
|
|
-
|
|
- q6asm: service@7 {
|
|
- compatible = "qcom,q6asm";
|
|
- reg = <APR_SVC_ASM>;
|
|
- qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
-
|
|
- q6asmdai: dais {
|
|
- compatible = "qcom,q6asm-dais";
|
|
- #address-cells = <1>;
|
|
- #size-cells = <0>;
|
|
- #sound-dai-cells = <1>;
|
|
- iommus = <&apps_smmu 0x1801 0x0>;
|
|
-
|
|
- dai@0 {
|
|
- reg = <0>;
|
|
- };
|
|
-
|
|
- dai@1 {
|
|
- reg = <1>;
|
|
- };
|
|
-
|
|
- dai@2 {
|
|
- reg = <2>;
|
|
- };
|
|
- };
|
|
- };
|
|
-
|
|
- q6adm: service@8 {
|
|
- compatible = "qcom,q6adm";
|
|
- reg = <APR_SVC_ADM>;
|
|
- qcom,protection-domain = "avs/audio", "msm/adsp/audio_pd";
|
|
-
|
|
- q6routing: routing {
|
|
- compatible = "qcom,q6adm-routing";
|
|
- #sound-dai-cells = <0>;
|
|
- };
|
|
- };
|
|
- };
|
|
-
|
|
- fastrpc {
|
|
- compatible = "qcom,fastrpc";
|
|
- qcom,glink-channels = "fastrpcglink-apps-dsp";
|
|
- label = "adsp";
|
|
- qcom,non-secure-domain;
|
|
- #address-cells = <1>;
|
|
- #size-cells = <0>;
|
|
-
|
|
- compute-cb@3 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <3>;
|
|
- iommus = <&apps_smmu 0x1803 0x0>;
|
|
- };
|
|
-
|
|
- compute-cb@4 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <4>;
|
|
- iommus = <&apps_smmu 0x1804 0x0>;
|
|
- };
|
|
-
|
|
- compute-cb@5 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <5>;
|
|
- iommus = <&apps_smmu 0x1805 0x0>;
|
|
- };
|
|
- };
|
|
- };
|
|
- };
|
|
-
|
|
intc: interrupt-controller@17a00000 {
|
|
compatible = "arm,gic-v3";
|
|
#interrupt-cells = <3>;
|
|
@@ -3508,115 +3617,6 @@ cpufreq_hw: cpufreq@18591000 {
|
|
#freq-domain-cells = <1>;
|
|
#clock-cells = <1>;
|
|
};
|
|
-
|
|
- cdsp: remoteproc@98900000 {
|
|
- compatible = "qcom,sm8350-cdsp-pas";
|
|
- reg = <0 0x98900000 0 0x1400000>;
|
|
-
|
|
- interrupts-extended = <&intc GIC_SPI 578 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_cdsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_cdsp_in 1 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_cdsp_in 2 IRQ_TYPE_EDGE_RISING>,
|
|
- <&smp2p_cdsp_in 3 IRQ_TYPE_EDGE_RISING>;
|
|
- interrupt-names = "wdog", "fatal", "ready",
|
|
- "handover", "stop-ack";
|
|
-
|
|
- clocks = <&rpmhcc RPMH_CXO_CLK>;
|
|
- clock-names = "xo";
|
|
-
|
|
- power-domains = <&rpmhpd RPMHPD_CX>,
|
|
- <&rpmhpd RPMHPD_MXC>;
|
|
- power-domain-names = "cx", "mxc";
|
|
-
|
|
- interconnects = <&compute_noc MASTER_CDSP_PROC 0 &mc_virt SLAVE_EBI1 0>;
|
|
-
|
|
- memory-region = <&pil_cdsp_mem>;
|
|
-
|
|
- qcom,qmp = <&aoss_qmp>;
|
|
-
|
|
- qcom,smem-states = <&smp2p_cdsp_out 0>;
|
|
- qcom,smem-state-names = "stop";
|
|
-
|
|
- status = "disabled";
|
|
-
|
|
- glink-edge {
|
|
- interrupts-extended = <&ipcc IPCC_CLIENT_CDSP
|
|
- IPCC_MPROC_SIGNAL_GLINK_QMP
|
|
- IRQ_TYPE_EDGE_RISING>;
|
|
- mboxes = <&ipcc IPCC_CLIENT_CDSP
|
|
- IPCC_MPROC_SIGNAL_GLINK_QMP>;
|
|
-
|
|
- label = "cdsp";
|
|
- qcom,remote-pid = <5>;
|
|
-
|
|
- fastrpc {
|
|
- compatible = "qcom,fastrpc";
|
|
- qcom,glink-channels = "fastrpcglink-apps-dsp";
|
|
- label = "cdsp";
|
|
- qcom,non-secure-domain;
|
|
- #address-cells = <1>;
|
|
- #size-cells = <0>;
|
|
-
|
|
- compute-cb@1 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <1>;
|
|
- iommus = <&apps_smmu 0x2161 0x0400>,
|
|
- <&apps_smmu 0x1181 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@2 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <2>;
|
|
- iommus = <&apps_smmu 0x2162 0x0400>,
|
|
- <&apps_smmu 0x1182 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@3 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <3>;
|
|
- iommus = <&apps_smmu 0x2163 0x0400>,
|
|
- <&apps_smmu 0x1183 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@4 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <4>;
|
|
- iommus = <&apps_smmu 0x2164 0x0400>,
|
|
- <&apps_smmu 0x1184 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@5 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <5>;
|
|
- iommus = <&apps_smmu 0x2165 0x0400>,
|
|
- <&apps_smmu 0x1185 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@6 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <6>;
|
|
- iommus = <&apps_smmu 0x2166 0x0400>,
|
|
- <&apps_smmu 0x1186 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@7 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <7>;
|
|
- iommus = <&apps_smmu 0x2167 0x0400>,
|
|
- <&apps_smmu 0x1187 0x0420>;
|
|
- };
|
|
-
|
|
- compute-cb@8 {
|
|
- compatible = "qcom,fastrpc-compute-cb";
|
|
- reg = <8>;
|
|
- iommus = <&apps_smmu 0x2168 0x0400>,
|
|
- <&apps_smmu 0x1188 0x0420>;
|
|
- };
|
|
-
|
|
- /* note: secure cb9 in downstream */
|
|
- };
|
|
- };
|
|
- };
|
|
};
|
|
|
|
thermal_zones: thermal-zones {
|
|
diff --git a/arch/arm64/boot/dts/qcom/sm8450.dtsi b/arch/arm64/boot/dts/qcom/sm8450.dtsi
|
|
index 007689d7f4fa20..2a49a29713752b 100644
|
|
--- a/arch/arm64/boot/dts/qcom/sm8450.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/sm8450.dtsi
|
|
@@ -2475,7 +2475,7 @@ compute-cb@5 {
|
|
|
|
remoteproc_cdsp: remoteproc@32300000 {
|
|
compatible = "qcom,sm8450-cdsp-pas";
|
|
- reg = <0 0x32300000 0 0x1400000>;
|
|
+ reg = <0 0x32300000 0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 578 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_cdsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -2581,7 +2581,7 @@ compute-cb@8 {
|
|
|
|
remoteproc_mpss: remoteproc@4080000 {
|
|
compatible = "qcom,sm8450-mpss-pas";
|
|
- reg = <0x0 0x04080000 0x0 0x4040>;
|
|
+ reg = <0x0 0x04080000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 264 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_modem_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
|
index 90e6cd239f5699..f3a0e1fe333c4d 100644
|
|
--- a/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
|
@@ -1986,7 +1986,7 @@ gpucc: clock-controller@3d90000 {
|
|
|
|
remoteproc_mpss: remoteproc@4080000 {
|
|
compatible = "qcom,sm8550-mpss-pas";
|
|
- reg = <0x0 0x04080000 0x0 0x4040>;
|
|
+ reg = <0x0 0x04080000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 264 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_modem_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
@@ -2448,9 +2448,8 @@ mdss: display-subsystem@ae00000 {
|
|
|
|
power-domains = <&dispcc MDSS_GDSC>;
|
|
|
|
- interconnects = <&mmss_noc MASTER_MDP 0 &gem_noc SLAVE_LLCC 0>,
|
|
- <&mc_virt MASTER_LLCC 0 &mc_virt SLAVE_EBI1 0>;
|
|
- interconnect-names = "mdp0-mem", "mdp1-mem";
|
|
+ interconnects = <&mmss_noc MASTER_MDP 0 &mc_virt SLAVE_EBI1 0>;
|
|
+ interconnect-names = "mdp0-mem";
|
|
|
|
iommus = <&apps_smmu 0x1c00 0x2>;
|
|
|
|
@@ -4089,7 +4088,7 @@ nsp_noc: interconnect@320c0000 {
|
|
|
|
remoteproc_cdsp: remoteproc@32300000 {
|
|
compatible = "qcom,sm8550-cdsp-pas";
|
|
- reg = <0x0 0x32300000 0x0 0x1400000>;
|
|
+ reg = <0x0 0x32300000 0x0 0x10000>;
|
|
|
|
interrupts-extended = <&intc GIC_SPI 578 IRQ_TYPE_EDGE_RISING>,
|
|
<&smp2p_cdsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
|
|
index aba2748fe54c77..35a0fb73a96a5d 100644
|
|
--- a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
|
|
+++ b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
|
|
@@ -147,7 +147,7 @@ &gmac {
|
|
snps,reset-active-low;
|
|
snps,reset-delays-us = <0 10000 50000>;
|
|
tx_delay = <0x10>;
|
|
- rx_delay = <0x10>;
|
|
+ rx_delay = <0x23>;
|
|
status = "okay";
|
|
};
|
|
|
|
diff --git a/arch/arm64/kvm/arch_timer.c b/arch/arm64/kvm/arch_timer.c
|
|
index d221829502f3e0..a795dad2b99ab1 100644
|
|
--- a/arch/arm64/kvm/arch_timer.c
|
|
+++ b/arch/arm64/kvm/arch_timer.c
|
|
@@ -467,10 +467,8 @@ static void timer_emulate(struct arch_timer_context *ctx)
|
|
|
|
trace_kvm_timer_emulate(ctx, should_fire);
|
|
|
|
- if (should_fire != ctx->irq.level) {
|
|
+ if (should_fire != ctx->irq.level)
|
|
kvm_timer_update_irq(ctx->vcpu, should_fire, ctx);
|
|
- return;
|
|
- }
|
|
|
|
/*
|
|
* If the timer can fire now, we don't need to have a soft timer
|
|
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
|
|
index 13fd592228b188..a5e1588780b2ce 100644
|
|
--- a/arch/arm64/mm/hugetlbpage.c
|
|
+++ b/arch/arm64/mm/hugetlbpage.c
|
|
@@ -526,6 +526,18 @@ pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
|
|
|
|
static int __init hugetlbpage_init(void)
|
|
{
|
|
+ /*
|
|
+ * HugeTLB pages are supported on maximum four page table
|
|
+ * levels (PUD, CONT PMD, PMD, CONT PTE) for a given base
|
|
+ * page size, corresponding to hugetlb_add_hstate() calls
|
|
+ * here.
|
|
+ *
|
|
+ * HUGE_MAX_HSTATE should at least match maximum supported
|
|
+ * HugeTLB page sizes on the platform. Any new addition to
|
|
+ * supported HugeTLB page sizes will also require changing
|
|
+ * HUGE_MAX_HSTATE as well.
|
|
+ */
|
|
+ BUILD_BUG_ON(HUGE_MAX_HSTATE < 4);
|
|
if (pud_sect_supported())
|
|
hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT);
|
|
|
|
diff --git a/arch/loongarch/include/uapi/asm/ptrace.h b/arch/loongarch/include/uapi/asm/ptrace.h
|
|
index ac915f84165053..aafb3cd9e943e5 100644
|
|
--- a/arch/loongarch/include/uapi/asm/ptrace.h
|
|
+++ b/arch/loongarch/include/uapi/asm/ptrace.h
|
|
@@ -72,6 +72,16 @@ struct user_watch_state {
|
|
} dbg_regs[8];
|
|
};
|
|
|
|
+struct user_watch_state_v2 {
|
|
+ uint64_t dbg_info;
|
|
+ struct {
|
|
+ uint64_t addr;
|
|
+ uint64_t mask;
|
|
+ uint32_t ctrl;
|
|
+ uint32_t pad;
|
|
+ } dbg_regs[14];
|
|
+};
|
|
+
|
|
#define PTRACE_SYSEMU 0x1f
|
|
#define PTRACE_SYSEMU_SINGLESTEP 0x20
|
|
|
|
diff --git a/arch/loongarch/kernel/ptrace.c b/arch/loongarch/kernel/ptrace.c
|
|
index 19dc6eff45ccc8..5e2402cfcab0a1 100644
|
|
--- a/arch/loongarch/kernel/ptrace.c
|
|
+++ b/arch/loongarch/kernel/ptrace.c
|
|
@@ -720,7 +720,7 @@ static int hw_break_set(struct task_struct *target,
|
|
unsigned int note_type = regset->core_note_type;
|
|
|
|
/* Resource info */
|
|
- offset = offsetof(struct user_watch_state, dbg_regs);
|
|
+ offset = offsetof(struct user_watch_state_v2, dbg_regs);
|
|
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
|
|
|
|
/* (address, mask, ctrl) registers */
|
|
@@ -920,7 +920,7 @@ static const struct user_regset loongarch64_regsets[] = {
|
|
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
|
[REGSET_HW_BREAK] = {
|
|
.core_note_type = NT_LOONGARCH_HW_BREAK,
|
|
- .n = sizeof(struct user_watch_state) / sizeof(u32),
|
|
+ .n = sizeof(struct user_watch_state_v2) / sizeof(u32),
|
|
.size = sizeof(u32),
|
|
.align = sizeof(u32),
|
|
.regset_get = hw_break_get,
|
|
@@ -928,7 +928,7 @@ static const struct user_regset loongarch64_regsets[] = {
|
|
},
|
|
[REGSET_HW_WATCH] = {
|
|
.core_note_type = NT_LOONGARCH_HW_WATCH,
|
|
- .n = sizeof(struct user_watch_state) / sizeof(u32),
|
|
+ .n = sizeof(struct user_watch_state_v2) / sizeof(u32),
|
|
.size = sizeof(u32),
|
|
.align = sizeof(u32),
|
|
.regset_get = hw_break_get,
|
|
diff --git a/arch/m68k/include/asm/vga.h b/arch/m68k/include/asm/vga.h
|
|
index 4742e6bc3ab8ea..cdd414fa8710a9 100644
|
|
--- a/arch/m68k/include/asm/vga.h
|
|
+++ b/arch/m68k/include/asm/vga.h
|
|
@@ -9,7 +9,7 @@
|
|
*/
|
|
#ifndef CONFIG_PCI
|
|
|
|
-#include <asm/raw_io.h>
|
|
+#include <asm/io.h>
|
|
#include <asm/kmap.h>
|
|
|
|
/*
|
|
@@ -29,9 +29,9 @@
|
|
#define inw_p(port) 0
|
|
#define outb_p(port, val) do { } while (0)
|
|
#define outw(port, val) do { } while (0)
|
|
-#define readb raw_inb
|
|
-#define writeb raw_outb
|
|
-#define writew raw_outw
|
|
+#define readb __raw_readb
|
|
+#define writeb __raw_writeb
|
|
+#define writew __raw_writew
|
|
|
|
#endif /* CONFIG_PCI */
|
|
#endif /* _ASM_M68K_VGA_H */
|
|
diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c
|
|
index 8c401e42301cbf..f39e85fd58fa99 100644
|
|
--- a/arch/mips/kernel/ftrace.c
|
|
+++ b/arch/mips/kernel/ftrace.c
|
|
@@ -248,7 +248,7 @@ int ftrace_disable_ftrace_graph_caller(void)
|
|
#define S_R_SP (0xafb0 << 16) /* s{d,w} R, offset(sp) */
|
|
#define OFFSET_MASK 0xffff /* stack offset range: 0 ~ PT_SIZE */
|
|
|
|
-unsigned long ftrace_get_parent_ra_addr(unsigned long self_ra, unsigned long
|
|
+static unsigned long ftrace_get_parent_ra_addr(unsigned long self_ra, unsigned long
|
|
old_parent_ra, unsigned long parent_ra_addr, unsigned long fp)
|
|
{
|
|
unsigned long sp, ip, tmp;
|
|
diff --git a/arch/mips/loongson64/boardinfo.c b/arch/mips/loongson64/boardinfo.c
|
|
index 280989c5a137b5..8bb275c93ac099 100644
|
|
--- a/arch/mips/loongson64/boardinfo.c
|
|
+++ b/arch/mips/loongson64/boardinfo.c
|
|
@@ -21,13 +21,11 @@ static ssize_t boardinfo_show(struct kobject *kobj,
|
|
"BIOS Info\n"
|
|
"Vendor\t\t\t: %s\n"
|
|
"Version\t\t\t: %s\n"
|
|
- "ROM Size\t\t: %d KB\n"
|
|
"Release Date\t\t: %s\n",
|
|
strsep(&tmp_board_manufacturer, "-"),
|
|
eboard->name,
|
|
strsep(&tmp_bios_vendor, "-"),
|
|
einter->description,
|
|
- einter->size,
|
|
especial->special_name);
|
|
}
|
|
static struct kobj_attribute boardinfo_attr = __ATTR(boardinfo, 0444,
|
|
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
|
|
index 265bc57819dfb5..c89e70df43d82b 100644
|
|
--- a/arch/mips/math-emu/cp1emu.c
|
|
+++ b/arch/mips/math-emu/cp1emu.c
|
|
@@ -1660,7 +1660,7 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
|
|
break;
|
|
}
|
|
|
|
- case 0x3:
|
|
+ case 0x7:
|
|
if (MIPSInst_FUNC(ir) != pfetch_op)
|
|
return SIGILL;
|
|
|
|
diff --git a/arch/powerpc/kvm/e500_mmu_host.c b/arch/powerpc/kvm/e500_mmu_host.c
|
|
index ccb8f16ffe412f..bd413dafbaf969 100644
|
|
--- a/arch/powerpc/kvm/e500_mmu_host.c
|
|
+++ b/arch/powerpc/kvm/e500_mmu_host.c
|
|
@@ -242,7 +242,7 @@ static inline int tlbe_is_writable(struct kvm_book3e_206_tlb_entry *tlbe)
|
|
return tlbe->mas7_3 & (MAS3_SW|MAS3_UW);
|
|
}
|
|
|
|
-static inline void kvmppc_e500_ref_setup(struct tlbe_ref *ref,
|
|
+static inline bool kvmppc_e500_ref_setup(struct tlbe_ref *ref,
|
|
struct kvm_book3e_206_tlb_entry *gtlbe,
|
|
kvm_pfn_t pfn, unsigned int wimg)
|
|
{
|
|
@@ -252,11 +252,7 @@ static inline void kvmppc_e500_ref_setup(struct tlbe_ref *ref,
|
|
/* Use guest supplied MAS2_G and MAS2_E */
|
|
ref->flags |= (gtlbe->mas2 & MAS2_ATTRIB_MASK) | wimg;
|
|
|
|
- /* Mark the page accessed */
|
|
- kvm_set_pfn_accessed(pfn);
|
|
-
|
|
- if (tlbe_is_writable(gtlbe))
|
|
- kvm_set_pfn_dirty(pfn);
|
|
+ return tlbe_is_writable(gtlbe);
|
|
}
|
|
|
|
static inline void kvmppc_e500_ref_release(struct tlbe_ref *ref)
|
|
@@ -326,6 +322,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
{
|
|
struct kvm_memory_slot *slot;
|
|
unsigned long pfn = 0; /* silence GCC warning */
|
|
+ struct page *page = NULL;
|
|
unsigned long hva;
|
|
int pfnmap = 0;
|
|
int tsize = BOOK3E_PAGESZ_4K;
|
|
@@ -337,6 +334,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
unsigned int wimg = 0;
|
|
pgd_t *pgdir;
|
|
unsigned long flags;
|
|
+ bool writable = false;
|
|
|
|
/* used to check for invalidations in progress */
|
|
mmu_seq = kvm->mmu_invalidate_seq;
|
|
@@ -446,7 +444,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
|
|
if (likely(!pfnmap)) {
|
|
tsize_pages = 1UL << (tsize + 10 - PAGE_SHIFT);
|
|
- pfn = gfn_to_pfn_memslot(slot, gfn);
|
|
+ pfn = __kvm_faultin_pfn(slot, gfn, FOLL_WRITE, NULL, &page);
|
|
if (is_error_noslot_pfn(pfn)) {
|
|
if (printk_ratelimit())
|
|
pr_err("%s: real page not found for gfn %lx\n",
|
|
@@ -481,7 +479,6 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
if (pte_present(pte)) {
|
|
wimg = (pte_val(pte) >> PTE_WIMGE_SHIFT) &
|
|
MAS2_WIMGE_MASK;
|
|
- local_irq_restore(flags);
|
|
} else {
|
|
local_irq_restore(flags);
|
|
pr_err_ratelimited("%s: pte not present: gfn %lx,pfn %lx\n",
|
|
@@ -490,8 +487,9 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
goto out;
|
|
}
|
|
}
|
|
- kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
|
|
+ local_irq_restore(flags);
|
|
|
|
+ writable = kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
|
|
kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize,
|
|
ref, gvaddr, stlbe);
|
|
|
|
@@ -499,11 +497,8 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
kvmppc_mmu_flush_icache(pfn);
|
|
|
|
out:
|
|
+ kvm_release_faultin_page(kvm, page, !!ret, writable);
|
|
spin_unlock(&kvm->mmu_lock);
|
|
-
|
|
- /* Drop refcount on page, so that mmu notifiers can clear it */
|
|
- kvm_release_pfn_clean(pfn);
|
|
-
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c
|
|
index def184da51cf0e..3269c814f65479 100644
|
|
--- a/arch/powerpc/platforms/pseries/eeh_pseries.c
|
|
+++ b/arch/powerpc/platforms/pseries/eeh_pseries.c
|
|
@@ -580,8 +580,10 @@ static int pseries_eeh_get_state(struct eeh_pe *pe, int *delay)
|
|
|
|
switch(rets[0]) {
|
|
case 0:
|
|
- result = EEH_STATE_MMIO_ACTIVE |
|
|
- EEH_STATE_DMA_ACTIVE;
|
|
+ result = EEH_STATE_MMIO_ACTIVE |
|
|
+ EEH_STATE_DMA_ACTIVE |
|
|
+ EEH_STATE_MMIO_ENABLED |
|
|
+ EEH_STATE_DMA_ENABLED;
|
|
break;
|
|
case 1:
|
|
result = EEH_STATE_RESET_ACTIVE |
|
|
diff --git a/arch/s390/include/asm/futex.h b/arch/s390/include/asm/futex.h
|
|
index eaeaeb3ff0be3e..752a2310f0d6c1 100644
|
|
--- a/arch/s390/include/asm/futex.h
|
|
+++ b/arch/s390/include/asm/futex.h
|
|
@@ -44,7 +44,7 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
|
|
break;
|
|
case FUTEX_OP_ANDN:
|
|
__futex_atomic_op("lr %2,%1\nnr %2,%5\n",
|
|
- ret, oldval, newval, uaddr, oparg);
|
|
+ ret, oldval, newval, uaddr, ~oparg);
|
|
break;
|
|
case FUTEX_OP_XOR:
|
|
__futex_atomic_op("lr %2,%1\nxr %2,%5\n",
|
|
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
|
|
index e7338ed540d8fc..2f373e8cfed33e 100644
|
|
--- a/arch/s390/include/asm/processor.h
|
|
+++ b/arch/s390/include/asm/processor.h
|
|
@@ -140,8 +140,7 @@ static __always_inline void __stackleak_poison(unsigned long erase_low,
|
|
" la %[addr],256(%[addr])\n"
|
|
" brctg %[tmp],0b\n"
|
|
"1: stg %[poison],0(%[addr])\n"
|
|
- " larl %[tmp],3f\n"
|
|
- " ex %[count],0(%[tmp])\n"
|
|
+ " exrl %[count],3f\n"
|
|
" j 4f\n"
|
|
"2: stg %[poison],0(%[addr])\n"
|
|
" j 4f\n"
|
|
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
|
|
index db9a180de65f1f..b82620cefa684b 100644
|
|
--- a/arch/s390/kvm/vsie.c
|
|
+++ b/arch/s390/kvm/vsie.c
|
|
@@ -1335,8 +1335,14 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr)
|
|
page = radix_tree_lookup(&kvm->arch.vsie.addr_to_page, addr >> 9);
|
|
rcu_read_unlock();
|
|
if (page) {
|
|
- if (page_ref_inc_return(page) == 2)
|
|
- return page_to_virt(page);
|
|
+ if (page_ref_inc_return(page) == 2) {
|
|
+ if (page->index == addr)
|
|
+ return page_to_virt(page);
|
|
+ /*
|
|
+ * We raced with someone reusing + putting this vsie
|
|
+ * page before we grabbed it.
|
|
+ */
|
|
+ }
|
|
page_ref_dec(page);
|
|
}
|
|
|
|
@@ -1366,15 +1372,20 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr)
|
|
kvm->arch.vsie.next++;
|
|
kvm->arch.vsie.next %= nr_vcpus;
|
|
}
|
|
- radix_tree_delete(&kvm->arch.vsie.addr_to_page, page->index >> 9);
|
|
+ if (page->index != ULONG_MAX)
|
|
+ radix_tree_delete(&kvm->arch.vsie.addr_to_page,
|
|
+ page->index >> 9);
|
|
}
|
|
- page->index = addr;
|
|
- /* double use of the same address */
|
|
+ /* Mark it as invalid until it resides in the tree. */
|
|
+ page->index = ULONG_MAX;
|
|
+
|
|
+ /* Double use of the same address or allocation failure. */
|
|
if (radix_tree_insert(&kvm->arch.vsie.addr_to_page, addr >> 9, page)) {
|
|
page_ref_dec(page);
|
|
mutex_unlock(&kvm->arch.vsie.mutex);
|
|
return NULL;
|
|
}
|
|
+ page->index = addr;
|
|
mutex_unlock(&kvm->arch.vsie.mutex);
|
|
|
|
vsie_page = page_to_virt(page);
|
|
@@ -1467,7 +1478,9 @@ void kvm_s390_vsie_destroy(struct kvm *kvm)
|
|
vsie_page = page_to_virt(page);
|
|
release_gmap_shadow(vsie_page);
|
|
/* free the radix tree entry */
|
|
- radix_tree_delete(&kvm->arch.vsie.addr_to_page, page->index >> 9);
|
|
+ if (page->index != ULONG_MAX)
|
|
+ radix_tree_delete(&kvm->arch.vsie.addr_to_page,
|
|
+ page->index >> 9);
|
|
__free_page(page);
|
|
}
|
|
kvm->arch.vsie.page_count = 0;
|
|
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
|
|
index 658e9ec065c476..ba17496fad1b3b 100644
|
|
--- a/arch/x86/boot/compressed/Makefile
|
|
+++ b/arch/x86/boot/compressed/Makefile
|
|
@@ -34,6 +34,7 @@ targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \
|
|
# avoid errors with '-march=i386', and future flags may depend on the target to
|
|
# be valid.
|
|
KBUILD_CFLAGS := -m$(BITS) -O2 $(CLANG_FLAGS)
|
|
+KBUILD_CFLAGS += -std=gnu11
|
|
KBUILD_CFLAGS += -fno-strict-aliasing -fPIE
|
|
KBUILD_CFLAGS += -Wundef
|
|
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
|
diff --git a/arch/x86/include/asm/kexec.h b/arch/x86/include/asm/kexec.h
|
|
index c9f6a6c5de3cf6..d54dd7084a3e1c 100644
|
|
--- a/arch/x86/include/asm/kexec.h
|
|
+++ b/arch/x86/include/asm/kexec.h
|
|
@@ -16,6 +16,7 @@
|
|
# define PAGES_NR 4
|
|
#endif
|
|
|
|
+# define KEXEC_CONTROL_PAGE_SIZE 4096
|
|
# define KEXEC_CONTROL_CODE_MAX_SIZE 2048
|
|
|
|
#ifndef __ASSEMBLY__
|
|
@@ -44,7 +45,6 @@ struct kimage;
|
|
/* Maximum address we can use for the control code buffer */
|
|
# define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
|
|
|
|
-# define KEXEC_CONTROL_PAGE_SIZE 4096
|
|
|
|
/* The native architecture */
|
|
# define KEXEC_ARCH KEXEC_ARCH_386
|
|
@@ -59,9 +59,6 @@ struct kimage;
|
|
/* Maximum address we can use for the control pages */
|
|
# define KEXEC_CONTROL_MEMORY_LIMIT (MAXMEM-1)
|
|
|
|
-/* Allocate one page for the pdp and the second for the code */
|
|
-# define KEXEC_CONTROL_PAGE_SIZE (4096UL + 4096UL)
|
|
-
|
|
/* The native architecture */
|
|
# define KEXEC_ARCH KEXEC_ARCH_X86_64
|
|
#endif
|
|
@@ -146,6 +143,19 @@ struct kimage_arch {
|
|
};
|
|
#else
|
|
struct kimage_arch {
|
|
+ /*
|
|
+ * This is a kimage control page, as it must not overlap with either
|
|
+ * source or destination address ranges.
|
|
+ */
|
|
+ pgd_t *pgd;
|
|
+ /*
|
|
+ * The virtual mapping of the control code page itself is used only
|
|
+ * during the transition, while the current kernel's pages are all
|
|
+ * in place. Thus the intermediate page table pages used to map it
|
|
+ * are not control pages, but instead just normal pages obtained
|
|
+ * with get_zeroed_page(). And have to be tracked (below) so that
|
|
+ * they can be freed.
|
|
+ */
|
|
p4d_t *p4d;
|
|
pud_t *pud;
|
|
pmd_t *pmd;
|
|
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
|
|
index 257bf2e71d0605..39672561c6be87 100644
|
|
--- a/arch/x86/include/asm/kvm_host.h
|
|
+++ b/arch/x86/include/asm/kvm_host.h
|
|
@@ -1650,6 +1650,8 @@ struct kvm_x86_ops {
|
|
void (*enable_irq_window)(struct kvm_vcpu *vcpu);
|
|
void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr);
|
|
bool (*check_apicv_inhibit_reasons)(enum kvm_apicv_inhibit reason);
|
|
+
|
|
+ const bool x2apic_icr_is_split;
|
|
const unsigned long required_apicv_inhibits;
|
|
bool allow_apicv_in_x2apic_without_x2apic_virtualization;
|
|
void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu);
|
|
diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c
|
|
index 6dabb53f58a445..b6d5fc396f88c8 100644
|
|
--- a/arch/x86/kernel/amd_nb.c
|
|
+++ b/arch/x86/kernel/amd_nb.c
|
|
@@ -537,6 +537,10 @@ static __init void fix_erratum_688(void)
|
|
|
|
static __init int init_amd_nbs(void)
|
|
{
|
|
+ if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
|
|
+ boot_cpu_data.x86_vendor != X86_VENDOR_HYGON)
|
|
+ return 0;
|
|
+
|
|
amd_cache_northbridges();
|
|
amd_cache_gart();
|
|
|
|
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
|
|
index 2fa12d1dc67602..8509d809a9f1bb 100644
|
|
--- a/arch/x86/kernel/machine_kexec_64.c
|
|
+++ b/arch/x86/kernel/machine_kexec_64.c
|
|
@@ -149,7 +149,8 @@ static void free_transition_pgtable(struct kimage *image)
|
|
image->arch.pte = NULL;
|
|
}
|
|
|
|
-static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
|
|
+static int init_transition_pgtable(struct kimage *image, pgd_t *pgd,
|
|
+ unsigned long control_page)
|
|
{
|
|
pgprot_t prot = PAGE_KERNEL_EXEC_NOENC;
|
|
unsigned long vaddr, paddr;
|
|
@@ -160,7 +161,7 @@ static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
|
|
pte_t *pte;
|
|
|
|
vaddr = (unsigned long)relocate_kernel;
|
|
- paddr = __pa(page_address(image->control_code_page)+PAGE_SIZE);
|
|
+ paddr = control_page;
|
|
pgd += pgd_index(vaddr);
|
|
if (!pgd_present(*pgd)) {
|
|
p4d = (p4d_t *)get_zeroed_page(GFP_KERNEL);
|
|
@@ -219,7 +220,7 @@ static void *alloc_pgt_page(void *data)
|
|
return p;
|
|
}
|
|
|
|
-static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
|
+static int init_pgtable(struct kimage *image, unsigned long control_page)
|
|
{
|
|
struct x86_mapping_info info = {
|
|
.alloc_pgt_page = alloc_pgt_page,
|
|
@@ -228,12 +229,12 @@ static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
|
.kernpg_flag = _KERNPG_TABLE_NOENC,
|
|
};
|
|
unsigned long mstart, mend;
|
|
- pgd_t *level4p;
|
|
int result;
|
|
int i;
|
|
|
|
- level4p = (pgd_t *)__va(start_pgtable);
|
|
- clear_page(level4p);
|
|
+ image->arch.pgd = alloc_pgt_page(image);
|
|
+ if (!image->arch.pgd)
|
|
+ return -ENOMEM;
|
|
|
|
if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) {
|
|
info.page_flag |= _PAGE_ENC;
|
|
@@ -247,8 +248,8 @@ static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
|
mstart = pfn_mapped[i].start << PAGE_SHIFT;
|
|
mend = pfn_mapped[i].end << PAGE_SHIFT;
|
|
|
|
- result = kernel_ident_mapping_init(&info,
|
|
- level4p, mstart, mend);
|
|
+ result = kernel_ident_mapping_init(&info, image->arch.pgd,
|
|
+ mstart, mend);
|
|
if (result)
|
|
return result;
|
|
}
|
|
@@ -263,8 +264,8 @@ static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
|
mstart = image->segment[i].mem;
|
|
mend = mstart + image->segment[i].memsz;
|
|
|
|
- result = kernel_ident_mapping_init(&info,
|
|
- level4p, mstart, mend);
|
|
+ result = kernel_ident_mapping_init(&info, image->arch.pgd,
|
|
+ mstart, mend);
|
|
|
|
if (result)
|
|
return result;
|
|
@@ -274,15 +275,19 @@ static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
|
* Prepare EFI systab and ACPI tables for kexec kernel since they are
|
|
* not covered by pfn_mapped.
|
|
*/
|
|
- result = map_efi_systab(&info, level4p);
|
|
+ result = map_efi_systab(&info, image->arch.pgd);
|
|
if (result)
|
|
return result;
|
|
|
|
- result = map_acpi_tables(&info, level4p);
|
|
+ result = map_acpi_tables(&info, image->arch.pgd);
|
|
if (result)
|
|
return result;
|
|
|
|
- return init_transition_pgtable(image, level4p);
|
|
+ /*
|
|
+ * This must be last because the intermediate page table pages it
|
|
+ * allocates will not be control pages and may overlap the image.
|
|
+ */
|
|
+ return init_transition_pgtable(image, image->arch.pgd, control_page);
|
|
}
|
|
|
|
static void load_segments(void)
|
|
@@ -299,14 +304,14 @@ static void load_segments(void)
|
|
|
|
int machine_kexec_prepare(struct kimage *image)
|
|
{
|
|
- unsigned long start_pgtable;
|
|
+ unsigned long control_page;
|
|
int result;
|
|
|
|
/* Calculate the offsets */
|
|
- start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
|
+ control_page = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
|
|
|
/* Setup the identity mapped 64bit page table */
|
|
- result = init_pgtable(image, start_pgtable);
|
|
+ result = init_pgtable(image, control_page);
|
|
if (result)
|
|
return result;
|
|
|
|
@@ -360,13 +365,12 @@ void machine_kexec(struct kimage *image)
|
|
#endif
|
|
}
|
|
|
|
- control_page = page_address(image->control_code_page) + PAGE_SIZE;
|
|
+ control_page = page_address(image->control_code_page);
|
|
__memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
|
|
|
|
page_list[PA_CONTROL_PAGE] = virt_to_phys(control_page);
|
|
page_list[VA_CONTROL_PAGE] = (unsigned long)control_page;
|
|
- page_list[PA_TABLE_PAGE] =
|
|
- (unsigned long)__pa(page_address(image->control_code_page));
|
|
+ page_list[PA_TABLE_PAGE] = (unsigned long)__pa(image->arch.pgd);
|
|
|
|
if (image->type == KEXEC_TYPE_DEFAULT)
|
|
page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page)
|
|
@@ -574,8 +578,7 @@ static void kexec_mark_crashkres(bool protect)
|
|
|
|
/* Don't touch the control code page used in crash_kexec().*/
|
|
control = PFN_PHYS(page_to_pfn(kexec_crash_image->control_code_page));
|
|
- /* Control code page is located in the 2nd page. */
|
|
- kexec_mark_range(crashk_res.start, control + PAGE_SIZE - 1, protect);
|
|
+ kexec_mark_range(crashk_res.start, control - 1, protect);
|
|
control += KEXEC_CONTROL_PAGE_SIZE;
|
|
kexec_mark_range(control, crashk_res.end, protect);
|
|
}
|
|
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
|
|
index 34766abbabd84f..66c7f2367bb34e 100644
|
|
--- a/arch/x86/kvm/lapic.c
|
|
+++ b/arch/x86/kvm/lapic.c
|
|
@@ -338,10 +338,8 @@ static void kvm_recalculate_logical_map(struct kvm_apic_map *new,
|
|
* reversing the LDR calculation to get cluster of APICs, i.e. no
|
|
* additional work is required.
|
|
*/
|
|
- if (apic_x2apic_mode(apic)) {
|
|
- WARN_ON_ONCE(ldr != kvm_apic_calc_x2apic_ldr(kvm_x2apic_id(apic)));
|
|
+ if (apic_x2apic_mode(apic))
|
|
return;
|
|
- }
|
|
|
|
if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr,
|
|
&cluster, &mask))) {
|
|
@@ -2461,11 +2459,25 @@ int kvm_x2apic_icr_write(struct kvm_lapic *apic, u64 data)
|
|
data &= ~APIC_ICR_BUSY;
|
|
|
|
kvm_apic_send_ipi(apic, (u32)data, (u32)(data >> 32));
|
|
- kvm_lapic_set_reg64(apic, APIC_ICR, data);
|
|
+ if (kvm_x86_ops.x2apic_icr_is_split) {
|
|
+ kvm_lapic_set_reg(apic, APIC_ICR, data);
|
|
+ kvm_lapic_set_reg(apic, APIC_ICR2, data >> 32);
|
|
+ } else {
|
|
+ kvm_lapic_set_reg64(apic, APIC_ICR, data);
|
|
+ }
|
|
trace_kvm_apic_write(APIC_ICR, data);
|
|
return 0;
|
|
}
|
|
|
|
+static u64 kvm_x2apic_icr_read(struct kvm_lapic *apic)
|
|
+{
|
|
+ if (kvm_x86_ops.x2apic_icr_is_split)
|
|
+ return (u64)kvm_lapic_get_reg(apic, APIC_ICR) |
|
|
+ (u64)kvm_lapic_get_reg(apic, APIC_ICR2) << 32;
|
|
+
|
|
+ return kvm_lapic_get_reg64(apic, APIC_ICR);
|
|
+}
|
|
+
|
|
/* emulate APIC access in a trap manner */
|
|
void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset)
|
|
{
|
|
@@ -2483,7 +2495,7 @@ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset)
|
|
* maybe-unecessary write, and both are in the noise anyways.
|
|
*/
|
|
if (apic_x2apic_mode(apic) && offset == APIC_ICR)
|
|
- WARN_ON_ONCE(kvm_x2apic_icr_write(apic, kvm_lapic_get_reg64(apic, APIC_ICR)));
|
|
+ WARN_ON_ONCE(kvm_x2apic_icr_write(apic, kvm_x2apic_icr_read(apic)));
|
|
else
|
|
kvm_lapic_reg_write(apic, offset, kvm_lapic_get_reg(apic, offset));
|
|
}
|
|
@@ -2964,34 +2976,48 @@ static int kvm_apic_state_fixup(struct kvm_vcpu *vcpu,
|
|
struct kvm_lapic_state *s, bool set)
|
|
{
|
|
if (apic_x2apic_mode(vcpu->arch.apic)) {
|
|
+ u32 x2apic_id = kvm_x2apic_id(vcpu->arch.apic);
|
|
u32 *id = (u32 *)(s->regs + APIC_ID);
|
|
u32 *ldr = (u32 *)(s->regs + APIC_LDR);
|
|
u64 icr;
|
|
|
|
if (vcpu->kvm->arch.x2apic_format) {
|
|
- if (*id != vcpu->vcpu_id)
|
|
+ if (*id != x2apic_id)
|
|
return -EINVAL;
|
|
} else {
|
|
+ /*
|
|
+ * Ignore the userspace value when setting APIC state.
|
|
+ * KVM's model is that the x2APIC ID is readonly, e.g.
|
|
+ * KVM only supports delivering interrupts to KVM's
|
|
+ * version of the x2APIC ID. However, for backwards
|
|
+ * compatibility, don't reject attempts to set a
|
|
+ * mismatched ID for userspace that hasn't opted into
|
|
+ * x2apic_format.
|
|
+ */
|
|
if (set)
|
|
- *id >>= 24;
|
|
+ *id = x2apic_id;
|
|
else
|
|
- *id <<= 24;
|
|
+ *id = x2apic_id << 24;
|
|
}
|
|
|
|
/*
|
|
* In x2APIC mode, the LDR is fixed and based on the id. And
|
|
- * ICR is internally a single 64-bit register, but needs to be
|
|
- * split to ICR+ICR2 in userspace for backwards compatibility.
|
|
+ * if the ICR is _not_ split, ICR is internally a single 64-bit
|
|
+ * register, but needs to be split to ICR+ICR2 in userspace for
|
|
+ * backwards compatibility.
|
|
*/
|
|
- if (set) {
|
|
- *ldr = kvm_apic_calc_x2apic_ldr(*id);
|
|
-
|
|
- icr = __kvm_lapic_get_reg(s->regs, APIC_ICR) |
|
|
- (u64)__kvm_lapic_get_reg(s->regs, APIC_ICR2) << 32;
|
|
- __kvm_lapic_set_reg64(s->regs, APIC_ICR, icr);
|
|
- } else {
|
|
- icr = __kvm_lapic_get_reg64(s->regs, APIC_ICR);
|
|
- __kvm_lapic_set_reg(s->regs, APIC_ICR2, icr >> 32);
|
|
+ if (set)
|
|
+ *ldr = kvm_apic_calc_x2apic_ldr(x2apic_id);
|
|
+
|
|
+ if (!kvm_x86_ops.x2apic_icr_is_split) {
|
|
+ if (set) {
|
|
+ icr = __kvm_lapic_get_reg(s->regs, APIC_ICR) |
|
|
+ (u64)__kvm_lapic_get_reg(s->regs, APIC_ICR2) << 32;
|
|
+ __kvm_lapic_set_reg64(s->regs, APIC_ICR, icr);
|
|
+ } else {
|
|
+ icr = __kvm_lapic_get_reg64(s->regs, APIC_ICR);
|
|
+ __kvm_lapic_set_reg(s->regs, APIC_ICR2, icr >> 32);
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -3188,7 +3214,7 @@ static int kvm_lapic_msr_read(struct kvm_lapic *apic, u32 reg, u64 *data)
|
|
u32 low;
|
|
|
|
if (reg == APIC_ICR) {
|
|
- *data = kvm_lapic_get_reg64(apic, APIC_ICR);
|
|
+ *data = kvm_x2apic_icr_read(apic);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
|
|
index 413f1f2aadd1a3..d762330bce166c 100644
|
|
--- a/arch/x86/kvm/svm/svm.c
|
|
+++ b/arch/x86/kvm/svm/svm.c
|
|
@@ -5014,6 +5014,8 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
|
|
.enable_nmi_window = svm_enable_nmi_window,
|
|
.enable_irq_window = svm_enable_irq_window,
|
|
.update_cr8_intercept = svm_update_cr8_intercept,
|
|
+
|
|
+ .x2apic_icr_is_split = true,
|
|
.set_virtual_apic_mode = avic_refresh_virtual_apic_mode,
|
|
.refresh_apicv_exec_ctrl = avic_refresh_apicv_exec_ctrl,
|
|
.apicv_post_state_restore = avic_apicv_post_state_restore,
|
|
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
|
|
index 479ef26626f2fe..52098844290ad4 100644
|
|
--- a/arch/x86/kvm/vmx/vmx.c
|
|
+++ b/arch/x86/kvm/vmx/vmx.c
|
|
@@ -8323,6 +8323,8 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
|
|
.enable_nmi_window = vmx_enable_nmi_window,
|
|
.enable_irq_window = vmx_enable_irq_window,
|
|
.update_cr8_intercept = vmx_update_cr8_intercept,
|
|
+
|
|
+ .x2apic_icr_is_split = false,
|
|
.set_virtual_apic_mode = vmx_set_virtual_apic_mode,
|
|
.set_apic_access_page_addr = vmx_set_apic_access_page_addr,
|
|
.refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,
|
|
diff --git a/arch/x86/mm/ident_map.c b/arch/x86/mm/ident_map.c
|
|
index 7cbad417e094f6..fe0b2e66ded93f 100644
|
|
--- a/arch/x86/mm/ident_map.c
|
|
+++ b/arch/x86/mm/ident_map.c
|
|
@@ -26,18 +26,31 @@ static int ident_pud_init(struct x86_mapping_info *info, pud_t *pud_page,
|
|
for (; addr < end; addr = next) {
|
|
pud_t *pud = pud_page + pud_index(addr);
|
|
pmd_t *pmd;
|
|
+ bool use_gbpage;
|
|
|
|
next = (addr & PUD_MASK) + PUD_SIZE;
|
|
if (next > end)
|
|
next = end;
|
|
|
|
- if (info->direct_gbpages) {
|
|
- pud_t pudval;
|
|
+ /* if this is already a gbpage, this portion is already mapped */
|
|
+ if (pud_leaf(*pud))
|
|
+ continue;
|
|
+
|
|
+ /* Is using a gbpage allowed? */
|
|
+ use_gbpage = info->direct_gbpages;
|
|
|
|
- if (pud_present(*pud))
|
|
- continue;
|
|
+ /* Don't use gbpage if it maps more than the requested region. */
|
|
+ /* at the begining: */
|
|
+ use_gbpage &= ((addr & ~PUD_MASK) == 0);
|
|
+ /* ... or at the end: */
|
|
+ use_gbpage &= ((next & ~PUD_MASK) == 0);
|
|
+
|
|
+ /* Never overwrite existing mappings */
|
|
+ use_gbpage &= !pud_present(*pud);
|
|
+
|
|
+ if (use_gbpage) {
|
|
+ pud_t pudval;
|
|
|
|
- addr &= PUD_MASK;
|
|
pudval = __pud((addr - info->offset) | info->page_flag);
|
|
set_pud(pud, pudval);
|
|
continue;
|
|
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
|
|
index 98a9bb92d75c88..12d5a0f37432ea 100644
|
|
--- a/arch/x86/pci/fixup.c
|
|
+++ b/arch/x86/pci/fixup.c
|
|
@@ -1010,4 +1010,34 @@ DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x1668, amd_rp_pme_suspend);
|
|
DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1668, amd_rp_pme_resume);
|
|
DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x1669, amd_rp_pme_suspend);
|
|
DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1669, amd_rp_pme_resume);
|
|
+
|
|
+/*
|
|
+ * Putting PCIe root ports on Ryzen SoCs with USB4 controllers into D3hot
|
|
+ * may cause problems when the system attempts wake up from s2idle.
|
|
+ *
|
|
+ * On the TUXEDO Sirius 16 Gen 1 with a specific old BIOS this manifests as
|
|
+ * a system hang.
|
|
+ */
|
|
+static const struct dmi_system_id quirk_tuxeo_rp_d3_dmi_table[] = {
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
|
|
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "APX958"),
|
|
+ DMI_EXACT_MATCH(DMI_BIOS_VERSION, "V1.00A00_20240108"),
|
|
+ },
|
|
+ },
|
|
+ {}
|
|
+};
|
|
+
|
|
+static void quirk_tuxeo_rp_d3(struct pci_dev *pdev)
|
|
+{
|
|
+ struct pci_dev *root_pdev;
|
|
+
|
|
+ if (dmi_check_system(quirk_tuxeo_rp_d3_dmi_table)) {
|
|
+ root_pdev = pcie_find_root_port(pdev);
|
|
+ if (root_pdev)
|
|
+ root_pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3;
|
|
+ }
|
|
+}
|
|
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x1502, quirk_tuxeo_rp_d3);
|
|
#endif /* CONFIG_SUSPEND */
|
|
diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S
|
|
index 4fd814321ed021..059f343da76d61 100644
|
|
--- a/arch/x86/xen/xen-head.S
|
|
+++ b/arch/x86/xen/xen-head.S
|
|
@@ -117,8 +117,8 @@ SYM_FUNC_START(xen_hypercall_hvm)
|
|
pop %ebx
|
|
pop %eax
|
|
#else
|
|
- lea xen_hypercall_amd(%rip), %rbx
|
|
- cmp %rax, %rbx
|
|
+ lea xen_hypercall_amd(%rip), %rcx
|
|
+ cmp %rax, %rcx
|
|
#ifdef CONFIG_FRAME_POINTER
|
|
pop %rax /* Dummy pop. */
|
|
#endif
|
|
@@ -132,6 +132,7 @@ SYM_FUNC_START(xen_hypercall_hvm)
|
|
pop %rcx
|
|
pop %rax
|
|
#endif
|
|
+ FRAME_END
|
|
/* Use correct hypercall function. */
|
|
jz xen_hypercall_amd
|
|
jmp xen_hypercall_intel
|
|
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
|
|
index 7347eb29524df1..64551b0aa51e66 100644
|
|
--- a/block/blk-cgroup.c
|
|
+++ b/block/blk-cgroup.c
|
|
@@ -1139,6 +1139,7 @@ static void blkcg_fill_root_iostats(void)
|
|
blkg_iostat_set(&blkg->iostat.cur, &tmp);
|
|
u64_stats_update_end_irqrestore(&blkg->iostat.sync, flags);
|
|
}
|
|
+ class_dev_iter_exit(&iter);
|
|
}
|
|
|
|
static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
|
|
diff --git a/block/fops.c b/block/fops.c
|
|
index 1df187b3067920..7c257eb3564d0c 100644
|
|
--- a/block/fops.c
|
|
+++ b/block/fops.c
|
|
@@ -718,11 +718,12 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
|
file_accessed(iocb->ki_filp);
|
|
|
|
ret = blkdev_direct_IO(iocb, to);
|
|
- if (ret >= 0) {
|
|
+ if (ret > 0) {
|
|
iocb->ki_pos += ret;
|
|
count -= ret;
|
|
}
|
|
- iov_iter_revert(to, count - iov_iter_count(to));
|
|
+ if (ret != -EIOCBQUEUED)
|
|
+ iov_iter_revert(to, count - iov_iter_count(to));
|
|
if (ret < 0 || !count)
|
|
goto reexpand;
|
|
}
|
|
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
|
|
index ab2a82cb1b0b48..3aadc632d7dd53 100644
|
|
--- a/drivers/acpi/apei/ghes.c
|
|
+++ b/drivers/acpi/apei/ghes.c
|
|
@@ -170,8 +170,6 @@ static struct gen_pool *ghes_estatus_pool;
|
|
static struct ghes_estatus_cache __rcu *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE];
|
|
static atomic_t ghes_estatus_cache_alloced;
|
|
|
|
-static int ghes_panic_timeout __read_mostly = 30;
|
|
-
|
|
static void __iomem *ghes_map(u64 pfn, enum fixed_addresses fixmap_idx)
|
|
{
|
|
phys_addr_t paddr;
|
|
@@ -899,14 +897,16 @@ static void __ghes_panic(struct ghes *ghes,
|
|
struct acpi_hest_generic_status *estatus,
|
|
u64 buf_paddr, enum fixed_addresses fixmap_idx)
|
|
{
|
|
+ const char *msg = GHES_PFX "Fatal hardware error";
|
|
+
|
|
__ghes_print_estatus(KERN_EMERG, ghes->generic, estatus);
|
|
|
|
ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx);
|
|
|
|
- /* reboot to log the error! */
|
|
if (!panic_timeout)
|
|
- panic_timeout = ghes_panic_timeout;
|
|
- panic("Fatal hardware error!");
|
|
+ pr_emerg("%s but panic disabled\n", msg);
|
|
+
|
|
+ panic(msg);
|
|
}
|
|
|
|
static int ghes_proc(struct ghes *ghes)
|
|
diff --git a/drivers/acpi/prmt.c b/drivers/acpi/prmt.c
|
|
index 8b391f12853bb6..a34f7d37877c9a 100644
|
|
--- a/drivers/acpi/prmt.c
|
|
+++ b/drivers/acpi/prmt.c
|
|
@@ -263,9 +263,7 @@ static acpi_status acpi_platformrt_space_handler(u32 function,
|
|
if (!handler || !module)
|
|
goto invalid_guid;
|
|
|
|
- if (!handler->handler_addr ||
|
|
- !handler->static_data_buffer_addr ||
|
|
- !handler->acpi_param_buffer_addr) {
|
|
+ if (!handler->handler_addr) {
|
|
buffer->prm_status = PRM_HANDLER_ERROR;
|
|
return AE_OK;
|
|
}
|
|
diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c
|
|
index 4d958a165da058..dca5682308cb32 100644
|
|
--- a/drivers/acpi/property.c
|
|
+++ b/drivers/acpi/property.c
|
|
@@ -1116,8 +1116,6 @@ static int acpi_data_prop_read(const struct acpi_device_data *data,
|
|
}
|
|
break;
|
|
}
|
|
- if (nval == 0)
|
|
- return -EINVAL;
|
|
|
|
if (obj->type == ACPI_TYPE_BUFFER) {
|
|
if (proptype != DEV_PROP_U8)
|
|
@@ -1141,9 +1139,11 @@ static int acpi_data_prop_read(const struct acpi_device_data *data,
|
|
ret = acpi_copy_property_array_uint(items, (u64 *)val, nval);
|
|
break;
|
|
case DEV_PROP_STRING:
|
|
- ret = acpi_copy_property_array_string(
|
|
- items, (char **)val,
|
|
- min_t(u32, nval, obj->package.count));
|
|
+ nval = min_t(u32, nval, obj->package.count);
|
|
+ if (nval == 0)
|
|
+ return -ENODATA;
|
|
+
|
|
+ ret = acpi_copy_property_array_string(items, (char **)val, nval);
|
|
break;
|
|
default:
|
|
ret = -EINVAL;
|
|
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
|
|
index 8fcc622fcb3d49..9b6529f2dfcbd9 100644
|
|
--- a/drivers/ata/libata-sff.c
|
|
+++ b/drivers/ata/libata-sff.c
|
|
@@ -602,7 +602,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct page *page;
|
|
- unsigned int offset;
|
|
+ unsigned int offset, count;
|
|
|
|
if (!qc->cursg) {
|
|
qc->curbytes = qc->nbytes;
|
|
@@ -618,25 +618,27 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
|
page = nth_page(page, (offset >> PAGE_SHIFT));
|
|
offset %= PAGE_SIZE;
|
|
|
|
- trace_ata_sff_pio_transfer_data(qc, offset, qc->sect_size);
|
|
+ /* don't overrun current sg */
|
|
+ count = min(qc->cursg->length - qc->cursg_ofs, qc->sect_size);
|
|
+
|
|
+ trace_ata_sff_pio_transfer_data(qc, offset, count);
|
|
|
|
/*
|
|
* Split the transfer when it splits a page boundary. Note that the
|
|
* split still has to be dword aligned like all ATA data transfers.
|
|
*/
|
|
WARN_ON_ONCE(offset % 4);
|
|
- if (offset + qc->sect_size > PAGE_SIZE) {
|
|
+ if (offset + count > PAGE_SIZE) {
|
|
unsigned int split_len = PAGE_SIZE - offset;
|
|
|
|
ata_pio_xfer(qc, page, offset, split_len);
|
|
- ata_pio_xfer(qc, nth_page(page, 1), 0,
|
|
- qc->sect_size - split_len);
|
|
+ ata_pio_xfer(qc, nth_page(page, 1), 0, count - split_len);
|
|
} else {
|
|
- ata_pio_xfer(qc, page, offset, qc->sect_size);
|
|
+ ata_pio_xfer(qc, page, offset, count);
|
|
}
|
|
|
|
- qc->curbytes += qc->sect_size;
|
|
- qc->cursg_ofs += qc->sect_size;
|
|
+ qc->curbytes += count;
|
|
+ qc->cursg_ofs += count;
|
|
|
|
if (qc->cursg_ofs == qc->cursg->length) {
|
|
qc->cursg = sg_next(qc->cursg);
|
|
diff --git a/drivers/char/misc.c b/drivers/char/misc.c
|
|
index 541edc26ec89a1..2cf595d2e10b85 100644
|
|
--- a/drivers/char/misc.c
|
|
+++ b/drivers/char/misc.c
|
|
@@ -63,16 +63,30 @@ static DEFINE_MUTEX(misc_mtx);
|
|
#define DYNAMIC_MINORS 128 /* like dynamic majors */
|
|
static DEFINE_IDA(misc_minors_ida);
|
|
|
|
-static int misc_minor_alloc(void)
|
|
+static int misc_minor_alloc(int minor)
|
|
{
|
|
- int ret;
|
|
-
|
|
- ret = ida_alloc_max(&misc_minors_ida, DYNAMIC_MINORS - 1, GFP_KERNEL);
|
|
- if (ret >= 0) {
|
|
- ret = DYNAMIC_MINORS - ret - 1;
|
|
+ int ret = 0;
|
|
+
|
|
+ if (minor == MISC_DYNAMIC_MINOR) {
|
|
+ /* allocate free id */
|
|
+ ret = ida_alloc_max(&misc_minors_ida, DYNAMIC_MINORS - 1, GFP_KERNEL);
|
|
+ if (ret >= 0) {
|
|
+ ret = DYNAMIC_MINORS - ret - 1;
|
|
+ } else {
|
|
+ ret = ida_alloc_range(&misc_minors_ida, MISC_DYNAMIC_MINOR + 1,
|
|
+ MINORMASK, GFP_KERNEL);
|
|
+ }
|
|
} else {
|
|
- ret = ida_alloc_range(&misc_minors_ida, MISC_DYNAMIC_MINOR + 1,
|
|
- MINORMASK, GFP_KERNEL);
|
|
+ /* specific minor, check if it is in dynamic or misc dynamic range */
|
|
+ if (minor < DYNAMIC_MINORS) {
|
|
+ minor = DYNAMIC_MINORS - minor - 1;
|
|
+ ret = ida_alloc_range(&misc_minors_ida, minor, minor, GFP_KERNEL);
|
|
+ } else if (minor > MISC_DYNAMIC_MINOR) {
|
|
+ ret = ida_alloc_range(&misc_minors_ida, minor, minor, GFP_KERNEL);
|
|
+ } else {
|
|
+ /* case of non-dynamic minors, no need to allocate id */
|
|
+ ret = 0;
|
|
+ }
|
|
}
|
|
return ret;
|
|
}
|
|
@@ -219,7 +233,7 @@ int misc_register(struct miscdevice *misc)
|
|
mutex_lock(&misc_mtx);
|
|
|
|
if (is_dynamic) {
|
|
- int i = misc_minor_alloc();
|
|
+ int i = misc_minor_alloc(misc->minor);
|
|
|
|
if (i < 0) {
|
|
err = -EBUSY;
|
|
@@ -228,6 +242,7 @@ int misc_register(struct miscdevice *misc)
|
|
misc->minor = i;
|
|
} else {
|
|
struct miscdevice *c;
|
|
+ int i;
|
|
|
|
list_for_each_entry(c, &misc_list, list) {
|
|
if (c->minor == misc->minor) {
|
|
@@ -235,6 +250,12 @@ int misc_register(struct miscdevice *misc)
|
|
goto out;
|
|
}
|
|
}
|
|
+
|
|
+ i = misc_minor_alloc(misc->minor);
|
|
+ if (i < 0) {
|
|
+ err = -EBUSY;
|
|
+ goto out;
|
|
+ }
|
|
}
|
|
|
|
dev = MKDEV(MISC_MAJOR, misc->minor);
|
|
diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c
|
|
index bd757d836c5cf9..1a5644051d3103 100644
|
|
--- a/drivers/char/tpm/eventlog/acpi.c
|
|
+++ b/drivers/char/tpm/eventlog/acpi.c
|
|
@@ -63,6 +63,11 @@ static bool tpm_is_tpm2_log(void *bios_event_log, u64 len)
|
|
return n == 0;
|
|
}
|
|
|
|
+static void tpm_bios_log_free(void *data)
|
|
+{
|
|
+ kvfree(data);
|
|
+}
|
|
+
|
|
/* read binary bios log */
|
|
int tpm_read_log_acpi(struct tpm_chip *chip)
|
|
{
|
|
@@ -136,7 +141,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
|
}
|
|
|
|
/* malloc EventLog space */
|
|
- log->bios_event_log = devm_kmalloc(&chip->dev, len, GFP_KERNEL);
|
|
+ log->bios_event_log = kvmalloc(len, GFP_KERNEL);
|
|
if (!log->bios_event_log)
|
|
return -ENOMEM;
|
|
|
|
@@ -162,10 +167,16 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
|
goto err;
|
|
}
|
|
|
|
+ ret = devm_add_action(&chip->dev, tpm_bios_log_free, log->bios_event_log);
|
|
+ if (ret) {
|
|
+ log->bios_event_log = NULL;
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
return format;
|
|
|
|
err:
|
|
- devm_kfree(&chip->dev, log->bios_event_log);
|
|
+ tpm_bios_log_free(log->bios_event_log);
|
|
log->bios_event_log = NULL;
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/clk/mediatek/clk-mt2701-aud.c b/drivers/clk/mediatek/clk-mt2701-aud.c
|
|
index 27eecb6d3a533b..d157b07effa2a6 100644
|
|
--- a/drivers/clk/mediatek/clk-mt2701-aud.c
|
|
+++ b/drivers/clk/mediatek/clk-mt2701-aud.c
|
|
@@ -55,10 +55,16 @@ static const struct mtk_gate audio_clks[] = {
|
|
GATE_DUMMY(CLK_DUMMY, "aud_dummy"),
|
|
/* AUDIO0 */
|
|
GATE_AUDIO0(CLK_AUD_AFE, "audio_afe", "aud_intbus_sel", 2),
|
|
+ GATE_DUMMY(CLK_AUD_LRCK_DETECT, "audio_lrck_detect_dummy"),
|
|
+ GATE_DUMMY(CLK_AUD_I2S, "audio_i2c_dummy"),
|
|
+ GATE_DUMMY(CLK_AUD_APLL_TUNER, "audio_apll_tuner_dummy"),
|
|
GATE_AUDIO0(CLK_AUD_HDMI, "audio_hdmi", "audpll_sel", 20),
|
|
GATE_AUDIO0(CLK_AUD_SPDF, "audio_spdf", "audpll_sel", 21),
|
|
GATE_AUDIO0(CLK_AUD_SPDF2, "audio_spdf2", "audpll_sel", 22),
|
|
GATE_AUDIO0(CLK_AUD_APLL, "audio_apll", "audpll_sel", 23),
|
|
+ GATE_DUMMY(CLK_AUD_TML, "audio_tml_dummy"),
|
|
+ GATE_DUMMY(CLK_AUD_AHB_IDLE_EXT, "audio_ahb_idle_ext_dummy"),
|
|
+ GATE_DUMMY(CLK_AUD_AHB_IDLE_INT, "audio_ahb_idle_int_dummy"),
|
|
/* AUDIO1 */
|
|
GATE_AUDIO1(CLK_AUD_I2SIN1, "audio_i2sin1", "aud_mux1_sel", 0),
|
|
GATE_AUDIO1(CLK_AUD_I2SIN2, "audio_i2sin2", "aud_mux1_sel", 1),
|
|
@@ -76,10 +82,12 @@ static const struct mtk_gate audio_clks[] = {
|
|
GATE_AUDIO1(CLK_AUD_ASRCI2, "audio_asrci2", "asm_h_sel", 13),
|
|
GATE_AUDIO1(CLK_AUD_ASRCO1, "audio_asrco1", "asm_h_sel", 14),
|
|
GATE_AUDIO1(CLK_AUD_ASRCO2, "audio_asrco2", "asm_h_sel", 15),
|
|
+ GATE_DUMMY(CLK_AUD_HDMIRX, "audio_hdmirx_dummy"),
|
|
GATE_AUDIO1(CLK_AUD_INTDIR, "audio_intdir", "intdir_sel", 20),
|
|
GATE_AUDIO1(CLK_AUD_A1SYS, "audio_a1sys", "aud_mux1_sel", 21),
|
|
GATE_AUDIO1(CLK_AUD_A2SYS, "audio_a2sys", "aud_mux2_sel", 22),
|
|
GATE_AUDIO1(CLK_AUD_AFE_CONN, "audio_afe_conn", "aud_mux1_sel", 23),
|
|
+ GATE_DUMMY(CLK_AUD_AFE_PCMIF, "audio_afe_pcmif_dummy"),
|
|
GATE_AUDIO1(CLK_AUD_AFE_MRGIF, "audio_afe_mrgif", "aud_mux1_sel", 25),
|
|
/* AUDIO2 */
|
|
GATE_AUDIO2(CLK_AUD_MMIF_UL1, "audio_ul1", "aud_mux1_sel", 0),
|
|
@@ -100,6 +108,8 @@ static const struct mtk_gate audio_clks[] = {
|
|
GATE_AUDIO2(CLK_AUD_MMIF_AWB2, "audio_awb2", "aud_mux1_sel", 15),
|
|
GATE_AUDIO2(CLK_AUD_MMIF_DAI, "audio_dai", "aud_mux1_sel", 16),
|
|
/* AUDIO3 */
|
|
+ GATE_DUMMY(CLK_AUD_DMIC1, "audio_dmic1_dummy"),
|
|
+ GATE_DUMMY(CLK_AUD_DMIC2, "audio_dmic2_dummy"),
|
|
GATE_AUDIO3(CLK_AUD_ASRCI3, "audio_asrci3", "asm_h_sel", 2),
|
|
GATE_AUDIO3(CLK_AUD_ASRCI4, "audio_asrci4", "asm_h_sel", 3),
|
|
GATE_AUDIO3(CLK_AUD_ASRCI5, "audio_asrci5", "asm_h_sel", 4),
|
|
diff --git a/drivers/clk/mediatek/clk-mt2701-bdp.c b/drivers/clk/mediatek/clk-mt2701-bdp.c
|
|
index b25703ec8dc08f..0728484d6f173d 100644
|
|
--- a/drivers/clk/mediatek/clk-mt2701-bdp.c
|
|
+++ b/drivers/clk/mediatek/clk-mt2701-bdp.c
|
|
@@ -31,6 +31,7 @@ static const struct mtk_gate_regs bdp1_cg_regs = {
|
|
GATE_MTK(_id, _name, _parent, &bdp1_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
|
|
|
|
static const struct mtk_gate bdp_clks[] = {
|
|
+ GATE_DUMMY(CLK_DUMMY, "bdp_dummy"),
|
|
GATE_BDP0(CLK_BDP_BRG_BA, "brg_baclk", "mm_sel", 0),
|
|
GATE_BDP0(CLK_BDP_BRG_DRAM, "brg_dram", "mm_sel", 1),
|
|
GATE_BDP0(CLK_BDP_LARB_DRAM, "larb_dram", "mm_sel", 2),
|
|
diff --git a/drivers/clk/mediatek/clk-mt2701-img.c b/drivers/clk/mediatek/clk-mt2701-img.c
|
|
index 2768360b213efc..b972deed7ef4ee 100644
|
|
--- a/drivers/clk/mediatek/clk-mt2701-img.c
|
|
+++ b/drivers/clk/mediatek/clk-mt2701-img.c
|
|
@@ -22,6 +22,7 @@ static const struct mtk_gate_regs img_cg_regs = {
|
|
GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
|
|
|
static const struct mtk_gate img_clks[] = {
|
|
+ GATE_DUMMY(CLK_DUMMY, "img_dummy"),
|
|
GATE_IMG(CLK_IMG_SMI_COMM, "img_smi_comm", "mm_sel", 0),
|
|
GATE_IMG(CLK_IMG_RESZ, "img_resz", "mm_sel", 1),
|
|
GATE_IMG(CLK_IMG_JPGDEC_SMI, "img_jpgdec_smi", "mm_sel", 5),
|
|
diff --git a/drivers/clk/mediatek/clk-mt2701-mm.c b/drivers/clk/mediatek/clk-mt2701-mm.c
|
|
index 2b990b5a0422a4..bebb22b32fafa3 100644
|
|
--- a/drivers/clk/mediatek/clk-mt2701-mm.c
|
|
+++ b/drivers/clk/mediatek/clk-mt2701-mm.c
|
|
@@ -31,6 +31,7 @@ static const struct mtk_gate_regs disp1_cg_regs = {
|
|
GATE_MTK(_id, _name, _parent, &disp1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
|
|
|
static const struct mtk_gate mm_clks[] = {
|
|
+ GATE_DUMMY(CLK_DUMMY, "mm_dummy"),
|
|
GATE_DISP0(CLK_MM_SMI_COMMON, "mm_smi_comm", "mm_sel", 0),
|
|
GATE_DISP0(CLK_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 1),
|
|
GATE_DISP0(CLK_MM_CMDQ, "mm_cmdq", "mm_sel", 2),
|
|
diff --git a/drivers/clk/mediatek/clk-mt2701-vdec.c b/drivers/clk/mediatek/clk-mt2701-vdec.c
|
|
index 57711b953b7f90..5b8035c6794e2e 100644
|
|
--- a/drivers/clk/mediatek/clk-mt2701-vdec.c
|
|
+++ b/drivers/clk/mediatek/clk-mt2701-vdec.c
|
|
@@ -31,6 +31,7 @@ static const struct mtk_gate_regs vdec1_cg_regs = {
|
|
GATE_MTK(_id, _name, _parent, &vdec1_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
|
|
|
|
static const struct mtk_gate vdec_clks[] = {
|
|
+ GATE_DUMMY(CLK_DUMMY, "vdec_dummy"),
|
|
GATE_VDEC0(CLK_VDEC_CKGEN, "vdec_cken", "vdec_sel", 0),
|
|
GATE_VDEC1(CLK_VDEC_LARB, "vdec_larb_cken", "mm_sel", 0),
|
|
};
|
|
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
|
|
index a79b837583894f..1de1661037b1b1 100644
|
|
--- a/drivers/clk/qcom/Kconfig
|
|
+++ b/drivers/clk/qcom/Kconfig
|
|
@@ -881,6 +881,7 @@ config SM_GCC_7150
|
|
config SM_GCC_8150
|
|
tristate "SM8150 Global Clock Controller"
|
|
depends on ARM64 || COMPILE_TEST
|
|
+ select QCOM_GDSC
|
|
help
|
|
Support for the global clock controller on SM8150 devices.
|
|
Say Y if you want to use peripheral devices such as UART,
|
|
diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c
|
|
index ce44dbfd47e275..80aadafffacdb1 100644
|
|
--- a/drivers/clk/qcom/clk-alpha-pll.c
|
|
+++ b/drivers/clk/qcom/clk-alpha-pll.c
|
|
@@ -407,6 +407,8 @@ void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
|
mask |= config->pre_div_mask;
|
|
mask |= config->post_div_mask;
|
|
mask |= config->vco_mask;
|
|
+ mask |= config->alpha_en_mask;
|
|
+ mask |= config->alpha_mode_mask;
|
|
|
|
regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
|
|
|
|
diff --git a/drivers/clk/qcom/clk-rpmh.c b/drivers/clk/qcom/clk-rpmh.c
|
|
index a8b5f4d8a7b9e6..edbae2a88afcf1 100644
|
|
--- a/drivers/clk/qcom/clk-rpmh.c
|
|
+++ b/drivers/clk/qcom/clk-rpmh.c
|
|
@@ -329,7 +329,7 @@ static unsigned long clk_rpmh_bcm_recalc_rate(struct clk_hw *hw,
|
|
{
|
|
struct clk_rpmh *c = to_clk_rpmh(hw);
|
|
|
|
- return c->aggr_state * c->unit;
|
|
+ return (unsigned long)c->aggr_state * c->unit;
|
|
}
|
|
|
|
static const struct clk_ops clk_rpmh_bcm_ops = {
|
|
diff --git a/drivers/clk/qcom/dispcc-sm6350.c b/drivers/clk/qcom/dispcc-sm6350.c
|
|
index 441f042f5ea459..ddacb4f76eca5f 100644
|
|
--- a/drivers/clk/qcom/dispcc-sm6350.c
|
|
+++ b/drivers/clk/qcom/dispcc-sm6350.c
|
|
@@ -187,13 +187,12 @@ static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
|
|
.cmd_rcgr = 0x1144,
|
|
.mnd_width = 0,
|
|
.hid_width = 5,
|
|
+ .parent_map = disp_cc_parent_map_6,
|
|
.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
|
|
.clkr.hw.init = &(struct clk_init_data){
|
|
.name = "disp_cc_mdss_dp_aux_clk_src",
|
|
- .parent_data = &(const struct clk_parent_data){
|
|
- .fw_name = "bi_tcxo",
|
|
- },
|
|
- .num_parents = 1,
|
|
+ .parent_data = disp_cc_parent_data_6,
|
|
+ .num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
|
|
.ops = &clk_rcg2_ops,
|
|
},
|
|
};
|
|
diff --git a/drivers/clk/qcom/gcc-mdm9607.c b/drivers/clk/qcom/gcc-mdm9607.c
|
|
index fb290e73ce9487..9169cdccf3ed88 100644
|
|
--- a/drivers/clk/qcom/gcc-mdm9607.c
|
|
+++ b/drivers/clk/qcom/gcc-mdm9607.c
|
|
@@ -535,7 +535,7 @@ static struct clk_rcg2 blsp1_uart5_apps_clk_src = {
|
|
};
|
|
|
|
static struct clk_rcg2 blsp1_uart6_apps_clk_src = {
|
|
- .cmd_rcgr = 0x6044,
|
|
+ .cmd_rcgr = 0x7044,
|
|
.mnd_width = 16,
|
|
.hid_width = 5,
|
|
.parent_map = gcc_xo_gpll0_map,
|
|
diff --git a/drivers/clk/qcom/gcc-sm6350.c b/drivers/clk/qcom/gcc-sm6350.c
|
|
index 0559a33faf00e6..428cd99dcdcbe5 100644
|
|
--- a/drivers/clk/qcom/gcc-sm6350.c
|
|
+++ b/drivers/clk/qcom/gcc-sm6350.c
|
|
@@ -182,6 +182,14 @@ static const struct clk_parent_data gcc_parent_data_2_ao[] = {
|
|
{ .hw = &gpll0_out_odd.clkr.hw },
|
|
};
|
|
|
|
+static const struct parent_map gcc_parent_map_3[] = {
|
|
+ { P_BI_TCXO, 0 },
|
|
+};
|
|
+
|
|
+static const struct clk_parent_data gcc_parent_data_3[] = {
|
|
+ { .fw_name = "bi_tcxo" },
|
|
+};
|
|
+
|
|
static const struct parent_map gcc_parent_map_4[] = {
|
|
{ P_BI_TCXO, 0 },
|
|
{ P_GPLL0_OUT_MAIN, 1 },
|
|
@@ -701,13 +709,12 @@ static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
|
|
.cmd_rcgr = 0x3a0b0,
|
|
.mnd_width = 0,
|
|
.hid_width = 5,
|
|
+ .parent_map = gcc_parent_map_3,
|
|
.freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src,
|
|
.clkr.hw.init = &(struct clk_init_data){
|
|
.name = "gcc_ufs_phy_phy_aux_clk_src",
|
|
- .parent_data = &(const struct clk_parent_data){
|
|
- .fw_name = "bi_tcxo",
|
|
- },
|
|
- .num_parents = 1,
|
|
+ .parent_data = gcc_parent_data_3,
|
|
+ .num_parents = ARRAY_SIZE(gcc_parent_data_3),
|
|
.ops = &clk_rcg2_ops,
|
|
},
|
|
};
|
|
@@ -764,13 +771,12 @@ static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
|
|
.cmd_rcgr = 0x1a034,
|
|
.mnd_width = 0,
|
|
.hid_width = 5,
|
|
+ .parent_map = gcc_parent_map_3,
|
|
.freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
|
|
.clkr.hw.init = &(struct clk_init_data){
|
|
.name = "gcc_usb30_prim_mock_utmi_clk_src",
|
|
- .parent_data = &(const struct clk_parent_data){
|
|
- .fw_name = "bi_tcxo",
|
|
- },
|
|
- .num_parents = 1,
|
|
+ .parent_data = gcc_parent_data_3,
|
|
+ .num_parents = ARRAY_SIZE(gcc_parent_data_3),
|
|
.ops = &clk_rcg2_ops,
|
|
},
|
|
};
|
|
diff --git a/drivers/clk/qcom/gcc-sm8550.c b/drivers/clk/qcom/gcc-sm8550.c
|
|
index eb3765c57b6502..b30ece62216f7e 100644
|
|
--- a/drivers/clk/qcom/gcc-sm8550.c
|
|
+++ b/drivers/clk/qcom/gcc-sm8550.c
|
|
@@ -3003,7 +3003,7 @@ static struct gdsc pcie_0_gdsc = {
|
|
.pd = {
|
|
.name = "pcie_0_gdsc",
|
|
},
|
|
- .pwrsts = PWRSTS_OFF_ON,
|
|
+ .pwrsts = PWRSTS_RET_ON,
|
|
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
|
};
|
|
|
|
@@ -3014,7 +3014,7 @@ static struct gdsc pcie_0_phy_gdsc = {
|
|
.pd = {
|
|
.name = "pcie_0_phy_gdsc",
|
|
},
|
|
- .pwrsts = PWRSTS_OFF_ON,
|
|
+ .pwrsts = PWRSTS_RET_ON,
|
|
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
|
};
|
|
|
|
@@ -3025,7 +3025,7 @@ static struct gdsc pcie_1_gdsc = {
|
|
.pd = {
|
|
.name = "pcie_1_gdsc",
|
|
},
|
|
- .pwrsts = PWRSTS_OFF_ON,
|
|
+ .pwrsts = PWRSTS_RET_ON,
|
|
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
|
};
|
|
|
|
@@ -3036,7 +3036,7 @@ static struct gdsc pcie_1_phy_gdsc = {
|
|
.pd = {
|
|
.name = "pcie_1_phy_gdsc",
|
|
},
|
|
- .pwrsts = PWRSTS_OFF_ON,
|
|
+ .pwrsts = PWRSTS_RET_ON,
|
|
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
|
};
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a100.c b/drivers/clk/sunxi-ng/ccu-sun50i-a100.c
|
|
index 5f93b5526e13d6..52c1d5ebb0a12a 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu-sun50i-a100.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu-sun50i-a100.c
|
|
@@ -436,7 +436,7 @@ static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc0_clk, "mmc0", mmc_parents, 0x830,
|
|
24, 2, /* mux */
|
|
BIT(31), /* gate */
|
|
2, /* post-div */
|
|
- CLK_SET_RATE_NO_REPARENT);
|
|
+ 0);
|
|
|
|
static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1", mmc_parents, 0x834,
|
|
0, 4, /* M */
|
|
@@ -444,7 +444,7 @@ static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1", mmc_parents, 0x834,
|
|
24, 2, /* mux */
|
|
BIT(31), /* gate */
|
|
2, /* post-div */
|
|
- CLK_SET_RATE_NO_REPARENT);
|
|
+ 0);
|
|
|
|
static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc_parents, 0x838,
|
|
0, 4, /* M */
|
|
@@ -452,7 +452,7 @@ static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc_parents, 0x838,
|
|
24, 2, /* mux */
|
|
BIT(31), /* gate */
|
|
2, /* post-div */
|
|
- CLK_SET_RATE_NO_REPARENT);
|
|
+ 0);
|
|
|
|
static SUNXI_CCU_GATE(bus_mmc0_clk, "bus-mmc0", "ahb3", 0x84c, BIT(0), 0);
|
|
static SUNXI_CCU_GATE(bus_mmc1_clk, "bus-mmc1", "ahb3", 0x84c, BIT(1), 0);
|
|
diff --git a/drivers/cpufreq/s3c64xx-cpufreq.c b/drivers/cpufreq/s3c64xx-cpufreq.c
|
|
index c6bdfc308e9908..9cef7152807626 100644
|
|
--- a/drivers/cpufreq/s3c64xx-cpufreq.c
|
|
+++ b/drivers/cpufreq/s3c64xx-cpufreq.c
|
|
@@ -24,6 +24,7 @@ struct s3c64xx_dvfs {
|
|
unsigned int vddarm_max;
|
|
};
|
|
|
|
+#ifdef CONFIG_REGULATOR
|
|
static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = {
|
|
[0] = { 1000000, 1150000 },
|
|
[1] = { 1050000, 1150000 },
|
|
@@ -31,6 +32,7 @@ static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = {
|
|
[3] = { 1200000, 1350000 },
|
|
[4] = { 1300000, 1350000 },
|
|
};
|
|
+#endif
|
|
|
|
static struct cpufreq_frequency_table s3c64xx_freq_table[] = {
|
|
{ 0, 0, 66000 },
|
|
@@ -51,15 +53,16 @@ static struct cpufreq_frequency_table s3c64xx_freq_table[] = {
|
|
static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,
|
|
unsigned int index)
|
|
{
|
|
- struct s3c64xx_dvfs *dvfs;
|
|
- unsigned int old_freq, new_freq;
|
|
+ unsigned int new_freq = s3c64xx_freq_table[index].frequency;
|
|
int ret;
|
|
|
|
+#ifdef CONFIG_REGULATOR
|
|
+ struct s3c64xx_dvfs *dvfs;
|
|
+ unsigned int old_freq;
|
|
+
|
|
old_freq = clk_get_rate(policy->clk) / 1000;
|
|
- new_freq = s3c64xx_freq_table[index].frequency;
|
|
dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[index].driver_data];
|
|
|
|
-#ifdef CONFIG_REGULATOR
|
|
if (vddarm && new_freq > old_freq) {
|
|
ret = regulator_set_voltage(vddarm,
|
|
dvfs->vddarm_min,
|
|
diff --git a/drivers/crypto/qce/aead.c b/drivers/crypto/qce/aead.c
|
|
index 7d811728f04782..97b56e92ea33f5 100644
|
|
--- a/drivers/crypto/qce/aead.c
|
|
+++ b/drivers/crypto/qce/aead.c
|
|
@@ -786,7 +786,7 @@ static int qce_aead_register_one(const struct qce_aead_def *def, struct qce_devi
|
|
alg->init = qce_aead_init;
|
|
alg->exit = qce_aead_exit;
|
|
|
|
- alg->base.cra_priority = 300;
|
|
+ alg->base.cra_priority = 275;
|
|
alg->base.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_ALLOCATES_MEMORY |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY |
|
|
diff --git a/drivers/crypto/qce/core.c b/drivers/crypto/qce/core.c
|
|
index fce49c0dee3e2d..8bcb9adf1aee3f 100644
|
|
--- a/drivers/crypto/qce/core.c
|
|
+++ b/drivers/crypto/qce/core.c
|
|
@@ -51,16 +51,19 @@ static void qce_unregister_algs(struct qce_device *qce)
|
|
static int qce_register_algs(struct qce_device *qce)
|
|
{
|
|
const struct qce_algo_ops *ops;
|
|
- int i, ret = -ENODEV;
|
|
+ int i, j, ret = -ENODEV;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(qce_ops); i++) {
|
|
ops = qce_ops[i];
|
|
ret = ops->register_algs(qce);
|
|
- if (ret)
|
|
- break;
|
|
+ if (ret) {
|
|
+ for (j = i - 1; j >= 0; j--)
|
|
+ ops->unregister_algs(qce);
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
static int qce_handle_request(struct crypto_async_request *async_req)
|
|
@@ -247,7 +250,7 @@ static int qce_crypto_probe(struct platform_device *pdev)
|
|
|
|
ret = qce_check_version(qce);
|
|
if (ret)
|
|
- goto err_clks;
|
|
+ goto err_dma;
|
|
|
|
spin_lock_init(&qce->lock);
|
|
tasklet_init(&qce->done_tasklet, qce_tasklet_req_done,
|
|
diff --git a/drivers/crypto/qce/sha.c b/drivers/crypto/qce/sha.c
|
|
index fc72af8aa9a725..71b748183cfa86 100644
|
|
--- a/drivers/crypto/qce/sha.c
|
|
+++ b/drivers/crypto/qce/sha.c
|
|
@@ -482,7 +482,7 @@ static int qce_ahash_register_one(const struct qce_ahash_def *def,
|
|
|
|
base = &alg->halg.base;
|
|
base->cra_blocksize = def->blocksize;
|
|
- base->cra_priority = 300;
|
|
+ base->cra_priority = 175;
|
|
base->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
|
|
base->cra_ctxsize = sizeof(struct qce_sha_ctx);
|
|
base->cra_alignmask = 0;
|
|
diff --git a/drivers/crypto/qce/skcipher.c b/drivers/crypto/qce/skcipher.c
|
|
index 5b493fdc1e747f..ffb334eb5b3461 100644
|
|
--- a/drivers/crypto/qce/skcipher.c
|
|
+++ b/drivers/crypto/qce/skcipher.c
|
|
@@ -461,7 +461,7 @@ static int qce_skcipher_register_one(const struct qce_skcipher_def *def,
|
|
alg->encrypt = qce_skcipher_encrypt;
|
|
alg->decrypt = qce_skcipher_decrypt;
|
|
|
|
- alg->base.cra_priority = 300;
|
|
+ alg->base.cra_priority = 275;
|
|
alg->base.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_ALLOCATES_MEMORY |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY;
|
|
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
|
|
index f0e9f250669e2f..3f2f22e47bfa1a 100644
|
|
--- a/drivers/firmware/Kconfig
|
|
+++ b/drivers/firmware/Kconfig
|
|
@@ -139,7 +139,7 @@ config ISCSI_IBFT
|
|
select ISCSI_BOOT_SYSFS
|
|
select ISCSI_IBFT_FIND if X86
|
|
depends on ACPI && SCSI && SCSI_LOWLEVEL
|
|
- default n
|
|
+ default n
|
|
help
|
|
This option enables support for detection and exposing of iSCSI
|
|
Boot Firmware Table (iBFT) via sysfs to userspace. If you wish to
|
|
diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile
|
|
index a0f1569b790da5..29afa73e4b282c 100644
|
|
--- a/drivers/firmware/efi/libstub/Makefile
|
|
+++ b/drivers/firmware/efi/libstub/Makefile
|
|
@@ -11,7 +11,7 @@ cflags-y := $(KBUILD_CFLAGS)
|
|
|
|
cflags-$(CONFIG_X86_32) := -march=i386
|
|
cflags-$(CONFIG_X86_64) := -mcmodel=small
|
|
-cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \
|
|
+cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ -std=gnu11 \
|
|
-fPIC -fno-strict-aliasing -mno-red-zone \
|
|
-mno-mmx -mno-sse -fshort-wchar \
|
|
-Wno-pointer-sign \
|
|
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
|
|
index 9c33f9da724cfd..b882b26ab5007b 100644
|
|
--- a/drivers/gpio/gpio-pca953x.c
|
|
+++ b/drivers/gpio/gpio-pca953x.c
|
|
@@ -847,25 +847,6 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pendin
|
|
DECLARE_BITMAP(trigger, MAX_LINE);
|
|
int ret;
|
|
|
|
- if (chip->driver_data & PCA_PCAL) {
|
|
- /* Read the current interrupt status from the device */
|
|
- ret = pca953x_read_regs(chip, PCAL953X_INT_STAT, trigger);
|
|
- if (ret)
|
|
- return false;
|
|
-
|
|
- /* Check latched inputs and clear interrupt status */
|
|
- ret = pca953x_read_regs(chip, chip->regs->input, cur_stat);
|
|
- if (ret)
|
|
- return false;
|
|
-
|
|
- /* Apply filter for rising/falling edge selection */
|
|
- bitmap_replace(new_stat, chip->irq_trig_fall, chip->irq_trig_raise, cur_stat, gc->ngpio);
|
|
-
|
|
- bitmap_and(pending, new_stat, trigger, gc->ngpio);
|
|
-
|
|
- return !bitmap_empty(pending, gc->ngpio);
|
|
- }
|
|
-
|
|
ret = pca953x_read_regs(chip, chip->regs->input, cur_stat);
|
|
if (ret)
|
|
return false;
|
|
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
|
|
index 0583af4e84fa3f..a02777694d9951 100644
|
|
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
|
|
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
|
|
@@ -86,9 +86,12 @@ void kfd_process_dequeue_from_device(struct kfd_process_device *pdd)
|
|
|
|
if (pdd->already_dequeued)
|
|
return;
|
|
-
|
|
+ /* The MES context flush needs to filter out the case which the
|
|
+ * KFD process is created without setting up the MES context and
|
|
+ * queue for creating a compute queue.
|
|
+ */
|
|
dev->dqm->ops.process_termination(dev->dqm, &pdd->qpd);
|
|
- if (dev->kfd->shared_resources.enable_mes &&
|
|
+ if (dev->kfd->shared_resources.enable_mes && !!pdd->proc_ctx_gpu_addr &&
|
|
down_read_trylock(&dev->adev->reset_domain->sem)) {
|
|
amdgpu_mes_flush_shader_debugger(dev->adev,
|
|
pdd->proc_ctx_gpu_addr);
|
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
index 8a152f4974d3c5..aab99df3ba1ae4 100644
|
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
@@ -955,8 +955,10 @@ static int amdgpu_dm_audio_component_get_eld(struct device *kdev, int port,
|
|
continue;
|
|
|
|
*enabled = true;
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
ret = drm_eld_size(connector->eld);
|
|
memcpy(buf, connector->eld, min(max_bytes, ret));
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
|
|
break;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
|
|
index 385a5a75fdf873..5858e288b3fd66 100644
|
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
|
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
|
|
@@ -1578,16 +1578,16 @@ int pre_validate_dsc(struct drm_atomic_state *state,
|
|
return ret;
|
|
}
|
|
|
|
-static unsigned int kbps_from_pbn(unsigned int pbn)
|
|
+static uint32_t kbps_from_pbn(unsigned int pbn)
|
|
{
|
|
- unsigned int kbps = pbn;
|
|
+ uint64_t kbps = (uint64_t)pbn;
|
|
|
|
kbps *= (1000000 / PEAK_FACTOR_X1000);
|
|
kbps *= 8;
|
|
kbps *= 54;
|
|
kbps /= 64;
|
|
|
|
- return kbps;
|
|
+ return (uint32_t)kbps;
|
|
}
|
|
|
|
static bool is_dsc_common_config_possible(struct dc_stream_state *stream,
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c
|
|
index f11b071a896f59..2aa0e01a6891b0 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c
|
|
+++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c
|
|
@@ -63,8 +63,7 @@ void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
|
|
|
|
bool should_use_dmub_lock(struct dc_link *link)
|
|
{
|
|
- if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1 ||
|
|
- link->psr_settings.psr_version == DC_PSR_VERSION_1)
|
|
+ if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1)
|
|
return true;
|
|
return false;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
|
|
index ded8952d984907..b2256178014990 100644
|
|
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
|
|
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
|
|
@@ -1752,7 +1752,6 @@ static ssize_t aldebaran_get_gpu_metrics(struct smu_context *smu,
|
|
|
|
gpu_metrics->average_gfx_activity = metrics.AverageGfxActivity;
|
|
gpu_metrics->average_umc_activity = metrics.AverageUclkActivity;
|
|
- gpu_metrics->average_mm_activity = 0;
|
|
|
|
/* Valid power data is available only from primary die */
|
|
if (aldebaran_is_primary(smu)) {
|
|
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
|
|
index ebccb74306a765..f30b3d5eeca5c5 100644
|
|
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
|
|
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
|
|
@@ -160,6 +160,10 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
|
|
formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl,
|
|
kwb_conn->wb_layer->layer_type,
|
|
&n_formats);
|
|
+ if (!formats) {
|
|
+ kfree(kwb_conn);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
err = drm_writeback_connector_init(&kms->base, wb_conn,
|
|
&komeda_wb_connector_funcs,
|
|
diff --git a/drivers/gpu/drm/bridge/analogix/anx7625.c b/drivers/gpu/drm/bridge/analogix/anx7625.c
|
|
index 412c6575e87b74..ddf944651c55a9 100644
|
|
--- a/drivers/gpu/drm/bridge/analogix/anx7625.c
|
|
+++ b/drivers/gpu/drm/bridge/analogix/anx7625.c
|
|
@@ -2014,8 +2014,10 @@ static int anx7625_audio_get_eld(struct device *dev, void *data,
|
|
memset(buf, 0, len);
|
|
} else {
|
|
dev_dbg(dev, "audio copy eld\n");
|
|
+ mutex_lock(&ctx->connector->eld_mutex);
|
|
memcpy(buf, ctx->connector->eld,
|
|
min(sizeof(ctx->connector->eld), len));
|
|
+ mutex_unlock(&ctx->connector->eld_mutex);
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
|
|
index 24c5a926af8d1d..fe33b988d7523e 100644
|
|
--- a/drivers/gpu/drm/bridge/ite-it6505.c
|
|
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
|
|
@@ -295,7 +295,7 @@
|
|
#define MAX_LANE_COUNT 4
|
|
#define MAX_LINK_RATE HBR
|
|
#define AUTO_TRAIN_RETRY 3
|
|
-#define MAX_HDCP_DOWN_STREAM_COUNT 10
|
|
+#define MAX_HDCP_DOWN_STREAM_COUNT 127
|
|
#define MAX_CR_LEVEL 0x03
|
|
#define MAX_EQ_LEVEL 0x03
|
|
#define AUX_WAIT_TIMEOUT_MS 15
|
|
@@ -2020,7 +2020,7 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
|
|
{
|
|
struct device *dev = it6505->dev;
|
|
u8 av[5][4], bv[5][4];
|
|
- int i, err;
|
|
+ int i, err, retry;
|
|
|
|
i = it6505_setup_sha1_input(it6505, it6505->sha1_input);
|
|
if (i <= 0) {
|
|
@@ -2029,22 +2029,28 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
|
|
}
|
|
|
|
it6505_sha1_digest(it6505, it6505->sha1_input, i, (u8 *)av);
|
|
+ /*1B-05 V' must retry 3 times */
|
|
+ for (retry = 0; retry < 3; retry++) {
|
|
+ err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv,
|
|
+ sizeof(bv));
|
|
|
|
- err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv,
|
|
- sizeof(bv));
|
|
+ if (err < 0) {
|
|
+ dev_err(dev, "Read V' value Fail %d", retry);
|
|
+ continue;
|
|
+ }
|
|
|
|
- if (err < 0) {
|
|
- dev_err(dev, "Read V' value Fail");
|
|
- return false;
|
|
- }
|
|
+ for (i = 0; i < 5; i++) {
|
|
+ if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
|
|
+ av[i][1] != av[i][2] || bv[i][0] != av[i][3])
|
|
+ break;
|
|
|
|
- for (i = 0; i < 5; i++)
|
|
- if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
|
|
- bv[i][1] != av[i][2] || bv[i][0] != av[i][3])
|
|
- return false;
|
|
+ DRM_DEV_DEBUG_DRIVER(dev, "V' all match!! %d, %d", retry, i);
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
|
|
- DRM_DEV_DEBUG_DRIVER(dev, "V' all match!!");
|
|
- return true;
|
|
+ DRM_DEV_DEBUG_DRIVER(dev, "V' NOT match!! %d", retry);
|
|
+ return false;
|
|
}
|
|
|
|
static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
|
|
@@ -2052,12 +2058,13 @@ static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
|
|
struct it6505 *it6505 = container_of(work, struct it6505,
|
|
hdcp_wait_ksv_list);
|
|
struct device *dev = it6505->dev;
|
|
- unsigned int timeout = 5000;
|
|
- u8 bstatus = 0;
|
|
+ u8 bstatus;
|
|
bool ksv_list_check;
|
|
+ /* 1B-04 wait ksv list for 5s */
|
|
+ unsigned long timeout = jiffies +
|
|
+ msecs_to_jiffies(5000) + 1;
|
|
|
|
- timeout /= 20;
|
|
- while (timeout > 0) {
|
|
+ for (;;) {
|
|
if (!it6505_get_sink_hpd_status(it6505))
|
|
return;
|
|
|
|
@@ -2066,27 +2073,23 @@ static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
|
|
if (bstatus & DP_BSTATUS_READY)
|
|
break;
|
|
|
|
- msleep(20);
|
|
- timeout--;
|
|
- }
|
|
+ if (time_after(jiffies, timeout)) {
|
|
+ DRM_DEV_DEBUG_DRIVER(dev, "KSV list wait timeout");
|
|
+ goto timeout;
|
|
+ }
|
|
|
|
- if (timeout == 0) {
|
|
- DRM_DEV_DEBUG_DRIVER(dev, "timeout and ksv list wait failed");
|
|
- goto timeout;
|
|
+ msleep(20);
|
|
}
|
|
|
|
ksv_list_check = it6505_hdcp_part2_ksvlist_check(it6505);
|
|
DRM_DEV_DEBUG_DRIVER(dev, "ksv list ready, ksv list check %s",
|
|
ksv_list_check ? "pass" : "fail");
|
|
- if (ksv_list_check) {
|
|
- it6505_set_bits(it6505, REG_HDCP_TRIGGER,
|
|
- HDCP_TRIGGER_KSV_DONE, HDCP_TRIGGER_KSV_DONE);
|
|
+
|
|
+ if (ksv_list_check)
|
|
return;
|
|
- }
|
|
+
|
|
timeout:
|
|
- it6505_set_bits(it6505, REG_HDCP_TRIGGER,
|
|
- HDCP_TRIGGER_KSV_DONE | HDCP_TRIGGER_KSV_FAIL,
|
|
- HDCP_TRIGGER_KSV_DONE | HDCP_TRIGGER_KSV_FAIL);
|
|
+ it6505_start_hdcp(it6505);
|
|
}
|
|
|
|
static void it6505_hdcp_work(struct work_struct *work)
|
|
@@ -2309,14 +2312,20 @@ static int it6505_process_hpd_irq(struct it6505 *it6505)
|
|
DRM_DEV_DEBUG_DRIVER(dev, "dp_irq_vector = 0x%02x", dp_irq_vector);
|
|
|
|
if (dp_irq_vector & DP_CP_IRQ) {
|
|
- it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ,
|
|
- HDCP_TRIGGER_CPIRQ);
|
|
-
|
|
bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS);
|
|
if (bstatus < 0)
|
|
return bstatus;
|
|
|
|
DRM_DEV_DEBUG_DRIVER(dev, "Bstatus = 0x%02x", bstatus);
|
|
+
|
|
+ /*Check BSTATUS when recive CP_IRQ */
|
|
+ if (bstatus & DP_BSTATUS_R0_PRIME_READY &&
|
|
+ it6505->hdcp_status == HDCP_AUTH_GOING)
|
|
+ it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ,
|
|
+ HDCP_TRIGGER_CPIRQ);
|
|
+ else if (bstatus & (DP_BSTATUS_REAUTH_REQ | DP_BSTATUS_LINK_FAILURE) &&
|
|
+ it6505->hdcp_status == HDCP_AUTH_DONE)
|
|
+ it6505_start_hdcp(it6505);
|
|
}
|
|
|
|
ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status);
|
|
@@ -2453,7 +2462,11 @@ static void it6505_irq_hdcp_ksv_check(struct it6505 *it6505)
|
|
{
|
|
struct device *dev = it6505->dev;
|
|
|
|
- DRM_DEV_DEBUG_DRIVER(dev, "HDCP event Interrupt");
|
|
+ DRM_DEV_DEBUG_DRIVER(dev, "HDCP repeater R0 event Interrupt");
|
|
+ /* 1B01 HDCP encription should start when R0 is ready*/
|
|
+ it6505_set_bits(it6505, REG_HDCP_TRIGGER,
|
|
+ HDCP_TRIGGER_KSV_DONE, HDCP_TRIGGER_KSV_DONE);
|
|
+
|
|
schedule_work(&it6505->hdcp_wait_ksv_list);
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/ite-it66121.c b/drivers/gpu/drm/bridge/ite-it66121.c
|
|
index 8f5846b76d5943..2381cd1cba8797 100644
|
|
--- a/drivers/gpu/drm/bridge/ite-it66121.c
|
|
+++ b/drivers/gpu/drm/bridge/ite-it66121.c
|
|
@@ -1452,8 +1452,10 @@ static int it66121_audio_get_eld(struct device *dev, void *data,
|
|
dev_dbg(dev, "No connector present, passing empty EDID data");
|
|
memset(buf, 0, len);
|
|
} else {
|
|
+ mutex_lock(&ctx->connector->eld_mutex);
|
|
memcpy(buf, ctx->connector->eld,
|
|
min(sizeof(ctx->connector->eld), len));
|
|
+ mutex_unlock(&ctx->connector->eld_mutex);
|
|
}
|
|
mutex_unlock(&ctx->lock);
|
|
|
|
diff --git a/drivers/gpu/drm/display/drm_dp_cec.c b/drivers/gpu/drm/display/drm_dp_cec.c
|
|
index ae39dc79419030..868bf53db66ce0 100644
|
|
--- a/drivers/gpu/drm/display/drm_dp_cec.c
|
|
+++ b/drivers/gpu/drm/display/drm_dp_cec.c
|
|
@@ -310,16 +310,6 @@ void drm_dp_cec_set_edid(struct drm_dp_aux *aux, const struct edid *edid)
|
|
if (!aux->transfer)
|
|
return;
|
|
|
|
-#ifndef CONFIG_MEDIA_CEC_RC
|
|
- /*
|
|
- * CEC_CAP_RC is part of CEC_CAP_DEFAULTS, but it is stripped by
|
|
- * cec_allocate_adapter() if CONFIG_MEDIA_CEC_RC is undefined.
|
|
- *
|
|
- * Do this here as well to ensure the tests against cec_caps are
|
|
- * correct.
|
|
- */
|
|
- cec_caps &= ~CEC_CAP_RC;
|
|
-#endif
|
|
cancel_delayed_work_sync(&aux->cec.unregister_work);
|
|
|
|
mutex_lock(&aux->cec.lock);
|
|
@@ -336,7 +326,9 @@ void drm_dp_cec_set_edid(struct drm_dp_aux *aux, const struct edid *edid)
|
|
num_las = CEC_MAX_LOG_ADDRS;
|
|
|
|
if (aux->cec.adap) {
|
|
- if (aux->cec.adap->capabilities == cec_caps &&
|
|
+ /* Check if the adapter properties have changed */
|
|
+ if ((aux->cec.adap->capabilities & CEC_CAP_MONITOR_ALL) ==
|
|
+ (cec_caps & CEC_CAP_MONITOR_ALL) &&
|
|
aux->cec.adap->available_log_addrs == num_las) {
|
|
/* Unchanged, so just set the phys addr */
|
|
cec_s_phys_addr_from_edid(aux->cec.adap, edid);
|
|
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
|
|
index 309aad5f0c808d..35bed66214474a 100644
|
|
--- a/drivers/gpu/drm/drm_connector.c
|
|
+++ b/drivers/gpu/drm/drm_connector.c
|
|
@@ -277,6 +277,7 @@ static int __drm_connector_init(struct drm_device *dev,
|
|
INIT_LIST_HEAD(&connector->probed_modes);
|
|
INIT_LIST_HEAD(&connector->modes);
|
|
mutex_init(&connector->mutex);
|
|
+ mutex_init(&connector->eld_mutex);
|
|
mutex_init(&connector->edid_override_mutex);
|
|
connector->edid_blob_ptr = NULL;
|
|
connector->epoch_counter = 0;
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index ee3fab115c4b5b..ad872c61aac0e3 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -5499,7 +5499,9 @@ EXPORT_SYMBOL(drm_edid_get_monitor_name);
|
|
|
|
static void clear_eld(struct drm_connector *connector)
|
|
{
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
memset(connector->eld, 0, sizeof(connector->eld));
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
|
|
connector->latency_present[0] = false;
|
|
connector->latency_present[1] = false;
|
|
@@ -5530,6 +5532,8 @@ static void drm_edid_to_eld(struct drm_connector *connector,
|
|
if (!drm_edid)
|
|
return;
|
|
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
+
|
|
mnl = get_monitor_name(drm_edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
|
|
drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD monitor %s\n",
|
|
connector->base.id, connector->name,
|
|
@@ -5590,6 +5594,8 @@ static void drm_edid_to_eld(struct drm_connector *connector,
|
|
drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD size %d, SAD count %d\n",
|
|
connector->base.id, connector->name,
|
|
drm_eld_size(eld), total_sad_count);
|
|
+
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
}
|
|
|
|
static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
|
|
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
|
|
index 618b045230336e..b507c1c008a3e9 100644
|
|
--- a/drivers/gpu/drm/drm_fb_helper.c
|
|
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
|
@@ -1361,14 +1361,14 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
|
}
|
|
EXPORT_SYMBOL(drm_fb_helper_set_par);
|
|
|
|
-static void pan_set(struct drm_fb_helper *fb_helper, int x, int y)
|
|
+static void pan_set(struct drm_fb_helper *fb_helper, int dx, int dy)
|
|
{
|
|
struct drm_mode_set *mode_set;
|
|
|
|
mutex_lock(&fb_helper->client.modeset_mutex);
|
|
drm_client_for_each_modeset(mode_set, &fb_helper->client) {
|
|
- mode_set->x = x;
|
|
- mode_set->y = y;
|
|
+ mode_set->x += dx;
|
|
+ mode_set->y += dy;
|
|
}
|
|
mutex_unlock(&fb_helper->client.modeset_mutex);
|
|
}
|
|
@@ -1377,16 +1377,18 @@ static int pan_display_atomic(struct fb_var_screeninfo *var,
|
|
struct fb_info *info)
|
|
{
|
|
struct drm_fb_helper *fb_helper = info->par;
|
|
- int ret;
|
|
+ int ret, dx, dy;
|
|
|
|
- pan_set(fb_helper, var->xoffset, var->yoffset);
|
|
+ dx = var->xoffset - info->var.xoffset;
|
|
+ dy = var->yoffset - info->var.yoffset;
|
|
+ pan_set(fb_helper, dx, dy);
|
|
|
|
ret = drm_client_modeset_commit_locked(&fb_helper->client);
|
|
if (!ret) {
|
|
info->var.xoffset = var->xoffset;
|
|
info->var.yoffset = var->yoffset;
|
|
} else
|
|
- pan_set(fb_helper, info->var.xoffset, info->var.yoffset);
|
|
+ pan_set(fb_helper, -dx, -dy);
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
|
|
index 906133331a4424..c234f9245b1448 100644
|
|
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
|
|
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
|
|
@@ -1643,7 +1643,9 @@ static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf,
|
|
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
|
struct drm_connector *connector = &hdata->connector;
|
|
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
|
|
index d557ecd4e1ebe1..18c27542eb3b93 100644
|
|
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
|
|
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
|
|
@@ -102,8 +102,6 @@ static const u32 icl_sdr_y_plane_formats[] = {
|
|
DRM_FORMAT_Y216,
|
|
DRM_FORMAT_XYUV8888,
|
|
DRM_FORMAT_XVYU2101010,
|
|
- DRM_FORMAT_XVYU12_16161616,
|
|
- DRM_FORMAT_XVYU16161616,
|
|
};
|
|
|
|
static const u32 icl_sdr_uv_plane_formats[] = {
|
|
@@ -130,8 +128,6 @@ static const u32 icl_sdr_uv_plane_formats[] = {
|
|
DRM_FORMAT_Y216,
|
|
DRM_FORMAT_XYUV8888,
|
|
DRM_FORMAT_XVYU2101010,
|
|
- DRM_FORMAT_XVYU12_16161616,
|
|
- DRM_FORMAT_XVYU16161616,
|
|
};
|
|
|
|
static const u32 icl_hdr_plane_formats[] = {
|
|
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
|
|
index 73a4a4eb29e086..ba0e45fe432854 100644
|
|
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
|
|
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
|
|
@@ -209,8 +209,6 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj)
|
|
struct address_space *mapping = obj->base.filp->f_mapping;
|
|
unsigned int max_segment = i915_sg_segment_size(i915->drm.dev);
|
|
struct sg_table *st;
|
|
- struct sgt_iter sgt_iter;
|
|
- struct page *page;
|
|
int ret;
|
|
|
|
/*
|
|
@@ -239,9 +237,7 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj)
|
|
* for PAGE_SIZE chunks instead may be helpful.
|
|
*/
|
|
if (max_segment > PAGE_SIZE) {
|
|
- for_each_sgt_page(page, sgt_iter, st)
|
|
- put_page(page);
|
|
- sg_free_table(st);
|
|
+ shmem_sg_free_table(st, mapping, false, false);
|
|
kfree(st);
|
|
|
|
max_segment = PAGE_SIZE;
|
|
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
|
|
index ccaf9437cd0d2d..9f8afffbfccb17 100644
|
|
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
|
|
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
|
|
@@ -5154,12 +5154,20 @@ static inline void guc_log_context(struct drm_printer *p,
|
|
{
|
|
drm_printf(p, "GuC lrc descriptor %u:\n", ce->guc_id.id);
|
|
drm_printf(p, "\tHW Context Desc: 0x%08x\n", ce->lrc.lrca);
|
|
- drm_printf(p, "\t\tLRC Head: Internal %u, Memory %u\n",
|
|
- ce->ring->head,
|
|
- ce->lrc_reg_state[CTX_RING_HEAD]);
|
|
- drm_printf(p, "\t\tLRC Tail: Internal %u, Memory %u\n",
|
|
- ce->ring->tail,
|
|
- ce->lrc_reg_state[CTX_RING_TAIL]);
|
|
+ if (intel_context_pin_if_active(ce)) {
|
|
+ drm_printf(p, "\t\tLRC Head: Internal %u, Memory %u\n",
|
|
+ ce->ring->head,
|
|
+ ce->lrc_reg_state[CTX_RING_HEAD]);
|
|
+ drm_printf(p, "\t\tLRC Tail: Internal %u, Memory %u\n",
|
|
+ ce->ring->tail,
|
|
+ ce->lrc_reg_state[CTX_RING_TAIL]);
|
|
+ intel_context_unpin(ce);
|
|
+ } else {
|
|
+ drm_printf(p, "\t\tLRC Head: Internal %u, Memory not pinned\n",
|
|
+ ce->ring->head);
|
|
+ drm_printf(p, "\t\tLRC Tail: Internal %u, Memory not pinned\n",
|
|
+ ce->ring->tail);
|
|
+ }
|
|
drm_printf(p, "\t\tContext Pin Count: %u\n",
|
|
atomic_read(&ce->pin_count));
|
|
drm_printf(p, "\t\tGuC ID Ref Count: %u\n",
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c
|
|
index fc22fe709b9c1b..da37a827337bc5 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_audio.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_audio.c
|
|
@@ -773,8 +773,10 @@ static int radeon_audio_component_get_eld(struct device *kdev, int port,
|
|
if (!dig->pin || dig->pin->id != port)
|
|
continue;
|
|
*enabled = true;
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
ret = drm_eld_size(connector->eld);
|
|
memcpy(buf, connector->eld, min(max_bytes, ret));
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
break;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
|
|
index fca403ccce47eb..3fd55eafdf106b 100644
|
|
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
|
|
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
|
|
@@ -946,9 +946,6 @@ static void cdn_dp_pd_event_work(struct work_struct *work)
|
|
{
|
|
struct cdn_dp_device *dp = container_of(work, struct cdn_dp_device,
|
|
event_work);
|
|
- struct drm_connector *connector = &dp->connector;
|
|
- enum drm_connector_status old_status;
|
|
-
|
|
int ret;
|
|
|
|
mutex_lock(&dp->lock);
|
|
@@ -1010,11 +1007,7 @@ static void cdn_dp_pd_event_work(struct work_struct *work)
|
|
|
|
out:
|
|
mutex_unlock(&dp->lock);
|
|
-
|
|
- old_status = connector->status;
|
|
- connector->status = connector->funcs->detect(connector, false);
|
|
- if (old_status != connector->status)
|
|
- drm_kms_helper_hotplug_event(dp->drm_dev);
|
|
+ drm_connector_helper_hpd_irq_event(&dp->connector);
|
|
}
|
|
|
|
static int cdn_dp_pd_event(struct notifier_block *nb,
|
|
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
|
|
index 500936d5743c52..90c68e0f493fb5 100644
|
|
--- a/drivers/gpu/drm/sti/sti_hdmi.c
|
|
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
|
|
@@ -1221,7 +1221,9 @@ static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf, size
|
|
struct drm_connector *connector = hdmi->drm_connector;
|
|
|
|
DRM_DEBUG_DRIVER("\n");
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
|
|
index 1727d447786f14..541aba80c14492 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
|
|
@@ -2655,9 +2655,9 @@ static int vc4_hdmi_audio_get_eld(struct device *dev, void *data,
|
|
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
|
|
struct drm_connector *connector = &vc4_hdmi->connector;
|
|
|
|
- mutex_lock(&vc4_hdmi->mutex);
|
|
+ mutex_lock(&connector->eld_mutex);
|
|
memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
|
|
- mutex_unlock(&vc4_hdmi->mutex);
|
|
+ mutex_unlock(&connector->eld_mutex);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
|
|
index 4126c384286bff..61fd37f95fbd9f 100644
|
|
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
|
|
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
|
|
@@ -191,6 +191,13 @@ struct virtio_gpu_framebuffer {
|
|
#define to_virtio_gpu_framebuffer(x) \
|
|
container_of(x, struct virtio_gpu_framebuffer, base)
|
|
|
|
+struct virtio_gpu_plane_state {
|
|
+ struct drm_plane_state base;
|
|
+ struct virtio_gpu_fence *fence;
|
|
+};
|
|
+#define to_virtio_gpu_plane_state(x) \
|
|
+ container_of(x, struct virtio_gpu_plane_state, base)
|
|
+
|
|
struct virtio_gpu_queue {
|
|
struct virtqueue *vq;
|
|
spinlock_t qlock;
|
|
diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
|
|
index a1ef657eba0774..36de73e03bbfa2 100644
|
|
--- a/drivers/gpu/drm/virtio/virtgpu_plane.c
|
|
+++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
|
|
@@ -66,11 +66,28 @@ uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc)
|
|
return format;
|
|
}
|
|
|
|
+static struct
|
|
+drm_plane_state *virtio_gpu_plane_duplicate_state(struct drm_plane *plane)
|
|
+{
|
|
+ struct virtio_gpu_plane_state *new;
|
|
+
|
|
+ if (WARN_ON(!plane->state))
|
|
+ return NULL;
|
|
+
|
|
+ new = kzalloc(sizeof(*new), GFP_KERNEL);
|
|
+ if (!new)
|
|
+ return NULL;
|
|
+
|
|
+ __drm_atomic_helper_plane_duplicate_state(plane, &new->base);
|
|
+
|
|
+ return &new->base;
|
|
+}
|
|
+
|
|
static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
|
|
.update_plane = drm_atomic_helper_update_plane,
|
|
.disable_plane = drm_atomic_helper_disable_plane,
|
|
.reset = drm_atomic_helper_plane_reset,
|
|
- .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
|
|
+ .atomic_duplicate_state = virtio_gpu_plane_duplicate_state,
|
|
.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
|
|
};
|
|
|
|
@@ -138,11 +155,13 @@ static void virtio_gpu_resource_flush(struct drm_plane *plane,
|
|
struct drm_device *dev = plane->dev;
|
|
struct virtio_gpu_device *vgdev = dev->dev_private;
|
|
struct virtio_gpu_framebuffer *vgfb;
|
|
+ struct virtio_gpu_plane_state *vgplane_st;
|
|
struct virtio_gpu_object *bo;
|
|
|
|
vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
|
|
+ vgplane_st = to_virtio_gpu_plane_state(plane->state);
|
|
bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
|
|
- if (vgfb->fence) {
|
|
+ if (vgplane_st->fence) {
|
|
struct virtio_gpu_object_array *objs;
|
|
|
|
objs = virtio_gpu_array_alloc(1);
|
|
@@ -151,13 +170,11 @@ static void virtio_gpu_resource_flush(struct drm_plane *plane,
|
|
virtio_gpu_array_add_obj(objs, vgfb->base.obj[0]);
|
|
virtio_gpu_array_lock_resv(objs);
|
|
virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle, x, y,
|
|
- width, height, objs, vgfb->fence);
|
|
+ width, height, objs,
|
|
+ vgplane_st->fence);
|
|
virtio_gpu_notify(vgdev);
|
|
-
|
|
- dma_fence_wait_timeout(&vgfb->fence->f, true,
|
|
+ dma_fence_wait_timeout(&vgplane_st->fence->f, true,
|
|
msecs_to_jiffies(50));
|
|
- dma_fence_put(&vgfb->fence->f);
|
|
- vgfb->fence = NULL;
|
|
} else {
|
|
virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle, x, y,
|
|
width, height, NULL, NULL);
|
|
@@ -247,20 +264,23 @@ static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane,
|
|
struct drm_device *dev = plane->dev;
|
|
struct virtio_gpu_device *vgdev = dev->dev_private;
|
|
struct virtio_gpu_framebuffer *vgfb;
|
|
+ struct virtio_gpu_plane_state *vgplane_st;
|
|
struct virtio_gpu_object *bo;
|
|
|
|
if (!new_state->fb)
|
|
return 0;
|
|
|
|
vgfb = to_virtio_gpu_framebuffer(new_state->fb);
|
|
+ vgplane_st = to_virtio_gpu_plane_state(new_state);
|
|
bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
|
|
if (!bo || (plane->type == DRM_PLANE_TYPE_PRIMARY && !bo->guest_blob))
|
|
return 0;
|
|
|
|
- if (bo->dumb && (plane->state->fb != new_state->fb)) {
|
|
- vgfb->fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context,
|
|
+ if (bo->dumb) {
|
|
+ vgplane_st->fence = virtio_gpu_fence_alloc(vgdev,
|
|
+ vgdev->fence_drv.context,
|
|
0);
|
|
- if (!vgfb->fence)
|
|
+ if (!vgplane_st->fence)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
@@ -270,15 +290,15 @@ static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane,
|
|
static void virtio_gpu_plane_cleanup_fb(struct drm_plane *plane,
|
|
struct drm_plane_state *state)
|
|
{
|
|
- struct virtio_gpu_framebuffer *vgfb;
|
|
+ struct virtio_gpu_plane_state *vgplane_st;
|
|
|
|
if (!state->fb)
|
|
return;
|
|
|
|
- vgfb = to_virtio_gpu_framebuffer(state->fb);
|
|
- if (vgfb->fence) {
|
|
- dma_fence_put(&vgfb->fence->f);
|
|
- vgfb->fence = NULL;
|
|
+ vgplane_st = to_virtio_gpu_plane_state(state);
|
|
+ if (vgplane_st->fence) {
|
|
+ dma_fence_put(&vgplane_st->fence->f);
|
|
+ vgplane_st->fence = NULL;
|
|
}
|
|
}
|
|
|
|
@@ -291,6 +311,7 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
|
|
struct virtio_gpu_device *vgdev = dev->dev_private;
|
|
struct virtio_gpu_output *output = NULL;
|
|
struct virtio_gpu_framebuffer *vgfb;
|
|
+ struct virtio_gpu_plane_state *vgplane_st;
|
|
struct virtio_gpu_object *bo = NULL;
|
|
uint32_t handle;
|
|
|
|
@@ -303,6 +324,7 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
|
|
|
|
if (plane->state->fb) {
|
|
vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
|
|
+ vgplane_st = to_virtio_gpu_plane_state(plane->state);
|
|
bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
|
|
handle = bo->hw_res_handle;
|
|
} else {
|
|
@@ -322,11 +344,9 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
|
|
(vgdev, 0,
|
|
plane->state->crtc_w,
|
|
plane->state->crtc_h,
|
|
- 0, 0, objs, vgfb->fence);
|
|
+ 0, 0, objs, vgplane_st->fence);
|
|
virtio_gpu_notify(vgdev);
|
|
- dma_fence_wait(&vgfb->fence->f, true);
|
|
- dma_fence_put(&vgfb->fence->f);
|
|
- vgfb->fence = NULL;
|
|
+ dma_fence_wait(&vgplane_st->fence->f, true);
|
|
}
|
|
|
|
if (plane->state->fb != old_state->fb) {
|
|
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
|
|
index 26e93a331a5107..3cd00afa453a6d 100644
|
|
--- a/drivers/hid/hid-sensor-hub.c
|
|
+++ b/drivers/hid/hid-sensor-hub.c
|
|
@@ -730,23 +730,30 @@ static int sensor_hub_probe(struct hid_device *hdev,
|
|
return ret;
|
|
}
|
|
|
|
+static int sensor_hub_finalize_pending_fn(struct device *dev, void *data)
|
|
+{
|
|
+ struct hid_sensor_hub_device *hsdev = dev->platform_data;
|
|
+
|
|
+ if (hsdev->pending.status)
|
|
+ complete(&hsdev->pending.ready);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static void sensor_hub_remove(struct hid_device *hdev)
|
|
{
|
|
struct sensor_hub_data *data = hid_get_drvdata(hdev);
|
|
unsigned long flags;
|
|
- int i;
|
|
|
|
hid_dbg(hdev, " hardware removed\n");
|
|
hid_hw_close(hdev);
|
|
hid_hw_stop(hdev);
|
|
+
|
|
spin_lock_irqsave(&data->lock, flags);
|
|
- for (i = 0; i < data->hid_sensor_client_cnt; ++i) {
|
|
- struct hid_sensor_hub_device *hsdev =
|
|
- data->hid_sensor_hub_client_devs[i].platform_data;
|
|
- if (hsdev->pending.status)
|
|
- complete(&hsdev->pending.ready);
|
|
- }
|
|
+ device_for_each_child(&hdev->dev, NULL,
|
|
+ sensor_hub_finalize_pending_fn);
|
|
spin_unlock_irqrestore(&data->lock, flags);
|
|
+
|
|
mfd_remove_devices(&hdev->dev);
|
|
mutex_destroy(&data->mutex);
|
|
}
|
|
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
|
|
index 33466c71c9da78..dd44373ba930e2 100644
|
|
--- a/drivers/hid/wacom_wac.c
|
|
+++ b/drivers/hid/wacom_wac.c
|
|
@@ -4911,6 +4911,10 @@ static const struct wacom_features wacom_features_0x94 =
|
|
HID_DEVICE(BUS_I2C, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
|
|
.driver_data = (kernel_ulong_t)&wacom_features_##prod
|
|
|
|
+#define PCI_DEVICE_WACOM(prod) \
|
|
+ HID_DEVICE(BUS_PCI, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
|
|
+ .driver_data = (kernel_ulong_t)&wacom_features_##prod
|
|
+
|
|
#define USB_DEVICE_LENOVO(prod) \
|
|
HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \
|
|
.driver_data = (kernel_ulong_t)&wacom_features_##prod
|
|
@@ -5080,6 +5084,7 @@ const struct hid_device_id wacom_ids[] = {
|
|
|
|
{ USB_DEVICE_WACOM(HID_ANY_ID) },
|
|
{ I2C_DEVICE_WACOM(HID_ANY_ID) },
|
|
+ { PCI_DEVICE_WACOM(HID_ANY_ID) },
|
|
{ BT_DEVICE_WACOM(HID_ANY_ID) },
|
|
{ }
|
|
};
|
|
diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c
|
|
index 14ae0cfc325efb..d2499f302b5083 100644
|
|
--- a/drivers/i2c/i2c-core-acpi.c
|
|
+++ b/drivers/i2c/i2c-core-acpi.c
|
|
@@ -355,6 +355,25 @@ static const struct acpi_device_id i2c_acpi_force_400khz_device_ids[] = {
|
|
{}
|
|
};
|
|
|
|
+static const struct acpi_device_id i2c_acpi_force_100khz_device_ids[] = {
|
|
+ /*
|
|
+ * When a 400KHz freq is used on this model of ELAN touchpad in Linux,
|
|
+ * excessive smoothing (similar to when the touchpad's firmware detects
|
|
+ * a noisy signal) is sometimes applied. As some devices' (e.g, Lenovo
|
|
+ * V15 G4) ACPI tables specify a 400KHz frequency for this device and
|
|
+ * some I2C busses (e.g, Designware I2C) default to a 400KHz freq,
|
|
+ * force the speed to 100KHz as a workaround.
|
|
+ *
|
|
+ * For future investigation: This problem may be related to the default
|
|
+ * HCNT/LCNT values given by some busses' drivers, because they are not
|
|
+ * specified in the aforementioned devices' ACPI tables, and because
|
|
+ * the device works without issues on Windows at what is expected to be
|
|
+ * a 400KHz frequency. The root cause of the issue is not known.
|
|
+ */
|
|
+ { "ELAN06FA", 0 },
|
|
+ {}
|
|
+};
|
|
+
|
|
static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
|
|
void *data, void **return_value)
|
|
{
|
|
@@ -373,6 +392,9 @@ static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
|
|
if (acpi_match_device_ids(adev, i2c_acpi_force_400khz_device_ids) == 0)
|
|
lookup->force_speed = I2C_MAX_FAST_MODE_FREQ;
|
|
|
|
+ if (acpi_match_device_ids(adev, i2c_acpi_force_100khz_device_ids) == 0)
|
|
+ lookup->force_speed = I2C_MAX_STANDARD_MODE_FREQ;
|
|
+
|
|
return AE_OK;
|
|
}
|
|
|
|
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
|
|
index 1750b315e97011..c073ee74e3dabb 100644
|
|
--- a/drivers/i3c/master.c
|
|
+++ b/drivers/i3c/master.c
|
|
@@ -1878,7 +1878,7 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
|
|
goto err_bus_cleanup;
|
|
|
|
if (master->ops->set_speed) {
|
|
- master->ops->set_speed(master, I3C_OPEN_DRAIN_NORMAL_SPEED);
|
|
+ ret = master->ops->set_speed(master, I3C_OPEN_DRAIN_NORMAL_SPEED);
|
|
if (ret)
|
|
goto err_bus_cleanup;
|
|
}
|
|
diff --git a/drivers/iio/light/as73211.c b/drivers/iio/light/as73211.c
|
|
index ec97a3a468392d..c1f9604c27141e 100644
|
|
--- a/drivers/iio/light/as73211.c
|
|
+++ b/drivers/iio/light/as73211.c
|
|
@@ -154,6 +154,12 @@ struct as73211_data {
|
|
BIT(AS73211_SCAN_INDEX_TEMP) | \
|
|
AS73211_SCAN_MASK_COLOR)
|
|
|
|
+static const unsigned long as73211_scan_masks[] = {
|
|
+ AS73211_SCAN_MASK_COLOR,
|
|
+ AS73211_SCAN_MASK_ALL,
|
|
+ 0
|
|
+};
|
|
+
|
|
static const struct iio_chan_spec as73211_channels[] = {
|
|
{
|
|
.type = IIO_TEMP,
|
|
@@ -602,9 +608,12 @@ static irqreturn_t as73211_trigger_handler(int irq __always_unused, void *p)
|
|
|
|
/* AS73211 starts reading at address 2 */
|
|
ret = i2c_master_recv(data->client,
|
|
- (char *)&scan.chan[1], 3 * sizeof(scan.chan[1]));
|
|
+ (char *)&scan.chan[0], 3 * sizeof(scan.chan[0]));
|
|
if (ret < 0)
|
|
goto done;
|
|
+
|
|
+ /* Avoid pushing uninitialized data */
|
|
+ scan.chan[3] = 0;
|
|
}
|
|
|
|
if (data_result) {
|
|
@@ -612,9 +621,15 @@ static irqreturn_t as73211_trigger_handler(int irq __always_unused, void *p)
|
|
* Saturate all channels (in case of overflows). Temperature channel
|
|
* is not affected by overflows.
|
|
*/
|
|
- scan.chan[1] = cpu_to_le16(U16_MAX);
|
|
- scan.chan[2] = cpu_to_le16(U16_MAX);
|
|
- scan.chan[3] = cpu_to_le16(U16_MAX);
|
|
+ if (*indio_dev->active_scan_mask == AS73211_SCAN_MASK_ALL) {
|
|
+ scan.chan[1] = cpu_to_le16(U16_MAX);
|
|
+ scan.chan[2] = cpu_to_le16(U16_MAX);
|
|
+ scan.chan[3] = cpu_to_le16(U16_MAX);
|
|
+ } else {
|
|
+ scan.chan[0] = cpu_to_le16(U16_MAX);
|
|
+ scan.chan[1] = cpu_to_le16(U16_MAX);
|
|
+ scan.chan[2] = cpu_to_le16(U16_MAX);
|
|
+ }
|
|
}
|
|
|
|
iio_push_to_buffers_with_timestamp(indio_dev, &scan, iio_get_time_ns(indio_dev));
|
|
@@ -684,6 +699,7 @@ static int as73211_probe(struct i2c_client *client)
|
|
indio_dev->channels = as73211_channels;
|
|
indio_dev->num_channels = ARRAY_SIZE(as73211_channels);
|
|
indio_dev->modes = INDIO_DIRECT_MODE;
|
|
+ indio_dev->available_scan_masks = as73211_scan_masks;
|
|
|
|
ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_OSR);
|
|
if (ret < 0)
|
|
diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
|
|
index 68b81f9c2f4b17..6cecbac0e6babf 100644
|
|
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
|
|
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
|
|
@@ -3875,7 +3875,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
|
|
/* Initialise in-memory data structures */
|
|
ret = arm_smmu_init_structures(smmu);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto err_free_iopf;
|
|
|
|
/* Record our private device structure */
|
|
platform_set_drvdata(pdev, smmu);
|
|
@@ -3886,22 +3886,29 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
|
|
/* Reset the device */
|
|
ret = arm_smmu_device_reset(smmu, bypass);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto err_disable;
|
|
|
|
/* And we're up. Go go go! */
|
|
ret = iommu_device_sysfs_add(&smmu->iommu, dev, NULL,
|
|
"smmu3.%pa", &ioaddr);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto err_disable;
|
|
|
|
ret = iommu_device_register(&smmu->iommu, &arm_smmu_ops, dev);
|
|
if (ret) {
|
|
dev_err(dev, "Failed to register iommu\n");
|
|
- iommu_device_sysfs_remove(&smmu->iommu);
|
|
- return ret;
|
|
+ goto err_free_sysfs;
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
+err_free_sysfs:
|
|
+ iommu_device_sysfs_remove(&smmu->iommu);
|
|
+err_disable:
|
|
+ arm_smmu_device_disable(smmu);
|
|
+err_free_iopf:
|
|
+ iopf_queue_free(smmu->evtq.iopf);
|
|
+ return ret;
|
|
}
|
|
|
|
static void arm_smmu_device_remove(struct platform_device *pdev)
|
|
diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
|
|
index d4915893601979..e6b4bab0dde2e5 100644
|
|
--- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
|
|
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
|
|
@@ -554,6 +554,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
|
|
{ .compatible = "qcom,sc8180x-smmu-500", .data = &qcom_smmu_500_impl0_data },
|
|
{ .compatible = "qcom,sc8280xp-smmu-500", .data = &qcom_smmu_500_impl0_data },
|
|
{ .compatible = "qcom,sdm630-smmu-v2", .data = &qcom_smmu_v2_data },
|
|
+ { .compatible = "qcom,sdm670-smmu-v2", .data = &qcom_smmu_v2_data },
|
|
{ .compatible = "qcom,sdm845-smmu-v2", .data = &qcom_smmu_v2_data },
|
|
{ .compatible = "qcom,sdm845-smmu-500", .data = &sdm845_smmu_500_data },
|
|
{ .compatible = "qcom,sm6115-smmu-500", .data = &qcom_smmu_500_impl0_data},
|
|
diff --git a/drivers/irqchip/irq-apple-aic.c b/drivers/irqchip/irq-apple-aic.c
|
|
index 5c534d9fd2b00d..08d3ff8dba0060 100644
|
|
--- a/drivers/irqchip/irq-apple-aic.c
|
|
+++ b/drivers/irqchip/irq-apple-aic.c
|
|
@@ -563,7 +563,8 @@ static void __exception_irq_entry aic_handle_fiq(struct pt_regs *regs)
|
|
AIC_FIQ_HWIRQ(AIC_TMR_EL02_VIRT));
|
|
}
|
|
|
|
- if (read_sysreg_s(SYS_IMP_APL_PMCR0_EL1) & PMCR0_IACT) {
|
|
+ if ((read_sysreg_s(SYS_IMP_APL_PMCR0_EL1) & (PMCR0_IMODE | PMCR0_IACT)) ==
|
|
+ (FIELD_PREP(PMCR0_IMODE, PMCR0_IMODE_FIQ) | PMCR0_IACT)) {
|
|
int irq;
|
|
if (cpumask_test_cpu(smp_processor_id(),
|
|
&aic_irqc->fiq_aff[AIC_CPU_PMU_P]->aff))
|
|
diff --git a/drivers/leds/leds-lp8860.c b/drivers/leds/leds-lp8860.c
|
|
index 19b621012e582f..03d3ca414a75db 100644
|
|
--- a/drivers/leds/leds-lp8860.c
|
|
+++ b/drivers/leds/leds-lp8860.c
|
|
@@ -265,7 +265,7 @@ static int lp8860_init(struct lp8860_led *led)
|
|
goto out;
|
|
}
|
|
|
|
- reg_count = ARRAY_SIZE(lp8860_eeprom_disp_regs) / sizeof(lp8860_eeprom_disp_regs[0]);
|
|
+ reg_count = ARRAY_SIZE(lp8860_eeprom_disp_regs);
|
|
for (i = 0; i < reg_count; i++) {
|
|
ret = regmap_write(led->eeprom_regmap,
|
|
lp8860_eeprom_disp_regs[i].reg,
|
|
diff --git a/drivers/mailbox/tegra-hsp.c b/drivers/mailbox/tegra-hsp.c
|
|
index fe29fc2ca5260d..694550fdfddddb 100644
|
|
--- a/drivers/mailbox/tegra-hsp.c
|
|
+++ b/drivers/mailbox/tegra-hsp.c
|
|
@@ -388,7 +388,6 @@ static void tegra_hsp_sm_recv32(struct tegra_hsp_channel *channel)
|
|
value = tegra_hsp_channel_readl(channel, HSP_SM_SHRD_MBOX);
|
|
value &= ~HSP_SM_SHRD_MBOX_FULL;
|
|
msg = (void *)(unsigned long)value;
|
|
- mbox_chan_received_data(channel->chan, msg);
|
|
|
|
/*
|
|
* Need to clear all bits here since some producers, such as TCU, depend
|
|
@@ -398,6 +397,8 @@ static void tegra_hsp_sm_recv32(struct tegra_hsp_channel *channel)
|
|
* explicitly, so we have to make sure we cover all possible cases.
|
|
*/
|
|
tegra_hsp_channel_writel(channel, 0x0, HSP_SM_SHRD_MBOX);
|
|
+
|
|
+ mbox_chan_received_data(channel->chan, msg);
|
|
}
|
|
|
|
static const struct tegra_hsp_sm_ops tegra_hsp_sm_32bit_ops = {
|
|
@@ -433,7 +434,6 @@ static void tegra_hsp_sm_recv128(struct tegra_hsp_channel *channel)
|
|
value[3] = tegra_hsp_channel_readl(channel, HSP_SHRD_MBOX_TYPE1_DATA3);
|
|
|
|
msg = (void *)(unsigned long)value;
|
|
- mbox_chan_received_data(channel->chan, msg);
|
|
|
|
/*
|
|
* Clear data registers and tag.
|
|
@@ -443,6 +443,8 @@ static void tegra_hsp_sm_recv128(struct tegra_hsp_channel *channel)
|
|
tegra_hsp_channel_writel(channel, 0x0, HSP_SHRD_MBOX_TYPE1_DATA2);
|
|
tegra_hsp_channel_writel(channel, 0x0, HSP_SHRD_MBOX_TYPE1_DATA3);
|
|
tegra_hsp_channel_writel(channel, 0x0, HSP_SHRD_MBOX_TYPE1_TAG);
|
|
+
|
|
+ mbox_chan_received_data(channel->chan, msg);
|
|
}
|
|
|
|
static const struct tegra_hsp_sm_ops tegra_hsp_sm_128bit_ops = {
|
|
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
|
|
index aa6bb5b4704ba6..1ff16b8264cbdf 100644
|
|
--- a/drivers/md/dm-crypt.c
|
|
+++ b/drivers/md/dm-crypt.c
|
|
@@ -57,6 +57,7 @@ struct convert_context {
|
|
struct bio *bio_out;
|
|
struct bvec_iter iter_out;
|
|
atomic_t cc_pending;
|
|
+ unsigned int tag_offset;
|
|
u64 cc_sector;
|
|
union {
|
|
struct skcipher_request *req;
|
|
@@ -1232,6 +1233,7 @@ static void crypt_convert_init(struct crypt_config *cc,
|
|
if (bio_out)
|
|
ctx->iter_out = bio_out->bi_iter;
|
|
ctx->cc_sector = sector + cc->iv_offset;
|
|
+ ctx->tag_offset = 0;
|
|
init_completion(&ctx->restart);
|
|
}
|
|
|
|
@@ -1564,7 +1566,6 @@ static void crypt_free_req(struct crypt_config *cc, void *req, struct bio *base_
|
|
static blk_status_t crypt_convert(struct crypt_config *cc,
|
|
struct convert_context *ctx, bool atomic, bool reset_pending)
|
|
{
|
|
- unsigned int tag_offset = 0;
|
|
unsigned int sector_step = cc->sector_size >> SECTOR_SHIFT;
|
|
int r;
|
|
|
|
@@ -1587,9 +1588,9 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
|
atomic_inc(&ctx->cc_pending);
|
|
|
|
if (crypt_integrity_aead(cc))
|
|
- r = crypt_convert_block_aead(cc, ctx, ctx->r.req_aead, tag_offset);
|
|
+ r = crypt_convert_block_aead(cc, ctx, ctx->r.req_aead, ctx->tag_offset);
|
|
else
|
|
- r = crypt_convert_block_skcipher(cc, ctx, ctx->r.req, tag_offset);
|
|
+ r = crypt_convert_block_skcipher(cc, ctx, ctx->r.req, ctx->tag_offset);
|
|
|
|
switch (r) {
|
|
/*
|
|
@@ -1609,8 +1610,8 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
|
* exit and continue processing in a workqueue
|
|
*/
|
|
ctx->r.req = NULL;
|
|
+ ctx->tag_offset++;
|
|
ctx->cc_sector += sector_step;
|
|
- tag_offset++;
|
|
return BLK_STS_DEV_RESOURCE;
|
|
}
|
|
} else {
|
|
@@ -1624,8 +1625,8 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
|
*/
|
|
case -EINPROGRESS:
|
|
ctx->r.req = NULL;
|
|
+ ctx->tag_offset++;
|
|
ctx->cc_sector += sector_step;
|
|
- tag_offset++;
|
|
continue;
|
|
/*
|
|
* The request was already processed (synchronously).
|
|
@@ -1633,7 +1634,7 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
|
case 0:
|
|
atomic_dec(&ctx->cc_pending);
|
|
ctx->cc_sector += sector_step;
|
|
- tag_offset++;
|
|
+ ctx->tag_offset++;
|
|
if (!atomic)
|
|
cond_resched();
|
|
continue;
|
|
@@ -2068,7 +2069,6 @@ static void kcryptd_crypt_write_continue(struct work_struct *work)
|
|
struct crypt_config *cc = io->cc;
|
|
struct convert_context *ctx = &io->ctx;
|
|
int crypt_finished;
|
|
- sector_t sector = io->sector;
|
|
blk_status_t r;
|
|
|
|
wait_for_completion(&ctx->restart);
|
|
@@ -2085,10 +2085,8 @@ static void kcryptd_crypt_write_continue(struct work_struct *work)
|
|
}
|
|
|
|
/* Encryption was already finished, submit io now */
|
|
- if (crypt_finished) {
|
|
+ if (crypt_finished)
|
|
kcryptd_crypt_write_io_submit(io, 0);
|
|
- io->sector = sector;
|
|
- }
|
|
|
|
crypt_dec_pending(io);
|
|
}
|
|
@@ -2099,14 +2097,13 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
|
struct convert_context *ctx = &io->ctx;
|
|
struct bio *clone;
|
|
int crypt_finished;
|
|
- sector_t sector = io->sector;
|
|
blk_status_t r;
|
|
|
|
/*
|
|
* Prevent io from disappearing until this function completes.
|
|
*/
|
|
crypt_inc_pending(io);
|
|
- crypt_convert_init(cc, ctx, NULL, io->base_bio, sector);
|
|
+ crypt_convert_init(cc, ctx, NULL, io->base_bio, io->sector);
|
|
|
|
clone = crypt_alloc_buffer(io, io->base_bio->bi_iter.bi_size);
|
|
if (unlikely(!clone)) {
|
|
@@ -2123,8 +2120,6 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
|
io->ctx.iter_in = clone->bi_iter;
|
|
}
|
|
|
|
- sector += bio_sectors(clone);
|
|
-
|
|
crypt_inc_pending(io);
|
|
r = crypt_convert(cc, ctx,
|
|
test_bit(DM_CRYPT_NO_WRITE_WORKQUEUE, &cc->flags), true);
|
|
@@ -2148,10 +2143,8 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
|
}
|
|
|
|
/* Encryption was already finished, submit io now */
|
|
- if (crypt_finished) {
|
|
+ if (crypt_finished)
|
|
kcryptd_crypt_write_io_submit(io, 0);
|
|
- io->sector = sector;
|
|
- }
|
|
|
|
dec:
|
|
crypt_dec_pending(io);
|
|
diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
|
|
index 6f8fbd82e21c8f..92ee86ca80a63d 100644
|
|
--- a/drivers/media/i2c/ccs/ccs-core.c
|
|
+++ b/drivers/media/i2c/ccs/ccs-core.c
|
|
@@ -3658,15 +3658,15 @@ static int ccs_probe(struct i2c_client *client)
|
|
out_cleanup:
|
|
ccs_cleanup(sensor);
|
|
|
|
+out_free_ccs_limits:
|
|
+ kfree(sensor->ccs_limits);
|
|
+
|
|
out_release_mdata:
|
|
kvfree(sensor->mdata.backing);
|
|
|
|
out_release_sdata:
|
|
kvfree(sensor->sdata.backing);
|
|
|
|
-out_free_ccs_limits:
|
|
- kfree(sensor->ccs_limits);
|
|
-
|
|
out_power_off:
|
|
ccs_power_off(&client->dev);
|
|
mutex_destroy(&sensor->mutex);
|
|
diff --git a/drivers/media/i2c/ccs/ccs-data.c b/drivers/media/i2c/ccs/ccs-data.c
|
|
index 08400edf77ced1..2591dba51e17e2 100644
|
|
--- a/drivers/media/i2c/ccs/ccs-data.c
|
|
+++ b/drivers/media/i2c/ccs/ccs-data.c
|
|
@@ -10,6 +10,7 @@
|
|
#include <linux/limits.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/slab.h>
|
|
+#include <linux/string.h>
|
|
|
|
#include "ccs-data-defs.h"
|
|
|
|
@@ -97,7 +98,7 @@ ccs_data_parse_length_specifier(const struct __ccs_data_length_specifier *__len,
|
|
plen = ((size_t)
|
|
(__len3->length[0] &
|
|
((1 << CCS_DATA_LENGTH_SPECIFIER_SIZE_SHIFT) - 1))
|
|
- << 16) + (__len3->length[0] << 8) + __len3->length[1];
|
|
+ << 16) + (__len3->length[1] << 8) + __len3->length[2];
|
|
break;
|
|
}
|
|
default:
|
|
@@ -948,15 +949,15 @@ int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
|
|
|
|
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, verbose);
|
|
if (rval)
|
|
- return rval;
|
|
+ goto out_cleanup;
|
|
|
|
rval = bin_backing_alloc(&bin);
|
|
if (rval)
|
|
- return rval;
|
|
+ goto out_cleanup;
|
|
|
|
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, false);
|
|
if (rval)
|
|
- goto out_free;
|
|
+ goto out_cleanup;
|
|
|
|
if (verbose && ccsdata->version)
|
|
print_ccs_data_version(dev, ccsdata->version);
|
|
@@ -965,15 +966,16 @@ int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
|
|
rval = -EPROTO;
|
|
dev_dbg(dev, "parsing mismatch; base %p; now %p; end %p\n",
|
|
bin.base, bin.now, bin.end);
|
|
- goto out_free;
|
|
+ goto out_cleanup;
|
|
}
|
|
|
|
ccsdata->backing = bin.base;
|
|
|
|
return 0;
|
|
|
|
-out_free:
|
|
+out_cleanup:
|
|
kvfree(bin.base);
|
|
+ memset(ccsdata, 0, sizeof(*ccsdata));
|
|
|
|
return rval;
|
|
}
|
|
diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c
|
|
index 4bfa3b3cf619b3..5a650facae4153 100644
|
|
--- a/drivers/media/i2c/ds90ub913.c
|
|
+++ b/drivers/media/i2c/ds90ub913.c
|
|
@@ -792,7 +792,6 @@ static void ub913_subdev_uninit(struct ub913_data *priv)
|
|
v4l2_async_unregister_subdev(&priv->sd);
|
|
ub913_v4l2_nf_unregister(priv);
|
|
v4l2_subdev_cleanup(&priv->sd);
|
|
- fwnode_handle_put(priv->sd.fwnode);
|
|
media_entity_cleanup(&priv->sd.entity);
|
|
}
|
|
|
|
diff --git a/drivers/media/i2c/ds90ub953.c b/drivers/media/i2c/ds90ub953.c
|
|
index dc394e22a42c43..1dd29137d2d9f2 100644
|
|
--- a/drivers/media/i2c/ds90ub953.c
|
|
+++ b/drivers/media/i2c/ds90ub953.c
|
|
@@ -1290,7 +1290,6 @@ static void ub953_subdev_uninit(struct ub953_data *priv)
|
|
v4l2_async_unregister_subdev(&priv->sd);
|
|
ub953_v4l2_notifier_unregister(priv);
|
|
v4l2_subdev_cleanup(&priv->sd);
|
|
- fwnode_handle_put(priv->sd.fwnode);
|
|
media_entity_cleanup(&priv->sd.entity);
|
|
}
|
|
|
|
diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
|
|
index 7f30e8923633ef..67714047588ac2 100644
|
|
--- a/drivers/media/i2c/ds90ub960.c
|
|
+++ b/drivers/media/i2c/ds90ub960.c
|
|
@@ -352,6 +352,8 @@
|
|
|
|
#define UB960_SR_I2C_RX_ID(n) (0xf8 + (n)) /* < UB960_FPD_RX_NPORTS */
|
|
|
|
+#define UB9702_SR_REFCLK_FREQ 0x3d
|
|
+
|
|
/* Indirect register blocks */
|
|
#define UB960_IND_TARGET_PAT_GEN 0x00
|
|
#define UB960_IND_TARGET_RX_ANA(n) (0x01 + (n))
|
|
@@ -1575,16 +1577,24 @@ static int ub960_rxport_wait_locks(struct ub960_data *priv,
|
|
|
|
ub960_rxport_read16(priv, nport, UB960_RR_RX_FREQ_HIGH, &v);
|
|
|
|
- ret = ub960_rxport_get_strobe_pos(priv, nport, &strobe_pos);
|
|
- if (ret)
|
|
- return ret;
|
|
+ if (priv->hw_data->is_ub9702) {
|
|
+ dev_dbg(dev, "\trx%u: locked, freq %llu Hz\n",
|
|
+ nport, (v * 1000000ULL) >> 8);
|
|
+ } else {
|
|
+ ret = ub960_rxport_get_strobe_pos(priv, nport,
|
|
+ &strobe_pos);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
- ret = ub960_rxport_get_eq_level(priv, nport, &eq_level);
|
|
- if (ret)
|
|
- return ret;
|
|
+ ret = ub960_rxport_get_eq_level(priv, nport, &eq_level);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
- dev_dbg(dev, "\trx%u: locked, SP: %d, EQ: %u, freq %llu Hz\n",
|
|
- nport, strobe_pos, eq_level, (v * 1000000ULL) >> 8);
|
|
+ dev_dbg(dev,
|
|
+ "\trx%u: locked, SP: %d, EQ: %u, freq %llu Hz\n",
|
|
+ nport, strobe_pos, eq_level,
|
|
+ (v * 1000000ULL) >> 8);
|
|
+ }
|
|
}
|
|
|
|
return 0;
|
|
@@ -2524,7 +2534,7 @@ static int ub960_configure_ports_for_streaming(struct ub960_data *priv,
|
|
for (i = 0; i < 8; i++)
|
|
ub960_rxport_write(priv, nport,
|
|
UB960_RR_VC_ID_MAP(i),
|
|
- nport);
|
|
+ (nport << 4) | nport);
|
|
}
|
|
|
|
break;
|
|
@@ -2946,6 +2956,54 @@ static const struct v4l2_subdev_pad_ops ub960_pad_ops = {
|
|
.init_cfg = ub960_init_cfg,
|
|
};
|
|
|
|
+static void ub960_log_status_ub960_sp_eq(struct ub960_data *priv,
|
|
+ unsigned int nport)
|
|
+{
|
|
+ struct device *dev = &priv->client->dev;
|
|
+ u8 eq_level;
|
|
+ s8 strobe_pos;
|
|
+ u8 v = 0;
|
|
+
|
|
+ /* Strobe */
|
|
+
|
|
+ ub960_read(priv, UB960_XR_AEQ_CTL1, &v);
|
|
+
|
|
+ dev_info(dev, "\t%s strobe\n",
|
|
+ (v & UB960_XR_AEQ_CTL1_AEQ_SFILTER_EN) ? "Adaptive" :
|
|
+ "Manual");
|
|
+
|
|
+ if (v & UB960_XR_AEQ_CTL1_AEQ_SFILTER_EN) {
|
|
+ ub960_read(priv, UB960_XR_SFILTER_CFG, &v);
|
|
+
|
|
+ dev_info(dev, "\tStrobe range [%d, %d]\n",
|
|
+ ((v >> UB960_XR_SFILTER_CFG_SFILTER_MIN_SHIFT) & 0xf) - 7,
|
|
+ ((v >> UB960_XR_SFILTER_CFG_SFILTER_MAX_SHIFT) & 0xf) - 7);
|
|
+ }
|
|
+
|
|
+ ub960_rxport_get_strobe_pos(priv, nport, &strobe_pos);
|
|
+
|
|
+ dev_info(dev, "\tStrobe pos %d\n", strobe_pos);
|
|
+
|
|
+ /* EQ */
|
|
+
|
|
+ ub960_rxport_read(priv, nport, UB960_RR_AEQ_BYPASS, &v);
|
|
+
|
|
+ dev_info(dev, "\t%s EQ\n",
|
|
+ (v & UB960_RR_AEQ_BYPASS_ENABLE) ? "Manual" :
|
|
+ "Adaptive");
|
|
+
|
|
+ if (!(v & UB960_RR_AEQ_BYPASS_ENABLE)) {
|
|
+ ub960_rxport_read(priv, nport, UB960_RR_AEQ_MIN_MAX, &v);
|
|
+
|
|
+ dev_info(dev, "\tEQ range [%u, %u]\n",
|
|
+ (v >> UB960_RR_AEQ_MIN_MAX_AEQ_FLOOR_SHIFT) & 0xf,
|
|
+ (v >> UB960_RR_AEQ_MIN_MAX_AEQ_MAX_SHIFT) & 0xf);
|
|
+ }
|
|
+
|
|
+ if (ub960_rxport_get_eq_level(priv, nport, &eq_level) == 0)
|
|
+ dev_info(dev, "\tEQ level %u\n", eq_level);
|
|
+}
|
|
+
|
|
static int ub960_log_status(struct v4l2_subdev *sd)
|
|
{
|
|
struct ub960_data *priv = sd_to_ub960(sd);
|
|
@@ -2993,8 +3051,6 @@ static int ub960_log_status(struct v4l2_subdev *sd)
|
|
|
|
for (nport = 0; nport < priv->hw_data->num_rxports; nport++) {
|
|
struct ub960_rxport *rxport = priv->rxports[nport];
|
|
- u8 eq_level;
|
|
- s8 strobe_pos;
|
|
unsigned int i;
|
|
|
|
dev_info(dev, "RX %u\n", nport);
|
|
@@ -3030,44 +3086,8 @@ static int ub960_log_status(struct v4l2_subdev *sd)
|
|
ub960_rxport_read(priv, nport, UB960_RR_CSI_ERR_COUNTER, &v);
|
|
dev_info(dev, "\tcsi_err_counter %u\n", v);
|
|
|
|
- /* Strobe */
|
|
-
|
|
- ub960_read(priv, UB960_XR_AEQ_CTL1, &v);
|
|
-
|
|
- dev_info(dev, "\t%s strobe\n",
|
|
- (v & UB960_XR_AEQ_CTL1_AEQ_SFILTER_EN) ? "Adaptive" :
|
|
- "Manual");
|
|
-
|
|
- if (v & UB960_XR_AEQ_CTL1_AEQ_SFILTER_EN) {
|
|
- ub960_read(priv, UB960_XR_SFILTER_CFG, &v);
|
|
-
|
|
- dev_info(dev, "\tStrobe range [%d, %d]\n",
|
|
- ((v >> UB960_XR_SFILTER_CFG_SFILTER_MIN_SHIFT) & 0xf) - 7,
|
|
- ((v >> UB960_XR_SFILTER_CFG_SFILTER_MAX_SHIFT) & 0xf) - 7);
|
|
- }
|
|
-
|
|
- ub960_rxport_get_strobe_pos(priv, nport, &strobe_pos);
|
|
-
|
|
- dev_info(dev, "\tStrobe pos %d\n", strobe_pos);
|
|
-
|
|
- /* EQ */
|
|
-
|
|
- ub960_rxport_read(priv, nport, UB960_RR_AEQ_BYPASS, &v);
|
|
-
|
|
- dev_info(dev, "\t%s EQ\n",
|
|
- (v & UB960_RR_AEQ_BYPASS_ENABLE) ? "Manual" :
|
|
- "Adaptive");
|
|
-
|
|
- if (!(v & UB960_RR_AEQ_BYPASS_ENABLE)) {
|
|
- ub960_rxport_read(priv, nport, UB960_RR_AEQ_MIN_MAX, &v);
|
|
-
|
|
- dev_info(dev, "\tEQ range [%u, %u]\n",
|
|
- (v >> UB960_RR_AEQ_MIN_MAX_AEQ_FLOOR_SHIFT) & 0xf,
|
|
- (v >> UB960_RR_AEQ_MIN_MAX_AEQ_MAX_SHIFT) & 0xf);
|
|
- }
|
|
-
|
|
- if (ub960_rxport_get_eq_level(priv, nport, &eq_level) == 0)
|
|
- dev_info(dev, "\tEQ level %u\n", eq_level);
|
|
+ if (!priv->hw_data->is_ub9702)
|
|
+ ub960_log_status_ub960_sp_eq(priv, nport);
|
|
|
|
/* GPIOs */
|
|
for (i = 0; i < UB960_NUM_BC_GPIOS; i++) {
|
|
@@ -3838,7 +3858,10 @@ static int ub960_enable_core_hw(struct ub960_data *priv)
|
|
if (ret)
|
|
goto err_pd_gpio;
|
|
|
|
- ret = ub960_read(priv, UB960_XR_REFCLK_FREQ, &refclk_freq);
|
|
+ if (priv->hw_data->is_ub9702)
|
|
+ ret = ub960_read(priv, UB9702_SR_REFCLK_FREQ, &refclk_freq);
|
|
+ else
|
|
+ ret = ub960_read(priv, UB960_XR_REFCLK_FREQ, &refclk_freq);
|
|
if (ret)
|
|
goto err_pd_gpio;
|
|
|
|
diff --git a/drivers/media/i2c/imx296.c b/drivers/media/i2c/imx296.c
|
|
index 3b4539b622b43b..330e7e149a620a 100644
|
|
--- a/drivers/media/i2c/imx296.c
|
|
+++ b/drivers/media/i2c/imx296.c
|
|
@@ -960,6 +960,8 @@ static int imx296_identify_model(struct imx296 *sensor)
|
|
return ret;
|
|
}
|
|
|
|
+ usleep_range(2000, 5000);
|
|
+
|
|
ret = imx296_read(sensor, IMX296_SENSOR_INFO);
|
|
if (ret < 0) {
|
|
dev_err(sensor->dev, "failed to read sensor information (%d)\n",
|
|
diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
|
|
index 40532f7bcabea8..b8a6acc30a252d 100644
|
|
--- a/drivers/media/i2c/ov5640.c
|
|
+++ b/drivers/media/i2c/ov5640.c
|
|
@@ -1982,6 +1982,7 @@ static int ov5640_get_light_freq(struct ov5640_dev *sensor)
|
|
light_freq = 50;
|
|
} else {
|
|
/* 60Hz */
|
|
+ light_freq = 60;
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/media/platform/marvell/mmp-driver.c b/drivers/media/platform/marvell/mmp-driver.c
|
|
index 170907cc1885cf..f8d595c0687f72 100644
|
|
--- a/drivers/media/platform/marvell/mmp-driver.c
|
|
+++ b/drivers/media/platform/marvell/mmp-driver.c
|
|
@@ -230,13 +230,23 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|
|
|
mcam_init_clk(mcam);
|
|
|
|
+ /*
|
|
+ * Register with V4L.
|
|
+ */
|
|
+
|
|
+ ret = v4l2_device_register(mcam->dev, &mcam->v4l2_dev);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
/*
|
|
* Create a match of the sensor against its OF node.
|
|
*/
|
|
ep = fwnode_graph_get_next_endpoint(of_fwnode_handle(pdev->dev.of_node),
|
|
NULL);
|
|
- if (!ep)
|
|
- return -ENODEV;
|
|
+ if (!ep) {
|
|
+ ret = -ENODEV;
|
|
+ goto out_v4l2_device_unregister;
|
|
+ }
|
|
|
|
v4l2_async_nf_init(&mcam->notifier, &mcam->v4l2_dev);
|
|
|
|
@@ -245,7 +255,7 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|
fwnode_handle_put(ep);
|
|
if (IS_ERR(asd)) {
|
|
ret = PTR_ERR(asd);
|
|
- goto out;
|
|
+ goto out_v4l2_device_unregister;
|
|
}
|
|
|
|
/*
|
|
@@ -253,7 +263,7 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|
*/
|
|
ret = mccic_register(mcam);
|
|
if (ret)
|
|
- goto out;
|
|
+ goto out_v4l2_device_unregister;
|
|
|
|
/*
|
|
* Add OF clock provider.
|
|
@@ -282,6 +292,8 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|
return 0;
|
|
out:
|
|
mccic_shutdown(mcam);
|
|
+out_v4l2_device_unregister:
|
|
+ v4l2_device_unregister(&mcam->v4l2_dev);
|
|
|
|
return ret;
|
|
}
|
|
@@ -292,6 +304,7 @@ static void mmpcam_remove(struct platform_device *pdev)
|
|
struct mcam_camera *mcam = &cam->mcam;
|
|
|
|
mccic_shutdown(mcam);
|
|
+ v4l2_device_unregister(&mcam->v4l2_dev);
|
|
pm_runtime_force_suspend(mcam->dev);
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
|
|
index 07158e9451fed1..ce70e96b8fb52e 100644
|
|
--- a/drivers/media/usb/uvc/uvc_ctrl.c
|
|
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
|
|
@@ -1593,10 +1593,8 @@ bool uvc_ctrl_status_event_async(struct urb *urb, struct uvc_video_chain *chain,
|
|
struct uvc_device *dev = chain->dev;
|
|
struct uvc_ctrl_work *w = &dev->async_ctrl;
|
|
|
|
- if (list_empty(&ctrl->info.mappings)) {
|
|
- ctrl->handle = NULL;
|
|
+ if (list_empty(&ctrl->info.mappings))
|
|
return false;
|
|
- }
|
|
|
|
w->data = data;
|
|
w->urb = urb;
|
|
@@ -1626,13 +1624,13 @@ static void uvc_ctrl_send_events(struct uvc_fh *handle,
|
|
{
|
|
struct uvc_control_mapping *mapping;
|
|
struct uvc_control *ctrl;
|
|
- u32 changes = V4L2_EVENT_CTRL_CH_VALUE;
|
|
unsigned int i;
|
|
unsigned int j;
|
|
|
|
for (i = 0; i < xctrls_count; ++i) {
|
|
- ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping);
|
|
+ u32 changes = V4L2_EVENT_CTRL_CH_VALUE;
|
|
|
|
+ ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping);
|
|
if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS)
|
|
/* Notification will be sent from an Interrupt event. */
|
|
continue;
|
|
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
|
|
index 1b05890f99f4f4..95c5b90f3e7c11 100644
|
|
--- a/drivers/media/usb/uvc/uvc_driver.c
|
|
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
|
@@ -775,27 +775,14 @@ static const u8 uvc_media_transport_input_guid[16] =
|
|
UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT;
|
|
static const u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING;
|
|
|
|
-static struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type,
|
|
- u16 id, unsigned int num_pads,
|
|
- unsigned int extra_size)
|
|
+static struct uvc_entity *uvc_alloc_entity(u16 type, u16 id,
|
|
+ unsigned int num_pads, unsigned int extra_size)
|
|
{
|
|
struct uvc_entity *entity;
|
|
unsigned int num_inputs;
|
|
unsigned int size;
|
|
unsigned int i;
|
|
|
|
- /* Per UVC 1.1+ spec 3.7.2, the ID should be non-zero. */
|
|
- if (id == 0) {
|
|
- dev_err(&dev->udev->dev, "Found Unit with invalid ID 0.\n");
|
|
- return ERR_PTR(-EINVAL);
|
|
- }
|
|
-
|
|
- /* Per UVC 1.1+ spec 3.7.2, the ID is unique. */
|
|
- if (uvc_entity_by_id(dev, id)) {
|
|
- dev_err(&dev->udev->dev, "Found multiple Units with ID %u\n", id);
|
|
- return ERR_PTR(-EINVAL);
|
|
- }
|
|
-
|
|
extra_size = roundup(extra_size, sizeof(*entity->pads));
|
|
if (num_pads)
|
|
num_inputs = type & UVC_TERM_OUTPUT ? num_pads : num_pads - 1;
|
|
@@ -805,7 +792,7 @@ static struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type,
|
|
+ num_inputs;
|
|
entity = kzalloc(size, GFP_KERNEL);
|
|
if (entity == NULL)
|
|
- return ERR_PTR(-ENOMEM);
|
|
+ return NULL;
|
|
|
|
entity->id = id;
|
|
entity->type = type;
|
|
@@ -917,10 +904,10 @@ static int uvc_parse_vendor_control(struct uvc_device *dev,
|
|
break;
|
|
}
|
|
|
|
- unit = uvc_alloc_new_entity(dev, UVC_VC_EXTENSION_UNIT,
|
|
- buffer[3], p + 1, 2 * n);
|
|
- if (IS_ERR(unit))
|
|
- return PTR_ERR(unit);
|
|
+ unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3],
|
|
+ p + 1, 2*n);
|
|
+ if (unit == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
memcpy(unit->guid, &buffer[4], 16);
|
|
unit->extension.bNumControls = buffer[20];
|
|
@@ -1029,10 +1016,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- term = uvc_alloc_new_entity(dev, type | UVC_TERM_INPUT,
|
|
- buffer[3], 1, n + p);
|
|
- if (IS_ERR(term))
|
|
- return PTR_ERR(term);
|
|
+ term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3],
|
|
+ 1, n + p);
|
|
+ if (term == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA) {
|
|
term->camera.bControlSize = n;
|
|
@@ -1088,10 +1075,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
|
return 0;
|
|
}
|
|
|
|
- term = uvc_alloc_new_entity(dev, type | UVC_TERM_OUTPUT,
|
|
- buffer[3], 1, 0);
|
|
- if (IS_ERR(term))
|
|
- return PTR_ERR(term);
|
|
+ term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3],
|
|
+ 1, 0);
|
|
+ if (term == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
memcpy(term->baSourceID, &buffer[7], 1);
|
|
|
|
@@ -1110,10 +1097,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3],
|
|
- p + 1, 0);
|
|
- if (IS_ERR(unit))
|
|
- return PTR_ERR(unit);
|
|
+ unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0);
|
|
+ if (unit == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
memcpy(unit->baSourceID, &buffer[5], p);
|
|
|
|
@@ -1133,9 +1119,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3], 2, n);
|
|
- if (IS_ERR(unit))
|
|
- return PTR_ERR(unit);
|
|
+ unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n);
|
|
+ if (unit == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
memcpy(unit->baSourceID, &buffer[4], 1);
|
|
unit->processing.wMaxMultiplier =
|
|
@@ -1162,10 +1148,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3],
|
|
- p + 1, n);
|
|
- if (IS_ERR(unit))
|
|
- return PTR_ERR(unit);
|
|
+ unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n);
|
|
+ if (unit == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
memcpy(unit->guid, &buffer[4], 16);
|
|
unit->extension.bNumControls = buffer[20];
|
|
@@ -1295,20 +1280,19 @@ static int uvc_gpio_parse(struct uvc_device *dev)
|
|
struct gpio_desc *gpio_privacy;
|
|
int irq;
|
|
|
|
- gpio_privacy = devm_gpiod_get_optional(&dev->udev->dev, "privacy",
|
|
+ gpio_privacy = devm_gpiod_get_optional(&dev->intf->dev, "privacy",
|
|
GPIOD_IN);
|
|
if (IS_ERR_OR_NULL(gpio_privacy))
|
|
return PTR_ERR_OR_ZERO(gpio_privacy);
|
|
|
|
irq = gpiod_to_irq(gpio_privacy);
|
|
if (irq < 0)
|
|
- return dev_err_probe(&dev->udev->dev, irq,
|
|
+ return dev_err_probe(&dev->intf->dev, irq,
|
|
"No IRQ for privacy GPIO\n");
|
|
|
|
- unit = uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT,
|
|
- UVC_EXT_GPIO_UNIT_ID, 0, 1);
|
|
- if (IS_ERR(unit))
|
|
- return PTR_ERR(unit);
|
|
+ unit = uvc_alloc_entity(UVC_EXT_GPIO_UNIT, UVC_EXT_GPIO_UNIT_ID, 0, 1);
|
|
+ if (!unit)
|
|
+ return -ENOMEM;
|
|
|
|
unit->gpio.gpio_privacy = gpio_privacy;
|
|
unit->gpio.irq = irq;
|
|
@@ -1329,15 +1313,27 @@ static int uvc_gpio_parse(struct uvc_device *dev)
|
|
static int uvc_gpio_init_irq(struct uvc_device *dev)
|
|
{
|
|
struct uvc_entity *unit = dev->gpio_unit;
|
|
+ int ret;
|
|
|
|
if (!unit || unit->gpio.irq < 0)
|
|
return 0;
|
|
|
|
- return devm_request_threaded_irq(&dev->udev->dev, unit->gpio.irq, NULL,
|
|
- uvc_gpio_irq,
|
|
- IRQF_ONESHOT | IRQF_TRIGGER_FALLING |
|
|
- IRQF_TRIGGER_RISING,
|
|
- "uvc_privacy_gpio", dev);
|
|
+ ret = request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq,
|
|
+ IRQF_ONESHOT | IRQF_TRIGGER_FALLING |
|
|
+ IRQF_TRIGGER_RISING,
|
|
+ "uvc_privacy_gpio", dev);
|
|
+
|
|
+ unit->gpio.initialized = !ret;
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static void uvc_gpio_deinit(struct uvc_device *dev)
|
|
+{
|
|
+ if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized)
|
|
+ return;
|
|
+
|
|
+ free_irq(dev->gpio_unit->gpio.irq, dev);
|
|
}
|
|
|
|
/* ------------------------------------------------------------------------
|
|
@@ -1934,6 +1930,8 @@ static void uvc_unregister_video(struct uvc_device *dev)
|
|
{
|
|
struct uvc_streaming *stream;
|
|
|
|
+ uvc_gpio_deinit(dev);
|
|
+
|
|
list_for_each_entry(stream, &dev->streams, list) {
|
|
/* Nothing to do here, continue. */
|
|
if (!video_is_registered(&stream->vdev))
|
|
diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
|
|
index 91c350b2541267..a2504e1e991b93 100644
|
|
--- a/drivers/media/usb/uvc/uvc_video.c
|
|
+++ b/drivers/media/usb/uvc/uvc_video.c
|
|
@@ -79,6 +79,27 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit,
|
|
if (likely(ret == size))
|
|
return 0;
|
|
|
|
+ /*
|
|
+ * Some devices return shorter USB control packets than expected if the
|
|
+ * returned value can fit in less bytes. Zero all the bytes that the
|
|
+ * device has not written.
|
|
+ *
|
|
+ * This quirk is applied to all controls, regardless of their data type.
|
|
+ * Most controls are little-endian integers, in which case the missing
|
|
+ * bytes become 0 MSBs. For other data types, a different heuristic
|
|
+ * could be implemented if a device is found needing it.
|
|
+ *
|
|
+ * We exclude UVC_GET_INFO from the quirk. UVC_GET_LEN does not need
|
|
+ * to be excluded because its size is always 1.
|
|
+ */
|
|
+ if (ret > 0 && query != UVC_GET_INFO) {
|
|
+ memset(data + ret, 0, size - ret);
|
|
+ dev_warn_once(&dev->udev->dev,
|
|
+ "UVC non compliance: %s control %u on unit %u returned %d bytes when we expected %u.\n",
|
|
+ uvc_query_name(query), cs, unit, ret, size);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
if (ret != -EPIPE) {
|
|
dev_err(&dev->udev->dev,
|
|
"Failed to query (%s) UVC control %u on unit %u: %d (exp. %u).\n",
|
|
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
|
|
index e5b12717016fa3..997f4b5b5e22ac 100644
|
|
--- a/drivers/media/usb/uvc/uvcvideo.h
|
|
+++ b/drivers/media/usb/uvc/uvcvideo.h
|
|
@@ -229,6 +229,7 @@ struct uvc_entity {
|
|
u8 *bmControls;
|
|
struct gpio_desc *gpio_privacy;
|
|
int irq;
|
|
+ bool initialized;
|
|
} gpio;
|
|
};
|
|
|
|
diff --git a/drivers/media/v4l2-core/v4l2-mc.c b/drivers/media/v4l2-core/v4l2-mc.c
|
|
index 52d349e72b8ca5..788a4ac3805751 100644
|
|
--- a/drivers/media/v4l2-core/v4l2-mc.c
|
|
+++ b/drivers/media/v4l2-core/v4l2-mc.c
|
|
@@ -329,7 +329,7 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
|
|
if (!(sink->flags & MEDIA_PAD_FL_SINK))
|
|
return -EINVAL;
|
|
|
|
- fwnode_graph_for_each_endpoint(dev_fwnode(src_sd->dev), endpoint) {
|
|
+ fwnode_graph_for_each_endpoint(src_sd->fwnode, endpoint) {
|
|
struct fwnode_handle *remote_ep;
|
|
int src_idx, sink_idx, ret;
|
|
struct media_pad *src;
|
|
diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c
|
|
index 7b1c597b6879fb..03367fcac42a7f 100644
|
|
--- a/drivers/mfd/lpc_ich.c
|
|
+++ b/drivers/mfd/lpc_ich.c
|
|
@@ -756,8 +756,9 @@ static const struct pci_device_id lpc_ich_ids[] = {
|
|
{ PCI_VDEVICE(INTEL, 0x2917), LPC_ICH9ME},
|
|
{ PCI_VDEVICE(INTEL, 0x2918), LPC_ICH9},
|
|
{ PCI_VDEVICE(INTEL, 0x2919), LPC_ICH9M},
|
|
- { PCI_VDEVICE(INTEL, 0x3197), LPC_GLK},
|
|
{ PCI_VDEVICE(INTEL, 0x2b9c), LPC_COUGARMOUNTAIN},
|
|
+ { PCI_VDEVICE(INTEL, 0x3197), LPC_GLK},
|
|
+ { PCI_VDEVICE(INTEL, 0x31e8), LPC_GLK},
|
|
{ PCI_VDEVICE(INTEL, 0x3a14), LPC_ICH10DO},
|
|
{ PCI_VDEVICE(INTEL, 0x3a16), LPC_ICH10R},
|
|
{ PCI_VDEVICE(INTEL, 0x3a18), LPC_ICH10},
|
|
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
|
|
index 4df0d7a0cd1184..fc021e265edc01 100644
|
|
--- a/drivers/misc/fastrpc.c
|
|
+++ b/drivers/misc/fastrpc.c
|
|
@@ -988,7 +988,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
|
|
mmap_read_lock(current->mm);
|
|
vma = find_vma(current->mm, ctx->args[i].ptr);
|
|
if (vma)
|
|
- pages[i].addr += ctx->args[i].ptr -
|
|
+ pages[i].addr += (ctx->args[i].ptr & PAGE_MASK) -
|
|
vma->vm_start;
|
|
mmap_read_unlock(current->mm);
|
|
|
|
@@ -1015,8 +1015,8 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
|
|
(pkt_size - rlen);
|
|
pages[i].addr = pages[i].addr & PAGE_MASK;
|
|
|
|
- pg_start = (args & PAGE_MASK) >> PAGE_SHIFT;
|
|
- pg_end = ((args + len - 1) & PAGE_MASK) >> PAGE_SHIFT;
|
|
+ pg_start = (rpra[i].buf.pv & PAGE_MASK) >> PAGE_SHIFT;
|
|
+ pg_end = ((rpra[i].buf.pv + len - 1) & PAGE_MASK) >> PAGE_SHIFT;
|
|
pages[i].size = (pg_end - pg_start + 1) * PAGE_SIZE;
|
|
args = args + mlen;
|
|
rlen -= mlen;
|
|
@@ -2327,7 +2327,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
|
|
|
|
err = fastrpc_device_register(rdev, data, false, domains[domain_id]);
|
|
if (err)
|
|
- goto fdev_error;
|
|
+ goto populate_error;
|
|
break;
|
|
default:
|
|
err = -EINVAL;
|
|
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
|
|
index 5914516df2f7fd..cb87e827377934 100644
|
|
--- a/drivers/mmc/core/sdio.c
|
|
+++ b/drivers/mmc/core/sdio.c
|
|
@@ -458,6 +458,8 @@ static unsigned mmc_sdio_get_max_clock(struct mmc_card *card)
|
|
if (mmc_card_sd_combo(card))
|
|
max_dtr = min(max_dtr, mmc_sd_get_max_clock(card));
|
|
|
|
+ max_dtr = min_not_zero(max_dtr, card->quirk_max_rate);
|
|
+
|
|
return max_dtr;
|
|
}
|
|
|
|
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
|
|
index 8716004fcf6c90..945d08531de376 100644
|
|
--- a/drivers/mmc/host/sdhci-msm.c
|
|
+++ b/drivers/mmc/host/sdhci-msm.c
|
|
@@ -134,9 +134,18 @@
|
|
/* Timeout value to avoid infinite waiting for pwr_irq */
|
|
#define MSM_PWR_IRQ_TIMEOUT_MS 5000
|
|
|
|
+/* Max load for eMMC Vdd supply */
|
|
+#define MMC_VMMC_MAX_LOAD_UA 570000
|
|
+
|
|
/* Max load for eMMC Vdd-io supply */
|
|
#define MMC_VQMMC_MAX_LOAD_UA 325000
|
|
|
|
+/* Max load for SD Vdd supply */
|
|
+#define SD_VMMC_MAX_LOAD_UA 800000
|
|
+
|
|
+/* Max load for SD Vdd-io supply */
|
|
+#define SD_VQMMC_MAX_LOAD_UA 22000
|
|
+
|
|
#define msm_host_readl(msm_host, host, offset) \
|
|
msm_host->var_ops->msm_readl_relaxed(host, offset)
|
|
|
|
@@ -1403,11 +1412,48 @@ static int sdhci_msm_set_pincfg(struct sdhci_msm_host *msm_host, bool level)
|
|
return ret;
|
|
}
|
|
|
|
-static int sdhci_msm_set_vmmc(struct mmc_host *mmc)
|
|
+static void msm_config_vmmc_regulator(struct mmc_host *mmc, bool hpm)
|
|
+{
|
|
+ int load;
|
|
+
|
|
+ if (!hpm)
|
|
+ load = 0;
|
|
+ else if (!mmc->card)
|
|
+ load = max(MMC_VMMC_MAX_LOAD_UA, SD_VMMC_MAX_LOAD_UA);
|
|
+ else if (mmc_card_mmc(mmc->card))
|
|
+ load = MMC_VMMC_MAX_LOAD_UA;
|
|
+ else if (mmc_card_sd(mmc->card))
|
|
+ load = SD_VMMC_MAX_LOAD_UA;
|
|
+ else
|
|
+ return;
|
|
+
|
|
+ regulator_set_load(mmc->supply.vmmc, load);
|
|
+}
|
|
+
|
|
+static void msm_config_vqmmc_regulator(struct mmc_host *mmc, bool hpm)
|
|
+{
|
|
+ int load;
|
|
+
|
|
+ if (!hpm)
|
|
+ load = 0;
|
|
+ else if (!mmc->card)
|
|
+ load = max(MMC_VQMMC_MAX_LOAD_UA, SD_VQMMC_MAX_LOAD_UA);
|
|
+ else if (mmc_card_sd(mmc->card))
|
|
+ load = SD_VQMMC_MAX_LOAD_UA;
|
|
+ else
|
|
+ return;
|
|
+
|
|
+ regulator_set_load(mmc->supply.vqmmc, load);
|
|
+}
|
|
+
|
|
+static int sdhci_msm_set_vmmc(struct sdhci_msm_host *msm_host,
|
|
+ struct mmc_host *mmc, bool hpm)
|
|
{
|
|
if (IS_ERR(mmc->supply.vmmc))
|
|
return 0;
|
|
|
|
+ msm_config_vmmc_regulator(mmc, hpm);
|
|
+
|
|
return mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, mmc->ios.vdd);
|
|
}
|
|
|
|
@@ -1420,6 +1466,8 @@ static int msm_toggle_vqmmc(struct sdhci_msm_host *msm_host,
|
|
if (msm_host->vqmmc_enabled == level)
|
|
return 0;
|
|
|
|
+ msm_config_vqmmc_regulator(mmc, level);
|
|
+
|
|
if (level) {
|
|
/* Set the IO voltage regulator to default voltage level */
|
|
if (msm_host->caps_0 & CORE_3_0V_SUPPORT)
|
|
@@ -1642,7 +1690,8 @@ static void sdhci_msm_handle_pwr_irq(struct sdhci_host *host, int irq)
|
|
}
|
|
|
|
if (pwr_state) {
|
|
- ret = sdhci_msm_set_vmmc(mmc);
|
|
+ ret = sdhci_msm_set_vmmc(msm_host, mmc,
|
|
+ pwr_state & REQ_BUS_ON);
|
|
if (!ret)
|
|
ret = sdhci_msm_set_vqmmc(msm_host, mmc,
|
|
pwr_state & REQ_BUS_ON);
|
|
diff --git a/drivers/mtd/nand/onenand/onenand_base.c b/drivers/mtd/nand/onenand/onenand_base.c
|
|
index f66385faf631cd..0dc2ea4fc857b7 100644
|
|
--- a/drivers/mtd/nand/onenand/onenand_base.c
|
|
+++ b/drivers/mtd/nand/onenand/onenand_base.c
|
|
@@ -2923,6 +2923,7 @@ static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
|
|
ret = ONENAND_IS_4KB_PAGE(this) ?
|
|
onenand_mlc_read_ops_nolock(mtd, from, &ops) :
|
|
onenand_read_ops_nolock(mtd, from, &ops);
|
|
+ *retlen = ops.retlen;
|
|
|
|
/* Exit OTP access mode */
|
|
this->command(mtd, ONENAND_CMD_RESET, 0, 0);
|
|
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
|
|
index 8ee51e49fced55..144aa76d13e904 100644
|
|
--- a/drivers/mtd/ubi/build.c
|
|
+++ b/drivers/mtd/ubi/build.c
|
|
@@ -1462,7 +1462,7 @@ static int ubi_mtd_param_parse(const char *val, const struct kernel_param *kp)
|
|
if (token) {
|
|
int err = kstrtoint(token, 10, &p->ubi_num);
|
|
|
|
- if (err) {
|
|
+ if (err || p->ubi_num < UBI_DEV_NUM_AUTO) {
|
|
pr_err("UBI error: bad value for ubi_num parameter: %s\n",
|
|
token);
|
|
return -EINVAL;
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
index d6d6d5d37ff3e6..c9b0d57696a487 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
@@ -1441,7 +1441,9 @@ void aq_nic_deinit(struct aq_nic_s *self, bool link_down)
|
|
aq_ptp_ring_free(self);
|
|
aq_ptp_free(self);
|
|
|
|
- if (likely(self->aq_fw_ops->deinit) && link_down) {
|
|
+ /* May be invoked during hot unplug. */
|
|
+ if (pci_device_is_present(self->pdev) &&
|
|
+ likely(self->aq_fw_ops->deinit) && link_down) {
|
|
mutex_lock(&self->fwreq_mutex);
|
|
self->aq_fw_ops->deinit(self->aq_hw);
|
|
mutex_unlock(&self->fwreq_mutex);
|
|
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
|
|
index 0715ea5bf13ed9..3b082114f2e538 100644
|
|
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
|
|
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
|
|
@@ -41,9 +41,12 @@ void bcmgenet_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|
{
|
|
struct bcmgenet_priv *priv = netdev_priv(dev);
|
|
struct device *kdev = &priv->pdev->dev;
|
|
+ u32 phy_wolopts = 0;
|
|
|
|
- if (dev->phydev)
|
|
+ if (dev->phydev) {
|
|
phy_ethtool_get_wol(dev->phydev, wol);
|
|
+ phy_wolopts = wol->wolopts;
|
|
+ }
|
|
|
|
/* MAC is not wake-up capable, return what the PHY does */
|
|
if (!device_can_wakeup(kdev))
|
|
@@ -51,9 +54,14 @@ void bcmgenet_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|
|
|
/* Overlay MAC capabilities with that of the PHY queried before */
|
|
wol->supported |= WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER;
|
|
- wol->wolopts = priv->wolopts;
|
|
- memset(wol->sopass, 0, sizeof(wol->sopass));
|
|
+ wol->wolopts |= priv->wolopts;
|
|
|
|
+ /* Return the PHY configured magic password */
|
|
+ if (phy_wolopts & WAKE_MAGICSECURE)
|
|
+ return;
|
|
+
|
|
+ /* Otherwise the MAC one */
|
|
+ memset(wol->sopass, 0, sizeof(wol->sopass));
|
|
if (wol->wolopts & WAKE_MAGICSECURE)
|
|
memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass));
|
|
}
|
|
@@ -70,7 +78,7 @@ int bcmgenet_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|
/* Try Wake-on-LAN from the PHY first */
|
|
if (dev->phydev) {
|
|
ret = phy_ethtool_set_wol(dev->phydev, wol);
|
|
- if (ret != -EOPNOTSUPP)
|
|
+ if (ret != -EOPNOTSUPP && wol->wolopts)
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
|
|
index 7f74e5e106d9d4..b3878975bd9c05 100644
|
|
--- a/drivers/net/ethernet/broadcom/tg3.c
|
|
+++ b/drivers/net/ethernet/broadcom/tg3.c
|
|
@@ -55,6 +55,7 @@
|
|
#include <linux/hwmon.h>
|
|
#include <linux/hwmon-sysfs.h>
|
|
#include <linux/crc32poly.h>
|
|
+#include <linux/dmi.h>
|
|
|
|
#include <net/checksum.h>
|
|
#include <net/gso.h>
|
|
@@ -18106,6 +18107,50 @@ static int tg3_resume(struct device *device)
|
|
|
|
static SIMPLE_DEV_PM_OPS(tg3_pm_ops, tg3_suspend, tg3_resume);
|
|
|
|
+/* Systems where ACPI _PTS (Prepare To Sleep) S5 will result in a fatal
|
|
+ * PCIe AER event on the tg3 device if the tg3 device is not, or cannot
|
|
+ * be, powered down.
|
|
+ */
|
|
+static const struct dmi_system_id tg3_restart_aer_quirk_table[] = {
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R440"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R540"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R640"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R650"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R740"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R750"),
|
|
+ },
|
|
+ },
|
|
+ {}
|
|
+};
|
|
+
|
|
static void tg3_shutdown(struct pci_dev *pdev)
|
|
{
|
|
struct net_device *dev = pci_get_drvdata(pdev);
|
|
@@ -18122,6 +18167,19 @@ static void tg3_shutdown(struct pci_dev *pdev)
|
|
|
|
if (system_state == SYSTEM_POWER_OFF)
|
|
tg3_power_down(tp);
|
|
+ else if (system_state == SYSTEM_RESTART &&
|
|
+ dmi_first_match(tg3_restart_aer_quirk_table) &&
|
|
+ pdev->current_state != PCI_D3cold &&
|
|
+ pdev->current_state != PCI_UNKNOWN) {
|
|
+ /* Disable PCIe AER on the tg3 to avoid a fatal
|
|
+ * error during this system restart.
|
|
+ */
|
|
+ pcie_capability_clear_word(pdev, PCI_EXP_DEVCTL,
|
|
+ PCI_EXP_DEVCTL_CERE |
|
|
+ PCI_EXP_DEVCTL_NFERE |
|
|
+ PCI_EXP_DEVCTL_FERE |
|
|
+ PCI_EXP_DEVCTL_URRE);
|
|
+ }
|
|
|
|
rtnl_unlock();
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
|
|
index 80dc5445b50d45..030ca0ef71d876 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_devlink.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
|
|
@@ -999,6 +999,9 @@ static int ice_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv
|
|
|
|
/* preallocate memory for ice_sched_node */
|
|
node = devm_kzalloc(ice_hw_to_dev(pi->hw), sizeof(*node), GFP_KERNEL);
|
|
+ if (!node)
|
|
+ return -ENOMEM;
|
|
+
|
|
*priv = node;
|
|
|
|
return 0;
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
|
|
index 429afffa4c3169..f5023ac9ab8323 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
|
|
@@ -1101,6 +1101,49 @@ ice_put_rx_buf(struct ice_rx_ring *rx_ring, struct ice_rx_buf *rx_buf)
|
|
rx_buf->page = NULL;
|
|
}
|
|
|
|
+/**
|
|
+ * ice_put_rx_mbuf - ice_put_rx_buf() caller, for all frame frags
|
|
+ * @rx_ring: Rx ring with all the auxiliary data
|
|
+ * @xdp: XDP buffer carrying linear + frags part
|
|
+ * @xdp_xmit: XDP_TX/XDP_REDIRECT verdict storage
|
|
+ * @ntc: a current next_to_clean value to be stored at rx_ring
|
|
+ *
|
|
+ * Walk through gathered fragments and satisfy internal page
|
|
+ * recycle mechanism; we take here an action related to verdict
|
|
+ * returned by XDP program;
|
|
+ */
|
|
+static void ice_put_rx_mbuf(struct ice_rx_ring *rx_ring, struct xdp_buff *xdp,
|
|
+ u32 *xdp_xmit, u32 ntc)
|
|
+{
|
|
+ u32 nr_frags = rx_ring->nr_frags + 1;
|
|
+ u32 idx = rx_ring->first_desc;
|
|
+ u32 cnt = rx_ring->count;
|
|
+ struct ice_rx_buf *buf;
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < nr_frags; i++) {
|
|
+ buf = &rx_ring->rx_buf[idx];
|
|
+
|
|
+ if (buf->act & (ICE_XDP_TX | ICE_XDP_REDIR)) {
|
|
+ ice_rx_buf_adjust_pg_offset(buf, xdp->frame_sz);
|
|
+ *xdp_xmit |= buf->act;
|
|
+ } else if (buf->act & ICE_XDP_CONSUMED) {
|
|
+ buf->pagecnt_bias++;
|
|
+ } else if (buf->act == ICE_XDP_PASS) {
|
|
+ ice_rx_buf_adjust_pg_offset(buf, xdp->frame_sz);
|
|
+ }
|
|
+
|
|
+ ice_put_rx_buf(rx_ring, buf);
|
|
+
|
|
+ if (++idx == cnt)
|
|
+ idx = 0;
|
|
+ }
|
|
+
|
|
+ xdp->data = NULL;
|
|
+ rx_ring->first_desc = ntc;
|
|
+ rx_ring->nr_frags = 0;
|
|
+}
|
|
+
|
|
/**
|
|
* ice_clean_rx_irq - Clean completed descriptors from Rx ring - bounce buf
|
|
* @rx_ring: Rx descriptor ring to transact packets on
|
|
@@ -1118,7 +1161,6 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
|
unsigned int total_rx_bytes = 0, total_rx_pkts = 0;
|
|
unsigned int offset = rx_ring->rx_offset;
|
|
struct xdp_buff *xdp = &rx_ring->xdp;
|
|
- u32 cached_ntc = rx_ring->first_desc;
|
|
struct ice_tx_ring *xdp_ring = NULL;
|
|
struct bpf_prog *xdp_prog = NULL;
|
|
u32 ntc = rx_ring->next_to_clean;
|
|
@@ -1126,7 +1168,6 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
|
u32 xdp_xmit = 0;
|
|
u32 cached_ntu;
|
|
bool failure;
|
|
- u32 first;
|
|
|
|
xdp_prog = READ_ONCE(rx_ring->xdp_prog);
|
|
if (xdp_prog) {
|
|
@@ -1189,6 +1230,7 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
|
xdp_prepare_buff(xdp, hard_start, offset, size, !!offset);
|
|
xdp_buff_clear_frags_flag(xdp);
|
|
} else if (ice_add_xdp_frag(rx_ring, xdp, rx_buf, size)) {
|
|
+ ice_put_rx_mbuf(rx_ring, xdp, NULL, ntc);
|
|
break;
|
|
}
|
|
if (++ntc == cnt)
|
|
@@ -1204,9 +1246,8 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
|
total_rx_bytes += xdp_get_buff_len(xdp);
|
|
total_rx_pkts++;
|
|
|
|
- xdp->data = NULL;
|
|
- rx_ring->first_desc = ntc;
|
|
- rx_ring->nr_frags = 0;
|
|
+ ice_put_rx_mbuf(rx_ring, xdp, &xdp_xmit, ntc);
|
|
+
|
|
continue;
|
|
construct_skb:
|
|
if (likely(ice_ring_uses_build_skb(rx_ring)))
|
|
@@ -1220,14 +1261,11 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
|
if (unlikely(xdp_buff_has_frags(xdp)))
|
|
ice_set_rx_bufs_act(xdp, rx_ring,
|
|
ICE_XDP_CONSUMED);
|
|
- xdp->data = NULL;
|
|
- rx_ring->first_desc = ntc;
|
|
- rx_ring->nr_frags = 0;
|
|
- break;
|
|
}
|
|
- xdp->data = NULL;
|
|
- rx_ring->first_desc = ntc;
|
|
- rx_ring->nr_frags = 0;
|
|
+ ice_put_rx_mbuf(rx_ring, xdp, &xdp_xmit, ntc);
|
|
+
|
|
+ if (!skb)
|
|
+ break;
|
|
|
|
stat_err_bits = BIT(ICE_RX_FLEX_DESC_STATUS0_RXE_S);
|
|
if (unlikely(ice_test_staterr(rx_desc->wb.status_error0,
|
|
@@ -1259,23 +1297,6 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
|
total_rx_pkts++;
|
|
}
|
|
|
|
- first = rx_ring->first_desc;
|
|
- while (cached_ntc != first) {
|
|
- struct ice_rx_buf *buf = &rx_ring->rx_buf[cached_ntc];
|
|
-
|
|
- if (buf->act & (ICE_XDP_TX | ICE_XDP_REDIR)) {
|
|
- ice_rx_buf_adjust_pg_offset(buf, xdp->frame_sz);
|
|
- xdp_xmit |= buf->act;
|
|
- } else if (buf->act & ICE_XDP_CONSUMED) {
|
|
- buf->pagecnt_bias++;
|
|
- } else if (buf->act == ICE_XDP_PASS) {
|
|
- ice_rx_buf_adjust_pg_offset(buf, xdp->frame_sz);
|
|
- }
|
|
-
|
|
- ice_put_rx_buf(rx_ring, buf);
|
|
- if (++cached_ntc >= cnt)
|
|
- cached_ntc = 0;
|
|
- }
|
|
rx_ring->next_to_clean = ntc;
|
|
/* return up to cleaned_count buffers to hardware */
|
|
failure = ice_alloc_rx_bufs(rx_ring, ICE_RX_DESC_UNUSED(rx_ring));
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
|
|
index 0c83ef174275a7..f00702bf781f17 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
|
|
@@ -237,17 +237,16 @@ static void mlx5_pps_out(struct work_struct *work)
|
|
}
|
|
}
|
|
|
|
-static void mlx5_timestamp_overflow(struct work_struct *work)
|
|
+static long mlx5_timestamp_overflow(struct ptp_clock_info *ptp_info)
|
|
{
|
|
- struct delayed_work *dwork = to_delayed_work(work);
|
|
struct mlx5_core_dev *mdev;
|
|
struct mlx5_timer *timer;
|
|
struct mlx5_clock *clock;
|
|
unsigned long flags;
|
|
|
|
- timer = container_of(dwork, struct mlx5_timer, overflow_work);
|
|
- clock = container_of(timer, struct mlx5_clock, timer);
|
|
+ clock = container_of(ptp_info, struct mlx5_clock, ptp_info);
|
|
mdev = container_of(clock, struct mlx5_core_dev, clock);
|
|
+ timer = &clock->timer;
|
|
|
|
if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR)
|
|
goto out;
|
|
@@ -258,7 +257,7 @@ static void mlx5_timestamp_overflow(struct work_struct *work)
|
|
write_sequnlock_irqrestore(&clock->lock, flags);
|
|
|
|
out:
|
|
- schedule_delayed_work(&timer->overflow_work, timer->overflow_period);
|
|
+ return timer->overflow_period;
|
|
}
|
|
|
|
static int mlx5_ptp_settime_real_time(struct mlx5_core_dev *mdev,
|
|
@@ -435,6 +434,7 @@ static int mlx5_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
|
|
timer->cycles.mult = mult;
|
|
mlx5_update_clock_info_page(mdev);
|
|
write_sequnlock_irqrestore(&clock->lock, flags);
|
|
+ ptp_schedule_worker(clock->ptp, timer->overflow_period);
|
|
|
|
return 0;
|
|
}
|
|
@@ -770,6 +770,7 @@ static const struct ptp_clock_info mlx5_ptp_clock_info = {
|
|
.settime64 = mlx5_ptp_settime,
|
|
.enable = NULL,
|
|
.verify = NULL,
|
|
+ .do_aux_work = mlx5_timestamp_overflow,
|
|
};
|
|
|
|
static int mlx5_query_mtpps_pin_mode(struct mlx5_core_dev *mdev, u8 pin,
|
|
@@ -970,12 +971,11 @@ static void mlx5_init_overflow_period(struct mlx5_clock *clock)
|
|
do_div(ns, NSEC_PER_SEC / HZ);
|
|
timer->overflow_period = ns;
|
|
|
|
- INIT_DELAYED_WORK(&timer->overflow_work, mlx5_timestamp_overflow);
|
|
- if (timer->overflow_period)
|
|
- schedule_delayed_work(&timer->overflow_work, 0);
|
|
- else
|
|
+ if (!timer->overflow_period) {
|
|
+ timer->overflow_period = HZ;
|
|
mlx5_core_warn(mdev,
|
|
- "invalid overflow period, overflow_work is not scheduled\n");
|
|
+ "invalid overflow period, overflow_work is scheduled once per second\n");
|
|
+ }
|
|
|
|
if (clock_info)
|
|
clock_info->overflow_period = timer->overflow_period;
|
|
@@ -1061,6 +1061,9 @@ void mlx5_init_clock(struct mlx5_core_dev *mdev)
|
|
|
|
MLX5_NB_INIT(&clock->pps_nb, mlx5_pps_event, PPS_EVENT);
|
|
mlx5_eq_notifier_register(mdev, &clock->pps_nb);
|
|
+
|
|
+ if (clock->ptp)
|
|
+ ptp_schedule_worker(clock->ptp, 0);
|
|
}
|
|
|
|
void mlx5_cleanup_clock(struct mlx5_core_dev *mdev)
|
|
@@ -1077,7 +1080,6 @@ void mlx5_cleanup_clock(struct mlx5_core_dev *mdev)
|
|
}
|
|
|
|
cancel_work_sync(&clock->pps_info.out_work);
|
|
- cancel_delayed_work_sync(&clock->timer.overflow_work);
|
|
|
|
if (mdev->clock_info) {
|
|
free_page((unsigned long)mdev->clock_info);
|
|
diff --git a/drivers/net/phy/nxp-c45-tja11xx.c b/drivers/net/phy/nxp-c45-tja11xx.c
|
|
index 7ab080ff02dfa6..77292c944c76d2 100644
|
|
--- a/drivers/net/phy/nxp-c45-tja11xx.c
|
|
+++ b/drivers/net/phy/nxp-c45-tja11xx.c
|
|
@@ -1302,6 +1302,8 @@ static int nxp_c45_soft_reset(struct phy_device *phydev)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ usleep_range(2000, 2050);
|
|
+
|
|
return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
|
|
VEND1_DEVICE_CONTROL, ret,
|
|
!(ret & DEVICE_CONTROL_RESET), 20000,
|
|
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
|
|
index cbb2f78ffde03c..c1fdf8804d60b6 100644
|
|
--- a/drivers/net/tun.c
|
|
+++ b/drivers/net/tun.c
|
|
@@ -580,7 +580,7 @@ static inline bool tun_not_capable(struct tun_struct *tun)
|
|
struct net *net = dev_net(tun->dev);
|
|
|
|
return ((uid_valid(tun->owner) && !uid_eq(cred->euid, tun->owner)) ||
|
|
- (gid_valid(tun->group) && !in_egroup_p(tun->group))) &&
|
|
+ (gid_valid(tun->group) && !in_egroup_p(tun->group))) &&
|
|
!ns_capable(net->user_ns, CAP_NET_ADMIN);
|
|
}
|
|
|
|
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c
|
|
index 46afb95ffabe3b..a19789b571905a 100644
|
|
--- a/drivers/net/usb/ipheth.c
|
|
+++ b/drivers/net/usb/ipheth.c
|
|
@@ -61,7 +61,18 @@
|
|
#define IPHETH_USBINTF_PROTO 1
|
|
|
|
#define IPHETH_IP_ALIGN 2 /* padding at front of URB */
|
|
-#define IPHETH_NCM_HEADER_SIZE (12 + 96) /* NCMH + NCM0 */
|
|
+/* On iOS devices, NCM headers in RX have a fixed size regardless of DPE count:
|
|
+ * - NTH16 (NCMH): 12 bytes, as per CDC NCM 1.0 spec
|
|
+ * - NDP16 (NCM0): 96 bytes, of which
|
|
+ * - NDP16 fixed header: 8 bytes
|
|
+ * - maximum of 22 DPEs (21 datagrams + trailer), 4 bytes each
|
|
+ */
|
|
+#define IPHETH_NDP16_MAX_DPE 22
|
|
+#define IPHETH_NDP16_HEADER_SIZE (sizeof(struct usb_cdc_ncm_ndp16) + \
|
|
+ IPHETH_NDP16_MAX_DPE * \
|
|
+ sizeof(struct usb_cdc_ncm_dpe16))
|
|
+#define IPHETH_NCM_HEADER_SIZE (sizeof(struct usb_cdc_ncm_nth16) + \
|
|
+ IPHETH_NDP16_HEADER_SIZE)
|
|
#define IPHETH_TX_BUF_SIZE ETH_FRAME_LEN
|
|
#define IPHETH_RX_BUF_SIZE_LEGACY (IPHETH_IP_ALIGN + ETH_FRAME_LEN)
|
|
#define IPHETH_RX_BUF_SIZE_NCM 65536
|
|
@@ -207,15 +218,23 @@ static int ipheth_rcvbulk_callback_legacy(struct urb *urb)
|
|
return ipheth_consume_skb(buf, len, dev);
|
|
}
|
|
|
|
+/* In "NCM mode", the iOS device encapsulates RX (phone->computer) traffic
|
|
+ * in NCM Transfer Blocks (similarly to CDC NCM). However, unlike reverse
|
|
+ * tethering (handled by the `cdc_ncm` driver), regular tethering is not
|
|
+ * compliant with the CDC NCM spec, as the device is missing the necessary
|
|
+ * descriptors, and TX (computer->phone) traffic is not encapsulated
|
|
+ * at all. Thus `ipheth` implements a very limited subset of the spec with
|
|
+ * the sole purpose of parsing RX URBs.
|
|
+ */
|
|
static int ipheth_rcvbulk_callback_ncm(struct urb *urb)
|
|
{
|
|
struct usb_cdc_ncm_nth16 *ncmh;
|
|
struct usb_cdc_ncm_ndp16 *ncm0;
|
|
struct usb_cdc_ncm_dpe16 *dpe;
|
|
struct ipheth_device *dev;
|
|
+ u16 dg_idx, dg_len;
|
|
int retval = -EINVAL;
|
|
char *buf;
|
|
- int len;
|
|
|
|
dev = urb->context;
|
|
|
|
@@ -226,40 +245,42 @@ static int ipheth_rcvbulk_callback_ncm(struct urb *urb)
|
|
|
|
ncmh = urb->transfer_buffer;
|
|
if (ncmh->dwSignature != cpu_to_le32(USB_CDC_NCM_NTH16_SIGN) ||
|
|
- le16_to_cpu(ncmh->wNdpIndex) >= urb->actual_length) {
|
|
- dev->net->stats.rx_errors++;
|
|
- return retval;
|
|
- }
|
|
+ /* On iOS, NDP16 directly follows NTH16 */
|
|
+ ncmh->wNdpIndex != cpu_to_le16(sizeof(struct usb_cdc_ncm_nth16)))
|
|
+ goto rx_error;
|
|
|
|
- ncm0 = urb->transfer_buffer + le16_to_cpu(ncmh->wNdpIndex);
|
|
- if (ncm0->dwSignature != cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN) ||
|
|
- le16_to_cpu(ncmh->wHeaderLength) + le16_to_cpu(ncm0->wLength) >=
|
|
- urb->actual_length) {
|
|
- dev->net->stats.rx_errors++;
|
|
- return retval;
|
|
- }
|
|
+ ncm0 = urb->transfer_buffer + sizeof(struct usb_cdc_ncm_nth16);
|
|
+ if (ncm0->dwSignature != cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN))
|
|
+ goto rx_error;
|
|
|
|
dpe = ncm0->dpe16;
|
|
- while (le16_to_cpu(dpe->wDatagramIndex) != 0 &&
|
|
- le16_to_cpu(dpe->wDatagramLength) != 0) {
|
|
- if (le16_to_cpu(dpe->wDatagramIndex) >= urb->actual_length ||
|
|
- le16_to_cpu(dpe->wDatagramIndex) +
|
|
- le16_to_cpu(dpe->wDatagramLength) > urb->actual_length) {
|
|
+ for (int dpe_i = 0; dpe_i < IPHETH_NDP16_MAX_DPE; ++dpe_i, ++dpe) {
|
|
+ dg_idx = le16_to_cpu(dpe->wDatagramIndex);
|
|
+ dg_len = le16_to_cpu(dpe->wDatagramLength);
|
|
+
|
|
+ /* Null DPE must be present after last datagram pointer entry
|
|
+ * (3.3.1 USB CDC NCM spec v1.0)
|
|
+ */
|
|
+ if (dg_idx == 0 && dg_len == 0)
|
|
+ return 0;
|
|
+
|
|
+ if (dg_idx < IPHETH_NCM_HEADER_SIZE ||
|
|
+ dg_idx >= urb->actual_length ||
|
|
+ dg_len > urb->actual_length - dg_idx) {
|
|
dev->net->stats.rx_length_errors++;
|
|
return retval;
|
|
}
|
|
|
|
- buf = urb->transfer_buffer + le16_to_cpu(dpe->wDatagramIndex);
|
|
- len = le16_to_cpu(dpe->wDatagramLength);
|
|
+ buf = urb->transfer_buffer + dg_idx;
|
|
|
|
- retval = ipheth_consume_skb(buf, len, dev);
|
|
+ retval = ipheth_consume_skb(buf, dg_len, dev);
|
|
if (retval != 0)
|
|
return retval;
|
|
-
|
|
- dpe++;
|
|
}
|
|
|
|
- return 0;
|
|
+rx_error:
|
|
+ dev->net->stats.rx_errors++;
|
|
+ return retval;
|
|
}
|
|
|
|
static void ipheth_rcvbulk_callback(struct urb *urb)
|
|
diff --git a/drivers/net/vmxnet3/vmxnet3_xdp.c b/drivers/net/vmxnet3/vmxnet3_xdp.c
|
|
index 1341374a4588a0..616ecc38d1726c 100644
|
|
--- a/drivers/net/vmxnet3/vmxnet3_xdp.c
|
|
+++ b/drivers/net/vmxnet3/vmxnet3_xdp.c
|
|
@@ -28,7 +28,7 @@ vmxnet3_xdp_get_tq(struct vmxnet3_adapter *adapter)
|
|
if (likely(cpu < tq_number))
|
|
tq = &adapter->tx_queue[cpu];
|
|
else
|
|
- tq = &adapter->tx_queue[reciprocal_scale(cpu, tq_number)];
|
|
+ tq = &adapter->tx_queue[cpu % tq_number];
|
|
|
|
return tq;
|
|
}
|
|
@@ -124,6 +124,7 @@ vmxnet3_xdp_xmit_frame(struct vmxnet3_adapter *adapter,
|
|
u32 buf_size;
|
|
u32 dw2;
|
|
|
|
+ spin_lock_irq(&tq->tx_lock);
|
|
dw2 = (tq->tx_ring.gen ^ 0x1) << VMXNET3_TXD_GEN_SHIFT;
|
|
dw2 |= xdpf->len;
|
|
ctx.sop_txd = tq->tx_ring.base + tq->tx_ring.next2fill;
|
|
@@ -134,6 +135,7 @@ vmxnet3_xdp_xmit_frame(struct vmxnet3_adapter *adapter,
|
|
|
|
if (vmxnet3_cmd_ring_desc_avail(&tq->tx_ring) == 0) {
|
|
tq->stats.tx_ring_full++;
|
|
+ spin_unlock_irq(&tq->tx_lock);
|
|
return -ENOSPC;
|
|
}
|
|
|
|
@@ -142,8 +144,10 @@ vmxnet3_xdp_xmit_frame(struct vmxnet3_adapter *adapter,
|
|
tbi->dma_addr = dma_map_single(&adapter->pdev->dev,
|
|
xdpf->data, buf_size,
|
|
DMA_TO_DEVICE);
|
|
- if (dma_mapping_error(&adapter->pdev->dev, tbi->dma_addr))
|
|
+ if (dma_mapping_error(&adapter->pdev->dev, tbi->dma_addr)) {
|
|
+ spin_unlock_irq(&tq->tx_lock);
|
|
return -EFAULT;
|
|
+ }
|
|
tbi->map_type |= VMXNET3_MAP_SINGLE;
|
|
} else { /* XDP buffer from page pool */
|
|
page = virt_to_page(xdpf->data);
|
|
@@ -182,6 +186,7 @@ vmxnet3_xdp_xmit_frame(struct vmxnet3_adapter *adapter,
|
|
dma_wmb();
|
|
gdesc->dword[2] = cpu_to_le32(le32_to_cpu(gdesc->dword[2]) ^
|
|
VMXNET3_TXD_GEN);
|
|
+ spin_unlock_irq(&tq->tx_lock);
|
|
|
|
/* No need to handle the case when tx_num_deferred doesn't reach
|
|
* threshold. Backend driver at hypervisor side will poll and reset
|
|
@@ -225,6 +230,7 @@ vmxnet3_xdp_xmit(struct net_device *dev,
|
|
{
|
|
struct vmxnet3_adapter *adapter = netdev_priv(dev);
|
|
struct vmxnet3_tx_queue *tq;
|
|
+ struct netdev_queue *nq;
|
|
int i;
|
|
|
|
if (unlikely(test_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state)))
|
|
@@ -236,6 +242,9 @@ vmxnet3_xdp_xmit(struct net_device *dev,
|
|
if (tq->stopped)
|
|
return -ENETDOWN;
|
|
|
|
+ nq = netdev_get_tx_queue(adapter->netdev, tq->qid);
|
|
+
|
|
+ __netif_tx_lock(nq, smp_processor_id());
|
|
for (i = 0; i < n; i++) {
|
|
if (vmxnet3_xdp_xmit_frame(adapter, frames[i], tq, true)) {
|
|
tq->stats.xdp_xmit_err++;
|
|
@@ -243,6 +252,7 @@ vmxnet3_xdp_xmit(struct net_device *dev,
|
|
}
|
|
}
|
|
tq->stats.xdp_xmit += i;
|
|
+ __netif_tx_unlock(nq);
|
|
|
|
return i;
|
|
}
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
|
index f599d5f896e89e..96f607f35490da 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
|
@@ -540,6 +540,11 @@ void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
|
|
struct ethhdr *eh;
|
|
u16 type;
|
|
|
|
+ if (!ifp) {
|
|
+ brcmu_pkt_buf_free_skb(txp);
|
|
+ return;
|
|
+ }
|
|
+
|
|
eh = (struct ethhdr *)(txp->data);
|
|
type = ntohs(eh->h_proto);
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
index 73fc701204e29b..90d2c536bdaf06 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
@@ -96,13 +96,13 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
|
/* Set board-type to the first string of the machine compatible prop */
|
|
root = of_find_node_by_path("/");
|
|
if (root && err) {
|
|
- char *board_type;
|
|
+ char *board_type = NULL;
|
|
const char *tmp;
|
|
|
|
- of_property_read_string_index(root, "compatible", 0, &tmp);
|
|
-
|
|
/* get rid of '/' in the compatible string to be able to find the FW */
|
|
- board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
|
|
+ if (!of_property_read_string_index(root, "compatible", 0, &tmp))
|
|
+ board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
|
|
+
|
|
if (!board_type) {
|
|
of_node_put(root);
|
|
return;
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c
|
|
index 8580a275478918..42e7bc67e9143e 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c
|
|
@@ -23427,6 +23427,9 @@ wlc_phy_iqcal_gainparams_nphy(struct brcms_phy *pi, u16 core_no,
|
|
break;
|
|
}
|
|
|
|
+ if (WARN_ON(k == NPHY_IQCAL_NUMGAINS))
|
|
+ return;
|
|
+
|
|
params->txgm = tbl_iqcal_gainparams_nphy[band_idx][k][1];
|
|
params->pga = tbl_iqcal_gainparams_nphy[band_idx][k][2];
|
|
params->pad = tbl_iqcal_gainparams_nphy[band_idx][k][3];
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
|
|
index 9943e2d21a8f53..e72f238ff7b23c 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
|
|
@@ -155,7 +155,7 @@ static int iwl_acpi_get_dsm_integer(struct device *dev, int rev, int func,
|
|
size_t expected_size)
|
|
{
|
|
union acpi_object *obj;
|
|
- int ret = 0;
|
|
+ int ret;
|
|
|
|
obj = iwl_acpi_get_dsm_object(dev, rev, func, NULL, guid);
|
|
if (IS_ERR(obj)) {
|
|
@@ -170,8 +170,10 @@ static int iwl_acpi_get_dsm_integer(struct device *dev, int rev, int func,
|
|
} else if (obj->type == ACPI_TYPE_BUFFER) {
|
|
__le64 le_value = 0;
|
|
|
|
- if (WARN_ON_ONCE(expected_size > sizeof(le_value)))
|
|
- return -EINVAL;
|
|
+ if (WARN_ON_ONCE(expected_size > sizeof(le_value))) {
|
|
+ ret = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
/* if the buffer size doesn't match the expected size */
|
|
if (obj->buffer.length != expected_size)
|
|
@@ -192,8 +194,9 @@ static int iwl_acpi_get_dsm_integer(struct device *dev, int rev, int func,
|
|
}
|
|
|
|
IWL_DEBUG_DEV_RADIO(dev,
|
|
- "ACPI: DSM method evaluated: func=%d, ret=%d\n",
|
|
- func, ret);
|
|
+ "ACPI: DSM method evaluated: func=%d, value=%lld\n",
|
|
+ func, *value);
|
|
+ ret = 0;
|
|
out:
|
|
ACPI_FREE(obj);
|
|
return ret;
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
|
|
index 76be7308460b06..1c47a4d95978a4 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
|
|
@@ -2,9 +2,14 @@
|
|
/* Copyright (C) 2020 MediaTek Inc. */
|
|
|
|
#include <linux/firmware.h>
|
|
+#include <linux/moduleparam.h>
|
|
#include "mt7915.h"
|
|
#include "eeprom.h"
|
|
|
|
+static bool enable_6ghz;
|
|
+module_param(enable_6ghz, bool, 0644);
|
|
+MODULE_PARM_DESC(enable_6ghz, "Enable 6 GHz instead of 5 GHz on hardware that supports both");
|
|
+
|
|
static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)
|
|
{
|
|
struct mt76_dev *mdev = &dev->mt76;
|
|
@@ -159,8 +164,20 @@ static void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy)
|
|
phy->mt76->cap.has_6ghz = true;
|
|
return;
|
|
case MT_EE_V2_BAND_SEL_5GHZ_6GHZ:
|
|
- phy->mt76->cap.has_5ghz = true;
|
|
- phy->mt76->cap.has_6ghz = true;
|
|
+ if (enable_6ghz) {
|
|
+ phy->mt76->cap.has_6ghz = true;
|
|
+ u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + band],
|
|
+ MT_EE_V2_BAND_SEL_6GHZ,
|
|
+ MT_EE_WIFI_CONF0_BAND_SEL);
|
|
+ } else {
|
|
+ phy->mt76->cap.has_5ghz = true;
|
|
+ u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + band],
|
|
+ MT_EE_V2_BAND_SEL_5GHZ,
|
|
+ MT_EE_WIFI_CONF0_BAND_SEL);
|
|
+ }
|
|
+ /* force to buffer mode */
|
|
+ dev->flash_mode = true;
|
|
+
|
|
return;
|
|
default:
|
|
phy->mt76->cap.has_2ghz = true;
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
|
|
index 28f84220d50f02..e9068718b3d1f6 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
|
|
@@ -1220,14 +1220,14 @@ int mt7915_register_device(struct mt7915_dev *dev)
|
|
if (ret)
|
|
goto unreg_dev;
|
|
|
|
- ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
|
|
-
|
|
if (phy2) {
|
|
ret = mt7915_register_ext_phy(dev, phy2);
|
|
if (ret)
|
|
goto unreg_thermal;
|
|
}
|
|
|
|
+ ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
|
|
+
|
|
dev->recovery.hw_init_done = true;
|
|
|
|
ret = mt7915_init_debugfs(&dev->phy);
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/usb.c b/drivers/net/wireless/mediatek/mt76/mt7921/usb.c
|
|
index 59cd3d98bf9086..13e892d788b277 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt7921/usb.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/usb.c
|
|
@@ -21,6 +21,9 @@ static const struct usb_device_id mt7921u_device_table[] = {
|
|
/* Netgear, Inc. [A8000,AXE3000] */
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9060, 0xff, 0xff, 0xff),
|
|
.driver_info = (kernel_ulong_t)MT7921_FIRMWARE_WM },
|
|
+ /* TP-Link TXE50UH */
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(0x35bc, 0x0107, 0xff, 0xff, 0xff),
|
|
+ .driver_info = (kernel_ulong_t)MT7921_FIRMWARE_WM },
|
|
{ },
|
|
};
|
|
|
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
|
|
index c269942b3f4ab1..af8d17b9e012ca 100644
|
|
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
|
|
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
|
|
@@ -197,9 +197,9 @@ enum rtl8821a_h2c_cmd {
|
|
|
|
/* _MEDIA_STATUS_RPT_PARM_CMD1 */
|
|
#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__cmd, __value) \
|
|
- u8p_replace_bits(__cmd + 1, __value, BIT(0))
|
|
+ u8p_replace_bits(__cmd, __value, BIT(0))
|
|
#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__cmd, __value) \
|
|
- u8p_replace_bits(__cmd + 1, __value, BIT(1))
|
|
+ u8p_replace_bits(__cmd, __value, BIT(1))
|
|
|
|
/* AP_OFFLOAD */
|
|
#define SET_H2CCMD_AP_OFFLOAD_ON(__cmd, __value) \
|
|
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
index 5bd1ee81210d1d..9043569935796b 100644
|
|
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
@@ -1191,6 +1191,8 @@ static void rtw_sdio_indicate_tx_status(struct rtw_dev *rtwdev,
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
struct ieee80211_hw *hw = rtwdev->hw;
|
|
|
|
+ skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
|
|
+
|
|
/* enqueue to wait for tx report */
|
|
if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) {
|
|
rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn);
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
|
index fac83b718a30cd..457c1dd31bf9d9 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
|
@@ -2438,7 +2438,6 @@ static void rtw89_phy_cfo_set_crystal_cap(struct rtw89_dev *rtwdev,
|
|
|
|
if (!force && cfo->crystal_cap == crystal_cap)
|
|
return;
|
|
- crystal_cap = clamp_t(u8, crystal_cap, 0, 127);
|
|
if (chip->chip_id == RTL8852A || chip->chip_id == RTL8851B) {
|
|
rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap);
|
|
rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap);
|
|
@@ -2552,7 +2551,7 @@ static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev,
|
|
s32 curr_cfo)
|
|
{
|
|
struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
|
|
- s8 crystal_cap = cfo->crystal_cap;
|
|
+ int crystal_cap = cfo->crystal_cap;
|
|
s32 cfo_abs = abs(curr_cfo);
|
|
int sign;
|
|
|
|
@@ -2569,15 +2568,17 @@ static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev,
|
|
}
|
|
sign = curr_cfo > 0 ? 1 : -1;
|
|
if (cfo_abs > CFO_TRK_STOP_TH_4)
|
|
- crystal_cap += 7 * sign;
|
|
+ crystal_cap += 3 * sign;
|
|
else if (cfo_abs > CFO_TRK_STOP_TH_3)
|
|
- crystal_cap += 5 * sign;
|
|
- else if (cfo_abs > CFO_TRK_STOP_TH_2)
|
|
crystal_cap += 3 * sign;
|
|
+ else if (cfo_abs > CFO_TRK_STOP_TH_2)
|
|
+ crystal_cap += 1 * sign;
|
|
else if (cfo_abs > CFO_TRK_STOP_TH_1)
|
|
crystal_cap += 1 * sign;
|
|
else
|
|
return;
|
|
+
|
|
+ crystal_cap = clamp(crystal_cap, 0, 127);
|
|
rtw89_phy_cfo_set_crystal_cap(rtwdev, (u8)crystal_cap, false);
|
|
rtw89_debug(rtwdev, RTW89_DBG_CFO,
|
|
"X_cap{Curr,Default}={0x%x,0x%x}\n",
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h
|
|
index d6dc0cbbae43bf..15ed23fa4218fd 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/phy.h
|
|
+++ b/drivers/net/wireless/realtek/rtw89/phy.h
|
|
@@ -51,7 +51,7 @@
|
|
#define CFO_TRK_STOP_TH_4 (30 << 2)
|
|
#define CFO_TRK_STOP_TH_3 (20 << 2)
|
|
#define CFO_TRK_STOP_TH_2 (10 << 2)
|
|
-#define CFO_TRK_STOP_TH_1 (00 << 2)
|
|
+#define CFO_TRK_STOP_TH_1 (03 << 2)
|
|
#define CFO_TRK_STOP_TH (2 << 2)
|
|
#define CFO_SW_COMP_FINE_TUNE (2 << 2)
|
|
#define CFO_PERIOD_CNT 15
|
|
diff --git a/drivers/net/wwan/iosm/iosm_ipc_pcie.c b/drivers/net/wwan/iosm/iosm_ipc_pcie.c
|
|
index 04517bd3325a2a..a066977af0be5c 100644
|
|
--- a/drivers/net/wwan/iosm/iosm_ipc_pcie.c
|
|
+++ b/drivers/net/wwan/iosm/iosm_ipc_pcie.c
|
|
@@ -6,6 +6,7 @@
|
|
#include <linux/acpi.h>
|
|
#include <linux/bitfield.h>
|
|
#include <linux/module.h>
|
|
+#include <linux/suspend.h>
|
|
#include <net/rtnetlink.h>
|
|
|
|
#include "iosm_ipc_imem.h"
|
|
@@ -18,6 +19,7 @@ MODULE_LICENSE("GPL v2");
|
|
/* WWAN GUID */
|
|
static guid_t wwan_acpi_guid = GUID_INIT(0xbad01b75, 0x22a8, 0x4f48, 0x87, 0x92,
|
|
0xbd, 0xde, 0x94, 0x67, 0x74, 0x7d);
|
|
+static bool pci_registered;
|
|
|
|
static void ipc_pcie_resources_release(struct iosm_pcie *ipc_pcie)
|
|
{
|
|
@@ -448,7 +450,6 @@ static struct pci_driver iosm_ipc_driver = {
|
|
},
|
|
.id_table = iosm_ipc_ids,
|
|
};
|
|
-module_pci_driver(iosm_ipc_driver);
|
|
|
|
int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data,
|
|
size_t size, dma_addr_t *mapping, int direction)
|
|
@@ -530,3 +531,56 @@ void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb)
|
|
IPC_CB(skb)->mapping = 0;
|
|
dev_kfree_skb(skb);
|
|
}
|
|
+
|
|
+static int pm_notify(struct notifier_block *nb, unsigned long mode, void *_unused)
|
|
+{
|
|
+ if (mode == PM_HIBERNATION_PREPARE || mode == PM_RESTORE_PREPARE) {
|
|
+ if (pci_registered) {
|
|
+ pci_unregister_driver(&iosm_ipc_driver);
|
|
+ pci_registered = false;
|
|
+ }
|
|
+ } else if (mode == PM_POST_HIBERNATION || mode == PM_POST_RESTORE) {
|
|
+ if (!pci_registered) {
|
|
+ int ret;
|
|
+
|
|
+ ret = pci_register_driver(&iosm_ipc_driver);
|
|
+ if (ret) {
|
|
+ pr_err(KBUILD_MODNAME ": unable to re-register PCI driver: %d\n",
|
|
+ ret);
|
|
+ } else {
|
|
+ pci_registered = true;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static struct notifier_block pm_notifier = {
|
|
+ .notifier_call = pm_notify,
|
|
+};
|
|
+
|
|
+static int __init iosm_ipc_driver_init(void)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ ret = pci_register_driver(&iosm_ipc_driver);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ pci_registered = true;
|
|
+
|
|
+ register_pm_notifier(&pm_notifier);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+module_init(iosm_ipc_driver_init);
|
|
+
|
|
+static void __exit iosm_ipc_driver_exit(void)
|
|
+{
|
|
+ unregister_pm_notifier(&pm_notifier);
|
|
+
|
|
+ if (pci_registered)
|
|
+ pci_unregister_driver(&iosm_ipc_driver);
|
|
+}
|
|
+module_exit(iosm_ipc_driver_exit);
|
|
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
|
|
index 26e3f1896dc397..8a200931bc297a 100644
|
|
--- a/drivers/nvme/host/core.c
|
|
+++ b/drivers/nvme/host/core.c
|
|
@@ -1553,7 +1553,13 @@ int nvme_set_queue_count(struct nvme_ctrl *ctrl, int *count)
|
|
|
|
status = nvme_set_features(ctrl, NVME_FEAT_NUM_QUEUES, q_count, NULL, 0,
|
|
&result);
|
|
- if (status < 0)
|
|
+
|
|
+ /*
|
|
+ * It's either a kernel error or the host observed a connection
|
|
+ * lost. In either case it's not possible communicate with the
|
|
+ * controller and thus enter the error code path.
|
|
+ */
|
|
+ if (status < 0 || status == NVME_SC_HOST_PATH_ERROR)
|
|
return status;
|
|
|
|
/*
|
|
diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
|
|
index cdb1e706f855e5..91324791a5b66e 100644
|
|
--- a/drivers/nvme/host/fc.c
|
|
+++ b/drivers/nvme/host/fc.c
|
|
@@ -2080,7 +2080,8 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
|
|
nvme_fc_complete_rq(rq);
|
|
|
|
check_error:
|
|
- if (terminate_assoc && ctrl->ctrl.state != NVME_CTRL_RESETTING)
|
|
+ if (terminate_assoc &&
|
|
+ nvme_ctrl_state(&ctrl->ctrl) != NVME_CTRL_RESETTING)
|
|
queue_work(nvme_reset_wq, &ctrl->ioerr_work);
|
|
}
|
|
|
|
@@ -2534,6 +2535,8 @@ __nvme_fc_abort_outstanding_ios(struct nvme_fc_ctrl *ctrl, bool start_queues)
|
|
static void
|
|
nvme_fc_error_recovery(struct nvme_fc_ctrl *ctrl, char *errmsg)
|
|
{
|
|
+ enum nvme_ctrl_state state = nvme_ctrl_state(&ctrl->ctrl);
|
|
+
|
|
/*
|
|
* if an error (io timeout, etc) while (re)connecting, the remote
|
|
* port requested terminating of the association (disconnect_ls)
|
|
@@ -2541,7 +2544,7 @@ nvme_fc_error_recovery(struct nvme_fc_ctrl *ctrl, char *errmsg)
|
|
* the controller. Abort any ios on the association and let the
|
|
* create_association error path resolve things.
|
|
*/
|
|
- if (ctrl->ctrl.state == NVME_CTRL_CONNECTING) {
|
|
+ if (state == NVME_CTRL_CONNECTING) {
|
|
__nvme_fc_abort_outstanding_ios(ctrl, true);
|
|
set_bit(ASSOC_FAILED, &ctrl->flags);
|
|
dev_warn(ctrl->ctrl.device,
|
|
@@ -2551,7 +2554,7 @@ nvme_fc_error_recovery(struct nvme_fc_ctrl *ctrl, char *errmsg)
|
|
}
|
|
|
|
/* Otherwise, only proceed if in LIVE state - e.g. on first error */
|
|
- if (ctrl->ctrl.state != NVME_CTRL_LIVE)
|
|
+ if (state != NVME_CTRL_LIVE)
|
|
return;
|
|
|
|
dev_warn(ctrl->ctrl.device,
|
|
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
|
|
index 52c8fd3d5c4796..b1310e69d07daf 100644
|
|
--- a/drivers/nvme/host/pci.c
|
|
+++ b/drivers/nvme/host/pci.c
|
|
@@ -2949,7 +2949,9 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
|
|
* because of high power consumption (> 2 Watt) in s2idle
|
|
* sleep. Only some boards with Intel CPU are affected.
|
|
*/
|
|
- if (dmi_match(DMI_BOARD_NAME, "GMxPXxx") ||
|
|
+ if (dmi_match(DMI_BOARD_NAME, "DN50Z-140HC-YD") ||
|
|
+ dmi_match(DMI_BOARD_NAME, "GMxPXxx") ||
|
|
+ dmi_match(DMI_BOARD_NAME, "GXxMRXx") ||
|
|
dmi_match(DMI_BOARD_NAME, "PH4PG31") ||
|
|
dmi_match(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1") ||
|
|
dmi_match(DMI_BOARD_NAME, "PH6PG01_PH6PG71"))
|
|
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
|
|
index f28c005c2bb265..fd11d3825cf854 100644
|
|
--- a/drivers/nvmem/core.c
|
|
+++ b/drivers/nvmem/core.c
|
|
@@ -1725,6 +1725,8 @@ static int __nvmem_cell_entry_write(struct nvmem_cell_entry *cell, void *buf, si
|
|
return -EINVAL;
|
|
|
|
if (cell->bit_offset || cell->nbits) {
|
|
+ if (len != BITS_TO_BYTES(cell->nbits) && len != cell->bytes)
|
|
+ return -EINVAL;
|
|
buf = nvmem_cell_prepare_write_buffer(cell, buf, len);
|
|
if (IS_ERR(buf))
|
|
return PTR_ERR(buf);
|
|
diff --git a/drivers/nvmem/imx-ocotp-ele.c b/drivers/nvmem/imx-ocotp-ele.c
|
|
index cf920542f939ea..dfc925edfc83e0 100644
|
|
--- a/drivers/nvmem/imx-ocotp-ele.c
|
|
+++ b/drivers/nvmem/imx-ocotp-ele.c
|
|
@@ -70,13 +70,15 @@ static int imx_ocotp_reg_read(void *context, unsigned int offset, void *val, siz
|
|
u32 *buf;
|
|
void *p;
|
|
int i;
|
|
+ u8 skipbytes;
|
|
|
|
- index = offset;
|
|
- num_bytes = round_up(bytes, 4);
|
|
- count = num_bytes >> 2;
|
|
+ if (offset + bytes > priv->data->size)
|
|
+ bytes = priv->data->size - offset;
|
|
|
|
- if (count > ((priv->data->size >> 2) - index))
|
|
- count = (priv->data->size >> 2) - index;
|
|
+ index = offset >> 2;
|
|
+ skipbytes = offset - (index << 2);
|
|
+ num_bytes = round_up(bytes + skipbytes, 4);
|
|
+ count = num_bytes >> 2;
|
|
|
|
p = kzalloc(num_bytes, GFP_KERNEL);
|
|
if (!p)
|
|
@@ -96,7 +98,7 @@ static int imx_ocotp_reg_read(void *context, unsigned int offset, void *val, siz
|
|
*buf++ = readl_relaxed(reg + (i << 2));
|
|
}
|
|
|
|
- memcpy(val, (u8 *)p, bytes);
|
|
+ memcpy(val, ((u8 *)p) + skipbytes, bytes);
|
|
|
|
mutex_unlock(&priv->lock);
|
|
|
|
@@ -127,7 +129,7 @@ static int imx_ele_ocotp_probe(struct platform_device *pdev)
|
|
priv->config.owner = THIS_MODULE;
|
|
priv->config.size = priv->data->size;
|
|
priv->config.reg_read = priv->data->reg_read;
|
|
- priv->config.word_size = 4;
|
|
+ priv->config.word_size = 1;
|
|
priv->config.stride = 1;
|
|
priv->config.priv = priv;
|
|
priv->config.read_only = true;
|
|
diff --git a/drivers/nvmem/qcom-spmi-sdam.c b/drivers/nvmem/qcom-spmi-sdam.c
|
|
index 9aa8f42faa4c93..4f1cca6eab71e1 100644
|
|
--- a/drivers/nvmem/qcom-spmi-sdam.c
|
|
+++ b/drivers/nvmem/qcom-spmi-sdam.c
|
|
@@ -144,6 +144,7 @@ static int sdam_probe(struct platform_device *pdev)
|
|
sdam->sdam_config.owner = THIS_MODULE;
|
|
sdam->sdam_config.add_legacy_fixed_of_cells = true;
|
|
sdam->sdam_config.stride = 1;
|
|
+ sdam->sdam_config.size = sdam->size;
|
|
sdam->sdam_config.word_size = 1;
|
|
sdam->sdam_config.reg_read = sdam_read;
|
|
sdam->sdam_config.reg_write = sdam_write;
|
|
diff --git a/drivers/of/base.c b/drivers/of/base.c
|
|
index 7a3c05622d9821..ccadc22f18c0ec 100644
|
|
--- a/drivers/of/base.c
|
|
+++ b/drivers/of/base.c
|
|
@@ -788,10 +788,10 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt
|
|
/* The path could begin with an alias */
|
|
if (*path != '/') {
|
|
int len;
|
|
- const char *p = separator;
|
|
+ const char *p = strchrnul(path, '/');
|
|
|
|
- if (!p)
|
|
- p = strchrnul(path, '/');
|
|
+ if (separator && separator < p)
|
|
+ p = separator;
|
|
len = p - path;
|
|
|
|
/* of_aliases must not be NULL */
|
|
@@ -1453,7 +1453,6 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
|
|
* specifier into the out_args structure, keeping the
|
|
* bits specified in <list>-map-pass-thru.
|
|
*/
|
|
- match_array = map - new_size;
|
|
for (i = 0; i < new_size; i++) {
|
|
__be32 val = *(map - new_size + i);
|
|
|
|
@@ -1462,6 +1461,7 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
|
|
val |= cpu_to_be32(out_args->args[i]) & pass[i];
|
|
}
|
|
|
|
+ initial_match_array[i] = val;
|
|
out_args->args[i] = be32_to_cpu(val);
|
|
}
|
|
out_args->args_count = list_size = new_size;
|
|
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
|
|
index 959f1808c240fa..4a30daa0a9b9cc 100644
|
|
--- a/drivers/of/of_reserved_mem.c
|
|
+++ b/drivers/of/of_reserved_mem.c
|
|
@@ -156,12 +156,12 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
|
|
|
|
prop = of_get_flat_dt_prop(node, "alignment", &len);
|
|
if (prop) {
|
|
- if (len != dt_root_addr_cells * sizeof(__be32)) {
|
|
+ if (len != dt_root_size_cells * sizeof(__be32)) {
|
|
pr_err("invalid alignment property in '%s' node.\n",
|
|
uname);
|
|
return -EINVAL;
|
|
}
|
|
- align = dt_mem_next_cell(dt_root_addr_cells, &prop);
|
|
+ align = dt_mem_next_cell(dt_root_size_cells, &prop);
|
|
}
|
|
|
|
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
|
|
diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c
|
|
index 2c32de66793778..059f8639f21e92 100644
|
|
--- a/drivers/pci/endpoint/pci-epf-core.c
|
|
+++ b/drivers/pci/endpoint/pci-epf-core.c
|
|
@@ -202,6 +202,7 @@ void pci_epf_remove_vepf(struct pci_epf *epf_pf, struct pci_epf *epf_vf)
|
|
|
|
mutex_lock(&epf_pf->lock);
|
|
clear_bit(epf_vf->vfunc_no, &epf_pf->vfunction_num_map);
|
|
+ epf_vf->epf_pf = NULL;
|
|
list_del(&epf_vf->list);
|
|
mutex_unlock(&epf_pf->lock);
|
|
}
|
|
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
|
|
index e54847040b4a92..c3609d830873f6 100644
|
|
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
|
|
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
|
|
@@ -1150,7 +1150,7 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
|
|
|
|
ret = platform_get_irq_optional(pdev, 0);
|
|
if (ret < 0 && ret != -ENXIO)
|
|
- return ret;
|
|
+ goto err_put_banks;
|
|
if (ret > 0)
|
|
drvdata->irq = ret;
|
|
|
|
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
|
|
index 377a0becd1a181..868faccfb86285 100644
|
|
--- a/drivers/platform/x86/acer-wmi.c
|
|
+++ b/drivers/platform/x86/acer-wmi.c
|
|
@@ -88,6 +88,7 @@ enum acer_wmi_event_ids {
|
|
WMID_HOTKEY_EVENT = 0x1,
|
|
WMID_ACCEL_OR_KBD_DOCK_EVENT = 0x5,
|
|
WMID_GAMING_TURBO_KEY_EVENT = 0x7,
|
|
+ WMID_AC_EVENT = 0x8,
|
|
};
|
|
|
|
static const struct key_entry acer_wmi_keymap[] __initconst = {
|
|
@@ -1999,6 +2000,9 @@ static void acer_wmi_notify(u32 value, void *context)
|
|
if (return_value.key_num == 0x4)
|
|
acer_toggle_turbo();
|
|
break;
|
|
+ case WMID_AC_EVENT:
|
|
+ /* We ignore AC events here */
|
|
+ break;
|
|
default:
|
|
pr_warn("Unknown function number - %d - %d\n",
|
|
return_value.function, return_value.key_num);
|
|
diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platform/x86/intel/int3472/discrete.c
|
|
index e33c2d75975cf5..d56f79043f5e24 100644
|
|
--- a/drivers/platform/x86/intel/int3472/discrete.c
|
|
+++ b/drivers/platform/x86/intel/int3472/discrete.c
|
|
@@ -284,6 +284,9 @@ static int skl_int3472_discrete_probe(struct platform_device *pdev)
|
|
struct int3472_cldb cldb;
|
|
int ret;
|
|
|
|
+ if (!adev)
|
|
+ return -ENODEV;
|
|
+
|
|
ret = skl_int3472_fill_cldb(adev, &cldb);
|
|
if (ret) {
|
|
dev_err(&pdev->dev, "Couldn't fill CLDB structure\n");
|
|
diff --git a/drivers/platform/x86/intel/int3472/tps68470.c b/drivers/platform/x86/intel/int3472/tps68470.c
|
|
index 1e107fd49f828c..81ac4c69196309 100644
|
|
--- a/drivers/platform/x86/intel/int3472/tps68470.c
|
|
+++ b/drivers/platform/x86/intel/int3472/tps68470.c
|
|
@@ -152,6 +152,9 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
|
|
int ret;
|
|
int i;
|
|
|
|
+ if (!adev)
|
|
+ return -ENODEV;
|
|
+
|
|
n_consumers = skl_int3472_fill_clk_pdata(&client->dev, &clk_pdata);
|
|
if (n_consumers < 0)
|
|
return n_consumers;
|
|
diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
|
|
index b586da2e30023c..6b7e8b7ebcef5e 100644
|
|
--- a/drivers/ptp/ptp_clock.c
|
|
+++ b/drivers/ptp/ptp_clock.c
|
|
@@ -189,6 +189,11 @@ static int ptp_getcycles64(struct ptp_clock_info *info, struct timespec64 *ts)
|
|
return info->gettime64(info, ts);
|
|
}
|
|
|
|
+static int ptp_enable(struct ptp_clock_info *ptp, struct ptp_clock_request *request, int on)
|
|
+{
|
|
+ return -EOPNOTSUPP;
|
|
+}
|
|
+
|
|
static void ptp_aux_kworker(struct kthread_work *work)
|
|
{
|
|
struct ptp_clock *ptp = container_of(work, struct ptp_clock,
|
|
@@ -251,6 +256,9 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
|
|
ptp->info->getcrosscycles = ptp->info->getcrosststamp;
|
|
}
|
|
|
|
+ if (!ptp->info->enable)
|
|
+ ptp->info->enable = ptp_enable;
|
|
+
|
|
if (ptp->info->do_aux_work) {
|
|
kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker);
|
|
ptp->kworker = kthread_create_worker(0, "ptp%d", ptp->index);
|
|
diff --git a/drivers/pwm/pwm-microchip-core.c b/drivers/pwm/pwm-microchip-core.c
|
|
index e7525c98105ebc..d3e60d5d085bc2 100644
|
|
--- a/drivers/pwm/pwm-microchip-core.c
|
|
+++ b/drivers/pwm/pwm-microchip-core.c
|
|
@@ -328,7 +328,7 @@ static int mchp_core_pwm_apply_locked(struct pwm_chip *chip, struct pwm_device *
|
|
* mchp_core_pwm_calc_period().
|
|
* The period is locked and we cannot change this, so we abort.
|
|
*/
|
|
- if (hw_period_steps == MCHPCOREPWM_PERIOD_STEPS_MAX)
|
|
+ if (hw_period_steps > MCHPCOREPWM_PERIOD_STEPS_MAX)
|
|
return -EINVAL;
|
|
|
|
prescale = hw_prescale;
|
|
diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c
|
|
index 08ed171bdab43a..b6f96c10196ae3 100644
|
|
--- a/drivers/rtc/rtc-zynqmp.c
|
|
+++ b/drivers/rtc/rtc-zynqmp.c
|
|
@@ -318,8 +318,8 @@ static int xlnx_rtc_probe(struct platform_device *pdev)
|
|
return ret;
|
|
}
|
|
|
|
- /* Getting the rtc_clk info */
|
|
- xrtcdev->rtc_clk = devm_clk_get_optional(&pdev->dev, "rtc_clk");
|
|
+ /* Getting the rtc info */
|
|
+ xrtcdev->rtc_clk = devm_clk_get_optional(&pdev->dev, "rtc");
|
|
if (IS_ERR(xrtcdev->rtc_clk)) {
|
|
if (PTR_ERR(xrtcdev->rtc_clk) != -EPROBE_DEFER)
|
|
dev_warn(&pdev->dev, "Device clock not found.\n");
|
|
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
|
|
index 7cf998e3cc681c..78a10d4979e90e 100644
|
|
--- a/drivers/scsi/qla2xxx/qla_def.h
|
|
+++ b/drivers/scsi/qla2xxx/qla_def.h
|
|
@@ -4099,6 +4099,8 @@ struct qla_hw_data {
|
|
uint32_t npiv_supported :1;
|
|
uint32_t pci_channel_io_perm_failure :1;
|
|
uint32_t fce_enabled :1;
|
|
+ uint32_t user_enabled_fce :1;
|
|
+ uint32_t fce_dump_buf_alloced :1;
|
|
uint32_t fac_supported :1;
|
|
|
|
uint32_t chip_reset_done :1;
|
|
diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c
|
|
index 081af4d420a05f..4a82b377928d49 100644
|
|
--- a/drivers/scsi/qla2xxx/qla_dfs.c
|
|
+++ b/drivers/scsi/qla2xxx/qla_dfs.c
|
|
@@ -409,26 +409,31 @@ qla2x00_dfs_fce_show(struct seq_file *s, void *unused)
|
|
|
|
mutex_lock(&ha->fce_mutex);
|
|
|
|
- seq_puts(s, "FCE Trace Buffer\n");
|
|
- seq_printf(s, "In Pointer = %llx\n\n", (unsigned long long)ha->fce_wr);
|
|
- seq_printf(s, "Base = %llx\n\n", (unsigned long long) ha->fce_dma);
|
|
- seq_puts(s, "FCE Enable Registers\n");
|
|
- seq_printf(s, "%08x %08x %08x %08x %08x %08x\n",
|
|
- ha->fce_mb[0], ha->fce_mb[2], ha->fce_mb[3], ha->fce_mb[4],
|
|
- ha->fce_mb[5], ha->fce_mb[6]);
|
|
-
|
|
- fce = (uint32_t *) ha->fce;
|
|
- fce_start = (unsigned long long) ha->fce_dma;
|
|
- for (cnt = 0; cnt < fce_calc_size(ha->fce_bufs) / 4; cnt++) {
|
|
- if (cnt % 8 == 0)
|
|
- seq_printf(s, "\n%llx: ",
|
|
- (unsigned long long)((cnt * 4) + fce_start));
|
|
- else
|
|
- seq_putc(s, ' ');
|
|
- seq_printf(s, "%08x", *fce++);
|
|
- }
|
|
+ if (ha->flags.user_enabled_fce) {
|
|
+ seq_puts(s, "FCE Trace Buffer\n");
|
|
+ seq_printf(s, "In Pointer = %llx\n\n", (unsigned long long)ha->fce_wr);
|
|
+ seq_printf(s, "Base = %llx\n\n", (unsigned long long)ha->fce_dma);
|
|
+ seq_puts(s, "FCE Enable Registers\n");
|
|
+ seq_printf(s, "%08x %08x %08x %08x %08x %08x\n",
|
|
+ ha->fce_mb[0], ha->fce_mb[2], ha->fce_mb[3], ha->fce_mb[4],
|
|
+ ha->fce_mb[5], ha->fce_mb[6]);
|
|
+
|
|
+ fce = (uint32_t *)ha->fce;
|
|
+ fce_start = (unsigned long long)ha->fce_dma;
|
|
+ for (cnt = 0; cnt < fce_calc_size(ha->fce_bufs) / 4; cnt++) {
|
|
+ if (cnt % 8 == 0)
|
|
+ seq_printf(s, "\n%llx: ",
|
|
+ (unsigned long long)((cnt * 4) + fce_start));
|
|
+ else
|
|
+ seq_putc(s, ' ');
|
|
+ seq_printf(s, "%08x", *fce++);
|
|
+ }
|
|
|
|
- seq_puts(s, "\nEnd\n");
|
|
+ seq_puts(s, "\nEnd\n");
|
|
+ } else {
|
|
+ seq_puts(s, "FCE Trace is currently not enabled\n");
|
|
+ seq_puts(s, "\techo [ 1 | 0 ] > fce\n");
|
|
+ }
|
|
|
|
mutex_unlock(&ha->fce_mutex);
|
|
|
|
@@ -467,7 +472,7 @@ qla2x00_dfs_fce_release(struct inode *inode, struct file *file)
|
|
struct qla_hw_data *ha = vha->hw;
|
|
int rval;
|
|
|
|
- if (ha->flags.fce_enabled)
|
|
+ if (ha->flags.fce_enabled || !ha->fce)
|
|
goto out;
|
|
|
|
mutex_lock(&ha->fce_mutex);
|
|
@@ -488,11 +493,88 @@ qla2x00_dfs_fce_release(struct inode *inode, struct file *file)
|
|
return single_release(inode, file);
|
|
}
|
|
|
|
+static ssize_t
|
|
+qla2x00_dfs_fce_write(struct file *file, const char __user *buffer,
|
|
+ size_t count, loff_t *pos)
|
|
+{
|
|
+ struct seq_file *s = file->private_data;
|
|
+ struct scsi_qla_host *vha = s->private;
|
|
+ struct qla_hw_data *ha = vha->hw;
|
|
+ char *buf;
|
|
+ int rc = 0;
|
|
+ unsigned long enable;
|
|
+
|
|
+ if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
|
|
+ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) {
|
|
+ ql_dbg(ql_dbg_user, vha, 0xd034,
|
|
+ "this adapter does not support FCE.");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ buf = memdup_user_nul(buffer, count);
|
|
+ if (IS_ERR(buf)) {
|
|
+ ql_dbg(ql_dbg_user, vha, 0xd037,
|
|
+ "fail to copy user buffer.");
|
|
+ return PTR_ERR(buf);
|
|
+ }
|
|
+
|
|
+ enable = kstrtoul(buf, 0, 0);
|
|
+ rc = count;
|
|
+
|
|
+ mutex_lock(&ha->fce_mutex);
|
|
+
|
|
+ if (enable) {
|
|
+ if (ha->flags.user_enabled_fce) {
|
|
+ mutex_unlock(&ha->fce_mutex);
|
|
+ goto out_free;
|
|
+ }
|
|
+ ha->flags.user_enabled_fce = 1;
|
|
+ if (!ha->fce) {
|
|
+ rc = qla2x00_alloc_fce_trace(vha);
|
|
+ if (rc) {
|
|
+ ha->flags.user_enabled_fce = 0;
|
|
+ mutex_unlock(&ha->fce_mutex);
|
|
+ goto out_free;
|
|
+ }
|
|
+
|
|
+ /* adjust fw dump buffer to take into account of this feature */
|
|
+ if (!ha->flags.fce_dump_buf_alloced)
|
|
+ qla2x00_alloc_fw_dump(vha);
|
|
+ }
|
|
+
|
|
+ if (!ha->flags.fce_enabled)
|
|
+ qla_enable_fce_trace(vha);
|
|
+
|
|
+ ql_dbg(ql_dbg_user, vha, 0xd045, "User enabled FCE .\n");
|
|
+ } else {
|
|
+ if (!ha->flags.user_enabled_fce) {
|
|
+ mutex_unlock(&ha->fce_mutex);
|
|
+ goto out_free;
|
|
+ }
|
|
+ ha->flags.user_enabled_fce = 0;
|
|
+ if (ha->flags.fce_enabled) {
|
|
+ qla2x00_disable_fce_trace(vha, NULL, NULL);
|
|
+ ha->flags.fce_enabled = 0;
|
|
+ }
|
|
+
|
|
+ qla2x00_free_fce_trace(ha);
|
|
+ /* no need to re-adjust fw dump buffer */
|
|
+
|
|
+ ql_dbg(ql_dbg_user, vha, 0xd04f, "User disabled FCE .\n");
|
|
+ }
|
|
+
|
|
+ mutex_unlock(&ha->fce_mutex);
|
|
+out_free:
|
|
+ kfree(buf);
|
|
+ return rc;
|
|
+}
|
|
+
|
|
static const struct file_operations dfs_fce_ops = {
|
|
.open = qla2x00_dfs_fce_open,
|
|
.read = seq_read,
|
|
.llseek = seq_lseek,
|
|
.release = qla2x00_dfs_fce_release,
|
|
+ .write = qla2x00_dfs_fce_write,
|
|
};
|
|
|
|
static int
|
|
@@ -671,8 +753,6 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
|
|
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
|
|
!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
|
goto out;
|
|
- if (!ha->fce)
|
|
- goto out;
|
|
|
|
if (qla2x00_dfs_root)
|
|
goto create_dir;
|
|
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
|
|
index cededfda9d0e31..e556f57c91af62 100644
|
|
--- a/drivers/scsi/qla2xxx/qla_gbl.h
|
|
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
|
|
@@ -11,6 +11,9 @@
|
|
/*
|
|
* Global Function Prototypes in qla_init.c source file.
|
|
*/
|
|
+int qla2x00_alloc_fce_trace(scsi_qla_host_t *);
|
|
+void qla2x00_free_fce_trace(struct qla_hw_data *ha);
|
|
+void qla_enable_fce_trace(scsi_qla_host_t *);
|
|
extern int qla2x00_initialize_adapter(scsi_qla_host_t *);
|
|
extern int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport);
|
|
|
|
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
|
|
index eda3bdab934d57..5fa2727c1bea76 100644
|
|
--- a/drivers/scsi/qla2xxx/qla_init.c
|
|
+++ b/drivers/scsi/qla2xxx/qla_init.c
|
|
@@ -2681,7 +2681,7 @@ qla83xx_nic_core_fw_load(scsi_qla_host_t *vha)
|
|
return rval;
|
|
}
|
|
|
|
-static void qla_enable_fce_trace(scsi_qla_host_t *vha)
|
|
+void qla_enable_fce_trace(scsi_qla_host_t *vha)
|
|
{
|
|
int rval;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
@@ -3717,25 +3717,24 @@ qla24xx_chip_diag(scsi_qla_host_t *vha)
|
|
return rval;
|
|
}
|
|
|
|
-static void
|
|
-qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
|
+int qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
|
{
|
|
dma_addr_t tc_dma;
|
|
void *tc;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
|
|
if (!IS_FWI2_CAPABLE(ha))
|
|
- return;
|
|
+ return -EINVAL;
|
|
|
|
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
|
|
!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
|
- return;
|
|
+ return -EINVAL;
|
|
|
|
if (ha->fce) {
|
|
ql_dbg(ql_dbg_init, vha, 0x00bd,
|
|
"%s: FCE Mem is already allocated.\n",
|
|
__func__);
|
|
- return;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Allocate memory for Fibre Channel Event Buffer. */
|
|
@@ -3745,7 +3744,7 @@ qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
|
ql_log(ql_log_warn, vha, 0x00be,
|
|
"Unable to allocate (%d KB) for FCE.\n",
|
|
FCE_SIZE / 1024);
|
|
- return;
|
|
+ return -ENOMEM;
|
|
}
|
|
|
|
ql_dbg(ql_dbg_init, vha, 0x00c0,
|
|
@@ -3754,6 +3753,16 @@ qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
|
ha->fce_dma = tc_dma;
|
|
ha->fce = tc;
|
|
ha->fce_bufs = FCE_NUM_BUFFERS;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+void qla2x00_free_fce_trace(struct qla_hw_data *ha)
|
|
+{
|
|
+ if (!ha->fce)
|
|
+ return;
|
|
+ dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, ha->fce_dma);
|
|
+ ha->fce = NULL;
|
|
+ ha->fce_dma = 0;
|
|
}
|
|
|
|
static void
|
|
@@ -3844,9 +3853,10 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
|
if (ha->tgt.atio_ring)
|
|
mq_size += ha->tgt.atio_q_length * sizeof(request_t);
|
|
|
|
- qla2x00_alloc_fce_trace(vha);
|
|
- if (ha->fce)
|
|
+ if (ha->fce) {
|
|
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
|
|
+ ha->flags.fce_dump_buf_alloced = 1;
|
|
+ }
|
|
qla2x00_alloc_eft_trace(vha);
|
|
if (ha->eft)
|
|
eft_size = EFT_SIZE;
|
|
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
|
|
index 4e872f2559d138..bdbe94f30f0706 100644
|
|
--- a/drivers/scsi/st.c
|
|
+++ b/drivers/scsi/st.c
|
|
@@ -1028,6 +1028,11 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
|
|
retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY;
|
|
break;
|
|
}
|
|
+ if (STp->first_tur) {
|
|
+ /* Don't set pos_unknown right after device recognition */
|
|
+ STp->pos_unknown = 0;
|
|
+ STp->first_tur = 0;
|
|
+ }
|
|
|
|
if (SRpnt != NULL)
|
|
st_release_request(SRpnt);
|
|
@@ -4326,6 +4331,7 @@ static int st_probe(struct device *dev)
|
|
blk_queue_rq_timeout(tpnt->device->request_queue, ST_TIMEOUT);
|
|
tpnt->long_timeout = ST_LONG_TIMEOUT;
|
|
tpnt->try_dio = try_direct_io;
|
|
+ tpnt->first_tur = 1;
|
|
|
|
for (i = 0; i < ST_NBR_MODES; i++) {
|
|
STm = &(tpnt->modes[i]);
|
|
diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h
|
|
index 7a68eaba7e810c..1aaaf5369a40fc 100644
|
|
--- a/drivers/scsi/st.h
|
|
+++ b/drivers/scsi/st.h
|
|
@@ -170,6 +170,7 @@ struct scsi_tape {
|
|
unsigned char rew_at_close; /* rewind necessary at close */
|
|
unsigned char inited;
|
|
unsigned char cleaning_req; /* cleaning requested? */
|
|
+ unsigned char first_tur; /* first TEST UNIT READY */
|
|
int block_size;
|
|
int min_block;
|
|
int max_block;
|
|
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
|
|
index b3c588b102d900..b8186feccdf5aa 100644
|
|
--- a/drivers/scsi/storvsc_drv.c
|
|
+++ b/drivers/scsi/storvsc_drv.c
|
|
@@ -1800,6 +1800,7 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
|
|
|
|
length = scsi_bufflen(scmnd);
|
|
payload = (struct vmbus_packet_mpb_array *)&cmd_request->mpb;
|
|
+ payload->range.len = 0;
|
|
payload_sz = 0;
|
|
|
|
if (scsi_sg_count(scmnd)) {
|
|
diff --git a/drivers/soc/mediatek/mtk-devapc.c b/drivers/soc/mediatek/mtk-devapc.c
|
|
index b28feb96754021..0dfc1da9471cba 100644
|
|
--- a/drivers/soc/mediatek/mtk-devapc.c
|
|
+++ b/drivers/soc/mediatek/mtk-devapc.c
|
|
@@ -273,23 +273,31 @@ static int mtk_devapc_probe(struct platform_device *pdev)
|
|
return -EINVAL;
|
|
|
|
devapc_irq = irq_of_parse_and_map(node, 0);
|
|
- if (!devapc_irq)
|
|
- return -EINVAL;
|
|
+ if (!devapc_irq) {
|
|
+ ret = -EINVAL;
|
|
+ goto err;
|
|
+ }
|
|
|
|
ctx->infra_clk = devm_clk_get_enabled(&pdev->dev, "devapc-infra-clock");
|
|
- if (IS_ERR(ctx->infra_clk))
|
|
- return -EINVAL;
|
|
+ if (IS_ERR(ctx->infra_clk)) {
|
|
+ ret = -EINVAL;
|
|
+ goto err;
|
|
+ }
|
|
|
|
ret = devm_request_irq(&pdev->dev, devapc_irq, devapc_violation_irq,
|
|
IRQF_TRIGGER_NONE, "devapc", ctx);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto err;
|
|
|
|
platform_set_drvdata(pdev, ctx);
|
|
|
|
start_devapc(ctx);
|
|
|
|
return 0;
|
|
+
|
|
+err:
|
|
+ iounmap(ctx->infra_base);
|
|
+ return ret;
|
|
}
|
|
|
|
static int mtk_devapc_remove(struct platform_device *pdev)
|
|
diff --git a/drivers/soc/qcom/smem_state.c b/drivers/soc/qcom/smem_state.c
|
|
index e848cc9a3cf801..a8be3a2f33824f 100644
|
|
--- a/drivers/soc/qcom/smem_state.c
|
|
+++ b/drivers/soc/qcom/smem_state.c
|
|
@@ -116,7 +116,8 @@ struct qcom_smem_state *qcom_smem_state_get(struct device *dev,
|
|
|
|
if (args.args_count != 1) {
|
|
dev_err(dev, "invalid #qcom,smem-state-cells\n");
|
|
- return ERR_PTR(-EINVAL);
|
|
+ state = ERR_PTR(-EINVAL);
|
|
+ goto put;
|
|
}
|
|
|
|
state = of_node_to_state(args.np);
|
|
diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c
|
|
index 2af2b2406fdf39..714d1259b3137c 100644
|
|
--- a/drivers/soc/qcom/socinfo.c
|
|
+++ b/drivers/soc/qcom/socinfo.c
|
|
@@ -760,7 +760,7 @@ static int qcom_socinfo_probe(struct platform_device *pdev)
|
|
if (!qs->attr.soc_id || !qs->attr.revision)
|
|
return -ENOMEM;
|
|
|
|
- if (offsetof(struct socinfo, serial_num) <= item_size) {
|
|
+ if (offsetofend(struct socinfo, serial_num) <= item_size) {
|
|
qs->attr.serial_number = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
|
"%u",
|
|
le32_to_cpu(info->serial_num));
|
|
diff --git a/drivers/spi/atmel-quadspi.c b/drivers/spi/atmel-quadspi.c
|
|
index e7ae7cb4b92a8b..4396d988768f65 100644
|
|
--- a/drivers/spi/atmel-quadspi.c
|
|
+++ b/drivers/spi/atmel-quadspi.c
|
|
@@ -138,11 +138,15 @@
|
|
#define QSPI_WPSR_WPVSRC_MASK GENMASK(15, 8)
|
|
#define QSPI_WPSR_WPVSRC(src) (((src) << 8) & QSPI_WPSR_WPVSRC)
|
|
|
|
+#define ATMEL_QSPI_TIMEOUT 1000 /* ms */
|
|
+
|
|
struct atmel_qspi_caps {
|
|
bool has_qspick;
|
|
bool has_ricr;
|
|
};
|
|
|
|
+struct atmel_qspi_ops;
|
|
+
|
|
struct atmel_qspi {
|
|
void __iomem *regs;
|
|
void __iomem *mem;
|
|
@@ -150,13 +154,22 @@ struct atmel_qspi {
|
|
struct clk *qspick;
|
|
struct platform_device *pdev;
|
|
const struct atmel_qspi_caps *caps;
|
|
+ const struct atmel_qspi_ops *ops;
|
|
resource_size_t mmap_size;
|
|
u32 pending;
|
|
+ u32 irq_mask;
|
|
u32 mr;
|
|
u32 scr;
|
|
struct completion cmd_completion;
|
|
};
|
|
|
|
+struct atmel_qspi_ops {
|
|
+ int (*set_cfg)(struct atmel_qspi *aq, const struct spi_mem_op *op,
|
|
+ u32 *offset);
|
|
+ int (*transfer)(struct spi_mem *mem, const struct spi_mem_op *op,
|
|
+ u32 offset);
|
|
+};
|
|
+
|
|
struct atmel_qspi_mode {
|
|
u8 cmd_buswidth;
|
|
u8 addr_buswidth;
|
|
@@ -404,10 +417,67 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,
|
|
return 0;
|
|
}
|
|
|
|
+static int atmel_qspi_wait_for_completion(struct atmel_qspi *aq, u32 irq_mask)
|
|
+{
|
|
+ int err = 0;
|
|
+ u32 sr;
|
|
+
|
|
+ /* Poll INSTRuction End status */
|
|
+ sr = atmel_qspi_read(aq, QSPI_SR);
|
|
+ if ((sr & irq_mask) == irq_mask)
|
|
+ return 0;
|
|
+
|
|
+ /* Wait for INSTRuction End interrupt */
|
|
+ reinit_completion(&aq->cmd_completion);
|
|
+ aq->pending = sr & irq_mask;
|
|
+ aq->irq_mask = irq_mask;
|
|
+ atmel_qspi_write(irq_mask, aq, QSPI_IER);
|
|
+ if (!wait_for_completion_timeout(&aq->cmd_completion,
|
|
+ msecs_to_jiffies(ATMEL_QSPI_TIMEOUT)))
|
|
+ err = -ETIMEDOUT;
|
|
+ atmel_qspi_write(irq_mask, aq, QSPI_IDR);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+static int atmel_qspi_transfer(struct spi_mem *mem,
|
|
+ const struct spi_mem_op *op, u32 offset)
|
|
+{
|
|
+ struct atmel_qspi *aq = spi_controller_get_devdata(mem->spi->controller);
|
|
+
|
|
+ /* Skip to the final steps if there is no data */
|
|
+ if (!op->data.nbytes)
|
|
+ return atmel_qspi_wait_for_completion(aq,
|
|
+ QSPI_SR_CMD_COMPLETED);
|
|
+
|
|
+ /* Dummy read of QSPI_IFR to synchronize APB and AHB accesses */
|
|
+ (void)atmel_qspi_read(aq, QSPI_IFR);
|
|
+
|
|
+ /* Send/Receive data */
|
|
+ if (op->data.dir == SPI_MEM_DATA_IN) {
|
|
+ memcpy_fromio(op->data.buf.in, aq->mem + offset,
|
|
+ op->data.nbytes);
|
|
+
|
|
+ /* Synchronize AHB and APB accesses again */
|
|
+ rmb();
|
|
+ } else {
|
|
+ memcpy_toio(aq->mem + offset, op->data.buf.out,
|
|
+ op->data.nbytes);
|
|
+
|
|
+ /* Synchronize AHB and APB accesses again */
|
|
+ wmb();
|
|
+ }
|
|
+
|
|
+ /* Release the chip-select */
|
|
+ atmel_qspi_write(QSPI_CR_LASTXFER, aq, QSPI_CR);
|
|
+
|
|
+ return atmel_qspi_wait_for_completion(aq, QSPI_SR_CMD_COMPLETED);
|
|
+}
|
|
+
|
|
static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
|
|
{
|
|
struct atmel_qspi *aq = spi_controller_get_devdata(mem->spi->controller);
|
|
- u32 sr, offset;
|
|
+ u32 offset;
|
|
int err;
|
|
|
|
/*
|
|
@@ -416,46 +486,20 @@ static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
|
|
* when the flash memories overrun the controller's memory space.
|
|
*/
|
|
if (op->addr.val + op->data.nbytes > aq->mmap_size)
|
|
- return -ENOTSUPP;
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ if (op->addr.nbytes > 4)
|
|
+ return -EOPNOTSUPP;
|
|
|
|
err = pm_runtime_resume_and_get(&aq->pdev->dev);
|
|
if (err < 0)
|
|
return err;
|
|
|
|
- err = atmel_qspi_set_cfg(aq, op, &offset);
|
|
+ err = aq->ops->set_cfg(aq, op, &offset);
|
|
if (err)
|
|
goto pm_runtime_put;
|
|
|
|
- /* Skip to the final steps if there is no data */
|
|
- if (op->data.nbytes) {
|
|
- /* Dummy read of QSPI_IFR to synchronize APB and AHB accesses */
|
|
- (void)atmel_qspi_read(aq, QSPI_IFR);
|
|
-
|
|
- /* Send/Receive data */
|
|
- if (op->data.dir == SPI_MEM_DATA_IN)
|
|
- memcpy_fromio(op->data.buf.in, aq->mem + offset,
|
|
- op->data.nbytes);
|
|
- else
|
|
- memcpy_toio(aq->mem + offset, op->data.buf.out,
|
|
- op->data.nbytes);
|
|
-
|
|
- /* Release the chip-select */
|
|
- atmel_qspi_write(QSPI_CR_LASTXFER, aq, QSPI_CR);
|
|
- }
|
|
-
|
|
- /* Poll INSTRuction End status */
|
|
- sr = atmel_qspi_read(aq, QSPI_SR);
|
|
- if ((sr & QSPI_SR_CMD_COMPLETED) == QSPI_SR_CMD_COMPLETED)
|
|
- goto pm_runtime_put;
|
|
-
|
|
- /* Wait for INSTRuction End interrupt */
|
|
- reinit_completion(&aq->cmd_completion);
|
|
- aq->pending = sr & QSPI_SR_CMD_COMPLETED;
|
|
- atmel_qspi_write(QSPI_SR_CMD_COMPLETED, aq, QSPI_IER);
|
|
- if (!wait_for_completion_timeout(&aq->cmd_completion,
|
|
- msecs_to_jiffies(1000)))
|
|
- err = -ETIMEDOUT;
|
|
- atmel_qspi_write(QSPI_SR_CMD_COMPLETED, aq, QSPI_IDR);
|
|
+ err = aq->ops->transfer(mem, op, offset);
|
|
|
|
pm_runtime_put:
|
|
pm_runtime_mark_last_busy(&aq->pdev->dev);
|
|
@@ -571,12 +615,17 @@ static irqreturn_t atmel_qspi_interrupt(int irq, void *dev_id)
|
|
return IRQ_NONE;
|
|
|
|
aq->pending |= pending;
|
|
- if ((aq->pending & QSPI_SR_CMD_COMPLETED) == QSPI_SR_CMD_COMPLETED)
|
|
+ if ((aq->pending & aq->irq_mask) == aq->irq_mask)
|
|
complete(&aq->cmd_completion);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
+static const struct atmel_qspi_ops atmel_qspi_ops = {
|
|
+ .set_cfg = atmel_qspi_set_cfg,
|
|
+ .transfer = atmel_qspi_transfer,
|
|
+};
|
|
+
|
|
static int atmel_qspi_probe(struct platform_device *pdev)
|
|
{
|
|
struct spi_controller *ctrl;
|
|
@@ -601,6 +650,7 @@ static int atmel_qspi_probe(struct platform_device *pdev)
|
|
|
|
init_completion(&aq->cmd_completion);
|
|
aq->pdev = pdev;
|
|
+ aq->ops = &atmel_qspi_ops;
|
|
|
|
/* Map the registers */
|
|
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi_base");
|
|
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
|
|
index f793624fd5018f..4350a69d97d7ac 100644
|
|
--- a/drivers/tty/serial/sh-sci.c
|
|
+++ b/drivers/tty/serial/sh-sci.c
|
|
@@ -164,6 +164,7 @@ struct sci_port {
|
|
static struct sci_port sci_ports[SCI_NPORTS];
|
|
static unsigned long sci_ports_in_use;
|
|
static struct uart_driver sci_uart_driver;
|
|
+static bool sci_uart_earlycon;
|
|
|
|
static inline struct sci_port *
|
|
to_sci_port(struct uart_port *uart)
|
|
@@ -3391,6 +3392,7 @@ static int sci_probe_single(struct platform_device *dev,
|
|
static int sci_probe(struct platform_device *dev)
|
|
{
|
|
struct plat_sci_port *p;
|
|
+ struct resource *res;
|
|
struct sci_port *sp;
|
|
unsigned int dev_id;
|
|
int ret;
|
|
@@ -3420,6 +3422,26 @@ static int sci_probe(struct platform_device *dev)
|
|
}
|
|
|
|
sp = &sci_ports[dev_id];
|
|
+
|
|
+ /*
|
|
+ * In case:
|
|
+ * - the probed port alias is zero (as the one used by earlycon), and
|
|
+ * - the earlycon is still active (e.g., "earlycon keep_bootcon" in
|
|
+ * bootargs)
|
|
+ *
|
|
+ * defer the probe of this serial. This is a debug scenario and the user
|
|
+ * must be aware of it.
|
|
+ *
|
|
+ * Except when the probed port is the same as the earlycon port.
|
|
+ */
|
|
+
|
|
+ res = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
|
+ if (!res)
|
|
+ return -ENODEV;
|
|
+
|
|
+ if (sci_uart_earlycon && sp == &sci_ports[0] && sp->port.mapbase != res->start)
|
|
+ return dev_err_probe(&dev->dev, -EBUSY, "sci_port[0] is used by earlycon!\n");
|
|
+
|
|
platform_set_drvdata(dev, sp);
|
|
|
|
ret = sci_probe_single(dev, dev_id, p, sp);
|
|
@@ -3503,7 +3525,7 @@ sh_early_platform_init_buffer("earlyprintk", &sci_driver,
|
|
early_serial_buf, ARRAY_SIZE(early_serial_buf));
|
|
#endif
|
|
#ifdef CONFIG_SERIAL_SH_SCI_EARLYCON
|
|
-static struct plat_sci_port port_cfg __initdata;
|
|
+static struct plat_sci_port port_cfg;
|
|
|
|
static int __init early_console_setup(struct earlycon_device *device,
|
|
int type)
|
|
@@ -3518,6 +3540,7 @@ static int __init early_console_setup(struct earlycon_device *device,
|
|
port_cfg.type = type;
|
|
sci_ports[0].cfg = &port_cfg;
|
|
sci_ports[0].params = sci_probe_regmap(&port_cfg);
|
|
+ sci_uart_earlycon = true;
|
|
port_cfg.scscr = sci_serial_in(&sci_ports[0].port, SCSCR);
|
|
sci_serial_out(&sci_ports[0].port, SCSCR,
|
|
SCSCR_RE | SCSCR_TE | port_cfg.scscr);
|
|
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
|
|
index 2e5e86a00a77d7..7f83d278001701 100644
|
|
--- a/drivers/tty/serial/xilinx_uartps.c
|
|
+++ b/drivers/tty/serial/xilinx_uartps.c
|
|
@@ -268,7 +268,7 @@ static void cdns_uart_handle_rx(void *dev_id, unsigned int isrstatus)
|
|
continue;
|
|
}
|
|
|
|
- if (uart_handle_sysrq_char(port, data))
|
|
+ if (uart_prepare_sysrq_char(port, data))
|
|
continue;
|
|
|
|
if (is_rxbs_support) {
|
|
@@ -369,7 +369,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
|
|
!(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))
|
|
cdns_uart_handle_rx(dev_id, isrstatus);
|
|
|
|
- spin_unlock(&port->lock);
|
|
+ uart_unlock_and_check_sysrq(port);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
@@ -1229,10 +1229,8 @@ static void cdns_uart_console_write(struct console *co, const char *s,
|
|
unsigned int imr, ctrl;
|
|
int locked = 1;
|
|
|
|
- if (port->sysrq)
|
|
- locked = 0;
|
|
- else if (oops_in_progress)
|
|
- locked = spin_trylock_irqsave(&port->lock, flags);
|
|
+ if (oops_in_progress)
|
|
+ locked = uart_port_trylock_irqsave(port, &flags);
|
|
else
|
|
spin_lock_irqsave(&port->lock, flags);
|
|
|
|
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
|
|
index c999acba0f30c3..c5a6b133d3643f 100644
|
|
--- a/drivers/ufs/host/ufs-qcom.c
|
|
+++ b/drivers/ufs/host/ufs-qcom.c
|
|
@@ -158,8 +158,9 @@ static int ufs_qcom_ice_program_key(struct ufs_hba *hba,
|
|
{
|
|
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
|
|
union ufs_crypto_cap_entry cap;
|
|
- bool config_enable =
|
|
- cfg->config_enable & UFS_CRYPTO_CONFIGURATION_ENABLE;
|
|
+
|
|
+ if (!(cfg->config_enable & UFS_CRYPTO_CONFIGURATION_ENABLE))
|
|
+ return qcom_ice_evict_key(host->ice, slot);
|
|
|
|
/* Only AES-256-XTS has been tested so far. */
|
|
cap = hba->crypto_cap_array[cfg->crypto_cap_idx];
|
|
@@ -167,14 +168,11 @@ static int ufs_qcom_ice_program_key(struct ufs_hba *hba,
|
|
cap.key_size != UFS_CRYPTO_KEY_SIZE_256)
|
|
return -EOPNOTSUPP;
|
|
|
|
- if (config_enable)
|
|
- return qcom_ice_program_key(host->ice,
|
|
- QCOM_ICE_CRYPTO_ALG_AES_XTS,
|
|
- QCOM_ICE_CRYPTO_KEY_SIZE_256,
|
|
- cfg->crypto_key,
|
|
- cfg->data_unit_size, slot);
|
|
- else
|
|
- return qcom_ice_evict_key(host->ice, slot);
|
|
+ return qcom_ice_program_key(host->ice,
|
|
+ QCOM_ICE_CRYPTO_ALG_AES_XTS,
|
|
+ QCOM_ICE_CRYPTO_KEY_SIZE_256,
|
|
+ cfg->crypto_key,
|
|
+ cfg->data_unit_size, slot);
|
|
}
|
|
|
|
#else
|
|
diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
|
|
index 8ac50b9155ac40..a7cd0a06879e61 100644
|
|
--- a/drivers/usb/gadget/function/f_tcm.c
|
|
+++ b/drivers/usb/gadget/function/f_tcm.c
|
|
@@ -245,7 +245,6 @@ static int bot_send_write_request(struct usbg_cmd *cmd)
|
|
{
|
|
struct f_uas *fu = cmd->fu;
|
|
struct se_cmd *se_cmd = &cmd->se_cmd;
|
|
- struct usb_gadget *gadget = fuas_to_gadget(fu);
|
|
int ret;
|
|
|
|
init_completion(&cmd->write_complete);
|
|
@@ -256,22 +255,6 @@ static int bot_send_write_request(struct usbg_cmd *cmd)
|
|
return -EINVAL;
|
|
}
|
|
|
|
- if (!gadget->sg_supported) {
|
|
- cmd->data_buf = kmalloc(se_cmd->data_length, GFP_KERNEL);
|
|
- if (!cmd->data_buf)
|
|
- return -ENOMEM;
|
|
-
|
|
- fu->bot_req_out->buf = cmd->data_buf;
|
|
- } else {
|
|
- fu->bot_req_out->buf = NULL;
|
|
- fu->bot_req_out->num_sgs = se_cmd->t_data_nents;
|
|
- fu->bot_req_out->sg = se_cmd->t_data_sg;
|
|
- }
|
|
-
|
|
- fu->bot_req_out->complete = usbg_data_write_cmpl;
|
|
- fu->bot_req_out->length = se_cmd->data_length;
|
|
- fu->bot_req_out->context = cmd;
|
|
-
|
|
ret = usbg_prepare_w_request(cmd, fu->bot_req_out);
|
|
if (ret)
|
|
goto cleanup;
|
|
@@ -973,6 +956,7 @@ static void usbg_data_write_cmpl(struct usb_ep *ep, struct usb_request *req)
|
|
return;
|
|
|
|
cleanup:
|
|
+ target_put_sess_cmd(se_cmd);
|
|
transport_generic_free_cmd(&cmd->se_cmd, 0);
|
|
}
|
|
|
|
@@ -1065,7 +1049,7 @@ static void usbg_cmd_work(struct work_struct *work)
|
|
|
|
out:
|
|
transport_send_check_condition_and_sense(se_cmd,
|
|
- TCM_UNSUPPORTED_SCSI_OPCODE, 1);
|
|
+ TCM_UNSUPPORTED_SCSI_OPCODE, 0);
|
|
}
|
|
|
|
static struct usbg_cmd *usbg_get_cmd(struct f_uas *fu,
|
|
@@ -1193,7 +1177,7 @@ static void bot_cmd_work(struct work_struct *work)
|
|
|
|
out:
|
|
transport_send_check_condition_and_sense(se_cmd,
|
|
- TCM_UNSUPPORTED_SCSI_OPCODE, 1);
|
|
+ TCM_UNSUPPORTED_SCSI_OPCODE, 0);
|
|
}
|
|
|
|
static int bot_submit_command(struct f_uas *fu,
|
|
@@ -1966,43 +1950,39 @@ static int tcm_bind(struct usb_configuration *c, struct usb_function *f)
|
|
bot_intf_desc.bInterfaceNumber = iface;
|
|
uasp_intf_desc.bInterfaceNumber = iface;
|
|
fu->iface = iface;
|
|
- ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_bi_desc,
|
|
- &uasp_bi_ep_comp_desc);
|
|
+ ep = usb_ep_autoconfig(gadget, &uasp_fs_bi_desc);
|
|
if (!ep)
|
|
goto ep_fail;
|
|
|
|
fu->ep_in = ep;
|
|
|
|
- ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_bo_desc,
|
|
- &uasp_bo_ep_comp_desc);
|
|
+ ep = usb_ep_autoconfig(gadget, &uasp_fs_bo_desc);
|
|
if (!ep)
|
|
goto ep_fail;
|
|
fu->ep_out = ep;
|
|
|
|
- ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_status_desc,
|
|
- &uasp_status_in_ep_comp_desc);
|
|
+ ep = usb_ep_autoconfig(gadget, &uasp_fs_status_desc);
|
|
if (!ep)
|
|
goto ep_fail;
|
|
fu->ep_status = ep;
|
|
|
|
- ep = usb_ep_autoconfig_ss(gadget, &uasp_ss_cmd_desc,
|
|
- &uasp_cmd_comp_desc);
|
|
+ ep = usb_ep_autoconfig(gadget, &uasp_fs_cmd_desc);
|
|
if (!ep)
|
|
goto ep_fail;
|
|
fu->ep_cmd = ep;
|
|
|
|
/* Assume endpoint addresses are the same for both speeds */
|
|
- uasp_bi_desc.bEndpointAddress = uasp_ss_bi_desc.bEndpointAddress;
|
|
- uasp_bo_desc.bEndpointAddress = uasp_ss_bo_desc.bEndpointAddress;
|
|
+ uasp_bi_desc.bEndpointAddress = uasp_fs_bi_desc.bEndpointAddress;
|
|
+ uasp_bo_desc.bEndpointAddress = uasp_fs_bo_desc.bEndpointAddress;
|
|
uasp_status_desc.bEndpointAddress =
|
|
- uasp_ss_status_desc.bEndpointAddress;
|
|
- uasp_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress;
|
|
-
|
|
- uasp_fs_bi_desc.bEndpointAddress = uasp_ss_bi_desc.bEndpointAddress;
|
|
- uasp_fs_bo_desc.bEndpointAddress = uasp_ss_bo_desc.bEndpointAddress;
|
|
- uasp_fs_status_desc.bEndpointAddress =
|
|
- uasp_ss_status_desc.bEndpointAddress;
|
|
- uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress;
|
|
+ uasp_fs_status_desc.bEndpointAddress;
|
|
+ uasp_cmd_desc.bEndpointAddress = uasp_fs_cmd_desc.bEndpointAddress;
|
|
+
|
|
+ uasp_ss_bi_desc.bEndpointAddress = uasp_fs_bi_desc.bEndpointAddress;
|
|
+ uasp_ss_bo_desc.bEndpointAddress = uasp_fs_bo_desc.bEndpointAddress;
|
|
+ uasp_ss_status_desc.bEndpointAddress =
|
|
+ uasp_fs_status_desc.bEndpointAddress;
|
|
+ uasp_ss_cmd_desc.bEndpointAddress = uasp_fs_cmd_desc.bEndpointAddress;
|
|
|
|
ret = usb_assign_descriptors(f, uasp_fs_function_desc,
|
|
uasp_hs_function_desc, uasp_ss_function_desc,
|
|
diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c
|
|
index 3bf1043cd7957c..d63c2d266d0735 100644
|
|
--- a/drivers/vfio/platform/vfio_platform_common.c
|
|
+++ b/drivers/vfio/platform/vfio_platform_common.c
|
|
@@ -393,6 +393,11 @@ static ssize_t vfio_platform_read_mmio(struct vfio_platform_region *reg,
|
|
|
|
count = min_t(size_t, count, reg->size - off);
|
|
|
|
+ if (off >= reg->size)
|
|
+ return -EINVAL;
|
|
+
|
|
+ count = min_t(size_t, count, reg->size - off);
|
|
+
|
|
if (!reg->ioaddr) {
|
|
reg->ioaddr =
|
|
ioremap(reg->addr, reg->size);
|
|
@@ -477,6 +482,11 @@ static ssize_t vfio_platform_write_mmio(struct vfio_platform_region *reg,
|
|
|
|
count = min_t(size_t, count, reg->size - off);
|
|
|
|
+ if (off >= reg->size)
|
|
+ return -EINVAL;
|
|
+
|
|
+ count = min_t(size_t, count, reg->size - off);
|
|
+
|
|
if (!reg->ioaddr) {
|
|
reg->ioaddr =
|
|
ioremap(reg->addr, reg->size);
|
|
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
|
|
index cd6d5bbb4b9df5..3f740d8abb4fe2 100644
|
|
--- a/fs/binfmt_flat.c
|
|
+++ b/fs/binfmt_flat.c
|
|
@@ -478,7 +478,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|
* 28 bits (256 MB) is way more than reasonable in this case.
|
|
* If some top bits are set we have probable binary corruption.
|
|
*/
|
|
- if ((text_len | data_len | bss_len | stack_len | full_data) >> 28) {
|
|
+ if ((text_len | data_len | bss_len | stack_len | relocs | full_data) >> 28) {
|
|
pr_err("bad header\n");
|
|
ret = -ENOEXEC;
|
|
goto err;
|
|
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
|
|
index fc6c91773bc894..c2d0c62b087c22 100644
|
|
--- a/fs/btrfs/file.c
|
|
+++ b/fs/btrfs/file.c
|
|
@@ -241,7 +241,7 @@ int btrfs_drop_extents(struct btrfs_trans_handle *trans,
|
|
if (args->drop_cache)
|
|
btrfs_drop_extent_map_range(inode, args->start, args->end - 1, false);
|
|
|
|
- if (args->start >= inode->disk_i_size && !args->replace_extent)
|
|
+ if (data_race(args->start >= inode->disk_i_size) && !args->replace_extent)
|
|
modify_tree = 0;
|
|
|
|
update_refs = (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID);
|
|
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
|
|
index eb9319d856f2d8..cedffa567a7584 100644
|
|
--- a/fs/btrfs/inode.c
|
|
+++ b/fs/btrfs/inode.c
|
|
@@ -7153,8 +7153,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
ret = -EAGAIN;
|
|
goto out;
|
|
}
|
|
-
|
|
- cond_resched();
|
|
}
|
|
|
|
if (orig_start)
|
|
@@ -10835,6 +10833,8 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
|
|
}
|
|
|
|
start += len;
|
|
+
|
|
+ cond_resched();
|
|
}
|
|
|
|
if (bsi.block_len)
|
|
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
|
|
index 8a3c46cb67f538..86d846eb5ed492 100644
|
|
--- a/fs/btrfs/ordered-data.c
|
|
+++ b/fs/btrfs/ordered-data.c
|
|
@@ -1171,6 +1171,18 @@ struct btrfs_ordered_extent *btrfs_split_ordered_extent(
|
|
*/
|
|
if (WARN_ON_ONCE(len >= ordered->num_bytes))
|
|
return ERR_PTR(-EINVAL);
|
|
+ /*
|
|
+ * If our ordered extent had an error there's no point in continuing.
|
|
+ * The error may have come from a transaction abort done either by this
|
|
+ * task or some other concurrent task, and the transaction abort path
|
|
+ * iterates over all existing ordered extents and sets the flag
|
|
+ * BTRFS_ORDERED_IOERR on them.
|
|
+ */
|
|
+ if (unlikely(flags & (1U << BTRFS_ORDERED_IOERR))) {
|
|
+ const int fs_error = BTRFS_FS_ERROR(fs_info);
|
|
+
|
|
+ return fs_error ? ERR_PTR(fs_error) : ERR_PTR(-EIO);
|
|
+ }
|
|
/* We cannot split partially completed ordered extents. */
|
|
if (ordered->bytes_left) {
|
|
ASSERT(!(flags & ~BTRFS_ORDERED_TYPE_FLAGS));
|
|
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
|
|
index 299eac696eb426..537e184b4b1dfc 100644
|
|
--- a/fs/btrfs/relocation.c
|
|
+++ b/fs/btrfs/relocation.c
|
|
@@ -4378,8 +4378,18 @@ int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
|
|
WARN_ON(!first_cow && level == 0);
|
|
|
|
node = rc->backref_cache.path[level];
|
|
- BUG_ON(node->bytenr != buf->start &&
|
|
- node->new_bytenr != buf->start);
|
|
+
|
|
+ /*
|
|
+ * If node->bytenr != buf->start and node->new_bytenr !=
|
|
+ * buf->start then we've got the wrong backref node for what we
|
|
+ * expected to see here and the cache is incorrect.
|
|
+ */
|
|
+ if (unlikely(node->bytenr != buf->start && node->new_bytenr != buf->start)) {
|
|
+ btrfs_err(fs_info,
|
|
+"bytenr %llu was found but our backref cache was expecting %llu or %llu",
|
|
+ buf->start, node->bytenr, node->new_bytenr);
|
|
+ return -EUCLEAN;
|
|
+ }
|
|
|
|
btrfs_backref_drop_node_buffer(node);
|
|
atomic_inc(&cow->refs);
|
|
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
|
|
index 0548072c642fb0..aa03db69a0164c 100644
|
|
--- a/fs/btrfs/transaction.c
|
|
+++ b/fs/btrfs/transaction.c
|
|
@@ -278,8 +278,10 @@ static noinline int join_transaction(struct btrfs_fs_info *fs_info,
|
|
cur_trans = fs_info->running_transaction;
|
|
if (cur_trans) {
|
|
if (TRANS_ABORTED(cur_trans)) {
|
|
+ const int abort_error = cur_trans->aborted;
|
|
+
|
|
spin_unlock(&fs_info->trans_lock);
|
|
- return cur_trans->aborted;
|
|
+ return abort_error;
|
|
}
|
|
if (btrfs_blocked_trans_types[cur_trans->state] & type) {
|
|
spin_unlock(&fs_info->trans_lock);
|
|
diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c
|
|
index 35ba2117a6f652..3e63cfe1587472 100644
|
|
--- a/fs/cachefiles/interface.c
|
|
+++ b/fs/cachefiles/interface.c
|
|
@@ -327,6 +327,8 @@ static void cachefiles_commit_object(struct cachefiles_object *object,
|
|
static void cachefiles_clean_up_object(struct cachefiles_object *object,
|
|
struct cachefiles_cache *cache)
|
|
{
|
|
+ struct file *file;
|
|
+
|
|
if (test_bit(FSCACHE_COOKIE_RETIRED, &object->cookie->flags)) {
|
|
if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) {
|
|
cachefiles_see_object(object, cachefiles_obj_see_clean_delete);
|
|
@@ -342,10 +344,14 @@ static void cachefiles_clean_up_object(struct cachefiles_object *object,
|
|
}
|
|
|
|
cachefiles_unmark_inode_in_use(object, object->file);
|
|
- if (object->file) {
|
|
- fput(object->file);
|
|
- object->file = NULL;
|
|
- }
|
|
+
|
|
+ spin_lock(&object->lock);
|
|
+ file = object->file;
|
|
+ object->file = NULL;
|
|
+ spin_unlock(&object->lock);
|
|
+
|
|
+ if (file)
|
|
+ fput(file);
|
|
}
|
|
|
|
/*
|
|
diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c
|
|
index d1a0264b08a6c1..3389a373faf680 100644
|
|
--- a/fs/cachefiles/ondemand.c
|
|
+++ b/fs/cachefiles/ondemand.c
|
|
@@ -61,20 +61,26 @@ static ssize_t cachefiles_ondemand_fd_write_iter(struct kiocb *kiocb,
|
|
{
|
|
struct cachefiles_object *object = kiocb->ki_filp->private_data;
|
|
struct cachefiles_cache *cache = object->volume->cache;
|
|
- struct file *file = object->file;
|
|
+ struct file *file;
|
|
size_t len = iter->count;
|
|
loff_t pos = kiocb->ki_pos;
|
|
const struct cred *saved_cred;
|
|
int ret;
|
|
|
|
- if (!file)
|
|
+ spin_lock(&object->lock);
|
|
+ file = object->file;
|
|
+ if (!file) {
|
|
+ spin_unlock(&object->lock);
|
|
return -ENOBUFS;
|
|
+ }
|
|
+ get_file(file);
|
|
+ spin_unlock(&object->lock);
|
|
|
|
cachefiles_begin_secure(cache, &saved_cred);
|
|
ret = __cachefiles_prepare_write(object, file, &pos, &len, true);
|
|
cachefiles_end_secure(cache, saved_cred);
|
|
if (ret < 0)
|
|
- return ret;
|
|
+ goto out;
|
|
|
|
trace_cachefiles_ondemand_fd_write(object, file_inode(file), pos, len);
|
|
ret = __cachefiles_write(object, file, pos, iter, NULL, NULL);
|
|
@@ -83,6 +89,8 @@ static ssize_t cachefiles_ondemand_fd_write_iter(struct kiocb *kiocb,
|
|
kiocb->ki_pos += ret;
|
|
}
|
|
|
|
+out:
|
|
+ fput(file);
|
|
return ret;
|
|
}
|
|
|
|
@@ -90,12 +98,22 @@ static loff_t cachefiles_ondemand_fd_llseek(struct file *filp, loff_t pos,
|
|
int whence)
|
|
{
|
|
struct cachefiles_object *object = filp->private_data;
|
|
- struct file *file = object->file;
|
|
+ struct file *file;
|
|
+ loff_t ret;
|
|
|
|
- if (!file)
|
|
+ spin_lock(&object->lock);
|
|
+ file = object->file;
|
|
+ if (!file) {
|
|
+ spin_unlock(&object->lock);
|
|
return -ENOBUFS;
|
|
+ }
|
|
+ get_file(file);
|
|
+ spin_unlock(&object->lock);
|
|
|
|
- return vfs_llseek(file, pos, whence);
|
|
+ ret = vfs_llseek(file, pos, whence);
|
|
+ fput(file);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static long cachefiles_ondemand_fd_ioctl(struct file *filp, unsigned int ioctl,
|
|
diff --git a/fs/exec.c b/fs/exec.c
|
|
index 7776209d98c10b..4a6255aa4ea7f3 100644
|
|
--- a/fs/exec.c
|
|
+++ b/fs/exec.c
|
|
@@ -1362,7 +1362,28 @@ int begin_new_exec(struct linux_binprm * bprm)
|
|
set_dumpable(current->mm, SUID_DUMP_USER);
|
|
|
|
perf_event_exec();
|
|
- __set_task_comm(me, kbasename(bprm->filename), true);
|
|
+
|
|
+ /*
|
|
+ * If the original filename was empty, alloc_bprm() made up a path
|
|
+ * that will probably not be useful to admins running ps or similar.
|
|
+ * Let's fix it up to be something reasonable.
|
|
+ */
|
|
+ if (bprm->comm_from_dentry) {
|
|
+ /*
|
|
+ * Hold RCU lock to keep the name from being freed behind our back.
|
|
+ * Use acquire semantics to make sure the terminating NUL from
|
|
+ * __d_alloc() is seen.
|
|
+ *
|
|
+ * Note, we're deliberately sloppy here. We don't need to care about
|
|
+ * detecting a concurrent rename and just want a terminated name.
|
|
+ */
|
|
+ rcu_read_lock();
|
|
+ __set_task_comm(me, smp_load_acquire(&bprm->file->f_path.dentry->d_name.name),
|
|
+ true);
|
|
+ rcu_read_unlock();
|
|
+ } else {
|
|
+ __set_task_comm(me, kbasename(bprm->filename), true);
|
|
+ }
|
|
|
|
/* An exec changes our domain. We are no longer part of the thread
|
|
group */
|
|
@@ -1521,11 +1542,13 @@ static struct linux_binprm *alloc_bprm(int fd, struct filename *filename)
|
|
if (fd == AT_FDCWD || filename->name[0] == '/') {
|
|
bprm->filename = filename->name;
|
|
} else {
|
|
- if (filename->name[0] == '\0')
|
|
+ if (filename->name[0] == '\0') {
|
|
bprm->fdpath = kasprintf(GFP_KERNEL, "/dev/fd/%d", fd);
|
|
- else
|
|
+ bprm->comm_from_dentry = 1;
|
|
+ } else {
|
|
bprm->fdpath = kasprintf(GFP_KERNEL, "/dev/fd/%d/%s",
|
|
fd, filename->name);
|
|
+ }
|
|
if (!bprm->fdpath)
|
|
goto out_free;
|
|
|
|
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c
|
|
index 3e724cb7ef01d8..2b3c5eea1f1345 100644
|
|
--- a/fs/nfs/flexfilelayout/flexfilelayout.c
|
|
+++ b/fs/nfs/flexfilelayout/flexfilelayout.c
|
|
@@ -839,6 +839,9 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
|
struct nfs4_pnfs_ds *ds;
|
|
u32 ds_idx;
|
|
|
|
+ if (NFS_SERVER(pgio->pg_inode)->flags &
|
|
+ (NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
|
|
+ pgio->pg_maxretrans = io_maxretrans;
|
|
retry:
|
|
ff_layout_pg_check_layout(pgio, req);
|
|
/* Use full layout for now */
|
|
@@ -852,6 +855,8 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
|
if (!pgio->pg_lseg)
|
|
goto out_nolseg;
|
|
}
|
|
+ /* Reset wb_nio, since getting layout segment was successful */
|
|
+ req->wb_nio = 0;
|
|
|
|
ds = ff_layout_get_ds_for_read(pgio, &ds_idx);
|
|
if (!ds) {
|
|
@@ -868,14 +873,24 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
|
pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
|
|
|
|
pgio->pg_mirror_idx = ds_idx;
|
|
-
|
|
- if (NFS_SERVER(pgio->pg_inode)->flags &
|
|
- (NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
|
|
- pgio->pg_maxretrans = io_maxretrans;
|
|
return;
|
|
out_nolseg:
|
|
- if (pgio->pg_error < 0)
|
|
- return;
|
|
+ if (pgio->pg_error < 0) {
|
|
+ if (pgio->pg_error != -EAGAIN)
|
|
+ return;
|
|
+ /* Retry getting layout segment if lower layer returned -EAGAIN */
|
|
+ if (pgio->pg_maxretrans && req->wb_nio++ > pgio->pg_maxretrans) {
|
|
+ if (NFS_SERVER(pgio->pg_inode)->flags & NFS_MOUNT_SOFTERR)
|
|
+ pgio->pg_error = -ETIMEDOUT;
|
|
+ else
|
|
+ pgio->pg_error = -EIO;
|
|
+ return;
|
|
+ }
|
|
+ pgio->pg_error = 0;
|
|
+ /* Sleep for 1 second before retrying */
|
|
+ ssleep(1);
|
|
+ goto retry;
|
|
+ }
|
|
out_mds:
|
|
trace_pnfs_mds_fallback_pg_init_read(pgio->pg_inode,
|
|
0, NFS4_MAX_UINT64, IOMODE_READ,
|
|
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
|
|
index 489592644b68f5..5f2d73f36e0d2f 100644
|
|
--- a/fs/nilfs2/inode.c
|
|
+++ b/fs/nilfs2/inode.c
|
|
@@ -1267,7 +1267,7 @@ int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
if (size) {
|
|
if (phys && blkphy << blkbits == phys + size) {
|
|
/* The current extent goes on */
|
|
- size += n << blkbits;
|
|
+ size += (u64)n << blkbits;
|
|
} else {
|
|
/* Terminate the current extent */
|
|
ret = fiemap_fill_next_extent(
|
|
@@ -1280,14 +1280,14 @@ int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
flags = FIEMAP_EXTENT_MERGED;
|
|
logical = blkoff << blkbits;
|
|
phys = blkphy << blkbits;
|
|
- size = n << blkbits;
|
|
+ size = (u64)n << blkbits;
|
|
}
|
|
} else {
|
|
/* Start a new extent */
|
|
flags = FIEMAP_EXTENT_MERGED;
|
|
logical = blkoff << blkbits;
|
|
phys = blkphy << blkbits;
|
|
- size = n << blkbits;
|
|
+ size = (u64)n << blkbits;
|
|
}
|
|
blkoff += n;
|
|
}
|
|
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c
|
|
index 429c22f911fdae..da1ab3282c1817 100644
|
|
--- a/fs/ocfs2/dir.c
|
|
+++ b/fs/ocfs2/dir.c
|
|
@@ -1065,26 +1065,39 @@ int ocfs2_find_entry(const char *name, int namelen,
|
|
{
|
|
struct buffer_head *bh;
|
|
struct ocfs2_dir_entry *res_dir = NULL;
|
|
+ int ret = 0;
|
|
|
|
if (ocfs2_dir_indexed(dir))
|
|
return ocfs2_find_entry_dx(name, namelen, dir, lookup);
|
|
|
|
+ if (unlikely(i_size_read(dir) <= 0)) {
|
|
+ ret = -EFSCORRUPTED;
|
|
+ mlog_errno(ret);
|
|
+ goto out;
|
|
+ }
|
|
/*
|
|
* The unindexed dir code only uses part of the lookup
|
|
* structure, so there's no reason to push it down further
|
|
* than this.
|
|
*/
|
|
- if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
|
|
+ if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
|
|
+ if (unlikely(i_size_read(dir) > dir->i_sb->s_blocksize)) {
|
|
+ ret = -EFSCORRUPTED;
|
|
+ mlog_errno(ret);
|
|
+ goto out;
|
|
+ }
|
|
bh = ocfs2_find_entry_id(name, namelen, dir, &res_dir);
|
|
- else
|
|
+ } else {
|
|
bh = ocfs2_find_entry_el(name, namelen, dir, &res_dir);
|
|
+ }
|
|
|
|
if (bh == NULL)
|
|
return -ENOENT;
|
|
|
|
lookup->dl_leaf_bh = bh;
|
|
lookup->dl_entry = res_dir;
|
|
- return 0;
|
|
+out:
|
|
+ return ret;
|
|
}
|
|
|
|
/*
|
|
@@ -2012,6 +2025,7 @@ int ocfs2_lookup_ino_from_name(struct inode *dir, const char *name,
|
|
*
|
|
* Return 0 if the name does not exist
|
|
* Return -EEXIST if the directory contains the name
|
|
+ * Return -EFSCORRUPTED if found corruption
|
|
*
|
|
* Callers should have i_rwsem + a cluster lock on dir
|
|
*/
|
|
@@ -2025,9 +2039,12 @@ int ocfs2_check_dir_for_entry(struct inode *dir,
|
|
trace_ocfs2_check_dir_for_entry(
|
|
(unsigned long long)OCFS2_I(dir)->ip_blkno, namelen, name);
|
|
|
|
- if (ocfs2_find_entry(name, namelen, dir, &lookup) == 0) {
|
|
+ ret = ocfs2_find_entry(name, namelen, dir, &lookup);
|
|
+ if (ret == 0) {
|
|
ret = -EEXIST;
|
|
mlog_errno(ret);
|
|
+ } else if (ret == -ENOENT) {
|
|
+ ret = 0;
|
|
}
|
|
|
|
ocfs2_free_dir_lookup_result(&lookup);
|
|
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
|
|
index 9f6bbb4a0844aa..84fa585c6513a5 100644
|
|
--- a/fs/ocfs2/super.c
|
|
+++ b/fs/ocfs2/super.c
|
|
@@ -2343,7 +2343,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
|
|
mlog(ML_ERROR, "found superblock with incorrect block "
|
|
"size bits: found %u, should be 9, 10, 11, or 12\n",
|
|
blksz_bits);
|
|
- } else if ((1 << le32_to_cpu(blksz_bits)) != blksz) {
|
|
+ } else if ((1 << blksz_bits) != blksz) {
|
|
mlog(ML_ERROR, "found superblock with incorrect block "
|
|
"size: found %u, should be %u\n", 1 << blksz_bits, blksz);
|
|
} else if (le16_to_cpu(di->id2.i_super.s_major_rev_level) !=
|
|
diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c
|
|
index d4c5fdcfa1e464..f5cf2255dc0972 100644
|
|
--- a/fs/ocfs2/symlink.c
|
|
+++ b/fs/ocfs2/symlink.c
|
|
@@ -65,7 +65,7 @@ static int ocfs2_fast_symlink_read_folio(struct file *f, struct folio *folio)
|
|
|
|
if (status < 0) {
|
|
mlog_errno(status);
|
|
- return status;
|
|
+ goto out;
|
|
}
|
|
|
|
fe = (struct ocfs2_dinode *) bh->b_data;
|
|
@@ -76,9 +76,10 @@ static int ocfs2_fast_symlink_read_folio(struct file *f, struct folio *folio)
|
|
memcpy(kaddr, link, len + 1);
|
|
kunmap_atomic(kaddr);
|
|
SetPageUptodate(page);
|
|
+out:
|
|
unlock_page(page);
|
|
brelse(bh);
|
|
- return 0;
|
|
+ return status;
|
|
}
|
|
|
|
const struct address_space_operations ocfs2_fast_symlink_aops = {
|
|
diff --git a/fs/proc/array.c b/fs/proc/array.c
|
|
index 34a47fb0c57f25..5e4f7b411fbdb9 100644
|
|
--- a/fs/proc/array.c
|
|
+++ b/fs/proc/array.c
|
|
@@ -500,7 +500,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
|
|
* a program is not able to use ptrace(2) in that case. It is
|
|
* safe because the task has stopped executing permanently.
|
|
*/
|
|
- if (permitted && (task->flags & (PF_EXITING|PF_DUMPCORE))) {
|
|
+ if (permitted && (task->flags & (PF_EXITING|PF_DUMPCORE|PF_POSTCOREDUMP))) {
|
|
if (try_get_task_stack(task)) {
|
|
eip = KSTK_EIP(task);
|
|
esp = KSTK_ESP(task);
|
|
diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h
|
|
index 43b42eca6780cf..6992e1ec02e416 100644
|
|
--- a/fs/smb/client/cifsglob.h
|
|
+++ b/fs/smb/client/cifsglob.h
|
|
@@ -323,7 +323,7 @@ struct smb_version_operations {
|
|
int (*handle_cancelled_mid)(struct mid_q_entry *, struct TCP_Server_Info *);
|
|
void (*downgrade_oplock)(struct TCP_Server_Info *server,
|
|
struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache);
|
|
+ __u16 epoch, bool *purge_cache);
|
|
/* process transaction2 response */
|
|
bool (*check_trans2)(struct mid_q_entry *, struct TCP_Server_Info *,
|
|
char *, int);
|
|
@@ -519,12 +519,12 @@ struct smb_version_operations {
|
|
/* if we can do cache read operations */
|
|
bool (*is_read_op)(__u32);
|
|
/* set oplock level for the inode */
|
|
- void (*set_oplock_level)(struct cifsInodeInfo *, __u32, unsigned int,
|
|
- bool *);
|
|
+ void (*set_oplock_level)(struct cifsInodeInfo *cinode, __u32 oplock, __u16 epoch,
|
|
+ bool *purge_cache);
|
|
/* create lease context buffer for CREATE request */
|
|
char * (*create_lease_buf)(u8 *lease_key, u8 oplock);
|
|
/* parse lease context buffer and return oplock/epoch info */
|
|
- __u8 (*parse_lease_buf)(void *buf, unsigned int *epoch, char *lkey);
|
|
+ __u8 (*parse_lease_buf)(void *buf, __u16 *epoch, char *lkey);
|
|
ssize_t (*copychunk_range)(const unsigned int,
|
|
struct cifsFileInfo *src_file,
|
|
struct cifsFileInfo *target_file,
|
|
@@ -1412,7 +1412,7 @@ struct cifs_fid {
|
|
__u8 create_guid[16];
|
|
__u32 access;
|
|
struct cifs_pending_open *pending_open;
|
|
- unsigned int epoch;
|
|
+ __u16 epoch;
|
|
#ifdef CONFIG_CIFS_DEBUG2
|
|
__u64 mid;
|
|
#endif /* CIFS_DEBUG2 */
|
|
@@ -1445,7 +1445,7 @@ struct cifsFileInfo {
|
|
bool oplock_break_cancelled:1;
|
|
bool status_file_deleted:1; /* file has been deleted */
|
|
bool offload:1; /* offload final part of _put to a wq */
|
|
- unsigned int oplock_epoch; /* epoch from the lease break */
|
|
+ __u16 oplock_epoch; /* epoch from the lease break */
|
|
__u32 oplock_level; /* oplock/lease level from the lease break */
|
|
int count;
|
|
spinlock_t file_info_lock; /* protects four flag/count fields above */
|
|
@@ -1584,7 +1584,7 @@ struct cifsInodeInfo {
|
|
spinlock_t open_file_lock; /* protects openFileList */
|
|
__u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
|
|
unsigned int oplock; /* oplock/lease level we have */
|
|
- unsigned int epoch; /* used to track lease state changes */
|
|
+ __u16 epoch; /* used to track lease state changes */
|
|
#define CIFS_INODE_PENDING_OPLOCK_BREAK (0) /* oplock break in progress */
|
|
#define CIFS_INODE_PENDING_WRITERS (1) /* Writes in progress */
|
|
#define CIFS_INODE_FLAG_UNUSED (2) /* Unused flag */
|
|
diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c
|
|
index 864b194dbaa0a0..1822493dd0842e 100644
|
|
--- a/fs/smb/client/dir.c
|
|
+++ b/fs/smb/client/dir.c
|
|
@@ -627,7 +627,7 @@ int cifs_mknod(struct mnt_idmap *idmap, struct inode *inode,
|
|
goto mknod_out;
|
|
}
|
|
|
|
- trace_smb3_mknod_enter(xid, tcon->ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_mknod_enter(xid, tcon->tid, tcon->ses->Suid, full_path);
|
|
|
|
rc = tcon->ses->server->ops->make_node(xid, inode, direntry, tcon,
|
|
full_path, mode,
|
|
@@ -635,9 +635,9 @@ int cifs_mknod(struct mnt_idmap *idmap, struct inode *inode,
|
|
|
|
mknod_out:
|
|
if (rc)
|
|
- trace_smb3_mknod_err(xid, tcon->ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_mknod_err(xid, tcon->tid, tcon->ses->Suid, rc);
|
|
else
|
|
- trace_smb3_mknod_done(xid, tcon->ses->Suid, tcon->tid);
|
|
+ trace_smb3_mknod_done(xid, tcon->tid, tcon->ses->Suid);
|
|
|
|
free_dentry_path(page);
|
|
free_xid(xid);
|
|
diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c
|
|
index b0c0572f9d1fbc..bc1bac36c1b291 100644
|
|
--- a/fs/smb/client/smb1ops.c
|
|
+++ b/fs/smb/client/smb1ops.c
|
|
@@ -377,7 +377,7 @@ coalesce_t2(char *second_buf, struct smb_hdr *target_hdr)
|
|
static void
|
|
cifs_downgrade_oplock(struct TCP_Server_Info *server,
|
|
struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache)
|
|
+ __u16 epoch, bool *purge_cache)
|
|
{
|
|
cifs_set_oplock_level(cinode, oplock);
|
|
}
|
|
diff --git a/fs/smb/client/smb2inode.c b/fs/smb/client/smb2inode.c
|
|
index 9ebd7a5ee23c21..e1078a1decdfa3 100644
|
|
--- a/fs/smb/client/smb2inode.c
|
|
+++ b/fs/smb/client/smb2inode.c
|
|
@@ -298,8 +298,8 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_query_info_compound_enter(xid, ses->Suid,
|
|
- tcon->tid, full_path);
|
|
+ trace_smb3_query_info_compound_enter(xid, tcon->tid,
|
|
+ ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_POSIX_QUERY_INFO:
|
|
rqst[num_rqst].rq_iov = &vars->qi_iov;
|
|
@@ -334,18 +334,18 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_posix_query_info_compound_enter(xid, ses->Suid,
|
|
- tcon->tid, full_path);
|
|
+ trace_smb3_posix_query_info_compound_enter(xid, tcon->tid,
|
|
+ ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_DELETE:
|
|
- trace_smb3_delete_enter(xid, ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_delete_enter(xid, tcon->tid, ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_MKDIR:
|
|
/*
|
|
* Directories are created through parameters in the
|
|
* SMB2_open() call.
|
|
*/
|
|
- trace_smb3_mkdir_enter(xid, ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_mkdir_enter(xid, tcon->tid, ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_RMDIR:
|
|
rqst[num_rqst].rq_iov = &vars->si_iov[0];
|
|
@@ -363,7 +363,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
smb2_set_next_command(tcon, &rqst[num_rqst]);
|
|
smb2_set_related(&rqst[num_rqst++]);
|
|
- trace_smb3_rmdir_enter(xid, ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_rmdir_enter(xid, tcon->tid, ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_SET_EOF:
|
|
rqst[num_rqst].rq_iov = &vars->si_iov[0];
|
|
@@ -398,7 +398,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_set_eof_enter(xid, ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_set_eof_enter(xid, tcon->tid, ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_SET_INFO:
|
|
rqst[num_rqst].rq_iov = &vars->si_iov[0];
|
|
@@ -429,8 +429,8 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_set_info_compound_enter(xid, ses->Suid,
|
|
- tcon->tid, full_path);
|
|
+ trace_smb3_set_info_compound_enter(xid, tcon->tid,
|
|
+ ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_RENAME:
|
|
rqst[num_rqst].rq_iov = &vars->si_iov[0];
|
|
@@ -469,7 +469,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_rename_enter(xid, ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_rename_enter(xid, tcon->tid, ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_HARDLINK:
|
|
rqst[num_rqst].rq_iov = &vars->si_iov[0];
|
|
@@ -496,7 +496,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
smb2_set_next_command(tcon, &rqst[num_rqst]);
|
|
smb2_set_related(&rqst[num_rqst++]);
|
|
- trace_smb3_hardlink_enter(xid, ses->Suid, tcon->tid, full_path);
|
|
+ trace_smb3_hardlink_enter(xid, tcon->tid, ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_SET_REPARSE:
|
|
rqst[num_rqst].rq_iov = vars->io_iov;
|
|
@@ -523,8 +523,8 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_set_reparse_compound_enter(xid, ses->Suid,
|
|
- tcon->tid, full_path);
|
|
+ trace_smb3_set_reparse_compound_enter(xid, tcon->tid,
|
|
+ ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_GET_REPARSE:
|
|
rqst[num_rqst].rq_iov = vars->io_iov;
|
|
@@ -549,8 +549,8 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
goto finished;
|
|
}
|
|
num_rqst++;
|
|
- trace_smb3_get_reparse_compound_enter(xid, ses->Suid,
|
|
- tcon->tid, full_path);
|
|
+ trace_smb3_get_reparse_compound_enter(xid, tcon->tid,
|
|
+ ses->Suid, full_path);
|
|
break;
|
|
case SMB2_OP_QUERY_WSL_EA:
|
|
rqst[num_rqst].rq_iov = &vars->ea_iov;
|
|
@@ -663,11 +663,11 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
}
|
|
SMB2_query_info_free(&rqst[num_rqst++]);
|
|
if (rc)
|
|
- trace_smb3_query_info_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_query_info_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
else
|
|
- trace_smb3_query_info_compound_done(xid, ses->Suid,
|
|
- tcon->tid);
|
|
+ trace_smb3_query_info_compound_done(xid, tcon->tid,
|
|
+ ses->Suid);
|
|
break;
|
|
case SMB2_OP_POSIX_QUERY_INFO:
|
|
idata = in_iov[i].iov_base;
|
|
@@ -690,15 +690,15 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
|
|
SMB2_query_info_free(&rqst[num_rqst++]);
|
|
if (rc)
|
|
- trace_smb3_posix_query_info_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_posix_query_info_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
else
|
|
- trace_smb3_posix_query_info_compound_done(xid, ses->Suid,
|
|
- tcon->tid);
|
|
+ trace_smb3_posix_query_info_compound_done(xid, tcon->tid,
|
|
+ ses->Suid);
|
|
break;
|
|
case SMB2_OP_DELETE:
|
|
if (rc)
|
|
- trace_smb3_delete_err(xid, ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_delete_err(xid, tcon->tid, ses->Suid, rc);
|
|
else {
|
|
/*
|
|
* If dentry (hence, inode) is NULL, lease break is going to
|
|
@@ -706,59 +706,59 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
*/
|
|
if (inode)
|
|
cifs_mark_open_handles_for_deleted_file(inode, full_path);
|
|
- trace_smb3_delete_done(xid, ses->Suid, tcon->tid);
|
|
+ trace_smb3_delete_done(xid, tcon->tid, ses->Suid);
|
|
}
|
|
break;
|
|
case SMB2_OP_MKDIR:
|
|
if (rc)
|
|
- trace_smb3_mkdir_err(xid, ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_mkdir_err(xid, tcon->tid, ses->Suid, rc);
|
|
else
|
|
- trace_smb3_mkdir_done(xid, ses->Suid, tcon->tid);
|
|
+ trace_smb3_mkdir_done(xid, tcon->tid, ses->Suid);
|
|
break;
|
|
case SMB2_OP_HARDLINK:
|
|
if (rc)
|
|
- trace_smb3_hardlink_err(xid, ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_hardlink_err(xid, tcon->tid, ses->Suid, rc);
|
|
else
|
|
- trace_smb3_hardlink_done(xid, ses->Suid, tcon->tid);
|
|
+ trace_smb3_hardlink_done(xid, tcon->tid, ses->Suid);
|
|
SMB2_set_info_free(&rqst[num_rqst++]);
|
|
break;
|
|
case SMB2_OP_RENAME:
|
|
if (rc)
|
|
- trace_smb3_rename_err(xid, ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_rename_err(xid, tcon->tid, ses->Suid, rc);
|
|
else
|
|
- trace_smb3_rename_done(xid, ses->Suid, tcon->tid);
|
|
+ trace_smb3_rename_done(xid, tcon->tid, ses->Suid);
|
|
SMB2_set_info_free(&rqst[num_rqst++]);
|
|
break;
|
|
case SMB2_OP_RMDIR:
|
|
if (rc)
|
|
- trace_smb3_rmdir_err(xid, ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_rmdir_err(xid, tcon->tid, ses->Suid, rc);
|
|
else
|
|
- trace_smb3_rmdir_done(xid, ses->Suid, tcon->tid);
|
|
+ trace_smb3_rmdir_done(xid, tcon->tid, ses->Suid);
|
|
SMB2_set_info_free(&rqst[num_rqst++]);
|
|
break;
|
|
case SMB2_OP_SET_EOF:
|
|
if (rc)
|
|
- trace_smb3_set_eof_err(xid, ses->Suid, tcon->tid, rc);
|
|
+ trace_smb3_set_eof_err(xid, tcon->tid, ses->Suid, rc);
|
|
else
|
|
- trace_smb3_set_eof_done(xid, ses->Suid, tcon->tid);
|
|
+ trace_smb3_set_eof_done(xid, tcon->tid, ses->Suid);
|
|
SMB2_set_info_free(&rqst[num_rqst++]);
|
|
break;
|
|
case SMB2_OP_SET_INFO:
|
|
if (rc)
|
|
- trace_smb3_set_info_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_set_info_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
else
|
|
- trace_smb3_set_info_compound_done(xid, ses->Suid,
|
|
- tcon->tid);
|
|
+ trace_smb3_set_info_compound_done(xid, tcon->tid,
|
|
+ ses->Suid);
|
|
SMB2_set_info_free(&rqst[num_rqst++]);
|
|
break;
|
|
case SMB2_OP_SET_REPARSE:
|
|
if (rc) {
|
|
- trace_smb3_set_reparse_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_set_reparse_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
} else {
|
|
- trace_smb3_set_reparse_compound_done(xid, ses->Suid,
|
|
- tcon->tid);
|
|
+ trace_smb3_set_reparse_compound_done(xid, tcon->tid,
|
|
+ ses->Suid);
|
|
}
|
|
SMB2_ioctl_free(&rqst[num_rqst++]);
|
|
break;
|
|
@@ -771,18 +771,18 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
rbuf = reparse_buf_ptr(iov);
|
|
if (IS_ERR(rbuf)) {
|
|
rc = PTR_ERR(rbuf);
|
|
- trace_smb3_set_reparse_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_get_reparse_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
} else {
|
|
idata->reparse.tag = le32_to_cpu(rbuf->ReparseTag);
|
|
- trace_smb3_set_reparse_compound_done(xid, ses->Suid,
|
|
- tcon->tid);
|
|
+ trace_smb3_get_reparse_compound_done(xid, tcon->tid,
|
|
+ ses->Suid);
|
|
}
|
|
memset(iov, 0, sizeof(*iov));
|
|
resp_buftype[i + 1] = CIFS_NO_BUFFER;
|
|
} else {
|
|
- trace_smb3_set_reparse_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_get_reparse_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
}
|
|
SMB2_ioctl_free(&rqst[num_rqst++]);
|
|
break;
|
|
@@ -799,11 +799,11 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
|
}
|
|
}
|
|
if (!rc) {
|
|
- trace_smb3_query_wsl_ea_compound_done(xid, ses->Suid,
|
|
- tcon->tid);
|
|
+ trace_smb3_query_wsl_ea_compound_done(xid, tcon->tid,
|
|
+ ses->Suid);
|
|
} else {
|
|
- trace_smb3_query_wsl_ea_compound_err(xid, ses->Suid,
|
|
- tcon->tid, rc);
|
|
+ trace_smb3_query_wsl_ea_compound_err(xid, tcon->tid,
|
|
+ ses->Suid, rc);
|
|
}
|
|
SMB2_query_info_free(&rqst[num_rqst++]);
|
|
break;
|
|
diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c
|
|
index d4be915bcb70c7..8d3fa2a3b8a956 100644
|
|
--- a/fs/smb/client/smb2ops.c
|
|
+++ b/fs/smb/client/smb2ops.c
|
|
@@ -3867,22 +3867,22 @@ static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode,
|
|
static void
|
|
smb2_downgrade_oplock(struct TCP_Server_Info *server,
|
|
struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache)
|
|
+ __u16 epoch, bool *purge_cache)
|
|
{
|
|
server->ops->set_oplock_level(cinode, oplock, 0, NULL);
|
|
}
|
|
|
|
static void
|
|
smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache);
|
|
+ __u16 epoch, bool *purge_cache);
|
|
|
|
static void
|
|
smb3_downgrade_oplock(struct TCP_Server_Info *server,
|
|
struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache)
|
|
+ __u16 epoch, bool *purge_cache)
|
|
{
|
|
unsigned int old_state = cinode->oplock;
|
|
- unsigned int old_epoch = cinode->epoch;
|
|
+ __u16 old_epoch = cinode->epoch;
|
|
unsigned int new_state;
|
|
|
|
if (epoch > old_epoch) {
|
|
@@ -3902,7 +3902,7 @@ smb3_downgrade_oplock(struct TCP_Server_Info *server,
|
|
|
|
static void
|
|
smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache)
|
|
+ __u16 epoch, bool *purge_cache)
|
|
{
|
|
oplock &= 0xFF;
|
|
cinode->lease_granted = false;
|
|
@@ -3926,7 +3926,7 @@ smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|
|
|
static void
|
|
smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache)
|
|
+ __u16 epoch, bool *purge_cache)
|
|
{
|
|
char message[5] = {0};
|
|
unsigned int new_oplock = 0;
|
|
@@ -3963,7 +3963,7 @@ smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|
|
|
static void
|
|
smb3_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|
- unsigned int epoch, bool *purge_cache)
|
|
+ __u16 epoch, bool *purge_cache)
|
|
{
|
|
unsigned int old_oplock = cinode->oplock;
|
|
|
|
@@ -4077,7 +4077,7 @@ smb3_create_lease_buf(u8 *lease_key, u8 oplock)
|
|
}
|
|
|
|
static __u8
|
|
-smb2_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
|
|
+smb2_parse_lease_buf(void *buf, __u16 *epoch, char *lease_key)
|
|
{
|
|
struct create_lease *lc = (struct create_lease *)buf;
|
|
|
|
@@ -4088,7 +4088,7 @@ smb2_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
|
|
}
|
|
|
|
static __u8
|
|
-smb3_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
|
|
+smb3_parse_lease_buf(void *buf, __u16 *epoch, char *lease_key)
|
|
{
|
|
struct create_lease_v2 *lc = (struct create_lease_v2 *)buf;
|
|
|
|
diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
|
|
index c012fbc2638ed5..24b1738a35a155 100644
|
|
--- a/fs/smb/client/smb2pdu.c
|
|
+++ b/fs/smb/client/smb2pdu.c
|
|
@@ -2322,7 +2322,7 @@ parse_posix_ctxt(struct create_context *cc, struct smb2_file_all_info *info,
|
|
|
|
int smb2_parse_contexts(struct TCP_Server_Info *server,
|
|
struct kvec *rsp_iov,
|
|
- unsigned int *epoch,
|
|
+ __u16 *epoch,
|
|
char *lease_key, __u8 *oplock,
|
|
struct smb2_file_all_info *buf,
|
|
struct create_posix_rsp *posix)
|
|
diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h
|
|
index 750e4e397b1393..f553e3edd54ecf 100644
|
|
--- a/fs/smb/client/smb2proto.h
|
|
+++ b/fs/smb/client/smb2proto.h
|
|
@@ -283,7 +283,7 @@ extern enum securityEnum smb2_select_sectype(struct TCP_Server_Info *,
|
|
enum securityEnum);
|
|
int smb2_parse_contexts(struct TCP_Server_Info *server,
|
|
struct kvec *rsp_iov,
|
|
- unsigned int *epoch,
|
|
+ __u16 *epoch,
|
|
char *lease_key, __u8 *oplock,
|
|
struct smb2_file_all_info *buf,
|
|
struct create_posix_rsp *posix);
|
|
diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c
|
|
index c12b70d01880c0..449999576a141e 100644
|
|
--- a/fs/smb/server/transport_ipc.c
|
|
+++ b/fs/smb/server/transport_ipc.c
|
|
@@ -570,6 +570,9 @@ ksmbd_ipc_spnego_authen_request(const char *spnego_blob, int blob_len)
|
|
struct ksmbd_spnego_authen_request *req;
|
|
struct ksmbd_spnego_authen_response *resp;
|
|
|
|
+ if (blob_len > KSMBD_IPC_MAX_PAYLOAD)
|
|
+ return NULL;
|
|
+
|
|
msg = ipc_msg_alloc(sizeof(struct ksmbd_spnego_authen_request) +
|
|
blob_len + 1);
|
|
if (!msg)
|
|
@@ -749,6 +752,9 @@ struct ksmbd_rpc_command *ksmbd_rpc_write(struct ksmbd_session *sess, int handle
|
|
struct ksmbd_rpc_command *req;
|
|
struct ksmbd_rpc_command *resp;
|
|
|
|
+ if (payload_sz > KSMBD_IPC_MAX_PAYLOAD)
|
|
+ return NULL;
|
|
+
|
|
msg = ipc_msg_alloc(sizeof(struct ksmbd_rpc_command) + payload_sz + 1);
|
|
if (!msg)
|
|
return NULL;
|
|
@@ -797,6 +803,9 @@ struct ksmbd_rpc_command *ksmbd_rpc_ioctl(struct ksmbd_session *sess, int handle
|
|
struct ksmbd_rpc_command *req;
|
|
struct ksmbd_rpc_command *resp;
|
|
|
|
+ if (payload_sz > KSMBD_IPC_MAX_PAYLOAD)
|
|
+ return NULL;
|
|
+
|
|
msg = ipc_msg_alloc(sizeof(struct ksmbd_rpc_command) + payload_sz + 1);
|
|
if (!msg)
|
|
return NULL;
|
|
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
|
|
index 6f7dca1c14c75a..b9784348ebc5c4 100644
|
|
--- a/fs/xfs/xfs_inode.c
|
|
+++ b/fs/xfs/xfs_inode.c
|
|
@@ -1738,8 +1738,11 @@ xfs_inactive(
|
|
goto out;
|
|
|
|
/* Try to clean out the cow blocks if there are any. */
|
|
- if (xfs_inode_has_cow_data(ip))
|
|
- xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF, true);
|
|
+ if (xfs_inode_has_cow_data(ip)) {
|
|
+ error = xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF, true);
|
|
+ if (error)
|
|
+ goto out;
|
|
+ }
|
|
|
|
if (VFS_I(ip)->i_nlink != 0) {
|
|
/*
|
|
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
|
|
index 9ce2f48b4ebc01..40d02a1450d3cf 100644
|
|
--- a/fs/xfs/xfs_iomap.c
|
|
+++ b/fs/xfs/xfs_iomap.c
|
|
@@ -923,10 +923,8 @@ xfs_dax_write_iomap_end(
|
|
if (!xfs_is_cow_inode(ip))
|
|
return 0;
|
|
|
|
- if (!written) {
|
|
- xfs_reflink_cancel_cow_range(ip, pos, length, true);
|
|
- return 0;
|
|
- }
|
|
+ if (!written)
|
|
+ return xfs_reflink_cancel_cow_range(ip, pos, length, true);
|
|
|
|
return xfs_reflink_end_cow(ip, pos, written);
|
|
}
|
|
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
|
|
index d300fde6c1a47a..b2e9dc02fa3495 100644
|
|
--- a/include/drm/drm_connector.h
|
|
+++ b/include/drm/drm_connector.h
|
|
@@ -1764,8 +1764,11 @@ struct drm_connector {
|
|
struct drm_encoder *encoder;
|
|
|
|
#define MAX_ELD_BYTES 128
|
|
- /** @eld: EDID-like data, if present */
|
|
+ /** @eld: EDID-like data, if present, protected by @eld_mutex */
|
|
uint8_t eld[MAX_ELD_BYTES];
|
|
+ /** @eld_mutex: protection for concurrenct access to @eld */
|
|
+ struct mutex eld_mutex;
|
|
+
|
|
/** @latency_present: AV delay info from ELD, if found */
|
|
bool latency_present[2];
|
|
/**
|
|
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
|
|
index 8d51f69f9f5ef8..af9056d78fadff 100644
|
|
--- a/include/linux/binfmts.h
|
|
+++ b/include/linux/binfmts.h
|
|
@@ -42,7 +42,9 @@ struct linux_binprm {
|
|
* Set when errors can no longer be returned to the
|
|
* original userspace.
|
|
*/
|
|
- point_of_no_return:1;
|
|
+ point_of_no_return:1,
|
|
+ /* Set when "comm" must come from the dentry. */
|
|
+ comm_from_dentry:1;
|
|
struct file *executable; /* Executable to pass to the interpreter */
|
|
struct file *interpreter;
|
|
struct file *file;
|
|
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
|
|
index fb6c6109fdcad6..26a8c4ae224459 100644
|
|
--- a/include/linux/kvm_host.h
|
|
+++ b/include/linux/kvm_host.h
|
|
@@ -920,6 +920,15 @@ static inline struct kvm_io_bus *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx)
|
|
static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
|
|
{
|
|
int num_vcpus = atomic_read(&kvm->online_vcpus);
|
|
+
|
|
+ /*
|
|
+ * Explicitly verify the target vCPU is online, as the anti-speculation
|
|
+ * logic only limits the CPU's ability to speculate, e.g. given a "bad"
|
|
+ * index, clamping the index to 0 would return vCPU0, not NULL.
|
|
+ */
|
|
+ if (i >= num_vcpus)
|
|
+ return NULL;
|
|
+
|
|
i = array_index_nospec(i, num_vcpus);
|
|
|
|
/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu. */
|
|
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
|
|
index 38a8ff9c685cb8..69d844b34da0d3 100644
|
|
--- a/include/linux/mlx5/driver.h
|
|
+++ b/include/linux/mlx5/driver.h
|
|
@@ -709,7 +709,6 @@ struct mlx5_timer {
|
|
struct timecounter tc;
|
|
u32 nominal_c_mult;
|
|
unsigned long overflow_period;
|
|
- struct delayed_work overflow_work;
|
|
};
|
|
|
|
struct mlx5_clock {
|
|
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
|
|
index 326d3a322c109e..4ec2a948ae3dbb 100644
|
|
--- a/include/net/sch_generic.h
|
|
+++ b/include/net/sch_generic.h
|
|
@@ -849,7 +849,7 @@ static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|
}
|
|
|
|
static inline void _bstats_update(struct gnet_stats_basic_sync *bstats,
|
|
- __u64 bytes, __u32 packets)
|
|
+ __u64 bytes, __u64 packets)
|
|
{
|
|
u64_stats_update_begin(&bstats->syncp);
|
|
u64_stats_add(&bstats->bytes, bytes);
|
|
diff --git a/include/rv/da_monitor.h b/include/rv/da_monitor.h
|
|
index 9705b2a98e49e1..510c88bfabd433 100644
|
|
--- a/include/rv/da_monitor.h
|
|
+++ b/include/rv/da_monitor.h
|
|
@@ -14,6 +14,7 @@
|
|
#include <rv/automata.h>
|
|
#include <linux/rv.h>
|
|
#include <linux/bug.h>
|
|
+#include <linux/sched.h>
|
|
|
|
#ifdef CONFIG_RV_REACTORS
|
|
|
|
@@ -324,10 +325,13 @@ static inline struct da_monitor *da_get_monitor_##name(struct task_struct *tsk)
|
|
static void da_monitor_reset_all_##name(void) \
|
|
{ \
|
|
struct task_struct *g, *p; \
|
|
+ int cpu; \
|
|
\
|
|
read_lock(&tasklist_lock); \
|
|
for_each_process_thread(g, p) \
|
|
da_monitor_reset_##name(da_get_monitor_##name(p)); \
|
|
+ for_each_present_cpu(cpu) \
|
|
+ da_monitor_reset_##name(da_get_monitor_##name(idle_task(cpu))); \
|
|
read_unlock(&tasklist_lock); \
|
|
} \
|
|
\
|
|
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
|
|
index 252bb90aca599b..e7c7b638943629 100644
|
|
--- a/include/trace/events/rxrpc.h
|
|
+++ b/include/trace/events/rxrpc.h
|
|
@@ -214,6 +214,7 @@
|
|
EM(rxrpc_conn_get_conn_input, "GET inp-conn") \
|
|
EM(rxrpc_conn_get_idle, "GET idle ") \
|
|
EM(rxrpc_conn_get_poke_abort, "GET pk-abort") \
|
|
+ EM(rxrpc_conn_get_poke_secured, "GET secured ") \
|
|
EM(rxrpc_conn_get_poke_timer, "GET poke ") \
|
|
EM(rxrpc_conn_get_service_conn, "GET svc-conn") \
|
|
EM(rxrpc_conn_new_client, "NEW client ") \
|
|
diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
|
|
index a4206723f50333..5a199f3d4a26a2 100644
|
|
--- a/include/uapi/linux/input-event-codes.h
|
|
+++ b/include/uapi/linux/input-event-codes.h
|
|
@@ -519,6 +519,7 @@
|
|
#define KEY_NOTIFICATION_CENTER 0x1bc /* Show/hide the notification center */
|
|
#define KEY_PICKUP_PHONE 0x1bd /* Answer incoming call */
|
|
#define KEY_HANGUP_PHONE 0x1be /* Decline incoming call */
|
|
+#define KEY_LINK_PHONE 0x1bf /* AL Phone Syncing */
|
|
|
|
#define KEY_DEL_EOL 0x1c0
|
|
#define KEY_DEL_EOS 0x1c1
|
|
diff --git a/include/ufs/ufs.h b/include/ufs/ufs.h
|
|
index 0cced88f4531e8..49c90795a2a677 100644
|
|
--- a/include/ufs/ufs.h
|
|
+++ b/include/ufs/ufs.h
|
|
@@ -384,8 +384,8 @@ enum {
|
|
|
|
/* Possible values for dExtendedUFSFeaturesSupport */
|
|
enum {
|
|
- UFS_DEV_LOW_TEMP_NOTIF = BIT(4),
|
|
- UFS_DEV_HIGH_TEMP_NOTIF = BIT(5),
|
|
+ UFS_DEV_HIGH_TEMP_NOTIF = BIT(4),
|
|
+ UFS_DEV_LOW_TEMP_NOTIF = BIT(5),
|
|
UFS_DEV_EXT_TEMP_NOTIF = BIT(6),
|
|
UFS_DEV_HPB_SUPPORT = BIT(7),
|
|
UFS_DEV_WRITE_BOOSTER_SUP = BIT(8),
|
|
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
|
|
index c7198fbcf734f7..b61637dad442a7 100644
|
|
--- a/io_uring/io_uring.c
|
|
+++ b/io_uring/io_uring.c
|
|
@@ -1779,6 +1779,7 @@ int io_req_prep_async(struct io_kiocb *req)
|
|
{
|
|
const struct io_cold_def *cdef = &io_cold_defs[req->opcode];
|
|
const struct io_issue_def *def = &io_issue_defs[req->opcode];
|
|
+ int ret;
|
|
|
|
/* assign early for deferred execution for non-fixed file */
|
|
if (def->needs_file && !(req->flags & REQ_F_FIXED_FILE) && !req->file)
|
|
@@ -1791,7 +1792,9 @@ int io_req_prep_async(struct io_kiocb *req)
|
|
if (io_alloc_async_data(req))
|
|
return -EAGAIN;
|
|
}
|
|
- return cdef->prep_async(req);
|
|
+ ret = cdef->prep_async(req);
|
|
+ io_kbuf_recycle(req, 0);
|
|
+ return ret;
|
|
}
|
|
|
|
static u32 io_get_sequence(struct io_kiocb *req)
|
|
diff --git a/io_uring/net.c b/io_uring/net.c
|
|
index 7412904387bfa0..56091292950fd6 100644
|
|
--- a/io_uring/net.c
|
|
+++ b/io_uring/net.c
|
|
@@ -1533,6 +1533,11 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags)
|
|
io = &__io;
|
|
}
|
|
|
|
+ if (unlikely(req->flags & REQ_F_FAIL)) {
|
|
+ ret = -ECONNRESET;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
file_flags = force_nonblock ? O_NONBLOCK : 0;
|
|
|
|
ret = __sys_connect_file(req->file, &io->address,
|
|
diff --git a/io_uring/poll.c b/io_uring/poll.c
|
|
index 5cf4fffe8b6c81..cf8e86bc96deb5 100644
|
|
--- a/io_uring/poll.c
|
|
+++ b/io_uring/poll.c
|
|
@@ -308,6 +308,8 @@ static int io_poll_check_events(struct io_kiocb *req, struct io_tw_state *ts)
|
|
return IOU_POLL_REISSUE;
|
|
}
|
|
}
|
|
+ if (unlikely(req->cqe.res & EPOLLERR))
|
|
+ req_set_fail(req);
|
|
if (req->apoll_events & EPOLLONESHOT)
|
|
return IOU_POLL_DONE;
|
|
|
|
@@ -350,8 +352,10 @@ void io_poll_task_func(struct io_kiocb *req, struct io_tw_state *ts)
|
|
|
|
ret = io_poll_check_events(req, ts);
|
|
if (ret == IOU_POLL_NO_ACTION) {
|
|
+ io_kbuf_recycle(req, 0);
|
|
return;
|
|
} else if (ret == IOU_POLL_REQUEUE) {
|
|
+ io_kbuf_recycle(req, 0);
|
|
__io_poll_execute(req, 0);
|
|
return;
|
|
}
|
|
diff --git a/io_uring/rw.c b/io_uring/rw.c
|
|
index a62f84e28bac35..75b001febb4d28 100644
|
|
--- a/io_uring/rw.c
|
|
+++ b/io_uring/rw.c
|
|
@@ -793,6 +793,8 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags)
|
|
goto done;
|
|
ret = 0;
|
|
} else if (ret == -EIOCBQUEUED) {
|
|
+ req->flags |= REQ_F_PARTIAL_IO;
|
|
+ io_kbuf_recycle(req, issue_flags);
|
|
if (iovec)
|
|
kfree(iovec);
|
|
return IOU_ISSUE_SKIP_COMPLETE;
|
|
@@ -816,6 +818,9 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags)
|
|
goto done;
|
|
}
|
|
|
|
+ req->flags |= REQ_F_PARTIAL_IO;
|
|
+ io_kbuf_recycle(req, issue_flags);
|
|
+
|
|
io = req->async_data;
|
|
s = &io->s;
|
|
/*
|
|
@@ -956,6 +961,11 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags)
|
|
else
|
|
ret2 = -EINVAL;
|
|
|
|
+ if (ret2 == -EIOCBQUEUED) {
|
|
+ req->flags |= REQ_F_PARTIAL_IO;
|
|
+ io_kbuf_recycle(req, issue_flags);
|
|
+ }
|
|
+
|
|
if (req->flags & REQ_F_REISSUE) {
|
|
req->flags &= ~REQ_F_REISSUE;
|
|
ret2 = -EAGAIN;
|
|
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
|
|
index 0fca282c0a2547..dcdf449615bdac 100644
|
|
--- a/kernel/printk/printk.c
|
|
+++ b/kernel/printk/printk.c
|
|
@@ -474,7 +474,7 @@ static struct latched_seq clear_seq = {
|
|
/* record buffer */
|
|
#define LOG_ALIGN __alignof__(unsigned long)
|
|
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
|
|
-#define LOG_BUF_LEN_MAX (u32)(1 << 31)
|
|
+#define LOG_BUF_LEN_MAX ((u32)1 << 31)
|
|
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
|
|
static char *log_buf = __log_buf;
|
|
static u32 log_buf_len = __LOG_BUF_LEN;
|
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
|
index 86606fb9e6bc6c..c686d826a91cf5 100644
|
|
--- a/kernel/sched/core.c
|
|
+++ b/kernel/sched/core.c
|
|
@@ -726,13 +726,15 @@ static void update_rq_clock_task(struct rq *rq, s64 delta)
|
|
#endif
|
|
#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING
|
|
if (static_key_false((¶virt_steal_rq_enabled))) {
|
|
- steal = paravirt_steal_clock(cpu_of(rq));
|
|
+ u64 prev_steal;
|
|
+
|
|
+ steal = prev_steal = paravirt_steal_clock(cpu_of(rq));
|
|
steal -= rq->prev_steal_time_rq;
|
|
|
|
if (unlikely(steal > delta))
|
|
steal = delta;
|
|
|
|
- rq->prev_steal_time_rq += steal;
|
|
+ rq->prev_steal_time_rq = prev_steal;
|
|
delta -= steal;
|
|
}
|
|
#endif
|
|
diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
|
|
index 3e2bc029fa8c83..cc155590018f65 100644
|
|
--- a/kernel/trace/trace_osnoise.c
|
|
+++ b/kernel/trace/trace_osnoise.c
|
|
@@ -1235,6 +1235,8 @@ static void trace_sched_migrate_callback(void *data, struct task_struct *p, int
|
|
}
|
|
}
|
|
|
|
+static bool monitor_enabled;
|
|
+
|
|
static int register_migration_monitor(void)
|
|
{
|
|
int ret = 0;
|
|
@@ -1243,16 +1245,25 @@ static int register_migration_monitor(void)
|
|
* Timerlat thread migration check is only required when running timerlat in user-space.
|
|
* Thus, enable callback only if timerlat is set with no workload.
|
|
*/
|
|
- if (timerlat_enabled() && !test_bit(OSN_WORKLOAD, &osnoise_options))
|
|
+ if (timerlat_enabled() && !test_bit(OSN_WORKLOAD, &osnoise_options)) {
|
|
+ if (WARN_ON_ONCE(monitor_enabled))
|
|
+ return 0;
|
|
+
|
|
ret = register_trace_sched_migrate_task(trace_sched_migrate_callback, NULL);
|
|
+ if (!ret)
|
|
+ monitor_enabled = true;
|
|
+ }
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void unregister_migration_monitor(void)
|
|
{
|
|
- if (timerlat_enabled() && !test_bit(OSN_WORKLOAD, &osnoise_options))
|
|
- unregister_trace_sched_migrate_task(trace_sched_migrate_callback, NULL);
|
|
+ if (!monitor_enabled)
|
|
+ return;
|
|
+
|
|
+ unregister_trace_sched_migrate_task(trace_sched_migrate_callback, NULL);
|
|
+ monitor_enabled = false;
|
|
}
|
|
#else
|
|
static int register_migration_monitor(void)
|
|
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
|
index f94c3e957b8298..e809b6d8bc5373 100644
|
|
--- a/lib/Kconfig.debug
|
|
+++ b/lib/Kconfig.debug
|
|
@@ -1454,7 +1454,7 @@ config LOCKDEP_SMALL
|
|
config LOCKDEP_BITS
|
|
int "Bitsize for MAX_LOCKDEP_ENTRIES"
|
|
depends on LOCKDEP && !LOCKDEP_SMALL
|
|
- range 10 30
|
|
+ range 10 24
|
|
default 15
|
|
help
|
|
Try increasing this value if you hit "BUG: MAX_LOCKDEP_ENTRIES too low!" message.
|
|
@@ -1470,7 +1470,7 @@ config LOCKDEP_CHAINS_BITS
|
|
config LOCKDEP_STACK_TRACE_BITS
|
|
int "Bitsize for MAX_STACK_TRACE_ENTRIES"
|
|
depends on LOCKDEP && !LOCKDEP_SMALL
|
|
- range 10 30
|
|
+ range 10 26
|
|
default 19
|
|
help
|
|
Try increasing this value if you hit "BUG: MAX_STACK_TRACE_ENTRIES too low!" message.
|
|
@@ -1478,7 +1478,7 @@ config LOCKDEP_STACK_TRACE_BITS
|
|
config LOCKDEP_STACK_TRACE_HASH_BITS
|
|
int "Bitsize for STACK_TRACE_HASH_SIZE"
|
|
depends on LOCKDEP && !LOCKDEP_SMALL
|
|
- range 10 30
|
|
+ range 10 26
|
|
default 14
|
|
help
|
|
Try increasing this value if you need large STACK_TRACE_HASH_SIZE.
|
|
@@ -1486,7 +1486,7 @@ config LOCKDEP_STACK_TRACE_HASH_BITS
|
|
config LOCKDEP_CIRCULAR_QUEUE_BITS
|
|
int "Bitsize for elements in circular_queue struct"
|
|
depends on LOCKDEP
|
|
- range 10 30
|
|
+ range 10 26
|
|
default 12
|
|
help
|
|
Try increasing this value if you hit "lockdep bfs error:-1" warning due to __cq_enqueue() failure.
|
|
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
|
|
index 4eda9490636024..a4a2592413b1b6 100644
|
|
--- a/lib/maple_tree.c
|
|
+++ b/lib/maple_tree.c
|
|
@@ -1870,11 +1870,11 @@ static inline int mab_no_null_split(struct maple_big_node *b_node,
|
|
* Return: The first split location. The middle split is set in @mid_split.
|
|
*/
|
|
static inline int mab_calc_split(struct ma_state *mas,
|
|
- struct maple_big_node *bn, unsigned char *mid_split, unsigned long min)
|
|
+ struct maple_big_node *bn, unsigned char *mid_split)
|
|
{
|
|
unsigned char b_end = bn->b_end;
|
|
int split = b_end / 2; /* Assume equal split. */
|
|
- unsigned char slot_min, slot_count = mt_slots[bn->type];
|
|
+ unsigned char slot_count = mt_slots[bn->type];
|
|
|
|
/*
|
|
* To support gap tracking, all NULL entries are kept together and a node cannot
|
|
@@ -1907,18 +1907,7 @@ static inline int mab_calc_split(struct ma_state *mas,
|
|
split = b_end / 3;
|
|
*mid_split = split * 2;
|
|
} else {
|
|
- slot_min = mt_min_slots[bn->type];
|
|
-
|
|
*mid_split = 0;
|
|
- /*
|
|
- * Avoid having a range less than the slot count unless it
|
|
- * causes one node to be deficient.
|
|
- * NOTE: mt_min_slots is 1 based, b_end and split are zero.
|
|
- */
|
|
- while ((split < slot_count - 1) &&
|
|
- ((bn->pivot[split] - min) < slot_count - 1) &&
|
|
- (b_end - split > slot_min))
|
|
- split++;
|
|
}
|
|
|
|
/* Avoid ending a node on a NULL entry */
|
|
@@ -2402,7 +2391,7 @@ static inline struct maple_enode
|
|
static inline unsigned char mas_mab_to_node(struct ma_state *mas,
|
|
struct maple_big_node *b_node, struct maple_enode **left,
|
|
struct maple_enode **right, struct maple_enode **middle,
|
|
- unsigned char *mid_split, unsigned long min)
|
|
+ unsigned char *mid_split)
|
|
{
|
|
unsigned char split = 0;
|
|
unsigned char slot_count = mt_slots[b_node->type];
|
|
@@ -2415,7 +2404,7 @@ static inline unsigned char mas_mab_to_node(struct ma_state *mas,
|
|
if (b_node->b_end < slot_count) {
|
|
split = b_node->b_end;
|
|
} else {
|
|
- split = mab_calc_split(mas, b_node, mid_split, min);
|
|
+ split = mab_calc_split(mas, b_node, mid_split);
|
|
*right = mas_new_ma_node(mas, b_node);
|
|
}
|
|
|
|
@@ -2905,7 +2894,7 @@ static int mas_spanning_rebalance(struct ma_state *mas,
|
|
mast->bn->b_end--;
|
|
mast->bn->type = mte_node_type(mast->orig_l->node);
|
|
split = mas_mab_to_node(mas, mast->bn, &left, &right, &middle,
|
|
- &mid_split, mast->orig_l->min);
|
|
+ &mid_split);
|
|
mast_set_split_parents(mast, left, middle, right, split,
|
|
mid_split);
|
|
mast_cp_to_nodes(mast, left, middle, right, split, mid_split);
|
|
@@ -3413,7 +3402,7 @@ static int mas_split(struct ma_state *mas, struct maple_big_node *b_node)
|
|
if (mas_push_data(mas, height, &mast, false))
|
|
break;
|
|
|
|
- split = mab_calc_split(mas, b_node, &mid_split, prev_l_mas.min);
|
|
+ split = mab_calc_split(mas, b_node, &mid_split);
|
|
mast_split_data(&mast, mas, split);
|
|
/*
|
|
* Usually correct, mab_mas_cp in the above call overwrites
|
|
diff --git a/mm/kfence/core.c b/mm/kfence/core.c
|
|
index 3872528d096380..937bbae2611fee 100644
|
|
--- a/mm/kfence/core.c
|
|
+++ b/mm/kfence/core.c
|
|
@@ -21,6 +21,7 @@
|
|
#include <linux/log2.h>
|
|
#include <linux/memblock.h>
|
|
#include <linux/moduleparam.h>
|
|
+#include <linux/nodemask.h>
|
|
#include <linux/notifier.h>
|
|
#include <linux/panic_notifier.h>
|
|
#include <linux/random.h>
|
|
@@ -1065,6 +1066,7 @@ void *__kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)
|
|
* properties (e.g. reside in DMAable memory).
|
|
*/
|
|
if ((flags & GFP_ZONEMASK) ||
|
|
+ ((flags & __GFP_THISNODE) && num_online_nodes() > 1) ||
|
|
(s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32))) {
|
|
atomic_long_inc(&counters[KFENCE_COUNTER_SKIP_INCOMPAT]);
|
|
return NULL;
|
|
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
|
|
index 5811a11cc53a6d..f86d4e04d95e12 100644
|
|
--- a/mm/kmemleak.c
|
|
+++ b/mm/kmemleak.c
|
|
@@ -1549,7 +1549,7 @@ static void kmemleak_scan(void)
|
|
unsigned long phys = object->pointer;
|
|
|
|
if (PHYS_PFN(phys) < min_low_pfn ||
|
|
- PHYS_PFN(phys + object->size) >= max_low_pfn)
|
|
+ PHYS_PFN(phys + object->size) > max_low_pfn)
|
|
__paint_it(object, KMEMLEAK_BLACK);
|
|
}
|
|
|
|
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
|
|
index 379ca86c41cd5b..3451c64fc42dce 100644
|
|
--- a/net/bluetooth/l2cap_sock.c
|
|
+++ b/net/bluetooth/l2cap_sock.c
|
|
@@ -709,12 +709,12 @@ static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
|
|
{
|
|
switch (chan->scid) {
|
|
case L2CAP_CID_ATT:
|
|
- if (mtu < L2CAP_LE_MIN_MTU)
|
|
+ if (mtu && mtu < L2CAP_LE_MIN_MTU)
|
|
return false;
|
|
break;
|
|
|
|
default:
|
|
- if (mtu < L2CAP_DEFAULT_MIN_MTU)
|
|
+ if (mtu && mtu < L2CAP_DEFAULT_MIN_MTU)
|
|
return false;
|
|
}
|
|
|
|
@@ -1885,7 +1885,8 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
|
|
chan = l2cap_chan_create();
|
|
if (!chan) {
|
|
sk_free(sk);
|
|
- sock->sk = NULL;
|
|
+ if (sock)
|
|
+ sock->sk = NULL;
|
|
return NULL;
|
|
}
|
|
|
|
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
|
|
index e3440f0d7d9d97..b36254107ef578 100644
|
|
--- a/net/bluetooth/mgmt.c
|
|
+++ b/net/bluetooth/mgmt.c
|
|
@@ -5453,10 +5453,16 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev,
|
|
{
|
|
struct mgmt_rp_remove_adv_monitor rp;
|
|
struct mgmt_pending_cmd *cmd = data;
|
|
- struct mgmt_cp_remove_adv_monitor *cp = cmd->param;
|
|
+ struct mgmt_cp_remove_adv_monitor *cp;
|
|
+
|
|
+ if (status == -ECANCELED ||
|
|
+ cmd != pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev))
|
|
+ return;
|
|
|
|
hci_dev_lock(hdev);
|
|
|
|
+ cp = cmd->param;
|
|
+
|
|
rp.monitor_handle = cp->monitor_handle;
|
|
|
|
if (!status)
|
|
@@ -5474,6 +5480,10 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev,
|
|
static int mgmt_remove_adv_monitor_sync(struct hci_dev *hdev, void *data)
|
|
{
|
|
struct mgmt_pending_cmd *cmd = data;
|
|
+
|
|
+ if (cmd != pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev))
|
|
+ return -ECANCELED;
|
|
+
|
|
struct mgmt_cp_remove_adv_monitor *cp = cmd->param;
|
|
u16 handle = __le16_to_cpu(cp->monitor_handle);
|
|
|
|
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
index 2e4e5356039480..b84d18fcd9e2cd 100644
|
|
--- a/net/ipv4/udp.c
|
|
+++ b/net/ipv4/udp.c
|
|
@@ -930,9 +930,9 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4,
|
|
const int hlen = skb_network_header_len(skb) +
|
|
sizeof(struct udphdr);
|
|
|
|
- if (hlen + cork->gso_size > cork->fragsize) {
|
|
+ if (hlen + min(datalen, cork->gso_size) > cork->fragsize) {
|
|
kfree_skb(skb);
|
|
- return -EINVAL;
|
|
+ return -EMSGSIZE;
|
|
}
|
|
if (datalen > cork->gso_size * UDP_MAX_SEGMENTS) {
|
|
kfree_skb(skb);
|
|
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
|
index 954afe6ba883e7..9ff8e723402ba8 100644
|
|
--- a/net/ipv6/udp.c
|
|
+++ b/net/ipv6/udp.c
|
|
@@ -1246,9 +1246,9 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
|
|
const int hlen = skb_network_header_len(skb) +
|
|
sizeof(struct udphdr);
|
|
|
|
- if (hlen + cork->gso_size > cork->fragsize) {
|
|
+ if (hlen + min(datalen, cork->gso_size) > cork->fragsize) {
|
|
kfree_skb(skb);
|
|
- return -EINVAL;
|
|
+ return -EMSGSIZE;
|
|
}
|
|
if (datalen > cork->gso_size * UDP_MAX_SEGMENTS) {
|
|
kfree_skb(skb);
|
|
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
|
|
index 2cf4393e48dc06..2b63c5492eedc2 100644
|
|
--- a/net/mptcp/pm_netlink.c
|
|
+++ b/net/mptcp/pm_netlink.c
|
|
@@ -2069,7 +2069,8 @@ int mptcp_pm_nl_set_flags(struct net *net, struct mptcp_pm_addr_entry *addr, u8
|
|
return -EINVAL;
|
|
}
|
|
if ((addr->flags & MPTCP_PM_ADDR_FLAG_FULLMESH) &&
|
|
- (entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
|
|
+ (entry->flags & (MPTCP_PM_ADDR_FLAG_SIGNAL |
|
|
+ MPTCP_PM_ADDR_FLAG_IMPLICIT))) {
|
|
spin_unlock_bh(&pernet->lock);
|
|
return -EINVAL;
|
|
}
|
|
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
|
|
index 5143214695dcd8..140c3ffcb86ba0 100644
|
|
--- a/net/mptcp/protocol.c
|
|
+++ b/net/mptcp/protocol.c
|
|
@@ -138,6 +138,7 @@ static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
|
|
int delta;
|
|
|
|
if (MPTCP_SKB_CB(from)->offset ||
|
|
+ ((to->len + from->len) > (sk->sk_rcvbuf >> 3)) ||
|
|
!skb_try_coalesce(to, from, &fragstolen, &delta))
|
|
return false;
|
|
|
|
diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h
|
|
index ef0f8f73826f53..4e0842df5234ea 100644
|
|
--- a/net/ncsi/internal.h
|
|
+++ b/net/ncsi/internal.h
|
|
@@ -289,6 +289,7 @@ enum {
|
|
ncsi_dev_state_config_sp = 0x0301,
|
|
ncsi_dev_state_config_cis,
|
|
ncsi_dev_state_config_oem_gma,
|
|
+ ncsi_dev_state_config_apply_mac,
|
|
ncsi_dev_state_config_clear_vids,
|
|
ncsi_dev_state_config_svf,
|
|
ncsi_dev_state_config_ev,
|
|
@@ -322,6 +323,7 @@ struct ncsi_dev_priv {
|
|
#define NCSI_DEV_RESHUFFLE 4
|
|
#define NCSI_DEV_RESET 8 /* Reset state of NC */
|
|
unsigned int gma_flag; /* OEM GMA flag */
|
|
+ struct sockaddr pending_mac; /* MAC address received from GMA */
|
|
spinlock_t lock; /* Protect the NCSI device */
|
|
unsigned int package_probe_id;/* Current ID during probe */
|
|
unsigned int package_num; /* Number of packages */
|
|
diff --git a/net/ncsi/ncsi-cmd.c b/net/ncsi/ncsi-cmd.c
|
|
index fd2236ee9a79d3..b3ff37a181d73e 100644
|
|
--- a/net/ncsi/ncsi-cmd.c
|
|
+++ b/net/ncsi/ncsi-cmd.c
|
|
@@ -270,7 +270,8 @@ static struct ncsi_cmd_handler {
|
|
{ NCSI_PKT_CMD_GPS, 0, ncsi_cmd_handler_default },
|
|
{ NCSI_PKT_CMD_OEM, -1, ncsi_cmd_handler_oem },
|
|
{ NCSI_PKT_CMD_PLDM, 0, NULL },
|
|
- { NCSI_PKT_CMD_GPUUID, 0, ncsi_cmd_handler_default }
|
|
+ { NCSI_PKT_CMD_GPUUID, 0, ncsi_cmd_handler_default },
|
|
+ { NCSI_PKT_CMD_GMCMA, 0, ncsi_cmd_handler_default }
|
|
};
|
|
|
|
static struct ncsi_request *ncsi_alloc_command(struct ncsi_cmd_arg *nca)
|
|
diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
|
|
index 90c6cf676221af..a5d3615d7996e6 100644
|
|
--- a/net/ncsi/ncsi-manage.c
|
|
+++ b/net/ncsi/ncsi-manage.c
|
|
@@ -1038,17 +1038,34 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
|
|
: ncsi_dev_state_config_clear_vids;
|
|
break;
|
|
case ncsi_dev_state_config_oem_gma:
|
|
- nd->state = ncsi_dev_state_config_clear_vids;
|
|
+ nd->state = ncsi_dev_state_config_apply_mac;
|
|
|
|
- nca.type = NCSI_PKT_CMD_OEM;
|
|
nca.package = np->id;
|
|
nca.channel = nc->id;
|
|
ndp->pending_req_num = 1;
|
|
- ret = ncsi_gma_handler(&nca, nc->version.mf_id);
|
|
- if (ret < 0)
|
|
+ if (nc->version.major >= 1 && nc->version.minor >= 2) {
|
|
+ nca.type = NCSI_PKT_CMD_GMCMA;
|
|
+ ret = ncsi_xmit_cmd(&nca);
|
|
+ } else {
|
|
+ nca.type = NCSI_PKT_CMD_OEM;
|
|
+ ret = ncsi_gma_handler(&nca, nc->version.mf_id);
|
|
+ }
|
|
+ if (ret < 0) {
|
|
+ nd->state = ncsi_dev_state_config_clear_vids;
|
|
schedule_work(&ndp->work);
|
|
+ }
|
|
|
|
break;
|
|
+ case ncsi_dev_state_config_apply_mac:
|
|
+ rtnl_lock();
|
|
+ ret = dev_set_mac_address(dev, &ndp->pending_mac, NULL);
|
|
+ rtnl_unlock();
|
|
+ if (ret < 0)
|
|
+ netdev_warn(dev, "NCSI: 'Writing MAC address to device failed\n");
|
|
+
|
|
+ nd->state = ncsi_dev_state_config_clear_vids;
|
|
+
|
|
+ fallthrough;
|
|
case ncsi_dev_state_config_clear_vids:
|
|
case ncsi_dev_state_config_svf:
|
|
case ncsi_dev_state_config_ev:
|
|
@@ -1368,6 +1385,12 @@ static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
|
|
nd->state = ncsi_dev_state_probe_package;
|
|
break;
|
|
case ncsi_dev_state_probe_package:
|
|
+ if (ndp->package_probe_id >= 8) {
|
|
+ /* Last package probed, finishing */
|
|
+ ndp->flags |= NCSI_DEV_PROBED;
|
|
+ break;
|
|
+ }
|
|
+
|
|
ndp->pending_req_num = 1;
|
|
|
|
nca.type = NCSI_PKT_CMD_SP;
|
|
@@ -1484,13 +1507,8 @@ static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
|
|
if (ret)
|
|
goto error;
|
|
|
|
- /* Probe next package */
|
|
+ /* Probe next package after receiving response */
|
|
ndp->package_probe_id++;
|
|
- if (ndp->package_probe_id >= 8) {
|
|
- /* Probe finished */
|
|
- ndp->flags |= NCSI_DEV_PROBED;
|
|
- break;
|
|
- }
|
|
nd->state = ncsi_dev_state_probe_package;
|
|
ndp->active_package = NULL;
|
|
break;
|
|
diff --git a/net/ncsi/ncsi-pkt.h b/net/ncsi/ncsi-pkt.h
|
|
index c9d1da34dc4dc5..f2f3b5c1b94126 100644
|
|
--- a/net/ncsi/ncsi-pkt.h
|
|
+++ b/net/ncsi/ncsi-pkt.h
|
|
@@ -338,6 +338,14 @@ struct ncsi_rsp_gpuuid_pkt {
|
|
__be32 checksum;
|
|
};
|
|
|
|
+/* Get MC MAC Address */
|
|
+struct ncsi_rsp_gmcma_pkt {
|
|
+ struct ncsi_rsp_pkt_hdr rsp;
|
|
+ unsigned char address_count;
|
|
+ unsigned char reserved[3];
|
|
+ unsigned char addresses[][ETH_ALEN];
|
|
+};
|
|
+
|
|
/* AEN: Link State Change */
|
|
struct ncsi_aen_lsc_pkt {
|
|
struct ncsi_aen_pkt_hdr aen; /* AEN header */
|
|
@@ -398,6 +406,7 @@ struct ncsi_aen_hncdsc_pkt {
|
|
#define NCSI_PKT_CMD_GPUUID 0x52 /* Get package UUID */
|
|
#define NCSI_PKT_CMD_QPNPR 0x56 /* Query Pending NC PLDM request */
|
|
#define NCSI_PKT_CMD_SNPR 0x57 /* Send NC PLDM Reply */
|
|
+#define NCSI_PKT_CMD_GMCMA 0x58 /* Get MC MAC Address */
|
|
|
|
|
|
/* NCSI packet responses */
|
|
@@ -433,6 +442,7 @@ struct ncsi_aen_hncdsc_pkt {
|
|
#define NCSI_PKT_RSP_GPUUID (NCSI_PKT_CMD_GPUUID + 0x80)
|
|
#define NCSI_PKT_RSP_QPNPR (NCSI_PKT_CMD_QPNPR + 0x80)
|
|
#define NCSI_PKT_RSP_SNPR (NCSI_PKT_CMD_SNPR + 0x80)
|
|
+#define NCSI_PKT_RSP_GMCMA (NCSI_PKT_CMD_GMCMA + 0x80)
|
|
|
|
/* NCSI response code/reason */
|
|
#define NCSI_PKT_RSP_C_COMPLETED 0x0000 /* Command Completed */
|
|
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
|
|
index f22d67cb04d371..4a8ce2949faeac 100644
|
|
--- a/net/ncsi/ncsi-rsp.c
|
|
+++ b/net/ncsi/ncsi-rsp.c
|
|
@@ -628,16 +628,14 @@ static int ncsi_rsp_handler_snfc(struct ncsi_request *nr)
|
|
static int ncsi_rsp_handler_oem_gma(struct ncsi_request *nr, int mfr_id)
|
|
{
|
|
struct ncsi_dev_priv *ndp = nr->ndp;
|
|
+ struct sockaddr *saddr = &ndp->pending_mac;
|
|
struct net_device *ndev = ndp->ndev.dev;
|
|
struct ncsi_rsp_oem_pkt *rsp;
|
|
- struct sockaddr saddr;
|
|
u32 mac_addr_off = 0;
|
|
- int ret = 0;
|
|
|
|
/* Get the response header */
|
|
rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
|
|
|
|
- saddr.sa_family = ndev->type;
|
|
ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
|
if (mfr_id == NCSI_OEM_MFR_BCM_ID)
|
|
mac_addr_off = BCM_MAC_ADDR_OFFSET;
|
|
@@ -646,22 +644,17 @@ static int ncsi_rsp_handler_oem_gma(struct ncsi_request *nr, int mfr_id)
|
|
else if (mfr_id == NCSI_OEM_MFR_INTEL_ID)
|
|
mac_addr_off = INTEL_MAC_ADDR_OFFSET;
|
|
|
|
- memcpy(saddr.sa_data, &rsp->data[mac_addr_off], ETH_ALEN);
|
|
+ saddr->sa_family = ndev->type;
|
|
+ memcpy(saddr->sa_data, &rsp->data[mac_addr_off], ETH_ALEN);
|
|
if (mfr_id == NCSI_OEM_MFR_BCM_ID || mfr_id == NCSI_OEM_MFR_INTEL_ID)
|
|
- eth_addr_inc((u8 *)saddr.sa_data);
|
|
- if (!is_valid_ether_addr((const u8 *)saddr.sa_data))
|
|
+ eth_addr_inc((u8 *)saddr->sa_data);
|
|
+ if (!is_valid_ether_addr((const u8 *)saddr->sa_data))
|
|
return -ENXIO;
|
|
|
|
/* Set the flag for GMA command which should only be called once */
|
|
ndp->gma_flag = 1;
|
|
|
|
- rtnl_lock();
|
|
- ret = dev_set_mac_address(ndev, &saddr, NULL);
|
|
- rtnl_unlock();
|
|
- if (ret < 0)
|
|
- netdev_warn(ndev, "NCSI: 'Writing mac address to device failed\n");
|
|
-
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
/* Response handler for Mellanox card */
|
|
@@ -1093,6 +1086,42 @@ static int ncsi_rsp_handler_netlink(struct ncsi_request *nr)
|
|
return ret;
|
|
}
|
|
|
|
+static int ncsi_rsp_handler_gmcma(struct ncsi_request *nr)
|
|
+{
|
|
+ struct ncsi_dev_priv *ndp = nr->ndp;
|
|
+ struct sockaddr *saddr = &ndp->pending_mac;
|
|
+ struct net_device *ndev = ndp->ndev.dev;
|
|
+ struct ncsi_rsp_gmcma_pkt *rsp;
|
|
+ int i;
|
|
+
|
|
+ rsp = (struct ncsi_rsp_gmcma_pkt *)skb_network_header(nr->rsp);
|
|
+ ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
|
+
|
|
+ netdev_info(ndev, "NCSI: Received %d provisioned MAC addresses\n",
|
|
+ rsp->address_count);
|
|
+ for (i = 0; i < rsp->address_count; i++) {
|
|
+ netdev_info(ndev, "NCSI: MAC address %d: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
+ i, rsp->addresses[i][0], rsp->addresses[i][1],
|
|
+ rsp->addresses[i][2], rsp->addresses[i][3],
|
|
+ rsp->addresses[i][4], rsp->addresses[i][5]);
|
|
+ }
|
|
+
|
|
+ saddr->sa_family = ndev->type;
|
|
+ for (i = 0; i < rsp->address_count; i++) {
|
|
+ if (!is_valid_ether_addr(rsp->addresses[i])) {
|
|
+ netdev_warn(ndev, "NCSI: Unable to assign %pM to device\n",
|
|
+ rsp->addresses[i]);
|
|
+ continue;
|
|
+ }
|
|
+ memcpy(saddr->sa_data, rsp->addresses[i], ETH_ALEN);
|
|
+ netdev_warn(ndev, "NCSI: Will set MAC address to %pM\n", saddr->sa_data);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ ndp->gma_flag = 1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static struct ncsi_rsp_handler {
|
|
unsigned char type;
|
|
int payload;
|
|
@@ -1129,7 +1158,8 @@ static struct ncsi_rsp_handler {
|
|
{ NCSI_PKT_RSP_PLDM, -1, ncsi_rsp_handler_pldm },
|
|
{ NCSI_PKT_RSP_GPUUID, 20, ncsi_rsp_handler_gpuuid },
|
|
{ NCSI_PKT_RSP_QPNPR, -1, ncsi_rsp_handler_pldm },
|
|
- { NCSI_PKT_RSP_SNPR, -1, ncsi_rsp_handler_pldm }
|
|
+ { NCSI_PKT_RSP_SNPR, -1, ncsi_rsp_handler_pldm },
|
|
+ { NCSI_PKT_RSP_GMCMA, -1, ncsi_rsp_handler_gmcma },
|
|
};
|
|
|
|
int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev,
|
|
diff --git a/net/nfc/nci/hci.c b/net/nfc/nci/hci.c
|
|
index de175318a3a0f3..082ab66f120b73 100644
|
|
--- a/net/nfc/nci/hci.c
|
|
+++ b/net/nfc/nci/hci.c
|
|
@@ -542,6 +542,8 @@ static u8 nci_hci_create_pipe(struct nci_dev *ndev, u8 dest_host,
|
|
|
|
pr_debug("pipe created=%d\n", pipe);
|
|
|
|
+ if (pipe >= NCI_HCI_MAX_PIPES)
|
|
+ pipe = NCI_HCI_INVALID_PIPE;
|
|
return pipe;
|
|
}
|
|
|
|
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
|
|
index 342823b918e7cc..66e9ceaaa43a14 100644
|
|
--- a/net/rose/af_rose.c
|
|
+++ b/net/rose/af_rose.c
|
|
@@ -701,11 +701,9 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|
struct net_device *dev;
|
|
ax25_address *source;
|
|
ax25_uid_assoc *user;
|
|
+ int err = -EINVAL;
|
|
int n;
|
|
|
|
- if (!sock_flag(sk, SOCK_ZAPPED))
|
|
- return -EINVAL;
|
|
-
|
|
if (addr_len != sizeof(struct sockaddr_rose) && addr_len != sizeof(struct full_sockaddr_rose))
|
|
return -EINVAL;
|
|
|
|
@@ -718,8 +716,15 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|
if ((unsigned int) addr->srose_ndigis > ROSE_MAX_DIGIS)
|
|
return -EINVAL;
|
|
|
|
- if ((dev = rose_dev_get(&addr->srose_addr)) == NULL)
|
|
- return -EADDRNOTAVAIL;
|
|
+ lock_sock(sk);
|
|
+
|
|
+ if (!sock_flag(sk, SOCK_ZAPPED))
|
|
+ goto out_release;
|
|
+
|
|
+ err = -EADDRNOTAVAIL;
|
|
+ dev = rose_dev_get(&addr->srose_addr);
|
|
+ if (!dev)
|
|
+ goto out_release;
|
|
|
|
source = &addr->srose_call;
|
|
|
|
@@ -730,7 +735,8 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|
} else {
|
|
if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
|
|
dev_put(dev);
|
|
- return -EACCES;
|
|
+ err = -EACCES;
|
|
+ goto out_release;
|
|
}
|
|
rose->source_call = *source;
|
|
}
|
|
@@ -753,8 +759,10 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|
rose_insert_socket(sk);
|
|
|
|
sock_reset_flag(sk, SOCK_ZAPPED);
|
|
-
|
|
- return 0;
|
|
+ err = 0;
|
|
+out_release:
|
|
+ release_sock(sk);
|
|
+ return err;
|
|
}
|
|
|
|
static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags)
|
|
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
|
|
index 66ad7dc10864e0..86438c86eb2fd3 100644
|
|
--- a/net/rxrpc/ar-internal.h
|
|
+++ b/net/rxrpc/ar-internal.h
|
|
@@ -558,6 +558,7 @@ enum rxrpc_call_flag {
|
|
RXRPC_CALL_EXCLUSIVE, /* The call uses a once-only connection */
|
|
RXRPC_CALL_RX_IS_IDLE, /* recvmsg() is idle - send an ACK */
|
|
RXRPC_CALL_RECVMSG_READ_ALL, /* recvmsg() read all of the received data */
|
|
+ RXRPC_CALL_CONN_CHALLENGING, /* The connection is being challenged */
|
|
};
|
|
|
|
/*
|
|
@@ -578,7 +579,6 @@ enum rxrpc_call_state {
|
|
RXRPC_CALL_CLIENT_AWAIT_REPLY, /* - client awaiting reply */
|
|
RXRPC_CALL_CLIENT_RECV_REPLY, /* - client receiving reply phase */
|
|
RXRPC_CALL_SERVER_PREALLOC, /* - service preallocation */
|
|
- RXRPC_CALL_SERVER_SECURING, /* - server securing request connection */
|
|
RXRPC_CALL_SERVER_RECV_REQUEST, /* - server receiving request */
|
|
RXRPC_CALL_SERVER_ACK_REQUEST, /* - server pending ACK of request */
|
|
RXRPC_CALL_SERVER_SEND_REPLY, /* - server sending reply */
|
|
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c
|
|
index 29385908099efc..4f8e8f884d102c 100644
|
|
--- a/net/rxrpc/call_object.c
|
|
+++ b/net/rxrpc/call_object.c
|
|
@@ -22,7 +22,6 @@ const char *const rxrpc_call_states[NR__RXRPC_CALL_STATES] = {
|
|
[RXRPC_CALL_CLIENT_AWAIT_REPLY] = "ClAwtRpl",
|
|
[RXRPC_CALL_CLIENT_RECV_REPLY] = "ClRcvRpl",
|
|
[RXRPC_CALL_SERVER_PREALLOC] = "SvPrealc",
|
|
- [RXRPC_CALL_SERVER_SECURING] = "SvSecure",
|
|
[RXRPC_CALL_SERVER_RECV_REQUEST] = "SvRcvReq",
|
|
[RXRPC_CALL_SERVER_ACK_REQUEST] = "SvAckReq",
|
|
[RXRPC_CALL_SERVER_SEND_REPLY] = "SvSndRpl",
|
|
@@ -458,17 +457,16 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx,
|
|
call->cong_tstamp = skb->tstamp;
|
|
|
|
__set_bit(RXRPC_CALL_EXPOSED, &call->flags);
|
|
- rxrpc_set_call_state(call, RXRPC_CALL_SERVER_SECURING);
|
|
+ rxrpc_set_call_state(call, RXRPC_CALL_SERVER_RECV_REQUEST);
|
|
|
|
spin_lock(&conn->state_lock);
|
|
|
|
switch (conn->state) {
|
|
case RXRPC_CONN_SERVICE_UNSECURED:
|
|
case RXRPC_CONN_SERVICE_CHALLENGING:
|
|
- rxrpc_set_call_state(call, RXRPC_CALL_SERVER_SECURING);
|
|
+ __set_bit(RXRPC_CALL_CONN_CHALLENGING, &call->flags);
|
|
break;
|
|
case RXRPC_CONN_SERVICE:
|
|
- rxrpc_set_call_state(call, RXRPC_CALL_SERVER_RECV_REQUEST);
|
|
break;
|
|
|
|
case RXRPC_CONN_ABORTED:
|
|
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c
|
|
index 2a1396cd892f30..c4eb7986efddf8 100644
|
|
--- a/net/rxrpc/conn_event.c
|
|
+++ b/net/rxrpc/conn_event.c
|
|
@@ -222,10 +222,8 @@ static void rxrpc_abort_calls(struct rxrpc_connection *conn)
|
|
*/
|
|
static void rxrpc_call_is_secure(struct rxrpc_call *call)
|
|
{
|
|
- if (call && __rxrpc_call_state(call) == RXRPC_CALL_SERVER_SECURING) {
|
|
- rxrpc_set_call_state(call, RXRPC_CALL_SERVER_RECV_REQUEST);
|
|
+ if (call && __test_and_clear_bit(RXRPC_CALL_CONN_CHALLENGING, &call->flags))
|
|
rxrpc_notify_socket(call);
|
|
- }
|
|
}
|
|
|
|
/*
|
|
@@ -266,6 +264,7 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
|
* we've already received the packet, put it on the
|
|
* front of the queue.
|
|
*/
|
|
+ sp->conn = rxrpc_get_connection(conn, rxrpc_conn_get_poke_secured);
|
|
skb->mark = RXRPC_SKB_MARK_SERVICE_CONN_SECURED;
|
|
rxrpc_get_skb(skb, rxrpc_skb_get_conn_secured);
|
|
skb_queue_head(&conn->local->rx_queue, skb);
|
|
@@ -431,14 +430,16 @@ void rxrpc_input_conn_event(struct rxrpc_connection *conn, struct sk_buff *skb)
|
|
if (test_and_clear_bit(RXRPC_CONN_EV_ABORT_CALLS, &conn->events))
|
|
rxrpc_abort_calls(conn);
|
|
|
|
- switch (skb->mark) {
|
|
- case RXRPC_SKB_MARK_SERVICE_CONN_SECURED:
|
|
- if (conn->state != RXRPC_CONN_SERVICE)
|
|
- break;
|
|
+ if (skb) {
|
|
+ switch (skb->mark) {
|
|
+ case RXRPC_SKB_MARK_SERVICE_CONN_SECURED:
|
|
+ if (conn->state != RXRPC_CONN_SERVICE)
|
|
+ break;
|
|
|
|
- for (loop = 0; loop < RXRPC_MAXCALLS; loop++)
|
|
- rxrpc_call_is_secure(conn->channels[loop].call);
|
|
- break;
|
|
+ for (loop = 0; loop < RXRPC_MAXCALLS; loop++)
|
|
+ rxrpc_call_is_secure(conn->channels[loop].call);
|
|
+ break;
|
|
+ }
|
|
}
|
|
|
|
/* Process delayed ACKs whose time has come. */
|
|
diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c
|
|
index 7aa58129ae4550..f0c77f437b6167 100644
|
|
--- a/net/rxrpc/conn_object.c
|
|
+++ b/net/rxrpc/conn_object.c
|
|
@@ -67,6 +67,7 @@ struct rxrpc_connection *rxrpc_alloc_connection(struct rxrpc_net *rxnet,
|
|
INIT_WORK(&conn->destructor, rxrpc_clean_up_connection);
|
|
INIT_LIST_HEAD(&conn->proc_link);
|
|
INIT_LIST_HEAD(&conn->link);
|
|
+ INIT_LIST_HEAD(&conn->attend_link);
|
|
mutex_init(&conn->security_lock);
|
|
skb_queue_head_init(&conn->rx_queue);
|
|
conn->rxnet = rxnet;
|
|
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
|
|
index 5dfda1ac51dda7..9a162035d4c1d0 100644
|
|
--- a/net/rxrpc/input.c
|
|
+++ b/net/rxrpc/input.c
|
|
@@ -574,7 +574,7 @@ static bool rxrpc_input_split_jumbo(struct rxrpc_call *call, struct sk_buff *skb
|
|
rxrpc_propose_delay_ACK(call, sp->hdr.serial,
|
|
rxrpc_propose_ack_input_data);
|
|
}
|
|
- if (notify) {
|
|
+ if (notify && !test_bit(RXRPC_CALL_CONN_CHALLENGING, &call->flags)) {
|
|
trace_rxrpc_notify_socket(call->debug_id, sp->hdr.serial);
|
|
rxrpc_notify_socket(call);
|
|
}
|
|
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c
|
|
index 24f765d243db1c..b9f2f12281b33e 100644
|
|
--- a/net/rxrpc/sendmsg.c
|
|
+++ b/net/rxrpc/sendmsg.c
|
|
@@ -658,7 +658,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
|
|
} else {
|
|
switch (rxrpc_call_state(call)) {
|
|
case RXRPC_CALL_CLIENT_AWAIT_CONN:
|
|
- case RXRPC_CALL_SERVER_SECURING:
|
|
+ case RXRPC_CALL_SERVER_RECV_REQUEST:
|
|
if (p.command == RXRPC_CMD_SEND_ABORT)
|
|
break;
|
|
fallthrough;
|
|
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
|
|
index 152dbbe8fd31ab..447d3e836a24f0 100644
|
|
--- a/net/sched/sch_netem.c
|
|
+++ b/net/sched/sch_netem.c
|
|
@@ -748,9 +748,9 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch)
|
|
if (err != NET_XMIT_SUCCESS) {
|
|
if (net_xmit_drop_count(err))
|
|
qdisc_qstats_drop(sch);
|
|
- qdisc_tree_reduce_backlog(sch, 1, pkt_len);
|
|
sch->qstats.backlog -= pkt_len;
|
|
sch->q.qlen--;
|
|
+ qdisc_tree_reduce_backlog(sch, 1, pkt_len);
|
|
}
|
|
goto tfifo_dequeue;
|
|
}
|
|
diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c
|
|
index 43c3f1c971b8fd..c524421ec65252 100644
|
|
--- a/net/tipc/crypto.c
|
|
+++ b/net/tipc/crypto.c
|
|
@@ -2293,8 +2293,8 @@ static bool tipc_crypto_key_rcv(struct tipc_crypto *rx, struct tipc_msg *hdr)
|
|
keylen = ntohl(*((__be32 *)(data + TIPC_AEAD_ALG_NAME)));
|
|
|
|
/* Verify the supplied size values */
|
|
- if (unlikely(size != keylen + sizeof(struct tipc_aead_key) ||
|
|
- keylen > TIPC_AEAD_KEY_SIZE_MAX)) {
|
|
+ if (unlikely(keylen > TIPC_AEAD_KEY_SIZE_MAX ||
|
|
+ size != keylen + sizeof(struct tipc_aead_key))) {
|
|
pr_debug("%s: invalid MSG_CRYPTO key size\n", rx->name);
|
|
goto exit;
|
|
}
|
|
diff --git a/rust/kernel/init.rs b/rust/kernel/init.rs
|
|
index 0fe043c0eaacdc..2d4b19b8685771 100644
|
|
--- a/rust/kernel/init.rs
|
|
+++ b/rust/kernel/init.rs
|
|
@@ -788,7 +788,7 @@ pub unsafe trait PinInit<T: ?Sized, E = Infallible>: Sized {
|
|
/// use kernel::{types::Opaque, init::pin_init_from_closure};
|
|
/// #[repr(C)]
|
|
/// struct RawFoo([u8; 16]);
|
|
- /// extern {
|
|
+ /// extern "C" {
|
|
/// fn init_foo(_: *mut RawFoo);
|
|
/// }
|
|
///
|
|
diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
|
|
index 16c750bb95fafd..0ea3281a92e1eb 100644
|
|
--- a/scripts/Makefile.extrawarn
|
|
+++ b/scripts/Makefile.extrawarn
|
|
@@ -144,7 +144,6 @@ KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare
|
|
KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
|
|
KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict)
|
|
KBUILD_CFLAGS += -Wno-enum-compare-conditional
|
|
-KBUILD_CFLAGS += -Wno-enum-enum-conversion
|
|
endif
|
|
|
|
endif
|
|
@@ -175,6 +174,10 @@ KBUILD_CFLAGS += -Wno-missing-field-initializers
|
|
KBUILD_CFLAGS += -Wno-type-limits
|
|
KBUILD_CFLAGS += -Wno-shift-negative-value
|
|
|
|
+ifdef CONFIG_CC_IS_CLANG
|
|
+KBUILD_CFLAGS += -Wno-enum-enum-conversion
|
|
+endif
|
|
+
|
|
ifdef CONFIG_CC_IS_CLANG
|
|
KBUILD_CFLAGS += -Wno-initializer-overrides
|
|
else
|
|
diff --git a/scripts/gdb/linux/cpus.py b/scripts/gdb/linux/cpus.py
|
|
index 255dc18cb9da45..5563c3a79fc17a 100644
|
|
--- a/scripts/gdb/linux/cpus.py
|
|
+++ b/scripts/gdb/linux/cpus.py
|
|
@@ -172,7 +172,7 @@ def get_current_task(cpu):
|
|
var_ptr = gdb.parse_and_eval("&pcpu_hot.current_task")
|
|
return per_cpu(var_ptr, cpu).dereference()
|
|
elif utils.is_target_arch("aarch64"):
|
|
- current_task_addr = gdb.parse_and_eval("$SP_EL0")
|
|
+ current_task_addr = gdb.parse_and_eval("(unsigned long)$SP_EL0")
|
|
if (current_task_addr >> 63) != 0:
|
|
current_task = current_task_addr.cast(task_ptr_type)
|
|
return current_task.dereference()
|
|
diff --git a/security/safesetid/securityfs.c b/security/safesetid/securityfs.c
|
|
index 25310468bcddff..8e1ffd70b18ab4 100644
|
|
--- a/security/safesetid/securityfs.c
|
|
+++ b/security/safesetid/securityfs.c
|
|
@@ -143,6 +143,9 @@ static ssize_t handle_policy_update(struct file *file,
|
|
char *buf, *p, *end;
|
|
int err;
|
|
|
|
+ if (len >= KMALLOC_MAX_SIZE)
|
|
+ return -EINVAL;
|
|
+
|
|
pol = kmalloc(sizeof(struct setid_ruleset), GFP_KERNEL);
|
|
if (!pol)
|
|
return -ENOMEM;
|
|
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
|
|
index ea3140d510ecbf..e58e265d16578e 100644
|
|
--- a/security/tomoyo/common.c
|
|
+++ b/security/tomoyo/common.c
|
|
@@ -2665,7 +2665,7 @@ ssize_t tomoyo_write_control(struct tomoyo_io_buffer *head,
|
|
|
|
if (head->w.avail >= head->writebuf_size - 1) {
|
|
const int len = head->writebuf_size * 2;
|
|
- char *cp = kzalloc(len, GFP_NOFS);
|
|
+ char *cp = kzalloc(len, GFP_NOFS | __GFP_NOWARN);
|
|
|
|
if (!cp) {
|
|
error = -ENOMEM;
|
|
diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c
|
|
index 8e74be038b0fad..0091ab3f2bd56b 100644
|
|
--- a/sound/pci/hda/hda_auto_parser.c
|
|
+++ b/sound/pci/hda/hda_auto_parser.c
|
|
@@ -80,7 +80,11 @@ static int compare_input_type(const void *ap, const void *bp)
|
|
|
|
/* In case one has boost and the other one has not,
|
|
pick the one with boost first. */
|
|
- return (int)(b->has_boost_on_pin - a->has_boost_on_pin);
|
|
+ if (a->has_boost_on_pin != b->has_boost_on_pin)
|
|
+ return (int)(b->has_boost_on_pin - a->has_boost_on_pin);
|
|
+
|
|
+ /* Keep the original order */
|
|
+ return a->order - b->order;
|
|
}
|
|
|
|
/* Reorder the surround channels
|
|
@@ -400,6 +404,8 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
|
|
reorder_outputs(cfg->speaker_outs, cfg->speaker_pins);
|
|
|
|
/* sort inputs in the order of AUTO_PIN_* type */
|
|
+ for (i = 0; i < cfg->num_inputs; i++)
|
|
+ cfg->inputs[i].order = i;
|
|
sort(cfg->inputs, cfg->num_inputs, sizeof(cfg->inputs[0]),
|
|
compare_input_type, NULL);
|
|
|
|
diff --git a/sound/pci/hda/hda_auto_parser.h b/sound/pci/hda/hda_auto_parser.h
|
|
index 579b11beac718e..87af3d8c02f7f6 100644
|
|
--- a/sound/pci/hda/hda_auto_parser.h
|
|
+++ b/sound/pci/hda/hda_auto_parser.h
|
|
@@ -37,6 +37,7 @@ struct auto_pin_cfg_item {
|
|
unsigned int is_headset_mic:1;
|
|
unsigned int is_headphone_mic:1; /* Mic-only in headphone jack */
|
|
unsigned int has_boost_on_pin:1;
|
|
+ int order;
|
|
};
|
|
|
|
struct auto_pin_cfg;
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index 0b679fd1b82ab9..abe3d5b9b84b3e 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -9949,6 +9949,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
|
SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
|
SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
|
+ SND_PCI_QUIRK(0x103c, 0x887c, "HP Laptop 14s-fq1xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
|
SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
|
|
SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
|
|
SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
|
|
@@ -10401,6 +10402,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
|
|
SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
|
|
SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
|
|
+ SND_PCI_QUIRK(0x1849, 0x0269, "Positivo Master C6400", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
|
SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
|
|
SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
|
|
diff --git a/sound/soc/amd/Kconfig b/sound/soc/amd/Kconfig
|
|
index 273688c053172f..0b6a01c6bbb1b1 100644
|
|
--- a/sound/soc/amd/Kconfig
|
|
+++ b/sound/soc/amd/Kconfig
|
|
@@ -105,7 +105,7 @@ config SND_SOC_AMD_ACP6x
|
|
config SND_SOC_AMD_YC_MACH
|
|
tristate "AMD YC support for DMIC"
|
|
select SND_SOC_DMIC
|
|
- depends on SND_SOC_AMD_ACP6x
|
|
+ depends on SND_SOC_AMD_ACP6x && ACPI
|
|
help
|
|
This option enables machine driver for Yellow Carp platform
|
|
using dmic. ACP IP has PDM Decoder block with DMA controller.
|
|
diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c
|
|
index f7fbde1bc2ed2e..eac023283ff790 100644
|
|
--- a/sound/soc/amd/yc/acp6x-mach.c
|
|
+++ b/sound/soc/amd/yc/acp6x-mach.c
|
|
@@ -304,6 +304,34 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "83AS"),
|
|
}
|
|
},
|
|
+ {
|
|
+ .driver_data = &acp6x_card,
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "83L3"),
|
|
+ }
|
|
+ },
|
|
+ {
|
|
+ .driver_data = &acp6x_card,
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "83N6"),
|
|
+ }
|
|
+ },
|
|
+ {
|
|
+ .driver_data = &acp6x_card,
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "83Q2"),
|
|
+ }
|
|
+ },
|
|
+ {
|
|
+ .driver_data = &acp6x_card,
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "83Q3"),
|
|
+ }
|
|
+ },
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
|
index 511446a30c057b..60248a6820aacc 100644
|
|
--- a/sound/soc/soc-pcm.c
|
|
+++ b/sound/soc/soc-pcm.c
|
|
@@ -38,7 +38,6 @@ static inline int _soc_pcm_ret(struct snd_soc_pcm_runtime *rtd,
|
|
switch (ret) {
|
|
case -EPROBE_DEFER:
|
|
case -ENOTSUPP:
|
|
- case -EINVAL:
|
|
break;
|
|
default:
|
|
dev_err(rtd->dev,
|
|
@@ -902,7 +901,13 @@ static int __soc_pcm_prepare(struct snd_soc_pcm_runtime *rtd,
|
|
}
|
|
|
|
out:
|
|
- return soc_pcm_ret(rtd, ret);
|
|
+ /*
|
|
+ * Don't use soc_pcm_ret() on .prepare callback to lower error log severity
|
|
+ *
|
|
+ * We don't want to log an error since we do not want to give userspace a way to do a
|
|
+ * denial-of-service attack on the syslog / diskspace.
|
|
+ */
|
|
+ return ret;
|
|
}
|
|
|
|
/* PCM prepare ops for non-DPCM streams */
|
|
@@ -914,6 +919,13 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
|
|
snd_soc_dpcm_mutex_lock(rtd);
|
|
ret = __soc_pcm_prepare(rtd, substream);
|
|
snd_soc_dpcm_mutex_unlock(rtd);
|
|
+
|
|
+ /*
|
|
+ * Don't use soc_pcm_ret() on .prepare callback to lower error log severity
|
|
+ *
|
|
+ * We don't want to log an error since we do not want to give userspace a way to do a
|
|
+ * denial-of-service attack on the syslog / diskspace.
|
|
+ */
|
|
return ret;
|
|
}
|
|
|
|
@@ -2461,7 +2473,13 @@ int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
|
|
be->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
|
|
}
|
|
|
|
- return soc_pcm_ret(fe, ret);
|
|
+ /*
|
|
+ * Don't use soc_pcm_ret() on .prepare callback to lower error log severity
|
|
+ *
|
|
+ * We don't want to log an error since we do not want to give userspace a way to do a
|
|
+ * denial-of-service attack on the syslog / diskspace.
|
|
+ */
|
|
+ return ret;
|
|
}
|
|
|
|
static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
|
|
@@ -2501,7 +2519,13 @@ static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
|
|
dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
|
|
snd_soc_dpcm_mutex_unlock(fe);
|
|
|
|
- return soc_pcm_ret(fe, ret);
|
|
+ /*
|
|
+ * Don't use soc_pcm_ret() on .prepare callback to lower error log severity
|
|
+ *
|
|
+ * We don't want to log an error since we do not want to give userspace a way to do a
|
|
+ * denial-of-service attack on the syslog / diskspace.
|
|
+ */
|
|
+ return ret;
|
|
}
|
|
|
|
static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream)
|
|
diff --git a/tools/perf/bench/epoll-wait.c b/tools/perf/bench/epoll-wait.c
|
|
index cb5174b53940b2..f370f7872ba4c9 100644
|
|
--- a/tools/perf/bench/epoll-wait.c
|
|
+++ b/tools/perf/bench/epoll-wait.c
|
|
@@ -420,7 +420,12 @@ static int cmpworker(const void *p1, const void *p2)
|
|
|
|
struct worker *w1 = (struct worker *) p1;
|
|
struct worker *w2 = (struct worker *) p2;
|
|
- return w1->tid > w2->tid;
|
|
+
|
|
+ if (w1->tid > w2->tid)
|
|
+ return 1;
|
|
+ if (w1->tid < w2->tid)
|
|
+ return -1;
|
|
+ return 0;
|
|
}
|
|
|
|
int bench_epoll_wait(int argc, const char **argv)
|
|
diff --git a/tools/testing/selftests/net/ipsec.c b/tools/testing/selftests/net/ipsec.c
|
|
index be4a30a0d02aef..9b44a091802cbb 100644
|
|
--- a/tools/testing/selftests/net/ipsec.c
|
|
+++ b/tools/testing/selftests/net/ipsec.c
|
|
@@ -227,7 +227,8 @@ static int rtattr_pack(struct nlmsghdr *nh, size_t req_sz,
|
|
|
|
attr->rta_len = RTA_LENGTH(size);
|
|
attr->rta_type = rta_type;
|
|
- memcpy(RTA_DATA(attr), payload, size);
|
|
+ if (payload)
|
|
+ memcpy(RTA_DATA(attr), payload, size);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/testing/selftests/net/mptcp/mptcp_connect.c
|
|
index 414addef9a4514..d240d02fa443a1 100644
|
|
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.c
|
|
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c
|
|
@@ -1302,7 +1302,7 @@ int main_loop(void)
|
|
return ret;
|
|
|
|
if (cfg_truncate > 0) {
|
|
- xdisconnect(fd);
|
|
+ shutdown(fd, SHUT_WR);
|
|
} else if (--cfg_repeat > 0) {
|
|
xdisconnect(fd);
|
|
|
|
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
|
|
index 17ace5627ce365..497dc187387f8d 100755
|
|
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
|
|
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
|
|
@@ -2941,7 +2941,7 @@ verify_listener_events()
|
|
type=$(mptcp_lib_evts_get_info type "$evt" "$e_type")
|
|
family=$(mptcp_lib_evts_get_info family "$evt" "$e_type")
|
|
sport=$(mptcp_lib_evts_get_info sport "$evt" "$e_type")
|
|
- if [ $family ] && [ $family = $AF_INET6 ]; then
|
|
+ if [ $family ] && [ $family = $MPTCP_LIB_AF_INET6 ]; then
|
|
saddr=$(mptcp_lib_evts_get_info saddr6 "$evt" "$e_type")
|
|
else
|
|
saddr=$(mptcp_lib_evts_get_info saddr4 "$evt" "$e_type")
|
|
diff --git a/tools/testing/selftests/net/udpgso.c b/tools/testing/selftests/net/udpgso.c
|
|
index b02080d09fbc05..d0fba50bd6ef08 100644
|
|
--- a/tools/testing/selftests/net/udpgso.c
|
|
+++ b/tools/testing/selftests/net/udpgso.c
|
|
@@ -94,6 +94,19 @@ struct testcase testcases_v4[] = {
|
|
.gso_len = CONST_MSS_V4,
|
|
.r_num_mss = 1,
|
|
},
|
|
+ {
|
|
+ /* datalen <= MSS < gso_len: will fall back to no GSO */
|
|
+ .tlen = CONST_MSS_V4,
|
|
+ .gso_len = CONST_MSS_V4 + 1,
|
|
+ .r_num_mss = 0,
|
|
+ .r_len_last = CONST_MSS_V4,
|
|
+ },
|
|
+ {
|
|
+ /* MSS < datalen < gso_len: fail */
|
|
+ .tlen = CONST_MSS_V4 + 1,
|
|
+ .gso_len = CONST_MSS_V4 + 2,
|
|
+ .tfail = true,
|
|
+ },
|
|
{
|
|
/* send a single MSS + 1B */
|
|
.tlen = CONST_MSS_V4 + 1,
|
|
@@ -197,6 +210,19 @@ struct testcase testcases_v6[] = {
|
|
.gso_len = CONST_MSS_V6,
|
|
.r_num_mss = 1,
|
|
},
|
|
+ {
|
|
+ /* datalen <= MSS < gso_len: will fall back to no GSO */
|
|
+ .tlen = CONST_MSS_V6,
|
|
+ .gso_len = CONST_MSS_V6 + 1,
|
|
+ .r_num_mss = 0,
|
|
+ .r_len_last = CONST_MSS_V6,
|
|
+ },
|
|
+ {
|
|
+ /* MSS < datalen < gso_len: fail */
|
|
+ .tlen = CONST_MSS_V6 + 1,
|
|
+ .gso_len = CONST_MSS_V6 + 2,
|
|
+ .tfail = true
|
|
+ },
|
|
{
|
|
/* send a single MSS + 1B */
|
|
.tlen = CONST_MSS_V6 + 1,
|
|
diff --git a/tools/tracing/rtla/src/osnoise.c b/tools/tracing/rtla/src/osnoise.c
|
|
index 245e9344932bc4..699a83f538a8e8 100644
|
|
--- a/tools/tracing/rtla/src/osnoise.c
|
|
+++ b/tools/tracing/rtla/src/osnoise.c
|
|
@@ -867,7 +867,7 @@ int osnoise_set_workload(struct osnoise_context *context, bool onoff)
|
|
|
|
retval = osnoise_options_set_option("OSNOISE_WORKLOAD", onoff);
|
|
if (retval < 0)
|
|
- return -1;
|
|
+ return -2;
|
|
|
|
context->opt_workload = onoff;
|
|
|
|
diff --git a/tools/tracing/rtla/src/timerlat_hist.c b/tools/tracing/rtla/src/timerlat_hist.c
|
|
index 667f12f2d67f69..1525e88c6cf968 100644
|
|
--- a/tools/tracing/rtla/src/timerlat_hist.c
|
|
+++ b/tools/tracing/rtla/src/timerlat_hist.c
|
|
@@ -900,12 +900,15 @@ timerlat_hist_apply_config(struct osnoise_tool *tool, struct timerlat_hist_param
|
|
auto_house_keeping(¶ms->monitored_cpus);
|
|
}
|
|
|
|
- if (params->user_hist) {
|
|
- retval = osnoise_set_workload(tool->context, 0);
|
|
- if (retval) {
|
|
- err_msg("Failed to set OSNOISE_WORKLOAD option\n");
|
|
- goto out_err;
|
|
- }
|
|
+ /*
|
|
+ * Set workload according to type of thread if the kernel supports it.
|
|
+ * On kernels without support, user threads will have already failed
|
|
+ * on missing timerlat_fd, and kernel threads do not need it.
|
|
+ */
|
|
+ retval = osnoise_set_workload(tool->context, params->kernel_workload);
|
|
+ if (retval < -1) {
|
|
+ err_msg("Failed to set OSNOISE_WORKLOAD option\n");
|
|
+ goto out_err;
|
|
}
|
|
|
|
return 0;
|
|
@@ -946,9 +949,12 @@ static struct osnoise_tool
|
|
}
|
|
|
|
static int stop_tracing;
|
|
+static struct trace_instance *hist_inst = NULL;
|
|
static void stop_hist(int sig)
|
|
{
|
|
stop_tracing = 1;
|
|
+ if (hist_inst)
|
|
+ trace_instance_stop(hist_inst);
|
|
}
|
|
|
|
/*
|
|
@@ -994,6 +1000,12 @@ int timerlat_hist_main(int argc, char *argv[])
|
|
}
|
|
|
|
trace = &tool->trace;
|
|
+ /*
|
|
+ * Save trace instance into global variable so that SIGINT can stop
|
|
+ * the timerlat tracer.
|
|
+ * Otherwise, rtla could loop indefinitely when overloaded.
|
|
+ */
|
|
+ hist_inst = trace;
|
|
|
|
retval = enable_timerlat(trace);
|
|
if (retval) {
|
|
@@ -1126,7 +1138,7 @@ int timerlat_hist_main(int argc, char *argv[])
|
|
|
|
return_value = 0;
|
|
|
|
- if (trace_is_off(&tool->trace, &record->trace)) {
|
|
+ if (trace_is_off(&tool->trace, &record->trace) && !stop_tracing) {
|
|
printf("rtla timerlat hit stop tracing\n");
|
|
|
|
if (!params->no_aa)
|
|
diff --git a/tools/tracing/rtla/src/timerlat_top.c b/tools/tracing/rtla/src/timerlat_top.c
|
|
index 0915092057f853..5a33789a375e3c 100644
|
|
--- a/tools/tracing/rtla/src/timerlat_top.c
|
|
+++ b/tools/tracing/rtla/src/timerlat_top.c
|
|
@@ -679,12 +679,15 @@ timerlat_top_apply_config(struct osnoise_tool *top, struct timerlat_top_params *
|
|
auto_house_keeping(¶ms->monitored_cpus);
|
|
}
|
|
|
|
- if (params->user_top) {
|
|
- retval = osnoise_set_workload(top->context, 0);
|
|
- if (retval) {
|
|
- err_msg("Failed to set OSNOISE_WORKLOAD option\n");
|
|
- goto out_err;
|
|
- }
|
|
+ /*
|
|
+ * Set workload according to type of thread if the kernel supports it.
|
|
+ * On kernels without support, user threads will have already failed
|
|
+ * on missing timerlat_fd, and kernel threads do not need it.
|
|
+ */
|
|
+ retval = osnoise_set_workload(top->context, params->kernel_workload);
|
|
+ if (retval < -1) {
|
|
+ err_msg("Failed to set OSNOISE_WORKLOAD option\n");
|
|
+ goto out_err;
|
|
}
|
|
|
|
return 0;
|
|
@@ -725,9 +728,12 @@ static struct osnoise_tool
|
|
}
|
|
|
|
static int stop_tracing;
|
|
+static struct trace_instance *top_inst = NULL;
|
|
static void stop_top(int sig)
|
|
{
|
|
stop_tracing = 1;
|
|
+ if (top_inst)
|
|
+ trace_instance_stop(top_inst);
|
|
}
|
|
|
|
/*
|
|
@@ -774,6 +780,13 @@ int timerlat_top_main(int argc, char *argv[])
|
|
}
|
|
|
|
trace = &top->trace;
|
|
+ /*
|
|
+ * Save trace instance into global variable so that SIGINT can stop
|
|
+ * the timerlat tracer.
|
|
+ * Otherwise, rtla could loop indefinitely when overloaded.
|
|
+ */
|
|
+ top_inst = trace;
|
|
+
|
|
|
|
retval = enable_timerlat(trace);
|
|
if (retval) {
|
|
@@ -922,7 +935,7 @@ int timerlat_top_main(int argc, char *argv[])
|
|
|
|
return_value = 0;
|
|
|
|
- if (trace_is_off(&top->trace, &record->trace)) {
|
|
+ if (trace_is_off(&top->trace, &record->trace) && !stop_tracing) {
|
|
printf("rtla timerlat hit stop tracing\n");
|
|
|
|
if (!params->no_aa)
|
|
diff --git a/tools/tracing/rtla/src/trace.c b/tools/tracing/rtla/src/trace.c
|
|
index e1ba6d9f426580..93e4032b2397af 100644
|
|
--- a/tools/tracing/rtla/src/trace.c
|
|
+++ b/tools/tracing/rtla/src/trace.c
|
|
@@ -196,6 +196,14 @@ int trace_instance_start(struct trace_instance *trace)
|
|
return tracefs_trace_on(trace->inst);
|
|
}
|
|
|
|
+/*
|
|
+ * trace_instance_stop - stop tracing a given rtla instance
|
|
+ */
|
|
+int trace_instance_stop(struct trace_instance *trace)
|
|
+{
|
|
+ return tracefs_trace_off(trace->inst);
|
|
+}
|
|
+
|
|
/*
|
|
* trace_events_free - free a list of trace events
|
|
*/
|
|
diff --git a/tools/tracing/rtla/src/trace.h b/tools/tracing/rtla/src/trace.h
|
|
index 2e9a89a256150b..551a7cb81f6361 100644
|
|
--- a/tools/tracing/rtla/src/trace.h
|
|
+++ b/tools/tracing/rtla/src/trace.h
|
|
@@ -21,6 +21,7 @@ struct trace_instance {
|
|
|
|
int trace_instance_init(struct trace_instance *trace, char *tool_name);
|
|
int trace_instance_start(struct trace_instance *trace);
|
|
+int trace_instance_stop(struct trace_instance *trace);
|
|
void trace_instance_destroy(struct trace_instance *trace);
|
|
|
|
struct trace_seq *get_trace_seq(void);
|