mirror of
https://github.com/armbian/build.git
synced 2025-09-19 20:51:12 +02:00
10941 lines
362 KiB
Diff
10941 lines
362 KiB
Diff
diff --git a/Documentation/ABI/testing/sysfs-class-net-queues b/Documentation/ABI/testing/sysfs-class-net-queues
|
|
index 978b76358661a..40d5aab8452d5 100644
|
|
--- a/Documentation/ABI/testing/sysfs-class-net-queues
|
|
+++ b/Documentation/ABI/testing/sysfs-class-net-queues
|
|
@@ -1,4 +1,4 @@
|
|
-What: /sys/class/<iface>/queues/rx-<queue>/rps_cpus
|
|
+What: /sys/class/net/<iface>/queues/rx-<queue>/rps_cpus
|
|
Date: March 2010
|
|
KernelVersion: 2.6.35
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -8,7 +8,7 @@ Description:
|
|
network device queue. Possible values depend on the number
|
|
of available CPU(s) in the system.
|
|
|
|
-What: /sys/class/<iface>/queues/rx-<queue>/rps_flow_cnt
|
|
+What: /sys/class/net/<iface>/queues/rx-<queue>/rps_flow_cnt
|
|
Date: April 2010
|
|
KernelVersion: 2.6.35
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -16,7 +16,7 @@ Description:
|
|
Number of Receive Packet Steering flows being currently
|
|
processed by this particular network device receive queue.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/tx_timeout
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/tx_timeout
|
|
Date: November 2011
|
|
KernelVersion: 3.3
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -24,7 +24,7 @@ Description:
|
|
Indicates the number of transmit timeout events seen by this
|
|
network interface transmit queue.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/tx_maxrate
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/tx_maxrate
|
|
Date: March 2015
|
|
KernelVersion: 4.1
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -32,7 +32,7 @@ Description:
|
|
A Mbps max-rate set for the queue, a value of zero means disabled,
|
|
default is disabled.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/xps_cpus
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/xps_cpus
|
|
Date: November 2010
|
|
KernelVersion: 2.6.38
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -42,7 +42,7 @@ Description:
|
|
network device transmit queue. Possible vaules depend on the
|
|
number of available CPU(s) in the system.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/xps_rxqs
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/xps_rxqs
|
|
Date: June 2018
|
|
KernelVersion: 4.18.0
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -53,7 +53,7 @@ Description:
|
|
number of available receive queue(s) in the network device.
|
|
Default is disabled.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
|
|
Date: November 2011
|
|
KernelVersion: 3.3
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -62,7 +62,7 @@ Description:
|
|
of this particular network device transmit queue.
|
|
Default value is 1000.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
|
|
Date: November 2011
|
|
KernelVersion: 3.3
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -70,7 +70,7 @@ Description:
|
|
Indicates the number of bytes (objects) in flight on this
|
|
network device transmit queue.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit
|
|
Date: November 2011
|
|
KernelVersion: 3.3
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -79,7 +79,7 @@ Description:
|
|
on this network device transmit queue. This value is clamped
|
|
to be within the bounds defined by limit_max and limit_min.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
|
|
Date: November 2011
|
|
KernelVersion: 3.3
|
|
Contact: netdev@vger.kernel.org
|
|
@@ -88,7 +88,7 @@ Description:
|
|
queued on this network device transmit queue. See
|
|
include/linux/dynamic_queue_limits.h for the default value.
|
|
|
|
-What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
|
|
+What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
|
|
Date: November 2011
|
|
KernelVersion: 3.3
|
|
Contact: netdev@vger.kernel.org
|
|
diff --git a/Documentation/sound/soc/dapm.rst b/Documentation/sound/soc/dapm.rst
|
|
index 8e44107933abf..c3154ce6e1b27 100644
|
|
--- a/Documentation/sound/soc/dapm.rst
|
|
+++ b/Documentation/sound/soc/dapm.rst
|
|
@@ -234,7 +234,7 @@ corresponding soft power control. In this case it is necessary to create
|
|
a virtual widget - a widget with no control bits e.g.
|
|
::
|
|
|
|
- SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_DAPM_NOPM, 0, 0, NULL, 0),
|
|
+ SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
|
|
|
|
This can be used to merge to signal paths together in software.
|
|
|
|
diff --git a/Makefile b/Makefile
|
|
index 9dd167178ab4c..f5598d90093f5 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 6
|
|
PATCHLEVEL = 1
|
|
-SUBLEVEL = 76
|
|
+SUBLEVEL = 77
|
|
EXTRAVERSION =
|
|
NAME = Curry Ramen
|
|
|
|
diff --git a/arch/arm/boot/dts/imx1-ads.dts b/arch/arm/boot/dts/imx1-ads.dts
|
|
index 5833fb6f15d88..2c817c4a4c68f 100644
|
|
--- a/arch/arm/boot/dts/imx1-ads.dts
|
|
+++ b/arch/arm/boot/dts/imx1-ads.dts
|
|
@@ -65,7 +65,7 @@
|
|
pinctrl-0 = <&pinctrl_weim>;
|
|
status = "okay";
|
|
|
|
- nor: nor@0,0 {
|
|
+ nor: flash@0,0 {
|
|
compatible = "cfi-flash";
|
|
reg = <0 0x00000000 0x02000000>;
|
|
bank-width = <4>;
|
|
diff --git a/arch/arm/boot/dts/imx1-apf9328.dts b/arch/arm/boot/dts/imx1-apf9328.dts
|
|
index 77b21aa7a1469..27e72b07b517a 100644
|
|
--- a/arch/arm/boot/dts/imx1-apf9328.dts
|
|
+++ b/arch/arm/boot/dts/imx1-apf9328.dts
|
|
@@ -45,7 +45,7 @@
|
|
pinctrl-0 = <&pinctrl_weim>;
|
|
status = "okay";
|
|
|
|
- nor: nor@0,0 {
|
|
+ nor: flash@0,0 {
|
|
compatible = "cfi-flash";
|
|
reg = <0 0x00000000 0x02000000>;
|
|
bank-width = <2>;
|
|
diff --git a/arch/arm/boot/dts/imx1.dtsi b/arch/arm/boot/dts/imx1.dtsi
|
|
index e312f1e74e2fe..4aeb74479f44e 100644
|
|
--- a/arch/arm/boot/dts/imx1.dtsi
|
|
+++ b/arch/arm/boot/dts/imx1.dtsi
|
|
@@ -268,9 +268,12 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- esram: esram@300000 {
|
|
+ esram: sram@300000 {
|
|
compatible = "mmio-sram";
|
|
reg = <0x00300000 0x20000>;
|
|
+ ranges = <0 0x00300000 0x20000>;
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <1>;
|
|
};
|
|
};
|
|
};
|
|
diff --git a/arch/arm/boot/dts/imx23-sansa.dts b/arch/arm/boot/dts/imx23-sansa.dts
|
|
index 46057d9bf555b..c2efcc20ae802 100644
|
|
--- a/arch/arm/boot/dts/imx23-sansa.dts
|
|
+++ b/arch/arm/boot/dts/imx23-sansa.dts
|
|
@@ -175,10 +175,8 @@
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
compatible = "i2c-gpio";
|
|
- gpios = <
|
|
- &gpio1 24 0 /* SDA */
|
|
- &gpio1 22 0 /* SCL */
|
|
- >;
|
|
+ sda-gpios = <&gpio1 24 0>;
|
|
+ scl-gpios = <&gpio1 22 0>;
|
|
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
|
};
|
|
|
|
@@ -186,10 +184,8 @@
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
compatible = "i2c-gpio";
|
|
- gpios = <
|
|
- &gpio0 31 0 /* SDA */
|
|
- &gpio0 30 0 /* SCL */
|
|
- >;
|
|
+ sda-gpios = <&gpio0 31 0>;
|
|
+ scl-gpios = <&gpio0 30 0>;
|
|
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
|
|
|
touch: touch@20 {
|
|
diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi
|
|
index 7f4c602454a5f..ec476b1596496 100644
|
|
--- a/arch/arm/boot/dts/imx23.dtsi
|
|
+++ b/arch/arm/boot/dts/imx23.dtsi
|
|
@@ -414,7 +414,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- dma_apbx: dma-apbx@80024000 {
|
|
+ dma_apbx: dma-controller@80024000 {
|
|
compatible = "fsl,imx23-dma-apbx";
|
|
reg = <0x80024000 0x2000>;
|
|
interrupts = <7 5 9 26
|
|
diff --git a/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi b/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi
|
|
index 0703f62d10d1c..93a6e4e680b45 100644
|
|
--- a/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi
|
|
+++ b/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi
|
|
@@ -27,7 +27,7 @@
|
|
pinctrl-0 = <&pinctrl_i2c1>;
|
|
status = "okay";
|
|
|
|
- pcf8563@51 {
|
|
+ rtc@51 {
|
|
compatible = "nxp,pcf8563";
|
|
reg = <0x51>;
|
|
};
|
|
diff --git a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
|
|
index 7d4301b22b902..1ed3fb7b9ce62 100644
|
|
--- a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
|
|
+++ b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
|
|
@@ -16,7 +16,7 @@
|
|
bus-width = <18>;
|
|
display-timings {
|
|
native-mode = <&qvga_timings>;
|
|
- qvga_timings: 320x240 {
|
|
+ qvga_timings: timing0 {
|
|
clock-frequency = <6500000>;
|
|
hactive = <320>;
|
|
vactive = <240>;
|
|
diff --git a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts
|
|
index 80a7f96de4c6a..64b2ffac463b2 100644
|
|
--- a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts
|
|
+++ b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts
|
|
@@ -16,7 +16,7 @@
|
|
bus-width = <18>;
|
|
display-timings {
|
|
native-mode = <&dvi_svga_timings>;
|
|
- dvi_svga_timings: 800x600 {
|
|
+ dvi_svga_timings: timing0 {
|
|
clock-frequency = <40000000>;
|
|
hactive = <800>;
|
|
vactive = <600>;
|
|
diff --git a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts
|
|
index 24027a1fb46d1..fb074bfdaa8dc 100644
|
|
--- a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts
|
|
+++ b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts
|
|
@@ -16,7 +16,7 @@
|
|
bus-width = <18>;
|
|
display-timings {
|
|
native-mode = <&dvi_vga_timings>;
|
|
- dvi_vga_timings: 640x480 {
|
|
+ dvi_vga_timings: timing0 {
|
|
clock-frequency = <31250000>;
|
|
hactive = <640>;
|
|
vactive = <480>;
|
|
diff --git a/arch/arm/boot/dts/imx25-pdk.dts b/arch/arm/boot/dts/imx25-pdk.dts
|
|
index fb66884d8a2fa..59b40d13a6401 100644
|
|
--- a/arch/arm/boot/dts/imx25-pdk.dts
|
|
+++ b/arch/arm/boot/dts/imx25-pdk.dts
|
|
@@ -78,7 +78,7 @@
|
|
bus-width = <18>;
|
|
display-timings {
|
|
native-mode = <&wvga_timings>;
|
|
- wvga_timings: 640x480 {
|
|
+ wvga_timings: timing0 {
|
|
hactive = <640>;
|
|
vactive = <480>;
|
|
hback-porch = <45>;
|
|
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi
|
|
index 5f90d72b840b0..5ac4549286bd7 100644
|
|
--- a/arch/arm/boot/dts/imx25.dtsi
|
|
+++ b/arch/arm/boot/dts/imx25.dtsi
|
|
@@ -543,7 +543,7 @@
|
|
};
|
|
|
|
iim: efuse@53ff0000 {
|
|
- compatible = "fsl,imx25-iim", "fsl,imx27-iim";
|
|
+ compatible = "fsl,imx25-iim";
|
|
reg = <0x53ff0000 0x4000>;
|
|
interrupts = <19>;
|
|
clocks = <&clks 99>;
|
|
diff --git a/arch/arm/boot/dts/imx27-apf27dev.dts b/arch/arm/boot/dts/imx27-apf27dev.dts
|
|
index 6f1e8ce9e76e9..3d9bb7fc3be2e 100644
|
|
--- a/arch/arm/boot/dts/imx27-apf27dev.dts
|
|
+++ b/arch/arm/boot/dts/imx27-apf27dev.dts
|
|
@@ -16,7 +16,7 @@
|
|
fsl,pcr = <0xfae80083>; /* non-standard but required */
|
|
display-timings {
|
|
native-mode = <&timing0>;
|
|
- timing0: 800x480 {
|
|
+ timing0: timing0 {
|
|
clock-frequency = <33000033>;
|
|
hactive = <800>;
|
|
vactive = <480>;
|
|
@@ -47,7 +47,7 @@
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&pinctrl_gpio_leds>;
|
|
|
|
- user {
|
|
+ led-user {
|
|
label = "Heartbeat";
|
|
gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
|
|
linux,default-trigger = "heartbeat";
|
|
diff --git a/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi b/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi
|
|
index 74110bbcd9d4f..c7e9235848782 100644
|
|
--- a/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi
|
|
+++ b/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi
|
|
@@ -33,7 +33,7 @@
|
|
pinctrl-0 = <&pinctrl_i2c1>;
|
|
status = "okay";
|
|
|
|
- pcf8563@51 {
|
|
+ rtc@51 {
|
|
compatible = "nxp,pcf8563";
|
|
reg = <0x51>;
|
|
};
|
|
@@ -90,7 +90,7 @@
|
|
&weim {
|
|
status = "okay";
|
|
|
|
- nor: nor@0,0 {
|
|
+ nor: flash@0,0 {
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
compatible = "cfi-flash";
|
|
diff --git a/arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts b/arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts
|
|
index 9c3ec82ec7e5a..50fa0bd4c8a18 100644
|
|
--- a/arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts
|
|
+++ b/arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts
|
|
@@ -16,7 +16,7 @@
|
|
|
|
display-timings {
|
|
native-mode = <&timing0>;
|
|
- timing0: 320x240 {
|
|
+ timing0: timing0 {
|
|
clock-frequency = <6500000>;
|
|
hactive = <320>;
|
|
vactive = <240>;
|
|
diff --git a/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts b/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts
|
|
index 188639738dc3e..7f36af150a254 100644
|
|
--- a/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts
|
|
+++ b/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts
|
|
@@ -19,7 +19,7 @@
|
|
fsl,pcr = <0xf0c88080>; /* non-standard but required */
|
|
display-timings {
|
|
native-mode = <&timing0>;
|
|
- timing0: 640x480 {
|
|
+ timing0: timing0 {
|
|
hactive = <640>;
|
|
vactive = <480>;
|
|
hback-porch = <112>;
|
|
diff --git a/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts b/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
|
|
index 344e777901524..d133b9f08b3a0 100644
|
|
--- a/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
|
|
+++ b/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
|
|
@@ -19,7 +19,7 @@
|
|
|
|
display-timings {
|
|
native-mode = <&timing0>;
|
|
- timing0: 240x320 {
|
|
+ timing0: timing0 {
|
|
clock-frequency = <5500000>;
|
|
hactive = <240>;
|
|
vactive = <320>;
|
|
diff --git a/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi b/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi
|
|
index 3d10273177e9b..a5fdc2fd4ce5a 100644
|
|
--- a/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi
|
|
+++ b/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi
|
|
@@ -322,7 +322,7 @@
|
|
&weim {
|
|
status = "okay";
|
|
|
|
- nor: nor@0,0 {
|
|
+ nor: flash@0,0 {
|
|
compatible = "cfi-flash";
|
|
reg = <0 0x00000000 0x02000000>;
|
|
bank-width = <2>;
|
|
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi
|
|
index e140307be2e7d..eb6daf22486e4 100644
|
|
--- a/arch/arm/boot/dts/imx27.dtsi
|
|
+++ b/arch/arm/boot/dts/imx27.dtsi
|
|
@@ -588,6 +588,9 @@
|
|
iram: sram@ffff4c00 {
|
|
compatible = "mmio-sram";
|
|
reg = <0xffff4c00 0xb400>;
|
|
+ ranges = <0 0xffff4c00 0xb400>;
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <1>;
|
|
};
|
|
};
|
|
};
|
|
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi
|
|
index 130b4145af827..b15df16ecb01a 100644
|
|
--- a/arch/arm/boot/dts/imx28.dtsi
|
|
+++ b/arch/arm/boot/dts/imx28.dtsi
|
|
@@ -994,7 +994,7 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- dma_apbx: dma-apbx@80024000 {
|
|
+ dma_apbx: dma-controller@80024000 {
|
|
compatible = "fsl,imx28-dma-apbx";
|
|
reg = <0x80024000 0x2000>;
|
|
interrupts = <78 79 66 0
|
|
diff --git a/arch/arm/boot/dts/imx7d.dtsi b/arch/arm/boot/dts/imx7d.dtsi
|
|
index 7ceb7c09f7ad4..7ef685fdda55e 100644
|
|
--- a/arch/arm/boot/dts/imx7d.dtsi
|
|
+++ b/arch/arm/boot/dts/imx7d.dtsi
|
|
@@ -208,9 +208,6 @@
|
|
};
|
|
|
|
&ca_funnel_in_ports {
|
|
- #address-cells = <1>;
|
|
- #size-cells = <0>;
|
|
-
|
|
port@1 {
|
|
reg = <1>;
|
|
ca_funnel_in_port1: endpoint {
|
|
diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
|
|
index 45947707134b8..4b23630fc738d 100644
|
|
--- a/arch/arm/boot/dts/imx7s.dtsi
|
|
+++ b/arch/arm/boot/dts/imx7s.dtsi
|
|
@@ -190,7 +190,11 @@
|
|
clock-names = "apb_pclk";
|
|
|
|
ca_funnel_in_ports: in-ports {
|
|
- port {
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+
|
|
+ port@0 {
|
|
+ reg = <0>;
|
|
ca_funnel_in_port0: endpoint {
|
|
remote-endpoint = <&etm0_out_port>;
|
|
};
|
|
@@ -814,7 +818,7 @@
|
|
};
|
|
|
|
lcdif: lcdif@30730000 {
|
|
- compatible = "fsl,imx7d-lcdif", "fsl,imx28-lcdif";
|
|
+ compatible = "fsl,imx7d-lcdif", "fsl,imx6sx-lcdif";
|
|
reg = <0x30730000 0x10000>;
|
|
interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>,
|
|
@@ -1279,7 +1283,7 @@
|
|
gpmi: nand-controller@33002000{
|
|
compatible = "fsl,imx7d-gpmi-nand";
|
|
#address-cells = <1>;
|
|
- #size-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
|
|
reg-names = "gpmi-nand", "bch";
|
|
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
|
diff --git a/arch/arm/boot/dts/rk3036.dtsi b/arch/arm/boot/dts/rk3036.dtsi
|
|
index 78686fc72ce69..c420c7c642cb0 100644
|
|
--- a/arch/arm/boot/dts/rk3036.dtsi
|
|
+++ b/arch/arm/boot/dts/rk3036.dtsi
|
|
@@ -402,12 +402,20 @@
|
|
pinctrl-0 = <&hdmi_ctl>;
|
|
status = "disabled";
|
|
|
|
- hdmi_in: port {
|
|
+ ports {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
- hdmi_in_vop: endpoint@0 {
|
|
+
|
|
+ hdmi_in: port@0 {
|
|
reg = <0>;
|
|
- remote-endpoint = <&vop_out_hdmi>;
|
|
+
|
|
+ hdmi_in_vop: endpoint {
|
|
+ remote-endpoint = <&vop_out_hdmi>;
|
|
+ };
|
|
+ };
|
|
+
|
|
+ hdmi_out: port@1 {
|
|
+ reg = <1>;
|
|
};
|
|
};
|
|
};
|
|
diff --git a/arch/arm/include/asm/irq_work.h b/arch/arm/include/asm/irq_work.h
|
|
index 3149e4dc1b540..8895999834cc0 100644
|
|
--- a/arch/arm/include/asm/irq_work.h
|
|
+++ b/arch/arm/include/asm/irq_work.h
|
|
@@ -9,6 +9,4 @@ static inline bool arch_irq_work_has_interrupt(void)
|
|
return is_smp();
|
|
}
|
|
|
|
-extern void arch_irq_work_raise(void);
|
|
-
|
|
#endif /* _ASM_ARM_IRQ_WORK_H */
|
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts b/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts
|
|
index 8ffbcb2b1ac59..bbd3c05cbd908 100644
|
|
--- a/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts
|
|
+++ b/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts
|
|
@@ -15,7 +15,7 @@
|
|
#size-cells = <2>;
|
|
|
|
aliases {
|
|
- serial0 = &uart_B;
|
|
+ serial0 = &uart_b;
|
|
};
|
|
|
|
memory@0 {
|
|
@@ -25,6 +25,6 @@
|
|
|
|
};
|
|
|
|
-&uart_B {
|
|
+&uart_b {
|
|
status = "okay";
|
|
};
|
|
diff --git a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi
|
|
index ad50cba42d19a..372a03762d69b 100644
|
|
--- a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi
|
|
+++ b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi
|
|
@@ -118,14 +118,14 @@
|
|
<10 11 12 13 14 15 16 17 18 19 20 21>;
|
|
};
|
|
|
|
- uart_B: serial@7a000 {
|
|
+ uart_b: serial@7a000 {
|
|
compatible = "amlogic,meson-s4-uart",
|
|
"amlogic,meson-ao-uart";
|
|
reg = <0x0 0x7a000 0x0 0x18>;
|
|
interrupts = <GIC_SPI 169 IRQ_TYPE_EDGE_RISING>;
|
|
- status = "disabled";
|
|
clocks = <&xtal>, <&xtal>, <&xtal>;
|
|
clock-names = "xtal", "pclk", "baud";
|
|
+ status = "disabled";
|
|
};
|
|
|
|
reset: reset-controller@2000 {
|
|
diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi
|
|
index 9de2248a385a5..789121171a110 100644
|
|
--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi
|
|
@@ -390,6 +390,19 @@
|
|
reg = <0x0 0x80000000 0x0 0x0>;
|
|
};
|
|
|
|
+ etm {
|
|
+ compatible = "qcom,coresight-remote-etm";
|
|
+
|
|
+ out-ports {
|
|
+ port {
|
|
+ modem_etm_out_funnel_in2: endpoint {
|
|
+ remote-endpoint =
|
|
+ <&funnel_in2_in_modem_etm>;
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+ };
|
|
+
|
|
psci {
|
|
compatible = "arm,psci-1.0";
|
|
method = "smc";
|
|
@@ -2565,6 +2578,14 @@
|
|
clocks = <&rpmcc RPM_QDSS_CLK>, <&rpmcc RPM_QDSS_A_CLK>;
|
|
clock-names = "apb_pclk", "atclk";
|
|
|
|
+ in-ports {
|
|
+ port {
|
|
+ funnel_in2_in_modem_etm: endpoint {
|
|
+ remote-endpoint =
|
|
+ <&modem_etm_out_funnel_in2>;
|
|
+ };
|
|
+ };
|
|
+ };
|
|
|
|
out-ports {
|
|
port {
|
|
diff --git a/arch/arm64/boot/dts/qcom/msm8998.dtsi b/arch/arm64/boot/dts/qcom/msm8998.dtsi
|
|
index b00b8164c4aa2..7a41250539ff5 100644
|
|
--- a/arch/arm64/boot/dts/qcom/msm8998.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/msm8998.dtsi
|
|
@@ -1903,9 +1903,11 @@
|
|
|
|
cpu = <&CPU4>;
|
|
|
|
- port{
|
|
- etm4_out: endpoint {
|
|
- remote-endpoint = <&apss_funnel_in4>;
|
|
+ out-ports {
|
|
+ port{
|
|
+ etm4_out: endpoint {
|
|
+ remote-endpoint = <&apss_funnel_in4>;
|
|
+ };
|
|
};
|
|
};
|
|
};
|
|
@@ -1920,9 +1922,11 @@
|
|
|
|
cpu = <&CPU5>;
|
|
|
|
- port{
|
|
- etm5_out: endpoint {
|
|
- remote-endpoint = <&apss_funnel_in5>;
|
|
+ out-ports {
|
|
+ port{
|
|
+ etm5_out: endpoint {
|
|
+ remote-endpoint = <&apss_funnel_in5>;
|
|
+ };
|
|
};
|
|
};
|
|
};
|
|
@@ -1937,9 +1941,11 @@
|
|
|
|
cpu = <&CPU6>;
|
|
|
|
- port{
|
|
- etm6_out: endpoint {
|
|
- remote-endpoint = <&apss_funnel_in6>;
|
|
+ out-ports {
|
|
+ port{
|
|
+ etm6_out: endpoint {
|
|
+ remote-endpoint = <&apss_funnel_in6>;
|
|
+ };
|
|
};
|
|
};
|
|
};
|
|
@@ -1954,9 +1960,11 @@
|
|
|
|
cpu = <&CPU7>;
|
|
|
|
- port{
|
|
- etm7_out: endpoint {
|
|
- remote-endpoint = <&apss_funnel_in7>;
|
|
+ out-ports {
|
|
+ port{
|
|
+ etm7_out: endpoint {
|
|
+ remote-endpoint = <&apss_funnel_in7>;
|
|
+ };
|
|
};
|
|
};
|
|
};
|
|
diff --git a/arch/arm64/include/asm/irq_work.h b/arch/arm64/include/asm/irq_work.h
|
|
index 81bbfa3a035bd..a1020285ea750 100644
|
|
--- a/arch/arm64/include/asm/irq_work.h
|
|
+++ b/arch/arm64/include/asm/irq_work.h
|
|
@@ -2,8 +2,6 @@
|
|
#ifndef __ASM_IRQ_WORK_H
|
|
#define __ASM_IRQ_WORK_H
|
|
|
|
-extern void arch_irq_work_raise(void);
|
|
-
|
|
static inline bool arch_irq_work_has_interrupt(void)
|
|
{
|
|
return true;
|
|
diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c
|
|
index 38dbd3828f139..d2850b49a3710 100644
|
|
--- a/arch/arm64/kernel/irq.c
|
|
+++ b/arch/arm64/kernel/irq.c
|
|
@@ -22,6 +22,7 @@
|
|
#include <linux/vmalloc.h>
|
|
#include <asm/daifflags.h>
|
|
#include <asm/exception.h>
|
|
+#include <asm/numa.h>
|
|
#include <asm/vmap_stack.h>
|
|
#include <asm/softirq_stack.h>
|
|
|
|
@@ -46,17 +47,17 @@ static void init_irq_scs(void)
|
|
|
|
for_each_possible_cpu(cpu)
|
|
per_cpu(irq_shadow_call_stack_ptr, cpu) =
|
|
- scs_alloc(cpu_to_node(cpu));
|
|
+ scs_alloc(early_cpu_to_node(cpu));
|
|
}
|
|
|
|
#ifdef CONFIG_VMAP_STACK
|
|
-static void init_irq_stacks(void)
|
|
+static void __init init_irq_stacks(void)
|
|
{
|
|
int cpu;
|
|
unsigned long *p;
|
|
|
|
for_each_possible_cpu(cpu) {
|
|
- p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, cpu_to_node(cpu));
|
|
+ p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, early_cpu_to_node(cpu));
|
|
per_cpu(irq_stack_ptr, cpu) = p;
|
|
}
|
|
}
|
|
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
|
|
index 7b0643fe2f134..214b1805e536e 100644
|
|
--- a/arch/arm64/kernel/perf_event.c
|
|
+++ b/arch/arm64/kernel/perf_event.c
|
|
@@ -168,7 +168,11 @@ armv8pmu_events_sysfs_show(struct device *dev,
|
|
PMU_EVENT_ATTR_ID(name, armv8pmu_events_sysfs_show, config)
|
|
|
|
static struct attribute *armv8_pmuv3_event_attrs[] = {
|
|
- ARMV8_EVENT_ATTR(sw_incr, ARMV8_PMUV3_PERFCTR_SW_INCR),
|
|
+ /*
|
|
+ * Don't expose the sw_incr event in /sys. It's not usable as writes to
|
|
+ * PMSWINC_EL0 will trap as PMUSERENR.{SW,EN}=={0,0} and event rotation
|
|
+ * means we don't have a fixed event<->counter relationship regardless.
|
|
+ */
|
|
ARMV8_EVENT_ATTR(l1i_cache_refill, ARMV8_PMUV3_PERFCTR_L1I_CACHE_REFILL),
|
|
ARMV8_EVENT_ATTR(l1i_tlb_refill, ARMV8_PMUV3_PERFCTR_L1I_TLB_REFILL),
|
|
ARMV8_EVENT_ATTR(l1d_cache_refill, ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL),
|
|
diff --git a/arch/csky/include/asm/irq_work.h b/arch/csky/include/asm/irq_work.h
|
|
index 33aaf39d6f94f..d39fcc1f5395f 100644
|
|
--- a/arch/csky/include/asm/irq_work.h
|
|
+++ b/arch/csky/include/asm/irq_work.h
|
|
@@ -7,5 +7,5 @@ static inline bool arch_irq_work_has_interrupt(void)
|
|
{
|
|
return true;
|
|
}
|
|
-extern void arch_irq_work_raise(void);
|
|
+
|
|
#endif /* __ASM_CSKY_IRQ_WORK_H */
|
|
diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c
|
|
index 434bfc1cd31a4..e0404df2c952f 100644
|
|
--- a/arch/loongarch/kernel/smp.c
|
|
+++ b/arch/loongarch/kernel/smp.c
|
|
@@ -473,7 +473,6 @@ asmlinkage void start_secondary(void)
|
|
sync_counter();
|
|
cpu = raw_smp_processor_id();
|
|
set_my_cpu_offset(per_cpu_offset(cpu));
|
|
- rcu_cpu_starting(cpu);
|
|
|
|
cpu_probe();
|
|
constant_clockevent_init();
|
|
diff --git a/arch/loongarch/mm/tlb.c b/arch/loongarch/mm/tlb.c
|
|
index da3681f131c8d..eeb2d815cfa2a 100644
|
|
--- a/arch/loongarch/mm/tlb.c
|
|
+++ b/arch/loongarch/mm/tlb.c
|
|
@@ -271,12 +271,16 @@ void setup_tlb_handler(int cpu)
|
|
set_handler(EXCCODE_TLBNR * VECSIZE, handle_tlb_protect, VECSIZE);
|
|
set_handler(EXCCODE_TLBNX * VECSIZE, handle_tlb_protect, VECSIZE);
|
|
set_handler(EXCCODE_TLBPE * VECSIZE, handle_tlb_protect, VECSIZE);
|
|
- }
|
|
+ } else {
|
|
+ int vec_sz __maybe_unused;
|
|
+ void *addr __maybe_unused;
|
|
+ struct page *page __maybe_unused;
|
|
+
|
|
+ /* Avoid lockdep warning */
|
|
+ rcu_cpu_starting(cpu);
|
|
+
|
|
#ifdef CONFIG_NUMA
|
|
- else {
|
|
- void *addr;
|
|
- struct page *page;
|
|
- const int vec_sz = sizeof(exception_handlers);
|
|
+ vec_sz = sizeof(exception_handlers);
|
|
|
|
if (pcpu_handlers[cpu])
|
|
return;
|
|
@@ -292,8 +296,8 @@ void setup_tlb_handler(int cpu)
|
|
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_EENTRY);
|
|
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_MERRENTRY);
|
|
csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY);
|
|
- }
|
|
#endif
|
|
+ }
|
|
}
|
|
|
|
void tlb_init(int cpu)
|
|
diff --git a/arch/powerpc/include/asm/irq_work.h b/arch/powerpc/include/asm/irq_work.h
|
|
index b8b0be8f1a07e..c6d3078bd8c3b 100644
|
|
--- a/arch/powerpc/include/asm/irq_work.h
|
|
+++ b/arch/powerpc/include/asm/irq_work.h
|
|
@@ -6,6 +6,5 @@ static inline bool arch_irq_work_has_interrupt(void)
|
|
{
|
|
return true;
|
|
}
|
|
-extern void arch_irq_work_raise(void);
|
|
|
|
#endif /* _ASM_POWERPC_IRQ_WORK_H */
|
|
diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h
|
|
index 94b981152667c..07fabb054aea4 100644
|
|
--- a/arch/powerpc/include/asm/mmu.h
|
|
+++ b/arch/powerpc/include/asm/mmu.h
|
|
@@ -417,5 +417,9 @@ extern void *abatron_pteptrs[2];
|
|
#include <asm/nohash/mmu.h>
|
|
#endif
|
|
|
|
+#if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP)
|
|
+#define __HAVE_ARCH_RESERVED_KERNEL_PAGES
|
|
+#endif
|
|
+
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_POWERPC_MMU_H_ */
|
|
diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h
|
|
index 4c6c6dbd182f4..da827d2d08666 100644
|
|
--- a/arch/powerpc/include/asm/mmzone.h
|
|
+++ b/arch/powerpc/include/asm/mmzone.h
|
|
@@ -42,14 +42,6 @@ u64 memory_hotplug_max(void);
|
|
#else
|
|
#define memory_hotplug_max() memblock_end_of_DRAM()
|
|
#endif /* CONFIG_NUMA */
|
|
-#ifdef CONFIG_FA_DUMP
|
|
-#define __HAVE_ARCH_RESERVED_KERNEL_PAGES
|
|
-#endif
|
|
-
|
|
-#ifdef CONFIG_MEMORY_HOTPLUG
|
|
-extern int create_section_mapping(unsigned long start, unsigned long end,
|
|
- int nid, pgprot_t prot);
|
|
-#endif
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_MMZONE_H_ */
|
|
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
|
|
index 3956f32682c62..362b712386f64 100644
|
|
--- a/arch/powerpc/kernel/traps.c
|
|
+++ b/arch/powerpc/kernel/traps.c
|
|
@@ -1439,10 +1439,12 @@ static int emulate_instruction(struct pt_regs *regs)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+#ifdef CONFIG_GENERIC_BUG
|
|
int is_valid_bugaddr(unsigned long addr)
|
|
{
|
|
return is_kernel_addr(addr);
|
|
}
|
|
+#endif
|
|
|
|
#ifdef CONFIG_MATH_EMULATION
|
|
static int emulate_math(struct pt_regs *regs)
|
|
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
|
|
index 398b5694aeb70..ec30af8eadb7d 100644
|
|
--- a/arch/powerpc/lib/sstep.c
|
|
+++ b/arch/powerpc/lib/sstep.c
|
|
@@ -586,6 +586,8 @@ static int do_fp_load(struct instruction_op *op, unsigned long ea,
|
|
} u;
|
|
|
|
nb = GETSIZE(op->type);
|
|
+ if (nb > sizeof(u))
|
|
+ return -EINVAL;
|
|
if (!address_ok(regs, ea, nb))
|
|
return -EFAULT;
|
|
rn = op->reg;
|
|
@@ -636,6 +638,8 @@ static int do_fp_store(struct instruction_op *op, unsigned long ea,
|
|
} u;
|
|
|
|
nb = GETSIZE(op->type);
|
|
+ if (nb > sizeof(u))
|
|
+ return -EINVAL;
|
|
if (!address_ok(regs, ea, nb))
|
|
return -EFAULT;
|
|
rn = op->reg;
|
|
@@ -680,6 +684,9 @@ static nokprobe_inline int do_vec_load(int rn, unsigned long ea,
|
|
u8 b[sizeof(__vector128)];
|
|
} u = {};
|
|
|
|
+ if (size > sizeof(u))
|
|
+ return -EINVAL;
|
|
+
|
|
if (!address_ok(regs, ea & ~0xfUL, 16))
|
|
return -EFAULT;
|
|
/* align to multiple of size */
|
|
@@ -707,6 +714,9 @@ static nokprobe_inline int do_vec_store(int rn, unsigned long ea,
|
|
u8 b[sizeof(__vector128)];
|
|
} u;
|
|
|
|
+ if (size > sizeof(u))
|
|
+ return -EINVAL;
|
|
+
|
|
if (!address_ok(regs, ea & ~0xfUL, 16))
|
|
return -EFAULT;
|
|
/* align to multiple of size */
|
|
diff --git a/arch/powerpc/mm/book3s64/pgtable.c b/arch/powerpc/mm/book3s64/pgtable.c
|
|
index f6151a5892982..87aa76c737995 100644
|
|
--- a/arch/powerpc/mm/book3s64/pgtable.c
|
|
+++ b/arch/powerpc/mm/book3s64/pgtable.c
|
|
@@ -463,6 +463,7 @@ void ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr,
|
|
set_pte_at(vma->vm_mm, addr, ptep, pte);
|
|
}
|
|
|
|
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
/*
|
|
* For hash translation mode, we use the deposited table to store hash slot
|
|
* information and they are stored at PTRS_PER_PMD offset from related pmd
|
|
@@ -484,6 +485,7 @@ int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
|
|
|
return true;
|
|
}
|
|
+#endif
|
|
|
|
/*
|
|
* Does the CPU support tlbie?
|
|
diff --git a/arch/powerpc/mm/init-common.c b/arch/powerpc/mm/init-common.c
|
|
index 119ef491f7976..d3a7726ecf512 100644
|
|
--- a/arch/powerpc/mm/init-common.c
|
|
+++ b/arch/powerpc/mm/init-common.c
|
|
@@ -126,7 +126,7 @@ void pgtable_cache_add(unsigned int shift)
|
|
* as to leave enough 0 bits in the address to contain it. */
|
|
unsigned long minalign = max(MAX_PGTABLE_INDEX_SIZE + 1,
|
|
HUGEPD_SHIFT_MASK + 1);
|
|
- struct kmem_cache *new;
|
|
+ struct kmem_cache *new = NULL;
|
|
|
|
/* It would be nice if this was a BUILD_BUG_ON(), but at the
|
|
* moment, gcc doesn't seem to recognize is_power_of_2 as a
|
|
@@ -139,7 +139,8 @@ void pgtable_cache_add(unsigned int shift)
|
|
|
|
align = max_t(unsigned long, align, minalign);
|
|
name = kasprintf(GFP_KERNEL, "pgtable-2^%d", shift);
|
|
- new = kmem_cache_create(name, table_size, align, 0, ctor(shift));
|
|
+ if (name)
|
|
+ new = kmem_cache_create(name, table_size, align, 0, ctor(shift));
|
|
if (!new)
|
|
panic("Could not allocate pgtable cache for order %d", shift);
|
|
|
|
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h
|
|
index bd9784f77f2ee..71250605b7845 100644
|
|
--- a/arch/powerpc/mm/mmu_decl.h
|
|
+++ b/arch/powerpc/mm/mmu_decl.h
|
|
@@ -179,3 +179,8 @@ static inline bool debug_pagealloc_enabled_or_kfence(void)
|
|
{
|
|
return IS_ENABLED(CONFIG_KFENCE) || debug_pagealloc_enabled();
|
|
}
|
|
+
|
|
+#ifdef CONFIG_MEMORY_HOTPLUG
|
|
+int create_section_mapping(unsigned long start, unsigned long end,
|
|
+ int nid, pgprot_t prot);
|
|
+#endif
|
|
diff --git a/arch/riscv/include/asm/irq_work.h b/arch/riscv/include/asm/irq_work.h
|
|
index b53891964ae03..b27a4d64fc6a0 100644
|
|
--- a/arch/riscv/include/asm/irq_work.h
|
|
+++ b/arch/riscv/include/asm/irq_work.h
|
|
@@ -6,5 +6,5 @@ static inline bool arch_irq_work_has_interrupt(void)
|
|
{
|
|
return IS_ENABLED(CONFIG_SMP);
|
|
}
|
|
-extern void arch_irq_work_raise(void);
|
|
+
|
|
#endif /* _ASM_RISCV_IRQ_WORK_H */
|
|
diff --git a/arch/s390/include/asm/irq_work.h b/arch/s390/include/asm/irq_work.h
|
|
index 603783766d0ab..f00c9f610d5a8 100644
|
|
--- a/arch/s390/include/asm/irq_work.h
|
|
+++ b/arch/s390/include/asm/irq_work.h
|
|
@@ -7,6 +7,4 @@ static inline bool arch_irq_work_has_interrupt(void)
|
|
return true;
|
|
}
|
|
|
|
-void arch_irq_work_raise(void);
|
|
-
|
|
#endif /* _ASM_S390_IRQ_WORK_H */
|
|
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
|
|
index 092b16b4dd4f6..6b442edb38571 100644
|
|
--- a/arch/s390/kernel/ptrace.c
|
|
+++ b/arch/s390/kernel/ptrace.c
|
|
@@ -385,6 +385,7 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
|
/*
|
|
* floating point control reg. is in the thread structure
|
|
*/
|
|
+ save_fpu_regs();
|
|
if ((unsigned int) data != 0 ||
|
|
test_fp_ctl(data >> (BITS_PER_LONG - 32)))
|
|
return -EINVAL;
|
|
@@ -741,6 +742,7 @@ static int __poke_user_compat(struct task_struct *child,
|
|
/*
|
|
* floating point control reg. is in the thread structure
|
|
*/
|
|
+ save_fpu_regs();
|
|
if (test_fp_ctl(tmp))
|
|
return -EINVAL;
|
|
child->thread.fpu.fpc = data;
|
|
@@ -904,9 +906,7 @@ static int s390_fpregs_set(struct task_struct *target,
|
|
int rc = 0;
|
|
freg_t fprs[__NUM_FPRS];
|
|
|
|
- if (target == current)
|
|
- save_fpu_regs();
|
|
-
|
|
+ save_fpu_regs();
|
|
if (MACHINE_HAS_VX)
|
|
convert_vx_to_fp(fprs, target->thread.fpu.vxrs);
|
|
else
|
|
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
|
|
index 3775363471f0c..f604946ab2c85 100644
|
|
--- a/arch/s390/kvm/kvm-s390.c
|
|
+++ b/arch/s390/kvm/kvm-s390.c
|
|
@@ -4138,10 +4138,6 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
|
|
|
|
vcpu_load(vcpu);
|
|
|
|
- if (test_fp_ctl(fpu->fpc)) {
|
|
- ret = -EINVAL;
|
|
- goto out;
|
|
- }
|
|
vcpu->run->s.regs.fpc = fpu->fpc;
|
|
if (MACHINE_HAS_VX)
|
|
convert_fp_to_vx((__vector128 *) vcpu->run->s.regs.vrs,
|
|
@@ -4149,7 +4145,6 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
|
|
else
|
|
memcpy(vcpu->run->s.regs.fprs, &fpu->fprs, sizeof(fpu->fprs));
|
|
|
|
-out:
|
|
vcpu_put(vcpu);
|
|
return ret;
|
|
}
|
|
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
|
|
index 3d7836c465070..cabcc501b448a 100644
|
|
--- a/arch/um/drivers/net_kern.c
|
|
+++ b/arch/um/drivers/net_kern.c
|
|
@@ -204,7 +204,7 @@ static int uml_net_close(struct net_device *dev)
|
|
return 0;
|
|
}
|
|
|
|
-static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
+static netdev_tx_t uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
struct uml_net_private *lp = netdev_priv(dev);
|
|
unsigned long flags;
|
|
diff --git a/arch/um/include/shared/kern_util.h b/arch/um/include/shared/kern_util.h
|
|
index d8b8b4f07e429..444bae755b16a 100644
|
|
--- a/arch/um/include/shared/kern_util.h
|
|
+++ b/arch/um/include/shared/kern_util.h
|
|
@@ -50,7 +50,7 @@ extern void do_uml_exitcalls(void);
|
|
* Are we disallowed to sleep? Used to choose between GFP_KERNEL and
|
|
* GFP_ATOMIC.
|
|
*/
|
|
-extern int __cant_sleep(void);
|
|
+extern int __uml_cant_sleep(void);
|
|
extern int get_current_pid(void);
|
|
extern int copy_from_user_proc(void *to, void *from, int size);
|
|
extern char *uml_strdup(const char *string);
|
|
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
|
|
index 010bc422a09dd..a351c87db2488 100644
|
|
--- a/arch/um/kernel/process.c
|
|
+++ b/arch/um/kernel/process.c
|
|
@@ -220,7 +220,7 @@ void arch_cpu_idle(void)
|
|
raw_local_irq_enable();
|
|
}
|
|
|
|
-int __cant_sleep(void) {
|
|
+int __uml_cant_sleep(void) {
|
|
return in_atomic() || irqs_disabled() || in_interrupt();
|
|
/* Is in_interrupt() really needed? */
|
|
}
|
|
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
|
|
index fddd1dec27e6d..3e270da6b6f67 100644
|
|
--- a/arch/um/kernel/time.c
|
|
+++ b/arch/um/kernel/time.c
|
|
@@ -432,9 +432,29 @@ static void time_travel_update_time(unsigned long long next, bool idle)
|
|
time_travel_del_event(&ne);
|
|
}
|
|
|
|
+static void time_travel_update_time_rel(unsigned long long offs)
|
|
+{
|
|
+ unsigned long flags;
|
|
+
|
|
+ /*
|
|
+ * Disable interrupts before calculating the new time so
|
|
+ * that a real timer interrupt (signal) can't happen at
|
|
+ * a bad time e.g. after we read time_travel_time but
|
|
+ * before we've completed updating the time.
|
|
+ */
|
|
+ local_irq_save(flags);
|
|
+ time_travel_update_time(time_travel_time + offs, false);
|
|
+ local_irq_restore(flags);
|
|
+}
|
|
+
|
|
void time_travel_ndelay(unsigned long nsec)
|
|
{
|
|
- time_travel_update_time(time_travel_time + nsec, false);
|
|
+ /*
|
|
+ * Not strictly needed to use _rel() version since this is
|
|
+ * only used in INFCPU/EXT modes, but it doesn't hurt and
|
|
+ * is more readable too.
|
|
+ */
|
|
+ time_travel_update_time_rel(nsec);
|
|
}
|
|
EXPORT_SYMBOL(time_travel_ndelay);
|
|
|
|
@@ -568,7 +588,11 @@ static void time_travel_set_start(void)
|
|
#define time_travel_time 0
|
|
#define time_travel_ext_waiting 0
|
|
|
|
-static inline void time_travel_update_time(unsigned long long ns, bool retearly)
|
|
+static inline void time_travel_update_time(unsigned long long ns, bool idle)
|
|
+{
|
|
+}
|
|
+
|
|
+static inline void time_travel_update_time_rel(unsigned long long offs)
|
|
{
|
|
}
|
|
|
|
@@ -720,9 +744,7 @@ static u64 timer_read(struct clocksource *cs)
|
|
*/
|
|
if (!irqs_disabled() && !in_interrupt() && !in_softirq() &&
|
|
!time_travel_ext_waiting)
|
|
- time_travel_update_time(time_travel_time +
|
|
- TIMER_MULTIPLIER,
|
|
- false);
|
|
+ time_travel_update_time_rel(TIMER_MULTIPLIER);
|
|
return time_travel_time / TIMER_MULTIPLIER;
|
|
}
|
|
|
|
diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c
|
|
index b459745f52e24..3cb8ac63be6ed 100644
|
|
--- a/arch/um/os-Linux/helper.c
|
|
+++ b/arch/um/os-Linux/helper.c
|
|
@@ -46,7 +46,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
|
|
unsigned long stack, sp;
|
|
int pid, fds[2], ret, n;
|
|
|
|
- stack = alloc_stack(0, __cant_sleep());
|
|
+ stack = alloc_stack(0, __uml_cant_sleep());
|
|
if (stack == 0)
|
|
return -ENOMEM;
|
|
|
|
@@ -70,7 +70,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
|
|
data.pre_data = pre_data;
|
|
data.argv = argv;
|
|
data.fd = fds[1];
|
|
- data.buf = __cant_sleep() ? uml_kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
|
|
+ data.buf = __uml_cant_sleep() ? uml_kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
|
|
uml_kmalloc(PATH_MAX, UM_GFP_KERNEL);
|
|
pid = clone(helper_child, (void *) sp, CLONE_VM, &data);
|
|
if (pid < 0) {
|
|
@@ -121,7 +121,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
|
unsigned long stack, sp;
|
|
int pid, status, err;
|
|
|
|
- stack = alloc_stack(0, __cant_sleep());
|
|
+ stack = alloc_stack(0, __uml_cant_sleep());
|
|
if (stack == 0)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/arch/um/os-Linux/util.c b/arch/um/os-Linux/util.c
|
|
index fc0f2a9dee5af..1dca4ffbd572f 100644
|
|
--- a/arch/um/os-Linux/util.c
|
|
+++ b/arch/um/os-Linux/util.c
|
|
@@ -173,23 +173,38 @@ __uml_setup("quiet", quiet_cmd_param,
|
|
"quiet\n"
|
|
" Turns off information messages during boot.\n\n");
|
|
|
|
+/*
|
|
+ * The os_info/os_warn functions will be called by helper threads. These
|
|
+ * have a very limited stack size and using the libc formatting functions
|
|
+ * may overflow the stack.
|
|
+ * So pull in the kernel vscnprintf and use that instead with a fixed
|
|
+ * on-stack buffer.
|
|
+ */
|
|
+int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
|
|
+
|
|
void os_info(const char *fmt, ...)
|
|
{
|
|
+ char buf[256];
|
|
va_list list;
|
|
+ int len;
|
|
|
|
if (quiet_info)
|
|
return;
|
|
|
|
va_start(list, fmt);
|
|
- vfprintf(stderr, fmt, list);
|
|
+ len = vscnprintf(buf, sizeof(buf), fmt, list);
|
|
+ fwrite(buf, len, 1, stderr);
|
|
va_end(list);
|
|
}
|
|
|
|
void os_warn(const char *fmt, ...)
|
|
{
|
|
+ char buf[256];
|
|
va_list list;
|
|
+ int len;
|
|
|
|
va_start(list, fmt);
|
|
- vfprintf(stderr, fmt, list);
|
|
+ len = vscnprintf(buf, sizeof(buf), fmt, list);
|
|
+ fwrite(buf, len, 1, stderr);
|
|
va_end(list);
|
|
}
|
|
diff --git a/arch/x86/boot/compressed/ident_map_64.c b/arch/x86/boot/compressed/ident_map_64.c
|
|
index b4155273df891..d34222816c9f5 100644
|
|
--- a/arch/x86/boot/compressed/ident_map_64.c
|
|
+++ b/arch/x86/boot/compressed/ident_map_64.c
|
|
@@ -393,3 +393,8 @@ void do_boot_page_fault(struct pt_regs *regs, unsigned long error_code)
|
|
*/
|
|
kernel_add_identity_map(address, end);
|
|
}
|
|
+
|
|
+void do_boot_nmi_trap(struct pt_regs *regs, unsigned long error_code)
|
|
+{
|
|
+ /* Empty handler to ignore NMI during early boot */
|
|
+}
|
|
diff --git a/arch/x86/boot/compressed/idt_64.c b/arch/x86/boot/compressed/idt_64.c
|
|
index 3cdf94b414567..d100284bbef47 100644
|
|
--- a/arch/x86/boot/compressed/idt_64.c
|
|
+++ b/arch/x86/boot/compressed/idt_64.c
|
|
@@ -61,6 +61,7 @@ void load_stage2_idt(void)
|
|
boot_idt_desc.address = (unsigned long)boot_idt;
|
|
|
|
set_idt_entry(X86_TRAP_PF, boot_page_fault);
|
|
+ set_idt_entry(X86_TRAP_NMI, boot_nmi_trap);
|
|
|
|
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
|
/*
|
|
diff --git a/arch/x86/boot/compressed/idt_handlers_64.S b/arch/x86/boot/compressed/idt_handlers_64.S
|
|
index 22890e199f5b4..4d03c8562f637 100644
|
|
--- a/arch/x86/boot/compressed/idt_handlers_64.S
|
|
+++ b/arch/x86/boot/compressed/idt_handlers_64.S
|
|
@@ -70,6 +70,7 @@ SYM_FUNC_END(\name)
|
|
.code64
|
|
|
|
EXCEPTION_HANDLER boot_page_fault do_boot_page_fault error_code=1
|
|
+EXCEPTION_HANDLER boot_nmi_trap do_boot_nmi_trap error_code=0
|
|
|
|
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
|
EXCEPTION_HANDLER boot_stage1_vc do_vc_no_ghcb error_code=1
|
|
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
|
|
index 20118fb7c53bb..a49d9219c06e5 100644
|
|
--- a/arch/x86/boot/compressed/misc.h
|
|
+++ b/arch/x86/boot/compressed/misc.h
|
|
@@ -190,6 +190,7 @@ static inline void cleanup_exception_handling(void) { }
|
|
|
|
/* IDT Entry Points */
|
|
void boot_page_fault(void);
|
|
+void boot_nmi_trap(void);
|
|
void boot_stage1_vc(void);
|
|
void boot_stage2_vc(void);
|
|
|
|
diff --git a/arch/x86/include/asm/irq_work.h b/arch/x86/include/asm/irq_work.h
|
|
index 800ffce0db29e..6b4d36c951655 100644
|
|
--- a/arch/x86/include/asm/irq_work.h
|
|
+++ b/arch/x86/include/asm/irq_work.h
|
|
@@ -9,7 +9,6 @@ static inline bool arch_irq_work_has_interrupt(void)
|
|
{
|
|
return boot_cpu_has(X86_FEATURE_APIC);
|
|
}
|
|
-extern void arch_irq_work_raise(void);
|
|
#else
|
|
static inline bool arch_irq_work_has_interrupt(void)
|
|
{
|
|
diff --git a/arch/x86/include/asm/kmsan.h b/arch/x86/include/asm/kmsan.h
|
|
index 8fa6ac0e2d766..d91b37f5b4bb4 100644
|
|
--- a/arch/x86/include/asm/kmsan.h
|
|
+++ b/arch/x86/include/asm/kmsan.h
|
|
@@ -64,6 +64,7 @@ static inline bool kmsan_virt_addr_valid(void *addr)
|
|
{
|
|
unsigned long x = (unsigned long)addr;
|
|
unsigned long y = x - __START_KERNEL_map;
|
|
+ bool ret;
|
|
|
|
/* use the carry flag to determine if x was < __START_KERNEL_map */
|
|
if (unlikely(x > y)) {
|
|
@@ -79,7 +80,21 @@ static inline bool kmsan_virt_addr_valid(void *addr)
|
|
return false;
|
|
}
|
|
|
|
- return pfn_valid(x >> PAGE_SHIFT);
|
|
+ /*
|
|
+ * pfn_valid() relies on RCU, and may call into the scheduler on exiting
|
|
+ * the critical section. However, this would result in recursion with
|
|
+ * KMSAN. Therefore, disable preemption here, and re-enable preemption
|
|
+ * below while suppressing reschedules to avoid recursion.
|
|
+ *
|
|
+ * Note, this sacrifices occasionally breaking scheduling guarantees.
|
|
+ * Although, a kernel compiled with KMSAN has already given up on any
|
|
+ * performance guarantees due to being heavily instrumented.
|
|
+ */
|
|
+ preempt_disable();
|
|
+ ret = pfn_valid(x >> PAGE_SHIFT);
|
|
+ preempt_enable_no_resched();
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
#endif /* !MODULE */
|
|
diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c
|
|
index f1a748da5fabb..cad6ea1911e9b 100644
|
|
--- a/arch/x86/kernel/cpu/mce/core.c
|
|
+++ b/arch/x86/kernel/cpu/mce/core.c
|
|
@@ -44,6 +44,7 @@
|
|
#include <linux/sync_core.h>
|
|
#include <linux/task_work.h>
|
|
#include <linux/hardirq.h>
|
|
+#include <linux/kexec.h>
|
|
|
|
#include <asm/intel-family.h>
|
|
#include <asm/processor.h>
|
|
@@ -239,6 +240,7 @@ static noinstr void mce_panic(const char *msg, struct mce *final, char *exp)
|
|
struct llist_node *pending;
|
|
struct mce_evt_llist *l;
|
|
int apei_err = 0;
|
|
+ struct page *p;
|
|
|
|
/*
|
|
* Allow instrumentation around external facilities usage. Not that it
|
|
@@ -292,6 +294,20 @@ static noinstr void mce_panic(const char *msg, struct mce *final, char *exp)
|
|
if (!fake_panic) {
|
|
if (panic_timeout == 0)
|
|
panic_timeout = mca_cfg.panic_timeout;
|
|
+
|
|
+ /*
|
|
+ * Kdump skips the poisoned page in order to avoid
|
|
+ * touching the error bits again. Poison the page even
|
|
+ * if the error is fatal and the machine is about to
|
|
+ * panic.
|
|
+ */
|
|
+ if (kexec_crash_loaded()) {
|
|
+ if (final && (final->status & MCI_STATUS_ADDRV)) {
|
|
+ p = pfn_to_online_page(final->addr >> PAGE_SHIFT);
|
|
+ if (p)
|
|
+ SetPageHWPoison(p);
|
|
+ }
|
|
+ }
|
|
panic(msg);
|
|
} else
|
|
pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg);
|
|
diff --git a/block/bio.c b/block/bio.c
|
|
index 6c22dd7b6f278..74c2818c7ec99 100644
|
|
--- a/block/bio.c
|
|
+++ b/block/bio.c
|
|
@@ -927,7 +927,7 @@ static bool bio_try_merge_hw_seg(struct request_queue *q, struct bio *bio,
|
|
|
|
if ((addr1 | mask) != (addr2 | mask))
|
|
return false;
|
|
- if (bv->bv_len + len > queue_max_segment_size(q))
|
|
+ if (len > queue_max_segment_size(q) - bv->bv_len)
|
|
return false;
|
|
return __bio_try_merge_page(bio, page, len, offset, same_page);
|
|
}
|
|
diff --git a/block/blk-mq.c b/block/blk-mq.c
|
|
index b3f99dda45300..c07e5eebcbd85 100644
|
|
--- a/block/blk-mq.c
|
|
+++ b/block/blk-mq.c
|
|
@@ -1859,6 +1859,22 @@ static bool blk_mq_mark_tag_wait(struct blk_mq_hw_ctx *hctx,
|
|
wait->flags &= ~WQ_FLAG_EXCLUSIVE;
|
|
__add_wait_queue(wq, wait);
|
|
|
|
+ /*
|
|
+ * Add one explicit barrier since blk_mq_get_driver_tag() may
|
|
+ * not imply barrier in case of failure.
|
|
+ *
|
|
+ * Order adding us to wait queue and allocating driver tag.
|
|
+ *
|
|
+ * The pair is the one implied in sbitmap_queue_wake_up() which
|
|
+ * orders clearing sbitmap tag bits and waitqueue_active() in
|
|
+ * __sbitmap_queue_wake_up(), since waitqueue_active() is lockless
|
|
+ *
|
|
+ * Otherwise, re-order of adding wait queue and getting driver tag
|
|
+ * may cause __sbitmap_queue_wake_up() to wake up nothing because
|
|
+ * the waitqueue_active() may not observe us in wait queue.
|
|
+ */
|
|
+ smp_mb();
|
|
+
|
|
/*
|
|
* It's possible that a tag was freed in the window between the
|
|
* allocation failure and adding the hardware queue to the wait
|
|
diff --git a/drivers/acpi/acpi_extlog.c b/drivers/acpi/acpi_extlog.c
|
|
index 088db2356998f..0a84d5afd37c1 100644
|
|
--- a/drivers/acpi/acpi_extlog.c
|
|
+++ b/drivers/acpi/acpi_extlog.c
|
|
@@ -308,9 +308,10 @@ err:
|
|
static void __exit extlog_exit(void)
|
|
{
|
|
mce_unregister_decode_chain(&extlog_mce_dec);
|
|
- ((struct extlog_l1_head *)extlog_l1_addr)->flags &= ~FLAG_OS_OPTIN;
|
|
- if (extlog_l1_addr)
|
|
+ if (extlog_l1_addr) {
|
|
+ ((struct extlog_l1_head *)extlog_l1_addr)->flags &= ~FLAG_OS_OPTIN;
|
|
acpi_os_unmap_iomem(extlog_l1_addr, l1_size);
|
|
+ }
|
|
if (elog_addr)
|
|
acpi_os_unmap_iomem(elog_addr, elog_size);
|
|
release_mem_region(elog_base, elog_size);
|
|
diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
|
|
index f7852fb75ab39..756ab8edde83f 100644
|
|
--- a/drivers/acpi/acpi_video.c
|
|
+++ b/drivers/acpi/acpi_video.c
|
|
@@ -513,6 +513,15 @@ static const struct dmi_system_id video_dmi_table[] = {
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3350"),
|
|
},
|
|
},
|
|
+ {
|
|
+ .callback = video_set_report_key_events,
|
|
+ .driver_data = (void *)((uintptr_t)REPORT_BRIGHTNESS_KEY_EVENTS),
|
|
+ .ident = "COLORFUL X15 AT 23",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "COLORFUL"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "X15 AT 23"),
|
|
+ },
|
|
+ },
|
|
/*
|
|
* Some machines change the brightness themselves when a brightness
|
|
* hotkey gets pressed, despite us telling them not to. In this case
|
|
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
|
|
index 9952f3a792bad..dd808cf65c841 100644
|
|
--- a/drivers/acpi/apei/ghes.c
|
|
+++ b/drivers/acpi/apei/ghes.c
|
|
@@ -99,6 +99,20 @@ static inline bool is_hest_type_generic_v2(struct ghes *ghes)
|
|
return ghes->generic->header.type == ACPI_HEST_TYPE_GENERIC_ERROR_V2;
|
|
}
|
|
|
|
+/*
|
|
+ * A platform may describe one error source for the handling of synchronous
|
|
+ * errors (e.g. MCE or SEA), or for handling asynchronous errors (e.g. SCI
|
|
+ * or External Interrupt). On x86, the HEST notifications are always
|
|
+ * asynchronous, so only SEA on ARM is delivered as a synchronous
|
|
+ * notification.
|
|
+ */
|
|
+static inline bool is_hest_sync_notify(struct ghes *ghes)
|
|
+{
|
|
+ u8 notify_type = ghes->generic->notify.type;
|
|
+
|
|
+ return notify_type == ACPI_HEST_NOTIFY_SEA;
|
|
+}
|
|
+
|
|
/*
|
|
* This driver isn't really modular, however for the time being,
|
|
* continuing to use module_param is the easiest way to remain
|
|
@@ -461,7 +475,7 @@ static bool ghes_do_memory_failure(u64 physical_addr, int flags)
|
|
}
|
|
|
|
static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata,
|
|
- int sev)
|
|
+ int sev, bool sync)
|
|
{
|
|
int flags = -1;
|
|
int sec_sev = ghes_severity(gdata->error_severity);
|
|
@@ -475,7 +489,7 @@ static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata,
|
|
(gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED))
|
|
flags = MF_SOFT_OFFLINE;
|
|
if (sev == GHES_SEV_RECOVERABLE && sec_sev == GHES_SEV_RECOVERABLE)
|
|
- flags = 0;
|
|
+ flags = sync ? MF_ACTION_REQUIRED : 0;
|
|
|
|
if (flags != -1)
|
|
return ghes_do_memory_failure(mem_err->physical_addr, flags);
|
|
@@ -483,9 +497,11 @@ static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata,
|
|
return false;
|
|
}
|
|
|
|
-static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, int sev)
|
|
+static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,
|
|
+ int sev, bool sync)
|
|
{
|
|
struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
|
|
+ int flags = sync ? MF_ACTION_REQUIRED : 0;
|
|
bool queued = false;
|
|
int sec_sev, i;
|
|
char *p;
|
|
@@ -510,7 +526,7 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, int s
|
|
* and don't filter out 'corrected' error here.
|
|
*/
|
|
if (is_cache && has_pa) {
|
|
- queued = ghes_do_memory_failure(err_info->physical_fault_addr, 0);
|
|
+ queued = ghes_do_memory_failure(err_info->physical_fault_addr, flags);
|
|
p += err_info->length;
|
|
continue;
|
|
}
|
|
@@ -631,6 +647,7 @@ static bool ghes_do_proc(struct ghes *ghes,
|
|
const guid_t *fru_id = &guid_null;
|
|
char *fru_text = "";
|
|
bool queued = false;
|
|
+ bool sync = is_hest_sync_notify(ghes);
|
|
|
|
sev = ghes_severity(estatus->error_severity);
|
|
apei_estatus_for_each_section(estatus, gdata) {
|
|
@@ -648,13 +665,13 @@ static bool ghes_do_proc(struct ghes *ghes,
|
|
ghes_edac_report_mem_error(sev, mem_err);
|
|
|
|
arch_apei_report_mem_error(sev, mem_err);
|
|
- queued = ghes_handle_memory_failure(gdata, sev);
|
|
+ queued = ghes_handle_memory_failure(gdata, sev, sync);
|
|
}
|
|
else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
|
|
ghes_handle_aer(gdata);
|
|
}
|
|
else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
|
|
- queued = ghes_handle_arm_hw_error(gdata, sev);
|
|
+ queued = ghes_handle_arm_hw_error(gdata, sev, sync);
|
|
} else {
|
|
void *err = acpi_hest_get_payload(gdata);
|
|
|
|
diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c
|
|
index 12f330b0eac01..b57de78fbf14f 100644
|
|
--- a/drivers/acpi/numa/srat.c
|
|
+++ b/drivers/acpi/numa/srat.c
|
|
@@ -183,7 +183,7 @@ static int __init slit_valid(struct acpi_table_slit *slit)
|
|
int i, j;
|
|
int d = slit->locality_count;
|
|
for (i = 0; i < d; i++) {
|
|
- for (j = 0; j < d; j++) {
|
|
+ for (j = 0; j < d; j++) {
|
|
u8 val = slit->entry[d*i + j];
|
|
if (i == j) {
|
|
if (val != LOCAL_DISTANCE)
|
|
@@ -532,7 +532,7 @@ int __init acpi_numa_init(void)
|
|
*/
|
|
|
|
/* fake_pxm is the next unused PXM value after SRAT parsing */
|
|
- for (i = 0, fake_pxm = -1; i < MAX_NUMNODES - 1; i++) {
|
|
+ for (i = 0, fake_pxm = -1; i < MAX_NUMNODES; i++) {
|
|
if (node_to_pxm_map[i] > fake_pxm)
|
|
fake_pxm = node_to_pxm_map[i];
|
|
}
|
|
diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c
|
|
index eaa31e567d1ec..5b59d133b6af4 100644
|
|
--- a/drivers/base/arch_numa.c
|
|
+++ b/drivers/base/arch_numa.c
|
|
@@ -144,7 +144,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid)
|
|
unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
|
|
EXPORT_SYMBOL(__per_cpu_offset);
|
|
|
|
-static int __init early_cpu_to_node(int cpu)
|
|
+int __init early_cpu_to_node(int cpu)
|
|
{
|
|
return cpu_to_node_map[cpu];
|
|
}
|
|
diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c
|
|
index 2cfed2e58d646..ad451224e6634 100644
|
|
--- a/drivers/block/rnbd/rnbd-srv.c
|
|
+++ b/drivers/block/rnbd/rnbd-srv.c
|
|
@@ -587,6 +587,7 @@ static char *rnbd_srv_get_full_path(struct rnbd_srv_session *srv_sess,
|
|
{
|
|
char *full_path;
|
|
char *a, *b;
|
|
+ int len;
|
|
|
|
full_path = kmalloc(PATH_MAX, GFP_KERNEL);
|
|
if (!full_path)
|
|
@@ -598,19 +599,19 @@ static char *rnbd_srv_get_full_path(struct rnbd_srv_session *srv_sess,
|
|
*/
|
|
a = strnstr(dev_search_path, "%SESSNAME%", sizeof(dev_search_path));
|
|
if (a) {
|
|
- int len = a - dev_search_path;
|
|
+ len = a - dev_search_path;
|
|
|
|
len = snprintf(full_path, PATH_MAX, "%.*s/%s/%s", len,
|
|
dev_search_path, srv_sess->sessname, dev_name);
|
|
- if (len >= PATH_MAX) {
|
|
- pr_err("Too long path: %s, %s, %s\n",
|
|
- dev_search_path, srv_sess->sessname, dev_name);
|
|
- kfree(full_path);
|
|
- return ERR_PTR(-EINVAL);
|
|
- }
|
|
} else {
|
|
- snprintf(full_path, PATH_MAX, "%s/%s",
|
|
- dev_search_path, dev_name);
|
|
+ len = snprintf(full_path, PATH_MAX, "%s/%s",
|
|
+ dev_search_path, dev_name);
|
|
+ }
|
|
+ if (len >= PATH_MAX) {
|
|
+ pr_err("Too long path: %s, %s, %s\n",
|
|
+ dev_search_path, srv_sess->sessname, dev_name);
|
|
+ kfree(full_path);
|
|
+ return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
/* eliminitate duplicated slashes */
|
|
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
|
|
index 45dffd2cbc719..76ceb8a0183d1 100644
|
|
--- a/drivers/bluetooth/hci_qca.c
|
|
+++ b/drivers/bluetooth/hci_qca.c
|
|
@@ -1861,6 +1861,7 @@ static const struct qca_device_data qca_soc_data_wcn3998 = {
|
|
static const struct qca_device_data qca_soc_data_qca6390 = {
|
|
.soc_type = QCA_QCA6390,
|
|
.num_vregs = 0,
|
|
+ .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
|
|
};
|
|
|
|
static const struct qca_device_data qca_soc_data_wcn6750 = {
|
|
diff --git a/drivers/clk/hisilicon/clk-hi3620.c b/drivers/clk/hisilicon/clk-hi3620.c
|
|
index a3d04c7c3da87..eb9c139babc33 100644
|
|
--- a/drivers/clk/hisilicon/clk-hi3620.c
|
|
+++ b/drivers/clk/hisilicon/clk-hi3620.c
|
|
@@ -467,8 +467,10 @@ static void __init hi3620_mmc_clk_init(struct device_node *node)
|
|
return;
|
|
|
|
clk_data->clks = kcalloc(num, sizeof(*clk_data->clks), GFP_KERNEL);
|
|
- if (!clk_data->clks)
|
|
+ if (!clk_data->clks) {
|
|
+ kfree(clk_data);
|
|
return;
|
|
+ }
|
|
|
|
for (i = 0; i < num; i++) {
|
|
struct hisi_mmc_clock *mmc_clk = &hi3620_mmc_clks[i];
|
|
diff --git a/drivers/clk/imx/clk-imx8qxp.c b/drivers/clk/imx/clk-imx8qxp.c
|
|
index 273de1f293076..1066ea16de625 100644
|
|
--- a/drivers/clk/imx/clk-imx8qxp.c
|
|
+++ b/drivers/clk/imx/clk-imx8qxp.c
|
|
@@ -67,6 +67,22 @@ static const char * const lcd_pxl_sels[] = {
|
|
"lcd_pxl_bypass_div_clk",
|
|
};
|
|
|
|
+static const char *const lvds0_sels[] = {
|
|
+ "clk_dummy",
|
|
+ "clk_dummy",
|
|
+ "clk_dummy",
|
|
+ "clk_dummy",
|
|
+ "mipi0_lvds_bypass_clk",
|
|
+};
|
|
+
|
|
+static const char *const lvds1_sels[] = {
|
|
+ "clk_dummy",
|
|
+ "clk_dummy",
|
|
+ "clk_dummy",
|
|
+ "clk_dummy",
|
|
+ "mipi1_lvds_bypass_clk",
|
|
+};
|
|
+
|
|
static const char * const mipi_sels[] = {
|
|
"clk_dummy",
|
|
"clk_dummy",
|
|
@@ -201,9 +217,9 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)
|
|
/* MIPI-LVDS SS */
|
|
imx_clk_scu("mipi0_bypass_clk", IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_BYPASS);
|
|
imx_clk_scu("mipi0_pixel_clk", IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_PER);
|
|
- imx_clk_scu("mipi0_lvds_pixel_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC2);
|
|
imx_clk_scu("mipi0_lvds_bypass_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_BYPASS);
|
|
- imx_clk_scu("mipi0_lvds_phy_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC3);
|
|
+ imx_clk_scu2("mipi0_lvds_pixel_clk", lvds0_sels, ARRAY_SIZE(lvds0_sels), IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC2);
|
|
+ imx_clk_scu2("mipi0_lvds_phy_clk", lvds0_sels, ARRAY_SIZE(lvds0_sels), IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC3);
|
|
imx_clk_scu2("mipi0_dsi_tx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_MST_BUS);
|
|
imx_clk_scu2("mipi0_dsi_rx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_SLV_BUS);
|
|
imx_clk_scu2("mipi0_dsi_phy_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_PHY);
|
|
@@ -213,9 +229,9 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)
|
|
|
|
imx_clk_scu("mipi1_bypass_clk", IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_BYPASS);
|
|
imx_clk_scu("mipi1_pixel_clk", IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_PER);
|
|
- imx_clk_scu("mipi1_lvds_pixel_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC2);
|
|
imx_clk_scu("mipi1_lvds_bypass_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_BYPASS);
|
|
- imx_clk_scu("mipi1_lvds_phy_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC3);
|
|
+ imx_clk_scu2("mipi1_lvds_pixel_clk", lvds1_sels, ARRAY_SIZE(lvds1_sels), IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC2);
|
|
+ imx_clk_scu2("mipi1_lvds_phy_clk", lvds1_sels, ARRAY_SIZE(lvds1_sels), IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC3);
|
|
|
|
imx_clk_scu2("mipi1_dsi_tx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_MST_BUS);
|
|
imx_clk_scu2("mipi1_dsi_rx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_SLV_BUS);
|
|
diff --git a/drivers/clk/mmp/clk-of-pxa168.c b/drivers/clk/mmp/clk-of-pxa168.c
|
|
index 130d1a7238797..cb0ebbd820389 100644
|
|
--- a/drivers/clk/mmp/clk-of-pxa168.c
|
|
+++ b/drivers/clk/mmp/clk-of-pxa168.c
|
|
@@ -306,18 +306,21 @@ static void __init pxa168_clk_init(struct device_node *np)
|
|
pxa_unit->mpmu_base = of_iomap(np, 0);
|
|
if (!pxa_unit->mpmu_base) {
|
|
pr_err("failed to map mpmu registers\n");
|
|
+ kfree(pxa_unit);
|
|
return;
|
|
}
|
|
|
|
pxa_unit->apmu_base = of_iomap(np, 1);
|
|
if (!pxa_unit->apmu_base) {
|
|
pr_err("failed to map apmu registers\n");
|
|
+ kfree(pxa_unit);
|
|
return;
|
|
}
|
|
|
|
pxa_unit->apbc_base = of_iomap(np, 2);
|
|
if (!pxa_unit->apbc_base) {
|
|
pr_err("failed to map apbc registers\n");
|
|
+ kfree(pxa_unit);
|
|
return;
|
|
}
|
|
|
|
diff --git a/drivers/crypto/marvell/octeontx2/otx2_cptlf.c b/drivers/crypto/marvell/octeontx2/otx2_cptlf.c
|
|
index 71e5f79431afa..6e4a78e1f3ced 100644
|
|
--- a/drivers/crypto/marvell/octeontx2/otx2_cptlf.c
|
|
+++ b/drivers/crypto/marvell/octeontx2/otx2_cptlf.c
|
|
@@ -419,8 +419,8 @@ int otx2_cptlf_init(struct otx2_cptlfs_info *lfs, u8 eng_grp_mask, int pri,
|
|
return 0;
|
|
|
|
free_iq:
|
|
- otx2_cpt_free_instruction_queues(lfs);
|
|
cptlf_hw_cleanup(lfs);
|
|
+ otx2_cpt_free_instruction_queues(lfs);
|
|
detach_rsrcs:
|
|
otx2_cpt_detach_rsrcs_msg(lfs);
|
|
clear_lfs_num:
|
|
@@ -431,11 +431,13 @@ EXPORT_SYMBOL_NS_GPL(otx2_cptlf_init, CRYPTO_DEV_OCTEONTX2_CPT);
|
|
|
|
void otx2_cptlf_shutdown(struct otx2_cptlfs_info *lfs)
|
|
{
|
|
- lfs->lfs_num = 0;
|
|
/* Cleanup LFs hardware side */
|
|
cptlf_hw_cleanup(lfs);
|
|
+ /* Free instruction queues */
|
|
+ otx2_cpt_free_instruction_queues(lfs);
|
|
/* Send request to detach LFs */
|
|
otx2_cpt_detach_rsrcs_msg(lfs);
|
|
+ lfs->lfs_num = 0;
|
|
}
|
|
EXPORT_SYMBOL_NS_GPL(otx2_cptlf_shutdown, CRYPTO_DEV_OCTEONTX2_CPT);
|
|
|
|
diff --git a/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c b/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c
|
|
index 392e9fee05e81..6f3373f9928c2 100644
|
|
--- a/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c
|
|
+++ b/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c
|
|
@@ -249,8 +249,11 @@ static void cptvf_lf_shutdown(struct otx2_cptlfs_info *lfs)
|
|
otx2_cptlf_unregister_interrupts(lfs);
|
|
/* Cleanup LFs software side */
|
|
lf_sw_cleanup(lfs);
|
|
+ /* Free instruction queues */
|
|
+ otx2_cpt_free_instruction_queues(lfs);
|
|
/* Send request to detach LFs */
|
|
otx2_cpt_detach_rsrcs_msg(lfs);
|
|
+ lfs->lfs_num = 0;
|
|
}
|
|
|
|
static int cptvf_lf_init(struct otx2_cptvf_dev *cptvf)
|
|
diff --git a/drivers/crypto/stm32/stm32-crc32.c b/drivers/crypto/stm32/stm32-crc32.c
|
|
index 90a920e7f6642..c439be1650c84 100644
|
|
--- a/drivers/crypto/stm32/stm32-crc32.c
|
|
+++ b/drivers/crypto/stm32/stm32-crc32.c
|
|
@@ -104,7 +104,7 @@ static struct stm32_crc *stm32_crc_get_next_crc(void)
|
|
struct stm32_crc *crc;
|
|
|
|
spin_lock_bh(&crc_list.lock);
|
|
- crc = list_first_entry(&crc_list.dev_list, struct stm32_crc, list);
|
|
+ crc = list_first_entry_or_null(&crc_list.dev_list, struct stm32_crc, list);
|
|
if (crc)
|
|
list_move_tail(&crc->list, &crc_list.dev_list);
|
|
spin_unlock_bh(&crc_list.lock);
|
|
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
|
|
index 2951a87ccb979..344e276165e41 100644
|
|
--- a/drivers/devfreq/devfreq.c
|
|
+++ b/drivers/devfreq/devfreq.c
|
|
@@ -461,10 +461,14 @@ static void devfreq_monitor(struct work_struct *work)
|
|
if (err)
|
|
dev_err(&devfreq->dev, "dvfs failed with (%d) error\n", err);
|
|
|
|
+ if (devfreq->stop_polling)
|
|
+ goto out;
|
|
+
|
|
queue_delayed_work(devfreq_wq, &devfreq->work,
|
|
msecs_to_jiffies(devfreq->profile->polling_ms));
|
|
- mutex_unlock(&devfreq->lock);
|
|
|
|
+out:
|
|
+ mutex_unlock(&devfreq->lock);
|
|
trace_devfreq_monitor(devfreq);
|
|
}
|
|
|
|
@@ -482,6 +486,10 @@ void devfreq_monitor_start(struct devfreq *devfreq)
|
|
if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN))
|
|
return;
|
|
|
|
+ mutex_lock(&devfreq->lock);
|
|
+ if (delayed_work_pending(&devfreq->work))
|
|
+ goto out;
|
|
+
|
|
switch (devfreq->profile->timer) {
|
|
case DEVFREQ_TIMER_DEFERRABLE:
|
|
INIT_DEFERRABLE_WORK(&devfreq->work, devfreq_monitor);
|
|
@@ -490,12 +498,16 @@ void devfreq_monitor_start(struct devfreq *devfreq)
|
|
INIT_DELAYED_WORK(&devfreq->work, devfreq_monitor);
|
|
break;
|
|
default:
|
|
- return;
|
|
+ goto out;
|
|
}
|
|
|
|
if (devfreq->profile->polling_ms)
|
|
queue_delayed_work(devfreq_wq, &devfreq->work,
|
|
msecs_to_jiffies(devfreq->profile->polling_ms));
|
|
+
|
|
+out:
|
|
+ devfreq->stop_polling = false;
|
|
+ mutex_unlock(&devfreq->lock);
|
|
}
|
|
EXPORT_SYMBOL(devfreq_monitor_start);
|
|
|
|
@@ -512,6 +524,14 @@ void devfreq_monitor_stop(struct devfreq *devfreq)
|
|
if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN))
|
|
return;
|
|
|
|
+ mutex_lock(&devfreq->lock);
|
|
+ if (devfreq->stop_polling) {
|
|
+ mutex_unlock(&devfreq->lock);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ devfreq->stop_polling = true;
|
|
+ mutex_unlock(&devfreq->lock);
|
|
cancel_delayed_work_sync(&devfreq->work);
|
|
}
|
|
EXPORT_SYMBOL(devfreq_monitor_stop);
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/aldebaran.c b/drivers/gpu/drm/amd/amdgpu/aldebaran.c
|
|
index 2b97b8a96fb49..fa6193535d485 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/aldebaran.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/aldebaran.c
|
|
@@ -333,6 +333,7 @@ aldebaran_mode2_restore_hwcontext(struct amdgpu_reset_control *reset_ctl,
|
|
{
|
|
struct list_head *reset_device_list = reset_context->reset_device_list;
|
|
struct amdgpu_device *tmp_adev = NULL;
|
|
+ struct amdgpu_ras *con;
|
|
int r;
|
|
|
|
if (reset_device_list == NULL)
|
|
@@ -358,7 +359,30 @@ aldebaran_mode2_restore_hwcontext(struct amdgpu_reset_control *reset_ctl,
|
|
*/
|
|
amdgpu_register_gpu_instance(tmp_adev);
|
|
|
|
- /* Resume RAS */
|
|
+ /* Resume RAS, ecc_irq */
|
|
+ con = amdgpu_ras_get_context(tmp_adev);
|
|
+ if (!amdgpu_sriov_vf(tmp_adev) && con) {
|
|
+ if (tmp_adev->sdma.ras &&
|
|
+ tmp_adev->sdma.ras->ras_block.ras_late_init) {
|
|
+ r = tmp_adev->sdma.ras->ras_block.ras_late_init(tmp_adev,
|
|
+ &tmp_adev->sdma.ras->ras_block.ras_comm);
|
|
+ if (r) {
|
|
+ dev_err(tmp_adev->dev, "SDMA failed to execute ras_late_init! ret:%d\n", r);
|
|
+ goto end;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (tmp_adev->gfx.ras &&
|
|
+ tmp_adev->gfx.ras->ras_block.ras_late_init) {
|
|
+ r = tmp_adev->gfx.ras->ras_block.ras_late_init(tmp_adev,
|
|
+ &tmp_adev->gfx.ras->ras_block.ras_comm);
|
|
+ if (r) {
|
|
+ dev_err(tmp_adev->dev, "GFX failed to execute ras_late_init! ret:%d\n", r);
|
|
+ goto end;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
amdgpu_ras_resume(tmp_adev);
|
|
|
|
/* Update PSP FW topology after reset */
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
|
|
index 469785d337911..1ef758ac5076e 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
|
|
@@ -90,7 +90,7 @@ struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f)
|
|
return NULL;
|
|
|
|
fence = container_of(f, struct amdgpu_amdkfd_fence, base);
|
|
- if (fence && f->ops == &amdkfd_fence_ops)
|
|
+ if (f->ops == &amdkfd_fence_ops)
|
|
return fence;
|
|
|
|
return NULL;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
index a5352e5e2bd47..4b91f95066eca 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
@@ -1310,6 +1310,7 @@ bool amdgpu_device_need_post(struct amdgpu_device *adev)
|
|
return true;
|
|
|
|
fw_ver = *((uint32_t *)adev->pm.fw->data + 69);
|
|
+ release_firmware(adev->pm.fw);
|
|
if (fw_ver < 0x00160e00)
|
|
return true;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
|
|
index 2bc791ed8830a..ea0fb079f942a 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
|
|
@@ -808,19 +808,26 @@ int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)
|
|
* seconds, so here, we just pick up three parts for emulation.
|
|
*/
|
|
ret = memcmp(vram_ptr, cptr, 10);
|
|
- if (ret)
|
|
- return ret;
|
|
+ if (ret) {
|
|
+ ret = -EIO;
|
|
+ goto release_buffer;
|
|
+ }
|
|
|
|
ret = memcmp(vram_ptr + (size / 2), cptr, 10);
|
|
- if (ret)
|
|
- return ret;
|
|
+ if (ret) {
|
|
+ ret = -EIO;
|
|
+ goto release_buffer;
|
|
+ }
|
|
|
|
ret = memcmp(vram_ptr + size - 10, cptr, 10);
|
|
- if (ret)
|
|
- return ret;
|
|
+ if (ret) {
|
|
+ ret = -EIO;
|
|
+ goto release_buffer;
|
|
+ }
|
|
|
|
+release_buffer:
|
|
amdgpu_bo_free_kernel(&vram_bo, &vram_gpu,
|
|
&vram_ptr);
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
|
|
index 0ee7c935fba1f..cde2fd2f71171 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
|
|
@@ -1222,19 +1222,15 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
|
|
* amdgpu_bo_move_notify - notification about a memory move
|
|
* @bo: pointer to a buffer object
|
|
* @evict: if this move is evicting the buffer from the graphics address space
|
|
- * @new_mem: new information of the bufer object
|
|
*
|
|
* Marks the corresponding &amdgpu_bo buffer object as invalid, also performs
|
|
* bookkeeping.
|
|
* TTM driver callback which is called when ttm moves a buffer.
|
|
*/
|
|
-void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
|
|
- bool evict,
|
|
- struct ttm_resource *new_mem)
|
|
+void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)
|
|
{
|
|
struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
|
|
struct amdgpu_bo *abo;
|
|
- struct ttm_resource *old_mem = bo->resource;
|
|
|
|
if (!amdgpu_bo_is_amdgpu_bo(bo))
|
|
return;
|
|
@@ -1251,13 +1247,6 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
|
|
/* remember the eviction */
|
|
if (evict)
|
|
atomic64_inc(&adev->num_evictions);
|
|
-
|
|
- /* update statistics */
|
|
- if (!new_mem)
|
|
- return;
|
|
-
|
|
- /* move_notify is called before move happens */
|
|
- trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
|
|
}
|
|
|
|
void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem,
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
|
|
index 6dcd7bab42fbb..2ada421e79e4f 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
|
|
@@ -312,9 +312,7 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
|
|
int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
|
|
size_t buffer_size, uint32_t *metadata_size,
|
|
uint64_t *flags);
|
|
-void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
|
|
- bool evict,
|
|
- struct ttm_resource *new_mem);
|
|
+void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict);
|
|
void amdgpu_bo_release_notify(struct ttm_buffer_object *bo);
|
|
vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
|
|
void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
|
|
index 090e66a1b2842..54bdbd83a8cc7 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
|
|
@@ -191,7 +191,8 @@ static bool amdgpu_sync_test_fence(struct amdgpu_device *adev,
|
|
|
|
/* Never sync to VM updates either. */
|
|
if (fence_owner == AMDGPU_FENCE_OWNER_VM &&
|
|
- owner != AMDGPU_FENCE_OWNER_UNDEFINED)
|
|
+ owner != AMDGPU_FENCE_OWNER_UNDEFINED &&
|
|
+ owner != AMDGPU_FENCE_OWNER_KFD)
|
|
return false;
|
|
|
|
/* Ignore fences depending on the sync mode */
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
|
|
index 10469f20a10ca..158b791883f03 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
|
|
@@ -555,10 +555,11 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
|
return r;
|
|
}
|
|
|
|
+ trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
|
|
out:
|
|
/* update statistics */
|
|
atomic64_add(bo->base.size, &adev->num_bytes_moved);
|
|
- amdgpu_bo_move_notify(bo, evict, new_mem);
|
|
+ amdgpu_bo_move_notify(bo, evict);
|
|
return 0;
|
|
}
|
|
|
|
@@ -1503,7 +1504,7 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
|
|
static void
|
|
amdgpu_bo_delete_mem_notify(struct ttm_buffer_object *bo)
|
|
{
|
|
- amdgpu_bo_move_notify(bo, false, NULL);
|
|
+ amdgpu_bo_move_notify(bo, false);
|
|
}
|
|
|
|
static struct ttm_device_funcs amdgpu_bo_driver = {
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
|
|
index 6e7058a2d1c82..779707f19c886 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
|
|
@@ -1110,9 +1110,13 @@ int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw,
|
|
|
|
if (err)
|
|
return -ENODEV;
|
|
+
|
|
err = amdgpu_ucode_validate(*fw);
|
|
- if (err)
|
|
+ if (err) {
|
|
dev_dbg(adev->dev, "\"%s\" failed to validate\n", fw_name);
|
|
+ release_firmware(*fw);
|
|
+ *fw = NULL;
|
|
+ }
|
|
|
|
return err;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
|
|
index d96ee48e1706a..35921b41fc27c 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
|
|
@@ -1144,6 +1144,10 @@ static int gmc_v10_0_hw_fini(void *handle)
|
|
|
|
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
|
|
|
+ if (adev->gmc.ecc_irq.funcs &&
|
|
+ amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__UMC))
|
|
+ amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
|
|
index 7124347d2b6c4..310a5607d83b6 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
|
|
@@ -951,6 +951,11 @@ static int gmc_v11_0_hw_fini(void *handle)
|
|
}
|
|
|
|
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
|
+
|
|
+ if (adev->gmc.ecc_irq.funcs &&
|
|
+ amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__UMC))
|
|
+ amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
|
+
|
|
gmc_v11_0_gart_disable(adev);
|
|
|
|
return 0;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
|
|
index ec291d28edffd..345f0c9f551c6 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
|
|
@@ -921,8 +921,8 @@ static int gmc_v6_0_hw_init(void *handle)
|
|
|
|
if (amdgpu_emu_mode == 1)
|
|
return amdgpu_gmc_vram_checking(adev);
|
|
- else
|
|
- return r;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int gmc_v6_0_hw_fini(void *handle)
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
|
|
index 979da6f510e88..12411f4c1b9af 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
|
|
@@ -1110,8 +1110,8 @@ static int gmc_v7_0_hw_init(void *handle)
|
|
|
|
if (amdgpu_emu_mode == 1)
|
|
return amdgpu_gmc_vram_checking(adev);
|
|
- else
|
|
- return r;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int gmc_v7_0_hw_fini(void *handle)
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
|
|
index 382dde1ce74c0..cec9926e8bdd8 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
|
|
@@ -1240,8 +1240,8 @@ static int gmc_v8_0_hw_init(void *handle)
|
|
|
|
if (amdgpu_emu_mode == 1)
|
|
return amdgpu_gmc_vram_checking(adev);
|
|
- else
|
|
- return r;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int gmc_v8_0_hw_fini(void *handle)
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
|
|
index 0d9e9d9dd4a1d..3e631aefa7917 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
|
|
@@ -1861,8 +1861,8 @@ static int gmc_v9_0_hw_init(void *handle)
|
|
|
|
if (amdgpu_emu_mode == 1)
|
|
return amdgpu_gmc_vram_checking(adev);
|
|
- else
|
|
- return r;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -1900,6 +1900,10 @@ static int gmc_v9_0_hw_fini(void *handle)
|
|
|
|
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
|
|
|
+ if (adev->gmc.ecc_irq.funcs &&
|
|
+ amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__UMC))
|
|
+ amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
|
|
index 208812512d8a8..7fa5e70f1aace 100644
|
|
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
|
|
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
|
|
@@ -380,14 +380,9 @@ static void svm_range_bo_release(struct kref *kref)
|
|
spin_lock(&svm_bo->list_lock);
|
|
}
|
|
spin_unlock(&svm_bo->list_lock);
|
|
- if (!dma_fence_is_signaled(&svm_bo->eviction_fence->base)) {
|
|
- /* We're not in the eviction worker.
|
|
- * Signal the fence and synchronize with any
|
|
- * pending eviction work.
|
|
- */
|
|
+ if (!dma_fence_is_signaled(&svm_bo->eviction_fence->base))
|
|
+ /* We're not in the eviction worker. Signal the fence. */
|
|
dma_fence_signal(&svm_bo->eviction_fence->base);
|
|
- cancel_work_sync(&svm_bo->eviction_work);
|
|
- }
|
|
dma_fence_put(&svm_bo->eviction_fence->base);
|
|
amdgpu_bo_unref(&svm_bo->bo);
|
|
kfree(svm_bo);
|
|
@@ -2246,8 +2241,10 @@ retry:
|
|
mutex_unlock(&svms->lock);
|
|
mmap_write_unlock(mm);
|
|
|
|
- /* Pairs with mmget in svm_range_add_list_work */
|
|
- mmput(mm);
|
|
+ /* Pairs with mmget in svm_range_add_list_work. If dropping the
|
|
+ * last mm refcount, schedule release work to avoid circular locking
|
|
+ */
|
|
+ mmput_async(mm);
|
|
|
|
spin_lock(&svms->deferred_list_lock);
|
|
}
|
|
@@ -2556,6 +2553,7 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,
|
|
{
|
|
struct vm_area_struct *vma;
|
|
struct interval_tree_node *node;
|
|
+ struct rb_node *rb_node;
|
|
unsigned long start_limit, end_limit;
|
|
|
|
vma = find_vma(p->mm, addr << PAGE_SHIFT);
|
|
@@ -2578,16 +2576,15 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,
|
|
if (node) {
|
|
end_limit = min(end_limit, node->start);
|
|
/* Last range that ends before the fault address */
|
|
- node = container_of(rb_prev(&node->rb),
|
|
- struct interval_tree_node, rb);
|
|
+ rb_node = rb_prev(&node->rb);
|
|
} else {
|
|
/* Last range must end before addr because
|
|
* there was no range after addr
|
|
*/
|
|
- node = container_of(rb_last(&p->svms.objects.rb_root),
|
|
- struct interval_tree_node, rb);
|
|
+ rb_node = rb_last(&p->svms.objects.rb_root);
|
|
}
|
|
- if (node) {
|
|
+ if (rb_node) {
|
|
+ node = container_of(rb_node, struct interval_tree_node, rb);
|
|
if (node->last >= addr) {
|
|
WARN(1, "Overlap with prev node and page fault addr\n");
|
|
return -EFAULT;
|
|
@@ -3310,13 +3307,14 @@ svm_range_trigger_migration(struct mm_struct *mm, struct svm_range *prange,
|
|
|
|
int svm_range_schedule_evict_svm_bo(struct amdgpu_amdkfd_fence *fence)
|
|
{
|
|
- if (!fence)
|
|
- return -EINVAL;
|
|
-
|
|
- if (dma_fence_is_signaled(&fence->base))
|
|
- return 0;
|
|
-
|
|
- if (fence->svm_bo) {
|
|
+ /* Dereferencing fence->svm_bo is safe here because the fence hasn't
|
|
+ * signaled yet and we're under the protection of the fence->lock.
|
|
+ * After the fence is signaled in svm_range_bo_release, we cannot get
|
|
+ * here any more.
|
|
+ *
|
|
+ * Reference is dropped in svm_range_evict_svm_bo_worker.
|
|
+ */
|
|
+ if (svm_bo_ref_unless_zero(fence->svm_bo)) {
|
|
WRITE_ONCE(fence->svm_bo->evicting, 1);
|
|
schedule_work(&fence->svm_bo->eviction_work);
|
|
}
|
|
@@ -3331,8 +3329,6 @@ static void svm_range_evict_svm_bo_worker(struct work_struct *work)
|
|
int r = 0;
|
|
|
|
svm_bo = container_of(work, struct svm_range_bo, eviction_work);
|
|
- if (!svm_bo_ref_unless_zero(svm_bo))
|
|
- return; /* svm_bo was freed while eviction was pending */
|
|
|
|
if (mmget_not_zero(svm_bo->eviction_fence->mm)) {
|
|
mm = svm_bo->eviction_fence->mm;
|
|
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
|
|
index 705d9e91b5aa3..029916971bf66 100644
|
|
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
|
|
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
|
|
@@ -1513,17 +1513,19 @@ static int kfd_add_peer_prop(struct kfd_topology_device *kdev,
|
|
/* CPU->CPU link*/
|
|
cpu_dev = kfd_topology_device_by_proximity_domain(iolink1->node_to);
|
|
if (cpu_dev) {
|
|
- list_for_each_entry(iolink3, &cpu_dev->io_link_props, list)
|
|
- if (iolink3->node_to == iolink2->node_to)
|
|
- break;
|
|
-
|
|
- props->weight += iolink3->weight;
|
|
- props->min_latency += iolink3->min_latency;
|
|
- props->max_latency += iolink3->max_latency;
|
|
- props->min_bandwidth = min(props->min_bandwidth,
|
|
- iolink3->min_bandwidth);
|
|
- props->max_bandwidth = min(props->max_bandwidth,
|
|
- iolink3->max_bandwidth);
|
|
+ list_for_each_entry(iolink3, &cpu_dev->io_link_props, list) {
|
|
+ if (iolink3->node_to != iolink2->node_to)
|
|
+ continue;
|
|
+
|
|
+ props->weight += iolink3->weight;
|
|
+ props->min_latency += iolink3->min_latency;
|
|
+ props->max_latency += iolink3->max_latency;
|
|
+ props->min_bandwidth = min(props->min_bandwidth,
|
|
+ iolink3->min_bandwidth);
|
|
+ props->max_bandwidth = min(props->max_bandwidth,
|
|
+ iolink3->max_bandwidth);
|
|
+ break;
|
|
+ }
|
|
} else {
|
|
WARN(1, "CPU node not found");
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
|
|
index 7a309547c2b3f..f415733f1a979 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
|
|
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
|
|
@@ -1903,6 +1903,10 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
|
|
wait_for_no_pipes_pending(dc, context);
|
|
/* pplib is notified if disp_num changed */
|
|
dc->hwss.optimize_bandwidth(dc, context);
|
|
+ /* Need to do otg sync again as otg could be out of sync due to otg
|
|
+ * workaround applied during clock update
|
|
+ */
|
|
+ dc_trigger_sync(dc, context);
|
|
}
|
|
|
|
if (dc->hwss.update_dsc_pg)
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
|
|
index 46c2b991aa108..811c117665e73 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
|
|
+++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
|
|
@@ -244,7 +244,7 @@ enum pixel_format {
|
|
#define DC_MAX_DIRTY_RECTS 3
|
|
struct dc_flip_addrs {
|
|
struct dc_plane_address address;
|
|
- unsigned int flip_timestamp_in_us;
|
|
+ unsigned long long flip_timestamp_in_us;
|
|
bool flip_immediate;
|
|
/* TODO: add flip duration for FreeSync */
|
|
bool triplebuffer_flips;
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
|
|
index 19f55657272e4..cc8c1a48c5c4d 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
|
|
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
|
|
@@ -810,6 +810,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
|
|
(v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ||
|
|
v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?
|
|
mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
|
|
+ mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] > 0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,
|
|
+
|
|
/* Output */
|
|
&v->DSTXAfterScaler[k],
|
|
&v->DSTYAfterScaler[k],
|
|
@@ -3291,6 +3293,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|
v->SwathHeightCThisState[k], v->TWait,
|
|
(v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?
|
|
mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
|
|
+ mode_lib->vba.PrefetchModePerState[i][j] > 0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,
|
|
|
|
/* Output */
|
|
&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler[k],
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
|
|
index 23e4be2ad63f9..7f4fc49be35ca 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
|
|
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
|
|
@@ -3418,6 +3418,7 @@ bool dml32_CalculatePrefetchSchedule(
|
|
unsigned int SwathHeightC,
|
|
double TWait,
|
|
double TPreReq,
|
|
+ bool ExtendPrefetchIfPossible,
|
|
/* Output */
|
|
double *DSTXAfterScaler,
|
|
double *DSTYAfterScaler,
|
|
@@ -3887,12 +3888,32 @@ bool dml32_CalculatePrefetchSchedule(
|
|
/* Clamp to oto for bandwidth calculation */
|
|
LinesForPrefetchBandwidth = dst_y_prefetch_oto;
|
|
} else {
|
|
- *DestinationLinesForPrefetch = dst_y_prefetch_equ;
|
|
- TimeForFetchingMetaPTE = Tvm_equ;
|
|
- TimeForFetchingRowInVBlank = Tr0_equ;
|
|
- *PrefetchBandwidth = prefetch_bw_equ;
|
|
- /* Clamp to equ for bandwidth calculation */
|
|
- LinesForPrefetchBandwidth = dst_y_prefetch_equ;
|
|
+ /* For mode programming we want to extend the prefetch as much as possible
|
|
+ * (up to oto, or as long as we can for equ) if we're not already applying
|
|
+ * the 60us prefetch requirement. This is to avoid intermittent underflow
|
|
+ * issues during prefetch.
|
|
+ *
|
|
+ * The prefetch extension is applied under the following scenarios:
|
|
+ * 1. We're in prefetch mode > 0 (i.e. we don't support MCLK switch in blank)
|
|
+ * 2. We're using subvp or drr methods of p-state switch, in which case we
|
|
+ * we don't care if prefetch takes up more of the blanking time
|
|
+ *
|
|
+ * Mode programming typically chooses the smallest prefetch time possible
|
|
+ * (i.e. highest bandwidth during prefetch) presumably to create margin between
|
|
+ * p-states / c-states that happen in vblank and prefetch. Therefore we only
|
|
+ * apply this prefetch extension when p-state in vblank is not required (UCLK
|
|
+ * p-states take up the most vblank time).
|
|
+ */
|
|
+ if (ExtendPrefetchIfPossible && TPreReq == 0 && VStartup < MaxVStartup) {
|
|
+ MyError = true;
|
|
+ } else {
|
|
+ *DestinationLinesForPrefetch = dst_y_prefetch_equ;
|
|
+ TimeForFetchingMetaPTE = Tvm_equ;
|
|
+ TimeForFetchingRowInVBlank = Tr0_equ;
|
|
+ *PrefetchBandwidth = prefetch_bw_equ;
|
|
+ /* Clamp to equ for bandwidth calculation */
|
|
+ LinesForPrefetchBandwidth = dst_y_prefetch_equ;
|
|
+ }
|
|
}
|
|
|
|
*DestinationLinesToRequestVMInVBlank = dml_ceil(4.0 * TimeForFetchingMetaPTE / LineTime, 1.0) / 4.0;
|
|
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h
|
|
index 779c6805f5997..1823434d8ede2 100644
|
|
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h
|
|
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h
|
|
@@ -744,6 +744,7 @@ bool dml32_CalculatePrefetchSchedule(
|
|
unsigned int SwathHeightC,
|
|
double TWait,
|
|
double TPreReq,
|
|
+ bool ExtendPrefetchIfPossible,
|
|
/* Output */
|
|
double *DSTXAfterScaler,
|
|
double *DSTYAfterScaler,
|
|
diff --git a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c
|
|
index e2f436dea5654..67287ad07226c 100644
|
|
--- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c
|
|
+++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c
|
|
@@ -818,8 +818,6 @@ bool is_psr_su_specific_panel(struct dc_link *link)
|
|
isPSRSUSupported = false;
|
|
else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03)
|
|
isPSRSUSupported = false;
|
|
- else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03)
|
|
- isPSRSUSupported = false;
|
|
else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1)
|
|
isPSRSUSupported = true;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c
|
|
index f2a55c1413f59..17882f8dfdd34 100644
|
|
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c
|
|
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c
|
|
@@ -200,7 +200,7 @@ static int get_platform_power_management_table(
|
|
struct pp_hwmgr *hwmgr,
|
|
ATOM_Tonga_PPM_Table *atom_ppm_table)
|
|
{
|
|
- struct phm_ppm_table *ptr = kzalloc(sizeof(ATOM_Tonga_PPM_Table), GFP_KERNEL);
|
|
+ struct phm_ppm_table *ptr = kzalloc(sizeof(*ptr), GFP_KERNEL);
|
|
struct phm_ppt_v1_information *pp_table_information =
|
|
(struct phm_ppt_v1_information *)(hwmgr->pptable);
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/analogix/anx7625.c b/drivers/gpu/drm/bridge/analogix/anx7625.c
|
|
index 5f8137e9cfd7a..77a304ac4d75e 100644
|
|
--- a/drivers/gpu/drm/bridge/analogix/anx7625.c
|
|
+++ b/drivers/gpu/drm/bridge/analogix/anx7625.c
|
|
@@ -1300,10 +1300,32 @@ static void anx7625_config(struct anx7625_data *ctx)
|
|
XTAL_FRQ_SEL, XTAL_FRQ_27M);
|
|
}
|
|
|
|
+static int anx7625_hpd_timer_config(struct anx7625_data *ctx)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ /* Set irq detect window to 2ms */
|
|
+ ret = anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,
|
|
+ HPD_DET_TIMER_BIT0_7, HPD_TIME & 0xFF);
|
|
+ ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,
|
|
+ HPD_DET_TIMER_BIT8_15,
|
|
+ (HPD_TIME >> 8) & 0xFF);
|
|
+ ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,
|
|
+ HPD_DET_TIMER_BIT16_23,
|
|
+ (HPD_TIME >> 16) & 0xFF);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int anx7625_read_hpd_gpio_config_status(struct anx7625_data *ctx)
|
|
+{
|
|
+ return anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, GPIO_CTRL_2);
|
|
+}
|
|
+
|
|
static void anx7625_disable_pd_protocol(struct anx7625_data *ctx)
|
|
{
|
|
struct device *dev = &ctx->client->dev;
|
|
- int ret;
|
|
+ int ret, val;
|
|
|
|
/* Reset main ocm */
|
|
ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, 0x88, 0x40);
|
|
@@ -1317,6 +1339,19 @@ static void anx7625_disable_pd_protocol(struct anx7625_data *ctx)
|
|
DRM_DEV_DEBUG_DRIVER(dev, "disable PD feature fail.\n");
|
|
else
|
|
DRM_DEV_DEBUG_DRIVER(dev, "disable PD feature succeeded.\n");
|
|
+
|
|
+ /*
|
|
+ * Make sure the HPD GPIO already be configured after OCM release before
|
|
+ * setting HPD detect window register. Here we poll the status register
|
|
+ * at maximum 40ms, then config HPD irq detect window register
|
|
+ */
|
|
+ readx_poll_timeout(anx7625_read_hpd_gpio_config_status,
|
|
+ ctx, val,
|
|
+ ((val & HPD_SOURCE) || (val < 0)),
|
|
+ 2000, 2000 * 20);
|
|
+
|
|
+ /* Set HPD irq detect window to 2ms */
|
|
+ anx7625_hpd_timer_config(ctx);
|
|
}
|
|
|
|
static int anx7625_ocm_loading_check(struct anx7625_data *ctx)
|
|
@@ -1440,20 +1475,6 @@ static void anx7625_start_dp_work(struct anx7625_data *ctx)
|
|
|
|
static int anx7625_read_hpd_status_p0(struct anx7625_data *ctx)
|
|
{
|
|
- int ret;
|
|
-
|
|
- /* Set irq detect window to 2ms */
|
|
- ret = anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,
|
|
- HPD_DET_TIMER_BIT0_7, HPD_TIME & 0xFF);
|
|
- ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,
|
|
- HPD_DET_TIMER_BIT8_15,
|
|
- (HPD_TIME >> 8) & 0xFF);
|
|
- ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,
|
|
- HPD_DET_TIMER_BIT16_23,
|
|
- (HPD_TIME >> 16) & 0xFF);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
-
|
|
return anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, SYSTEM_STSTUS);
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/analogix/anx7625.h b/drivers/gpu/drm/bridge/analogix/anx7625.h
|
|
index 239956199e1b9..164250c8c8b63 100644
|
|
--- a/drivers/gpu/drm/bridge/analogix/anx7625.h
|
|
+++ b/drivers/gpu/drm/bridge/analogix/anx7625.h
|
|
@@ -259,6 +259,10 @@
|
|
#define AP_MIPI_RX_EN BIT(5) /* 1: MIPI RX input in 0: no RX in */
|
|
#define AP_DISABLE_PD BIT(6)
|
|
#define AP_DISABLE_DISPLAY BIT(7)
|
|
+
|
|
+#define GPIO_CTRL_2 0x49
|
|
+#define HPD_SOURCE BIT(6)
|
|
+
|
|
/***************************************************************/
|
|
/* Register definition of device address 0x84 */
|
|
#define MIPI_PHY_CONTROL_3 0x03
|
|
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
|
|
index a8b4d918e9a3f..d6a0572984b54 100644
|
|
--- a/drivers/gpu/drm/drm_file.c
|
|
+++ b/drivers/gpu/drm/drm_file.c
|
|
@@ -406,7 +406,7 @@ int drm_open(struct inode *inode, struct file *filp)
|
|
{
|
|
struct drm_device *dev;
|
|
struct drm_minor *minor;
|
|
- int retcode;
|
|
+ int retcode = 0;
|
|
int need_setup = 0;
|
|
|
|
minor = drm_minor_acquire(iminor(inode));
|
|
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
|
|
index 2dd97473ca105..72ad1715f8e75 100644
|
|
--- a/drivers/gpu/drm/drm_framebuffer.c
|
|
+++ b/drivers/gpu/drm/drm_framebuffer.c
|
|
@@ -570,7 +570,7 @@ int drm_mode_getfb2_ioctl(struct drm_device *dev,
|
|
struct drm_mode_fb_cmd2 *r = data;
|
|
struct drm_framebuffer *fb;
|
|
unsigned int i;
|
|
- int ret;
|
|
+ int ret = 0;
|
|
|
|
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
|
return -EINVAL;
|
|
diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c
|
|
index 853208e8dd736..ef7ec68867df0 100644
|
|
--- a/drivers/gpu/drm/drm_mipi_dsi.c
|
|
+++ b/drivers/gpu/drm/drm_mipi_dsi.c
|
|
@@ -346,7 +346,8 @@ static int mipi_dsi_remove_device_fn(struct device *dev, void *priv)
|
|
{
|
|
struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
|
|
|
|
- mipi_dsi_detach(dsi);
|
|
+ if (dsi->attached)
|
|
+ mipi_dsi_detach(dsi);
|
|
mipi_dsi_device_unregister(dsi);
|
|
|
|
return 0;
|
|
@@ -369,11 +370,18 @@ EXPORT_SYMBOL(mipi_dsi_host_unregister);
|
|
int mipi_dsi_attach(struct mipi_dsi_device *dsi)
|
|
{
|
|
const struct mipi_dsi_host_ops *ops = dsi->host->ops;
|
|
+ int ret;
|
|
|
|
if (!ops || !ops->attach)
|
|
return -ENOSYS;
|
|
|
|
- return ops->attach(dsi->host, dsi);
|
|
+ ret = ops->attach(dsi->host, dsi);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ dsi->attached = true;
|
|
+
|
|
+ return 0;
|
|
}
|
|
EXPORT_SYMBOL(mipi_dsi_attach);
|
|
|
|
@@ -385,9 +393,14 @@ int mipi_dsi_detach(struct mipi_dsi_device *dsi)
|
|
{
|
|
const struct mipi_dsi_host_ops *ops = dsi->host->ops;
|
|
|
|
+ if (WARN_ON(!dsi->attached))
|
|
+ return -EINVAL;
|
|
+
|
|
if (!ops || !ops->detach)
|
|
return -ENOSYS;
|
|
|
|
+ dsi->attached = false;
|
|
+
|
|
return ops->detach(dsi->host, dsi);
|
|
}
|
|
EXPORT_SYMBOL(mipi_dsi_detach);
|
|
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
|
|
index 16c539657f730..4095b0d3ac2e3 100644
|
|
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
|
|
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
|
|
@@ -309,6 +309,7 @@ err_mode_config_cleanup:
|
|
drm_mode_config_cleanup(drm);
|
|
exynos_drm_cleanup_dma(drm);
|
|
kfree(private);
|
|
+ dev_set_drvdata(dev, NULL);
|
|
err_free_drm:
|
|
drm_dev_put(drm);
|
|
|
|
@@ -323,6 +324,7 @@ static void exynos_drm_unbind(struct device *dev)
|
|
|
|
exynos_drm_fbdev_fini(drm);
|
|
drm_kms_helper_poll_fini(drm);
|
|
+ drm_atomic_helper_shutdown(drm);
|
|
|
|
component_unbind_all(drm->dev, drm);
|
|
drm_mode_config_cleanup(drm);
|
|
@@ -360,9 +362,18 @@ static int exynos_drm_platform_remove(struct platform_device *pdev)
|
|
return 0;
|
|
}
|
|
|
|
+static void exynos_drm_platform_shutdown(struct platform_device *pdev)
|
|
+{
|
|
+ struct drm_device *drm = platform_get_drvdata(pdev);
|
|
+
|
|
+ if (drm)
|
|
+ drm_atomic_helper_shutdown(drm);
|
|
+}
|
|
+
|
|
static struct platform_driver exynos_drm_platform_driver = {
|
|
.probe = exynos_drm_platform_probe,
|
|
.remove = exynos_drm_platform_remove,
|
|
+ .shutdown = exynos_drm_platform_shutdown,
|
|
.driver = {
|
|
.name = "exynos-drm",
|
|
.pm = &exynos_drm_pm_ops,
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
|
|
index b0eb881f8af13..38d38f923df64 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
|
|
@@ -38,6 +38,9 @@
|
|
#define DPU_ERROR_ENC(e, fmt, ...) DPU_ERROR("enc%d " fmt,\
|
|
(e) ? (e)->base.base.id : -1, ##__VA_ARGS__)
|
|
|
|
+#define DPU_ERROR_ENC_RATELIMITED(e, fmt, ...) DPU_ERROR_RATELIMITED("enc%d " fmt,\
|
|
+ (e) ? (e)->base.base.id : -1, ##__VA_ARGS__)
|
|
+
|
|
/*
|
|
* Two to anticipate panels that can do cmd/vid dynamic switching
|
|
* plan is to create all possible physical encoder types, and switch between
|
|
@@ -2385,7 +2388,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)
|
|
return;
|
|
}
|
|
|
|
- DPU_ERROR_ENC(dpu_enc, "frame done timeout\n");
|
|
+ DPU_ERROR_ENC_RATELIMITED(dpu_enc, "frame done timeout\n");
|
|
|
|
event = DPU_ENCODER_FRAME_EVENT_ERROR;
|
|
trace_dpu_enc_frame_done_timeout(DRMID(drm_enc), event);
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
|
|
index a3e413d277175..63dc2ee446d47 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
|
|
@@ -105,6 +105,9 @@ static void dpu_hw_wb_setup_format(struct dpu_hw_wb *ctx,
|
|
dst_format |= BIT(14); /* DST_ALPHA_X */
|
|
}
|
|
|
|
+ if (DPU_FORMAT_IS_YUV(fmt))
|
|
+ dst_format |= BIT(15);
|
|
+
|
|
pattern = (fmt->element[3] << 24) |
|
|
(fmt->element[2] << 16) |
|
|
(fmt->element[1] << 8) |
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
|
|
index ed80ed6784eee..bb35aa5f5709f 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
|
|
@@ -51,6 +51,7 @@
|
|
} while (0)
|
|
|
|
#define DPU_ERROR(fmt, ...) pr_err("[dpu error]" fmt, ##__VA_ARGS__)
|
|
+#define DPU_ERROR_RATELIMITED(fmt, ...) pr_err_ratelimited("[dpu error]" fmt, ##__VA_ARGS__)
|
|
|
|
/**
|
|
* ktime_compare_safe - compare two ktime structures
|
|
diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
|
|
index 62bc3756f2e2b..c0bcf020ef662 100644
|
|
--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
|
|
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
|
|
@@ -673,6 +673,10 @@ static int dsi_phy_driver_probe(struct platform_device *pdev)
|
|
return dev_err_probe(dev, PTR_ERR(phy->ahb_clk),
|
|
"Unable to get ahb clk\n");
|
|
|
|
+ ret = devm_pm_runtime_enable(&pdev->dev);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
/* PLL init will call into clk_register which requires
|
|
* register access, so we need to enable power and ahb clock.
|
|
*/
|
|
diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c
|
|
index ecd6238749f7a..42584d8a9aeb6 100644
|
|
--- a/drivers/gpu/drm/panel/panel-edp.c
|
|
+++ b/drivers/gpu/drm/panel/panel-edp.c
|
|
@@ -203,6 +203,9 @@ struct edp_panel_entry {
|
|
|
|
/** @name: Name of this panel (for printing to logs). */
|
|
const char *name;
|
|
+
|
|
+ /** @override_edid_mode: Override the mode obtained by edid. */
|
|
+ const struct drm_display_mode *override_edid_mode;
|
|
};
|
|
|
|
struct panel_edp {
|
|
@@ -301,6 +304,24 @@ static unsigned int panel_edp_get_display_modes(struct panel_edp *panel,
|
|
return num;
|
|
}
|
|
|
|
+static int panel_edp_override_edid_mode(struct panel_edp *panel,
|
|
+ struct drm_connector *connector,
|
|
+ const struct drm_display_mode *override_mode)
|
|
+{
|
|
+ struct drm_display_mode *mode;
|
|
+
|
|
+ mode = drm_mode_duplicate(connector->dev, override_mode);
|
|
+ if (!mode) {
|
|
+ dev_err(panel->base.dev, "failed to add additional mode\n");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
|
|
+ drm_mode_set_name(mode);
|
|
+ drm_mode_probed_add(connector, mode);
|
|
+ return 1;
|
|
+}
|
|
+
|
|
static int panel_edp_get_non_edid_modes(struct panel_edp *panel,
|
|
struct drm_connector *connector)
|
|
{
|
|
@@ -568,6 +589,9 @@ static int panel_edp_get_modes(struct drm_panel *panel,
|
|
{
|
|
struct panel_edp *p = to_panel_edp(panel);
|
|
int num = 0;
|
|
+ bool has_override_edid_mode = p->detected_panel &&
|
|
+ p->detected_panel != ERR_PTR(-EINVAL) &&
|
|
+ p->detected_panel->override_edid_mode;
|
|
|
|
/* probe EDID if a DDC bus is available */
|
|
if (p->ddc) {
|
|
@@ -575,9 +599,18 @@ static int panel_edp_get_modes(struct drm_panel *panel,
|
|
|
|
if (!p->edid)
|
|
p->edid = drm_get_edid(connector, p->ddc);
|
|
-
|
|
- if (p->edid)
|
|
- num += drm_add_edid_modes(connector, p->edid);
|
|
+ if (p->edid) {
|
|
+ if (has_override_edid_mode) {
|
|
+ /*
|
|
+ * override_edid_mode is specified. Use
|
|
+ * override_edid_mode instead of from edid.
|
|
+ */
|
|
+ num += panel_edp_override_edid_mode(p, connector,
|
|
+ p->detected_panel->override_edid_mode);
|
|
+ } else {
|
|
+ num += drm_add_edid_modes(connector, p->edid);
|
|
+ }
|
|
+ }
|
|
|
|
pm_runtime_mark_last_busy(panel->dev);
|
|
pm_runtime_put_autosuspend(panel->dev);
|
|
@@ -1861,6 +1894,15 @@ static const struct panel_delay delay_200_500_e200 = {
|
|
.delay = _delay \
|
|
}
|
|
|
|
+#define EDP_PANEL_ENTRY2(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _delay, _name, _mode) \
|
|
+{ \
|
|
+ .name = _name, \
|
|
+ .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \
|
|
+ product_id), \
|
|
+ .delay = _delay, \
|
|
+ .override_edid_mode = _mode \
|
|
+}
|
|
+
|
|
/*
|
|
* This table is used to figure out power sequencing delays for panels that
|
|
* are detected by EDID. Entries here may point to entries in the
|
|
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
|
|
index b617aada50b06..7b097ab2170c3 100644
|
|
--- a/drivers/hid/hidraw.c
|
|
+++ b/drivers/hid/hidraw.c
|
|
@@ -355,8 +355,11 @@ static int hidraw_release(struct inode * inode, struct file * file)
|
|
down_write(&minors_rwsem);
|
|
|
|
spin_lock_irqsave(&hidraw_table[minor]->list_lock, flags);
|
|
- for (int i = list->tail; i < list->head; i++)
|
|
- kfree(list->buffer[i].value);
|
|
+ while (list->tail != list->head) {
|
|
+ kfree(list->buffer[list->tail].value);
|
|
+ list->buffer[list->tail].value = NULL;
|
|
+ list->tail = (list->tail + 1) & (HIDRAW_BUFFER_SIZE - 1);
|
|
+ }
|
|
list_del(&list->node);
|
|
spin_unlock_irqrestore(&hidraw_table[minor]->list_lock, flags);
|
|
kfree(list);
|
|
diff --git a/drivers/hwmon/nct6775-core.c b/drivers/hwmon/nct6775-core.c
|
|
index 80310845fb993..9720ad214c20b 100644
|
|
--- a/drivers/hwmon/nct6775-core.c
|
|
+++ b/drivers/hwmon/nct6775-core.c
|
|
@@ -2462,6 +2462,13 @@ store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,
|
|
int err;
|
|
u16 reg;
|
|
|
|
+ /*
|
|
+ * The fan control mode should be set to manual if the user wants to adjust
|
|
+ * the fan speed. Otherwise, it will fail to set.
|
|
+ */
|
|
+ if (index == 0 && data->pwm_enable[nr] > manual)
|
|
+ return -EBUSY;
|
|
+
|
|
err = kstrtoul(buf, 10, &val);
|
|
if (err < 0)
|
|
return err;
|
|
diff --git a/drivers/i3c/master/i3c-master-cdns.c b/drivers/i3c/master/i3c-master-cdns.c
|
|
index 4a49c75a9408c..b9cfda6ae9ae5 100644
|
|
--- a/drivers/i3c/master/i3c-master-cdns.c
|
|
+++ b/drivers/i3c/master/i3c-master-cdns.c
|
|
@@ -77,7 +77,8 @@
|
|
#define PRESCL_CTRL0 0x14
|
|
#define PRESCL_CTRL0_I2C(x) ((x) << 16)
|
|
#define PRESCL_CTRL0_I3C(x) (x)
|
|
-#define PRESCL_CTRL0_MAX GENMASK(9, 0)
|
|
+#define PRESCL_CTRL0_I3C_MAX GENMASK(9, 0)
|
|
+#define PRESCL_CTRL0_I2C_MAX GENMASK(15, 0)
|
|
|
|
#define PRESCL_CTRL1 0x18
|
|
#define PRESCL_CTRL1_PP_LOW_MASK GENMASK(15, 8)
|
|
@@ -1234,7 +1235,7 @@ static int cdns_i3c_master_bus_init(struct i3c_master_controller *m)
|
|
return -EINVAL;
|
|
|
|
pres = DIV_ROUND_UP(sysclk_rate, (bus->scl_rate.i3c * 4)) - 1;
|
|
- if (pres > PRESCL_CTRL0_MAX)
|
|
+ if (pres > PRESCL_CTRL0_I3C_MAX)
|
|
return -ERANGE;
|
|
|
|
bus->scl_rate.i3c = sysclk_rate / ((pres + 1) * 4);
|
|
@@ -1247,7 +1248,7 @@ static int cdns_i3c_master_bus_init(struct i3c_master_controller *m)
|
|
max_i2cfreq = bus->scl_rate.i2c;
|
|
|
|
pres = (sysclk_rate / (max_i2cfreq * 5)) - 1;
|
|
- if (pres > PRESCL_CTRL0_MAX)
|
|
+ if (pres > PRESCL_CTRL0_I2C_MAX)
|
|
return -ERANGE;
|
|
|
|
bus->scl_rate.i2c = sysclk_rate / ((pres + 1) * 5);
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
|
|
index 5b3154503bf49..319d4288eddde 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
|
|
@@ -531,21 +531,18 @@ static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)
|
|
if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
|
|
rec.join_state = SENDONLY_FULLMEMBER_JOIN;
|
|
}
|
|
- spin_unlock_irq(&priv->lock);
|
|
|
|
multicast = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port,
|
|
- &rec, comp_mask, GFP_KERNEL,
|
|
+ &rec, comp_mask, GFP_ATOMIC,
|
|
ipoib_mcast_join_complete, mcast);
|
|
- spin_lock_irq(&priv->lock);
|
|
if (IS_ERR(multicast)) {
|
|
ret = PTR_ERR(multicast);
|
|
ipoib_warn(priv, "ib_sa_join_multicast failed, status %d\n", ret);
|
|
/* Requeue this join task with a backoff delay */
|
|
__ipoib_mcast_schedule_join_thread(priv, mcast, 1);
|
|
clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
|
|
- spin_unlock_irq(&priv->lock);
|
|
complete(&mcast->done);
|
|
- spin_lock_irq(&priv->lock);
|
|
+ return ret;
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/leds/trigger/ledtrig-panic.c b/drivers/leds/trigger/ledtrig-panic.c
|
|
index 64abf2e91608a..5a6b21bfeb9af 100644
|
|
--- a/drivers/leds/trigger/ledtrig-panic.c
|
|
+++ b/drivers/leds/trigger/ledtrig-panic.c
|
|
@@ -64,10 +64,13 @@ static long led_panic_blink(int state)
|
|
|
|
static int __init ledtrig_panic_init(void)
|
|
{
|
|
+ led_trigger_register_simple("panic", &trigger);
|
|
+ if (!trigger)
|
|
+ return -ENOMEM;
|
|
+
|
|
atomic_notifier_chain_register(&panic_notifier_list,
|
|
&led_trigger_panic_nb);
|
|
|
|
- led_trigger_register_simple("panic", &trigger);
|
|
panic_blink = led_panic_blink;
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/mailbox/arm_mhuv2.c b/drivers/mailbox/arm_mhuv2.c
|
|
index c6d4957c4da83..0ec21dcdbde72 100644
|
|
--- a/drivers/mailbox/arm_mhuv2.c
|
|
+++ b/drivers/mailbox/arm_mhuv2.c
|
|
@@ -553,7 +553,8 @@ static irqreturn_t mhuv2_sender_interrupt(int irq, void *data)
|
|
priv = chan->con_priv;
|
|
|
|
if (!IS_PROTOCOL_DOORBELL(priv)) {
|
|
- writel_relaxed(1, &mhu->send->ch_wn[priv->ch_wn_idx + priv->windows - 1].int_clr);
|
|
+ for (i = 0; i < priv->windows; i++)
|
|
+ writel_relaxed(1, &mhu->send->ch_wn[priv->ch_wn_idx + i].int_clr);
|
|
|
|
if (chan->cl) {
|
|
mbox_chan_txdone(chan, 0);
|
|
diff --git a/drivers/md/md.c b/drivers/md/md.c
|
|
index 6120f26a79696..3ccf1920682cb 100644
|
|
--- a/drivers/md/md.c
|
|
+++ b/drivers/md/md.c
|
|
@@ -1145,6 +1145,7 @@ struct super_type {
|
|
struct md_rdev *refdev,
|
|
int minor_version);
|
|
int (*validate_super)(struct mddev *mddev,
|
|
+ struct md_rdev *freshest,
|
|
struct md_rdev *rdev);
|
|
void (*sync_super)(struct mddev *mddev,
|
|
struct md_rdev *rdev);
|
|
@@ -1282,8 +1283,9 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor
|
|
|
|
/*
|
|
* validate_super for 0.90.0
|
|
+ * note: we are not using "freshest" for 0.9 superblock
|
|
*/
|
|
-static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
+static int super_90_validate(struct mddev *mddev, struct md_rdev *freshest, struct md_rdev *rdev)
|
|
{
|
|
mdp_disk_t *desc;
|
|
mdp_super_t *sb = page_address(rdev->sb_page);
|
|
@@ -1795,7 +1797,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
|
|
return ret;
|
|
}
|
|
|
|
-static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
+static int super_1_validate(struct mddev *mddev, struct md_rdev *freshest, struct md_rdev *rdev)
|
|
{
|
|
struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
|
|
__u64 ev1 = le64_to_cpu(sb->events);
|
|
@@ -1891,13 +1893,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
}
|
|
} else if (mddev->pers == NULL) {
|
|
/* Insist of good event counter while assembling, except for
|
|
- * spares (which don't need an event count) */
|
|
- ++ev1;
|
|
+ * spares (which don't need an event count).
|
|
+ * Similar to mdadm, we allow event counter difference of 1
|
|
+ * from the freshest device.
|
|
+ */
|
|
if (rdev->desc_nr >= 0 &&
|
|
rdev->desc_nr < le32_to_cpu(sb->max_dev) &&
|
|
(le16_to_cpu(sb->dev_roles[rdev->desc_nr]) < MD_DISK_ROLE_MAX ||
|
|
le16_to_cpu(sb->dev_roles[rdev->desc_nr]) == MD_DISK_ROLE_JOURNAL))
|
|
- if (ev1 < mddev->events)
|
|
+ if (ev1 + 1 < mddev->events)
|
|
return -EINVAL;
|
|
} else if (mddev->bitmap) {
|
|
/* If adding to array with a bitmap, then we can accept an
|
|
@@ -1918,8 +1922,38 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
rdev->desc_nr >= le32_to_cpu(sb->max_dev)) {
|
|
role = MD_DISK_ROLE_SPARE;
|
|
rdev->desc_nr = -1;
|
|
- } else
|
|
+ } else if (mddev->pers == NULL && freshest && ev1 < mddev->events) {
|
|
+ /*
|
|
+ * If we are assembling, and our event counter is smaller than the
|
|
+ * highest event counter, we cannot trust our superblock about the role.
|
|
+ * It could happen that our rdev was marked as Faulty, and all other
|
|
+ * superblocks were updated with +1 event counter.
|
|
+ * Then, before the next superblock update, which typically happens when
|
|
+ * remove_and_add_spares() removes the device from the array, there was
|
|
+ * a crash or reboot.
|
|
+ * If we allow current rdev without consulting the freshest superblock,
|
|
+ * we could cause data corruption.
|
|
+ * Note that in this case our event counter is smaller by 1 than the
|
|
+ * highest, otherwise, this rdev would not be allowed into array;
|
|
+ * both kernel and mdadm allow event counter difference of 1.
|
|
+ */
|
|
+ struct mdp_superblock_1 *freshest_sb = page_address(freshest->sb_page);
|
|
+ u32 freshest_max_dev = le32_to_cpu(freshest_sb->max_dev);
|
|
+
|
|
+ if (rdev->desc_nr >= freshest_max_dev) {
|
|
+ /* this is unexpected, better not proceed */
|
|
+ pr_warn("md: %s: rdev[%pg]: desc_nr(%d) >= freshest(%pg)->sb->max_dev(%u)\n",
|
|
+ mdname(mddev), rdev->bdev, rdev->desc_nr,
|
|
+ freshest->bdev, freshest_max_dev);
|
|
+ return -EUCLEAN;
|
|
+ }
|
|
+
|
|
+ role = le16_to_cpu(freshest_sb->dev_roles[rdev->desc_nr]);
|
|
+ pr_debug("md: %s: rdev[%pg]: role=%d(0x%x) according to freshest %pg\n",
|
|
+ mdname(mddev), rdev->bdev, role, role, freshest->bdev);
|
|
+ } else {
|
|
role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]);
|
|
+ }
|
|
switch(role) {
|
|
case MD_DISK_ROLE_SPARE: /* spare */
|
|
break;
|
|
@@ -2861,7 +2895,7 @@ static int add_bound_rdev(struct md_rdev *rdev)
|
|
* and should be added immediately.
|
|
*/
|
|
super_types[mddev->major_version].
|
|
- validate_super(mddev, rdev);
|
|
+ validate_super(mddev, NULL/*freshest*/, rdev);
|
|
if (add_journal)
|
|
mddev_suspend(mddev);
|
|
err = mddev->pers->hot_add_disk(mddev, rdev);
|
|
@@ -3775,7 +3809,7 @@ static int analyze_sbs(struct mddev *mddev)
|
|
}
|
|
|
|
super_types[mddev->major_version].
|
|
- validate_super(mddev, freshest);
|
|
+ validate_super(mddev, NULL/*freshest*/, freshest);
|
|
|
|
i = 0;
|
|
rdev_for_each_safe(rdev, tmp, mddev) {
|
|
@@ -3790,7 +3824,7 @@ static int analyze_sbs(struct mddev *mddev)
|
|
}
|
|
if (rdev != freshest) {
|
|
if (super_types[mddev->major_version].
|
|
- validate_super(mddev, rdev)) {
|
|
+ validate_super(mddev, freshest, rdev)) {
|
|
pr_warn("md: kicking non-fresh %pg from array!\n",
|
|
rdev->bdev);
|
|
md_kick_rdev_from_array(rdev);
|
|
@@ -6804,7 +6838,7 @@ int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
|
|
rdev->saved_raid_disk = rdev->raid_disk;
|
|
} else
|
|
super_types[mddev->major_version].
|
|
- validate_super(mddev, rdev);
|
|
+ validate_super(mddev, NULL/*freshest*/, rdev);
|
|
if ((info->state & (1<<MD_DISK_SYNC)) &&
|
|
rdev->raid_disk != info->raid_disk) {
|
|
/* This was a hot-add request, but events doesn't
|
|
diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
|
|
index 078ede2b7a00f..8e91767d61300 100644
|
|
--- a/drivers/media/i2c/imx335.c
|
|
+++ b/drivers/media/i2c/imx335.c
|
|
@@ -971,8 +971,8 @@ static int imx335_init_controls(struct imx335 *imx335)
|
|
imx335->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
|
|
&imx335_ctrl_ops,
|
|
V4L2_CID_HBLANK,
|
|
- IMX335_REG_MIN,
|
|
- IMX335_REG_MAX,
|
|
+ mode->hblank,
|
|
+ mode->hblank,
|
|
1, mode->hblank);
|
|
if (imx335->hblank_ctrl)
|
|
imx335->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
|
diff --git a/drivers/media/pci/ddbridge/ddbridge-main.c b/drivers/media/pci/ddbridge/ddbridge-main.c
|
|
index 91733ab9f58c3..363badab7cf07 100644
|
|
--- a/drivers/media/pci/ddbridge/ddbridge-main.c
|
|
+++ b/drivers/media/pci/ddbridge/ddbridge-main.c
|
|
@@ -238,7 +238,7 @@ fail:
|
|
ddb_unmap(dev);
|
|
pci_set_drvdata(pdev, NULL);
|
|
pci_disable_device(pdev);
|
|
- return -1;
|
|
+ return stat;
|
|
}
|
|
|
|
/****************************************************************************/
|
|
diff --git a/drivers/media/platform/amphion/vpu.h b/drivers/media/platform/amphion/vpu.h
|
|
index deb2288d42904..4f3d23b55b6da 100644
|
|
--- a/drivers/media/platform/amphion/vpu.h
|
|
+++ b/drivers/media/platform/amphion/vpu.h
|
|
@@ -152,7 +152,6 @@ struct vpu_core {
|
|
struct vpu_mbox tx_type;
|
|
struct vpu_mbox tx_data;
|
|
struct vpu_mbox rx;
|
|
- unsigned long cmd_seq;
|
|
|
|
wait_queue_head_t ack_wq;
|
|
struct completion cmp;
|
|
@@ -251,6 +250,8 @@ struct vpu_inst {
|
|
|
|
struct list_head cmd_q;
|
|
void *pending;
|
|
+ unsigned long cmd_seq;
|
|
+ atomic_long_t last_response_cmd;
|
|
|
|
struct vpu_inst_ops *ops;
|
|
const struct vpu_format *formats;
|
|
diff --git a/drivers/media/platform/amphion/vpu_cmds.c b/drivers/media/platform/amphion/vpu_cmds.c
|
|
index 235b71398d403..c68163af29dc6 100644
|
|
--- a/drivers/media/platform/amphion/vpu_cmds.c
|
|
+++ b/drivers/media/platform/amphion/vpu_cmds.c
|
|
@@ -34,6 +34,7 @@ struct vpu_cmd_t {
|
|
struct vpu_cmd_request *request;
|
|
struct vpu_rpc_event *pkt;
|
|
unsigned long key;
|
|
+ atomic_long_t *last_response_cmd;
|
|
};
|
|
|
|
static struct vpu_cmd_request vpu_cmd_requests[] = {
|
|
@@ -117,6 +118,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd)
|
|
{
|
|
if (!cmd)
|
|
return;
|
|
+ if (cmd->last_response_cmd)
|
|
+ atomic_long_set(cmd->last_response_cmd, cmd->key);
|
|
vfree(cmd->pkt);
|
|
vfree(cmd);
|
|
}
|
|
@@ -174,7 +177,8 @@ static int vpu_request_cmd(struct vpu_inst *inst, u32 id, void *data,
|
|
return -ENOMEM;
|
|
|
|
mutex_lock(&core->cmd_lock);
|
|
- cmd->key = core->cmd_seq++;
|
|
+ cmd->key = ++inst->cmd_seq;
|
|
+ cmd->last_response_cmd = &inst->last_response_cmd;
|
|
if (key)
|
|
*key = cmd->key;
|
|
if (sync)
|
|
@@ -248,26 +252,12 @@ void vpu_clear_request(struct vpu_inst *inst)
|
|
|
|
static bool check_is_responsed(struct vpu_inst *inst, unsigned long key)
|
|
{
|
|
- struct vpu_core *core = inst->core;
|
|
- struct vpu_cmd_t *cmd;
|
|
- bool flag = true;
|
|
+ unsigned long last_response = atomic_long_read(&inst->last_response_cmd);
|
|
|
|
- mutex_lock(&core->cmd_lock);
|
|
- cmd = inst->pending;
|
|
- if (cmd && key == cmd->key) {
|
|
- flag = false;
|
|
- goto exit;
|
|
- }
|
|
- list_for_each_entry(cmd, &inst->cmd_q, list) {
|
|
- if (key == cmd->key) {
|
|
- flag = false;
|
|
- break;
|
|
- }
|
|
- }
|
|
-exit:
|
|
- mutex_unlock(&core->cmd_lock);
|
|
+ if (key <= last_response && (last_response - key) < (ULONG_MAX >> 1))
|
|
+ return true;
|
|
|
|
- return flag;
|
|
+ return false;
|
|
}
|
|
|
|
static int sync_session_response(struct vpu_inst *inst, unsigned long key, long timeout, int try)
|
|
diff --git a/drivers/media/platform/amphion/vpu_v4l2.c b/drivers/media/platform/amphion/vpu_v4l2.c
|
|
index e5c8e1a753ccd..e7a18948c4ab0 100644
|
|
--- a/drivers/media/platform/amphion/vpu_v4l2.c
|
|
+++ b/drivers/media/platform/amphion/vpu_v4l2.c
|
|
@@ -631,6 +631,7 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *inst)
|
|
func = &vpu->decoder;
|
|
|
|
atomic_set(&inst->ref_count, 0);
|
|
+ atomic_long_set(&inst->last_response_cmd, 0);
|
|
vpu_inst_get(inst);
|
|
inst->vpu = vpu;
|
|
inst->core = vpu_request_core(vpu, inst->type);
|
|
diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c
|
|
index 61b25fcf826e9..9b20cef5afc61 100644
|
|
--- a/drivers/media/platform/rockchip/rga/rga.c
|
|
+++ b/drivers/media/platform/rockchip/rga/rga.c
|
|
@@ -187,25 +187,16 @@ static int rga_setup_ctrls(struct rga_ctx *ctx)
|
|
static struct rga_fmt formats[] = {
|
|
{
|
|
.fourcc = V4L2_PIX_FMT_ARGB32,
|
|
- .color_swap = RGA_COLOR_RB_SWAP,
|
|
+ .color_swap = RGA_COLOR_ALPHA_SWAP,
|
|
.hw_format = RGA_COLOR_FMT_ABGR8888,
|
|
.depth = 32,
|
|
.uv_factor = 1,
|
|
.y_div = 1,
|
|
.x_div = 1,
|
|
},
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_XRGB32,
|
|
- .color_swap = RGA_COLOR_RB_SWAP,
|
|
- .hw_format = RGA_COLOR_FMT_XBGR8888,
|
|
- .depth = 32,
|
|
- .uv_factor = 1,
|
|
- .y_div = 1,
|
|
- .x_div = 1,
|
|
- },
|
|
{
|
|
.fourcc = V4L2_PIX_FMT_ABGR32,
|
|
- .color_swap = RGA_COLOR_ALPHA_SWAP,
|
|
+ .color_swap = RGA_COLOR_RB_SWAP,
|
|
.hw_format = RGA_COLOR_FMT_ABGR8888,
|
|
.depth = 32,
|
|
.uv_factor = 1,
|
|
@@ -214,7 +205,7 @@ static struct rga_fmt formats[] = {
|
|
},
|
|
{
|
|
.fourcc = V4L2_PIX_FMT_XBGR32,
|
|
- .color_swap = RGA_COLOR_ALPHA_SWAP,
|
|
+ .color_swap = RGA_COLOR_RB_SWAP,
|
|
.hw_format = RGA_COLOR_FMT_XBGR8888,
|
|
.depth = 32,
|
|
.uv_factor = 1,
|
|
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
|
|
index a1293c45aae11..f9ec1c6138947 100644
|
|
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
|
|
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
|
|
@@ -61,6 +61,14 @@ struct dentry;
|
|
RKISP1_CIF_ISP_EXP_END | \
|
|
RKISP1_CIF_ISP_HIST_MEASURE_RDY)
|
|
|
|
+/* IRQ lines */
|
|
+enum rkisp1_irq_line {
|
|
+ RKISP1_IRQ_ISP = 0,
|
|
+ RKISP1_IRQ_MI,
|
|
+ RKISP1_IRQ_MIPI,
|
|
+ RKISP1_NUM_IRQS,
|
|
+};
|
|
+
|
|
/* enum for the resizer pads */
|
|
enum rkisp1_rsz_pad {
|
|
RKISP1_RSZ_PAD_SINK,
|
|
@@ -441,7 +449,6 @@ struct rkisp1_debug {
|
|
* struct rkisp1_device - ISP platform device
|
|
*
|
|
* @base_addr: base register address
|
|
- * @irq: the irq number
|
|
* @dev: a pointer to the struct device
|
|
* @clk_size: number of clocks
|
|
* @clks: array of clocks
|
|
@@ -459,6 +466,7 @@ struct rkisp1_debug {
|
|
* @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices.
|
|
* @debug: debug params to be exposed on debugfs
|
|
* @info: version-specific ISP information
|
|
+ * @irqs: IRQ line numbers
|
|
*/
|
|
struct rkisp1_device {
|
|
void __iomem *base_addr;
|
|
@@ -479,6 +487,7 @@ struct rkisp1_device {
|
|
struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */
|
|
struct rkisp1_debug debug;
|
|
const struct rkisp1_info *info;
|
|
+ int irqs[RKISP1_NUM_IRQS];
|
|
};
|
|
|
|
/*
|
|
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
|
|
index d7acc94e10f8d..e862f515cc6d3 100644
|
|
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
|
|
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
|
|
@@ -141,8 +141,20 @@ static void rkisp1_csi_disable(struct rkisp1_csi *csi)
|
|
struct rkisp1_device *rkisp1 = csi->rkisp1;
|
|
u32 val;
|
|
|
|
- /* Mask and clear interrupts. */
|
|
+ /* Mask MIPI interrupts. */
|
|
rkisp1_write(rkisp1, RKISP1_CIF_MIPI_IMSC, 0);
|
|
+
|
|
+ /* Flush posted writes */
|
|
+ rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
|
|
+
|
|
+ /*
|
|
+ * Wait until the IRQ handler has ended. The IRQ handler may get called
|
|
+ * even after this, but it will return immediately as the MIPI
|
|
+ * interrupts have been masked.
|
|
+ */
|
|
+ synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MIPI]);
|
|
+
|
|
+ /* Clear MIPI interrupt status */
|
|
rkisp1_write(rkisp1, RKISP1_CIF_MIPI_ICR, ~0);
|
|
|
|
val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
|
|
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
|
|
index 2b76339f9381c..aeb6bb63667eb 100644
|
|
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
|
|
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
|
|
@@ -114,6 +114,7 @@
|
|
struct rkisp1_isr_data {
|
|
const char *name;
|
|
irqreturn_t (*isr)(int irq, void *ctx);
|
|
+ u32 line_mask;
|
|
};
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
@@ -442,17 +443,25 @@ error:
|
|
|
|
static irqreturn_t rkisp1_isr(int irq, void *ctx)
|
|
{
|
|
+ irqreturn_t ret = IRQ_NONE;
|
|
+
|
|
/*
|
|
* Call rkisp1_capture_isr() first to handle the frame that
|
|
* potentially completed using the current frame_sequence number before
|
|
* it is potentially incremented by rkisp1_isp_isr() in the vertical
|
|
* sync.
|
|
*/
|
|
- rkisp1_capture_isr(irq, ctx);
|
|
- rkisp1_isp_isr(irq, ctx);
|
|
- rkisp1_csi_isr(irq, ctx);
|
|
|
|
- return IRQ_HANDLED;
|
|
+ if (rkisp1_capture_isr(irq, ctx) == IRQ_HANDLED)
|
|
+ ret = IRQ_HANDLED;
|
|
+
|
|
+ if (rkisp1_isp_isr(irq, ctx) == IRQ_HANDLED)
|
|
+ ret = IRQ_HANDLED;
|
|
+
|
|
+ if (rkisp1_csi_isr(irq, ctx) == IRQ_HANDLED)
|
|
+ ret = IRQ_HANDLED;
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static const char * const px30_isp_clks[] = {
|
|
@@ -463,9 +472,9 @@ static const char * const px30_isp_clks[] = {
|
|
};
|
|
|
|
static const struct rkisp1_isr_data px30_isp_isrs[] = {
|
|
- { "isp", rkisp1_isp_isr },
|
|
- { "mi", rkisp1_capture_isr },
|
|
- { "mipi", rkisp1_csi_isr },
|
|
+ { "isp", rkisp1_isp_isr, BIT(RKISP1_IRQ_ISP) },
|
|
+ { "mi", rkisp1_capture_isr, BIT(RKISP1_IRQ_MI) },
|
|
+ { "mipi", rkisp1_csi_isr, BIT(RKISP1_IRQ_MIPI) },
|
|
};
|
|
|
|
static const struct rkisp1_info px30_isp_info = {
|
|
@@ -484,7 +493,7 @@ static const char * const rk3399_isp_clks[] = {
|
|
};
|
|
|
|
static const struct rkisp1_isr_data rk3399_isp_isrs[] = {
|
|
- { NULL, rkisp1_isr },
|
|
+ { NULL, rkisp1_isr, BIT(RKISP1_IRQ_ISP) | BIT(RKISP1_IRQ_MI) | BIT(RKISP1_IRQ_MIPI) },
|
|
};
|
|
|
|
static const struct rkisp1_info rk3399_isp_info = {
|
|
@@ -535,6 +544,9 @@ static int rkisp1_probe(struct platform_device *pdev)
|
|
if (IS_ERR(rkisp1->base_addr))
|
|
return PTR_ERR(rkisp1->base_addr);
|
|
|
|
+ for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il)
|
|
+ rkisp1->irqs[il] = -1;
|
|
+
|
|
for (i = 0; i < info->isr_size; i++) {
|
|
irq = info->isrs[i].name
|
|
? platform_get_irq_byname(pdev, info->isrs[i].name)
|
|
@@ -542,7 +554,12 @@ static int rkisp1_probe(struct platform_device *pdev)
|
|
if (irq < 0)
|
|
return irq;
|
|
|
|
- ret = devm_request_irq(dev, irq, info->isrs[i].isr, IRQF_SHARED,
|
|
+ for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il) {
|
|
+ if (info->isrs[i].line_mask & BIT(il))
|
|
+ rkisp1->irqs[il] = irq;
|
|
+ }
|
|
+
|
|
+ ret = devm_request_irq(dev, irq, info->isrs[i].isr, 0,
|
|
dev_driver_string(dev), dev);
|
|
if (ret) {
|
|
dev_err(dev, "request irq failed: %d\n", ret);
|
|
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
|
|
index 585cf3f534692..00dca284c1222 100644
|
|
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
|
|
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
|
|
@@ -281,11 +281,25 @@ static void rkisp1_isp_stop(struct rkisp1_isp *isp)
|
|
* ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
|
|
* Stop ISP(isp) ->wait for ISP isp off
|
|
*/
|
|
- /* stop and clear MI and ISP interrupts */
|
|
- rkisp1_write(rkisp1, RKISP1_CIF_ISP_IMSC, 0);
|
|
- rkisp1_write(rkisp1, RKISP1_CIF_ISP_ICR, ~0);
|
|
|
|
+ /* Mask MI and ISP interrupts */
|
|
+ rkisp1_write(rkisp1, RKISP1_CIF_ISP_IMSC, 0);
|
|
rkisp1_write(rkisp1, RKISP1_CIF_MI_IMSC, 0);
|
|
+
|
|
+ /* Flush posted writes */
|
|
+ rkisp1_read(rkisp1, RKISP1_CIF_MI_IMSC);
|
|
+
|
|
+ /*
|
|
+ * Wait until the IRQ handler has ended. The IRQ handler may get called
|
|
+ * even after this, but it will return immediately as the MI and ISP
|
|
+ * interrupts have been masked.
|
|
+ */
|
|
+ synchronize_irq(rkisp1->irqs[RKISP1_IRQ_ISP]);
|
|
+ if (rkisp1->irqs[RKISP1_IRQ_ISP] != rkisp1->irqs[RKISP1_IRQ_MI])
|
|
+ synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MI]);
|
|
+
|
|
+ /* Clear MI and ISP interrupt status */
|
|
+ rkisp1_write(rkisp1, RKISP1_CIF_ISP_ICR, ~0);
|
|
rkisp1_write(rkisp1, RKISP1_CIF_MI_ICR, ~0);
|
|
|
|
/* stop ISP */
|
|
diff --git a/drivers/media/usb/stk1160/stk1160-video.c b/drivers/media/usb/stk1160/stk1160-video.c
|
|
index 4e966f6bf608d..366f0e4a5dc0d 100644
|
|
--- a/drivers/media/usb/stk1160/stk1160-video.c
|
|
+++ b/drivers/media/usb/stk1160/stk1160-video.c
|
|
@@ -107,8 +107,7 @@ void stk1160_copy_video(struct stk1160 *dev, u8 *src, int len)
|
|
|
|
/*
|
|
* TODO: These stk1160_dbg are very spammy!
|
|
- * We should 1) check why we are getting them
|
|
- * and 2) add ratelimit.
|
|
+ * We should check why we are getting them.
|
|
*
|
|
* UPDATE: One of the reasons (the only one?) for getting these
|
|
* is incorrect standard (mismatch between expected and configured).
|
|
@@ -151,7 +150,7 @@ void stk1160_copy_video(struct stk1160 *dev, u8 *src, int len)
|
|
|
|
/* Let the bug hunt begin! sanity checks! */
|
|
if (lencopy < 0) {
|
|
- stk1160_dbg("copy skipped: negative lencopy\n");
|
|
+ printk_ratelimited(KERN_DEBUG "copy skipped: negative lencopy\n");
|
|
return;
|
|
}
|
|
|
|
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
|
|
index 9da8235cb6900..43cb511fd8ba7 100644
|
|
--- a/drivers/mfd/Kconfig
|
|
+++ b/drivers/mfd/Kconfig
|
|
@@ -1440,6 +1440,7 @@ config MFD_DAVINCI_VOICECODEC
|
|
|
|
config MFD_TI_AM335X_TSCADC
|
|
tristate "TI ADC / Touch Screen chip support"
|
|
+ depends on ARCH_OMAP2PLUS || ARCH_K3 || COMPILE_TEST
|
|
select MFD_CORE
|
|
select REGMAP
|
|
select REGMAP_MMIO
|
|
diff --git a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
|
|
index d7daa01fe7ca9..fdec2c30eb165 100644
|
|
--- a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
|
|
+++ b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
|
|
@@ -151,6 +151,7 @@ static int lis3lv02d_i2c_probe(struct i2c_client *client,
|
|
lis3_dev.init = lis3_i2c_init;
|
|
lis3_dev.read = lis3_i2c_read;
|
|
lis3_dev.write = lis3_i2c_write;
|
|
+ lis3_dev.reg_ctrl = lis3_reg_ctrl;
|
|
lis3_dev.irq = client->irq;
|
|
lis3_dev.ac = lis3lv02d_axis_map;
|
|
lis3_dev.pm_dev = &client->dev;
|
|
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
|
|
index fc5da5d7744da..9c4c2c7d90ef5 100644
|
|
--- a/drivers/net/bonding/bond_alb.c
|
|
+++ b/drivers/net/bonding/bond_alb.c
|
|
@@ -985,7 +985,8 @@ static int alb_upper_dev_walk(struct net_device *upper,
|
|
if (netif_is_macvlan(upper) && !strict_match) {
|
|
tags = bond_verify_device_path(bond->dev, upper, 0);
|
|
if (IS_ERR_OR_NULL(tags))
|
|
- BUG();
|
|
+ return -ENOMEM;
|
|
+
|
|
alb_send_lp_vid(slave, upper->dev_addr,
|
|
tags[0].vlan_proto, tags[0].vlan_id);
|
|
kfree(tags);
|
|
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
|
|
index e693154cf8034..97a47d8743fd3 100644
|
|
--- a/drivers/net/dsa/mv88e6xxx/chip.h
|
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
|
|
@@ -601,8 +601,8 @@ struct mv88e6xxx_ops {
|
|
int (*serdes_get_sset_count)(struct mv88e6xxx_chip *chip, int port);
|
|
int (*serdes_get_strings)(struct mv88e6xxx_chip *chip, int port,
|
|
uint8_t *data);
|
|
- int (*serdes_get_stats)(struct mv88e6xxx_chip *chip, int port,
|
|
- uint64_t *data);
|
|
+ size_t (*serdes_get_stats)(struct mv88e6xxx_chip *chip, int port,
|
|
+ uint64_t *data);
|
|
|
|
/* SERDES registers for ethtool */
|
|
int (*serdes_get_regs_len)(struct mv88e6xxx_chip *chip, int port);
|
|
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
|
|
index d94150d8f3f47..4c38df4982bfe 100644
|
|
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
|
|
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
|
|
@@ -342,8 +342,8 @@ static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip,
|
|
return val;
|
|
}
|
|
|
|
-int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
- uint64_t *data)
|
|
+size_t mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
+ uint64_t *data)
|
|
{
|
|
struct mv88e6xxx_port *mv88e6xxx_port = &chip->ports[port];
|
|
struct mv88e6352_serdes_hw_stat *stat;
|
|
@@ -352,7 +352,7 @@ int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
|
|
err = mv88e6352_g2_scratch_port_has_serdes(chip, port);
|
|
if (err <= 0)
|
|
- return err;
|
|
+ return 0;
|
|
|
|
BUILD_BUG_ON(ARRAY_SIZE(mv88e6352_serdes_hw_stats) >
|
|
ARRAY_SIZE(mv88e6xxx_port->serdes_stats));
|
|
@@ -798,8 +798,8 @@ static uint64_t mv88e6390_serdes_get_stat(struct mv88e6xxx_chip *chip, int lane,
|
|
return reg[0] | ((u64)reg[1] << 16) | ((u64)reg[2] << 32);
|
|
}
|
|
|
|
-int mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
- uint64_t *data)
|
|
+size_t mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
+ uint64_t *data)
|
|
{
|
|
struct mv88e6390_serdes_hw_stat *stat;
|
|
int lane;
|
|
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx/serdes.h
|
|
index 29bb4e91e2f6b..67369054951fb 100644
|
|
--- a/drivers/net/dsa/mv88e6xxx/serdes.h
|
|
+++ b/drivers/net/dsa/mv88e6xxx/serdes.h
|
|
@@ -165,13 +165,13 @@ irqreturn_t mv88e6393x_serdes_irq_status(struct mv88e6xxx_chip *chip, int port,
|
|
int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port);
|
|
int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
|
|
int port, uint8_t *data);
|
|
-int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
- uint64_t *data);
|
|
+size_t mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
+ uint64_t *data);
|
|
int mv88e6390_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port);
|
|
int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip,
|
|
int port, uint8_t *data);
|
|
-int mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
- uint64_t *data);
|
|
+size_t mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
|
|
+ uint64_t *data);
|
|
|
|
int mv88e6352_serdes_get_regs_len(struct mv88e6xxx_chip *chip, int port);
|
|
void mv88e6352_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p);
|
|
diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
|
|
index 1e94ba1031ece..641692f716f86 100644
|
|
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
|
|
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
|
|
@@ -842,10 +842,15 @@ qca8k_mdio_register(struct qca8k_priv *priv)
|
|
struct dsa_switch *ds = priv->ds;
|
|
struct device_node *mdio;
|
|
struct mii_bus *bus;
|
|
+ int err;
|
|
+
|
|
+ mdio = of_get_child_by_name(priv->dev->of_node, "mdio");
|
|
|
|
bus = devm_mdiobus_alloc(ds->dev);
|
|
- if (!bus)
|
|
- return -ENOMEM;
|
|
+ if (!bus) {
|
|
+ err = -ENOMEM;
|
|
+ goto out_put_node;
|
|
+ }
|
|
|
|
bus->priv = (void *)priv;
|
|
snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d",
|
|
@@ -855,12 +860,12 @@ qca8k_mdio_register(struct qca8k_priv *priv)
|
|
ds->slave_mii_bus = bus;
|
|
|
|
/* Check if the devicetree declare the port:phy mapping */
|
|
- mdio = of_get_child_by_name(priv->dev->of_node, "mdio");
|
|
if (of_device_is_available(mdio)) {
|
|
bus->name = "qca8k slave mii";
|
|
bus->read = qca8k_internal_mdio_read;
|
|
bus->write = qca8k_internal_mdio_write;
|
|
- return devm_of_mdiobus_register(priv->dev, bus, mdio);
|
|
+ err = devm_of_mdiobus_register(priv->dev, bus, mdio);
|
|
+ goto out_put_node;
|
|
}
|
|
|
|
/* If a mapping can't be found the legacy mapping is used,
|
|
@@ -869,7 +874,13 @@ qca8k_mdio_register(struct qca8k_priv *priv)
|
|
bus->name = "qca8k-legacy slave mii";
|
|
bus->read = qca8k_legacy_mdio_read;
|
|
bus->write = qca8k_legacy_mdio_write;
|
|
- return devm_mdiobus_register(priv->dev, bus);
|
|
+
|
|
+ err = devm_mdiobus_register(priv->dev, bus);
|
|
+
|
|
+out_put_node:
|
|
+ of_node_put(mdio);
|
|
+
|
|
+ return err;
|
|
}
|
|
|
|
static int
|
|
@@ -1924,12 +1935,11 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
|
|
priv->info = of_device_get_match_data(priv->dev);
|
|
|
|
priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset",
|
|
- GPIOD_ASIS);
|
|
+ GPIOD_OUT_HIGH);
|
|
if (IS_ERR(priv->reset_gpio))
|
|
return PTR_ERR(priv->reset_gpio);
|
|
|
|
if (priv->reset_gpio) {
|
|
- gpiod_set_value_cansleep(priv->reset_gpio, 1);
|
|
/* The active low duration must be greater than 10 ms
|
|
* and checkpatch.pl wants 20 ms.
|
|
*/
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
|
|
index 28c9b6f1a54f1..abd4832e4ed21 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
|
|
@@ -953,8 +953,6 @@ int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic)
|
|
{
|
|
struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp;
|
|
unsigned int tx_ring_idx, rx_ring_idx;
|
|
- struct aq_ring_s *hwts;
|
|
- struct aq_ring_s *ring;
|
|
int err;
|
|
|
|
if (!aq_ptp)
|
|
@@ -962,29 +960,23 @@ int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic)
|
|
|
|
tx_ring_idx = aq_ptp_ring_idx(aq_nic->aq_nic_cfg.tc_mode);
|
|
|
|
- ring = aq_ring_tx_alloc(&aq_ptp->ptp_tx, aq_nic,
|
|
- tx_ring_idx, &aq_nic->aq_nic_cfg);
|
|
- if (!ring) {
|
|
- err = -ENOMEM;
|
|
+ err = aq_ring_tx_alloc(&aq_ptp->ptp_tx, aq_nic,
|
|
+ tx_ring_idx, &aq_nic->aq_nic_cfg);
|
|
+ if (err)
|
|
goto err_exit;
|
|
- }
|
|
|
|
rx_ring_idx = aq_ptp_ring_idx(aq_nic->aq_nic_cfg.tc_mode);
|
|
|
|
- ring = aq_ring_rx_alloc(&aq_ptp->ptp_rx, aq_nic,
|
|
- rx_ring_idx, &aq_nic->aq_nic_cfg);
|
|
- if (!ring) {
|
|
- err = -ENOMEM;
|
|
+ err = aq_ring_rx_alloc(&aq_ptp->ptp_rx, aq_nic,
|
|
+ rx_ring_idx, &aq_nic->aq_nic_cfg);
|
|
+ if (err)
|
|
goto err_exit_ptp_tx;
|
|
- }
|
|
|
|
- hwts = aq_ring_hwts_rx_alloc(&aq_ptp->hwts_rx, aq_nic, PTP_HWST_RING_IDX,
|
|
- aq_nic->aq_nic_cfg.rxds,
|
|
- aq_nic->aq_nic_cfg.aq_hw_caps->rxd_size);
|
|
- if (!hwts) {
|
|
- err = -ENOMEM;
|
|
+ err = aq_ring_hwts_rx_alloc(&aq_ptp->hwts_rx, aq_nic, PTP_HWST_RING_IDX,
|
|
+ aq_nic->aq_nic_cfg.rxds,
|
|
+ aq_nic->aq_nic_cfg.aq_hw_caps->rxd_size);
|
|
+ if (err)
|
|
goto err_exit_ptp_rx;
|
|
- }
|
|
|
|
err = aq_ptp_skb_ring_init(&aq_ptp->skb_ring, aq_nic->aq_nic_cfg.rxds);
|
|
if (err != 0) {
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
|
|
index 4d9d7d1edb9b3..9c314fe14ab62 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
|
|
@@ -132,8 +132,8 @@ static int aq_get_rxpages(struct aq_ring_s *self, struct aq_ring_buff_s *rxbuf)
|
|
return 0;
|
|
}
|
|
|
|
-static struct aq_ring_s *aq_ring_alloc(struct aq_ring_s *self,
|
|
- struct aq_nic_s *aq_nic)
|
|
+static int aq_ring_alloc(struct aq_ring_s *self,
|
|
+ struct aq_nic_s *aq_nic)
|
|
{
|
|
int err = 0;
|
|
|
|
@@ -156,46 +156,29 @@ static struct aq_ring_s *aq_ring_alloc(struct aq_ring_s *self,
|
|
err_exit:
|
|
if (err < 0) {
|
|
aq_ring_free(self);
|
|
- self = NULL;
|
|
}
|
|
|
|
- return self;
|
|
+ return err;
|
|
}
|
|
|
|
-struct aq_ring_s *aq_ring_tx_alloc(struct aq_ring_s *self,
|
|
- struct aq_nic_s *aq_nic,
|
|
- unsigned int idx,
|
|
- struct aq_nic_cfg_s *aq_nic_cfg)
|
|
+int aq_ring_tx_alloc(struct aq_ring_s *self,
|
|
+ struct aq_nic_s *aq_nic,
|
|
+ unsigned int idx,
|
|
+ struct aq_nic_cfg_s *aq_nic_cfg)
|
|
{
|
|
- int err = 0;
|
|
-
|
|
self->aq_nic = aq_nic;
|
|
self->idx = idx;
|
|
self->size = aq_nic_cfg->txds;
|
|
self->dx_size = aq_nic_cfg->aq_hw_caps->txd_size;
|
|
|
|
- self = aq_ring_alloc(self, aq_nic);
|
|
- if (!self) {
|
|
- err = -ENOMEM;
|
|
- goto err_exit;
|
|
- }
|
|
-
|
|
-err_exit:
|
|
- if (err < 0) {
|
|
- aq_ring_free(self);
|
|
- self = NULL;
|
|
- }
|
|
-
|
|
- return self;
|
|
+ return aq_ring_alloc(self, aq_nic);
|
|
}
|
|
|
|
-struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
|
|
- struct aq_nic_s *aq_nic,
|
|
- unsigned int idx,
|
|
- struct aq_nic_cfg_s *aq_nic_cfg)
|
|
+int aq_ring_rx_alloc(struct aq_ring_s *self,
|
|
+ struct aq_nic_s *aq_nic,
|
|
+ unsigned int idx,
|
|
+ struct aq_nic_cfg_s *aq_nic_cfg)
|
|
{
|
|
- int err = 0;
|
|
-
|
|
self->aq_nic = aq_nic;
|
|
self->idx = idx;
|
|
self->size = aq_nic_cfg->rxds;
|
|
@@ -217,22 +200,10 @@ struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
|
|
self->tail_size = 0;
|
|
}
|
|
|
|
- self = aq_ring_alloc(self, aq_nic);
|
|
- if (!self) {
|
|
- err = -ENOMEM;
|
|
- goto err_exit;
|
|
- }
|
|
-
|
|
-err_exit:
|
|
- if (err < 0) {
|
|
- aq_ring_free(self);
|
|
- self = NULL;
|
|
- }
|
|
-
|
|
- return self;
|
|
+ return aq_ring_alloc(self, aq_nic);
|
|
}
|
|
|
|
-struct aq_ring_s *
|
|
+int
|
|
aq_ring_hwts_rx_alloc(struct aq_ring_s *self, struct aq_nic_s *aq_nic,
|
|
unsigned int idx, unsigned int size, unsigned int dx_size)
|
|
{
|
|
@@ -250,10 +221,10 @@ aq_ring_hwts_rx_alloc(struct aq_ring_s *self, struct aq_nic_s *aq_nic,
|
|
GFP_KERNEL);
|
|
if (!self->dx_ring) {
|
|
aq_ring_free(self);
|
|
- return NULL;
|
|
+ return -ENOMEM;
|
|
}
|
|
|
|
- return self;
|
|
+ return 0;
|
|
}
|
|
|
|
int aq_ring_init(struct aq_ring_s *self, const enum atl_ring_type ring_type)
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
|
|
index 0a6c34438c1d0..52847310740a2 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
|
|
@@ -183,14 +183,14 @@ static inline unsigned int aq_ring_avail_dx(struct aq_ring_s *self)
|
|
self->sw_head - self->sw_tail - 1);
|
|
}
|
|
|
|
-struct aq_ring_s *aq_ring_tx_alloc(struct aq_ring_s *self,
|
|
- struct aq_nic_s *aq_nic,
|
|
- unsigned int idx,
|
|
- struct aq_nic_cfg_s *aq_nic_cfg);
|
|
-struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
|
|
- struct aq_nic_s *aq_nic,
|
|
- unsigned int idx,
|
|
- struct aq_nic_cfg_s *aq_nic_cfg);
|
|
+int aq_ring_tx_alloc(struct aq_ring_s *self,
|
|
+ struct aq_nic_s *aq_nic,
|
|
+ unsigned int idx,
|
|
+ struct aq_nic_cfg_s *aq_nic_cfg);
|
|
+int aq_ring_rx_alloc(struct aq_ring_s *self,
|
|
+ struct aq_nic_s *aq_nic,
|
|
+ unsigned int idx,
|
|
+ struct aq_nic_cfg_s *aq_nic_cfg);
|
|
|
|
int aq_ring_init(struct aq_ring_s *self, const enum atl_ring_type ring_type);
|
|
void aq_ring_rx_deinit(struct aq_ring_s *self);
|
|
@@ -207,9 +207,9 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
|
|
int budget);
|
|
int aq_ring_rx_fill(struct aq_ring_s *self);
|
|
|
|
-struct aq_ring_s *aq_ring_hwts_rx_alloc(struct aq_ring_s *self,
|
|
- struct aq_nic_s *aq_nic, unsigned int idx,
|
|
- unsigned int size, unsigned int dx_size);
|
|
+int aq_ring_hwts_rx_alloc(struct aq_ring_s *self,
|
|
+ struct aq_nic_s *aq_nic, unsigned int idx,
|
|
+ unsigned int size, unsigned int dx_size);
|
|
void aq_ring_hwts_rx_clean(struct aq_ring_s *self, struct aq_nic_s *aq_nic);
|
|
|
|
unsigned int aq_ring_fill_stats_data(struct aq_ring_s *self, u64 *data);
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
|
|
index f5db1c44e9b91..9769ab4f9bef0 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
|
|
@@ -136,35 +136,32 @@ int aq_vec_ring_alloc(struct aq_vec_s *self, struct aq_nic_s *aq_nic,
|
|
const unsigned int idx_ring = AQ_NIC_CFG_TCVEC2RING(aq_nic_cfg,
|
|
i, idx);
|
|
|
|
- ring = aq_ring_tx_alloc(&self->ring[i][AQ_VEC_TX_ID], aq_nic,
|
|
- idx_ring, aq_nic_cfg);
|
|
- if (!ring) {
|
|
- err = -ENOMEM;
|
|
+ ring = &self->ring[i][AQ_VEC_TX_ID];
|
|
+ err = aq_ring_tx_alloc(ring, aq_nic, idx_ring, aq_nic_cfg);
|
|
+ if (err)
|
|
goto err_exit;
|
|
- }
|
|
|
|
++self->tx_rings;
|
|
|
|
aq_nic_set_tx_ring(aq_nic, idx_ring, ring);
|
|
|
|
- if (xdp_rxq_info_reg(&self->ring[i][AQ_VEC_RX_ID].xdp_rxq,
|
|
+ ring = &self->ring[i][AQ_VEC_RX_ID];
|
|
+ if (xdp_rxq_info_reg(&ring->xdp_rxq,
|
|
aq_nic->ndev, idx,
|
|
self->napi.napi_id) < 0) {
|
|
err = -ENOMEM;
|
|
goto err_exit;
|
|
}
|
|
- if (xdp_rxq_info_reg_mem_model(&self->ring[i][AQ_VEC_RX_ID].xdp_rxq,
|
|
+ if (xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
|
|
MEM_TYPE_PAGE_SHARED, NULL) < 0) {
|
|
- xdp_rxq_info_unreg(&self->ring[i][AQ_VEC_RX_ID].xdp_rxq);
|
|
+ xdp_rxq_info_unreg(&ring->xdp_rxq);
|
|
err = -ENOMEM;
|
|
goto err_exit;
|
|
}
|
|
|
|
- ring = aq_ring_rx_alloc(&self->ring[i][AQ_VEC_RX_ID], aq_nic,
|
|
- idx_ring, aq_nic_cfg);
|
|
- if (!ring) {
|
|
- xdp_rxq_info_unreg(&self->ring[i][AQ_VEC_RX_ID].xdp_rxq);
|
|
- err = -ENOMEM;
|
|
+ err = aq_ring_rx_alloc(ring, aq_nic, idx_ring, aq_nic_cfg);
|
|
+ if (err) {
|
|
+ xdp_rxq_info_unreg(&ring->xdp_rxq);
|
|
goto err_exit;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/google/gve/gve_tx_dqo.c b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
|
|
index 588d64819ed5e..e84e944d751d2 100644
|
|
--- a/drivers/net/ethernet/google/gve/gve_tx_dqo.c
|
|
+++ b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
|
|
@@ -350,6 +350,7 @@ static void gve_tx_fill_pkt_desc_dqo(struct gve_tx_ring *tx, u32 *desc_idx,
|
|
/* Validates and prepares `skb` for TSO.
|
|
*
|
|
* Returns header length, or < 0 if invalid.
|
|
+ * Warning : Might change skb->head (and thus skb_shinfo).
|
|
*/
|
|
static int gve_prep_tso(struct sk_buff *skb)
|
|
{
|
|
@@ -451,8 +452,8 @@ gve_tx_fill_general_ctx_desc(struct gve_tx_general_context_desc_dqo *desc,
|
|
static int gve_tx_add_skb_no_copy_dqo(struct gve_tx_ring *tx,
|
|
struct sk_buff *skb)
|
|
{
|
|
- const struct skb_shared_info *shinfo = skb_shinfo(skb);
|
|
const bool is_gso = skb_is_gso(skb);
|
|
+ struct skb_shared_info *shinfo;
|
|
u32 desc_idx = tx->dqo_tx.tail;
|
|
|
|
struct gve_tx_pending_packet_dqo *pkt;
|
|
@@ -477,6 +478,8 @@ static int gve_tx_add_skb_no_copy_dqo(struct gve_tx_ring *tx,
|
|
desc_idx = (desc_idx + 1) & tx->mask;
|
|
}
|
|
|
|
+ /* Must get after gve_prep_tso(), which can change shinfo. */
|
|
+ shinfo = skb_shinfo(skb);
|
|
gve_tx_fill_general_ctx_desc(&tx->dqo.tx_ring[desc_idx].general_ctx,
|
|
&metadata);
|
|
desc_idx = (desc_idx + 1) & tx->mask;
|
|
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
|
|
index c7d761426d6ce..3d3db58090ed1 100644
|
|
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
|
|
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
|
|
@@ -2603,6 +2603,14 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg)
|
|
int aq_ret = 0;
|
|
int i;
|
|
|
|
+ if (vf->is_disabled_from_host) {
|
|
+ aq_ret = -EPERM;
|
|
+ dev_info(&pf->pdev->dev,
|
|
+ "Admin has disabled VF %d, will not enable queues\n",
|
|
+ vf->vf_id);
|
|
+ goto error_param;
|
|
+ }
|
|
+
|
|
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
|
aq_ret = I40E_ERR_PARAM;
|
|
goto error_param;
|
|
@@ -4656,9 +4664,12 @@ int i40e_ndo_set_vf_link_state(struct net_device *netdev, int vf_id, int link)
|
|
struct i40e_link_status *ls = &pf->hw.phy.link_info;
|
|
struct virtchnl_pf_event pfe;
|
|
struct i40e_hw *hw = &pf->hw;
|
|
+ struct i40e_vsi *vsi;
|
|
+ unsigned long q_map;
|
|
struct i40e_vf *vf;
|
|
int abs_vf_id;
|
|
int ret = 0;
|
|
+ int tmp;
|
|
|
|
if (test_and_set_bit(__I40E_VIRTCHNL_OP_PENDING, pf->state)) {
|
|
dev_warn(&pf->pdev->dev, "Unable to configure VFs, other operation is pending.\n");
|
|
@@ -4681,17 +4692,38 @@ int i40e_ndo_set_vf_link_state(struct net_device *netdev, int vf_id, int link)
|
|
switch (link) {
|
|
case IFLA_VF_LINK_STATE_AUTO:
|
|
vf->link_forced = false;
|
|
+ vf->is_disabled_from_host = false;
|
|
+ /* reset needed to reinit VF resources */
|
|
+ i40e_vc_reset_vf(vf, true);
|
|
i40e_set_vf_link_state(vf, &pfe, ls);
|
|
break;
|
|
case IFLA_VF_LINK_STATE_ENABLE:
|
|
vf->link_forced = true;
|
|
vf->link_up = true;
|
|
+ vf->is_disabled_from_host = false;
|
|
+ /* reset needed to reinit VF resources */
|
|
+ i40e_vc_reset_vf(vf, true);
|
|
i40e_set_vf_link_state(vf, &pfe, ls);
|
|
break;
|
|
case IFLA_VF_LINK_STATE_DISABLE:
|
|
vf->link_forced = true;
|
|
vf->link_up = false;
|
|
i40e_set_vf_link_state(vf, &pfe, ls);
|
|
+
|
|
+ vsi = pf->vsi[vf->lan_vsi_idx];
|
|
+ q_map = BIT(vsi->num_queue_pairs) - 1;
|
|
+
|
|
+ vf->is_disabled_from_host = true;
|
|
+
|
|
+ /* Try to stop both Tx&Rx rings even if one of the calls fails
|
|
+ * to ensure we stop the rings even in case of errors.
|
|
+ * If any of them returns with an error then the first
|
|
+ * error that occurred will be returned.
|
|
+ */
|
|
+ tmp = i40e_ctrl_vf_tx_rings(vsi, q_map, false);
|
|
+ ret = i40e_ctrl_vf_rx_rings(vsi, q_map, false);
|
|
+
|
|
+ ret = tmp ? tmp : ret;
|
|
break;
|
|
default:
|
|
ret = -EINVAL;
|
|
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
|
|
index bd497cc5303a1..97e9c34d7c6cd 100644
|
|
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
|
|
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
|
|
@@ -98,6 +98,7 @@ struct i40e_vf {
|
|
bool link_forced;
|
|
bool link_up; /* only valid if VF link is forced */
|
|
bool spoofchk;
|
|
+ bool is_disabled_from_host; /* PF ctrl of VF enable/disable */
|
|
u16 num_vlan;
|
|
|
|
/* ADq related variables */
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
|
|
index 1bdc70aa979dc..fe48164dce1e1 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
|
|
@@ -413,10 +413,10 @@ struct ice_aqc_vsi_props {
|
|
#define ICE_AQ_VSI_INNER_VLAN_INSERT_PVID BIT(2)
|
|
#define ICE_AQ_VSI_INNER_VLAN_EMODE_S 3
|
|
#define ICE_AQ_VSI_INNER_VLAN_EMODE_M (0x3 << ICE_AQ_VSI_INNER_VLAN_EMODE_S)
|
|
-#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH (0x0 << ICE_AQ_VSI_INNER_VLAN_EMODE_S)
|
|
-#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_UP (0x1 << ICE_AQ_VSI_INNER_VLAN_EMODE_S)
|
|
-#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR (0x2 << ICE_AQ_VSI_INNER_VLAN_EMODE_S)
|
|
-#define ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING (0x3 << ICE_AQ_VSI_INNER_VLAN_EMODE_S)
|
|
+#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH 0x0U
|
|
+#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_UP 0x1U
|
|
+#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR 0x2U
|
|
+#define ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING 0x3U
|
|
u8 inner_vlan_reserved2[3];
|
|
/* ingress egress up sections */
|
|
__le32 ingress_table; /* bitmap, 3 bits per up */
|
|
@@ -482,11 +482,11 @@ struct ice_aqc_vsi_props {
|
|
#define ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_S 2
|
|
#define ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_M (0xF << ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_S)
|
|
#define ICE_AQ_VSI_Q_OPT_RSS_HASH_S 6
|
|
-#define ICE_AQ_VSI_Q_OPT_RSS_HASH_M (0x3 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S)
|
|
-#define ICE_AQ_VSI_Q_OPT_RSS_TPLZ (0x0 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S)
|
|
-#define ICE_AQ_VSI_Q_OPT_RSS_SYM_TPLZ (0x1 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S)
|
|
-#define ICE_AQ_VSI_Q_OPT_RSS_XOR (0x2 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S)
|
|
-#define ICE_AQ_VSI_Q_OPT_RSS_JHASH (0x3 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S)
|
|
+#define ICE_AQ_VSI_Q_OPT_RSS_HASH_M GENMASK(7, 6)
|
|
+#define ICE_AQ_VSI_Q_OPT_RSS_HASH_TPLZ 0x0U
|
|
+#define ICE_AQ_VSI_Q_OPT_RSS_HASH_SYM_TPLZ 0x1U
|
|
+#define ICE_AQ_VSI_Q_OPT_RSS_HASH_XOR 0x2U
|
|
+#define ICE_AQ_VSI_Q_OPT_RSS_HASH_JHASH 0x3U
|
|
u8 q_opt_tc;
|
|
#define ICE_AQ_VSI_Q_OPT_TC_OVR_S 0
|
|
#define ICE_AQ_VSI_Q_OPT_TC_OVR_M (0x1F << ICE_AQ_VSI_Q_OPT_TC_OVR_S)
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
|
|
index c051503c3a892..cc6c04a69b285 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_lib.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_lib.c
|
|
@@ -878,7 +878,8 @@ static void ice_set_dflt_vsi_ctx(struct ice_hw *hw, struct ice_vsi_ctx *ctxt)
|
|
*/
|
|
if (ice_is_dvm_ena(hw)) {
|
|
ctxt->info.inner_vlan_flags |=
|
|
- ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING;
|
|
+ FIELD_PREP(ICE_AQ_VSI_INNER_VLAN_EMODE_M,
|
|
+ ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING);
|
|
ctxt->info.outer_vlan_flags =
|
|
(ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ALL <<
|
|
ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S) &
|
|
@@ -1085,12 +1086,12 @@ static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctxt, struct ice_vsi *vsi)
|
|
case ICE_VSI_PF:
|
|
/* PF VSI will inherit RSS instance of PF */
|
|
lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_PF;
|
|
- hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
|
|
+ hash_type = ICE_AQ_VSI_Q_OPT_RSS_HASH_TPLZ;
|
|
break;
|
|
case ICE_VSI_VF:
|
|
/* VF VSI will gets a small RSS table which is a VSI LUT type */
|
|
lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI;
|
|
- hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
|
|
+ hash_type = ICE_AQ_VSI_Q_OPT_RSS_HASH_TPLZ;
|
|
break;
|
|
default:
|
|
dev_dbg(dev, "Unsupported VSI type %s\n",
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c
|
|
index 2b4c791b6cbad..6c03ebf81ffda 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c
|
|
@@ -817,8 +817,8 @@ static int ice_vc_handle_rss_cfg(struct ice_vf *vf, u8 *msg, bool add)
|
|
int status;
|
|
|
|
lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI;
|
|
- hash_type = add ? ICE_AQ_VSI_Q_OPT_RSS_XOR :
|
|
- ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
|
|
+ hash_type = add ? ICE_AQ_VSI_Q_OPT_RSS_HASH_XOR :
|
|
+ ICE_AQ_VSI_Q_OPT_RSS_HASH_TPLZ;
|
|
|
|
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
|
if (!ctx) {
|
|
@@ -826,11 +826,9 @@ static int ice_vc_handle_rss_cfg(struct ice_vf *vf, u8 *msg, bool add)
|
|
goto error_param;
|
|
}
|
|
|
|
- ctx->info.q_opt_rss = ((lut_type <<
|
|
- ICE_AQ_VSI_Q_OPT_RSS_LUT_S) &
|
|
- ICE_AQ_VSI_Q_OPT_RSS_LUT_M) |
|
|
- (hash_type &
|
|
- ICE_AQ_VSI_Q_OPT_RSS_HASH_M);
|
|
+ ctx->info.q_opt_rss =
|
|
+ FIELD_PREP(ICE_AQ_VSI_Q_OPT_RSS_LUT_M, lut_type) |
|
|
+ FIELD_PREP(ICE_AQ_VSI_Q_OPT_RSS_HASH_M, hash_type);
|
|
|
|
/* Preserve existing queueing option setting */
|
|
ctx->info.q_opt_rss |= (vsi->info.q_opt_rss &
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c b/drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c
|
|
index 5b4a0abb46077..239266e9d5f12 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c
|
|
@@ -131,6 +131,7 @@ static int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena)
|
|
{
|
|
struct ice_hw *hw = &vsi->back->hw;
|
|
struct ice_vsi_ctx *ctxt;
|
|
+ u8 *ivf;
|
|
int err;
|
|
|
|
/* do not allow modifying VLAN stripping when a port VLAN is configured
|
|
@@ -143,19 +144,24 @@ static int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena)
|
|
if (!ctxt)
|
|
return -ENOMEM;
|
|
|
|
+ ivf = &ctxt->info.inner_vlan_flags;
|
|
+
|
|
/* Here we are configuring what the VSI should do with the VLAN tag in
|
|
* the Rx packet. We can either leave the tag in the packet or put it in
|
|
* the Rx descriptor.
|
|
*/
|
|
- if (ena)
|
|
+ if (ena) {
|
|
/* Strip VLAN tag from Rx packet and put it in the desc */
|
|
- ctxt->info.inner_vlan_flags = ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH;
|
|
- else
|
|
+ *ivf = FIELD_PREP(ICE_AQ_VSI_INNER_VLAN_EMODE_M,
|
|
+ ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH);
|
|
+ } else {
|
|
/* Disable stripping. Leave tag in packet */
|
|
- ctxt->info.inner_vlan_flags = ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING;
|
|
+ *ivf = FIELD_PREP(ICE_AQ_VSI_INNER_VLAN_EMODE_M,
|
|
+ ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING);
|
|
+ }
|
|
|
|
/* Allow all packets untagged/tagged */
|
|
- ctxt->info.inner_vlan_flags |= ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL;
|
|
+ *ivf |= ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL;
|
|
|
|
ctxt->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_VLAN_VALID);
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
|
|
index 100388968e4db..3d56481e16bc9 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
|
|
@@ -123,14 +123,14 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
|
|
if (ret_val)
|
|
return ret_val;
|
|
if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
/* Check to see if SFP+ module is supported */
|
|
ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
|
|
&list_offset,
|
|
&data_offset);
|
|
if (ret_val)
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
break;
|
|
default:
|
|
break;
|
|
@@ -213,7 +213,7 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
|
|
break;
|
|
|
|
default:
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -283,7 +283,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
|
|
|
/* Validate the water mark configuration */
|
|
if (!hw->fc.pause_time)
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
|
|
/* Low water mark of zero causes XOFF floods */
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
@@ -292,7 +292,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
|
if (!hw->fc.low_water[i] ||
|
|
hw->fc.low_water[i] >= hw->fc.high_water[i]) {
|
|
hw_dbg(hw, "Invalid water mark configuration\n");
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
}
|
|
}
|
|
@@ -369,7 +369,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
|
break;
|
|
default:
|
|
hw_dbg(hw, "Flow control param set incorrectly\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Set 802.3x based flow control settings. */
|
|
@@ -438,7 +438,7 @@ static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
|
|
msleep(100);
|
|
}
|
|
if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
|
|
- status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Autonegotiation did not complete.\n");
|
|
}
|
|
}
|
|
@@ -478,7 +478,7 @@ static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
|
|
|
|
if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
|
|
hw_dbg(hw, "Link was indicated but link is down\n");
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -594,7 +594,7 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
|
|
speed &= link_capabilities;
|
|
|
|
if (speed == IXGBE_LINK_SPEED_UNKNOWN)
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EINVAL;
|
|
|
|
/* Set KX4/KX support according to speed requested */
|
|
else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
|
|
@@ -701,9 +701,9 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|
|
|
/* Init PHY and function pointers, perform SFP setup */
|
|
phy_status = hw->phy.ops.init(hw);
|
|
- if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
+ if (phy_status == -EOPNOTSUPP)
|
|
return phy_status;
|
|
- if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
|
|
+ if (phy_status == -ENOENT)
|
|
goto mac_reset_top;
|
|
|
|
hw->phy.ops.reset(hw);
|
|
@@ -727,7 +727,7 @@ mac_reset_top:
|
|
udelay(1);
|
|
}
|
|
if (ctrl & IXGBE_CTRL_RST) {
|
|
- status = IXGBE_ERR_RESET_FAILED;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Reset polling failed to complete.\n");
|
|
}
|
|
|
|
@@ -789,7 +789,7 @@ static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|
/* Make sure we are using a valid rar index range */
|
|
if (rar >= rar_entries) {
|
|
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
|
|
@@ -814,7 +814,7 @@ static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|
/* Make sure we are using a valid rar index range */
|
|
if (rar >= rar_entries) {
|
|
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
|
|
@@ -845,7 +845,7 @@ static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
|
|
u32 vftabyte;
|
|
|
|
if (vlan > 4095)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* Determine 32-bit word position in array */
|
|
regindex = (vlan >> 5) & 0x7F; /* upper seven bits */
|
|
@@ -964,7 +964,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
|
|
gssr = IXGBE_GSSR_PHY0_SM;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != 0)
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
if (hw->phy.type == ixgbe_phy_nl) {
|
|
/*
|
|
@@ -993,7 +993,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
|
|
|
|
if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) {
|
|
hw_dbg(hw, "EEPROM read did not pass.\n");
|
|
- status = IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ status = -ENOENT;
|
|
goto out;
|
|
}
|
|
|
|
@@ -1003,7 +1003,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
|
|
|
|
*eeprom_data = (u8)(sfp_data >> 8);
|
|
} else {
|
|
- status = IXGBE_ERR_PHY;
|
|
+ status = -EIO;
|
|
}
|
|
|
|
out:
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
|
|
index 58ea959a44822..339e106a5732d 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
|
|
@@ -117,7 +117,7 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
|
|
ret_val = hw->mac.ops.acquire_swfw_sync(hw,
|
|
IXGBE_GSSR_MAC_CSR_SM);
|
|
if (ret_val)
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
if (hw->eeprom.ops.read(hw, ++data_offset, &data_value))
|
|
goto setup_sfp_err;
|
|
@@ -144,7 +144,7 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
|
|
|
|
if (ret_val) {
|
|
hw_dbg(hw, " sfp module setup not complete\n");
|
|
- return IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
|
|
+ return -EIO;
|
|
}
|
|
}
|
|
|
|
@@ -159,7 +159,7 @@ setup_sfp_err:
|
|
usleep_range(hw->eeprom.semaphore_delay * 1000,
|
|
hw->eeprom.semaphore_delay * 2000);
|
|
hw_err(hw, "eeprom read at offset %d failed\n", data_offset);
|
|
- return IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -184,7 +184,7 @@ static s32 prot_autoc_read_82599(struct ixgbe_hw *hw, bool *locked,
|
|
ret_val = hw->mac.ops.acquire_swfw_sync(hw,
|
|
IXGBE_GSSR_MAC_CSR_SM);
|
|
if (ret_val)
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
*locked = true;
|
|
}
|
|
@@ -219,7 +219,7 @@ static s32 prot_autoc_write_82599(struct ixgbe_hw *hw, u32 autoc, bool locked)
|
|
ret_val = hw->mac.ops.acquire_swfw_sync(hw,
|
|
IXGBE_GSSR_MAC_CSR_SM);
|
|
if (ret_val)
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
locked = true;
|
|
}
|
|
@@ -400,7 +400,7 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
|
|
break;
|
|
|
|
default:
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EIO;
|
|
}
|
|
|
|
if (hw->phy.multispeed_fiber) {
|
|
@@ -541,7 +541,7 @@ static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
|
|
msleep(100);
|
|
}
|
|
if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
|
|
- status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Autoneg did not complete.\n");
|
|
}
|
|
}
|
|
@@ -794,7 +794,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
|
speed &= link_capabilities;
|
|
|
|
if (speed == IXGBE_LINK_SPEED_UNKNOWN)
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EINVAL;
|
|
|
|
/* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/
|
|
if (hw->mac.orig_link_settings_stored)
|
|
@@ -861,8 +861,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
|
msleep(100);
|
|
}
|
|
if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
|
|
- status =
|
|
- IXGBE_ERR_AUTONEG_NOT_COMPLETE;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Autoneg did not complete.\n");
|
|
}
|
|
}
|
|
@@ -927,7 +926,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|
/* Identify PHY and related function pointers */
|
|
status = hw->phy.ops.init(hw);
|
|
|
|
- if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
+ if (status == -EOPNOTSUPP)
|
|
return status;
|
|
|
|
/* Setup SFP module if there is one present. */
|
|
@@ -936,7 +935,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|
hw->phy.sfp_setup_needed = false;
|
|
}
|
|
|
|
- if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
+ if (status == -EOPNOTSUPP)
|
|
return status;
|
|
|
|
/* Reset PHY */
|
|
@@ -974,7 +973,7 @@ mac_reset_top:
|
|
}
|
|
|
|
if (ctrl & IXGBE_CTRL_RST_MASK) {
|
|
- status = IXGBE_ERR_RESET_FAILED;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Reset polling failed to complete.\n");
|
|
}
|
|
|
|
@@ -1093,7 +1092,7 @@ static s32 ixgbe_fdir_check_cmd_complete(struct ixgbe_hw *hw, u32 *fdircmd)
|
|
udelay(10);
|
|
}
|
|
|
|
- return IXGBE_ERR_FDIR_CMD_INCOMPLETE;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -1155,7 +1154,7 @@ s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw)
|
|
}
|
|
if (i >= IXGBE_FDIR_INIT_DONE_POLL) {
|
|
hw_dbg(hw, "Flow Director Signature poll time exceeded!\n");
|
|
- return IXGBE_ERR_FDIR_REINIT_FAILED;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Clear FDIR statistics registers (read to clear) */
|
|
@@ -1387,7 +1386,7 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw,
|
|
break;
|
|
default:
|
|
hw_dbg(hw, " Error on flow type input\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* configure FDIRCMD register */
|
|
@@ -1546,7 +1545,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
|
|
break;
|
|
default:
|
|
hw_dbg(hw, " Error on vm pool mask\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
switch (input_mask->formatted.flow_type & IXGBE_ATR_L4TYPE_MASK) {
|
|
@@ -1555,14 +1554,14 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
|
|
if (input_mask->formatted.dst_port ||
|
|
input_mask->formatted.src_port) {
|
|
hw_dbg(hw, " Error on src/dst port mask\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
break;
|
|
case IXGBE_ATR_L4TYPE_MASK:
|
|
break;
|
|
default:
|
|
hw_dbg(hw, " Error on flow type mask\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
switch (ntohs(input_mask->formatted.vlan_id) & 0xEFFF) {
|
|
@@ -1583,7 +1582,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
|
|
break;
|
|
default:
|
|
hw_dbg(hw, " Error on VLAN mask\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
switch ((__force u16)input_mask->formatted.flex_bytes & 0xFFFF) {
|
|
@@ -1595,7 +1594,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
|
|
break;
|
|
default:
|
|
hw_dbg(hw, " Error on flexible byte mask\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Now mask VM pool and destination IPv6 - bits 5 and 2 */
|
|
@@ -1824,7 +1823,7 @@ static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
|
|
|
|
/* Return error if SFP module has been detected but is not supported */
|
|
if (hw->phy.type == ixgbe_phy_sfp_unsupported)
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
return status;
|
|
}
|
|
@@ -1863,13 +1862,13 @@ static s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval)
|
|
* Verifies that installed the firmware version is 0.6 or higher
|
|
* for SFI devices. All 82599 SFI devices should have version 0.6 or higher.
|
|
*
|
|
- * Returns IXGBE_ERR_EEPROM_VERSION if the FW is not present or
|
|
- * if the FW version is not supported.
|
|
+ * Return: -EACCES if the FW is not present or if the FW version is
|
|
+ * not supported.
|
|
**/
|
|
static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
|
|
{
|
|
- s32 status = IXGBE_ERR_EEPROM_VERSION;
|
|
u16 fw_offset, fw_ptp_cfg_offset;
|
|
+ s32 status = -EACCES;
|
|
u16 offset;
|
|
u16 fw_version = 0;
|
|
|
|
@@ -1883,7 +1882,7 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
|
|
goto fw_version_err;
|
|
|
|
if (fw_offset == 0 || fw_offset == 0xFFFF)
|
|
- return IXGBE_ERR_EEPROM_VERSION;
|
|
+ return -EACCES;
|
|
|
|
/* get the offset to the Pass Through Patch Configuration block */
|
|
offset = fw_offset + IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR;
|
|
@@ -1891,7 +1890,7 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
|
|
goto fw_version_err;
|
|
|
|
if (fw_ptp_cfg_offset == 0 || fw_ptp_cfg_offset == 0xFFFF)
|
|
- return IXGBE_ERR_EEPROM_VERSION;
|
|
+ return -EACCES;
|
|
|
|
/* get the firmware version */
|
|
offset = fw_ptp_cfg_offset + IXGBE_FW_PATCH_VERSION_4;
|
|
@@ -1905,7 +1904,7 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
|
|
|
|
fw_version_err:
|
|
hw_err(hw, "eeprom read at offset %d failed\n", offset);
|
|
- return IXGBE_ERR_EEPROM_VERSION;
|
|
+ return -EACCES;
|
|
}
|
|
|
|
/**
|
|
@@ -2038,7 +2037,7 @@ static s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw)
|
|
|
|
if (!(anlp1_reg & IXGBE_ANLP1_AN_STATE_MASK)) {
|
|
hw_dbg(hw, "auto negotiation not completed\n");
|
|
- ret_val = IXGBE_ERR_RESET_FAILED;
|
|
+ ret_val = -EIO;
|
|
goto reset_pipeline_out;
|
|
}
|
|
|
|
@@ -2087,7 +2086,7 @@ static s32 ixgbe_read_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
|
|
|
|
if (!timeout) {
|
|
hw_dbg(hw, "Driver can't access resource, acquiring I2C bus timeout.\n");
|
|
- status = IXGBE_ERR_I2C;
|
|
+ status = -EIO;
|
|
goto release_i2c_access;
|
|
}
|
|
}
|
|
@@ -2141,7 +2140,7 @@ static s32 ixgbe_write_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
|
|
|
|
if (!timeout) {
|
|
hw_dbg(hw, "Driver can't access resource, acquiring I2C bus timeout.\n");
|
|
- status = IXGBE_ERR_I2C;
|
|
+ status = -EIO;
|
|
goto release_i2c_access;
|
|
}
|
|
}
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
|
|
index 38c4609bd4292..5688a6ad4b3b2 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
|
|
@@ -124,7 +124,7 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw)
|
|
*/
|
|
if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
|
|
hw_dbg(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
/*
|
|
@@ -215,7 +215,7 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw)
|
|
break;
|
|
default:
|
|
hw_dbg(hw, "Flow control param set incorrectly\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
if (hw->mac.type != ixgbe_mac_X540) {
|
|
@@ -500,7 +500,7 @@ s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,
|
|
|
|
if (pba_num == NULL) {
|
|
hw_dbg(hw, "PBA string buffer was null\n");
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
ret_val = hw->eeprom.ops.read(hw, IXGBE_PBANUM0_PTR, &data);
|
|
@@ -526,7 +526,7 @@ s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,
|
|
/* we will need 11 characters to store the PBA */
|
|
if (pba_num_size < 11) {
|
|
hw_dbg(hw, "PBA string buffer too small\n");
|
|
- return IXGBE_ERR_NO_SPACE;
|
|
+ return -ENOSPC;
|
|
}
|
|
|
|
/* extract hex string from data and pba_ptr */
|
|
@@ -563,13 +563,13 @@ s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,
|
|
|
|
if (length == 0xFFFF || length == 0) {
|
|
hw_dbg(hw, "NVM PBA number section invalid length\n");
|
|
- return IXGBE_ERR_PBA_SECTION;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* check if pba_num buffer is big enough */
|
|
if (pba_num_size < (((u32)length * 2) - 1)) {
|
|
hw_dbg(hw, "PBA string buffer too small\n");
|
|
- return IXGBE_ERR_NO_SPACE;
|
|
+ return -ENOSPC;
|
|
}
|
|
|
|
/* trim pba length from start of string */
|
|
@@ -805,7 +805,7 @@ s32 ixgbe_led_on_generic(struct ixgbe_hw *hw, u32 index)
|
|
u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
|
|
|
|
if (index > 3)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* To turn on the LED, set mode to ON. */
|
|
led_reg &= ~IXGBE_LED_MODE_MASK(index);
|
|
@@ -826,7 +826,7 @@ s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index)
|
|
u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
|
|
|
|
if (index > 3)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* To turn off the LED, set mode to OFF. */
|
|
led_reg &= ~IXGBE_LED_MODE_MASK(index);
|
|
@@ -904,11 +904,8 @@ s32 ixgbe_write_eeprom_buffer_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
|
|
|
|
hw->eeprom.ops.init_params(hw);
|
|
|
|
- if (words == 0)
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
-
|
|
- if (offset + words > hw->eeprom.word_size)
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ if (words == 0 || (offset + words > hw->eeprom.word_size))
|
|
+ return -EINVAL;
|
|
|
|
/*
|
|
* The EEPROM page size cannot be queried from the chip. We do lazy
|
|
@@ -962,7 +959,7 @@ static s32 ixgbe_write_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset,
|
|
|
|
if (ixgbe_ready_eeprom(hw) != 0) {
|
|
ixgbe_release_eeprom(hw);
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
for (i = 0; i < words; i++) {
|
|
@@ -1028,7 +1025,7 @@ s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data)
|
|
hw->eeprom.ops.init_params(hw);
|
|
|
|
if (offset >= hw->eeprom.word_size)
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EINVAL;
|
|
|
|
return ixgbe_write_eeprom_buffer_bit_bang(hw, offset, 1, &data);
|
|
}
|
|
@@ -1050,11 +1047,8 @@ s32 ixgbe_read_eeprom_buffer_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
|
|
|
|
hw->eeprom.ops.init_params(hw);
|
|
|
|
- if (words == 0)
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
-
|
|
- if (offset + words > hw->eeprom.word_size)
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ if (words == 0 || (offset + words > hw->eeprom.word_size))
|
|
+ return -EINVAL;
|
|
|
|
/*
|
|
* We cannot hold synchronization semaphores for too long
|
|
@@ -1099,7 +1093,7 @@ static s32 ixgbe_read_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset,
|
|
|
|
if (ixgbe_ready_eeprom(hw) != 0) {
|
|
ixgbe_release_eeprom(hw);
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
for (i = 0; i < words; i++) {
|
|
@@ -1142,7 +1136,7 @@ s32 ixgbe_read_eeprom_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
|
|
hw->eeprom.ops.init_params(hw);
|
|
|
|
if (offset >= hw->eeprom.word_size)
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EINVAL;
|
|
|
|
return ixgbe_read_eeprom_buffer_bit_bang(hw, offset, 1, data);
|
|
}
|
|
@@ -1165,11 +1159,8 @@ s32 ixgbe_read_eerd_buffer_generic(struct ixgbe_hw *hw, u16 offset,
|
|
|
|
hw->eeprom.ops.init_params(hw);
|
|
|
|
- if (words == 0)
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
-
|
|
- if (offset >= hw->eeprom.word_size)
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ if (words == 0 || offset >= hw->eeprom.word_size)
|
|
+ return -EINVAL;
|
|
|
|
for (i = 0; i < words; i++) {
|
|
eerd = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |
|
|
@@ -1262,11 +1253,8 @@ s32 ixgbe_write_eewr_buffer_generic(struct ixgbe_hw *hw, u16 offset,
|
|
|
|
hw->eeprom.ops.init_params(hw);
|
|
|
|
- if (words == 0)
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
-
|
|
- if (offset >= hw->eeprom.word_size)
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ if (words == 0 || offset >= hw->eeprom.word_size)
|
|
+ return -EINVAL;
|
|
|
|
for (i = 0; i < words; i++) {
|
|
eewr = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |
|
|
@@ -1328,7 +1316,7 @@ static s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg)
|
|
}
|
|
udelay(5);
|
|
}
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -1344,7 +1332,7 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
|
|
u32 i;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) != 0)
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
eec = IXGBE_READ_REG(hw, IXGBE_EEC(hw));
|
|
|
|
@@ -1366,7 +1354,7 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
|
|
hw_dbg(hw, "Could not acquire EEPROM grant\n");
|
|
|
|
hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Setup EEPROM for Read/Write */
|
|
@@ -1419,7 +1407,7 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
|
|
swsm = IXGBE_READ_REG(hw, IXGBE_SWSM(hw));
|
|
if (swsm & IXGBE_SWSM_SMBI) {
|
|
hw_dbg(hw, "Software semaphore SMBI between device drivers not granted.\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
}
|
|
|
|
@@ -1447,7 +1435,7 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
|
|
if (i >= timeout) {
|
|
hw_dbg(hw, "SWESMBI Software EEPROM semaphore not granted.\n");
|
|
ixgbe_release_eeprom_semaphore(hw);
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -1503,7 +1491,7 @@ static s32 ixgbe_ready_eeprom(struct ixgbe_hw *hw)
|
|
*/
|
|
if (i >= IXGBE_EEPROM_MAX_RETRY_SPI) {
|
|
hw_dbg(hw, "SPI EEPROM Status error\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -1715,7 +1703,7 @@ s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
|
|
for (i = IXGBE_PCIE_ANALOG_PTR; i < IXGBE_FW_PTR; i++) {
|
|
if (hw->eeprom.ops.read(hw, i, &pointer)) {
|
|
hw_dbg(hw, "EEPROM read failed\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* If the pointer seems invalid */
|
|
@@ -1724,7 +1712,7 @@ s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
|
|
|
|
if (hw->eeprom.ops.read(hw, pointer, &length)) {
|
|
hw_dbg(hw, "EEPROM read failed\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
if (length == 0xFFFF || length == 0)
|
|
@@ -1733,7 +1721,7 @@ s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
|
|
for (j = pointer + 1; j <= pointer + length; j++) {
|
|
if (hw->eeprom.ops.read(hw, j, &word)) {
|
|
hw_dbg(hw, "EEPROM read failed\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
checksum += word;
|
|
}
|
|
@@ -1786,7 +1774,7 @@ s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw,
|
|
* calculated checksum
|
|
*/
|
|
if (read_checksum != checksum)
|
|
- status = IXGBE_ERR_EEPROM_CHECKSUM;
|
|
+ status = -EIO;
|
|
|
|
/* If the user cares, return the calculated checksum */
|
|
if (checksum_val)
|
|
@@ -1845,7 +1833,7 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
|
|
/* Make sure we are using a valid rar index range */
|
|
if (index >= rar_entries) {
|
|
hw_dbg(hw, "RAR index %d is out of range.\n", index);
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
/* setup VMDq pool selection before this RAR gets enabled */
|
|
@@ -1897,7 +1885,7 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index)
|
|
/* Make sure we are using a valid rar index range */
|
|
if (index >= rar_entries) {
|
|
hw_dbg(hw, "RAR index %d is out of range.\n", index);
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
/*
|
|
@@ -2146,7 +2134,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
|
|
|
|
/* Validate the water mark configuration. */
|
|
if (!hw->fc.pause_time)
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
|
|
/* Low water mark of zero causes XOFF floods */
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
@@ -2155,7 +2143,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
|
|
if (!hw->fc.low_water[i] ||
|
|
hw->fc.low_water[i] >= hw->fc.high_water[i]) {
|
|
hw_dbg(hw, "Invalid water mark configuration\n");
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
}
|
|
}
|
|
@@ -2212,7 +2200,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
|
|
break;
|
|
default:
|
|
hw_dbg(hw, "Flow control param set incorrectly\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Set 802.3x based flow control settings. */
|
|
@@ -2269,7 +2257,7 @@ s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
|
|
u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm)
|
|
{
|
|
if ((!(adv_reg)) || (!(lp_reg)))
|
|
- return IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
+ return -EINVAL;
|
|
|
|
if ((adv_reg & adv_sym) && (lp_reg & lp_sym)) {
|
|
/*
|
|
@@ -2321,7 +2309,7 @@ static s32 ixgbe_fc_autoneg_fiber(struct ixgbe_hw *hw)
|
|
linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA);
|
|
if ((!!(linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) ||
|
|
(!!(linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1))
|
|
- return IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
+ return -EIO;
|
|
|
|
pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
|
|
pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP);
|
|
@@ -2353,12 +2341,12 @@ static s32 ixgbe_fc_autoneg_backplane(struct ixgbe_hw *hw)
|
|
*/
|
|
links = IXGBE_READ_REG(hw, IXGBE_LINKS);
|
|
if ((links & IXGBE_LINKS_KX_AN_COMP) == 0)
|
|
- return IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
+ return -EIO;
|
|
|
|
if (hw->mac.type == ixgbe_mac_82599EB) {
|
|
links2 = IXGBE_READ_REG(hw, IXGBE_LINKS2);
|
|
if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0)
|
|
- return IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
+ return -EIO;
|
|
}
|
|
/*
|
|
* Read the 10g AN autoc and LP ability registers and resolve
|
|
@@ -2407,8 +2395,8 @@ static s32 ixgbe_fc_autoneg_copper(struct ixgbe_hw *hw)
|
|
**/
|
|
void ixgbe_fc_autoneg(struct ixgbe_hw *hw)
|
|
{
|
|
- s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
ixgbe_link_speed speed;
|
|
+ s32 ret_val = -EIO;
|
|
bool link_up;
|
|
|
|
/*
|
|
@@ -2510,7 +2498,7 @@ static u32 ixgbe_pcie_timeout_poll(struct ixgbe_hw *hw)
|
|
* @hw: pointer to hardware structure
|
|
*
|
|
* Disables PCI-Express primary access and verifies there are no pending
|
|
- * requests. IXGBE_ERR_PRIMARY_REQUESTS_PENDING is returned if primary disable
|
|
+ * requests. -EALREADY is returned if primary disable
|
|
* bit hasn't caused the primary requests to be disabled, else 0
|
|
* is returned signifying primary requests disabled.
|
|
**/
|
|
@@ -2575,7 +2563,7 @@ gio_disable_fail:
|
|
}
|
|
|
|
hw_dbg(hw, "PCIe transaction pending bit also did not clear.\n");
|
|
- return IXGBE_ERR_PRIMARY_REQUESTS_PENDING;
|
|
+ return -EALREADY;
|
|
}
|
|
|
|
/**
|
|
@@ -2600,7 +2588,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u32 mask)
|
|
* SW_FW_SYNC bits (not just NVM)
|
|
*/
|
|
if (ixgbe_get_eeprom_semaphore(hw))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
gssr = IXGBE_READ_REG(hw, IXGBE_GSSR);
|
|
if (!(gssr & (fwmask | swmask))) {
|
|
@@ -2620,7 +2608,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u32 mask)
|
|
ixgbe_release_swfw_sync(hw, gssr & (fwmask | swmask));
|
|
|
|
usleep_range(5000, 10000);
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
/**
|
|
@@ -2757,7 +2745,7 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index)
|
|
s32 ret_val;
|
|
|
|
if (index > 3)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/*
|
|
* Link must be up to auto-blink the LEDs;
|
|
@@ -2803,7 +2791,7 @@ s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index)
|
|
s32 ret_val;
|
|
|
|
if (index > 3)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
ret_val = hw->mac.ops.prot_autoc_read(hw, &locked, &autoc_reg);
|
|
if (ret_val)
|
|
@@ -2963,7 +2951,7 @@ s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|
/* Make sure we are using a valid rar index range */
|
|
if (rar >= rar_entries) {
|
|
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
|
|
@@ -3014,7 +3002,7 @@ s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|
/* Make sure we are using a valid rar index range */
|
|
if (rar >= rar_entries) {
|
|
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
if (vmdq < 32) {
|
|
@@ -3091,7 +3079,7 @@ static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass)
|
|
* will simply bypass the VLVF if there are no entries present in the
|
|
* VLVF that contain our VLAN
|
|
*/
|
|
- first_empty_slot = vlvf_bypass ? IXGBE_ERR_NO_SPACE : 0;
|
|
+ first_empty_slot = vlvf_bypass ? -ENOSPC : 0;
|
|
|
|
/* add VLAN enable bit for comparison */
|
|
vlan |= IXGBE_VLVF_VIEN;
|
|
@@ -3115,7 +3103,7 @@ static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass)
|
|
if (!first_empty_slot)
|
|
hw_dbg(hw, "No space in VLVF.\n");
|
|
|
|
- return first_empty_slot ? : IXGBE_ERR_NO_SPACE;
|
|
+ return first_empty_slot ? : -ENOSPC;
|
|
}
|
|
|
|
/**
|
|
@@ -3135,7 +3123,7 @@ s32 ixgbe_set_vfta_generic(struct ixgbe_hw *hw, u32 vlan, u32 vind,
|
|
s32 vlvf_index;
|
|
|
|
if ((vlan > 4095) || (vind > 63))
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/*
|
|
* this is a 2 part operation - first the VFTA, then the
|
|
@@ -3596,7 +3584,8 @@ u8 ixgbe_calculate_checksum(u8 *buffer, u32 length)
|
|
*
|
|
* Communicates with the manageability block. On success return 0
|
|
* else returns semaphore error when encountering an error acquiring
|
|
- * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
|
|
+ * semaphore, -EINVAL when incorrect parameters passed or -EIO when
|
|
+ * command fails.
|
|
*
|
|
* This function assumes that the IXGBE_GSSR_SW_MNG_SM semaphore is held
|
|
* by the caller.
|
|
@@ -3609,7 +3598,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
|
|
|
|
if (!length || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
|
|
hw_dbg(hw, "Buffer length failure buffersize-%d.\n", length);
|
|
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
/* Set bit 9 of FWSTS clearing FW reset indication */
|
|
@@ -3620,13 +3609,13 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
|
|
hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
|
|
if (!(hicr & IXGBE_HICR_EN)) {
|
|
hw_dbg(hw, "IXGBE_HOST_EN bit disabled.\n");
|
|
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Calculate length in DWORDs. We must be DWORD aligned */
|
|
if (length % sizeof(u32)) {
|
|
hw_dbg(hw, "Buffer length failure, not aligned to dword");
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
dword_len = length >> 2;
|
|
@@ -3651,7 +3640,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
|
|
/* Check command successful completion. */
|
|
if ((timeout && i == timeout) ||
|
|
!(IXGBE_READ_REG(hw, IXGBE_HICR) & IXGBE_HICR_SV))
|
|
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ return -EIO;
|
|
|
|
return 0;
|
|
}
|
|
@@ -3671,7 +3660,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
|
|
* in these cases.
|
|
*
|
|
* Communicates with the manageability block. On success return 0
|
|
- * else return IXGBE_ERR_HOST_INTERFACE_COMMAND.
|
|
+ * else return -EIO or -EINVAL.
|
|
**/
|
|
s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
|
|
u32 length, u32 timeout,
|
|
@@ -3686,7 +3675,7 @@ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
|
|
|
|
if (!length || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
|
|
hw_dbg(hw, "Buffer length failure buffersize-%d.\n", length);
|
|
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ return -EINVAL;
|
|
}
|
|
/* Take management host interface semaphore */
|
|
status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_SW_MNG_SM);
|
|
@@ -3716,7 +3705,7 @@ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
|
|
|
|
if (length < round_up(buf_len, 4) + hdr_size) {
|
|
hw_dbg(hw, "Buffer not large enough for reply message.\n");
|
|
- status = IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ status = -EIO;
|
|
goto rel_out;
|
|
}
|
|
|
|
@@ -3747,8 +3736,8 @@ rel_out:
|
|
*
|
|
* Sends driver version number to firmware through the manageability
|
|
* block. On success return 0
|
|
- * else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
|
|
- * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
|
|
+ * else returns -EBUSY when encountering an error acquiring
|
|
+ * semaphore or -EIO when command fails.
|
|
**/
|
|
s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
|
|
u8 build, u8 sub, __always_unused u16 len,
|
|
@@ -3784,7 +3773,7 @@ s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
|
|
FW_CEM_RESP_STATUS_SUCCESS)
|
|
ret_val = 0;
|
|
else
|
|
- ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ ret_val = -EIO;
|
|
|
|
break;
|
|
}
|
|
@@ -3882,14 +3871,14 @@ static s32 ixgbe_get_ets_data(struct ixgbe_hw *hw, u16 *ets_cfg,
|
|
return status;
|
|
|
|
if ((*ets_offset == 0x0000) || (*ets_offset == 0xFFFF))
|
|
- return IXGBE_NOT_IMPLEMENTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
status = hw->eeprom.ops.read(hw, *ets_offset, ets_cfg);
|
|
if (status)
|
|
return status;
|
|
|
|
if ((*ets_cfg & IXGBE_ETS_TYPE_MASK) != IXGBE_ETS_TYPE_EMC_SHIFTED)
|
|
- return IXGBE_NOT_IMPLEMENTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
return 0;
|
|
}
|
|
@@ -3912,7 +3901,7 @@ s32 ixgbe_get_thermal_sensor_data_generic(struct ixgbe_hw *hw)
|
|
|
|
/* Only support thermal sensors attached to physical port 0 */
|
|
if ((IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1))
|
|
- return IXGBE_NOT_IMPLEMENTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
status = ixgbe_get_ets_data(hw, &ets_cfg, &ets_offset);
|
|
if (status)
|
|
@@ -3972,7 +3961,7 @@ s32 ixgbe_init_thermal_sensor_thresh_generic(struct ixgbe_hw *hw)
|
|
|
|
/* Only support thermal sensors attached to physical port 0 */
|
|
if ((IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1))
|
|
- return IXGBE_NOT_IMPLEMENTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
status = ixgbe_get_ets_data(hw, &ets_cfg, &ets_offset);
|
|
if (status)
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
|
|
index 0051aa676e19e..f8e65e18284ee 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
|
|
@@ -3339,7 +3339,7 @@ static int ixgbe_get_module_eeprom(struct net_device *dev,
|
|
{
|
|
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
- s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
|
+ s32 status = -EFAULT;
|
|
u8 databyte = 0xFF;
|
|
int i = 0;
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
|
|
index 9e0e13638c463..6dc554e810a17 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
|
|
@@ -2764,7 +2764,6 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter)
|
|
{
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
u32 eicr = adapter->interrupt_event;
|
|
- s32 rc;
|
|
|
|
if (test_bit(__IXGBE_DOWN, &adapter->state))
|
|
return;
|
|
@@ -2798,14 +2797,13 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter)
|
|
}
|
|
|
|
/* Check if this is not due to overtemp */
|
|
- if (hw->phy.ops.check_overtemp(hw) != IXGBE_ERR_OVERTEMP)
|
|
+ if (!hw->phy.ops.check_overtemp(hw))
|
|
return;
|
|
|
|
break;
|
|
case IXGBE_DEV_ID_X550EM_A_1G_T:
|
|
case IXGBE_DEV_ID_X550EM_A_1G_T_L:
|
|
- rc = hw->phy.ops.check_overtemp(hw);
|
|
- if (rc != IXGBE_ERR_OVERTEMP)
|
|
+ if (!hw->phy.ops.check_overtemp(hw))
|
|
return;
|
|
break;
|
|
default:
|
|
@@ -5520,7 +5518,7 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw)
|
|
{
|
|
u32 speed;
|
|
bool autoneg, link_up = false;
|
|
- int ret = IXGBE_ERR_LINK_SETUP;
|
|
+ int ret = -EIO;
|
|
|
|
if (hw->mac.ops.check_link)
|
|
ret = hw->mac.ops.check_link(hw, &speed, &link_up, false);
|
|
@@ -5991,13 +5989,13 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
|
|
err = hw->mac.ops.init_hw(hw);
|
|
switch (err) {
|
|
case 0:
|
|
- case IXGBE_ERR_SFP_NOT_PRESENT:
|
|
- case IXGBE_ERR_SFP_NOT_SUPPORTED:
|
|
+ case -ENOENT:
|
|
+ case -EOPNOTSUPP:
|
|
break;
|
|
- case IXGBE_ERR_PRIMARY_REQUESTS_PENDING:
|
|
+ case -EALREADY:
|
|
e_dev_err("primary disable timed out\n");
|
|
break;
|
|
- case IXGBE_ERR_EEPROM_VERSION:
|
|
+ case -EACCES:
|
|
/* We are running on a pre-production device, log a warning */
|
|
e_dev_warn("This device is a pre-production adapter/LOM. "
|
|
"Please be aware there may be issues associated with "
|
|
@@ -7837,10 +7835,10 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
|
|
adapter->sfp_poll_time = jiffies + IXGBE_SFP_POLL_JIFFIES - 1;
|
|
|
|
err = hw->phy.ops.identify_sfp(hw);
|
|
- if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
+ if (err == -EOPNOTSUPP)
|
|
goto sfp_out;
|
|
|
|
- if (err == IXGBE_ERR_SFP_NOT_PRESENT) {
|
|
+ if (err == -ENOENT) {
|
|
/* If no cable is present, then we need to reset
|
|
* the next time we find a good cable. */
|
|
adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
|
|
@@ -7866,7 +7864,7 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
|
|
else
|
|
err = hw->mac.ops.setup_sfp(hw);
|
|
|
|
- if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
+ if (err == -EOPNOTSUPP)
|
|
goto sfp_out;
|
|
|
|
adapter->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;
|
|
@@ -7875,8 +7873,8 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
|
|
sfp_out:
|
|
clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state);
|
|
|
|
- if ((err == IXGBE_ERR_SFP_NOT_SUPPORTED) &&
|
|
- (adapter->netdev->reg_state == NETREG_REGISTERED)) {
|
|
+ if (err == -EOPNOTSUPP &&
|
|
+ adapter->netdev->reg_state == NETREG_REGISTERED) {
|
|
e_dev_err("failed to initialize because an unsupported "
|
|
"SFP+ module type was detected.\n");
|
|
e_dev_err("Reload the driver after installing a "
|
|
@@ -7946,7 +7944,7 @@ static void ixgbe_service_timer(struct timer_list *t)
|
|
static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)
|
|
{
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
- u32 status;
|
|
+ bool overtemp;
|
|
|
|
if (!(adapter->flags2 & IXGBE_FLAG2_PHY_INTERRUPT))
|
|
return;
|
|
@@ -7956,11 +7954,9 @@ static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)
|
|
if (!hw->phy.ops.handle_lasi)
|
|
return;
|
|
|
|
- status = hw->phy.ops.handle_lasi(&adapter->hw);
|
|
- if (status != IXGBE_ERR_OVERTEMP)
|
|
- return;
|
|
-
|
|
- e_crit(drv, "%s\n", ixgbe_overheat_msg);
|
|
+ hw->phy.ops.handle_lasi(&adapter->hw, &overtemp);
|
|
+ if (overtemp)
|
|
+ e_crit(drv, "%s\n", ixgbe_overheat_msg);
|
|
}
|
|
|
|
static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)
|
|
@@ -10943,9 +10939,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
err = hw->mac.ops.reset_hw(hw);
|
|
hw->phy.reset_if_overtemp = false;
|
|
ixgbe_set_eee_capable(adapter);
|
|
- if (err == IXGBE_ERR_SFP_NOT_PRESENT) {
|
|
+ if (err == -ENOENT) {
|
|
err = 0;
|
|
- } else if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
|
|
+ } else if (err == -EOPNOTSUPP) {
|
|
e_dev_err("failed to load because an unsupported SFP+ or QSFP module type was detected.\n");
|
|
e_dev_err("Reload the driver after installing a supported module.\n");
|
|
goto err_sw_init;
|
|
@@ -11161,7 +11157,7 @@ skip_sriov:
|
|
|
|
/* reset the hardware with the new settings */
|
|
err = hw->mac.ops.start_hw(hw);
|
|
- if (err == IXGBE_ERR_EEPROM_VERSION) {
|
|
+ if (err == -EACCES) {
|
|
/* We are running on a pre-production device, log a warning */
|
|
e_dev_warn("This device is a pre-production adapter/LOM. "
|
|
"Please be aware there may be issues associated "
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c
|
|
index 5679293e53f7a..fe7ef5773369a 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c
|
|
@@ -24,7 +24,7 @@ s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
|
|
size = mbx->size;
|
|
|
|
if (!mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
return mbx->ops->read(hw, msg, size, mbx_id);
|
|
}
|
|
@@ -43,10 +43,10 @@ s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
|
|
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
|
|
|
if (size > mbx->size)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EINVAL;
|
|
|
|
if (!mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
return mbx->ops->write(hw, msg, size, mbx_id);
|
|
}
|
|
@@ -63,7 +63,7 @@ s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
|
|
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
|
|
|
if (!mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
return mbx->ops->check_for_msg(hw, mbx_id);
|
|
}
|
|
@@ -80,7 +80,7 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
|
|
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
|
|
|
if (!mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
return mbx->ops->check_for_ack(hw, mbx_id);
|
|
}
|
|
@@ -97,7 +97,7 @@ s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)
|
|
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
|
|
|
if (!mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
return mbx->ops->check_for_rst(hw, mbx_id);
|
|
}
|
|
@@ -115,12 +115,12 @@ static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
|
|
int countdown = mbx->timeout;
|
|
|
|
if (!countdown || !mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
while (mbx->ops->check_for_msg(hw, mbx_id)) {
|
|
countdown--;
|
|
if (!countdown)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
udelay(mbx->usec_delay);
|
|
}
|
|
|
|
@@ -140,12 +140,12 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
|
|
int countdown = mbx->timeout;
|
|
|
|
if (!countdown || !mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
while (mbx->ops->check_for_ack(hw, mbx_id)) {
|
|
countdown--;
|
|
if (!countdown)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
udelay(mbx->usec_delay);
|
|
}
|
|
|
|
@@ -169,7 +169,7 @@ static s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
|
s32 ret_val;
|
|
|
|
if (!mbx->ops)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
ret_val = ixgbe_poll_for_msg(hw, mbx_id);
|
|
if (ret_val)
|
|
@@ -197,7 +197,7 @@ static s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
|
|
|
/* exit if either we can't write or there isn't a defined timeout */
|
|
if (!mbx->ops || !mbx->timeout)
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
|
|
/* send msg */
|
|
ret_val = mbx->ops->write(hw, msg, size, mbx_id);
|
|
@@ -217,7 +217,7 @@ static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)
|
|
return 0;
|
|
}
|
|
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -238,7 +238,7 @@ static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)
|
|
return 0;
|
|
}
|
|
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -259,7 +259,7 @@ static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)
|
|
return 0;
|
|
}
|
|
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -295,7 +295,7 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
|
|
return 0;
|
|
}
|
|
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -317,7 +317,7 @@ static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
|
|
if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
|
|
return 0;
|
|
|
|
- return IXGBE_ERR_MBX;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
|
|
index 8f4316b19278c..6434c190e7a4c 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
|
|
@@ -7,7 +7,6 @@
|
|
#include "ixgbe_type.h"
|
|
|
|
#define IXGBE_VFMAILBOX_SIZE 16 /* 16 32 bit words - 64 bytes */
|
|
-#define IXGBE_ERR_MBX -100
|
|
|
|
#define IXGBE_VFMAILBOX 0x002FC
|
|
#define IXGBE_VFMBMEM 0x00200
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
|
|
index 123dca9ce4683..305afb82388b7 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
|
|
@@ -102,7 +102,7 @@ s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
|
|
csum = ~csum;
|
|
do {
|
|
if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
ixgbe_i2c_start(hw);
|
|
/* Device Address and write indication */
|
|
if (ixgbe_out_i2c_byte_ack(hw, addr))
|
|
@@ -150,7 +150,7 @@ fail:
|
|
hw_dbg(hw, "I2C byte read combined error.\n");
|
|
} while (retry < max_retry);
|
|
|
|
- return IXGBE_ERR_I2C;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -179,7 +179,7 @@ s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
|
|
csum = ~csum;
|
|
do {
|
|
if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
ixgbe_i2c_start(hw);
|
|
/* Device Address and write indication */
|
|
if (ixgbe_out_i2c_byte_ack(hw, addr))
|
|
@@ -215,7 +215,7 @@ fail:
|
|
hw_dbg(hw, "I2C byte write combined error.\n");
|
|
} while (retry < max_retry);
|
|
|
|
- return IXGBE_ERR_I2C;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -262,8 +262,8 @@ static bool ixgbe_probe_phy(struct ixgbe_hw *hw, u16 phy_addr)
|
|
**/
|
|
s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
|
{
|
|
+ u32 status = -EFAULT;
|
|
u32 phy_addr;
|
|
- u32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
|
|
|
if (!hw->phy.phy_semaphore_mask) {
|
|
if (hw->bus.lan_id)
|
|
@@ -282,7 +282,7 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
|
if (ixgbe_probe_phy(hw, phy_addr))
|
|
return 0;
|
|
else
|
|
- return IXGBE_ERR_PHY_ADDR_INVALID;
|
|
+ return -EFAULT;
|
|
}
|
|
|
|
for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
|
|
@@ -408,8 +408,7 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
|
return status;
|
|
|
|
/* Don't reset PHY if it's shut down due to overtemp. */
|
|
- if (!hw->phy.reset_if_overtemp &&
|
|
- (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
|
|
+ if (!hw->phy.reset_if_overtemp && hw->phy.ops.check_overtemp(hw))
|
|
return 0;
|
|
|
|
/* Blocked by MNG FW so bail */
|
|
@@ -457,7 +456,7 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
|
|
|
if (ctrl & MDIO_CTRL1_RESET) {
|
|
hw_dbg(hw, "PHY reset polling failed to complete.\n");
|
|
- return IXGBE_ERR_RESET_FAILED;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -500,7 +499,7 @@ s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
|
|
|
|
if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
|
|
hw_dbg(hw, "PHY address command did not complete.\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Address cycle complete, setup and write the read
|
|
@@ -527,7 +526,7 @@ s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
|
|
|
|
if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
|
|
hw_dbg(hw, "PHY read command didn't complete\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Read operation is complete. Get the data
|
|
@@ -559,7 +558,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
|
phy_data);
|
|
hw->mac.ops.release_swfw_sync(hw, gssr);
|
|
} else {
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
return status;
|
|
@@ -604,7 +603,7 @@ s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
|
|
|
|
if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
|
|
hw_dbg(hw, "PHY address cmd didn't complete\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/*
|
|
@@ -632,7 +631,7 @@ s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
|
|
|
|
if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
|
|
hw_dbg(hw, "PHY write cmd didn't complete\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -657,7 +656,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
|
phy_data);
|
|
hw->mac.ops.release_swfw_sync(hw, gssr);
|
|
} else {
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
return status;
|
|
@@ -1303,7 +1302,7 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
|
|
|
if ((phy_data & MDIO_CTRL1_RESET) != 0) {
|
|
hw_dbg(hw, "PHY reset did not complete.\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Get init offsets */
|
|
@@ -1360,12 +1359,12 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
|
hw_dbg(hw, "SOL\n");
|
|
} else {
|
|
hw_dbg(hw, "Bad control value\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
break;
|
|
default:
|
|
hw_dbg(hw, "Bad control type\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
}
|
|
|
|
@@ -1373,7 +1372,7 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
|
|
|
err_eeprom:
|
|
hw_err(hw, "eeprom read at offset %d failed\n", data_offset);
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -1391,10 +1390,10 @@ s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw)
|
|
return ixgbe_identify_qsfp_module_generic(hw);
|
|
default:
|
|
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
/**
|
|
@@ -1419,7 +1418,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
|
|
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
|
|
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
/* LAN ID is needed for sfp_type determination */
|
|
@@ -1434,7 +1433,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
|
|
if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
|
|
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
status = hw->phy.ops.read_i2c_eeprom(hw,
|
|
IXGBE_SFF_1GBE_COMP_CODES,
|
|
@@ -1625,7 +1624,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
|
|
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
|
|
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
/* Anything else 82598-based is supported */
|
|
@@ -1649,7 +1648,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
}
|
|
hw_dbg(hw, "SFP+ module not supported\n");
|
|
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
return 0;
|
|
|
|
@@ -1659,7 +1658,7 @@ err_read_i2c_eeprom:
|
|
hw->phy.id = 0;
|
|
hw->phy.type = ixgbe_phy_unknown;
|
|
}
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
/**
|
|
@@ -1686,7 +1685,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
|
|
|
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) {
|
|
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
/* LAN ID is needed for sfp_type determination */
|
|
@@ -1700,7 +1699,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
|
|
|
if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
|
|
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
hw->phy.id = identifier;
|
|
@@ -1768,7 +1767,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
|
} else {
|
|
/* unsupported module type */
|
|
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
}
|
|
|
|
@@ -1828,7 +1827,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
|
}
|
|
hw_dbg(hw, "QSFP module not supported\n");
|
|
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
return 0;
|
|
}
|
|
@@ -1839,7 +1838,7 @@ err_read_i2c_eeprom:
|
|
hw->phy.id = 0;
|
|
hw->phy.type = ixgbe_phy_unknown;
|
|
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
/**
|
|
@@ -1859,14 +1858,14 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
|
u16 sfp_type = hw->phy.sfp_type;
|
|
|
|
if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
|
|
if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
|
|
(hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
|
|
/*
|
|
* Limiting active cables and 1G Phys must be initialized as
|
|
@@ -1887,11 +1886,11 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
|
if (hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset)) {
|
|
hw_err(hw, "eeprom read at %d failed\n",
|
|
IXGBE_PHY_INIT_OFFSET_NL);
|
|
- return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
|
|
+ return -EIO;
|
|
}
|
|
|
|
if ((!*list_offset) || (*list_offset == 0xFFFF))
|
|
- return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
|
|
+ return -EIO;
|
|
|
|
/* Shift offset to first ID word */
|
|
(*list_offset)++;
|
|
@@ -1910,7 +1909,7 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
|
goto err_phy;
|
|
if ((!*data_offset) || (*data_offset == 0xFFFF)) {
|
|
hw_dbg(hw, "SFP+ module not supported\n");
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
} else {
|
|
break;
|
|
}
|
|
@@ -1923,14 +1922,14 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
|
|
|
if (sfp_id == IXGBE_PHY_INIT_END_NL) {
|
|
hw_dbg(hw, "No matching SFP+ module found\n");
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
return 0;
|
|
|
|
err_phy:
|
|
hw_err(hw, "eeprom read at offset %d failed\n", *list_offset);
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -2025,7 +2024,7 @@ static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
|
|
|
|
do {
|
|
if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
ixgbe_i2c_start(hw);
|
|
|
|
@@ -2141,7 +2140,7 @@ static s32 ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
|
|
u32 swfw_mask = hw->phy.phy_semaphore_mask;
|
|
|
|
if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
do {
|
|
ixgbe_i2c_start(hw);
|
|
@@ -2383,7 +2382,7 @@ static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
|
|
|
|
if (ack == 1) {
|
|
hw_dbg(hw, "I2C ack was not received.\n");
|
|
- status = IXGBE_ERR_I2C;
|
|
+ status = -EIO;
|
|
}
|
|
|
|
ixgbe_lower_i2c_clk(hw, &i2cctl);
|
|
@@ -2455,7 +2454,7 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
|
|
udelay(IXGBE_I2C_T_LOW);
|
|
} else {
|
|
hw_dbg(hw, "I2C data was not set to %X\n", data);
|
|
- return IXGBE_ERR_I2C;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -2551,7 +2550,7 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
|
|
*i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL(hw));
|
|
if (data != ixgbe_get_i2c_data(hw, i2cctl)) {
|
|
hw_dbg(hw, "Error - I2C data was not set to %X.\n", data);
|
|
- return IXGBE_ERR_I2C;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -2621,22 +2620,24 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
|
|
* @hw: pointer to hardware structure
|
|
*
|
|
* Checks if the LASI temp alarm status was triggered due to overtemp
|
|
+ *
|
|
+ * Return true when an overtemp event detected, otherwise false.
|
|
**/
|
|
-s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
|
|
+bool ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
|
|
{
|
|
u16 phy_data = 0;
|
|
+ u32 status;
|
|
|
|
if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
|
|
- return 0;
|
|
+ return false;
|
|
|
|
/* Check that the LASI temp alarm status was triggered */
|
|
- hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
|
|
- MDIO_MMD_PMAPMD, &phy_data);
|
|
-
|
|
- if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
|
|
- return 0;
|
|
+ status = hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
|
|
+ MDIO_MMD_PMAPMD, &phy_data);
|
|
+ if (status)
|
|
+ return false;
|
|
|
|
- return IXGBE_ERR_OVERTEMP;
|
|
+ return !!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM);
|
|
}
|
|
|
|
/** ixgbe_set_copper_phy_power - Control power for copper phy
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
|
|
index 6544c4539c0de..ef72729d7c933 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
|
|
@@ -155,7 +155,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw);
|
|
s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
|
u16 *list_offset,
|
|
u16 *data_offset);
|
|
-s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw);
|
|
+bool ixgbe_tn_check_overtemp(struct ixgbe_hw *hw);
|
|
s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
|
u8 dev_addr, u8 *data);
|
|
s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
|
|
index ea88ac04ab9ad..198ab9d97618c 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
|
|
@@ -1329,7 +1329,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
break;
|
|
default:
|
|
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
|
|
- retval = IXGBE_ERR_MBX;
|
|
+ retval = -EIO;
|
|
break;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
|
|
index 2b00db92b08f5..61b9774b3d31e 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
|
|
@@ -3509,10 +3509,10 @@ struct ixgbe_phy_operations {
|
|
s32 (*read_i2c_sff8472)(struct ixgbe_hw *, u8 , u8 *);
|
|
s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *);
|
|
s32 (*write_i2c_eeprom)(struct ixgbe_hw *, u8, u8);
|
|
- s32 (*check_overtemp)(struct ixgbe_hw *);
|
|
+ bool (*check_overtemp)(struct ixgbe_hw *);
|
|
s32 (*set_phy_power)(struct ixgbe_hw *, bool on);
|
|
s32 (*enter_lplu)(struct ixgbe_hw *);
|
|
- s32 (*handle_lasi)(struct ixgbe_hw *hw);
|
|
+ s32 (*handle_lasi)(struct ixgbe_hw *hw, bool *);
|
|
s32 (*read_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
|
|
u8 *value);
|
|
s32 (*write_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
|
|
@@ -3665,45 +3665,6 @@ struct ixgbe_info {
|
|
const u32 *mvals;
|
|
};
|
|
|
|
-
|
|
-/* Error Codes */
|
|
-#define IXGBE_ERR_EEPROM -1
|
|
-#define IXGBE_ERR_EEPROM_CHECKSUM -2
|
|
-#define IXGBE_ERR_PHY -3
|
|
-#define IXGBE_ERR_CONFIG -4
|
|
-#define IXGBE_ERR_PARAM -5
|
|
-#define IXGBE_ERR_MAC_TYPE -6
|
|
-#define IXGBE_ERR_UNKNOWN_PHY -7
|
|
-#define IXGBE_ERR_LINK_SETUP -8
|
|
-#define IXGBE_ERR_ADAPTER_STOPPED -9
|
|
-#define IXGBE_ERR_INVALID_MAC_ADDR -10
|
|
-#define IXGBE_ERR_DEVICE_NOT_SUPPORTED -11
|
|
-#define IXGBE_ERR_PRIMARY_REQUESTS_PENDING -12
|
|
-#define IXGBE_ERR_INVALID_LINK_SETTINGS -13
|
|
-#define IXGBE_ERR_AUTONEG_NOT_COMPLETE -14
|
|
-#define IXGBE_ERR_RESET_FAILED -15
|
|
-#define IXGBE_ERR_SWFW_SYNC -16
|
|
-#define IXGBE_ERR_PHY_ADDR_INVALID -17
|
|
-#define IXGBE_ERR_I2C -18
|
|
-#define IXGBE_ERR_SFP_NOT_SUPPORTED -19
|
|
-#define IXGBE_ERR_SFP_NOT_PRESENT -20
|
|
-#define IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT -21
|
|
-#define IXGBE_ERR_NO_SAN_ADDR_PTR -22
|
|
-#define IXGBE_ERR_FDIR_REINIT_FAILED -23
|
|
-#define IXGBE_ERR_EEPROM_VERSION -24
|
|
-#define IXGBE_ERR_NO_SPACE -25
|
|
-#define IXGBE_ERR_OVERTEMP -26
|
|
-#define IXGBE_ERR_FC_NOT_NEGOTIATED -27
|
|
-#define IXGBE_ERR_FC_NOT_SUPPORTED -28
|
|
-#define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE -30
|
|
-#define IXGBE_ERR_PBA_SECTION -31
|
|
-#define IXGBE_ERR_INVALID_ARGUMENT -32
|
|
-#define IXGBE_ERR_HOST_INTERFACE_COMMAND -33
|
|
-#define IXGBE_ERR_FDIR_CMD_INCOMPLETE -38
|
|
-#define IXGBE_ERR_FW_RESP_INVALID -39
|
|
-#define IXGBE_ERR_TOKEN_RETRY -40
|
|
-#define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF
|
|
-
|
|
#define IXGBE_FUSES0_GROUP(_i) (0x11158 + ((_i) * 4))
|
|
#define IXGBE_FUSES0_300MHZ BIT(5)
|
|
#define IXGBE_FUSES0_REV_MASK (3u << 6)
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
|
|
index d5cfb51ff648d..15325c549d9b5 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
|
|
@@ -84,7 +84,7 @@ mac_reset_top:
|
|
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
|
|
if (status) {
|
|
hw_dbg(hw, "semaphore failed with %d", status);
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
ctrl = IXGBE_CTRL_RST;
|
|
@@ -103,7 +103,7 @@ mac_reset_top:
|
|
}
|
|
|
|
if (ctrl & IXGBE_CTRL_RST_MASK) {
|
|
- status = IXGBE_ERR_RESET_FAILED;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Reset polling failed to complete.\n");
|
|
}
|
|
msleep(100);
|
|
@@ -220,7 +220,7 @@ static s32 ixgbe_read_eerd_X540(struct ixgbe_hw *hw, u16 offset, u16 *data)
|
|
s32 status;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = ixgbe_read_eerd_generic(hw, offset, data);
|
|
|
|
@@ -243,7 +243,7 @@ static s32 ixgbe_read_eerd_buffer_X540(struct ixgbe_hw *hw,
|
|
s32 status;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = ixgbe_read_eerd_buffer_generic(hw, offset, words, data);
|
|
|
|
@@ -264,7 +264,7 @@ static s32 ixgbe_write_eewr_X540(struct ixgbe_hw *hw, u16 offset, u16 data)
|
|
s32 status;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = ixgbe_write_eewr_generic(hw, offset, data);
|
|
|
|
@@ -287,7 +287,7 @@ static s32 ixgbe_write_eewr_buffer_X540(struct ixgbe_hw *hw,
|
|
s32 status;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = ixgbe_write_eewr_buffer_generic(hw, offset, words, data);
|
|
|
|
@@ -324,7 +324,7 @@ static s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
|
|
for (i = 0; i < checksum_last_word; i++) {
|
|
if (ixgbe_read_eerd_generic(hw, i, &word)) {
|
|
hw_dbg(hw, "EEPROM read failed\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
checksum += word;
|
|
}
|
|
@@ -349,7 +349,7 @@ static s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
|
|
|
|
if (ixgbe_read_eerd_generic(hw, pointer, &length)) {
|
|
hw_dbg(hw, "EEPROM read failed\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Skip pointer section if length is invalid. */
|
|
@@ -360,7 +360,7 @@ static s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
|
|
for (j = pointer + 1; j <= pointer + length; j++) {
|
|
if (ixgbe_read_eerd_generic(hw, j, &word)) {
|
|
hw_dbg(hw, "EEPROM read failed\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
checksum += word;
|
|
}
|
|
@@ -397,7 +397,7 @@ static s32 ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
|
|
}
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = hw->eeprom.ops.calc_checksum(hw);
|
|
if (status < 0)
|
|
@@ -418,7 +418,7 @@ static s32 ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
|
|
*/
|
|
if (read_checksum != checksum) {
|
|
hw_dbg(hw, "Invalid EEPROM checksum");
|
|
- status = IXGBE_ERR_EEPROM_CHECKSUM;
|
|
+ status = -EIO;
|
|
}
|
|
|
|
/* If the user cares, return the calculated checksum */
|
|
@@ -455,7 +455,7 @@ static s32 ixgbe_update_eeprom_checksum_X540(struct ixgbe_hw *hw)
|
|
}
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = hw->eeprom.ops.calc_checksum(hw);
|
|
if (status < 0)
|
|
@@ -490,7 +490,7 @@ static s32 ixgbe_update_flash_X540(struct ixgbe_hw *hw)
|
|
s32 status;
|
|
|
|
status = ixgbe_poll_flash_update_done_X540(hw);
|
|
- if (status == IXGBE_ERR_EEPROM) {
|
|
+ if (status == -EIO) {
|
|
hw_dbg(hw, "Flash update time out\n");
|
|
return status;
|
|
}
|
|
@@ -540,7 +540,7 @@ static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw)
|
|
return 0;
|
|
udelay(5);
|
|
}
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -575,7 +575,7 @@ s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
|
|
* SW_FW_SYNC bits (not just NVM)
|
|
*/
|
|
if (ixgbe_get_swfw_sync_semaphore(hw))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC(hw));
|
|
if (!(swfw_sync & (fwmask | swmask | hwmask))) {
|
|
@@ -599,7 +599,7 @@ s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
|
|
* bits in the SW_FW_SYNC register.
|
|
*/
|
|
if (ixgbe_get_swfw_sync_semaphore(hw))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC(hw));
|
|
if (swfw_sync & (fwmask | hwmask)) {
|
|
swfw_sync |= swmask;
|
|
@@ -622,11 +622,11 @@ s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
|
|
rmask |= IXGBE_GSSR_I2C_MASK;
|
|
ixgbe_release_swfw_sync_X540(hw, rmask);
|
|
ixgbe_release_swfw_sync_semaphore(hw);
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
ixgbe_release_swfw_sync_semaphore(hw);
|
|
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
/**
|
|
@@ -680,7 +680,7 @@ static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
|
|
if (i == timeout) {
|
|
hw_dbg(hw,
|
|
"Software semaphore SMBI between device drivers not granted.\n");
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Now get the semaphore between SW/FW through the REGSMP bit */
|
|
@@ -697,7 +697,7 @@ static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
|
|
*/
|
|
hw_dbg(hw, "REGSMP Software NVM semaphore not granted\n");
|
|
ixgbe_release_swfw_sync_semaphore(hw);
|
|
- return IXGBE_ERR_EEPROM;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -768,7 +768,7 @@ s32 ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, u32 index)
|
|
bool link_up;
|
|
|
|
if (index > 3)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* Link should be up in order for the blink bit in the LED control
|
|
* register to work. Force link and speed in the MAC if link is down.
|
|
@@ -804,7 +804,7 @@ s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, u32 index)
|
|
u32 ledctl_reg;
|
|
|
|
if (index > 3)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* Restore the LED to its default value. */
|
|
ledctl_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
|
|
index aa4bf6c9a2f7c..cdc912bba8089 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
|
|
@@ -206,13 +206,13 @@ static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
|
|
}
|
|
if (retry == IXGBE_CS4227_RETRIES) {
|
|
hw_err(hw, "CS4227 reset did not complete\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value);
|
|
if (status || !(value & IXGBE_CS4227_EEPROM_LOAD_OK)) {
|
|
hw_err(hw, "CS4227 EEPROM did not load successfully\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -350,13 +350,13 @@ static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
|
|
static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
|
|
u32 device_type, u16 *phy_data)
|
|
{
|
|
- return IXGBE_NOT_IMPLEMENTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
|
|
u32 device_type, u16 phy_data)
|
|
{
|
|
- return IXGBE_NOT_IMPLEMENTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
/**
|
|
@@ -463,7 +463,7 @@ s32 ixgbe_fw_phy_activity(struct ixgbe_hw *hw, u16 activity,
|
|
--retries;
|
|
} while (retries > 0);
|
|
|
|
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ return -EIO;
|
|
}
|
|
|
|
static const struct {
|
|
@@ -511,7 +511,7 @@ static s32 ixgbe_get_phy_id_fw(struct ixgbe_hw *hw)
|
|
hw->phy.id |= phy_id_lo & IXGBE_PHY_REVISION_MASK;
|
|
hw->phy.revision = phy_id_lo & ~IXGBE_PHY_REVISION_MASK;
|
|
if (!hw->phy.id || hw->phy.id == IXGBE_PHY_REVISION_MASK)
|
|
- return IXGBE_ERR_PHY_ADDR_INVALID;
|
|
+ return -EFAULT;
|
|
|
|
hw->phy.autoneg_advertised = hw->phy.speeds_supported;
|
|
hw->phy.eee_speeds_supported = IXGBE_LINK_SPEED_100_FULL |
|
|
@@ -568,7 +568,7 @@ static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
|
|
|
|
if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
|
|
hw_err(hw, "rx_pause not valid in strict IEEE mode\n");
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
switch (hw->fc.requested_mode) {
|
|
@@ -600,8 +600,10 @@ static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
|
|
rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup);
|
|
if (rc)
|
|
return rc;
|
|
+
|
|
if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN)
|
|
- return IXGBE_ERR_OVERTEMP;
|
|
+ return -EIO;
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -675,7 +677,7 @@ static s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl)
|
|
*ctrl = command;
|
|
if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
|
|
hw_dbg(hw, "IOSF wait timed out\n");
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -715,7 +717,8 @@ static s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
|
|
error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
|
|
IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
|
|
hw_dbg(hw, "Failed to read, error %x\n", error);
|
|
- return IXGBE_ERR_PHY;
|
|
+ ret = -EIO;
|
|
+ goto out;
|
|
}
|
|
|
|
if (!ret)
|
|
@@ -750,9 +753,9 @@ static s32 ixgbe_get_phy_token(struct ixgbe_hw *hw)
|
|
if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
|
|
return 0;
|
|
if (token_cmd.hdr.cmd_or_resp.ret_status != FW_PHY_TOKEN_RETRY)
|
|
- return IXGBE_ERR_FW_RESP_INVALID;
|
|
+ return -EIO;
|
|
|
|
- return IXGBE_ERR_TOKEN_RETRY;
|
|
+ return -EAGAIN;
|
|
}
|
|
|
|
/**
|
|
@@ -778,7 +781,7 @@ static s32 ixgbe_put_phy_token(struct ixgbe_hw *hw)
|
|
return status;
|
|
if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
|
|
return 0;
|
|
- return IXGBE_ERR_FW_RESP_INVALID;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/**
|
|
@@ -942,7 +945,7 @@ static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
|
|
local_buffer = buf;
|
|
} else {
|
|
if (buffer_size < ptr)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
local_buffer = &buffer[ptr];
|
|
}
|
|
|
|
@@ -960,7 +963,7 @@ static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
|
|
}
|
|
|
|
if (buffer && ((u32)start + (u32)length > buffer_size))
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
for (i = start; length; i++, length--) {
|
|
if (i == bufsz && !buffer) {
|
|
@@ -1012,7 +1015,7 @@ static s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer,
|
|
local_buffer = eeprom_ptrs;
|
|
} else {
|
|
if (buffer_size < IXGBE_EEPROM_LAST_WORD)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
local_buffer = buffer;
|
|
}
|
|
|
|
@@ -1148,7 +1151,7 @@ static s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw,
|
|
* calculated checksum
|
|
*/
|
|
if (read_checksum != checksum) {
|
|
- status = IXGBE_ERR_EEPROM_CHECKSUM;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Invalid EEPROM checksum");
|
|
}
|
|
|
|
@@ -1203,7 +1206,7 @@ static s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 data)
|
|
hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
|
|
} else {
|
|
hw_dbg(hw, "write ee hostif failed to get semaphore");
|
|
- status = IXGBE_ERR_SWFW_SYNC;
|
|
+ status = -EBUSY;
|
|
}
|
|
|
|
return status;
|
|
@@ -1415,7 +1418,7 @@ static s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
|
|
error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
|
|
IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
|
|
hw_dbg(hw, "Failed to write, error %x\n", error);
|
|
- return IXGBE_ERR_PHY;
|
|
+ return -EIO;
|
|
}
|
|
|
|
out:
|
|
@@ -1558,7 +1561,7 @@ static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
|
|
|
|
/* iXFI is only supported with X552 */
|
|
if (mac->type != ixgbe_mac_X550EM_x)
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EIO;
|
|
|
|
/* Disable AN and force speed to 10G Serial. */
|
|
status = ixgbe_read_iosf_sb_reg_x550(hw,
|
|
@@ -1580,7 +1583,7 @@ static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
|
|
break;
|
|
default:
|
|
/* Other link speeds are not supported by internal KR PHY. */
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
status = ixgbe_write_iosf_sb_reg_x550(hw,
|
|
@@ -1611,7 +1614,7 @@ static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
|
|
{
|
|
switch (hw->phy.sfp_type) {
|
|
case ixgbe_sfp_type_not_present:
|
|
- return IXGBE_ERR_SFP_NOT_PRESENT;
|
|
+ return -ENOENT;
|
|
case ixgbe_sfp_type_da_cu_core0:
|
|
case ixgbe_sfp_type_da_cu_core1:
|
|
*linear = true;
|
|
@@ -1630,7 +1633,7 @@ static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
|
|
case ixgbe_sfp_type_1g_cu_core0:
|
|
case ixgbe_sfp_type_1g_cu_core1:
|
|
default:
|
|
- return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
return 0;
|
|
@@ -1660,7 +1663,7 @@ ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
|
|
* there is no reason to configure CS4227 and SFP not present error is
|
|
* not accepted in the setup MAC link flow.
|
|
*/
|
|
- if (status == IXGBE_ERR_SFP_NOT_PRESENT)
|
|
+ if (status == -ENOENT)
|
|
return 0;
|
|
|
|
if (status)
|
|
@@ -1718,7 +1721,7 @@ static s32 ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
|
|
break;
|
|
default:
|
|
/* Other link speeds are not supported by internal PHY. */
|
|
- return IXGBE_ERR_LINK_SETUP;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
(void)mac->ops.write_iosf_sb_reg(hw,
|
|
@@ -1803,7 +1806,7 @@ ixgbe_setup_mac_link_sfp_n(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
|
/* If no SFP module present, then return success. Return success since
|
|
* SFP not present error is not excepted in the setup MAC link flow.
|
|
*/
|
|
- if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
|
|
+ if (ret_val == -ENOENT)
|
|
return 0;
|
|
|
|
if (ret_val)
|
|
@@ -1853,7 +1856,7 @@ ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
|
/* If no SFP module present, then return success. Return success since
|
|
* SFP not present error is not excepted in the setup MAC link flow.
|
|
*/
|
|
- if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
|
|
+ if (ret_val == -ENOENT)
|
|
return 0;
|
|
|
|
if (ret_val)
|
|
@@ -1863,7 +1866,7 @@ ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
|
ixgbe_setup_kr_speed_x550em(hw, speed);
|
|
|
|
if (hw->phy.mdio.prtad == MDIO_PRTAD_NONE)
|
|
- return IXGBE_ERR_PHY_ADDR_INVALID;
|
|
+ return -EFAULT;
|
|
|
|
/* Get external PHY SKU id */
|
|
ret_val = hw->phy.ops.read_reg(hw, IXGBE_CS4227_EFUSE_PDF_SKU,
|
|
@@ -1962,7 +1965,7 @@ static s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw,
|
|
u16 i, autoneg_status;
|
|
|
|
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
|
|
status = ixgbe_check_mac_link_generic(hw, speed, link_up,
|
|
link_up_wait_to_complete);
|
|
@@ -2145,9 +2148,9 @@ static s32 ixgbe_setup_sgmii_fw(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
|
*/
|
|
static void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
|
|
{
|
|
- s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
|
|
ixgbe_link_speed speed;
|
|
+ s32 status = -EIO;
|
|
bool link_up;
|
|
|
|
/* AN should have completed when the cable was plugged in.
|
|
@@ -2165,7 +2168,7 @@ static void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
|
|
/* Check if auto-negotiation has completed */
|
|
status = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &info);
|
|
if (status || !(info[0] & FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE)) {
|
|
- status = IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
+ status = -EIO;
|
|
goto out;
|
|
}
|
|
|
|
@@ -2369,18 +2372,18 @@ static s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
|
|
* @hw: pointer to hardware structure
|
|
* @lsc: pointer to boolean flag which indicates whether external Base T
|
|
* PHY interrupt is lsc
|
|
+ * @is_overtemp: indicate whether an overtemp event encountered
|
|
*
|
|
* Determime if external Base T PHY interrupt cause is high temperature
|
|
* failure alarm or link status change.
|
|
- *
|
|
- * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
|
|
- * failure alarm, else return PHY access status.
|
|
**/
|
|
-static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
|
|
+static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc,
|
|
+ bool *is_overtemp)
|
|
{
|
|
u32 status;
|
|
u16 reg;
|
|
|
|
+ *is_overtemp = false;
|
|
*lsc = false;
|
|
|
|
/* Vendor alarm triggered */
|
|
@@ -2412,7 +2415,8 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
|
|
if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
|
|
/* power down the PHY in case the PHY FW didn't already */
|
|
ixgbe_set_copper_phy_power(hw, false);
|
|
- return IXGBE_ERR_OVERTEMP;
|
|
+ *is_overtemp = true;
|
|
+ return -EIO;
|
|
}
|
|
if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
|
|
/* device fault alarm triggered */
|
|
@@ -2426,7 +2430,8 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
|
|
if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) {
|
|
/* power down the PHY in case the PHY FW didn't */
|
|
ixgbe_set_copper_phy_power(hw, false);
|
|
- return IXGBE_ERR_OVERTEMP;
|
|
+ *is_overtemp = true;
|
|
+ return -EIO;
|
|
}
|
|
}
|
|
|
|
@@ -2462,12 +2467,12 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
|
|
**/
|
|
static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
|
|
{
|
|
+ bool lsc, overtemp;
|
|
u32 status;
|
|
u16 reg;
|
|
- bool lsc;
|
|
|
|
/* Clear interrupt flags */
|
|
- status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
|
|
+ status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc, &overtemp);
|
|
|
|
/* Enable link status change alarm */
|
|
|
|
@@ -2546,21 +2551,20 @@ static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
|
|
/**
|
|
* ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
|
|
* @hw: pointer to hardware structure
|
|
+ * @is_overtemp: indicate whether an overtemp event encountered
|
|
*
|
|
* Handle external Base T PHY interrupt. If high temperature
|
|
* failure alarm then return error, else if link status change
|
|
* then setup internal/external PHY link
|
|
- *
|
|
- * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
|
|
- * failure alarm, else return PHY access status.
|
|
**/
|
|
-static s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
|
|
+static s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw,
|
|
+ bool *is_overtemp)
|
|
{
|
|
struct ixgbe_phy_info *phy = &hw->phy;
|
|
bool lsc;
|
|
u32 status;
|
|
|
|
- status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
|
|
+ status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc, is_overtemp);
|
|
if (status)
|
|
return status;
|
|
|
|
@@ -2692,7 +2696,7 @@ static s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
|
|
u16 speed;
|
|
|
|
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
|
|
if (!(hw->mac.type == ixgbe_mac_X550EM_x &&
|
|
!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE))) {
|
|
@@ -2735,7 +2739,7 @@ static s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
|
|
break;
|
|
default:
|
|
/* Internal PHY does not support anything else */
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
return ixgbe_setup_ixfi_x550em(hw, &force_speed);
|
|
@@ -2767,7 +2771,7 @@ static s32 ixgbe_led_on_t_x550em(struct ixgbe_hw *hw, u32 led_idx)
|
|
u16 phy_data;
|
|
|
|
if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* To turn on the LED, set mode to ON. */
|
|
hw->phy.ops.read_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
|
|
@@ -2789,7 +2793,7 @@ static s32 ixgbe_led_off_t_x550em(struct ixgbe_hw *hw, u32 led_idx)
|
|
u16 phy_data;
|
|
|
|
if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
|
|
- return IXGBE_ERR_PARAM;
|
|
+ return -EINVAL;
|
|
|
|
/* To turn on the LED, set mode to ON. */
|
|
hw->phy.ops.read_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
|
|
@@ -2813,8 +2817,9 @@ static s32 ixgbe_led_off_t_x550em(struct ixgbe_hw *hw, u32 led_idx)
|
|
*
|
|
* Sends driver version number to firmware through the manageability
|
|
* block. On success return 0
|
|
- * else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
|
|
- * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
|
|
+ * else returns -EBUSY when encountering an error acquiring
|
|
+ * semaphore, -EIO when command fails or -ENIVAL when incorrect
|
|
+ * params passed.
|
|
**/
|
|
static s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
|
|
u8 build, u8 sub, u16 len,
|
|
@@ -2825,7 +2830,7 @@ static s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
|
|
int i;
|
|
|
|
if (!len || !driver_ver || (len > sizeof(fw_cmd.driver_string)))
|
|
- return IXGBE_ERR_INVALID_ARGUMENT;
|
|
+ return -EINVAL;
|
|
|
|
fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO;
|
|
fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN + len;
|
|
@@ -2850,7 +2855,7 @@ static s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
|
|
|
|
if (fw_cmd.hdr.cmd_or_resp.ret_status !=
|
|
FW_CEM_RESP_STATUS_SUCCESS)
|
|
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
|
+ return -EIO;
|
|
return 0;
|
|
}
|
|
|
|
@@ -2907,7 +2912,7 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
|
|
/* Validate the requested mode */
|
|
if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
|
|
hw_err(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
/* 10gig parts do not have a word in the EEPROM to determine the
|
|
@@ -2942,7 +2947,7 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
|
|
break;
|
|
default:
|
|
hw_err(hw, "Flow control param set incorrectly\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
switch (hw->device_id) {
|
|
@@ -2986,8 +2991,8 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
|
|
static void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
|
|
{
|
|
u32 link_s1, lp_an_page_low, an_cntl_1;
|
|
- s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
ixgbe_link_speed speed;
|
|
+ s32 status = -EIO;
|
|
bool link_up;
|
|
|
|
/* AN should have completed when the cable was plugged in.
|
|
@@ -3013,7 +3018,7 @@ static void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
|
|
|
|
if (status || (link_s1 & IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE) == 0) {
|
|
hw_dbg(hw, "Auto-Negotiation did not complete\n");
|
|
- status = IXGBE_ERR_FC_NOT_NEGOTIATED;
|
|
+ status = -EIO;
|
|
goto out;
|
|
}
|
|
|
|
@@ -3187,21 +3192,23 @@ static s32 ixgbe_reset_phy_fw(struct ixgbe_hw *hw)
|
|
/**
|
|
* ixgbe_check_overtemp_fw - Check firmware-controlled PHYs for overtemp
|
|
* @hw: pointer to hardware structure
|
|
+ *
|
|
+ * Return true when an overtemp event detected, otherwise false.
|
|
*/
|
|
-static s32 ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
|
|
+static bool ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
|
|
{
|
|
u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 };
|
|
s32 rc;
|
|
|
|
rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &store);
|
|
if (rc)
|
|
- return rc;
|
|
+ return false;
|
|
|
|
if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) {
|
|
ixgbe_shutdown_fw_phy(hw);
|
|
- return IXGBE_ERR_OVERTEMP;
|
|
+ return true;
|
|
}
|
|
- return 0;
|
|
+ return false;
|
|
}
|
|
|
|
/**
|
|
@@ -3251,8 +3258,7 @@ static s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
|
|
|
|
/* Identify the PHY or SFP module */
|
|
ret_val = phy->ops.identify(hw);
|
|
- if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED ||
|
|
- ret_val == IXGBE_ERR_PHY_ADDR_INVALID)
|
|
+ if (ret_val == -EOPNOTSUPP || ret_val == -EFAULT)
|
|
return ret_val;
|
|
|
|
/* Setup function pointers based on detected hardware */
|
|
@@ -3460,8 +3466,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
|
|
|
|
/* PHY ops must be identified and initialized prior to reset */
|
|
status = hw->phy.ops.init(hw);
|
|
- if (status == IXGBE_ERR_SFP_NOT_SUPPORTED ||
|
|
- status == IXGBE_ERR_PHY_ADDR_INVALID)
|
|
+ if (status == -EOPNOTSUPP || status == -EFAULT)
|
|
return status;
|
|
|
|
/* start the external PHY */
|
|
@@ -3477,7 +3482,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
|
|
hw->phy.sfp_setup_needed = false;
|
|
}
|
|
|
|
- if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
+ if (status == -EOPNOTSUPP)
|
|
return status;
|
|
|
|
/* Reset PHY */
|
|
@@ -3501,7 +3506,7 @@ mac_reset_top:
|
|
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
|
|
if (status) {
|
|
hw_dbg(hw, "semaphore failed with %d", status);
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
|
|
@@ -3519,7 +3524,7 @@ mac_reset_top:
|
|
}
|
|
|
|
if (ctrl & IXGBE_CTRL_RST_MASK) {
|
|
- status = IXGBE_ERR_RESET_FAILED;
|
|
+ status = -EIO;
|
|
hw_dbg(hw, "Reset polling failed to complete.\n");
|
|
}
|
|
|
|
@@ -3615,7 +3620,7 @@ static s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
|
|
/* Validate the requested mode */
|
|
if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
|
|
hw_err(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
|
|
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
if (hw->fc.requested_mode == ixgbe_fc_default)
|
|
@@ -3672,7 +3677,7 @@ static s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
|
|
break;
|
|
default:
|
|
hw_err(hw, "Flow control param set incorrectly\n");
|
|
- return IXGBE_ERR_CONFIG;
|
|
+ return -EIO;
|
|
}
|
|
|
|
status = hw->mac.ops.write_iosf_sb_reg(hw,
|
|
@@ -3768,7 +3773,7 @@ static s32 ixgbe_acquire_swfw_sync_x550em_a(struct ixgbe_hw *hw, u32 mask)
|
|
return 0;
|
|
if (hmask)
|
|
ixgbe_release_swfw_sync_X540(hw, hmask);
|
|
- if (status != IXGBE_ERR_TOKEN_RETRY)
|
|
+ if (status != -EAGAIN)
|
|
return status;
|
|
msleep(FW_PHY_TOKEN_DELAY);
|
|
}
|
|
@@ -3812,7 +3817,7 @@ static s32 ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
|
|
s32 status;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, mask))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
|
|
|
|
@@ -3838,7 +3843,7 @@ static s32 ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
|
|
s32 status;
|
|
|
|
if (hw->mac.ops.acquire_swfw_sync(hw, mask))
|
|
- return IXGBE_ERR_SWFW_SYNC;
|
|
+ return -EBUSY;
|
|
|
|
status = ixgbe_write_phy_reg_mdi(hw, reg_addr, device_type, phy_data);
|
|
hw->mac.ops.release_swfw_sync(hw, mask);
|
|
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
|
|
index 0bcf3e5592806..3784347b6fd88 100644
|
|
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
|
|
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
|
|
@@ -2678,18 +2678,17 @@ int rvu_mbox_handler_npc_mcam_alloc_entry(struct rvu *rvu,
|
|
rsp->entry = NPC_MCAM_ENTRY_INVALID;
|
|
rsp->free_count = 0;
|
|
|
|
- /* Check if ref_entry is within range */
|
|
- if (req->priority && req->ref_entry >= mcam->bmap_entries) {
|
|
- dev_err(rvu->dev, "%s: reference entry %d is out of range\n",
|
|
- __func__, req->ref_entry);
|
|
- return NPC_MCAM_INVALID_REQ;
|
|
- }
|
|
+ /* Check if ref_entry is greater that the range
|
|
+ * then set it to max value.
|
|
+ */
|
|
+ if (req->ref_entry > mcam->bmap_entries)
|
|
+ req->ref_entry = mcam->bmap_entries;
|
|
|
|
/* ref_entry can't be '0' if requested priority is high.
|
|
* Can't be last entry if requested priority is low.
|
|
*/
|
|
if ((!req->ref_entry && req->priority == NPC_MCAM_HIGHER_PRIO) ||
|
|
- ((req->ref_entry == (mcam->bmap_entries - 1)) &&
|
|
+ ((req->ref_entry == mcam->bmap_entries) &&
|
|
req->priority == NPC_MCAM_LOWER_PRIO))
|
|
return NPC_MCAM_INVALID_REQ;
|
|
|
|
diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_port.c b/drivers/net/ethernet/microchip/lan966x/lan966x_port.c
|
|
index 0050fcb988b75..8cc5172833a91 100644
|
|
--- a/drivers/net/ethernet/microchip/lan966x/lan966x_port.c
|
|
+++ b/drivers/net/ethernet/microchip/lan966x/lan966x_port.c
|
|
@@ -168,9 +168,10 @@ static void lan966x_port_link_up(struct lan966x_port *port)
|
|
lan966x_taprio_speed_set(port, config->speed);
|
|
|
|
/* Also the GIGA_MODE_ENA(1) needs to be set regardless of the
|
|
- * port speed for QSGMII ports.
|
|
+ * port speed for QSGMII or SGMII ports.
|
|
*/
|
|
- if (phy_interface_num_ports(config->portmode) == 4)
|
|
+ if (phy_interface_num_ports(config->portmode) == 4 ||
|
|
+ config->portmode == PHY_INTERFACE_MODE_SGMII)
|
|
mode = DEV_MAC_MODE_CFG_GIGA_MODE_ENA_SET(1);
|
|
|
|
lan_wr(config->duplex | mode,
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
|
|
index ce436e97324ac..4b9caec6eb9b2 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
|
|
@@ -380,6 +380,10 @@ static void ionic_remove(struct pci_dev *pdev)
|
|
del_timer_sync(&ionic->watchdog_timer);
|
|
|
|
if (ionic->lif) {
|
|
+ /* prevent adminq cmds if already known as down */
|
|
+ if (test_and_clear_bit(IONIC_LIF_F_FW_RESET, ionic->lif->state))
|
|
+ set_bit(IONIC_LIF_F_FW_STOPPING, ionic->lif->state);
|
|
+
|
|
ionic_lif_unregister(ionic->lif);
|
|
ionic_devlink_unregister(ionic);
|
|
ionic_lif_deinit(ionic->lif);
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_dev.c b/drivers/net/ethernet/pensando/ionic/ionic_dev.c
|
|
index 344a3924627d4..7adfcd7c2f3ad 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_dev.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_dev.c
|
|
@@ -293,6 +293,7 @@ void ionic_dev_cmd_comp(struct ionic_dev *idev, union ionic_dev_cmd_comp *comp)
|
|
|
|
void ionic_dev_cmd_go(struct ionic_dev *idev, union ionic_dev_cmd *cmd)
|
|
{
|
|
+ idev->opcode = cmd->cmd.opcode;
|
|
memcpy_toio(&idev->dev_cmd_regs->cmd, cmd, sizeof(*cmd));
|
|
iowrite32(0, &idev->dev_cmd_regs->done);
|
|
iowrite32(1, &idev->dev_cmd_regs->doorbell);
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_dev.h b/drivers/net/ethernet/pensando/ionic/ionic_dev.h
|
|
index 13dfcf9f75dad..c10da629ef6ee 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_dev.h
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_dev.h
|
|
@@ -150,6 +150,7 @@ struct ionic_dev {
|
|
bool fw_hb_ready;
|
|
bool fw_status_ready;
|
|
u8 fw_generation;
|
|
+ u8 opcode;
|
|
|
|
u64 __iomem *db_pages;
|
|
dma_addr_t phy_db_pages;
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
|
|
index f7634884c7508..fcc3faecb0600 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
|
|
@@ -3008,6 +3008,9 @@ static void ionic_lif_reset(struct ionic_lif *lif)
|
|
{
|
|
struct ionic_dev *idev = &lif->ionic->idev;
|
|
|
|
+ if (!ionic_is_fw_running(idev))
|
|
+ return;
|
|
+
|
|
mutex_lock(&lif->ionic->dev_cmd_lock);
|
|
ionic_dev_cmd_lif_reset(idev, lif->index);
|
|
ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT);
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_main.c b/drivers/net/ethernet/pensando/ionic/ionic_main.c
|
|
index 79272f5f380c6..d2038ff316ca5 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_main.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_main.c
|
|
@@ -410,22 +410,28 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx,
|
|
do_msg);
|
|
}
|
|
|
|
-int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
|
+static int __ionic_adminq_post_wait(struct ionic_lif *lif,
|
|
+ struct ionic_admin_ctx *ctx,
|
|
+ const bool do_msg)
|
|
{
|
|
int err;
|
|
|
|
+ if (!ionic_is_fw_running(&lif->ionic->idev))
|
|
+ return 0;
|
|
+
|
|
err = ionic_adminq_post(lif, ctx);
|
|
|
|
- return ionic_adminq_wait(lif, ctx, err, true);
|
|
+ return ionic_adminq_wait(lif, ctx, err, do_msg);
|
|
}
|
|
|
|
-int ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
|
+int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
|
{
|
|
- int err;
|
|
-
|
|
- err = ionic_adminq_post(lif, ctx);
|
|
+ return __ionic_adminq_post_wait(lif, ctx, true);
|
|
+}
|
|
|
|
- return ionic_adminq_wait(lif, ctx, err, false);
|
|
+int ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
|
+{
|
|
+ return __ionic_adminq_post_wait(lif, ctx, false);
|
|
}
|
|
|
|
static void ionic_dev_cmd_clean(struct ionic *ionic)
|
|
@@ -465,7 +471,7 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds,
|
|
*/
|
|
max_wait = jiffies + (max_seconds * HZ);
|
|
try_again:
|
|
- opcode = readb(&idev->dev_cmd_regs->cmd.cmd.opcode);
|
|
+ opcode = idev->opcode;
|
|
start_time = jiffies;
|
|
for (fw_up = ionic_is_fw_running(idev);
|
|
!done && fw_up && time_before(jiffies, max_wait);
|
|
diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
|
|
index edd4b1e58d965..75868e63b81bb 100644
|
|
--- a/drivers/net/phy/at803x.c
|
|
+++ b/drivers/net/phy/at803x.c
|
|
@@ -2051,7 +2051,7 @@ static struct phy_driver at803x_driver[] = {
|
|
.write_page = at803x_write_page,
|
|
.get_features = at803x_get_features,
|
|
.read_status = at803x_read_status,
|
|
- .config_intr = &at803x_config_intr,
|
|
+ .config_intr = at803x_config_intr,
|
|
.handle_interrupt = at803x_handle_interrupt,
|
|
.get_tunable = at803x_get_tunable,
|
|
.set_tunable = at803x_set_tunable,
|
|
@@ -2081,7 +2081,7 @@ static struct phy_driver at803x_driver[] = {
|
|
.resume = at803x_resume,
|
|
.flags = PHY_POLL_CABLE_TEST,
|
|
/* PHY_BASIC_FEATURES */
|
|
- .config_intr = &at803x_config_intr,
|
|
+ .config_intr = at803x_config_intr,
|
|
.handle_interrupt = at803x_handle_interrupt,
|
|
.cable_test_start = at803x_cable_test_start,
|
|
.cable_test_get_status = at803x_cable_test_get_status,
|
|
@@ -2097,7 +2097,7 @@ static struct phy_driver at803x_driver[] = {
|
|
.resume = at803x_resume,
|
|
.flags = PHY_POLL_CABLE_TEST,
|
|
/* PHY_BASIC_FEATURES */
|
|
- .config_intr = &at803x_config_intr,
|
|
+ .config_intr = at803x_config_intr,
|
|
.handle_interrupt = at803x_handle_interrupt,
|
|
.cable_test_start = at803x_cable_test_start,
|
|
.cable_test_get_status = at803x_cable_test_get_status,
|
|
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
|
|
index 5a1bf42ce1566..d837c18874161 100644
|
|
--- a/drivers/net/usb/ax88179_178a.c
|
|
+++ b/drivers/net/usb/ax88179_178a.c
|
|
@@ -1315,8 +1315,6 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
|
|
|
|
netif_set_tso_max_size(dev->net, 16384);
|
|
|
|
- ax88179_reset(dev);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
|
|
index 21d3461fb5d1c..45f1a871b7da8 100644
|
|
--- a/drivers/net/virtio_net.c
|
|
+++ b/drivers/net/virtio_net.c
|
|
@@ -3474,10 +3474,11 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
|
|
{
|
|
vq_callback_t **callbacks;
|
|
struct virtqueue **vqs;
|
|
- int ret = -ENOMEM;
|
|
- int i, total_vqs;
|
|
const char **names;
|
|
+ int ret = -ENOMEM;
|
|
+ int total_vqs;
|
|
bool *ctx;
|
|
+ u16 i;
|
|
|
|
/* We expect 1 RX virtqueue followed by 1 TX virtqueue, followed by
|
|
* possible N-1 RX/TX queue pairs used in multiqueue mode, followed by
|
|
@@ -3514,8 +3515,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
|
|
for (i = 0; i < vi->max_queue_pairs; i++) {
|
|
callbacks[rxq2vq(i)] = skb_recv_done;
|
|
callbacks[txq2vq(i)] = skb_xmit_done;
|
|
- sprintf(vi->rq[i].name, "input.%d", i);
|
|
- sprintf(vi->sq[i].name, "output.%d", i);
|
|
+ sprintf(vi->rq[i].name, "input.%u", i);
|
|
+ sprintf(vi->sq[i].name, "output.%u", i);
|
|
names[rxq2vq(i)] = vi->rq[i].name;
|
|
names[txq2vq(i)] = vi->sq[i].name;
|
|
if (ctx)
|
|
diff --git a/drivers/net/wireless/ath/ath11k/pcic.c b/drivers/net/wireless/ath/ath11k/pcic.c
|
|
index 380f9d37b6449..e3b65efcc8684 100644
|
|
--- a/drivers/net/wireless/ath/ath11k/pcic.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/pcic.c
|
|
@@ -453,8 +453,6 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
|
|
{
|
|
int i;
|
|
|
|
- set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
|
|
-
|
|
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
|
|
struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
|
|
|
|
@@ -465,6 +463,8 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
|
|
}
|
|
ath11k_pcic_ext_grp_enable(irq_grp);
|
|
}
|
|
+
|
|
+ set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
|
|
}
|
|
EXPORT_SYMBOL(ath11k_pcic_ext_irq_enable);
|
|
|
|
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
|
|
index 672789e3c55d0..d6a3f001dacb9 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
|
|
@@ -652,9 +652,10 @@ void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event)
|
|
struct ath9k_htc_tx_event *tx_pend;
|
|
int i;
|
|
|
|
- for (i = 0; i < txs->cnt; i++) {
|
|
- WARN_ON(txs->cnt > HTC_MAX_TX_STATUS);
|
|
+ if (WARN_ON_ONCE(txs->cnt > HTC_MAX_TX_STATUS))
|
|
+ return;
|
|
|
|
+ for (i = 0; i < txs->cnt; i++) {
|
|
__txs = &txs->txstatus[i];
|
|
|
|
skb = ath9k_htc_tx_get_packet(priv, __txs);
|
|
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
index 12b700c7b9c3b..517d9023aae3d 100644
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
|
@@ -8672,7 +8672,7 @@ static void rt2800_rxdcoc_calibration(struct rt2x00_dev *rt2x00dev)
|
|
rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r4);
|
|
rt2800_rfcsr_write_bank(rt2x00dev, 7, 4, saverfb7r4);
|
|
|
|
- rt2800_bbp_write(rt2x00dev, 158, 141);
|
|
+ rt2800_bbp_write(rt2x00dev, 158, 140);
|
|
bbpreg = rt2800_bbp_read(rt2x00dev, 159);
|
|
bbpreg = bbpreg & (~0x40);
|
|
rt2800_bbp_write(rt2x00dev, 159, bbpreg);
|
|
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
|
index 9a9cfd0ce402d..00b945053e199 100644
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
|
@@ -101,6 +101,7 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
|
|
rt2x00link_stop_tuner(rt2x00dev);
|
|
rt2x00queue_stop_queues(rt2x00dev);
|
|
rt2x00queue_flush_queues(rt2x00dev, true);
|
|
+ rt2x00queue_stop_queue(rt2x00dev->bcn);
|
|
|
|
/*
|
|
* Disable radio.
|
|
@@ -1286,6 +1287,7 @@ int rt2x00lib_start(struct rt2x00_dev *rt2x00dev)
|
|
rt2x00dev->intf_ap_count = 0;
|
|
rt2x00dev->intf_sta_count = 0;
|
|
rt2x00dev->intf_associated = 0;
|
|
+ rt2x00dev->intf_beaconing = 0;
|
|
|
|
/* Enable the radio */
|
|
retval = rt2x00lib_enable_radio(rt2x00dev);
|
|
@@ -1312,6 +1314,7 @@ void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev)
|
|
rt2x00dev->intf_ap_count = 0;
|
|
rt2x00dev->intf_sta_count = 0;
|
|
rt2x00dev->intf_associated = 0;
|
|
+ rt2x00dev->intf_beaconing = 0;
|
|
}
|
|
|
|
static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)
|
|
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
|
index 4202c65177839..75fda72c14ca9 100644
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
|
@@ -598,6 +598,17 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
|
|
*/
|
|
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
|
mutex_lock(&intf->beacon_skb_mutex);
|
|
+
|
|
+ /*
|
|
+ * Clear the 'enable_beacon' flag and clear beacon because
|
|
+ * the beacon queue has been stopped after hardware reset.
|
|
+ */
|
|
+ if (test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags) &&
|
|
+ intf->enable_beacon) {
|
|
+ intf->enable_beacon = false;
|
|
+ rt2x00queue_clear_beacon(rt2x00dev, vif);
|
|
+ }
|
|
+
|
|
if (!bss_conf->enable_beacon && intf->enable_beacon) {
|
|
rt2x00dev->intf_beaconing--;
|
|
intf->enable_beacon = false;
|
|
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
|
index 3a9fa3ff37acc..6dd5ec1e4d8c3 100644
|
|
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
|
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
|
@@ -7030,6 +7030,18 @@ static const struct usb_device_id dev_table[] = {
|
|
.driver_info = (unsigned long)&rtl8192eu_fops},
|
|
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x818c, 0xff, 0xff, 0xff),
|
|
.driver_info = (unsigned long)&rtl8192eu_fops},
|
|
+/* D-Link DWA-131 rev C1 */
|
|
+{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3312, 0xff, 0xff, 0xff),
|
|
+ .driver_info = (unsigned long)&rtl8192eu_fops},
|
|
+/* TP-Link TL-WN8200ND V2 */
|
|
+{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0126, 0xff, 0xff, 0xff),
|
|
+ .driver_info = (unsigned long)&rtl8192eu_fops},
|
|
+/* Mercusys MW300UM */
|
|
+{USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0100, 0xff, 0xff, 0xff),
|
|
+ .driver_info = (unsigned long)&rtl8192eu_fops},
|
|
+/* Mercusys MW300UH */
|
|
+{USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0104, 0xff, 0xff, 0xff),
|
|
+ .driver_info = (unsigned long)&rtl8192eu_fops},
|
|
#endif
|
|
{ }
|
|
};
|
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c
|
|
index fe9b407dc2aff..71e29b103da5a 100644
|
|
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c
|
|
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c
|
|
@@ -49,7 +49,7 @@ u32 rtl8723e_phy_query_rf_reg(struct ieee80211_hw *hw,
|
|
rfpath, regaddr);
|
|
}
|
|
|
|
- bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
|
|
+ bitshift = calculate_bit_shift(bitmask);
|
|
readback_value = (original_value & bitmask) >> bitshift;
|
|
|
|
spin_unlock(&rtlpriv->locks.rf_lock);
|
|
@@ -80,7 +80,7 @@ void rtl8723e_phy_set_rf_reg(struct ieee80211_hw *hw,
|
|
original_value = rtl8723_phy_rf_serial_read(hw,
|
|
rfpath,
|
|
regaddr);
|
|
- bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
|
|
+ bitshift = calculate_bit_shift(bitmask);
|
|
data =
|
|
((original_value & (~bitmask)) |
|
|
(data << bitshift));
|
|
@@ -89,7 +89,7 @@ void rtl8723e_phy_set_rf_reg(struct ieee80211_hw *hw,
|
|
rtl8723_phy_rf_serial_write(hw, rfpath, regaddr, data);
|
|
} else {
|
|
if (bitmask != RFREG_OFFSET_MASK) {
|
|
- bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
|
|
+ bitshift = calculate_bit_shift(bitmask);
|
|
data =
|
|
((original_value & (~bitmask)) |
|
|
(data << bitshift));
|
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c
|
|
index 2b9313cb93dbd..094cb36153f5a 100644
|
|
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c
|
|
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c
|
|
@@ -41,7 +41,7 @@ u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
|
|
spin_lock(&rtlpriv->locks.rf_lock);
|
|
|
|
original_value = rtl8723_phy_rf_serial_read(hw, rfpath, regaddr);
|
|
- bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
|
|
+ bitshift = calculate_bit_shift(bitmask);
|
|
readback_value = (original_value & bitmask) >> bitshift;
|
|
|
|
spin_unlock(&rtlpriv->locks.rf_lock);
|
|
@@ -68,7 +68,7 @@ void rtl8723be_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path path,
|
|
if (bitmask != RFREG_OFFSET_MASK) {
|
|
original_value = rtl8723_phy_rf_serial_read(hw, path,
|
|
regaddr);
|
|
- bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
|
|
+ bitshift = calculate_bit_shift(bitmask);
|
|
data = ((original_value & (~bitmask)) |
|
|
(data << bitshift));
|
|
}
|
|
diff --git a/drivers/net/wireless/silabs/wfx/sta.c b/drivers/net/wireless/silabs/wfx/sta.c
|
|
index 626dfb4b7a55d..073e870b26415 100644
|
|
--- a/drivers/net/wireless/silabs/wfx/sta.c
|
|
+++ b/drivers/net/wireless/silabs/wfx/sta.c
|
|
@@ -354,29 +354,38 @@ static int wfx_upload_ap_templates(struct wfx_vif *wvif)
|
|
return 0;
|
|
}
|
|
|
|
-static void wfx_set_mfp_ap(struct wfx_vif *wvif)
|
|
+static int wfx_set_mfp_ap(struct wfx_vif *wvif)
|
|
{
|
|
struct ieee80211_vif *vif = wvif_to_vif(wvif);
|
|
struct sk_buff *skb = ieee80211_beacon_get(wvif->wdev->hw, vif, 0);
|
|
const int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
|
|
- const u16 *ptr = (u16 *)cfg80211_find_ie(WLAN_EID_RSN, skb->data + ieoffset,
|
|
- skb->len - ieoffset);
|
|
const int pairwise_cipher_suite_count_offset = 8 / sizeof(u16);
|
|
const int pairwise_cipher_suite_size = 4 / sizeof(u16);
|
|
const int akm_suite_size = 4 / sizeof(u16);
|
|
+ const u16 *ptr;
|
|
|
|
- if (ptr) {
|
|
- ptr += pairwise_cipher_suite_count_offset;
|
|
- if (WARN_ON(ptr > (u16 *)skb_tail_pointer(skb)))
|
|
- return;
|
|
- ptr += 1 + pairwise_cipher_suite_size * *ptr;
|
|
- if (WARN_ON(ptr > (u16 *)skb_tail_pointer(skb)))
|
|
- return;
|
|
- ptr += 1 + akm_suite_size * *ptr;
|
|
- if (WARN_ON(ptr > (u16 *)skb_tail_pointer(skb)))
|
|
- return;
|
|
- wfx_hif_set_mfp(wvif, *ptr & BIT(7), *ptr & BIT(6));
|
|
- }
|
|
+ if (unlikely(!skb))
|
|
+ return -ENOMEM;
|
|
+
|
|
+ ptr = (u16 *)cfg80211_find_ie(WLAN_EID_RSN, skb->data + ieoffset,
|
|
+ skb->len - ieoffset);
|
|
+ if (unlikely(!ptr))
|
|
+ return -EINVAL;
|
|
+
|
|
+ ptr += pairwise_cipher_suite_count_offset;
|
|
+ if (WARN_ON(ptr > (u16 *)skb_tail_pointer(skb)))
|
|
+ return -EINVAL;
|
|
+
|
|
+ ptr += 1 + pairwise_cipher_suite_size * *ptr;
|
|
+ if (WARN_ON(ptr > (u16 *)skb_tail_pointer(skb)))
|
|
+ return -EINVAL;
|
|
+
|
|
+ ptr += 1 + akm_suite_size * *ptr;
|
|
+ if (WARN_ON(ptr > (u16 *)skb_tail_pointer(skb)))
|
|
+ return -EINVAL;
|
|
+
|
|
+ wfx_hif_set_mfp(wvif, *ptr & BIT(7), *ptr & BIT(6));
|
|
+ return 0;
|
|
}
|
|
|
|
int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
@@ -394,8 +403,7 @@ int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
ret = wfx_hif_start(wvif, &vif->bss_conf, wvif->channel);
|
|
if (ret > 0)
|
|
return -EIO;
|
|
- wfx_set_mfp_ap(wvif);
|
|
- return ret;
|
|
+ return wfx_set_mfp_ap(wvif);
|
|
}
|
|
|
|
void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
|
|
index ed6d75d138c7a..e1d02b7c60294 100644
|
|
--- a/drivers/pci/pci.h
|
|
+++ b/drivers/pci/pci.h
|
|
@@ -274,7 +274,7 @@ void pci_bus_put(struct pci_bus *bus);
|
|
|
|
/* PCIe speed to Mb/s reduced by encoding overhead */
|
|
#define PCIE_SPEED2MBS_ENC(speed) \
|
|
- ((speed) == PCIE_SPEED_64_0GT ? 64000*128/130 : \
|
|
+ ((speed) == PCIE_SPEED_64_0GT ? 64000*1/1 : \
|
|
(speed) == PCIE_SPEED_32_0GT ? 32000*128/130 : \
|
|
(speed) == PCIE_SPEED_16_0GT ? 16000*128/130 : \
|
|
(speed) == PCIE_SPEED_8_0GT ? 8000*128/130 : \
|
|
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
|
|
index e2d8a74f83c34..5426f450ce919 100644
|
|
--- a/drivers/pci/pcie/aer.c
|
|
+++ b/drivers/pci/pcie/aer.c
|
|
@@ -748,7 +748,7 @@ static void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info)
|
|
u8 bus = info->id >> 8;
|
|
u8 devfn = info->id & 0xff;
|
|
|
|
- pci_info(dev, "%s%s error received: %04x:%02x:%02x.%d\n",
|
|
+ pci_info(dev, "%s%s error message received from %04x:%02x:%02x.%d\n",
|
|
info->multi_error_valid ? "Multiple " : "",
|
|
aer_error_severity_string[info->severity],
|
|
pci_domain_nr(dev->bus), bus, PCI_SLOT(devfn),
|
|
@@ -936,7 +936,12 @@ static bool find_source_device(struct pci_dev *parent,
|
|
pci_walk_bus(parent->subordinate, find_device_iter, e_info);
|
|
|
|
if (!e_info->error_dev_num) {
|
|
- pci_info(parent, "can't find device of ID%04x\n", e_info->id);
|
|
+ u8 bus = e_info->id >> 8;
|
|
+ u8 devfn = e_info->id & 0xff;
|
|
+
|
|
+ pci_info(parent, "found no error details for %04x:%02x:%02x.%d\n",
|
|
+ pci_domain_nr(parent->bus), bus, PCI_SLOT(devfn),
|
|
+ PCI_FUNC(devfn));
|
|
return false;
|
|
}
|
|
return true;
|
|
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
|
index 8765544bac35c..51d634fbdfb8e 100644
|
|
--- a/drivers/pci/quirks.c
|
|
+++ b/drivers/pci/quirks.c
|
|
@@ -607,10 +607,13 @@ static void quirk_amd_dwc_class(struct pci_dev *pdev)
|
|
{
|
|
u32 class = pdev->class;
|
|
|
|
- /* Use "USB Device (not host controller)" class */
|
|
- pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
|
|
- pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
|
|
- class, pdev->class);
|
|
+ if (class != PCI_CLASS_SERIAL_USB_DEVICE) {
|
|
+ /* Use "USB Device (not host controller)" class */
|
|
+ pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
|
|
+ pci_info(pdev,
|
|
+ "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
|
|
+ class, pdev->class);
|
|
+ }
|
|
}
|
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB,
|
|
quirk_amd_dwc_class);
|
|
@@ -3691,6 +3694,19 @@ static void quirk_no_pm_reset(struct pci_dev *dev)
|
|
DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_ATI, PCI_ANY_ID,
|
|
PCI_CLASS_DISPLAY_VGA, 8, quirk_no_pm_reset);
|
|
|
|
+/*
|
|
+ * Spectrum-{1,2,3,4} devices report that a D3hot->D0 transition causes a reset
|
|
+ * (i.e., they advertise NoSoftRst-). However, this transition does not have
|
|
+ * any effect on the device: It continues to be operational and network ports
|
|
+ * remain up. Advertising this support makes it seem as if a PM reset is viable
|
|
+ * for these devices. Mark it as unavailable to skip it when testing reset
|
|
+ * methods.
|
|
+ */
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, 0xcb84, quirk_no_pm_reset);
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, 0xcf6c, quirk_no_pm_reset);
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, 0xcf70, quirk_no_pm_reset);
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, 0xcf80, quirk_no_pm_reset);
|
|
+
|
|
/*
|
|
* Thunderbolt controllers with broken MSI hotplug signaling:
|
|
* Entire 1st generation (Light Ridge, Eagle Ridge, Light Peak) and part
|
|
diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c
|
|
index 0c1faa6c1973a..3f3320d0a4f8f 100644
|
|
--- a/drivers/pci/switch/switchtec.c
|
|
+++ b/drivers/pci/switch/switchtec.c
|
|
@@ -1308,13 +1308,6 @@ static void stdev_release(struct device *dev)
|
|
{
|
|
struct switchtec_dev *stdev = to_stdev(dev);
|
|
|
|
- if (stdev->dma_mrpc) {
|
|
- iowrite32(0, &stdev->mmio_mrpc->dma_en);
|
|
- flush_wc_buf(stdev);
|
|
- writeq(0, &stdev->mmio_mrpc->dma_addr);
|
|
- dma_free_coherent(&stdev->pdev->dev, sizeof(*stdev->dma_mrpc),
|
|
- stdev->dma_mrpc, stdev->dma_mrpc_dma_addr);
|
|
- }
|
|
kfree(stdev);
|
|
}
|
|
|
|
@@ -1358,7 +1351,7 @@ static struct switchtec_dev *stdev_create(struct pci_dev *pdev)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
stdev->alive = true;
|
|
- stdev->pdev = pdev;
|
|
+ stdev->pdev = pci_dev_get(pdev);
|
|
INIT_LIST_HEAD(&stdev->mrpc_queue);
|
|
mutex_init(&stdev->mrpc_mutex);
|
|
stdev->mrpc_busy = 0;
|
|
@@ -1391,6 +1384,7 @@ static struct switchtec_dev *stdev_create(struct pci_dev *pdev)
|
|
return stdev;
|
|
|
|
err_put:
|
|
+ pci_dev_put(stdev->pdev);
|
|
put_device(&stdev->dev);
|
|
return ERR_PTR(rc);
|
|
}
|
|
@@ -1646,6 +1640,18 @@ static int switchtec_init_pci(struct switchtec_dev *stdev,
|
|
return 0;
|
|
}
|
|
|
|
+static void switchtec_exit_pci(struct switchtec_dev *stdev)
|
|
+{
|
|
+ if (stdev->dma_mrpc) {
|
|
+ iowrite32(0, &stdev->mmio_mrpc->dma_en);
|
|
+ flush_wc_buf(stdev);
|
|
+ writeq(0, &stdev->mmio_mrpc->dma_addr);
|
|
+ dma_free_coherent(&stdev->pdev->dev, sizeof(*stdev->dma_mrpc),
|
|
+ stdev->dma_mrpc, stdev->dma_mrpc_dma_addr);
|
|
+ stdev->dma_mrpc = NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
static int switchtec_pci_probe(struct pci_dev *pdev,
|
|
const struct pci_device_id *id)
|
|
{
|
|
@@ -1705,6 +1711,9 @@ static void switchtec_pci_remove(struct pci_dev *pdev)
|
|
ida_free(&switchtec_minor_ida, MINOR(stdev->dev.devt));
|
|
dev_info(&stdev->dev, "unregistered.\n");
|
|
stdev_kill(stdev);
|
|
+ switchtec_exit_pci(stdev);
|
|
+ pci_dev_put(stdev->pdev);
|
|
+ stdev->pdev = NULL;
|
|
put_device(&stdev->dev);
|
|
}
|
|
|
|
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
|
|
index 4f05f610391b0..c02ce0834c2cd 100644
|
|
--- a/drivers/pnp/pnpacpi/rsparser.c
|
|
+++ b/drivers/pnp/pnpacpi/rsparser.c
|
|
@@ -151,13 +151,13 @@ static int vendor_resource_matches(struct pnp_dev *dev,
|
|
static void pnpacpi_parse_allocated_vendor(struct pnp_dev *dev,
|
|
struct acpi_resource_vendor_typed *vendor)
|
|
{
|
|
- if (vendor_resource_matches(dev, vendor, &hp_ccsr_uuid, 16)) {
|
|
- u64 start, length;
|
|
+ struct { u64 start, length; } range;
|
|
|
|
- memcpy(&start, vendor->byte_data, sizeof(start));
|
|
- memcpy(&length, vendor->byte_data + 8, sizeof(length));
|
|
-
|
|
- pnp_add_mem_resource(dev, start, start + length - 1, 0);
|
|
+ if (vendor_resource_matches(dev, vendor, &hp_ccsr_uuid,
|
|
+ sizeof(range))) {
|
|
+ memcpy(&range, vendor->byte_data, sizeof(range));
|
|
+ pnp_add_mem_resource(dev, range.start, range.start +
|
|
+ range.length - 1, 0);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
|
|
index 34d3d82819064..c8702011b7613 100644
|
|
--- a/drivers/regulator/core.c
|
|
+++ b/drivers/regulator/core.c
|
|
@@ -2925,7 +2925,8 @@ static int _regulator_enable(struct regulator *regulator)
|
|
/* Fallthrough on positive return values - already enabled */
|
|
}
|
|
|
|
- rdev->use_count++;
|
|
+ if (regulator->enable_count == 1)
|
|
+ rdev->use_count++;
|
|
|
|
return 0;
|
|
|
|
@@ -3000,37 +3001,40 @@ static int _regulator_disable(struct regulator *regulator)
|
|
|
|
lockdep_assert_held_once(&rdev->mutex.base);
|
|
|
|
- if (WARN(rdev->use_count <= 0,
|
|
+ if (WARN(regulator->enable_count == 0,
|
|
"unbalanced disables for %s\n", rdev_get_name(rdev)))
|
|
return -EIO;
|
|
|
|
- /* are we the last user and permitted to disable ? */
|
|
- if (rdev->use_count == 1 &&
|
|
- (rdev->constraints && !rdev->constraints->always_on)) {
|
|
-
|
|
- /* we are last user */
|
|
- if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS)) {
|
|
- ret = _notifier_call_chain(rdev,
|
|
- REGULATOR_EVENT_PRE_DISABLE,
|
|
- NULL);
|
|
- if (ret & NOTIFY_STOP_MASK)
|
|
- return -EINVAL;
|
|
-
|
|
- ret = _regulator_do_disable(rdev);
|
|
- if (ret < 0) {
|
|
- rdev_err(rdev, "failed to disable: %pe\n", ERR_PTR(ret));
|
|
- _notifier_call_chain(rdev,
|
|
- REGULATOR_EVENT_ABORT_DISABLE,
|
|
+ if (regulator->enable_count == 1) {
|
|
+ /* disabling last enable_count from this regulator */
|
|
+ /* are we the last user and permitted to disable ? */
|
|
+ if (rdev->use_count == 1 &&
|
|
+ (rdev->constraints && !rdev->constraints->always_on)) {
|
|
+
|
|
+ /* we are last user */
|
|
+ if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS)) {
|
|
+ ret = _notifier_call_chain(rdev,
|
|
+ REGULATOR_EVENT_PRE_DISABLE,
|
|
+ NULL);
|
|
+ if (ret & NOTIFY_STOP_MASK)
|
|
+ return -EINVAL;
|
|
+
|
|
+ ret = _regulator_do_disable(rdev);
|
|
+ if (ret < 0) {
|
|
+ rdev_err(rdev, "failed to disable: %pe\n", ERR_PTR(ret));
|
|
+ _notifier_call_chain(rdev,
|
|
+ REGULATOR_EVENT_ABORT_DISABLE,
|
|
+ NULL);
|
|
+ return ret;
|
|
+ }
|
|
+ _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
|
|
NULL);
|
|
- return ret;
|
|
}
|
|
- _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
|
|
- NULL);
|
|
- }
|
|
|
|
- rdev->use_count = 0;
|
|
- } else if (rdev->use_count > 1) {
|
|
- rdev->use_count--;
|
|
+ rdev->use_count = 0;
|
|
+ } else if (rdev->use_count > 1) {
|
|
+ rdev->use_count--;
|
|
+ }
|
|
}
|
|
|
|
if (ret == 0)
|
|
diff --git a/drivers/regulator/ti-abb-regulator.c b/drivers/regulator/ti-abb-regulator.c
|
|
index 115345e9fdedc..82af27b0e4698 100644
|
|
--- a/drivers/regulator/ti-abb-regulator.c
|
|
+++ b/drivers/regulator/ti-abb-regulator.c
|
|
@@ -734,9 +734,25 @@ static int ti_abb_probe(struct platform_device *pdev)
|
|
return PTR_ERR(abb->setup_reg);
|
|
}
|
|
|
|
- abb->int_base = devm_platform_ioremap_resource_byname(pdev, "int-address");
|
|
- if (IS_ERR(abb->int_base))
|
|
- return PTR_ERR(abb->int_base);
|
|
+ pname = "int-address";
|
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname);
|
|
+ if (!res) {
|
|
+ dev_err(dev, "Missing '%s' IO resource\n", pname);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+ /*
|
|
+ * The MPU interrupt status register (PRM_IRQSTATUS_MPU) is
|
|
+ * shared between regulator-abb-{ivahd,dspeve,gpu} driver
|
|
+ * instances. Therefore use devm_ioremap() rather than
|
|
+ * devm_platform_ioremap_resource_byname() to avoid busy
|
|
+ * resource region conflicts.
|
|
+ */
|
|
+ abb->int_base = devm_ioremap(dev, res->start,
|
|
+ resource_size(res));
|
|
+ if (!abb->int_base) {
|
|
+ dev_err(dev, "Unable to map '%s'\n", pname);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
/* Map Optional resources */
|
|
pname = "efuse-address";
|
|
diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
|
|
index 0659aa2863ab0..86a8bd5324899 100644
|
|
--- a/drivers/s390/crypto/vfio_ap_ops.c
|
|
+++ b/drivers/s390/crypto/vfio_ap_ops.c
|
|
@@ -1742,6 +1742,7 @@ static ssize_t status_show(struct device *dev,
|
|
{
|
|
ssize_t nchars = 0;
|
|
struct vfio_ap_queue *q;
|
|
+ unsigned long apid, apqi;
|
|
struct ap_matrix_mdev *matrix_mdev;
|
|
struct ap_device *apdev = to_ap_dev(dev);
|
|
|
|
@@ -1749,8 +1750,21 @@ static ssize_t status_show(struct device *dev,
|
|
q = dev_get_drvdata(&apdev->device);
|
|
matrix_mdev = vfio_ap_mdev_for_queue(q);
|
|
|
|
+ /* If the queue is assigned to the matrix mediated device, then
|
|
+ * determine whether it is passed through to a guest; otherwise,
|
|
+ * indicate that it is unassigned.
|
|
+ */
|
|
if (matrix_mdev) {
|
|
- if (matrix_mdev->kvm)
|
|
+ apid = AP_QID_CARD(q->apqn);
|
|
+ apqi = AP_QID_QUEUE(q->apqn);
|
|
+ /*
|
|
+ * If the queue is passed through to the guest, then indicate
|
|
+ * that it is in use; otherwise, indicate that it is
|
|
+ * merely assigned to a matrix mediated device.
|
|
+ */
|
|
+ if (matrix_mdev->kvm &&
|
|
+ test_bit_inv(apid, matrix_mdev->shadow_apcb.apm) &&
|
|
+ test_bit_inv(apqi, matrix_mdev->shadow_apcb.aqm))
|
|
nchars = scnprintf(buf, PAGE_SIZE, "%s\n",
|
|
AP_QUEUE_IN_USE);
|
|
else
|
|
diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
|
|
index 07df255c4b1bd..b513d4d9c35a0 100644
|
|
--- a/drivers/scsi/arcmsr/arcmsr.h
|
|
+++ b/drivers/scsi/arcmsr/arcmsr.h
|
|
@@ -77,9 +77,13 @@ struct device_attribute;
|
|
#ifndef PCI_DEVICE_ID_ARECA_1203
|
|
#define PCI_DEVICE_ID_ARECA_1203 0x1203
|
|
#endif
|
|
+#ifndef PCI_DEVICE_ID_ARECA_1883
|
|
+#define PCI_DEVICE_ID_ARECA_1883 0x1883
|
|
+#endif
|
|
#ifndef PCI_DEVICE_ID_ARECA_1884
|
|
#define PCI_DEVICE_ID_ARECA_1884 0x1884
|
|
#endif
|
|
+#define PCI_DEVICE_ID_ARECA_1886_0 0x1886
|
|
#define PCI_DEVICE_ID_ARECA_1886 0x188A
|
|
#define ARCMSR_HOURS (1000 * 60 * 60 * 4)
|
|
#define ARCMSR_MINUTES (1000 * 60 * 60)
|
|
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
|
|
index d3fb8a9c1c392..fc9d4005830b0 100644
|
|
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
|
|
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
|
|
@@ -214,8 +214,12 @@ static struct pci_device_id arcmsr_device_id_table[] = {
|
|
.driver_data = ACB_ADAPTER_TYPE_A},
|
|
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1880),
|
|
.driver_data = ACB_ADAPTER_TYPE_C},
|
|
+ {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1883),
|
|
+ .driver_data = ACB_ADAPTER_TYPE_C},
|
|
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1884),
|
|
.driver_data = ACB_ADAPTER_TYPE_E},
|
|
+ {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1886_0),
|
|
+ .driver_data = ACB_ADAPTER_TYPE_F},
|
|
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1886),
|
|
.driver_data = ACB_ADAPTER_TYPE_F},
|
|
{0, 0}, /* Terminating entry */
|
|
@@ -4708,9 +4712,11 @@ static const char *arcmsr_info(struct Scsi_Host *host)
|
|
case PCI_DEVICE_ID_ARECA_1680:
|
|
case PCI_DEVICE_ID_ARECA_1681:
|
|
case PCI_DEVICE_ID_ARECA_1880:
|
|
+ case PCI_DEVICE_ID_ARECA_1883:
|
|
case PCI_DEVICE_ID_ARECA_1884:
|
|
type = "SAS/SATA";
|
|
break;
|
|
+ case PCI_DEVICE_ID_ARECA_1886_0:
|
|
case PCI_DEVICE_ID_ARECA_1886:
|
|
type = "NVMe/SAS/SATA";
|
|
break;
|
|
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
|
|
index 0c80ff9affa39..7ae56a2fe2325 100644
|
|
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
|
|
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
|
|
@@ -1565,6 +1565,11 @@ static irqreturn_t phy_up_v3_hw(int phy_no, struct hisi_hba *hisi_hba)
|
|
}
|
|
|
|
phy->port_id = port_id;
|
|
+ spin_lock(&phy->lock);
|
|
+ /* Delete timer and set phy_attached atomically */
|
|
+ del_timer(&phy->timer);
|
|
+ phy->phy_attached = 1;
|
|
+ spin_unlock(&phy->lock);
|
|
|
|
/*
|
|
* Call pm_runtime_get_noresume() which pairs with
|
|
@@ -1578,11 +1583,6 @@ static irqreturn_t phy_up_v3_hw(int phy_no, struct hisi_hba *hisi_hba)
|
|
|
|
res = IRQ_HANDLED;
|
|
|
|
- spin_lock(&phy->lock);
|
|
- /* Delete timer and set phy_attached atomically */
|
|
- del_timer(&phy->timer);
|
|
- phy->phy_attached = 1;
|
|
- spin_unlock(&phy->lock);
|
|
end:
|
|
if (phy->reset_completion)
|
|
complete(phy->reset_completion);
|
|
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
|
|
index 6370cdbfba08c..0f0732d56800d 100644
|
|
--- a/drivers/scsi/isci/request.c
|
|
+++ b/drivers/scsi/isci/request.c
|
|
@@ -3390,7 +3390,7 @@ static enum sci_status isci_io_request_build(struct isci_host *ihost,
|
|
return SCI_FAILURE;
|
|
}
|
|
|
|
- return SCI_SUCCESS;
|
|
+ return status;
|
|
}
|
|
|
|
static struct isci_request *isci_request_from_tag(struct isci_host *ihost, u16 tag)
|
|
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
|
|
index 945adca5e72fd..05be0810b5e31 100644
|
|
--- a/drivers/scsi/libfc/fc_fcp.c
|
|
+++ b/drivers/scsi/libfc/fc_fcp.c
|
|
@@ -265,6 +265,11 @@ static int fc_fcp_send_abort(struct fc_fcp_pkt *fsp)
|
|
if (!fsp->seq_ptr)
|
|
return -EINVAL;
|
|
|
|
+ if (fsp->state & FC_SRB_ABORT_PENDING) {
|
|
+ FC_FCP_DBG(fsp, "abort already pending\n");
|
|
+ return -EBUSY;
|
|
+ }
|
|
+
|
|
this_cpu_inc(fsp->lp->stats->FcpPktAborts);
|
|
|
|
fsp->state |= FC_SRB_ABORT_PENDING;
|
|
@@ -1671,7 +1676,7 @@ static void fc_fcp_rec_error(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
|
|
if (fsp->recov_retry++ < FC_MAX_RECOV_RETRY)
|
|
fc_fcp_rec(fsp);
|
|
else
|
|
- fc_fcp_recovery(fsp, FC_ERROR);
|
|
+ fc_fcp_recovery(fsp, FC_TIMED_OUT);
|
|
break;
|
|
}
|
|
fc_fcp_unlock_pkt(fsp);
|
|
@@ -1690,11 +1695,12 @@ static void fc_fcp_recovery(struct fc_fcp_pkt *fsp, u8 code)
|
|
fsp->status_code = code;
|
|
fsp->cdb_status = 0;
|
|
fsp->io_status = 0;
|
|
- /*
|
|
- * if this fails then we let the scsi command timer fire and
|
|
- * scsi-ml escalate.
|
|
- */
|
|
- fc_fcp_send_abort(fsp);
|
|
+ if (!fsp->cmd)
|
|
+ /*
|
|
+ * Only abort non-scsi commands; otherwise let the
|
|
+ * scsi command timer fire and scsi-ml escalate.
|
|
+ */
|
|
+ fc_fcp_send_abort(fsp);
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
|
|
index 664ac3069c4be..dc5ac3cc70f6d 100644
|
|
--- a/drivers/scsi/lpfc/lpfc.h
|
|
+++ b/drivers/scsi/lpfc/lpfc.h
|
|
@@ -33,6 +33,7 @@
|
|
struct lpfc_sli2_slim;
|
|
|
|
#define ELX_MODEL_NAME_SIZE 80
|
|
+#define ELX_FW_NAME_SIZE 84
|
|
|
|
#define LPFC_PCI_DEV_LP 0x1
|
|
#define LPFC_PCI_DEV_OC 0x2
|
|
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
|
|
index f59de61803dc8..1a0bafde34d86 100644
|
|
--- a/drivers/scsi/lpfc/lpfc_init.c
|
|
+++ b/drivers/scsi/lpfc/lpfc_init.c
|
|
@@ -14778,7 +14778,7 @@ out:
|
|
int
|
|
lpfc_sli4_request_firmware_update(struct lpfc_hba *phba, uint8_t fw_upgrade)
|
|
{
|
|
- uint8_t file_name[ELX_MODEL_NAME_SIZE];
|
|
+ char file_name[ELX_FW_NAME_SIZE] = {0};
|
|
int ret;
|
|
const struct firmware *fw;
|
|
|
|
@@ -14787,7 +14787,7 @@ lpfc_sli4_request_firmware_update(struct lpfc_hba *phba, uint8_t fw_upgrade)
|
|
LPFC_SLI_INTF_IF_TYPE_2)
|
|
return -EPERM;
|
|
|
|
- snprintf(file_name, ELX_MODEL_NAME_SIZE, "%s.grp", phba->ModelName);
|
|
+ scnprintf(file_name, sizeof(file_name), "%s.grp", phba->ModelName);
|
|
|
|
if (fw_upgrade == INT_FW_UPGRADE) {
|
|
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
|
diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c
|
|
index d2c7de804b998..41636c4c43af0 100644
|
|
--- a/drivers/scsi/mpi3mr/mpi3mr_fw.c
|
|
+++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c
|
|
@@ -1886,7 +1886,8 @@ static int mpi3mr_create_op_reply_q(struct mpi3mr_ioc *mrioc, u16 qidx)
|
|
|
|
reply_qid = qidx + 1;
|
|
op_reply_q->num_replies = MPI3MR_OP_REP_Q_QD;
|
|
- if (!mrioc->pdev->revision)
|
|
+ if ((mrioc->pdev->device == MPI3_MFGPAGE_DEVID_SAS4116) &&
|
|
+ !mrioc->pdev->revision)
|
|
op_reply_q->num_replies = MPI3MR_OP_REP_Q_QD4K;
|
|
op_reply_q->ci = 0;
|
|
op_reply_q->ephase = 1;
|
|
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
|
|
index 85f5b349c7e43..7a6b006e70c88 100644
|
|
--- a/drivers/scsi/mpi3mr/mpi3mr_os.c
|
|
+++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
|
|
@@ -4963,7 +4963,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
mpi3mr_init_drv_cmd(&mrioc->evtack_cmds[i],
|
|
MPI3MR_HOSTTAG_EVTACKCMD_MIN + i);
|
|
|
|
- if (pdev->revision)
|
|
+ if ((pdev->device == MPI3_MFGPAGE_DEVID_SAS4116) &&
|
|
+ !pdev->revision)
|
|
+ mrioc->enable_segqueue = false;
|
|
+ else
|
|
mrioc->enable_segqueue = true;
|
|
|
|
init_waitqueue_head(&mrioc->reset_waitq);
|
|
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
|
|
index 9a289d6f2e5ee..66290961c47c2 100644
|
|
--- a/drivers/scsi/scsi_error.c
|
|
+++ b/drivers/scsi/scsi_error.c
|
|
@@ -61,11 +61,11 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd);
|
|
static enum scsi_disposition scsi_try_to_abort_cmd(struct scsi_host_template *,
|
|
struct scsi_cmnd *);
|
|
|
|
-void scsi_eh_wakeup(struct Scsi_Host *shost)
|
|
+void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy)
|
|
{
|
|
lockdep_assert_held(shost->host_lock);
|
|
|
|
- if (scsi_host_busy(shost) == shost->host_failed) {
|
|
+ if (busy == shost->host_failed) {
|
|
trace_scsi_eh_wakeup(shost);
|
|
wake_up_process(shost->ehandler);
|
|
SCSI_LOG_ERROR_RECOVERY(5, shost_printk(KERN_INFO, shost,
|
|
@@ -88,7 +88,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)
|
|
if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 ||
|
|
scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) {
|
|
shost->host_eh_scheduled++;
|
|
- scsi_eh_wakeup(shost);
|
|
+ scsi_eh_wakeup(shost, scsi_host_busy(shost));
|
|
}
|
|
|
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
|
@@ -281,7 +281,7 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)
|
|
|
|
spin_lock_irqsave(shost->host_lock, flags);
|
|
shost->host_failed++;
|
|
- scsi_eh_wakeup(shost);
|
|
+ scsi_eh_wakeup(shost, scsi_host_busy(shost));
|
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
|
}
|
|
|
|
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
|
|
index d25e1c2472538..0e7e9f1e5a029 100644
|
|
--- a/drivers/scsi/scsi_lib.c
|
|
+++ b/drivers/scsi/scsi_lib.c
|
|
@@ -282,7 +282,7 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
|
|
if (unlikely(scsi_host_in_recovery(shost))) {
|
|
spin_lock_irqsave(shost->host_lock, flags);
|
|
if (shost->host_failed || shost->host_eh_scheduled)
|
|
- scsi_eh_wakeup(shost);
|
|
+ scsi_eh_wakeup(shost, scsi_host_busy(shost));
|
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
|
}
|
|
rcu_read_unlock();
|
|
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
|
|
index b14545acb40f5..9b5fb30e684be 100644
|
|
--- a/drivers/scsi/scsi_priv.h
|
|
+++ b/drivers/scsi/scsi_priv.h
|
|
@@ -86,7 +86,7 @@ extern void scmd_eh_abort_handler(struct work_struct *work);
|
|
extern enum blk_eh_timer_return scsi_timeout(struct request *req);
|
|
extern int scsi_error_handler(void *host);
|
|
extern enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *cmd);
|
|
-extern void scsi_eh_wakeup(struct Scsi_Host *shost);
|
|
+extern void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy);
|
|
extern void scsi_eh_scmd_add(struct scsi_cmnd *);
|
|
void scsi_eh_ready_devs(struct Scsi_Host *shost,
|
|
struct list_head *work_q,
|
|
diff --git a/drivers/soc/xilinx/xlnx_event_manager.c b/drivers/soc/xilinx/xlnx_event_manager.c
|
|
index f9d9b82b562da..8293cc40047fa 100644
|
|
--- a/drivers/soc/xilinx/xlnx_event_manager.c
|
|
+++ b/drivers/soc/xilinx/xlnx_event_manager.c
|
|
@@ -477,7 +477,7 @@ static void xlnx_call_notify_cb_handler(const u32 *payload)
|
|
}
|
|
}
|
|
if (!is_callback_found)
|
|
- pr_warn("Didn't find any registered callback for 0x%x 0x%x\n",
|
|
+ pr_warn("Unhandled SGI node 0x%x event 0x%x. Expected with Xen hypervisor\n",
|
|
payload[1], payload[2]);
|
|
}
|
|
|
|
@@ -555,7 +555,7 @@ static void xlnx_disable_percpu_irq(void *data)
|
|
static int xlnx_event_init_sgi(struct platform_device *pdev)
|
|
{
|
|
int ret = 0;
|
|
- int cpu = smp_processor_id();
|
|
+ int cpu;
|
|
/*
|
|
* IRQ related structures are used for the following:
|
|
* for each SGI interrupt ensure its mapped by GIC IRQ domain
|
|
@@ -592,9 +592,12 @@ static int xlnx_event_init_sgi(struct platform_device *pdev)
|
|
sgi_fwspec.param[0] = sgi_num;
|
|
virq_sgi = irq_create_fwspec_mapping(&sgi_fwspec);
|
|
|
|
+ cpu = get_cpu();
|
|
per_cpu(cpu_number1, cpu) = cpu;
|
|
ret = request_percpu_irq(virq_sgi, xlnx_event_handler, "xlnx_event_mgmt",
|
|
&cpu_number1);
|
|
+ put_cpu();
|
|
+
|
|
WARN_ON(ret);
|
|
if (ret) {
|
|
irq_dispose_mapping(virq_sgi);
|
|
diff --git a/drivers/spmi/spmi-mtk-pmif.c b/drivers/spmi/spmi-mtk-pmif.c
|
|
index 01e8851e639d5..bf8c0d4109b19 100644
|
|
--- a/drivers/spmi/spmi-mtk-pmif.c
|
|
+++ b/drivers/spmi/spmi-mtk-pmif.c
|
|
@@ -475,7 +475,7 @@ static int mtk_spmi_probe(struct platform_device *pdev)
|
|
for (i = 0; i < arb->nclks; i++)
|
|
arb->clks[i].id = pmif_clock_names[i];
|
|
|
|
- err = devm_clk_bulk_get(&pdev->dev, arb->nclks, arb->clks);
|
|
+ err = clk_bulk_get(&pdev->dev, arb->nclks, arb->clks);
|
|
if (err) {
|
|
dev_err(&pdev->dev, "Failed to get clocks: %d\n", err);
|
|
goto err_put_ctrl;
|
|
@@ -484,7 +484,7 @@ static int mtk_spmi_probe(struct platform_device *pdev)
|
|
err = clk_bulk_prepare_enable(arb->nclks, arb->clks);
|
|
if (err) {
|
|
dev_err(&pdev->dev, "Failed to enable clocks: %d\n", err);
|
|
- goto err_put_ctrl;
|
|
+ goto err_put_clks;
|
|
}
|
|
|
|
ctrl->cmd = pmif_arb_cmd;
|
|
@@ -510,6 +510,8 @@ static int mtk_spmi_probe(struct platform_device *pdev)
|
|
|
|
err_domain_remove:
|
|
clk_bulk_disable_unprepare(arb->nclks, arb->clks);
|
|
+err_put_clks:
|
|
+ clk_bulk_put(arb->nclks, arb->clks);
|
|
err_put_ctrl:
|
|
spmi_controller_put(ctrl);
|
|
return err;
|
|
@@ -521,6 +523,7 @@ static int mtk_spmi_remove(struct platform_device *pdev)
|
|
struct pmif *arb = spmi_controller_get_drvdata(ctrl);
|
|
|
|
clk_bulk_disable_unprepare(arb->nclks, arb->clks);
|
|
+ clk_bulk_put(arb->nclks, arb->clks);
|
|
spmi_controller_remove(ctrl);
|
|
spmi_controller_put(ctrl);
|
|
return 0;
|
|
diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c
|
|
index 8767c504b95dd..9d3b237304eae 100644
|
|
--- a/drivers/tty/tty_ioctl.c
|
|
+++ b/drivers/tty/tty_ioctl.c
|
|
@@ -859,7 +859,7 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
|
|
ret = -EFAULT;
|
|
return ret;
|
|
case TIOCSLCKTRMIOS:
|
|
- if (!capable(CAP_SYS_ADMIN))
|
|
+ if (!checkpoint_restore_ns_capable(&init_user_ns))
|
|
return -EPERM;
|
|
copy_termios_locked(real_tty, &kterm);
|
|
if (user_termios_to_kernel_termios(&kterm,
|
|
@@ -876,7 +876,7 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
|
|
ret = -EFAULT;
|
|
return ret;
|
|
case TIOCSLCKTRMIOS:
|
|
- if (!capable(CAP_SYS_ADMIN))
|
|
+ if (!checkpoint_restore_ns_capable(&init_user_ns))
|
|
return -EPERM;
|
|
copy_termios_locked(real_tty, &kterm);
|
|
if (user_termios_to_kernel_termios_1(&kterm,
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index 81c8f564cf878..4f181110d00db 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -47,12 +47,18 @@
|
|
#define USB_VENDOR_TEXAS_INSTRUMENTS 0x0451
|
|
#define USB_PRODUCT_TUSB8041_USB3 0x8140
|
|
#define USB_PRODUCT_TUSB8041_USB2 0x8142
|
|
-#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01
|
|
-#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02
|
|
+#define USB_VENDOR_MICROCHIP 0x0424
|
|
+#define USB_PRODUCT_USB4913 0x4913
|
|
+#define USB_PRODUCT_USB4914 0x4914
|
|
+#define USB_PRODUCT_USB4915 0x4915
|
|
+#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND BIT(0)
|
|
+#define HUB_QUIRK_DISABLE_AUTOSUSPEND BIT(1)
|
|
+#define HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL BIT(2)
|
|
|
|
#define USB_TP_TRANSMISSION_DELAY 40 /* ns */
|
|
#define USB_TP_TRANSMISSION_DELAY_MAX 65535 /* ns */
|
|
#define USB_PING_RESPONSE_TIME 400 /* ns */
|
|
+#define USB_REDUCE_FRAME_INTR_BINTERVAL 9
|
|
|
|
/* Protect struct usb_device->state and ->children members
|
|
* Note: Both are also protected by ->dev.sem, except that ->state can
|
|
@@ -1904,6 +1910,14 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|
usb_autopm_get_interface_no_resume(intf);
|
|
}
|
|
|
|
+ if ((id->driver_info & HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL) &&
|
|
+ desc->endpoint[0].desc.bInterval > USB_REDUCE_FRAME_INTR_BINTERVAL) {
|
|
+ desc->endpoint[0].desc.bInterval =
|
|
+ USB_REDUCE_FRAME_INTR_BINTERVAL;
|
|
+ /* Tell the HCD about the interrupt ep's new bInterval */
|
|
+ usb_set_interface(hdev, 0, 0);
|
|
+ }
|
|
+
|
|
if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) {
|
|
onboard_hub_create_pdevs(hdev, &hub->onboard_hub_devs);
|
|
|
|
@@ -5885,6 +5899,21 @@ static const struct usb_device_id hub_id_table[] = {
|
|
.idVendor = USB_VENDOR_TEXAS_INSTRUMENTS,
|
|
.idProduct = USB_PRODUCT_TUSB8041_USB3,
|
|
.driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND},
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
|
+ | USB_DEVICE_ID_MATCH_PRODUCT,
|
|
+ .idVendor = USB_VENDOR_MICROCHIP,
|
|
+ .idProduct = USB_PRODUCT_USB4913,
|
|
+ .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL},
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
|
+ | USB_DEVICE_ID_MATCH_PRODUCT,
|
|
+ .idVendor = USB_VENDOR_MICROCHIP,
|
|
+ .idProduct = USB_PRODUCT_USB4914,
|
|
+ .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL},
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
|
+ | USB_DEVICE_ID_MATCH_PRODUCT,
|
|
+ .idVendor = USB_VENDOR_MICROCHIP,
|
|
+ .idProduct = USB_PRODUCT_USB4915,
|
|
+ .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL},
|
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS,
|
|
.bDeviceClass = USB_CLASS_HUB},
|
|
{ .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
|
|
diff --git a/drivers/watchdog/it87_wdt.c b/drivers/watchdog/it87_wdt.c
|
|
index bb11229093966..843f9f8e39177 100644
|
|
--- a/drivers/watchdog/it87_wdt.c
|
|
+++ b/drivers/watchdog/it87_wdt.c
|
|
@@ -255,6 +255,7 @@ static struct watchdog_device wdt_dev = {
|
|
static int __init it87_wdt_init(void)
|
|
{
|
|
u8 chip_rev;
|
|
+ u8 ctrl;
|
|
int rc;
|
|
|
|
rc = superio_enter();
|
|
@@ -313,7 +314,18 @@ static int __init it87_wdt_init(void)
|
|
|
|
superio_select(GPIO);
|
|
superio_outb(WDT_TOV1, WDTCFG);
|
|
- superio_outb(0x00, WDTCTRL);
|
|
+
|
|
+ switch (chip_type) {
|
|
+ case IT8784_ID:
|
|
+ case IT8786_ID:
|
|
+ ctrl = superio_inb(WDTCTRL);
|
|
+ ctrl &= 0x08;
|
|
+ superio_outb(ctrl, WDTCTRL);
|
|
+ break;
|
|
+ default:
|
|
+ superio_outb(0x00, WDTCTRL);
|
|
+ }
|
|
+
|
|
superio_exit();
|
|
|
|
if (timeout < 1 || timeout > max_units * 60) {
|
|
diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c
|
|
index 940e5e9e8a54a..335451309566a 100644
|
|
--- a/drivers/xen/gntdev-dmabuf.c
|
|
+++ b/drivers/xen/gntdev-dmabuf.c
|
|
@@ -11,6 +11,7 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/dma-buf.h>
|
|
+#include <linux/dma-direct.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/types.h>
|
|
#include <linux/uaccess.h>
|
|
@@ -50,7 +51,7 @@ struct gntdev_dmabuf {
|
|
|
|
/* Number of pages this buffer has. */
|
|
int nr_pages;
|
|
- /* Pages of this buffer. */
|
|
+ /* Pages of this buffer (only for dma-buf export). */
|
|
struct page **pages;
|
|
};
|
|
|
|
@@ -484,7 +485,7 @@ out:
|
|
/* DMA buffer import support. */
|
|
|
|
static int
|
|
-dmabuf_imp_grant_foreign_access(struct page **pages, u32 *refs,
|
|
+dmabuf_imp_grant_foreign_access(unsigned long *gfns, u32 *refs,
|
|
int count, int domid)
|
|
{
|
|
grant_ref_t priv_gref_head;
|
|
@@ -507,7 +508,7 @@ dmabuf_imp_grant_foreign_access(struct page **pages, u32 *refs,
|
|
}
|
|
|
|
gnttab_grant_foreign_access_ref(cur_ref, domid,
|
|
- xen_page_to_gfn(pages[i]), 0);
|
|
+ gfns[i], 0);
|
|
refs[i] = cur_ref;
|
|
}
|
|
|
|
@@ -529,7 +530,6 @@ static void dmabuf_imp_end_foreign_access(u32 *refs, int count)
|
|
|
|
static void dmabuf_imp_free_storage(struct gntdev_dmabuf *gntdev_dmabuf)
|
|
{
|
|
- kfree(gntdev_dmabuf->pages);
|
|
kfree(gntdev_dmabuf->u.imp.refs);
|
|
kfree(gntdev_dmabuf);
|
|
}
|
|
@@ -549,12 +549,6 @@ static struct gntdev_dmabuf *dmabuf_imp_alloc_storage(int count)
|
|
if (!gntdev_dmabuf->u.imp.refs)
|
|
goto fail;
|
|
|
|
- gntdev_dmabuf->pages = kcalloc(count,
|
|
- sizeof(gntdev_dmabuf->pages[0]),
|
|
- GFP_KERNEL);
|
|
- if (!gntdev_dmabuf->pages)
|
|
- goto fail;
|
|
-
|
|
gntdev_dmabuf->nr_pages = count;
|
|
|
|
for (i = 0; i < count; i++)
|
|
@@ -576,7 +570,8 @@ dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev,
|
|
struct dma_buf *dma_buf;
|
|
struct dma_buf_attachment *attach;
|
|
struct sg_table *sgt;
|
|
- struct sg_page_iter sg_iter;
|
|
+ struct sg_dma_page_iter sg_iter;
|
|
+ unsigned long *gfns;
|
|
int i;
|
|
|
|
dma_buf = dma_buf_get(fd);
|
|
@@ -624,26 +619,31 @@ dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev,
|
|
|
|
gntdev_dmabuf->u.imp.sgt = sgt;
|
|
|
|
- /* Now convert sgt to array of pages and check for page validity. */
|
|
+ gfns = kcalloc(count, sizeof(*gfns), GFP_KERNEL);
|
|
+ if (!gfns) {
|
|
+ ret = ERR_PTR(-ENOMEM);
|
|
+ goto fail_unmap;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Now convert sgt to array of gfns without accessing underlying pages.
|
|
+ * It is not allowed to access the underlying struct page of an sg table
|
|
+ * exported by DMA-buf, but since we deal with special Xen dma device here
|
|
+ * (not a normal physical one) look at the dma addresses in the sg table
|
|
+ * and then calculate gfns directly from them.
|
|
+ */
|
|
i = 0;
|
|
- for_each_sgtable_page(sgt, &sg_iter, 0) {
|
|
- struct page *page = sg_page_iter_page(&sg_iter);
|
|
- /*
|
|
- * Check if page is valid: this can happen if we are given
|
|
- * a page from VRAM or other resources which are not backed
|
|
- * by a struct page.
|
|
- */
|
|
- if (!pfn_valid(page_to_pfn(page))) {
|
|
- ret = ERR_PTR(-EINVAL);
|
|
- goto fail_unmap;
|
|
- }
|
|
+ for_each_sgtable_dma_page(sgt, &sg_iter, 0) {
|
|
+ dma_addr_t addr = sg_page_iter_dma_address(&sg_iter);
|
|
+ unsigned long pfn = bfn_to_pfn(XEN_PFN_DOWN(dma_to_phys(dev, addr)));
|
|
|
|
- gntdev_dmabuf->pages[i++] = page;
|
|
+ gfns[i++] = pfn_to_gfn(pfn);
|
|
}
|
|
|
|
- ret = ERR_PTR(dmabuf_imp_grant_foreign_access(gntdev_dmabuf->pages,
|
|
+ ret = ERR_PTR(dmabuf_imp_grant_foreign_access(gfns,
|
|
gntdev_dmabuf->u.imp.refs,
|
|
count, domid));
|
|
+ kfree(gfns);
|
|
if (IS_ERR(ret))
|
|
goto fail_end_access;
|
|
|
|
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h
|
|
index bc417da7e9c1d..633fe4f527b84 100644
|
|
--- a/fs/9p/v9fs_vfs.h
|
|
+++ b/fs/9p/v9fs_vfs.h
|
|
@@ -46,6 +46,7 @@ struct inode *v9fs_alloc_inode(struct super_block *sb);
|
|
void v9fs_free_inode(struct inode *inode);
|
|
struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode,
|
|
dev_t rdev);
|
|
+void v9fs_set_netfs_context(struct inode *inode);
|
|
int v9fs_init_inode(struct v9fs_session_info *v9ses,
|
|
struct inode *inode, umode_t mode, dev_t rdev);
|
|
void v9fs_evict_inode(struct inode *inode);
|
|
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
|
|
index 4d1a4a8d92772..5e2657c1dbbe6 100644
|
|
--- a/fs/9p/vfs_inode.c
|
|
+++ b/fs/9p/vfs_inode.c
|
|
@@ -250,7 +250,7 @@ void v9fs_free_inode(struct inode *inode)
|
|
/*
|
|
* Set parameters for the netfs library
|
|
*/
|
|
-static void v9fs_set_netfs_context(struct inode *inode)
|
|
+void v9fs_set_netfs_context(struct inode *inode)
|
|
{
|
|
struct v9fs_inode *v9inode = V9FS_I(inode);
|
|
netfs_inode_init(&v9inode->netfs, &v9fs_req_ops);
|
|
@@ -344,8 +344,6 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses,
|
|
err = -EINVAL;
|
|
goto error;
|
|
}
|
|
-
|
|
- v9fs_set_netfs_context(inode);
|
|
error:
|
|
return err;
|
|
|
|
@@ -377,6 +375,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)
|
|
iput(inode);
|
|
return ERR_PTR(err);
|
|
}
|
|
+ v9fs_set_netfs_context(inode);
|
|
return inode;
|
|
}
|
|
|
|
@@ -479,6 +478,7 @@ static struct inode *v9fs_qid_iget(struct super_block *sb,
|
|
goto error;
|
|
|
|
v9fs_stat2inode(st, inode, sb, 0);
|
|
+ v9fs_set_netfs_context(inode);
|
|
v9fs_cache_inode_get_cookie(inode);
|
|
unlock_new_inode(inode);
|
|
return inode;
|
|
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
|
|
index 5cfa4b4f070f4..e15ad46833e05 100644
|
|
--- a/fs/9p/vfs_inode_dotl.c
|
|
+++ b/fs/9p/vfs_inode_dotl.c
|
|
@@ -130,6 +130,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block *sb,
|
|
goto error;
|
|
|
|
v9fs_stat2inode_dotl(st, inode, 0);
|
|
+ v9fs_set_netfs_context(inode);
|
|
v9fs_cache_inode_get_cookie(inode);
|
|
retval = v9fs_get_acl(inode, fid);
|
|
if (retval)
|
|
diff --git a/fs/afs/callback.c b/fs/afs/callback.c
|
|
index a484fa6428081..90f9b2a46ff48 100644
|
|
--- a/fs/afs/callback.c
|
|
+++ b/fs/afs/callback.c
|
|
@@ -110,13 +110,14 @@ static struct afs_volume *afs_lookup_volume_rcu(struct afs_cell *cell,
|
|
{
|
|
struct afs_volume *volume = NULL;
|
|
struct rb_node *p;
|
|
- int seq = 0;
|
|
+ int seq = 1;
|
|
|
|
do {
|
|
/* Unfortunately, rbtree walking doesn't give reliable results
|
|
* under just the RCU read lock, so we have to check for
|
|
* changes.
|
|
*/
|
|
+ seq++; /* 2 on the 1st/lockless path, otherwise odd */
|
|
read_seqbegin_or_lock(&cell->volume_lock, &seq);
|
|
|
|
p = rcu_dereference_raw(cell->volumes.rb_node);
|
|
diff --git a/fs/afs/server.c b/fs/afs/server.c
|
|
index b5237206eac3e..0bd2f5ba6900c 100644
|
|
--- a/fs/afs/server.c
|
|
+++ b/fs/afs/server.c
|
|
@@ -27,7 +27,7 @@ struct afs_server *afs_find_server(struct afs_net *net,
|
|
const struct afs_addr_list *alist;
|
|
struct afs_server *server = NULL;
|
|
unsigned int i;
|
|
- int seq = 0, diff;
|
|
+ int seq = 1, diff;
|
|
|
|
rcu_read_lock();
|
|
|
|
@@ -35,6 +35,7 @@ struct afs_server *afs_find_server(struct afs_net *net,
|
|
if (server)
|
|
afs_unuse_server_notime(net, server, afs_server_trace_put_find_rsq);
|
|
server = NULL;
|
|
+ seq++; /* 2 on the 1st/lockless path, otherwise odd */
|
|
read_seqbegin_or_lock(&net->fs_addr_lock, &seq);
|
|
|
|
if (srx->transport.family == AF_INET6) {
|
|
@@ -90,7 +91,7 @@ struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uu
|
|
{
|
|
struct afs_server *server = NULL;
|
|
struct rb_node *p;
|
|
- int diff, seq = 0;
|
|
+ int diff, seq = 1;
|
|
|
|
_enter("%pU", uuid);
|
|
|
|
@@ -102,7 +103,7 @@ struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uu
|
|
if (server)
|
|
afs_unuse_server(net, server, afs_server_trace_put_uuid_rsq);
|
|
server = NULL;
|
|
-
|
|
+ seq++; /* 2 on the 1st/lockless path, otherwise odd */
|
|
read_seqbegin_or_lock(&net->fs_lock, &seq);
|
|
|
|
p = net->fs_servers.rb_node;
|
|
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
|
|
index 36052a3626830..111938a6307e6 100644
|
|
--- a/fs/ceph/caps.c
|
|
+++ b/fs/ceph/caps.c
|
|
@@ -4597,12 +4597,14 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,
|
|
struct inode *dir,
|
|
int mds, int drop, int unless)
|
|
{
|
|
- struct dentry *parent = NULL;
|
|
struct ceph_mds_request_release *rel = *p;
|
|
struct ceph_dentry_info *di = ceph_dentry(dentry);
|
|
int force = 0;
|
|
int ret;
|
|
|
|
+ /* This shouldn't happen */
|
|
+ BUG_ON(!dir);
|
|
+
|
|
/*
|
|
* force an record for the directory caps if we have a dentry lease.
|
|
* this is racy (can't take i_ceph_lock and d_lock together), but it
|
|
@@ -4612,14 +4614,9 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,
|
|
spin_lock(&dentry->d_lock);
|
|
if (di->lease_session && di->lease_session->s_mds == mds)
|
|
force = 1;
|
|
- if (!dir) {
|
|
- parent = dget(dentry->d_parent);
|
|
- dir = d_inode(parent);
|
|
- }
|
|
spin_unlock(&dentry->d_lock);
|
|
|
|
ret = ceph_encode_inode_release(p, dir, mds, drop, unless, force);
|
|
- dput(parent);
|
|
|
|
spin_lock(&dentry->d_lock);
|
|
if (ret && di->lease_session && di->lease_session->s_mds == mds) {
|
|
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
|
|
index 82874be945248..da9fcf48ab6c0 100644
|
|
--- a/fs/ceph/mds_client.c
|
|
+++ b/fs/ceph/mds_client.c
|
|
@@ -3650,11 +3650,11 @@ static void handle_session(struct ceph_mds_session *session,
|
|
if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
|
|
pr_info("mds%d reconnect success\n", session->s_mds);
|
|
|
|
+ session->s_features = features;
|
|
if (session->s_state == CEPH_MDS_SESSION_OPEN) {
|
|
pr_notice("mds%d is already opened\n", session->s_mds);
|
|
} else {
|
|
session->s_state = CEPH_MDS_SESSION_OPEN;
|
|
- session->s_features = features;
|
|
renewed_caps(mdsc, session, 0);
|
|
if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT,
|
|
&session->s_features))
|
|
diff --git a/fs/ceph/quota.c b/fs/ceph/quota.c
|
|
index f7fcf7f08ec64..ca4932e6f71bf 100644
|
|
--- a/fs/ceph/quota.c
|
|
+++ b/fs/ceph/quota.c
|
|
@@ -194,10 +194,10 @@ void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc)
|
|
}
|
|
|
|
/*
|
|
- * This function walks through the snaprealm for an inode and returns the
|
|
- * ceph_snap_realm for the first snaprealm that has quotas set (max_files,
|
|
+ * This function walks through the snaprealm for an inode and set the
|
|
+ * realmp with the first snaprealm that has quotas set (max_files,
|
|
* max_bytes, or any, depending on the 'which_quota' argument). If the root is
|
|
- * reached, return the root ceph_snap_realm instead.
|
|
+ * reached, set the realmp with the root ceph_snap_realm instead.
|
|
*
|
|
* Note that the caller is responsible for calling ceph_put_snap_realm() on the
|
|
* returned realm.
|
|
@@ -208,18 +208,19 @@ void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc)
|
|
* this function will return -EAGAIN; otherwise, the snaprealms walk-through
|
|
* will be restarted.
|
|
*/
|
|
-static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,
|
|
- struct inode *inode,
|
|
- enum quota_get_realm which_quota,
|
|
- bool retry)
|
|
+static int get_quota_realm(struct ceph_mds_client *mdsc, struct inode *inode,
|
|
+ enum quota_get_realm which_quota,
|
|
+ struct ceph_snap_realm **realmp, bool retry)
|
|
{
|
|
struct ceph_inode_info *ci = NULL;
|
|
struct ceph_snap_realm *realm, *next;
|
|
struct inode *in;
|
|
bool has_quota;
|
|
|
|
+ if (realmp)
|
|
+ *realmp = NULL;
|
|
if (ceph_snap(inode) != CEPH_NOSNAP)
|
|
- return NULL;
|
|
+ return 0;
|
|
|
|
restart:
|
|
realm = ceph_inode(inode)->i_snap_realm;
|
|
@@ -245,7 +246,7 @@ restart:
|
|
break;
|
|
ceph_put_snap_realm(mdsc, realm);
|
|
if (!retry)
|
|
- return ERR_PTR(-EAGAIN);
|
|
+ return -EAGAIN;
|
|
goto restart;
|
|
}
|
|
|
|
@@ -254,8 +255,11 @@ restart:
|
|
iput(in);
|
|
|
|
next = realm->parent;
|
|
- if (has_quota || !next)
|
|
- return realm;
|
|
+ if (has_quota || !next) {
|
|
+ if (realmp)
|
|
+ *realmp = realm;
|
|
+ return 0;
|
|
+ }
|
|
|
|
ceph_get_snap_realm(mdsc, next);
|
|
ceph_put_snap_realm(mdsc, realm);
|
|
@@ -264,7 +268,7 @@ restart:
|
|
if (realm)
|
|
ceph_put_snap_realm(mdsc, realm);
|
|
|
|
- return NULL;
|
|
+ return 0;
|
|
}
|
|
|
|
bool ceph_quota_is_same_realm(struct inode *old, struct inode *new)
|
|
@@ -272,6 +276,7 @@ bool ceph_quota_is_same_realm(struct inode *old, struct inode *new)
|
|
struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(old->i_sb);
|
|
struct ceph_snap_realm *old_realm, *new_realm;
|
|
bool is_same;
|
|
+ int ret;
|
|
|
|
restart:
|
|
/*
|
|
@@ -281,9 +286,9 @@ restart:
|
|
* dropped and we can then restart the whole operation.
|
|
*/
|
|
down_read(&mdsc->snap_rwsem);
|
|
- old_realm = get_quota_realm(mdsc, old, QUOTA_GET_ANY, true);
|
|
- new_realm = get_quota_realm(mdsc, new, QUOTA_GET_ANY, false);
|
|
- if (PTR_ERR(new_realm) == -EAGAIN) {
|
|
+ get_quota_realm(mdsc, old, QUOTA_GET_ANY, &old_realm, true);
|
|
+ ret = get_quota_realm(mdsc, new, QUOTA_GET_ANY, &new_realm, false);
|
|
+ if (ret == -EAGAIN) {
|
|
up_read(&mdsc->snap_rwsem);
|
|
if (old_realm)
|
|
ceph_put_snap_realm(mdsc, old_realm);
|
|
@@ -485,8 +490,8 @@ bool ceph_quota_update_statfs(struct ceph_fs_client *fsc, struct kstatfs *buf)
|
|
bool is_updated = false;
|
|
|
|
down_read(&mdsc->snap_rwsem);
|
|
- realm = get_quota_realm(mdsc, d_inode(fsc->sb->s_root),
|
|
- QUOTA_GET_MAX_BYTES, true);
|
|
+ get_quota_realm(mdsc, d_inode(fsc->sb->s_root), QUOTA_GET_MAX_BYTES,
|
|
+ &realm, true);
|
|
up_read(&mdsc->snap_rwsem);
|
|
if (!realm)
|
|
return false;
|
|
diff --git a/fs/dcache.c b/fs/dcache.c
|
|
index 52e6d5fdab6bd..b09bc88dbbec7 100644
|
|
--- a/fs/dcache.c
|
|
+++ b/fs/dcache.c
|
|
@@ -787,12 +787,12 @@ static inline bool fast_dput(struct dentry *dentry)
|
|
*/
|
|
if (unlikely(ret < 0)) {
|
|
spin_lock(&dentry->d_lock);
|
|
- if (dentry->d_lockref.count > 1) {
|
|
- dentry->d_lockref.count--;
|
|
+ if (WARN_ON_ONCE(dentry->d_lockref.count <= 0)) {
|
|
spin_unlock(&dentry->d_lock);
|
|
return true;
|
|
}
|
|
- return false;
|
|
+ dentry->d_lockref.count--;
|
|
+ goto locked;
|
|
}
|
|
|
|
/*
|
|
@@ -850,6 +850,7 @@ static inline bool fast_dput(struct dentry *dentry)
|
|
* else could have killed it and marked it dead. Either way, we
|
|
* don't need to do anything else.
|
|
*/
|
|
+locked:
|
|
if (dentry->d_lockref.count) {
|
|
spin_unlock(&dentry->d_lock);
|
|
return true;
|
|
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
|
|
index c214fe0981bdc..55340ac61456c 100644
|
|
--- a/fs/ecryptfs/inode.c
|
|
+++ b/fs/ecryptfs/inode.c
|
|
@@ -76,6 +76,14 @@ static struct inode *__ecryptfs_get_inode(struct inode *lower_inode,
|
|
|
|
if (lower_inode->i_sb != ecryptfs_superblock_to_lower(sb))
|
|
return ERR_PTR(-EXDEV);
|
|
+
|
|
+ /* Reject dealing with casefold directories. */
|
|
+ if (IS_CASEFOLDED(lower_inode)) {
|
|
+ pr_err_ratelimited("%s: Can't handle casefolded directory.\n",
|
|
+ __func__);
|
|
+ return ERR_PTR(-EREMOTE);
|
|
+ }
|
|
+
|
|
if (!igrab(lower_inode))
|
|
return ERR_PTR(-ESTALE);
|
|
inode = iget5_locked(sb, (unsigned long)lower_inode,
|
|
diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
|
|
index cf9a2fa7f55d2..47e71964eeff8 100644
|
|
--- a/fs/erofs/zdata.c
|
|
+++ b/fs/erofs/zdata.c
|
|
@@ -652,7 +652,6 @@ static int z_erofs_register_pcluster(struct z_erofs_decompress_frontend *fe)
|
|
|
|
if (ztailpacking) {
|
|
pcl->obj.index = 0; /* which indicates ztailpacking */
|
|
- pcl->pageofs_in = erofs_blkoff(map->m_pa);
|
|
pcl->tailpacking_size = map->m_plen;
|
|
} else {
|
|
pcl->obj.index = map->m_pa >> PAGE_SHIFT;
|
|
@@ -852,6 +851,7 @@ repeat:
|
|
get_page(fe->map.buf.page);
|
|
WRITE_ONCE(fe->pcl->compressed_bvecs[0].page,
|
|
fe->map.buf.page);
|
|
+ fe->pcl->pageofs_in = map->m_pa & ~PAGE_MASK;
|
|
fe->mode = Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE;
|
|
} else {
|
|
/* bind cache first when cached decompression is preferred */
|
|
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
|
|
index 33be702d6e380..c1515daf1def1 100644
|
|
--- a/fs/ext4/mballoc.c
|
|
+++ b/fs/ext4/mballoc.c
|
|
@@ -6444,13 +6444,15 @@ static int ext4_try_to_trim_range(struct super_block *sb,
|
|
__acquires(ext4_group_lock_ptr(sb, e4b->bd_group))
|
|
__releases(ext4_group_lock_ptr(sb, e4b->bd_group))
|
|
{
|
|
- ext4_grpblk_t next, count, free_count;
|
|
+ ext4_grpblk_t next, count, free_count, last, origin_start;
|
|
bool set_trimmed = false;
|
|
void *bitmap;
|
|
|
|
+ last = ext4_last_grp_cluster(sb, e4b->bd_group);
|
|
bitmap = e4b->bd_bitmap;
|
|
- if (start == 0 && max >= ext4_last_grp_cluster(sb, e4b->bd_group))
|
|
+ if (start == 0 && max >= last)
|
|
set_trimmed = true;
|
|
+ origin_start = start;
|
|
start = max(e4b->bd_info->bb_first_free, start);
|
|
count = 0;
|
|
free_count = 0;
|
|
@@ -6459,7 +6461,10 @@ __releases(ext4_group_lock_ptr(sb, e4b->bd_group))
|
|
start = mb_find_next_zero_bit(bitmap, max + 1, start);
|
|
if (start > max)
|
|
break;
|
|
- next = mb_find_next_bit(bitmap, max + 1, start);
|
|
+
|
|
+ next = mb_find_next_bit(bitmap, last + 1, start);
|
|
+ if (origin_start == 0 && next >= last)
|
|
+ set_trimmed = true;
|
|
|
|
if ((next - start) >= minblocks) {
|
|
int ret = ext4_trim_extent(sb, start, next - start, e4b);
|
|
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
|
|
index 9833ab6db117c..f2ed15af703a8 100644
|
|
--- a/fs/ext4/resize.c
|
|
+++ b/fs/ext4/resize.c
|
|
@@ -231,17 +231,24 @@ struct ext4_new_flex_group_data {
|
|
in the flex group */
|
|
__u16 *bg_flags; /* block group flags of groups
|
|
in @groups */
|
|
+ ext4_group_t resize_bg; /* number of allocated
|
|
+ new_group_data */
|
|
ext4_group_t count; /* number of groups in @groups
|
|
*/
|
|
};
|
|
|
|
+/*
|
|
+ * Avoiding memory allocation failures due to too many groups added each time.
|
|
+ */
|
|
+#define MAX_RESIZE_BG 16384
|
|
+
|
|
/*
|
|
* alloc_flex_gd() allocates a ext4_new_flex_group_data with size of
|
|
* @flexbg_size.
|
|
*
|
|
* Returns NULL on failure otherwise address of the allocated structure.
|
|
*/
|
|
-static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned long flexbg_size)
|
|
+static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned int flexbg_size)
|
|
{
|
|
struct ext4_new_flex_group_data *flex_gd;
|
|
|
|
@@ -249,17 +256,18 @@ static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned long flexbg_size)
|
|
if (flex_gd == NULL)
|
|
goto out3;
|
|
|
|
- if (flexbg_size >= UINT_MAX / sizeof(struct ext4_new_group_data))
|
|
- goto out2;
|
|
- flex_gd->count = flexbg_size;
|
|
+ if (unlikely(flexbg_size > MAX_RESIZE_BG))
|
|
+ flex_gd->resize_bg = MAX_RESIZE_BG;
|
|
+ else
|
|
+ flex_gd->resize_bg = flexbg_size;
|
|
|
|
- flex_gd->groups = kmalloc_array(flexbg_size,
|
|
+ flex_gd->groups = kmalloc_array(flex_gd->resize_bg,
|
|
sizeof(struct ext4_new_group_data),
|
|
GFP_NOFS);
|
|
if (flex_gd->groups == NULL)
|
|
goto out2;
|
|
|
|
- flex_gd->bg_flags = kmalloc_array(flexbg_size, sizeof(__u16),
|
|
+ flex_gd->bg_flags = kmalloc_array(flex_gd->resize_bg, sizeof(__u16),
|
|
GFP_NOFS);
|
|
if (flex_gd->bg_flags == NULL)
|
|
goto out1;
|
|
@@ -296,7 +304,7 @@ static void free_flex_gd(struct ext4_new_flex_group_data *flex_gd)
|
|
*/
|
|
static int ext4_alloc_group_tables(struct super_block *sb,
|
|
struct ext4_new_flex_group_data *flex_gd,
|
|
- int flexbg_size)
|
|
+ unsigned int flexbg_size)
|
|
{
|
|
struct ext4_new_group_data *group_data = flex_gd->groups;
|
|
ext4_fsblk_t start_blk;
|
|
@@ -397,12 +405,12 @@ next_group:
|
|
group = group_data[0].group;
|
|
|
|
printk(KERN_DEBUG "EXT4-fs: adding a flex group with "
|
|
- "%d groups, flexbg size is %d:\n", flex_gd->count,
|
|
+ "%u groups, flexbg size is %u:\n", flex_gd->count,
|
|
flexbg_size);
|
|
|
|
for (i = 0; i < flex_gd->count; i++) {
|
|
ext4_debug(
|
|
- "adding %s group %u: %u blocks (%d free, %d mdata blocks)\n",
|
|
+ "adding %s group %u: %u blocks (%u free, %u mdata blocks)\n",
|
|
ext4_bg_has_super(sb, group + i) ? "normal" :
|
|
"no-super", group + i,
|
|
group_data[i].blocks_count,
|
|
@@ -1623,8 +1631,7 @@ exit:
|
|
|
|
static int ext4_setup_next_flex_gd(struct super_block *sb,
|
|
struct ext4_new_flex_group_data *flex_gd,
|
|
- ext4_fsblk_t n_blocks_count,
|
|
- unsigned long flexbg_size)
|
|
+ ext4_fsblk_t n_blocks_count)
|
|
{
|
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
struct ext4_super_block *es = sbi->s_es;
|
|
@@ -1648,7 +1655,7 @@ static int ext4_setup_next_flex_gd(struct super_block *sb,
|
|
BUG_ON(last);
|
|
ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &last);
|
|
|
|
- last_group = group | (flexbg_size - 1);
|
|
+ last_group = group | (flex_gd->resize_bg - 1);
|
|
if (last_group > n_group)
|
|
last_group = n_group;
|
|
|
|
@@ -2010,8 +2017,9 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
|
|
ext4_fsblk_t o_blocks_count;
|
|
ext4_fsblk_t n_blocks_count_retry = 0;
|
|
unsigned long last_update_time = 0;
|
|
- int err = 0, flexbg_size = 1 << sbi->s_log_groups_per_flex;
|
|
+ int err = 0;
|
|
int meta_bg;
|
|
+ unsigned int flexbg_size = ext4_flex_bg_size(sbi);
|
|
|
|
/* See if the device is actually as big as what was requested */
|
|
bh = ext4_sb_bread(sb, n_blocks_count - 1, 0);
|
|
@@ -2152,8 +2160,7 @@ retry:
|
|
/* Add flex groups. Note that a regular group is a
|
|
* flex group with 1 group.
|
|
*/
|
|
- while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count,
|
|
- flexbg_size)) {
|
|
+ while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count)) {
|
|
if (time_is_before_jiffies(last_update_time + HZ * 10)) {
|
|
if (last_update_time)
|
|
ext4_msg(sb, KERN_INFO,
|
|
diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
|
|
index 4cb58e8d699e2..3d9f6495a4db4 100644
|
|
--- a/fs/f2fs/compress.c
|
|
+++ b/fs/f2fs/compress.c
|
|
@@ -1026,8 +1026,10 @@ static void set_cluster_dirty(struct compress_ctx *cc)
|
|
int i;
|
|
|
|
for (i = 0; i < cc->cluster_size; i++)
|
|
- if (cc->rpages[i])
|
|
+ if (cc->rpages[i]) {
|
|
set_page_dirty(cc->rpages[i]);
|
|
+ set_page_private_gcing(cc->rpages[i]);
|
|
+ }
|
|
}
|
|
|
|
static int prepare_compress_overwrite(struct compress_ctx *cc,
|
|
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
|
|
index fd22854dbeaea..46e4960a9dcf7 100644
|
|
--- a/fs/f2fs/file.c
|
|
+++ b/fs/f2fs/file.c
|
|
@@ -1326,6 +1326,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
|
|
}
|
|
memcpy_page(pdst, 0, psrc, 0, PAGE_SIZE);
|
|
set_page_dirty(pdst);
|
|
+ set_page_private_gcing(pdst);
|
|
f2fs_put_page(pdst, 1);
|
|
f2fs_put_page(psrc, 1);
|
|
|
|
@@ -4037,6 +4038,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
|
|
f2fs_bug_on(F2FS_I_SB(inode), !page);
|
|
|
|
set_page_dirty(page);
|
|
+ set_page_private_gcing(page);
|
|
f2fs_put_page(page, 1);
|
|
f2fs_put_page(page, 0);
|
|
}
|
|
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
|
|
index dea95b48b647d..53a6487f91e44 100644
|
|
--- a/fs/f2fs/recovery.c
|
|
+++ b/fs/f2fs/recovery.c
|
|
@@ -683,7 +683,16 @@ retry_dn:
|
|
*/
|
|
if (dest == NEW_ADDR) {
|
|
f2fs_truncate_data_blocks_range(&dn, 1);
|
|
- f2fs_reserve_new_block(&dn);
|
|
+ do {
|
|
+ err = f2fs_reserve_new_block(&dn);
|
|
+ if (err == -ENOSPC) {
|
|
+ f2fs_bug_on(sbi, 1);
|
|
+ break;
|
|
+ }
|
|
+ } while (err &&
|
|
+ IS_ENABLED(CONFIG_F2FS_FAULT_INJECTION));
|
|
+ if (err)
|
|
+ goto err;
|
|
continue;
|
|
}
|
|
|
|
@@ -691,12 +700,14 @@ retry_dn:
|
|
if (f2fs_is_valid_blkaddr(sbi, dest, META_POR)) {
|
|
|
|
if (src == NULL_ADDR) {
|
|
- err = f2fs_reserve_new_block(&dn);
|
|
- while (err &&
|
|
- IS_ENABLED(CONFIG_F2FS_FAULT_INJECTION))
|
|
+ do {
|
|
err = f2fs_reserve_new_block(&dn);
|
|
- /* We should not get -ENOSPC */
|
|
- f2fs_bug_on(sbi, err);
|
|
+ if (err == -ENOSPC) {
|
|
+ f2fs_bug_on(sbi, 1);
|
|
+ break;
|
|
+ }
|
|
+ } while (err &&
|
|
+ IS_ENABLED(CONFIG_F2FS_FAULT_INJECTION));
|
|
if (err)
|
|
goto err;
|
|
}
|
|
@@ -887,6 +898,8 @@ skip:
|
|
if (!err && fix_curseg_write_pointer && !f2fs_readonly(sbi->sb) &&
|
|
f2fs_sb_has_blkzoned(sbi)) {
|
|
err = f2fs_fix_curseg_write_pointer(sbi);
|
|
+ if (!err)
|
|
+ err = f2fs_check_write_pointer(sbi);
|
|
ret = err;
|
|
}
|
|
|
|
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c
|
|
index 4d56f6081a5d2..4462274e325ac 100644
|
|
--- a/fs/jfs/jfs_dmap.c
|
|
+++ b/fs/jfs/jfs_dmap.c
|
|
@@ -63,10 +63,10 @@
|
|
*/
|
|
static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno,
|
|
int nblocks);
|
|
-static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval);
|
|
-static int dbBackSplit(dmtree_t * tp, int leafno);
|
|
-static int dbJoin(dmtree_t * tp, int leafno, int newval);
|
|
-static void dbAdjTree(dmtree_t * tp, int leafno, int newval);
|
|
+static void dbSplit(dmtree_t *tp, int leafno, int splitsz, int newval, bool is_ctl);
|
|
+static int dbBackSplit(dmtree_t *tp, int leafno, bool is_ctl);
|
|
+static int dbJoin(dmtree_t *tp, int leafno, int newval, bool is_ctl);
|
|
+static void dbAdjTree(dmtree_t *tp, int leafno, int newval, bool is_ctl);
|
|
static int dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc,
|
|
int level);
|
|
static int dbAllocAny(struct bmap * bmp, s64 nblocks, int l2nb, s64 * results);
|
|
@@ -2103,7 +2103,7 @@ static int dbFreeDmap(struct bmap * bmp, struct dmap * dp, s64 blkno,
|
|
* system.
|
|
*/
|
|
if (dp->tree.stree[word] == NOFREE)
|
|
- dbBackSplit((dmtree_t *) & dp->tree, word);
|
|
+ dbBackSplit((dmtree_t *)&dp->tree, word, false);
|
|
|
|
dbAllocBits(bmp, dp, blkno, nblocks);
|
|
}
|
|
@@ -2189,7 +2189,7 @@ static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno,
|
|
* the binary system of the leaves if need be.
|
|
*/
|
|
dbSplit(tp, word, BUDMIN,
|
|
- dbMaxBud((u8 *) & dp->wmap[word]));
|
|
+ dbMaxBud((u8 *)&dp->wmap[word]), false);
|
|
|
|
word += 1;
|
|
} else {
|
|
@@ -2229,7 +2229,7 @@ static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno,
|
|
* system of the leaves to reflect the current
|
|
* allocation (size).
|
|
*/
|
|
- dbSplit(tp, word, size, NOFREE);
|
|
+ dbSplit(tp, word, size, NOFREE, false);
|
|
|
|
/* get the number of dmap words handled */
|
|
nw = BUDSIZE(size, BUDMIN);
|
|
@@ -2336,7 +2336,7 @@ static int dbFreeBits(struct bmap * bmp, struct dmap * dp, s64 blkno,
|
|
/* update the leaf for this dmap word.
|
|
*/
|
|
rc = dbJoin(tp, word,
|
|
- dbMaxBud((u8 *) & dp->wmap[word]));
|
|
+ dbMaxBud((u8 *)&dp->wmap[word]), false);
|
|
if (rc)
|
|
return rc;
|
|
|
|
@@ -2369,7 +2369,7 @@ static int dbFreeBits(struct bmap * bmp, struct dmap * dp, s64 blkno,
|
|
|
|
/* update the leaf.
|
|
*/
|
|
- rc = dbJoin(tp, word, size);
|
|
+ rc = dbJoin(tp, word, size, false);
|
|
if (rc)
|
|
return rc;
|
|
|
|
@@ -2521,16 +2521,16 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)
|
|
* that it is at the front of a binary buddy system.
|
|
*/
|
|
if (oldval == NOFREE) {
|
|
- rc = dbBackSplit((dmtree_t *) dcp, leafno);
|
|
+ rc = dbBackSplit((dmtree_t *)dcp, leafno, true);
|
|
if (rc) {
|
|
release_metapage(mp);
|
|
return rc;
|
|
}
|
|
oldval = dcp->stree[ti];
|
|
}
|
|
- dbSplit((dmtree_t *) dcp, leafno, dcp->budmin, newval);
|
|
+ dbSplit((dmtree_t *) dcp, leafno, dcp->budmin, newval, true);
|
|
} else {
|
|
- rc = dbJoin((dmtree_t *) dcp, leafno, newval);
|
|
+ rc = dbJoin((dmtree_t *) dcp, leafno, newval, true);
|
|
if (rc) {
|
|
release_metapage(mp);
|
|
return rc;
|
|
@@ -2561,7 +2561,7 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)
|
|
*/
|
|
if (alloc) {
|
|
dbJoin((dmtree_t *) dcp, leafno,
|
|
- oldval);
|
|
+ oldval, true);
|
|
} else {
|
|
/* the dbJoin() above might have
|
|
* caused a larger binary buddy system
|
|
@@ -2571,9 +2571,9 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)
|
|
*/
|
|
if (dcp->stree[ti] == NOFREE)
|
|
dbBackSplit((dmtree_t *)
|
|
- dcp, leafno);
|
|
+ dcp, leafno, true);
|
|
dbSplit((dmtree_t *) dcp, leafno,
|
|
- dcp->budmin, oldval);
|
|
+ dcp->budmin, oldval, true);
|
|
}
|
|
|
|
/* release the buffer and return the error.
|
|
@@ -2621,7 +2621,7 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)
|
|
*
|
|
* serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit;
|
|
*/
|
|
-static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval)
|
|
+static void dbSplit(dmtree_t *tp, int leafno, int splitsz, int newval, bool is_ctl)
|
|
{
|
|
int budsz;
|
|
int cursz;
|
|
@@ -2643,7 +2643,7 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval)
|
|
while (cursz >= splitsz) {
|
|
/* update the buddy's leaf with its new value.
|
|
*/
|
|
- dbAdjTree(tp, leafno ^ budsz, cursz);
|
|
+ dbAdjTree(tp, leafno ^ budsz, cursz, is_ctl);
|
|
|
|
/* on to the next size and buddy.
|
|
*/
|
|
@@ -2655,7 +2655,7 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval)
|
|
/* adjust the dmap tree to reflect the specified leaf's new
|
|
* value.
|
|
*/
|
|
- dbAdjTree(tp, leafno, newval);
|
|
+ dbAdjTree(tp, leafno, newval, is_ctl);
|
|
}
|
|
|
|
|
|
@@ -2686,7 +2686,7 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval)
|
|
*
|
|
* serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit;
|
|
*/
|
|
-static int dbBackSplit(dmtree_t * tp, int leafno)
|
|
+static int dbBackSplit(dmtree_t *tp, int leafno, bool is_ctl)
|
|
{
|
|
int budsz, bud, w, bsz, size;
|
|
int cursz;
|
|
@@ -2737,7 +2737,7 @@ static int dbBackSplit(dmtree_t * tp, int leafno)
|
|
* system in two.
|
|
*/
|
|
cursz = leaf[bud] - 1;
|
|
- dbSplit(tp, bud, cursz, cursz);
|
|
+ dbSplit(tp, bud, cursz, cursz, is_ctl);
|
|
break;
|
|
}
|
|
}
|
|
@@ -2765,7 +2765,7 @@ static int dbBackSplit(dmtree_t * tp, int leafno)
|
|
*
|
|
* RETURN VALUES: none
|
|
*/
|
|
-static int dbJoin(dmtree_t * tp, int leafno, int newval)
|
|
+static int dbJoin(dmtree_t *tp, int leafno, int newval, bool is_ctl)
|
|
{
|
|
int budsz, buddy;
|
|
s8 *leaf;
|
|
@@ -2820,12 +2820,12 @@ static int dbJoin(dmtree_t * tp, int leafno, int newval)
|
|
if (leafno < buddy) {
|
|
/* leafno is the left buddy.
|
|
*/
|
|
- dbAdjTree(tp, buddy, NOFREE);
|
|
+ dbAdjTree(tp, buddy, NOFREE, is_ctl);
|
|
} else {
|
|
/* buddy is the left buddy and becomes
|
|
* leafno.
|
|
*/
|
|
- dbAdjTree(tp, leafno, NOFREE);
|
|
+ dbAdjTree(tp, leafno, NOFREE, is_ctl);
|
|
leafno = buddy;
|
|
}
|
|
|
|
@@ -2838,7 +2838,7 @@ static int dbJoin(dmtree_t * tp, int leafno, int newval)
|
|
|
|
/* update the leaf value.
|
|
*/
|
|
- dbAdjTree(tp, leafno, newval);
|
|
+ dbAdjTree(tp, leafno, newval, is_ctl);
|
|
|
|
return 0;
|
|
}
|
|
@@ -2859,15 +2859,20 @@ static int dbJoin(dmtree_t * tp, int leafno, int newval)
|
|
*
|
|
* RETURN VALUES: none
|
|
*/
|
|
-static void dbAdjTree(dmtree_t * tp, int leafno, int newval)
|
|
+static void dbAdjTree(dmtree_t *tp, int leafno, int newval, bool is_ctl)
|
|
{
|
|
int lp, pp, k;
|
|
- int max;
|
|
+ int max, size;
|
|
+
|
|
+ size = is_ctl ? CTLTREESIZE : TREESIZE;
|
|
|
|
/* pick up the index of the leaf for this leafno.
|
|
*/
|
|
lp = leafno + le32_to_cpu(tp->dmt_leafidx);
|
|
|
|
+ if (WARN_ON_ONCE(lp >= size || lp < 0))
|
|
+ return;
|
|
+
|
|
/* is the current value the same as the old value ? if so,
|
|
* there is nothing to do.
|
|
*/
|
|
diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c
|
|
index 92b7c533407c1..031d8f570f581 100644
|
|
--- a/fs/jfs/jfs_dtree.c
|
|
+++ b/fs/jfs/jfs_dtree.c
|
|
@@ -633,6 +633,11 @@ int dtSearch(struct inode *ip, struct component_name * key, ino_t * data,
|
|
for (base = 0, lim = p->header.nextindex; lim; lim >>= 1) {
|
|
index = base + (lim >> 1);
|
|
|
|
+ if (stbl[index] < 0) {
|
|
+ rc = -EIO;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
if (p->header.flag & BT_LEAF) {
|
|
/* uppercase leaf name to compare */
|
|
cmp =
|
|
@@ -1970,7 +1975,7 @@ static int dtSplitRoot(tid_t tid,
|
|
do {
|
|
f = &rp->slot[fsi];
|
|
fsi = f->next;
|
|
- } while (fsi != -1);
|
|
+ } while (fsi >= 0);
|
|
|
|
f->next = n;
|
|
}
|
|
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c
|
|
index 6ed2e1d4c894f..ac42f8ee553fc 100644
|
|
--- a/fs/jfs/jfs_imap.c
|
|
+++ b/fs/jfs/jfs_imap.c
|
|
@@ -2179,6 +2179,9 @@ static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)
|
|
/* get the ag and iag numbers for this iag.
|
|
*/
|
|
agno = BLKTOAG(le64_to_cpu(iagp->agstart), sbi);
|
|
+ if (agno >= MAXAG || agno < 0)
|
|
+ return -EIO;
|
|
+
|
|
iagno = le32_to_cpu(iagp->iagnum);
|
|
|
|
/* check if this is the last free extent within the
|
|
diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c
|
|
index 48d1f70f786cf..21d8d4a5c67a1 100644
|
|
--- a/fs/jfs/jfs_mount.c
|
|
+++ b/fs/jfs/jfs_mount.c
|
|
@@ -172,15 +172,15 @@ int jfs_mount(struct super_block *sb)
|
|
}
|
|
jfs_info("jfs_mount: ipimap:0x%p", ipimap);
|
|
|
|
- /* map further access of per fileset inodes by the fileset inode */
|
|
- sbi->ipimap = ipimap;
|
|
-
|
|
/* initialize fileset inode allocation map */
|
|
if ((rc = diMount(ipimap))) {
|
|
jfs_err("jfs_mount: diMount failed w/rc = %d", rc);
|
|
goto err_ipimap;
|
|
}
|
|
|
|
+ /* map further access of per fileset inodes by the fileset inode */
|
|
+ sbi->ipimap = ipimap;
|
|
+
|
|
return rc;
|
|
|
|
/*
|
|
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
|
|
index 44842e6cf0a9b..a00e11ebfa775 100644
|
|
--- a/fs/kernfs/dir.c
|
|
+++ b/fs/kernfs/dir.c
|
|
@@ -669,6 +669,18 @@ struct kernfs_node *kernfs_new_node(struct kernfs_node *parent,
|
|
{
|
|
struct kernfs_node *kn;
|
|
|
|
+ if (parent->mode & S_ISGID) {
|
|
+ /* this code block imitates inode_init_owner() for
|
|
+ * kernfs
|
|
+ */
|
|
+
|
|
+ if (parent->iattr)
|
|
+ gid = parent->iattr->ia_gid;
|
|
+
|
|
+ if (flags & KERNFS_DIR)
|
|
+ mode |= S_ISGID;
|
|
+ }
|
|
+
|
|
kn = __kernfs_new_node(kernfs_root(parent), parent,
|
|
name, mode, uid, gid, flags);
|
|
if (kn) {
|
|
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
|
|
index f3fa3625d772c..e15b4631364a8 100644
|
|
--- a/fs/pstore/ram.c
|
|
+++ b/fs/pstore/ram.c
|
|
@@ -519,6 +519,7 @@ static int ramoops_init_przs(const char *name,
|
|
}
|
|
|
|
zone_sz = mem_sz / *cnt;
|
|
+ zone_sz = ALIGN_DOWN(zone_sz, 2);
|
|
if (!zone_sz) {
|
|
dev_err(dev, "%s zone size == 0\n", name);
|
|
goto fail;
|
|
diff --git a/include/asm-generic/numa.h b/include/asm-generic/numa.h
|
|
index 1a3ad6d298330..c32e0cf23c909 100644
|
|
--- a/include/asm-generic/numa.h
|
|
+++ b/include/asm-generic/numa.h
|
|
@@ -35,6 +35,7 @@ int __init numa_add_memblk(int nodeid, u64 start, u64 end);
|
|
void __init numa_set_distance(int from, int to, int distance);
|
|
void __init numa_free_distance(void);
|
|
void __init early_map_cpu_to_node(unsigned int cpu, int nid);
|
|
+int __init early_cpu_to_node(int cpu);
|
|
void numa_store_cpu_info(unsigned int cpu);
|
|
void numa_add_cpu(unsigned int cpu);
|
|
void numa_remove_cpu(unsigned int cpu);
|
|
@@ -46,6 +47,7 @@ static inline void numa_add_cpu(unsigned int cpu) { }
|
|
static inline void numa_remove_cpu(unsigned int cpu) { }
|
|
static inline void arch_numa_init(void) { }
|
|
static inline void early_map_cpu_to_node(unsigned int cpu, int nid) { }
|
|
+static inline int early_cpu_to_node(int cpu) { return 0; }
|
|
|
|
#endif /* CONFIG_NUMA */
|
|
|
|
diff --git a/include/asm-generic/unaligned.h b/include/asm-generic/unaligned.h
|
|
index 699650f819706..a84c64e5f11ec 100644
|
|
--- a/include/asm-generic/unaligned.h
|
|
+++ b/include/asm-generic/unaligned.h
|
|
@@ -104,9 +104,9 @@ static inline u32 get_unaligned_le24(const void *p)
|
|
|
|
static inline void __put_unaligned_be24(const u32 val, u8 *p)
|
|
{
|
|
- *p++ = val >> 16;
|
|
- *p++ = val >> 8;
|
|
- *p++ = val;
|
|
+ *p++ = (val >> 16) & 0xff;
|
|
+ *p++ = (val >> 8) & 0xff;
|
|
+ *p++ = val & 0xff;
|
|
}
|
|
|
|
static inline void put_unaligned_be24(const u32 val, void *p)
|
|
@@ -116,9 +116,9 @@ static inline void put_unaligned_be24(const u32 val, void *p)
|
|
|
|
static inline void __put_unaligned_le24(const u32 val, u8 *p)
|
|
{
|
|
- *p++ = val;
|
|
- *p++ = val >> 8;
|
|
- *p++ = val >> 16;
|
|
+ *p++ = val & 0xff;
|
|
+ *p++ = (val >> 8) & 0xff;
|
|
+ *p++ = (val >> 16) & 0xff;
|
|
}
|
|
|
|
static inline void put_unaligned_le24(const u32 val, void *p)
|
|
@@ -128,12 +128,12 @@ static inline void put_unaligned_le24(const u32 val, void *p)
|
|
|
|
static inline void __put_unaligned_be48(const u64 val, u8 *p)
|
|
{
|
|
- *p++ = val >> 40;
|
|
- *p++ = val >> 32;
|
|
- *p++ = val >> 24;
|
|
- *p++ = val >> 16;
|
|
- *p++ = val >> 8;
|
|
- *p++ = val;
|
|
+ *p++ = (val >> 40) & 0xff;
|
|
+ *p++ = (val >> 32) & 0xff;
|
|
+ *p++ = (val >> 24) & 0xff;
|
|
+ *p++ = (val >> 16) & 0xff;
|
|
+ *p++ = (val >> 8) & 0xff;
|
|
+ *p++ = val & 0xff;
|
|
}
|
|
|
|
static inline void put_unaligned_be48(const u64 val, void *p)
|
|
diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h
|
|
index 81c298488b0c8..6b5eec10c3db3 100644
|
|
--- a/include/drm/drm_color_mgmt.h
|
|
+++ b/include/drm/drm_color_mgmt.h
|
|
@@ -24,6 +24,7 @@
|
|
#define __DRM_COLOR_MGMT_H__
|
|
|
|
#include <linux/ctype.h>
|
|
+#include <linux/math64.h>
|
|
#include <drm/drm_property.h>
|
|
|
|
struct drm_crtc;
|
|
diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h
|
|
index 9054a5185e1a9..31171914990a3 100644
|
|
--- a/include/drm/drm_mipi_dsi.h
|
|
+++ b/include/drm/drm_mipi_dsi.h
|
|
@@ -168,6 +168,7 @@ struct mipi_dsi_device_info {
|
|
* struct mipi_dsi_device - DSI peripheral device
|
|
* @host: DSI host for this peripheral
|
|
* @dev: driver model device node for this peripheral
|
|
+ * @attached: the DSI device has been successfully attached
|
|
* @name: DSI peripheral chip type
|
|
* @channel: virtual channel assigned to the peripheral
|
|
* @format: pixel format for video mode
|
|
@@ -184,6 +185,7 @@ struct mipi_dsi_device_info {
|
|
struct mipi_dsi_device {
|
|
struct mipi_dsi_host *host;
|
|
struct device dev;
|
|
+ bool attached;
|
|
|
|
char name[DSI_DEV_NAME_SIZE];
|
|
unsigned int channel;
|
|
diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h
|
|
index 8cd11a2232605..136f2980cba30 100644
|
|
--- a/include/linux/irq_work.h
|
|
+++ b/include/linux/irq_work.h
|
|
@@ -66,6 +66,9 @@ void irq_work_sync(struct irq_work *work);
|
|
void irq_work_run(void);
|
|
bool irq_work_needs_cpu(void);
|
|
void irq_work_single(void *arg);
|
|
+
|
|
+void arch_irq_work_raise(void);
|
|
+
|
|
#else
|
|
static inline bool irq_work_needs_cpu(void) { return false; }
|
|
static inline void irq_work_run(void) { }
|
|
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
|
|
index 638d2124d1cb9..3b9f4d7c40c38 100644
|
|
--- a/include/linux/mmzone.h
|
|
+++ b/include/linux/mmzone.h
|
|
@@ -1854,9 +1854,9 @@ static inline int pfn_valid(unsigned long pfn)
|
|
if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
|
|
return 0;
|
|
ms = __pfn_to_section(pfn);
|
|
- rcu_read_lock();
|
|
+ rcu_read_lock_sched();
|
|
if (!valid_section(ms)) {
|
|
- rcu_read_unlock();
|
|
+ rcu_read_unlock_sched();
|
|
return 0;
|
|
}
|
|
/*
|
|
@@ -1864,7 +1864,7 @@ static inline int pfn_valid(unsigned long pfn)
|
|
* the entire section-sized span.
|
|
*/
|
|
ret = early_section(ms) || pfn_section_valid(ms, pfn);
|
|
- rcu_read_unlock();
|
|
+ rcu_read_unlock_sched();
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
|
|
index b76ff08506181..73cc1e7dd15ad 100644
|
|
--- a/include/linux/pci_ids.h
|
|
+++ b/include/linux/pci_ids.h
|
|
@@ -3000,6 +3000,7 @@
|
|
#define PCI_DEVICE_ID_INTEL_82443GX_0 0x71a0
|
|
#define PCI_DEVICE_ID_INTEL_82443GX_2 0x71a2
|
|
#define PCI_DEVICE_ID_INTEL_82372FB_1 0x7601
|
|
+#define PCI_DEVICE_ID_INTEL_HDA_ARL 0x7728
|
|
#define PCI_DEVICE_ID_INTEL_SCH_LPC 0x8119
|
|
#define PCI_DEVICE_ID_INTEL_SCH_IDE 0x811a
|
|
#define PCI_DEVICE_ID_INTEL_E6XX_CU 0x8183
|
|
diff --git a/include/net/af_unix.h b/include/net/af_unix.h
|
|
index 55ca217c626b7..0920b669b9b31 100644
|
|
--- a/include/net/af_unix.h
|
|
+++ b/include/net/af_unix.h
|
|
@@ -45,12 +45,6 @@ struct scm_stat {
|
|
|
|
#define UNIXCB(skb) (*(struct unix_skb_parms *)&((skb)->cb))
|
|
|
|
-#define unix_state_lock(s) spin_lock(&unix_sk(s)->lock)
|
|
-#define unix_state_unlock(s) spin_unlock(&unix_sk(s)->lock)
|
|
-#define unix_state_lock_nested(s) \
|
|
- spin_lock_nested(&unix_sk(s)->lock, \
|
|
- SINGLE_DEPTH_NESTING)
|
|
-
|
|
/* The AF_UNIX socket */
|
|
struct unix_sock {
|
|
/* WARNING: sk has to be the first member */
|
|
@@ -79,6 +73,20 @@ static inline struct unix_sock *unix_sk(const struct sock *sk)
|
|
}
|
|
#define unix_peer(sk) (unix_sk(sk)->peer)
|
|
|
|
+#define unix_state_lock(s) spin_lock(&unix_sk(s)->lock)
|
|
+#define unix_state_unlock(s) spin_unlock(&unix_sk(s)->lock)
|
|
+enum unix_socket_lock_class {
|
|
+ U_LOCK_NORMAL,
|
|
+ U_LOCK_SECOND, /* for double locking, see unix_state_double_lock(). */
|
|
+ U_LOCK_DIAG, /* used while dumping icons, see sk_diag_dump_icons(). */
|
|
+};
|
|
+
|
|
+static inline void unix_state_lock_nested(struct sock *sk,
|
|
+ enum unix_socket_lock_class subclass)
|
|
+{
|
|
+ spin_lock_nested(&unix_sk(sk)->lock, subclass);
|
|
+}
|
|
+
|
|
#define peer_wait peer_wq.wait
|
|
|
|
long unix_inq_len(struct sock *sk);
|
|
diff --git a/include/net/ip.h b/include/net/ip.h
|
|
index c83c09c65623f..4f11f7df7dd67 100644
|
|
--- a/include/net/ip.h
|
|
+++ b/include/net/ip.h
|
|
@@ -752,7 +752,7 @@ int ip_options_rcv_srr(struct sk_buff *skb, struct net_device *dev);
|
|
* Functions provided by ip_sockglue.c
|
|
*/
|
|
|
|
-void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb);
|
|
+void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb, bool drop_dst);
|
|
void ip_cmsg_recv_offset(struct msghdr *msg, struct sock *sk,
|
|
struct sk_buff *skb, int tlen, int offset);
|
|
int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
|
|
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h
|
|
index c726da3b7d68a..2fa344cb66f60 100644
|
|
--- a/include/net/netfilter/nf_tables.h
|
|
+++ b/include/net/netfilter/nf_tables.h
|
|
@@ -1286,6 +1286,7 @@ void nft_obj_notify(struct net *net, const struct nft_table *table,
|
|
* @type: stateful object numeric type
|
|
* @owner: module owner
|
|
* @maxattr: maximum netlink attribute
|
|
+ * @family: address family for AF-specific object types
|
|
* @policy: netlink attribute policy
|
|
*/
|
|
struct nft_object_type {
|
|
@@ -1295,6 +1296,7 @@ struct nft_object_type {
|
|
struct list_head list;
|
|
u32 type;
|
|
unsigned int maxattr;
|
|
+ u8 family;
|
|
struct module *owner;
|
|
const struct nla_policy *policy;
|
|
};
|
|
diff --git a/kernel/audit.c b/kernel/audit.c
|
|
index 9bc0b0301198c..99127521cda86 100644
|
|
--- a/kernel/audit.c
|
|
+++ b/kernel/audit.c
|
|
@@ -488,15 +488,19 @@ static void auditd_conn_free(struct rcu_head *rcu)
|
|
* @pid: auditd PID
|
|
* @portid: auditd netlink portid
|
|
* @net: auditd network namespace pointer
|
|
+ * @skb: the netlink command from the audit daemon
|
|
+ * @ack: netlink ack flag, cleared if ack'd here
|
|
*
|
|
* Description:
|
|
* This function will obtain and drop network namespace references as
|
|
* necessary. Returns zero on success, negative values on failure.
|
|
*/
|
|
-static int auditd_set(struct pid *pid, u32 portid, struct net *net)
|
|
+static int auditd_set(struct pid *pid, u32 portid, struct net *net,
|
|
+ struct sk_buff *skb, bool *ack)
|
|
{
|
|
unsigned long flags;
|
|
struct auditd_connection *ac_old, *ac_new;
|
|
+ struct nlmsghdr *nlh;
|
|
|
|
if (!pid || !net)
|
|
return -EINVAL;
|
|
@@ -508,6 +512,13 @@ static int auditd_set(struct pid *pid, u32 portid, struct net *net)
|
|
ac_new->portid = portid;
|
|
ac_new->net = get_net(net);
|
|
|
|
+ /* send the ack now to avoid a race with the queue backlog */
|
|
+ if (*ack) {
|
|
+ nlh = nlmsg_hdr(skb);
|
|
+ netlink_ack(skb, nlh, 0, NULL);
|
|
+ *ack = false;
|
|
+ }
|
|
+
|
|
spin_lock_irqsave(&auditd_conn_lock, flags);
|
|
ac_old = rcu_dereference_protected(auditd_conn,
|
|
lockdep_is_held(&auditd_conn_lock));
|
|
@@ -1201,7 +1212,8 @@ static int audit_replace(struct pid *pid)
|
|
return auditd_send_unicast_skb(skb);
|
|
}
|
|
|
|
-static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
+static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
+ bool *ack)
|
|
{
|
|
u32 seq;
|
|
void *data;
|
|
@@ -1294,7 +1306,8 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
/* register a new auditd connection */
|
|
err = auditd_set(req_pid,
|
|
NETLINK_CB(skb).portid,
|
|
- sock_net(NETLINK_CB(skb).sk));
|
|
+ sock_net(NETLINK_CB(skb).sk),
|
|
+ skb, ack);
|
|
if (audit_enabled != AUDIT_OFF)
|
|
audit_log_config_change("audit_pid",
|
|
new_pid,
|
|
@@ -1539,9 +1552,10 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
* Parse the provided skb and deal with any messages that may be present,
|
|
* malformed skbs are discarded.
|
|
*/
|
|
-static void audit_receive(struct sk_buff *skb)
|
|
+static void audit_receive(struct sk_buff *skb)
|
|
{
|
|
struct nlmsghdr *nlh;
|
|
+ bool ack;
|
|
/*
|
|
* len MUST be signed for nlmsg_next to be able to dec it below 0
|
|
* if the nlmsg_len was not aligned
|
|
@@ -1554,9 +1568,12 @@ static void audit_receive(struct sk_buff *skb)
|
|
|
|
audit_ctl_lock();
|
|
while (nlmsg_ok(nlh, len)) {
|
|
- err = audit_receive_msg(skb, nlh);
|
|
- /* if err or if this message says it wants a response */
|
|
- if (err || (nlh->nlmsg_flags & NLM_F_ACK))
|
|
+ ack = nlh->nlmsg_flags & NLM_F_ACK;
|
|
+ err = audit_receive_msg(skb, nlh, &ack);
|
|
+
|
|
+ /* send an ack if the user asked for one and audit_receive_msg
|
|
+ * didn't already do it, or if there was an error. */
|
|
+ if (ack || err)
|
|
netlink_ack(skb, nlh, err, NULL);
|
|
|
|
nlh = nlmsg_next(nlh, &len);
|
|
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
|
|
index 6212e4ae084bb..34135fbd6097e 100644
|
|
--- a/kernel/bpf/helpers.c
|
|
+++ b/kernel/bpf/helpers.c
|
|
@@ -28,12 +28,13 @@
|
|
*
|
|
* Different map implementations will rely on rcu in map methods
|
|
* lookup/update/delete, therefore eBPF programs must run under rcu lock
|
|
- * if program is allowed to access maps, so check rcu_read_lock_held in
|
|
- * all three functions.
|
|
+ * if program is allowed to access maps, so check rcu_read_lock_held() or
|
|
+ * rcu_read_lock_trace_held() in all three functions.
|
|
*/
|
|
BPF_CALL_2(bpf_map_lookup_elem, struct bpf_map *, map, void *, key)
|
|
{
|
|
- WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_bh_held());
|
|
+ WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held() &&
|
|
+ !rcu_read_lock_bh_held());
|
|
return (unsigned long) map->ops->map_lookup_elem(map, key);
|
|
}
|
|
|
|
@@ -49,7 +50,8 @@ const struct bpf_func_proto bpf_map_lookup_elem_proto = {
|
|
BPF_CALL_4(bpf_map_update_elem, struct bpf_map *, map, void *, key,
|
|
void *, value, u64, flags)
|
|
{
|
|
- WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_bh_held());
|
|
+ WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held() &&
|
|
+ !rcu_read_lock_bh_held());
|
|
return map->ops->map_update_elem(map, key, value, flags);
|
|
}
|
|
|
|
@@ -66,7 +68,8 @@ const struct bpf_func_proto bpf_map_update_elem_proto = {
|
|
|
|
BPF_CALL_2(bpf_map_delete_elem, struct bpf_map *, map, void *, key)
|
|
{
|
|
- WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_bh_held());
|
|
+ WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held() &&
|
|
+ !rcu_read_lock_bh_held());
|
|
return map->ops->map_delete_elem(map, key);
|
|
}
|
|
|
|
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
|
|
index 8d0c38a8dcf2d..1e46a84694b8a 100644
|
|
--- a/kernel/bpf/syscall.c
|
|
+++ b/kernel/bpf/syscall.c
|
|
@@ -1598,6 +1598,9 @@ int generic_map_delete_batch(struct bpf_map *map,
|
|
if (!max_count)
|
|
return 0;
|
|
|
|
+ if (put_user(0, &uattr->batch.count))
|
|
+ return -EFAULT;
|
|
+
|
|
key = kvmalloc(map->key_size, GFP_USER | __GFP_NOWARN);
|
|
if (!key)
|
|
return -ENOMEM;
|
|
@@ -1657,6 +1660,9 @@ int generic_map_update_batch(struct bpf_map *map,
|
|
if (!max_count)
|
|
return 0;
|
|
|
|
+ if (put_user(0, &uattr->batch.count))
|
|
+ return -EFAULT;
|
|
+
|
|
key = kvmalloc(map->key_size, GFP_USER | __GFP_NOWARN);
|
|
if (!key)
|
|
return -ENOMEM;
|
|
diff --git a/kernel/events/core.c b/kernel/events/core.c
|
|
index 8c7d2f4f5fbab..872d149b1959b 100644
|
|
--- a/kernel/events/core.c
|
|
+++ b/kernel/events/core.c
|
|
@@ -11223,9 +11223,30 @@ static DEVICE_ATTR_RW(perf_event_mux_interval_ms);
|
|
static struct attribute *pmu_dev_attrs[] = {
|
|
&dev_attr_type.attr,
|
|
&dev_attr_perf_event_mux_interval_ms.attr,
|
|
+ &dev_attr_nr_addr_filters.attr,
|
|
+ NULL,
|
|
+};
|
|
+
|
|
+static umode_t pmu_dev_is_visible(struct kobject *kobj, struct attribute *a, int n)
|
|
+{
|
|
+ struct device *dev = kobj_to_dev(kobj);
|
|
+ struct pmu *pmu = dev_get_drvdata(dev);
|
|
+
|
|
+ if (n == 2 && !pmu->nr_addr_filters)
|
|
+ return 0;
|
|
+
|
|
+ return a->mode;
|
|
+}
|
|
+
|
|
+static struct attribute_group pmu_dev_attr_group = {
|
|
+ .is_visible = pmu_dev_is_visible,
|
|
+ .attrs = pmu_dev_attrs,
|
|
+};
|
|
+
|
|
+static const struct attribute_group *pmu_dev_groups[] = {
|
|
+ &pmu_dev_attr_group,
|
|
NULL,
|
|
};
|
|
-ATTRIBUTE_GROUPS(pmu_dev);
|
|
|
|
static int pmu_bus_running;
|
|
static struct bus_type pmu_bus = {
|
|
@@ -11261,18 +11282,11 @@ static int pmu_dev_alloc(struct pmu *pmu)
|
|
if (ret)
|
|
goto free_dev;
|
|
|
|
- /* For PMUs with address filters, throw in an extra attribute: */
|
|
- if (pmu->nr_addr_filters)
|
|
- ret = device_create_file(pmu->dev, &dev_attr_nr_addr_filters);
|
|
-
|
|
- if (ret)
|
|
- goto del_dev;
|
|
-
|
|
- if (pmu->attr_update)
|
|
+ if (pmu->attr_update) {
|
|
ret = sysfs_update_groups(&pmu->dev->kobj, pmu->attr_update);
|
|
-
|
|
- if (ret)
|
|
- goto del_dev;
|
|
+ if (ret)
|
|
+ goto del_dev;
|
|
+ }
|
|
|
|
out:
|
|
return ret;
|
|
diff --git a/lib/debugobjects.c b/lib/debugobjects.c
|
|
index dacb80c22c4f1..5dfa582dbadd2 100644
|
|
--- a/lib/debugobjects.c
|
|
+++ b/lib/debugobjects.c
|
|
@@ -609,9 +609,8 @@ static void debug_objects_fill_pool(void)
|
|
static void
|
|
__debug_object_init(void *addr, const struct debug_obj_descr *descr, int onstack)
|
|
{
|
|
- enum debug_obj_state state;
|
|
+ struct debug_obj *obj, o;
|
|
struct debug_bucket *db;
|
|
- struct debug_obj *obj;
|
|
unsigned long flags;
|
|
|
|
debug_objects_fill_pool();
|
|
@@ -632,24 +631,18 @@ __debug_object_init(void *addr, const struct debug_obj_descr *descr, int onstack
|
|
case ODEBUG_STATE_INIT:
|
|
case ODEBUG_STATE_INACTIVE:
|
|
obj->state = ODEBUG_STATE_INIT;
|
|
- break;
|
|
-
|
|
- case ODEBUG_STATE_ACTIVE:
|
|
- state = obj->state;
|
|
- raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- debug_print_object(obj, "init");
|
|
- debug_object_fixup(descr->fixup_init, addr, state);
|
|
- return;
|
|
-
|
|
- case ODEBUG_STATE_DESTROYED:
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- debug_print_object(obj, "init");
|
|
return;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
+ o = *obj;
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ debug_print_object(&o, "init");
|
|
+
|
|
+ if (o.state == ODEBUG_STATE_ACTIVE)
|
|
+ debug_object_fixup(descr->fixup_init, addr, o.state);
|
|
}
|
|
|
|
/**
|
|
@@ -690,11 +683,9 @@ EXPORT_SYMBOL_GPL(debug_object_init_on_stack);
|
|
int debug_object_activate(void *addr, const struct debug_obj_descr *descr)
|
|
{
|
|
struct debug_obj o = { .object = addr, .state = ODEBUG_STATE_NOTAVAILABLE, .descr = descr };
|
|
- enum debug_obj_state state;
|
|
struct debug_bucket *db;
|
|
struct debug_obj *obj;
|
|
unsigned long flags;
|
|
- int ret;
|
|
|
|
if (!debug_objects_enabled)
|
|
return 0;
|
|
@@ -706,49 +697,38 @@ int debug_object_activate(void *addr, const struct debug_obj_descr *descr)
|
|
raw_spin_lock_irqsave(&db->lock, flags);
|
|
|
|
obj = lookup_object_or_alloc(addr, db, descr, false, true);
|
|
- if (likely(!IS_ERR_OR_NULL(obj))) {
|
|
- bool print_object = false;
|
|
-
|
|
+ if (unlikely(!obj)) {
|
|
+ raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ debug_objects_oom();
|
|
+ return 0;
|
|
+ } else if (likely(!IS_ERR(obj))) {
|
|
switch (obj->state) {
|
|
- case ODEBUG_STATE_INIT:
|
|
- case ODEBUG_STATE_INACTIVE:
|
|
- obj->state = ODEBUG_STATE_ACTIVE;
|
|
- ret = 0;
|
|
- break;
|
|
-
|
|
case ODEBUG_STATE_ACTIVE:
|
|
- state = obj->state;
|
|
- raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- debug_print_object(obj, "activate");
|
|
- ret = debug_object_fixup(descr->fixup_activate, addr, state);
|
|
- return ret ? 0 : -EINVAL;
|
|
-
|
|
case ODEBUG_STATE_DESTROYED:
|
|
- print_object = true;
|
|
- ret = -EINVAL;
|
|
+ o = *obj;
|
|
break;
|
|
+ case ODEBUG_STATE_INIT:
|
|
+ case ODEBUG_STATE_INACTIVE:
|
|
+ obj->state = ODEBUG_STATE_ACTIVE;
|
|
+ fallthrough;
|
|
default:
|
|
- ret = 0;
|
|
- break;
|
|
+ raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ return 0;
|
|
}
|
|
- raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- if (print_object)
|
|
- debug_print_object(obj, "activate");
|
|
- return ret;
|
|
}
|
|
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ debug_print_object(&o, "activate");
|
|
|
|
- /* If NULL the allocation has hit OOM */
|
|
- if (!obj) {
|
|
- debug_objects_oom();
|
|
- return 0;
|
|
+ switch (o.state) {
|
|
+ case ODEBUG_STATE_ACTIVE:
|
|
+ case ODEBUG_STATE_NOTAVAILABLE:
|
|
+ if (debug_object_fixup(descr->fixup_activate, addr, o.state))
|
|
+ return 0;
|
|
+ fallthrough;
|
|
+ default:
|
|
+ return -EINVAL;
|
|
}
|
|
-
|
|
- /* Object is neither static nor tracked. It's not initialized */
|
|
- debug_print_object(&o, "activate");
|
|
- ret = debug_object_fixup(descr->fixup_activate, addr, ODEBUG_STATE_NOTAVAILABLE);
|
|
- return ret ? 0 : -EINVAL;
|
|
}
|
|
EXPORT_SYMBOL_GPL(debug_object_activate);
|
|
|
|
@@ -759,10 +739,10 @@ EXPORT_SYMBOL_GPL(debug_object_activate);
|
|
*/
|
|
void debug_object_deactivate(void *addr, const struct debug_obj_descr *descr)
|
|
{
|
|
+ struct debug_obj o = { .object = addr, .state = ODEBUG_STATE_NOTAVAILABLE, .descr = descr };
|
|
struct debug_bucket *db;
|
|
struct debug_obj *obj;
|
|
unsigned long flags;
|
|
- bool print_object = false;
|
|
|
|
if (!debug_objects_enabled)
|
|
return;
|
|
@@ -774,33 +754,24 @@ void debug_object_deactivate(void *addr, const struct debug_obj_descr *descr)
|
|
obj = lookup_object(addr, db);
|
|
if (obj) {
|
|
switch (obj->state) {
|
|
+ case ODEBUG_STATE_DESTROYED:
|
|
+ break;
|
|
case ODEBUG_STATE_INIT:
|
|
case ODEBUG_STATE_INACTIVE:
|
|
case ODEBUG_STATE_ACTIVE:
|
|
- if (!obj->astate)
|
|
- obj->state = ODEBUG_STATE_INACTIVE;
|
|
- else
|
|
- print_object = true;
|
|
- break;
|
|
-
|
|
- case ODEBUG_STATE_DESTROYED:
|
|
- print_object = true;
|
|
- break;
|
|
+ if (obj->astate)
|
|
+ break;
|
|
+ obj->state = ODEBUG_STATE_INACTIVE;
|
|
+ fallthrough;
|
|
default:
|
|
- break;
|
|
+ raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ return;
|
|
}
|
|
+ o = *obj;
|
|
}
|
|
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- if (!obj) {
|
|
- struct debug_obj o = { .object = addr,
|
|
- .state = ODEBUG_STATE_NOTAVAILABLE,
|
|
- .descr = descr };
|
|
-
|
|
- debug_print_object(&o, "deactivate");
|
|
- } else if (print_object) {
|
|
- debug_print_object(obj, "deactivate");
|
|
- }
|
|
+ debug_print_object(&o, "deactivate");
|
|
}
|
|
EXPORT_SYMBOL_GPL(debug_object_deactivate);
|
|
|
|
@@ -811,11 +782,9 @@ EXPORT_SYMBOL_GPL(debug_object_deactivate);
|
|
*/
|
|
void debug_object_destroy(void *addr, const struct debug_obj_descr *descr)
|
|
{
|
|
- enum debug_obj_state state;
|
|
+ struct debug_obj *obj, o;
|
|
struct debug_bucket *db;
|
|
- struct debug_obj *obj;
|
|
unsigned long flags;
|
|
- bool print_object = false;
|
|
|
|
if (!debug_objects_enabled)
|
|
return;
|
|
@@ -825,32 +794,31 @@ void debug_object_destroy(void *addr, const struct debug_obj_descr *descr)
|
|
raw_spin_lock_irqsave(&db->lock, flags);
|
|
|
|
obj = lookup_object(addr, db);
|
|
- if (!obj)
|
|
- goto out_unlock;
|
|
+ if (!obj) {
|
|
+ raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ return;
|
|
+ }
|
|
|
|
switch (obj->state) {
|
|
+ case ODEBUG_STATE_ACTIVE:
|
|
+ case ODEBUG_STATE_DESTROYED:
|
|
+ break;
|
|
case ODEBUG_STATE_NONE:
|
|
case ODEBUG_STATE_INIT:
|
|
case ODEBUG_STATE_INACTIVE:
|
|
obj->state = ODEBUG_STATE_DESTROYED;
|
|
- break;
|
|
- case ODEBUG_STATE_ACTIVE:
|
|
- state = obj->state;
|
|
+ fallthrough;
|
|
+ default:
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- debug_print_object(obj, "destroy");
|
|
- debug_object_fixup(descr->fixup_destroy, addr, state);
|
|
return;
|
|
-
|
|
- case ODEBUG_STATE_DESTROYED:
|
|
- print_object = true;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
}
|
|
-out_unlock:
|
|
+
|
|
+ o = *obj;
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- if (print_object)
|
|
- debug_print_object(obj, "destroy");
|
|
+ debug_print_object(&o, "destroy");
|
|
+
|
|
+ if (o.state == ODEBUG_STATE_ACTIVE)
|
|
+ debug_object_fixup(descr->fixup_destroy, addr, o.state);
|
|
}
|
|
EXPORT_SYMBOL_GPL(debug_object_destroy);
|
|
|
|
@@ -861,9 +829,8 @@ EXPORT_SYMBOL_GPL(debug_object_destroy);
|
|
*/
|
|
void debug_object_free(void *addr, const struct debug_obj_descr *descr)
|
|
{
|
|
- enum debug_obj_state state;
|
|
+ struct debug_obj *obj, o;
|
|
struct debug_bucket *db;
|
|
- struct debug_obj *obj;
|
|
unsigned long flags;
|
|
|
|
if (!debug_objects_enabled)
|
|
@@ -874,24 +841,26 @@ void debug_object_free(void *addr, const struct debug_obj_descr *descr)
|
|
raw_spin_lock_irqsave(&db->lock, flags);
|
|
|
|
obj = lookup_object(addr, db);
|
|
- if (!obj)
|
|
- goto out_unlock;
|
|
+ if (!obj) {
|
|
+ raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ return;
|
|
+ }
|
|
|
|
switch (obj->state) {
|
|
case ODEBUG_STATE_ACTIVE:
|
|
- state = obj->state;
|
|
- raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- debug_print_object(obj, "free");
|
|
- debug_object_fixup(descr->fixup_free, addr, state);
|
|
- return;
|
|
+ break;
|
|
default:
|
|
hlist_del(&obj->node);
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
free_object(obj);
|
|
return;
|
|
}
|
|
-out_unlock:
|
|
+
|
|
+ o = *obj;
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ debug_print_object(&o, "free");
|
|
+
|
|
+ debug_object_fixup(descr->fixup_free, addr, o.state);
|
|
}
|
|
EXPORT_SYMBOL_GPL(debug_object_free);
|
|
|
|
@@ -943,10 +912,10 @@ void
|
|
debug_object_active_state(void *addr, const struct debug_obj_descr *descr,
|
|
unsigned int expect, unsigned int next)
|
|
{
|
|
+ struct debug_obj o = { .object = addr, .state = ODEBUG_STATE_NOTAVAILABLE, .descr = descr };
|
|
struct debug_bucket *db;
|
|
struct debug_obj *obj;
|
|
unsigned long flags;
|
|
- bool print_object = false;
|
|
|
|
if (!debug_objects_enabled)
|
|
return;
|
|
@@ -959,28 +928,19 @@ debug_object_active_state(void *addr, const struct debug_obj_descr *descr,
|
|
if (obj) {
|
|
switch (obj->state) {
|
|
case ODEBUG_STATE_ACTIVE:
|
|
- if (obj->astate == expect)
|
|
- obj->astate = next;
|
|
- else
|
|
- print_object = true;
|
|
- break;
|
|
-
|
|
+ if (obj->astate != expect)
|
|
+ break;
|
|
+ obj->astate = next;
|
|
+ raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
+ return;
|
|
default:
|
|
- print_object = true;
|
|
break;
|
|
}
|
|
+ o = *obj;
|
|
}
|
|
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- if (!obj) {
|
|
- struct debug_obj o = { .object = addr,
|
|
- .state = ODEBUG_STATE_NOTAVAILABLE,
|
|
- .descr = descr };
|
|
-
|
|
- debug_print_object(&o, "active_state");
|
|
- } else if (print_object) {
|
|
- debug_print_object(obj, "active_state");
|
|
- }
|
|
+ debug_print_object(&o, "active_state");
|
|
}
|
|
EXPORT_SYMBOL_GPL(debug_object_active_state);
|
|
|
|
@@ -988,12 +948,10 @@ EXPORT_SYMBOL_GPL(debug_object_active_state);
|
|
static void __debug_check_no_obj_freed(const void *address, unsigned long size)
|
|
{
|
|
unsigned long flags, oaddr, saddr, eaddr, paddr, chunks;
|
|
- const struct debug_obj_descr *descr;
|
|
- enum debug_obj_state state;
|
|
+ int cnt, objs_checked = 0;
|
|
+ struct debug_obj *obj, o;
|
|
struct debug_bucket *db;
|
|
struct hlist_node *tmp;
|
|
- struct debug_obj *obj;
|
|
- int cnt, objs_checked = 0;
|
|
|
|
saddr = (unsigned long) address;
|
|
eaddr = saddr + size;
|
|
@@ -1015,12 +973,10 @@ repeat:
|
|
|
|
switch (obj->state) {
|
|
case ODEBUG_STATE_ACTIVE:
|
|
- descr = obj->descr;
|
|
- state = obj->state;
|
|
+ o = *obj;
|
|
raw_spin_unlock_irqrestore(&db->lock, flags);
|
|
- debug_print_object(obj, "free");
|
|
- debug_object_fixup(descr->fixup_free,
|
|
- (void *) oaddr, state);
|
|
+ debug_print_object(&o, "free");
|
|
+ debug_object_fixup(o.descr->fixup_free, (void *)oaddr, o.state);
|
|
goto repeat;
|
|
default:
|
|
hlist_del(&obj->node);
|
|
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
|
|
index d74fe13f3dceb..45d19294aa772 100644
|
|
--- a/net/bluetooth/hci_sync.c
|
|
+++ b/net/bluetooth/hci_sync.c
|
|
@@ -3780,12 +3780,14 @@ static int hci_set_event_mask_sync(struct hci_dev *hdev)
|
|
if (lmp_bredr_capable(hdev)) {
|
|
events[4] |= 0x01; /* Flow Specification Complete */
|
|
|
|
- /* Don't set Disconnect Complete when suspended as that
|
|
- * would wakeup the host when disconnecting due to
|
|
- * suspend.
|
|
+ /* Don't set Disconnect Complete and mode change when
|
|
+ * suspended as that would wakeup the host when disconnecting
|
|
+ * due to suspend.
|
|
*/
|
|
- if (hdev->suspended)
|
|
+ if (hdev->suspended) {
|
|
events[0] &= 0xef;
|
|
+ events[2] &= 0xf7;
|
|
+ }
|
|
} else {
|
|
/* Use a different default for LE-only devices */
|
|
memset(events, 0, sizeof(events));
|
|
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
|
|
index 4c5793053393f..81f5974e5eb5a 100644
|
|
--- a/net/bluetooth/l2cap_core.c
|
|
+++ b/net/bluetooth/l2cap_core.c
|
|
@@ -6527,7 +6527,8 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn,
|
|
if (len > skb->len || !cmd->ident) {
|
|
BT_DBG("corrupted command");
|
|
l2cap_sig_send_rej(conn, cmd->ident);
|
|
- break;
|
|
+ skb_pull(skb, len > skb->len ? skb->len : len);
|
|
+ continue;
|
|
}
|
|
|
|
err = l2cap_bredr_sig_cmd(conn, cmd, len, skb->data);
|
|
diff --git a/net/bridge/br_cfm_netlink.c b/net/bridge/br_cfm_netlink.c
|
|
index 5c4c369f8536e..2faab44652e7c 100644
|
|
--- a/net/bridge/br_cfm_netlink.c
|
|
+++ b/net/bridge/br_cfm_netlink.c
|
|
@@ -362,7 +362,7 @@ static int br_cc_ccm_tx_parse(struct net_bridge *br, struct nlattr *attr,
|
|
|
|
memset(&tx_info, 0, sizeof(tx_info));
|
|
|
|
- instance = nla_get_u32(tb[IFLA_BRIDGE_CFM_CC_RDI_INSTANCE]);
|
|
+ instance = nla_get_u32(tb[IFLA_BRIDGE_CFM_CC_CCM_TX_INSTANCE]);
|
|
nla_memcpy(&tx_info.dmac.addr,
|
|
tb[IFLA_BRIDGE_CFM_CC_CCM_TX_DMAC],
|
|
sizeof(tx_info.dmac.addr));
|
|
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
|
index db4f2641d1cd1..9765f9f9bf7ff 100644
|
|
--- a/net/bridge/br_multicast.c
|
|
+++ b/net/bridge/br_multicast.c
|
|
@@ -1607,6 +1607,10 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t)
|
|
}
|
|
#endif
|
|
|
|
+static void br_multicast_query_delay_expired(struct timer_list *t)
|
|
+{
|
|
+}
|
|
+
|
|
static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx,
|
|
struct br_ip *ip,
|
|
struct sk_buff *skb)
|
|
@@ -3024,7 +3028,7 @@ br_multicast_update_query_timer(struct net_bridge_mcast *brmctx,
|
|
unsigned long max_delay)
|
|
{
|
|
if (!timer_pending(&query->timer))
|
|
- query->delay_time = jiffies + max_delay;
|
|
+ mod_timer(&query->delay_timer, jiffies + max_delay);
|
|
|
|
mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval);
|
|
}
|
|
@@ -3867,13 +3871,11 @@ void br_multicast_ctx_init(struct net_bridge *br,
|
|
brmctx->multicast_querier_interval = 255 * HZ;
|
|
brmctx->multicast_membership_interval = 260 * HZ;
|
|
|
|
- brmctx->ip4_other_query.delay_time = 0;
|
|
brmctx->ip4_querier.port_ifidx = 0;
|
|
seqcount_spinlock_init(&brmctx->ip4_querier.seq, &br->multicast_lock);
|
|
brmctx->multicast_igmp_version = 2;
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
brmctx->multicast_mld_version = 1;
|
|
- brmctx->ip6_other_query.delay_time = 0;
|
|
brmctx->ip6_querier.port_ifidx = 0;
|
|
seqcount_spinlock_init(&brmctx->ip6_querier.seq, &br->multicast_lock);
|
|
#endif
|
|
@@ -3882,6 +3884,8 @@ void br_multicast_ctx_init(struct net_bridge *br,
|
|
br_ip4_multicast_local_router_expired, 0);
|
|
timer_setup(&brmctx->ip4_other_query.timer,
|
|
br_ip4_multicast_querier_expired, 0);
|
|
+ timer_setup(&brmctx->ip4_other_query.delay_timer,
|
|
+ br_multicast_query_delay_expired, 0);
|
|
timer_setup(&brmctx->ip4_own_query.timer,
|
|
br_ip4_multicast_query_expired, 0);
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
@@ -3889,6 +3893,8 @@ void br_multicast_ctx_init(struct net_bridge *br,
|
|
br_ip6_multicast_local_router_expired, 0);
|
|
timer_setup(&brmctx->ip6_other_query.timer,
|
|
br_ip6_multicast_querier_expired, 0);
|
|
+ timer_setup(&brmctx->ip6_other_query.delay_timer,
|
|
+ br_multicast_query_delay_expired, 0);
|
|
timer_setup(&brmctx->ip6_own_query.timer,
|
|
br_ip6_multicast_query_expired, 0);
|
|
#endif
|
|
@@ -4023,10 +4029,12 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
|
|
{
|
|
del_timer_sync(&brmctx->ip4_mc_router_timer);
|
|
del_timer_sync(&brmctx->ip4_other_query.timer);
|
|
+ del_timer_sync(&brmctx->ip4_other_query.delay_timer);
|
|
del_timer_sync(&brmctx->ip4_own_query.timer);
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
del_timer_sync(&brmctx->ip6_mc_router_timer);
|
|
del_timer_sync(&brmctx->ip6_other_query.timer);
|
|
+ del_timer_sync(&brmctx->ip6_other_query.delay_timer);
|
|
del_timer_sync(&brmctx->ip6_own_query.timer);
|
|
#endif
|
|
}
|
|
@@ -4469,13 +4477,15 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
|
|
max_delay = brmctx->multicast_query_response_interval;
|
|
|
|
if (!timer_pending(&brmctx->ip4_other_query.timer))
|
|
- brmctx->ip4_other_query.delay_time = jiffies + max_delay;
|
|
+ mod_timer(&brmctx->ip4_other_query.delay_timer,
|
|
+ jiffies + max_delay);
|
|
|
|
br_multicast_start_querier(brmctx, &brmctx->ip4_own_query);
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
if (!timer_pending(&brmctx->ip6_other_query.timer))
|
|
- brmctx->ip6_other_query.delay_time = jiffies + max_delay;
|
|
+ mod_timer(&brmctx->ip6_other_query.delay_timer,
|
|
+ jiffies + max_delay);
|
|
|
|
br_multicast_start_querier(brmctx, &brmctx->ip6_own_query);
|
|
#endif
|
|
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
|
|
index 06e5f6faa4313..51d010f64e066 100644
|
|
--- a/net/bridge/br_private.h
|
|
+++ b/net/bridge/br_private.h
|
|
@@ -77,7 +77,7 @@ struct bridge_mcast_own_query {
|
|
/* other querier */
|
|
struct bridge_mcast_other_query {
|
|
struct timer_list timer;
|
|
- unsigned long delay_time;
|
|
+ struct timer_list delay_timer;
|
|
};
|
|
|
|
/* selected querier */
|
|
@@ -1083,7 +1083,7 @@ __br_multicast_querier_exists(struct net_bridge_mcast *brmctx,
|
|
own_querier_enabled = false;
|
|
}
|
|
|
|
- return time_is_before_jiffies(querier->delay_time) &&
|
|
+ return !timer_pending(&querier->delay_timer) &&
|
|
(own_querier_enabled || timer_pending(&querier->timer));
|
|
}
|
|
|
|
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
|
|
index e19ef88ae181f..a6d460aaee794 100644
|
|
--- a/net/ipv4/ip_output.c
|
|
+++ b/net/ipv4/ip_output.c
|
|
@@ -1268,6 +1268,12 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
|
|
if (unlikely(!rt))
|
|
return -EFAULT;
|
|
|
|
+ cork->fragsize = ip_sk_use_pmtu(sk) ?
|
|
+ dst_mtu(&rt->dst) : READ_ONCE(rt->dst.dev->mtu);
|
|
+
|
|
+ if (!inetdev_valid_mtu(cork->fragsize))
|
|
+ return -ENETUNREACH;
|
|
+
|
|
/*
|
|
* setup for corking.
|
|
*/
|
|
@@ -1284,12 +1290,6 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
|
|
cork->addr = ipc->addr;
|
|
}
|
|
|
|
- cork->fragsize = ip_sk_use_pmtu(sk) ?
|
|
- dst_mtu(&rt->dst) : READ_ONCE(rt->dst.dev->mtu);
|
|
-
|
|
- if (!inetdev_valid_mtu(cork->fragsize))
|
|
- return -ENETUNREACH;
|
|
-
|
|
cork->gso_size = ipc->gso_size;
|
|
|
|
cork->dst = &rt->dst;
|
|
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
|
|
index c1fb7580ea581..a00ba2d51e1b2 100644
|
|
--- a/net/ipv4/ip_sockglue.c
|
|
+++ b/net/ipv4/ip_sockglue.c
|
|
@@ -1406,12 +1406,13 @@ e_inval:
|
|
* ipv4_pktinfo_prepare - transfer some info from rtable to skb
|
|
* @sk: socket
|
|
* @skb: buffer
|
|
+ * @drop_dst: if true, drops skb dst
|
|
*
|
|
* To support IP_CMSG_PKTINFO option, we store rt_iif and specific
|
|
* destination in skb->cb[] before dst drop.
|
|
* This way, receiver doesn't make cache line misses to read rtable.
|
|
*/
|
|
-void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
|
|
+void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb, bool drop_dst)
|
|
{
|
|
struct in_pktinfo *pktinfo = PKTINFO_SKB_CB(skb);
|
|
bool prepare = (inet_sk(sk)->cmsg_flags & IP_CMSG_PKTINFO) ||
|
|
@@ -1440,7 +1441,8 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
|
|
pktinfo->ipi_ifindex = 0;
|
|
pktinfo->ipi_spec_dst.s_addr = 0;
|
|
}
|
|
- skb_dst_drop(skb);
|
|
+ if (drop_dst)
|
|
+ skb_dst_drop(skb);
|
|
}
|
|
|
|
int ip_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
|
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
|
|
index b807197475a57..d5421c38c2aae 100644
|
|
--- a/net/ipv4/ipmr.c
|
|
+++ b/net/ipv4/ipmr.c
|
|
@@ -1073,7 +1073,7 @@ static int ipmr_cache_report(const struct mr_table *mrt,
|
|
msg = (struct igmpmsg *)skb_network_header(skb);
|
|
msg->im_vif = vifi;
|
|
msg->im_vif_hi = vifi >> 8;
|
|
- ipv4_pktinfo_prepare(mroute_sk, pkt);
|
|
+ ipv4_pktinfo_prepare(mroute_sk, pkt, false);
|
|
memcpy(skb->cb, pkt->cb, sizeof(skb->cb));
|
|
/* Add our header */
|
|
igmp = skb_put(skb, sizeof(struct igmphdr));
|
|
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
|
|
index 639aa5abda9dd..7c63b91edbf7a 100644
|
|
--- a/net/ipv4/raw.c
|
|
+++ b/net/ipv4/raw.c
|
|
@@ -286,11 +286,13 @@ void raw_icmp_error(struct sk_buff *skb, int protocol, u32 info)
|
|
|
|
static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|
{
|
|
+ enum skb_drop_reason reason;
|
|
+
|
|
/* Charge it to the socket. */
|
|
|
|
- ipv4_pktinfo_prepare(sk, skb);
|
|
- if (sock_queue_rcv_skb(sk, skb) < 0) {
|
|
- kfree_skb(skb);
|
|
+ ipv4_pktinfo_prepare(sk, skb, true);
|
|
+ if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0) {
|
|
+ kfree_skb_reason(skb, reason);
|
|
return NET_RX_DROP;
|
|
}
|
|
|
|
@@ -301,7 +303,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
|
|
{
|
|
if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) {
|
|
atomic_inc(&sk->sk_drops);
|
|
- kfree_skb(skb);
|
|
+ kfree_skb_reason(skb, SKB_DROP_REASON_XFRM_POLICY);
|
|
return NET_RX_DROP;
|
|
}
|
|
nf_reset_ct(skb);
|
|
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
|
|
index 90e24c3f65570..86e7695d91adf 100644
|
|
--- a/net/ipv4/tcp.c
|
|
+++ b/net/ipv4/tcp.c
|
|
@@ -1934,7 +1934,17 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,
|
|
|
|
static bool can_map_frag(const skb_frag_t *frag)
|
|
{
|
|
- return skb_frag_size(frag) == PAGE_SIZE && !skb_frag_off(frag);
|
|
+ struct page *page;
|
|
+
|
|
+ if (skb_frag_size(frag) != PAGE_SIZE || skb_frag_off(frag))
|
|
+ return false;
|
|
+
|
|
+ page = skb_frag_page(frag);
|
|
+
|
|
+ if (PageCompound(page) || page->mapping)
|
|
+ return false;
|
|
+
|
|
+ return true;
|
|
}
|
|
|
|
static int find_next_mappable_frag(const skb_frag_t *frag,
|
|
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
index 11c0e1c666429..87d759bab0012 100644
|
|
--- a/net/ipv4/udp.c
|
|
+++ b/net/ipv4/udp.c
|
|
@@ -2196,7 +2196,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
|
udp_csum_pull_header(skb);
|
|
|
|
- ipv4_pktinfo_prepare(sk, skb);
|
|
+ ipv4_pktinfo_prepare(sk, skb, true);
|
|
return __udp_queue_rcv_skb(sk, skb);
|
|
|
|
csum_error:
|
|
diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c
|
|
index 507a8353a6bdb..c008d21925d7f 100644
|
|
--- a/net/ipv6/addrconf_core.c
|
|
+++ b/net/ipv6/addrconf_core.c
|
|
@@ -220,19 +220,26 @@ const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {
|
|
EXPORT_SYMBOL_GPL(ipv6_stub);
|
|
|
|
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
|
|
-const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
|
|
+const struct in6_addr in6addr_loopback __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_LOOPBACK_INIT;
|
|
EXPORT_SYMBOL(in6addr_loopback);
|
|
-const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
|
|
+const struct in6_addr in6addr_any __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_ANY_INIT;
|
|
EXPORT_SYMBOL(in6addr_any);
|
|
-const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
|
|
+const struct in6_addr in6addr_linklocal_allnodes __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
|
|
EXPORT_SYMBOL(in6addr_linklocal_allnodes);
|
|
-const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
|
|
+const struct in6_addr in6addr_linklocal_allrouters __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
|
|
EXPORT_SYMBOL(in6addr_linklocal_allrouters);
|
|
-const struct in6_addr in6addr_interfacelocal_allnodes = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
|
|
+const struct in6_addr in6addr_interfacelocal_allnodes __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
|
|
EXPORT_SYMBOL(in6addr_interfacelocal_allnodes);
|
|
-const struct in6_addr in6addr_interfacelocal_allrouters = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
|
|
+const struct in6_addr in6addr_interfacelocal_allrouters __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
|
|
EXPORT_SYMBOL(in6addr_interfacelocal_allrouters);
|
|
-const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
|
|
+const struct in6_addr in6addr_sitelocal_allrouters __aligned(BITS_PER_LONG/8)
|
|
+ = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
|
|
EXPORT_SYMBOL(in6addr_sitelocal_allrouters);
|
|
|
|
static void snmp6_free_dev(struct inet6_dev *idev)
|
|
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
|
|
index 9125e92d9917e..2699915bb85be 100644
|
|
--- a/net/ipv6/ip6_tunnel.c
|
|
+++ b/net/ipv6/ip6_tunnel.c
|
|
@@ -796,8 +796,8 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
|
|
struct sk_buff *skb),
|
|
bool log_ecn_err)
|
|
{
|
|
- const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
|
- int err;
|
|
+ const struct ipv6hdr *ipv6h;
|
|
+ int nh, err;
|
|
|
|
if ((!(tpi->flags & TUNNEL_CSUM) &&
|
|
(tunnel->parms.i_flags & TUNNEL_CSUM)) ||
|
|
@@ -829,7 +829,6 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
|
|
goto drop;
|
|
}
|
|
|
|
- ipv6h = ipv6_hdr(skb);
|
|
skb->protocol = eth_type_trans(skb, tunnel->dev);
|
|
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
|
} else {
|
|
@@ -837,7 +836,23 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
|
|
skb_reset_mac_header(skb);
|
|
}
|
|
|
|
+ /* Save offset of outer header relative to skb->head,
|
|
+ * because we are going to reset the network header to the inner header
|
|
+ * and might change skb->head.
|
|
+ */
|
|
+ nh = skb_network_header(skb) - skb->head;
|
|
+
|
|
skb_reset_network_header(skb);
|
|
+
|
|
+ if (!pskb_inet_may_pull(skb)) {
|
|
+ DEV_STATS_INC(tunnel->dev, rx_length_errors);
|
|
+ DEV_STATS_INC(tunnel->dev, rx_errors);
|
|
+ goto drop;
|
|
+ }
|
|
+
|
|
+ /* Get the outer header. */
|
|
+ ipv6h = (struct ipv6hdr *)(skb->head + nh);
|
|
+
|
|
memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
|
|
|
|
__skb_tunnel_rx(skb, tunnel->dev, tunnel->net);
|
|
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
|
|
index 19c478bd85bd8..8e3be0009f609 100644
|
|
--- a/net/llc/af_llc.c
|
|
+++ b/net/llc/af_llc.c
|
|
@@ -226,6 +226,8 @@ static int llc_ui_release(struct socket *sock)
|
|
}
|
|
netdev_put(llc->dev, &llc->dev_tracker);
|
|
sock_put(sk);
|
|
+ sock_orphan(sk);
|
|
+ sock->sk = NULL;
|
|
llc_sk_free(sk);
|
|
out:
|
|
return 0;
|
|
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
|
|
index 3ac1af6f59fcc..e0092bf273fd0 100644
|
|
--- a/net/netfilter/nf_conntrack_proto_tcp.c
|
|
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
|
|
@@ -457,7 +457,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,
|
|
const struct sk_buff *skb,
|
|
unsigned int dataoff,
|
|
const struct tcphdr *tcph,
|
|
- u32 end, u32 win)
|
|
+ u32 end, u32 win,
|
|
+ enum ip_conntrack_dir dir)
|
|
{
|
|
/* SYN-ACK in reply to a SYN
|
|
* or SYN from reply direction in simultaneous open.
|
|
@@ -471,7 +472,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,
|
|
* Both sides must send the Window Scale option
|
|
* to enable window scaling in either direction.
|
|
*/
|
|
- if (!(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE &&
|
|
+ if (dir == IP_CT_DIR_REPLY &&
|
|
+ !(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE &&
|
|
receiver->flags & IP_CT_TCP_FLAG_WINDOW_SCALE)) {
|
|
sender->td_scale = 0;
|
|
receiver->td_scale = 0;
|
|
@@ -542,7 +544,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,
|
|
if (tcph->syn) {
|
|
tcp_init_sender(sender, receiver,
|
|
skb, dataoff, tcph,
|
|
- end, win);
|
|
+ end, win, dir);
|
|
if (!tcph->ack)
|
|
/* Simultaneous open */
|
|
return NFCT_TCP_ACCEPT;
|
|
@@ -585,7 +587,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,
|
|
*/
|
|
tcp_init_sender(sender, receiver,
|
|
skb, dataoff, tcph,
|
|
- end, win);
|
|
+ end, win, dir);
|
|
|
|
if (dir == IP_CT_DIR_REPLY && !tcph->ack)
|
|
return NFCT_TCP_ACCEPT;
|
|
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c
|
|
index 8a29290149bd7..be93a02497d6c 100644
|
|
--- a/net/netfilter/nf_log.c
|
|
+++ b/net/netfilter/nf_log.c
|
|
@@ -193,11 +193,12 @@ void nf_logger_put(int pf, enum nf_log_type type)
|
|
return;
|
|
}
|
|
|
|
- BUG_ON(loggers[pf][type] == NULL);
|
|
-
|
|
rcu_read_lock();
|
|
logger = rcu_dereference(loggers[pf][type]);
|
|
- module_put(logger->me);
|
|
+ if (!logger)
|
|
+ WARN_ON_ONCE(1);
|
|
+ else
|
|
+ module_put(logger->me);
|
|
rcu_read_unlock();
|
|
}
|
|
EXPORT_SYMBOL_GPL(nf_logger_put);
|
|
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
|
|
index 1edb2138260a8..49acb89ba9c56 100644
|
|
--- a/net/netfilter/nf_tables_api.c
|
|
+++ b/net/netfilter/nf_tables_api.c
|
|
@@ -7129,11 +7129,15 @@ nla_put_failure:
|
|
return -1;
|
|
}
|
|
|
|
-static const struct nft_object_type *__nft_obj_type_get(u32 objtype)
|
|
+static const struct nft_object_type *__nft_obj_type_get(u32 objtype, u8 family)
|
|
{
|
|
const struct nft_object_type *type;
|
|
|
|
list_for_each_entry(type, &nf_tables_objects, list) {
|
|
+ if (type->family != NFPROTO_UNSPEC &&
|
|
+ type->family != family)
|
|
+ continue;
|
|
+
|
|
if (objtype == type->type)
|
|
return type;
|
|
}
|
|
@@ -7141,11 +7145,11 @@ static const struct nft_object_type *__nft_obj_type_get(u32 objtype)
|
|
}
|
|
|
|
static const struct nft_object_type *
|
|
-nft_obj_type_get(struct net *net, u32 objtype)
|
|
+nft_obj_type_get(struct net *net, u32 objtype, u8 family)
|
|
{
|
|
const struct nft_object_type *type;
|
|
|
|
- type = __nft_obj_type_get(objtype);
|
|
+ type = __nft_obj_type_get(objtype, family);
|
|
if (type != NULL && try_module_get(type->owner))
|
|
return type;
|
|
|
|
@@ -7238,7 +7242,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
|
|
if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
|
|
return -EOPNOTSUPP;
|
|
|
|
- type = __nft_obj_type_get(objtype);
|
|
+ type = __nft_obj_type_get(objtype, family);
|
|
if (WARN_ON_ONCE(!type))
|
|
return -ENOENT;
|
|
|
|
@@ -7252,7 +7256,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
|
|
if (!nft_use_inc(&table->use))
|
|
return -EMFILE;
|
|
|
|
- type = nft_obj_type_get(net, objtype);
|
|
+ type = nft_obj_type_get(net, objtype, family);
|
|
if (IS_ERR(type)) {
|
|
err = PTR_ERR(type);
|
|
goto err_type;
|
|
diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c
|
|
index 641dc21f92b43..1101665f52537 100644
|
|
--- a/net/netfilter/nft_ct.c
|
|
+++ b/net/netfilter/nft_ct.c
|
|
@@ -1231,7 +1231,31 @@ static int nft_ct_expect_obj_init(const struct nft_ctx *ctx,
|
|
if (tb[NFTA_CT_EXPECT_L3PROTO])
|
|
priv->l3num = ntohs(nla_get_be16(tb[NFTA_CT_EXPECT_L3PROTO]));
|
|
|
|
+ switch (priv->l3num) {
|
|
+ case NFPROTO_IPV4:
|
|
+ case NFPROTO_IPV6:
|
|
+ if (priv->l3num != ctx->family)
|
|
+ return -EINVAL;
|
|
+
|
|
+ fallthrough;
|
|
+ case NFPROTO_INET:
|
|
+ break;
|
|
+ default:
|
|
+ return -EOPNOTSUPP;
|
|
+ }
|
|
+
|
|
priv->l4proto = nla_get_u8(tb[NFTA_CT_EXPECT_L4PROTO]);
|
|
+ switch (priv->l4proto) {
|
|
+ case IPPROTO_TCP:
|
|
+ case IPPROTO_UDP:
|
|
+ case IPPROTO_UDPLITE:
|
|
+ case IPPROTO_DCCP:
|
|
+ case IPPROTO_SCTP:
|
|
+ break;
|
|
+ default:
|
|
+ return -EOPNOTSUPP;
|
|
+ }
|
|
+
|
|
priv->dport = nla_get_be16(tb[NFTA_CT_EXPECT_DPORT]);
|
|
priv->timeout = nla_get_u32(tb[NFTA_CT_EXPECT_TIMEOUT]);
|
|
priv->size = nla_get_u8(tb[NFTA_CT_EXPECT_SIZE]);
|
|
diff --git a/net/netfilter/nft_tunnel.c b/net/netfilter/nft_tunnel.c
|
|
index 983ade4be3b39..efb505445eac1 100644
|
|
--- a/net/netfilter/nft_tunnel.c
|
|
+++ b/net/netfilter/nft_tunnel.c
|
|
@@ -713,6 +713,7 @@ static const struct nft_object_ops nft_tunnel_obj_ops = {
|
|
|
|
static struct nft_object_type nft_tunnel_obj_type __read_mostly = {
|
|
.type = NFT_OBJECT_TUNNEL,
|
|
+ .family = NFPROTO_NETDEV,
|
|
.ops = &nft_tunnel_obj_ops,
|
|
.maxattr = NFTA_TUNNEL_KEY_MAX,
|
|
.policy = nft_tunnel_key_policy,
|
|
diff --git a/net/rxrpc/conn_service.c b/net/rxrpc/conn_service.c
|
|
index 6e6aa02c6f9e8..249353417a182 100644
|
|
--- a/net/rxrpc/conn_service.c
|
|
+++ b/net/rxrpc/conn_service.c
|
|
@@ -31,7 +31,7 @@ struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *peer,
|
|
struct rxrpc_conn_proto k;
|
|
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
struct rb_node *p;
|
|
- unsigned int seq = 0;
|
|
+ unsigned int seq = 1;
|
|
|
|
k.epoch = sp->hdr.epoch;
|
|
k.cid = sp->hdr.cid & RXRPC_CIDMASK;
|
|
@@ -41,6 +41,7 @@ struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *peer,
|
|
* under just the RCU read lock, so we have to check for
|
|
* changes.
|
|
*/
|
|
+ seq++; /* 2 on the 1st/lockless path, otherwise odd */
|
|
read_seqbegin_or_lock(&peer->service_conn_lock, &seq);
|
|
|
|
p = rcu_dereference_raw(peer->service_conns.rb_node);
|
|
diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c
|
|
index 9b8999e2afca5..867df45228152 100644
|
|
--- a/net/smc/smc_clc.c
|
|
+++ b/net/smc/smc_clc.c
|
|
@@ -155,10 +155,12 @@ static int smc_clc_ueid_remove(char *ueid)
|
|
rc = 0;
|
|
}
|
|
}
|
|
+#if IS_ENABLED(CONFIG_S390)
|
|
if (!rc && !smc_clc_eid_table.ueid_cnt) {
|
|
smc_clc_eid_table.seid_enabled = 1;
|
|
rc = -EAGAIN; /* indicate success and enabling of seid */
|
|
}
|
|
+#endif
|
|
write_unlock(&smc_clc_eid_table.lock);
|
|
return rc;
|
|
}
|
|
@@ -273,22 +275,30 @@ err:
|
|
|
|
int smc_nl_enable_seid(struct sk_buff *skb, struct genl_info *info)
|
|
{
|
|
+#if IS_ENABLED(CONFIG_S390)
|
|
write_lock(&smc_clc_eid_table.lock);
|
|
smc_clc_eid_table.seid_enabled = 1;
|
|
write_unlock(&smc_clc_eid_table.lock);
|
|
return 0;
|
|
+#else
|
|
+ return -EOPNOTSUPP;
|
|
+#endif
|
|
}
|
|
|
|
int smc_nl_disable_seid(struct sk_buff *skb, struct genl_info *info)
|
|
{
|
|
int rc = 0;
|
|
|
|
+#if IS_ENABLED(CONFIG_S390)
|
|
write_lock(&smc_clc_eid_table.lock);
|
|
if (!smc_clc_eid_table.ueid_cnt)
|
|
rc = -ENOENT;
|
|
else
|
|
smc_clc_eid_table.seid_enabled = 0;
|
|
write_unlock(&smc_clc_eid_table.lock);
|
|
+#else
|
|
+ rc = -EOPNOTSUPP;
|
|
+#endif
|
|
return rc;
|
|
}
|
|
|
|
@@ -1168,7 +1178,11 @@ void __init smc_clc_init(void)
|
|
INIT_LIST_HEAD(&smc_clc_eid_table.list);
|
|
rwlock_init(&smc_clc_eid_table.lock);
|
|
smc_clc_eid_table.ueid_cnt = 0;
|
|
+#if IS_ENABLED(CONFIG_S390)
|
|
smc_clc_eid_table.seid_enabled = 1;
|
|
+#else
|
|
+ smc_clc_eid_table.seid_enabled = 0;
|
|
+#endif
|
|
}
|
|
|
|
void smc_clc_exit(void)
|
|
diff --git a/net/sunrpc/xprtmultipath.c b/net/sunrpc/xprtmultipath.c
|
|
index 74ee2271251e3..720d3ba742ec0 100644
|
|
--- a/net/sunrpc/xprtmultipath.c
|
|
+++ b/net/sunrpc/xprtmultipath.c
|
|
@@ -336,8 +336,9 @@ struct rpc_xprt *xprt_iter_current_entry_offline(struct rpc_xprt_iter *xpi)
|
|
xprt_switch_find_current_entry_offline);
|
|
}
|
|
|
|
-bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
|
- const struct sockaddr *sap)
|
|
+static
|
|
+bool __rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
|
+ const struct sockaddr *sap)
|
|
{
|
|
struct list_head *head;
|
|
struct rpc_xprt *pos;
|
|
@@ -356,6 +357,18 @@ bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
|
return false;
|
|
}
|
|
|
|
+bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
|
+ const struct sockaddr *sap)
|
|
+{
|
|
+ bool res;
|
|
+
|
|
+ rcu_read_lock();
|
|
+ res = __rpc_xprt_switch_has_addr(xps, sap);
|
|
+ rcu_read_unlock();
|
|
+
|
|
+ return res;
|
|
+}
|
|
+
|
|
static
|
|
struct rpc_xprt *xprt_switch_find_next_entry(struct list_head *head,
|
|
const struct rpc_xprt *cur, bool check_active)
|
|
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
|
index be2ed7b0fe21c..e1af94393789f 100644
|
|
--- a/net/unix/af_unix.c
|
|
+++ b/net/unix/af_unix.c
|
|
@@ -1322,13 +1322,11 @@ static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)
|
|
unix_state_lock(sk1);
|
|
return;
|
|
}
|
|
- if (sk1 < sk2) {
|
|
- unix_state_lock(sk1);
|
|
- unix_state_lock_nested(sk2);
|
|
- } else {
|
|
- unix_state_lock(sk2);
|
|
- unix_state_lock_nested(sk1);
|
|
- }
|
|
+ if (sk1 > sk2)
|
|
+ swap(sk1, sk2);
|
|
+
|
|
+ unix_state_lock(sk1);
|
|
+ unix_state_lock_nested(sk2, U_LOCK_SECOND);
|
|
}
|
|
|
|
static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)
|
|
@@ -1559,7 +1557,7 @@ restart:
|
|
goto out_unlock;
|
|
}
|
|
|
|
- unix_state_lock_nested(sk);
|
|
+ unix_state_lock_nested(sk, U_LOCK_SECOND);
|
|
|
|
if (sk->sk_state != st) {
|
|
unix_state_unlock(sk);
|
|
diff --git a/net/unix/diag.c b/net/unix/diag.c
|
|
index 616b55c5b8908..3438b7af09af5 100644
|
|
--- a/net/unix/diag.c
|
|
+++ b/net/unix/diag.c
|
|
@@ -84,7 +84,7 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)
|
|
* queue lock. With the other's queue locked it's
|
|
* OK to lock the state.
|
|
*/
|
|
- unix_state_lock_nested(req);
|
|
+ unix_state_lock_nested(req, U_LOCK_DIAG);
|
|
peer = unix_sk(req)->peer;
|
|
buf[i++] = (peer ? sock_i_ino(peer) : 0);
|
|
unix_state_unlock(req);
|
|
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
|
|
index b7e1631b3d80d..3ad4c1032c038 100644
|
|
--- a/net/wireless/scan.c
|
|
+++ b/net/wireless/scan.c
|
|
@@ -1810,8 +1810,12 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
|
|
list_add(&new->hidden_list,
|
|
&hidden->hidden_list);
|
|
hidden->refcount++;
|
|
+
|
|
+ ies = (void *)rcu_access_pointer(new->pub.beacon_ies);
|
|
rcu_assign_pointer(new->pub.beacon_ies,
|
|
hidden->pub.beacon_ies);
|
|
+ if (ies)
|
|
+ kfree_rcu(ies, rcu_head);
|
|
}
|
|
} else {
|
|
/*
|
|
diff --git a/sound/hda/hdac_stream.c b/sound/hda/hdac_stream.c
|
|
index 741a5d17ae4cb..ecd3aec57c87b 100644
|
|
--- a/sound/hda/hdac_stream.c
|
|
+++ b/sound/hda/hdac_stream.c
|
|
@@ -629,17 +629,15 @@ void snd_hdac_stream_timecounter_init(struct hdac_stream *azx_dev,
|
|
struct hdac_stream *s;
|
|
bool inited = false;
|
|
u64 cycle_last = 0;
|
|
- int i = 0;
|
|
|
|
list_for_each_entry(s, &bus->stream_list, list) {
|
|
- if (streams & (1 << i)) {
|
|
+ if ((streams & (1 << s->index))) {
|
|
azx_timecounter_init(s, inited, cycle_last);
|
|
if (!inited) {
|
|
inited = true;
|
|
cycle_last = s->tc.cycle_last;
|
|
}
|
|
}
|
|
- i++;
|
|
}
|
|
|
|
snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
|
|
@@ -684,14 +682,13 @@ void snd_hdac_stream_sync(struct hdac_stream *azx_dev, bool start,
|
|
unsigned int streams)
|
|
{
|
|
struct hdac_bus *bus = azx_dev->bus;
|
|
- int i, nwait, timeout;
|
|
+ int nwait, timeout;
|
|
struct hdac_stream *s;
|
|
|
|
for (timeout = 5000; timeout; timeout--) {
|
|
nwait = 0;
|
|
- i = 0;
|
|
list_for_each_entry(s, &bus->stream_list, list) {
|
|
- if (!(streams & (1 << i++)))
|
|
+ if (!(streams & (1 << s->index)))
|
|
continue;
|
|
|
|
if (start) {
|
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
|
index 5aaf3dcecf27e..a26f2a2d44cf2 100644
|
|
--- a/sound/pci/hda/hda_intel.c
|
|
+++ b/sound/pci/hda/hda_intel.c
|
|
@@ -2549,6 +2549,8 @@ static const struct pci_device_id azx_ids[] = {
|
|
/* Lunarlake-P */
|
|
{ PCI_DEVICE(0x8086, 0xa828),
|
|
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
|
|
+ /* Arrow Lake */
|
|
+ { PCI_DEVICE_DATA(INTEL, HDA_ARL, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE) },
|
|
/* Broxton-P(Apollolake) */
|
|
{ PCI_DEVICE(0x8086, 0x5a98),
|
|
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON },
|
|
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
|
|
index a889cccdd607c..e8819e8a98763 100644
|
|
--- a/sound/pci/hda/patch_conexant.c
|
|
+++ b/sound/pci/hda/patch_conexant.c
|
|
@@ -21,6 +21,12 @@
|
|
#include "hda_jack.h"
|
|
#include "hda_generic.h"
|
|
|
|
+enum {
|
|
+ CX_HEADSET_NOPRESENT = 0,
|
|
+ CX_HEADSET_PARTPRESENT,
|
|
+ CX_HEADSET_ALLPRESENT,
|
|
+};
|
|
+
|
|
struct conexant_spec {
|
|
struct hda_gen_spec gen;
|
|
|
|
@@ -42,7 +48,8 @@ struct conexant_spec {
|
|
unsigned int gpio_led;
|
|
unsigned int gpio_mute_led_mask;
|
|
unsigned int gpio_mic_led_mask;
|
|
-
|
|
+ unsigned int headset_present_flag;
|
|
+ bool is_cx8070_sn6140;
|
|
};
|
|
|
|
|
|
@@ -164,6 +171,27 @@ static void cxt_init_gpio_led(struct hda_codec *codec)
|
|
}
|
|
}
|
|
|
|
+static void cx_fixup_headset_recog(struct hda_codec *codec)
|
|
+{
|
|
+ unsigned int mic_persent;
|
|
+
|
|
+ /* fix some headset type recognize fail issue, such as EDIFIER headset */
|
|
+ /* set micbiasd output current comparator threshold from 66% to 55%. */
|
|
+ snd_hda_codec_write(codec, 0x1c, 0, 0x320, 0x010);
|
|
+ /* set OFF voltage for DFET from -1.2V to -0.8V, set headset micbias registor
|
|
+ * value adjustment trim from 2.2K ohms to 2.0K ohms.
|
|
+ */
|
|
+ snd_hda_codec_write(codec, 0x1c, 0, 0x3b0, 0xe10);
|
|
+ /* fix reboot headset type recognize fail issue */
|
|
+ mic_persent = snd_hda_codec_read(codec, 0x19, 0, AC_VERB_GET_PIN_SENSE, 0x0);
|
|
+ if (mic_persent & AC_PINSENSE_PRESENCE)
|
|
+ /* enable headset mic VREF */
|
|
+ snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24);
|
|
+ else
|
|
+ /* disable headset mic VREF */
|
|
+ snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20);
|
|
+}
|
|
+
|
|
static int cx_auto_init(struct hda_codec *codec)
|
|
{
|
|
struct conexant_spec *spec = codec->spec;
|
|
@@ -174,6 +202,9 @@ static int cx_auto_init(struct hda_codec *codec)
|
|
cxt_init_gpio_led(codec);
|
|
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
|
|
|
|
+ if (spec->is_cx8070_sn6140)
|
|
+ cx_fixup_headset_recog(codec);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -192,6 +223,77 @@ static void cx_auto_free(struct hda_codec *codec)
|
|
snd_hda_gen_free(codec);
|
|
}
|
|
|
|
+static void cx_process_headset_plugin(struct hda_codec *codec)
|
|
+{
|
|
+ unsigned int val;
|
|
+ unsigned int count = 0;
|
|
+
|
|
+ /* Wait headset detect done. */
|
|
+ do {
|
|
+ val = snd_hda_codec_read(codec, 0x1c, 0, 0xca0, 0x0);
|
|
+ if (val & 0x080) {
|
|
+ codec_dbg(codec, "headset type detect done!\n");
|
|
+ break;
|
|
+ }
|
|
+ msleep(20);
|
|
+ count++;
|
|
+ } while (count < 3);
|
|
+ val = snd_hda_codec_read(codec, 0x1c, 0, 0xcb0, 0x0);
|
|
+ if (val & 0x800) {
|
|
+ codec_dbg(codec, "headset plugin, type is CTIA\n");
|
|
+ snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24);
|
|
+ } else if (val & 0x400) {
|
|
+ codec_dbg(codec, "headset plugin, type is OMTP\n");
|
|
+ snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24);
|
|
+ } else {
|
|
+ codec_dbg(codec, "headphone plugin\n");
|
|
+ }
|
|
+}
|
|
+
|
|
+static void cx_update_headset_mic_vref(struct hda_codec *codec, unsigned int res)
|
|
+{
|
|
+ unsigned int phone_present, mic_persent, phone_tag, mic_tag;
|
|
+ struct conexant_spec *spec = codec->spec;
|
|
+
|
|
+ /* In cx8070 and sn6140, the node 16 can only be config to headphone or disabled,
|
|
+ * the node 19 can only be config to microphone or disabled.
|
|
+ * Check hp&mic tag to process headset pulgin&plugout.
|
|
+ */
|
|
+ phone_tag = snd_hda_codec_read(codec, 0x16, 0, AC_VERB_GET_UNSOLICITED_RESPONSE, 0x0);
|
|
+ mic_tag = snd_hda_codec_read(codec, 0x19, 0, AC_VERB_GET_UNSOLICITED_RESPONSE, 0x0);
|
|
+ if ((phone_tag & (res >> AC_UNSOL_RES_TAG_SHIFT)) ||
|
|
+ (mic_tag & (res >> AC_UNSOL_RES_TAG_SHIFT))) {
|
|
+ phone_present = snd_hda_codec_read(codec, 0x16, 0, AC_VERB_GET_PIN_SENSE, 0x0);
|
|
+ if (!(phone_present & AC_PINSENSE_PRESENCE)) {/* headphone plugout */
|
|
+ spec->headset_present_flag = CX_HEADSET_NOPRESENT;
|
|
+ snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20);
|
|
+ return;
|
|
+ }
|
|
+ if (spec->headset_present_flag == CX_HEADSET_NOPRESENT) {
|
|
+ spec->headset_present_flag = CX_HEADSET_PARTPRESENT;
|
|
+ } else if (spec->headset_present_flag == CX_HEADSET_PARTPRESENT) {
|
|
+ mic_persent = snd_hda_codec_read(codec, 0x19, 0,
|
|
+ AC_VERB_GET_PIN_SENSE, 0x0);
|
|
+ /* headset is present */
|
|
+ if ((phone_present & AC_PINSENSE_PRESENCE) &&
|
|
+ (mic_persent & AC_PINSENSE_PRESENCE)) {
|
|
+ cx_process_headset_plugin(codec);
|
|
+ spec->headset_present_flag = CX_HEADSET_ALLPRESENT;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static void cx_jack_unsol_event(struct hda_codec *codec, unsigned int res)
|
|
+{
|
|
+ struct conexant_spec *spec = codec->spec;
|
|
+
|
|
+ if (spec->is_cx8070_sn6140)
|
|
+ cx_update_headset_mic_vref(codec, res);
|
|
+
|
|
+ snd_hda_jack_unsol_event(codec, res);
|
|
+}
|
|
+
|
|
#ifdef CONFIG_PM
|
|
static int cx_auto_suspend(struct hda_codec *codec)
|
|
{
|
|
@@ -205,7 +307,7 @@ static const struct hda_codec_ops cx_auto_patch_ops = {
|
|
.build_pcms = snd_hda_gen_build_pcms,
|
|
.init = cx_auto_init,
|
|
.free = cx_auto_free,
|
|
- .unsol_event = snd_hda_jack_unsol_event,
|
|
+ .unsol_event = cx_jack_unsol_event,
|
|
#ifdef CONFIG_PM
|
|
.suspend = cx_auto_suspend,
|
|
.check_power_status = snd_hda_gen_check_power_status,
|
|
@@ -1042,6 +1144,15 @@ static int patch_conexant_auto(struct hda_codec *codec)
|
|
codec->spec = spec;
|
|
codec->patch_ops = cx_auto_patch_ops;
|
|
|
|
+ /* init cx8070/sn6140 flag and reset headset_present_flag */
|
|
+ switch (codec->core.vendor_id) {
|
|
+ case 0x14f11f86:
|
|
+ case 0x14f11f87:
|
|
+ spec->is_cx8070_sn6140 = true;
|
|
+ spec->headset_present_flag = CX_HEADSET_NOPRESENT;
|
|
+ break;
|
|
+ }
|
|
+
|
|
cx_auto_parse_eapd(codec);
|
|
spec->gen.own_eapd_ctl = 1;
|
|
|
|
diff --git a/sound/soc/amd/acp-config.c b/sound/soc/amd/acp-config.c
|
|
index 0932473b63945..9ee71a99a0871 100644
|
|
--- a/sound/soc/amd/acp-config.c
|
|
+++ b/sound/soc/amd/acp-config.c
|
|
@@ -3,7 +3,7 @@
|
|
// This file is provided under a dual BSD/GPLv2 license. When using or
|
|
// redistributing this file, you may do so under either license.
|
|
//
|
|
-// Copyright(c) 2021 Advanced Micro Devices, Inc.
|
|
+// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc.
|
|
//
|
|
// Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
|
|
//
|
|
@@ -35,6 +35,19 @@ static const struct config_entry config_table[] = {
|
|
{}
|
|
},
|
|
},
|
|
+ {
|
|
+ .flags = FLAG_AMD_LEGACY,
|
|
+ .device = ACP_PCI_DEV_ID,
|
|
+ .dmi_table = (const struct dmi_system_id []) {
|
|
+ {
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"),
|
|
+ },
|
|
+ },
|
|
+ {}
|
|
+ },
|
|
+ },
|
|
{
|
|
.flags = FLAG_AMD_SOF,
|
|
.device = ACP_PCI_DEV_ID,
|
|
diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
|
|
index 2ccc68513f7c1..bb9de5767ebcd 100644
|
|
--- a/sound/soc/codecs/lpass-wsa-macro.c
|
|
+++ b/sound/soc/codecs/lpass-wsa-macro.c
|
|
@@ -1581,7 +1581,6 @@ static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
|
|
u16 gain_reg;
|
|
u16 reg;
|
|
int val;
|
|
- int offset_val = 0;
|
|
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
|
|
|
if (w->shift == WSA_MACRO_COMP1) {
|
|
@@ -1620,10 +1619,8 @@ static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
|
|
CDC_WSA_RX1_RX_PATH_MIX_SEC0,
|
|
CDC_WSA_RX_PGA_HALF_DB_MASK,
|
|
CDC_WSA_RX_PGA_HALF_DB_ENABLE);
|
|
- offset_val = -2;
|
|
}
|
|
val = snd_soc_component_read(component, gain_reg);
|
|
- val += offset_val;
|
|
snd_soc_component_write(component, gain_reg, val);
|
|
wsa_macro_config_ear_spkr_gain(component, wsa,
|
|
event, gain_reg);
|
|
@@ -1651,10 +1648,6 @@ static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
|
|
CDC_WSA_RX1_RX_PATH_MIX_SEC0,
|
|
CDC_WSA_RX_PGA_HALF_DB_MASK,
|
|
CDC_WSA_RX_PGA_HALF_DB_DISABLE);
|
|
- offset_val = 2;
|
|
- val = snd_soc_component_read(component, gain_reg);
|
|
- val += offset_val;
|
|
- snd_soc_component_write(component, gain_reg, val);
|
|
}
|
|
wsa_macro_config_ear_spkr_gain(component, wsa,
|
|
event, gain_reg);
|
|
diff --git a/sound/soc/codecs/wsa883x.c b/sound/soc/codecs/wsa883x.c
|
|
index b152f4e5c4f2b..cd96c35a150c8 100644
|
|
--- a/sound/soc/codecs/wsa883x.c
|
|
+++ b/sound/soc/codecs/wsa883x.c
|
|
@@ -1102,7 +1102,11 @@ static int wsa_dev_mode_put(struct snd_kcontrol *kcontrol,
|
|
return 1;
|
|
}
|
|
|
|
-static const DECLARE_TLV_DB_SCALE(pa_gain, -300, 150, -300);
|
|
+static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(pa_gain,
|
|
+ 0, 14, TLV_DB_SCALE_ITEM(-300, 0, 0),
|
|
+ 15, 29, TLV_DB_SCALE_ITEM(-300, 150, 0),
|
|
+ 30, 31, TLV_DB_SCALE_ITEM(1800, 0, 0),
|
|
+);
|
|
|
|
static int wsa883x_get_swr_port(struct snd_kcontrol *kcontrol,
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
diff --git a/tools/build/feature/test-libopencsd.c b/tools/build/feature/test-libopencsd.c
|
|
index eb6303ff446ed..4cfcef9da3e43 100644
|
|
--- a/tools/build/feature/test-libopencsd.c
|
|
+++ b/tools/build/feature/test-libopencsd.c
|
|
@@ -4,9 +4,9 @@
|
|
/*
|
|
* Check OpenCSD library version is sufficient to provide required features
|
|
*/
|
|
-#define OCSD_MIN_VER ((1 << 16) | (1 << 8) | (1))
|
|
+#define OCSD_MIN_VER ((1 << 16) | (2 << 8) | (1))
|
|
#if !defined(OCSD_VER_NUM) || (OCSD_VER_NUM < OCSD_MIN_VER)
|
|
-#error "OpenCSD >= 1.1.1 is required"
|
|
+#error "OpenCSD >= 1.2.1 is required"
|
|
#endif
|
|
|
|
int main(void)
|
|
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
|
|
index 10f15a3e3a95e..e2014b1250ea2 100644
|
|
--- a/tools/lib/bpf/libbpf.c
|
|
+++ b/tools/lib/bpf/libbpf.c
|
|
@@ -4157,6 +4157,8 @@ bpf_object__collect_prog_relos(struct bpf_object *obj, Elf64_Shdr *shdr, Elf_Dat
|
|
|
|
scn = elf_sec_by_idx(obj, sec_idx);
|
|
scn_data = elf_sec_data(obj, scn);
|
|
+ if (!scn_data)
|
|
+ return -LIBBPF_ERRNO__FORMAT;
|
|
|
|
relo_sec_name = elf_sec_str(obj, shdr->sh_name);
|
|
sec_name = elf_sec_name(obj, scn);
|
|
diff --git a/tools/lib/subcmd/help.c b/tools/lib/subcmd/help.c
|
|
index bf02d62a3b2b5..42f57b640f119 100644
|
|
--- a/tools/lib/subcmd/help.c
|
|
+++ b/tools/lib/subcmd/help.c
|
|
@@ -50,11 +50,21 @@ void uniq(struct cmdnames *cmds)
|
|
if (!cmds->cnt)
|
|
return;
|
|
|
|
- for (i = j = 1; i < cmds->cnt; i++)
|
|
- if (strcmp(cmds->names[i]->name, cmds->names[i-1]->name))
|
|
- cmds->names[j++] = cmds->names[i];
|
|
-
|
|
+ for (i = 1; i < cmds->cnt; i++) {
|
|
+ if (!strcmp(cmds->names[i]->name, cmds->names[i-1]->name))
|
|
+ zfree(&cmds->names[i - 1]);
|
|
+ }
|
|
+ for (i = 0, j = 0; i < cmds->cnt; i++) {
|
|
+ if (cmds->names[i]) {
|
|
+ if (i == j)
|
|
+ j++;
|
|
+ else
|
|
+ cmds->names[j++] = cmds->names[i];
|
|
+ }
|
|
+ }
|
|
cmds->cnt = j;
|
|
+ while (j < i)
|
|
+ cmds->names[j++] = NULL;
|
|
}
|
|
|
|
void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
|
|
diff --git a/tools/testing/selftests/bpf/cgroup_helpers.c b/tools/testing/selftests/bpf/cgroup_helpers.c
|
|
index e914cc45b7669..6f00bee917a0b 100644
|
|
--- a/tools/testing/selftests/bpf/cgroup_helpers.c
|
|
+++ b/tools/testing/selftests/bpf/cgroup_helpers.c
|
|
@@ -467,10 +467,20 @@ int setup_classid_environment(void)
|
|
return 1;
|
|
}
|
|
|
|
- if (mount("net_cls", NETCLS_MOUNT_PATH, "cgroup", 0, "net_cls") &&
|
|
- errno != EBUSY) {
|
|
- log_err("mount cgroup net_cls");
|
|
- return 1;
|
|
+ if (mount("net_cls", NETCLS_MOUNT_PATH, "cgroup", 0, "net_cls")) {
|
|
+ if (errno != EBUSY) {
|
|
+ log_err("mount cgroup net_cls");
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ if (rmdir(NETCLS_MOUNT_PATH)) {
|
|
+ log_err("rmdir cgroup net_cls");
|
|
+ return 1;
|
|
+ }
|
|
+ if (umount(CGROUP_MOUNT_DFLT)) {
|
|
+ log_err("umount cgroup base");
|
|
+ return 1;
|
|
+ }
|
|
}
|
|
|
|
cleanup_classid_environment();
|
|
diff --git a/tools/testing/selftests/bpf/prog_tests/btf.c b/tools/testing/selftests/bpf/prog_tests/btf.c
|
|
index d711f4bea98ea..47cb753ef1e3a 100644
|
|
--- a/tools/testing/selftests/bpf/prog_tests/btf.c
|
|
+++ b/tools/testing/selftests/bpf/prog_tests/btf.c
|
|
@@ -5211,6 +5211,7 @@ static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind)
|
|
#endif
|
|
|
|
assert(0);
|
|
+ return 0;
|
|
}
|
|
|
|
static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind,
|
|
diff --git a/tools/testing/selftests/bpf/progs/pyperf180.c b/tools/testing/selftests/bpf/progs/pyperf180.c
|
|
index c39f559d3100e..42c4a8b62e360 100644
|
|
--- a/tools/testing/selftests/bpf/progs/pyperf180.c
|
|
+++ b/tools/testing/selftests/bpf/progs/pyperf180.c
|
|
@@ -1,4 +1,26 @@
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
// Copyright (c) 2019 Facebook
|
|
#define STACK_MAX_LEN 180
|
|
+
|
|
+/* llvm upstream commit at clang18
|
|
+ * https://github.com/llvm/llvm-project/commit/1a2e77cf9e11dbf56b5720c607313a566eebb16e
|
|
+ * changed inlining behavior and caused compilation failure as some branch
|
|
+ * target distance exceeded 16bit representation which is the maximum for
|
|
+ * cpu v1/v2/v3. Macro __BPF_CPU_VERSION__ is later implemented in clang18
|
|
+ * to specify which cpu version is used for compilation. So a smaller
|
|
+ * unroll_count can be set if __BPF_CPU_VERSION__ is less than 4, which
|
|
+ * reduced some branch target distances and resolved the compilation failure.
|
|
+ *
|
|
+ * To capture the case where a developer/ci uses clang18 but the corresponding
|
|
+ * repo checkpoint does not have __BPF_CPU_VERSION__, a smaller unroll_count
|
|
+ * will be set as well to prevent potential compilation failures.
|
|
+ */
|
|
+#ifdef __BPF_CPU_VERSION__
|
|
+#if __BPF_CPU_VERSION__ < 4
|
|
+#define UNROLL_COUNT 90
|
|
+#endif
|
|
+#elif __clang_major__ == 18
|
|
+#define UNROLL_COUNT 90
|
|
+#endif
|
|
+
|
|
#include "pyperf.h"
|
|
diff --git a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
|
|
index 16c7fb858ac10..696ef9bf3afc4 100644
|
|
--- a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
|
|
+++ b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
|
|
@@ -46,6 +46,17 @@ test_LAG_cleanup()
|
|
ip link add mv0 link "$name" up address "$ucaddr" type macvlan
|
|
# Used to test dev->mc handling
|
|
ip address add "$addr6" dev "$name"
|
|
+
|
|
+ # Check that addresses were added as expected
|
|
+ (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 ||
|
|
+ grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null
|
|
+ check_err $? "macvlan unicast address not found on a slave"
|
|
+
|
|
+ # mcaddr is added asynchronously by addrconf_dad_work(), use busywait
|
|
+ (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 ||
|
|
+ grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null
|
|
+ check_err $? "IPv6 solicited-node multicast mac address not found on a slave"
|
|
+
|
|
ip link set dev "$name" down
|
|
ip link del "$name"
|
|
|
|
diff --git a/tools/testing/selftests/drivers/net/team/config b/tools/testing/selftests/drivers/net/team/config
|
|
index 265b6882cc21e..b5e3a3aad4bfb 100644
|
|
--- a/tools/testing/selftests/drivers/net/team/config
|
|
+++ b/tools/testing/selftests/drivers/net/team/config
|
|
@@ -1,3 +1,5 @@
|
|
+CONFIG_DUMMY=y
|
|
+CONFIG_IPV6=y
|
|
+CONFIG_MACVLAN=y
|
|
CONFIG_NET_TEAM=y
|
|
CONFIG_NET_TEAM_MODE_LOADBALANCE=y
|
|
-CONFIG_MACVLAN=y
|
|
diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
|
|
index bd89198cd8176..ec097f2457265 100644
|
|
--- a/tools/testing/selftests/net/config
|
|
+++ b/tools/testing/selftests/net/config
|
|
@@ -13,6 +13,7 @@ CONFIG_IPV6_VTI=y
|
|
CONFIG_DUMMY=y
|
|
CONFIG_BRIDGE=y
|
|
CONFIG_VLAN_8021Q=y
|
|
+CONFIG_GENEVE=m
|
|
CONFIG_IFB=y
|
|
CONFIG_NETFILTER=y
|
|
CONFIG_NETFILTER_ADVANCED=y
|
|
diff --git a/tools/testing/selftests/net/pmtu.sh b/tools/testing/selftests/net/pmtu.sh
|
|
index 0d705fdcf3b76..1b6e484e586dc 100755
|
|
--- a/tools/testing/selftests/net/pmtu.sh
|
|
+++ b/tools/testing/selftests/net/pmtu.sh
|
|
@@ -713,23 +713,23 @@ setup_xfrm6() {
|
|
}
|
|
|
|
setup_xfrm4udp() {
|
|
- setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0"
|
|
- setup_nettest_xfrm 4 4500
|
|
+ setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \
|
|
+ setup_nettest_xfrm 4 4500
|
|
}
|
|
|
|
setup_xfrm6udp() {
|
|
- setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0"
|
|
- setup_nettest_xfrm 6 4500
|
|
+ setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \
|
|
+ setup_nettest_xfrm 6 4500
|
|
}
|
|
|
|
setup_xfrm4udprouted() {
|
|
- setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0"
|
|
- setup_nettest_xfrm 4 4500
|
|
+ setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" && \
|
|
+ setup_nettest_xfrm 4 4500
|
|
}
|
|
|
|
setup_xfrm6udprouted() {
|
|
- setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0"
|
|
- setup_nettest_xfrm 6 4500
|
|
+ setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" && \
|
|
+ setup_nettest_xfrm 6 4500
|
|
}
|
|
|
|
setup_routing_old() {
|
|
diff --git a/tools/testing/selftests/net/setup_veth.sh b/tools/testing/selftests/net/setup_veth.sh
|
|
index 1003ddf7b3b26..227fd1076f213 100644
|
|
--- a/tools/testing/selftests/net/setup_veth.sh
|
|
+++ b/tools/testing/selftests/net/setup_veth.sh
|
|
@@ -8,7 +8,7 @@ setup_veth_ns() {
|
|
local -r ns_mac="$4"
|
|
|
|
[[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}"
|
|
- echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout"
|
|
+ echo 1000000 > "/sys/class/net/${ns_dev}/gro_flush_timeout"
|
|
ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535
|
|
ip -netns "${ns_name}" link set dev "${ns_dev}" up
|
|
|
|
diff --git a/tools/testing/selftests/sgx/test_encl.lds b/tools/testing/selftests/sgx/test_encl.lds
|
|
index a1ec64f7d91fc..108bc11d1d8c5 100644
|
|
--- a/tools/testing/selftests/sgx/test_encl.lds
|
|
+++ b/tools/testing/selftests/sgx/test_encl.lds
|
|
@@ -34,8 +34,4 @@ SECTIONS
|
|
}
|
|
}
|
|
|
|
-ASSERT(!DEFINED(.altinstructions), "ALTERNATIVES are not supported in enclaves")
|
|
-ASSERT(!DEFINED(.altinstr_replacement), "ALTERNATIVES are not supported in enclaves")
|
|
-ASSERT(!DEFINED(.discard.retpoline_safe), "RETPOLINE ALTERNATIVES are not supported in enclaves")
|
|
-ASSERT(!DEFINED(.discard.nospec), "RETPOLINE ALTERNATIVES are not supported in enclaves")
|
|
-ASSERT(!DEFINED(.got.plt), "Libcalls are not supported in enclaves")
|
|
+ASSERT(!DEFINED(_GLOBAL_OFFSET_TABLE_), "Libcalls through GOT are not supported in enclaves")
|