aboutsummaryrefslogtreecommitdiffstats
path: root/queue-5.4
diff options
context:
space:
mode:
authorSasha Levin <sashal@kernel.org>2024-03-15 15:17:17 -0400
committerSasha Levin <sashal@kernel.org>2024-03-15 15:17:17 -0400
commite959bb7661f42487b08977264a176e908bd1f997 (patch)
tree90081657f28f25ebdbb76b6250cc83936ab22e89 /queue-5.4
parenta63aeec32555da7d8bea9b0d4cb5473d709932a8 (diff)
downloadstable-queue-e959bb7661f42487b08977264a176e908bd1f997.tar.gz
Linux 5.4.272v5.4.272
Diffstat (limited to 'queue-5.4')
-rw-r--r--queue-5.4/arm64-dts-qcom-add-pdc-interrupt-controller-for-sdm8.patch43
-rw-r--r--queue-5.4/arm64-dts-qcom-sdm845-fix-usb-dp-dm-hs-phy-interrupt.patch68
-rw-r--r--queue-5.4/geneve-make-sure-to-pull-inner-header-in-geneve_rx.patch139
-rw-r--r--queue-5.4/getrusage-add-the-signal_struct-sig-local-variable.patch93
-rw-r--r--queue-5.4/getrusage-move-thread_group_cputime_adjusted-outside.patch111
-rw-r--r--queue-5.4/getrusage-use-__for_each_thread.patch43
-rw-r--r--queue-5.4/getrusage-use-sig-stats_lock-rather-than-lock_task_s.patch92
-rw-r--r--queue-5.4/hv_netvsc-make-netvsc-vf-binding-check-both-mac-and-.patch60
-rw-r--r--queue-5.4/hv_netvsc-register-vf-in-netvsc_probe-if-net_device_.patch184
-rw-r--r--queue-5.4/hv_netvsc-use-netif_is_bond_master-instead-of-open-c.patch38
-rw-r--r--queue-5.4/input-i8042-fix-strange-behavior-of-touchpad-on-clev.patch52
-rw-r--r--queue-5.4/ixgbe-dis-en-able-irqs-in-ixgbe_txrx_ring_-dis-en-ab.patch138
-rw-r--r--queue-5.4/lan78xx-add-missing-return-code-checks.patch776
-rw-r--r--queue-5.4/lan78xx-fix-partial-packet-errors-on-suspend-resume.patch455
-rw-r--r--queue-5.4/lan78xx-fix-race-conditions-in-suspend-resume-handli.patch749
-rw-r--r--queue-5.4/lan78xx-fix-white-space-and-style-issues.patch255
-rw-r--r--queue-5.4/net-ice-fix-potential-null-pointer-dereference-in-ic.patch40
-rw-r--r--queue-5.4/net-ipv6-avoid-possible-uaf-in-ip6_route_mpath_notif.patch258
-rw-r--r--queue-5.4/net-lan78xx-fix-runtime-pm-count-underflow-on-link-s.patch45
-rw-r--r--queue-5.4/net-rds-fix-warning-in-rds_conn_connect_if_down.patch57
-rw-r--r--queue-5.4/netfilter-nf_conntrack_h323-add-protection-for-bmp-l.patch71
-rw-r--r--queue-5.4/netfilter-nft_ct-fix-l3num-expectations-with-inet-ps.patch62
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_default_.patch36
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_link_fai.patch36
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_obsolesc.patch37
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_routing_.patch36
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch36
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-1660736
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-2109537
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-2436236
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-3172837
-rw-r--r--queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-408037
-rw-r--r--queue-5.4/netrom-fix-data-races-around-sysctl_net_busy_read.patch68
-rw-r--r--queue-5.4/netrom-fix-data-races-around-sysctl_netrom_network_t.patch74
-rw-r--r--queue-5.4/regmap-add-bulk-read-write-callbacks-into-regmap_con.patch300
-rw-r--r--queue-5.4/regmap-allow-to-define-reg_update_bits-for-no-bus-co.patch65
-rw-r--r--queue-5.4/selftests-mm-fix-map_hugetlb-failure-on-64k-page-siz.patch61
-rw-r--r--queue-5.4/serial-max310x-fail-probe-if-clock-crystal-is-unstab.patch75
-rw-r--r--queue-5.4/serial-max310x-fix-io-data-corruption-in-batched-ope.patch99
-rw-r--r--queue-5.4/serial-max310x-implement-i2c-support.patch270
-rw-r--r--queue-5.4/serial-max310x-make-accessing-revision-id-interface-.patch157
-rw-r--r--queue-5.4/serial-max310x-make-use-of-device-properties.patch97
-rw-r--r--queue-5.4/serial-max310x-prevent-infinite-while-loop-in-port-s.patch76
-rw-r--r--queue-5.4/serial-max310x-try-to-get-crystal-clock-rate-from-pr.patch113
-rw-r--r--queue-5.4/serial-max310x-unprepare-and-disable-clock-in-error-.patch40
-rw-r--r--queue-5.4/serial-max310x-use-a-separate-regmap-for-each-port.patch243
-rw-r--r--queue-5.4/serial-max310x-use-devm_clk_get_optional-to-get-the-.patch77
-rw-r--r--queue-5.4/serial-max310x-use-regmap-methods-for-spi-batch-oper.patch93
-rw-r--r--queue-5.4/series50
-rw-r--r--queue-5.4/um-allow-not-setting-extra-rpaths-in-the-linux-binar.patch82
-rw-r--r--queue-5.4/y2038-rusage-use-__kernel_old_timeval.patch81
51 files changed, 0 insertions, 6314 deletions
diff --git a/queue-5.4/arm64-dts-qcom-add-pdc-interrupt-controller-for-sdm8.patch b/queue-5.4/arm64-dts-qcom-add-pdc-interrupt-controller-for-sdm8.patch
deleted file mode 100644
index 95f049b607..0000000000
--- a/queue-5.4/arm64-dts-qcom-add-pdc-interrupt-controller-for-sdm8.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 76fa4c09fba0ca3c5f802eaab36596953389dbb8 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 15 Nov 2019 15:11:53 -0700
-Subject: arm64: dts: qcom: add PDC interrupt controller for SDM845
-
-From: Lina Iyer <ilina@codeaurora.org>
-
-[ Upstream commit 72b67ebf9d242d8d18545250f340c736d900f763 ]
-
-Add PDC interrupt controller device bindings for SDM845.
-
-Signed-off-by: Lina Iyer <ilina@codeaurora.org>
-Reviewed-by: Stephen Boyd <swboyd@chromium.org>
-Link: https://lore.kernel.org/r/1573855915-9841-11-git-send-email-ilina@codeaurora.org
-Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/arm64/boot/dts/qcom/sdm845.dtsi | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi
-index 845005f1be2de..f5b7150dadfcd 100644
---- a/arch/arm64/boot/dts/qcom/sdm845.dtsi
-+++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi
-@@ -2940,6 +2940,15 @@
- #power-domain-cells = <1>;
- };
-
-+ pdc_intc: interrupt-controller@b220000 {
-+ compatible = "qcom,sdm845-pdc", "qcom,pdc";
-+ reg = <0 0x0b220000 0 0x30000>;
-+ qcom,pdc-ranges = <0 480 94>, <94 609 15>, <115 630 7>;
-+ #interrupt-cells = <2>;
-+ interrupt-parent = <&intc>;
-+ interrupt-controller;
-+ };
-+
- pdc_reset: reset-controller@b2e0000 {
- compatible = "qcom,sdm845-pdc-global";
- reg = <0 0x0b2e0000 0 0x20000>;
---
-2.43.0
-
diff --git a/queue-5.4/arm64-dts-qcom-sdm845-fix-usb-dp-dm-hs-phy-interrupt.patch b/queue-5.4/arm64-dts-qcom-sdm845-fix-usb-dp-dm-hs-phy-interrupt.patch
deleted file mode 100644
index 3ab6e1fe35..0000000000
--- a/queue-5.4/arm64-dts-qcom-sdm845-fix-usb-dp-dm-hs-phy-interrupt.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From f3b25389813be22a28c7cee1d2f27d83878d68f2 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 13 Dec 2023 18:34:00 +0100
-Subject: arm64: dts: qcom: sdm845: fix USB DP/DM HS PHY interrupts
-
-From: Johan Hovold <johan+linaro@kernel.org>
-
-[ Upstream commit 204f9ed4bad6293933179517624143b8f412347c ]
-
-The USB DP/DM HS PHY interrupts need to be provided by the PDC interrupt
-controller in order to be able to wake the system up from low-power
-states and to be able to detect disconnect events, which requires
-triggering on falling edges.
-
-A recent commit updated the trigger type but failed to change the
-interrupt provider as required. This leads to the current Linux driver
-failing to probe instead of printing an error during suspend and USB
-wakeup not working as intended.
-
-Fixes: 84ad9ac8d9ca ("arm64: dts: qcom: sdm845: fix USB wakeup interrupt types")
-Fixes: ca4db2b538a1 ("arm64: dts: qcom: sdm845: Add USB-related nodes")
-Cc: stable@vger.kernel.org # 4.20
-Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
-Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
-Link: https://lore.kernel.org/r/20231213173403.29544-3-johan+linaro@kernel.org
-Signed-off-by: Bjorn Andersson <andersson@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/arm64/boot/dts/qcom/sdm845.dtsi | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
-
-diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi
-index f5b7150dadfcd..b4a0234f66d16 100644
---- a/arch/arm64/boot/dts/qcom/sdm845.dtsi
-+++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi
-@@ -2501,10 +2501,10 @@
- <&gcc GCC_USB30_PRIM_MASTER_CLK>;
- assigned-clock-rates = <19200000>, <150000000>;
-
-- interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
-- <GIC_SPI 486 IRQ_TYPE_LEVEL_HIGH>,
-- <GIC_SPI 488 IRQ_TYPE_EDGE_BOTH>,
-- <GIC_SPI 489 IRQ_TYPE_EDGE_BOTH>;
-+ interrupts-extended = <&intc GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
-+ <&intc GIC_SPI 486 IRQ_TYPE_LEVEL_HIGH>,
-+ <&pdc_intc 8 IRQ_TYPE_EDGE_BOTH>,
-+ <&pdc_intc 9 IRQ_TYPE_EDGE_BOTH>;
- interrupt-names = "hs_phy_irq", "ss_phy_irq",
- "dm_hs_phy_irq", "dp_hs_phy_irq";
-
-@@ -2545,10 +2545,10 @@
- <&gcc GCC_USB30_SEC_MASTER_CLK>;
- assigned-clock-rates = <19200000>, <150000000>;
-
-- interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
-- <GIC_SPI 487 IRQ_TYPE_LEVEL_HIGH>,
-- <GIC_SPI 490 IRQ_TYPE_EDGE_BOTH>,
-- <GIC_SPI 491 IRQ_TYPE_EDGE_BOTH>;
-+ interrupts-extended = <&intc GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
-+ <&intc GIC_SPI 487 IRQ_TYPE_LEVEL_HIGH>,
-+ <&pdc_intc 10 IRQ_TYPE_EDGE_BOTH>,
-+ <&pdc_intc 11 IRQ_TYPE_EDGE_BOTH>;
- interrupt-names = "hs_phy_irq", "ss_phy_irq",
- "dm_hs_phy_irq", "dp_hs_phy_irq";
-
---
-2.43.0
-
diff --git a/queue-5.4/geneve-make-sure-to-pull-inner-header-in-geneve_rx.patch b/queue-5.4/geneve-make-sure-to-pull-inner-header-in-geneve_rx.patch
deleted file mode 100644
index dc6583605c..0000000000
--- a/queue-5.4/geneve-make-sure-to-pull-inner-header-in-geneve_rx.patch
+++ /dev/null
@@ -1,139 +0,0 @@
-From aae56f10760a19b4389c33940714698a8a3248b8 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 29 Feb 2024 13:11:52 +0000
-Subject: geneve: make sure to pull inner header in geneve_rx()
-
-From: Eric Dumazet <edumazet@google.com>
-
-[ Upstream commit 1ca1ba465e55b9460e4e75dec9fff31e708fec74 ]
-
-syzbot triggered a bug in geneve_rx() [1]
-
-Issue is similar to the one I fixed in commit 8d975c15c0cd
-("ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()")
-
-We have to save skb->network_header in a temporary variable
-in order to be able to recompute the network_header pointer
-after a pskb_inet_may_pull() call.
-
-pskb_inet_may_pull() makes sure the needed headers are in skb->head.
-
-[1]
-BUG: KMSAN: uninit-value in IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline]
- BUG: KMSAN: uninit-value in geneve_rx drivers/net/geneve.c:279 [inline]
- BUG: KMSAN: uninit-value in geneve_udp_encap_recv+0x36f9/0x3c10 drivers/net/geneve.c:391
- IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline]
- geneve_rx drivers/net/geneve.c:279 [inline]
- geneve_udp_encap_recv+0x36f9/0x3c10 drivers/net/geneve.c:391
- udp_queue_rcv_one_skb+0x1d39/0x1f20 net/ipv4/udp.c:2108
- udp_queue_rcv_skb+0x6ae/0x6e0 net/ipv4/udp.c:2186
- udp_unicast_rcv_skb+0x184/0x4b0 net/ipv4/udp.c:2346
- __udp4_lib_rcv+0x1c6b/0x3010 net/ipv4/udp.c:2422
- udp_rcv+0x7d/0xa0 net/ipv4/udp.c:2604
- ip_protocol_deliver_rcu+0x264/0x1300 net/ipv4/ip_input.c:205
- ip_local_deliver_finish+0x2b8/0x440 net/ipv4/ip_input.c:233
- NF_HOOK include/linux/netfilter.h:314 [inline]
- ip_local_deliver+0x21f/0x490 net/ipv4/ip_input.c:254
- dst_input include/net/dst.h:461 [inline]
- ip_rcv_finish net/ipv4/ip_input.c:449 [inline]
- NF_HOOK include/linux/netfilter.h:314 [inline]
- ip_rcv+0x46f/0x760 net/ipv4/ip_input.c:569
- __netif_receive_skb_one_core net/core/dev.c:5534 [inline]
- __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5648
- process_backlog+0x480/0x8b0 net/core/dev.c:5976
- __napi_poll+0xe3/0x980 net/core/dev.c:6576
- napi_poll net/core/dev.c:6645 [inline]
- net_rx_action+0x8b8/0x1870 net/core/dev.c:6778
- __do_softirq+0x1b7/0x7c5 kernel/softirq.c:553
- do_softirq+0x9a/0xf0 kernel/softirq.c:454
- __local_bh_enable_ip+0x9b/0xa0 kernel/softirq.c:381
- local_bh_enable include/linux/bottom_half.h:33 [inline]
- rcu_read_unlock_bh include/linux/rcupdate.h:820 [inline]
- __dev_queue_xmit+0x2768/0x51c0 net/core/dev.c:4378
- dev_queue_xmit include/linux/netdevice.h:3171 [inline]
- packet_xmit+0x9c/0x6b0 net/packet/af_packet.c:276
- packet_snd net/packet/af_packet.c:3081 [inline]
- packet_sendmsg+0x8aef/0x9f10 net/packet/af_packet.c:3113
- sock_sendmsg_nosec net/socket.c:730 [inline]
- __sock_sendmsg net/socket.c:745 [inline]
- __sys_sendto+0x735/0xa10 net/socket.c:2191
- __do_sys_sendto net/socket.c:2203 [inline]
- __se_sys_sendto net/socket.c:2199 [inline]
- __x64_sys_sendto+0x125/0x1c0 net/socket.c:2199
- do_syscall_x64 arch/x86/entry/common.c:52 [inline]
- do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83
- entry_SYSCALL_64_after_hwframe+0x63/0x6b
-
-Uninit was created at:
- slab_post_alloc_hook mm/slub.c:3819 [inline]
- slab_alloc_node mm/slub.c:3860 [inline]
- kmem_cache_alloc_node+0x5cb/0xbc0 mm/slub.c:3903
- kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:560
- __alloc_skb+0x352/0x790 net/core/skbuff.c:651
- alloc_skb include/linux/skbuff.h:1296 [inline]
- alloc_skb_with_frags+0xc8/0xbd0 net/core/skbuff.c:6394
- sock_alloc_send_pskb+0xa80/0xbf0 net/core/sock.c:2783
- packet_alloc_skb net/packet/af_packet.c:2930 [inline]
- packet_snd net/packet/af_packet.c:3024 [inline]
- packet_sendmsg+0x70c2/0x9f10 net/packet/af_packet.c:3113
- sock_sendmsg_nosec net/socket.c:730 [inline]
- __sock_sendmsg net/socket.c:745 [inline]
- __sys_sendto+0x735/0xa10 net/socket.c:2191
- __do_sys_sendto net/socket.c:2203 [inline]
- __se_sys_sendto net/socket.c:2199 [inline]
- __x64_sys_sendto+0x125/0x1c0 net/socket.c:2199
- do_syscall_x64 arch/x86/entry/common.c:52 [inline]
- do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83
- entry_SYSCALL_64_after_hwframe+0x63/0x6b
-
-Fixes: 2d07dc79fe04 ("geneve: add initial netdev driver for GENEVE tunnels")
-Reported-and-tested-by: syzbot+6a1423ff3f97159aae64@syzkaller.appspotmail.com
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Reviewed-by: Jiri Pirko <jiri@nvidia.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/geneve.c | 18 ++++++++++++++++--
- 1 file changed, 16 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
-index 5636673b84e7d..f932e4120cb6c 100644
---- a/drivers/net/geneve.c
-+++ b/drivers/net/geneve.c
-@@ -215,7 +215,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
- struct metadata_dst *tun_dst = NULL;
- struct pcpu_sw_netstats *stats;
- unsigned int len;
-- int err = 0;
-+ int nh, err = 0;
- void *oiph;
-
- if (ip_tunnel_collect_metadata() || gs->collect_md) {
-@@ -259,9 +259,23 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
- goto drop;
- }
-
-- oiph = skb_network_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(geneve->dev, rx_length_errors);
-+ DEV_STATS_INC(geneve->dev, rx_errors);
-+ goto drop;
-+ }
-+
-+ /* Get the outer header. */
-+ oiph = skb->head + nh;
-+
- if (geneve_get_sk_family(gs) == AF_INET)
- err = IP_ECN_decapsulate(oiph, skb);
- #if IS_ENABLED(CONFIG_IPV6)
---
-2.43.0
-
diff --git a/queue-5.4/getrusage-add-the-signal_struct-sig-local-variable.patch b/queue-5.4/getrusage-add-the-signal_struct-sig-local-variable.patch
deleted file mode 100644
index a2a7ed9dcb..0000000000
--- a/queue-5.4/getrusage-add-the-signal_struct-sig-local-variable.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 7fa92c4ff10a9ab5af240f4567353a41a944173f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 9 Sep 2023 19:25:54 +0200
-Subject: getrusage: add the "signal_struct *sig" local variable
-
-From: Oleg Nesterov <oleg@redhat.com>
-
-[ Upstream commit c7ac8231ace9b07306d0299969e42073b189c70a ]
-
-No functional changes, cleanup/preparation.
-
-Link: https://lkml.kernel.org/r/20230909172554.GA20441@redhat.com
-Signed-off-by: Oleg Nesterov <oleg@redhat.com>
-Cc: Eric W. Biederman <ebiederm@xmission.com>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Stable-dep-of: daa694e41375 ("getrusage: move thread_group_cputime_adjusted() outside of lock_task_sighand()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- kernel/sys.c | 37 +++++++++++++++++++------------------
- 1 file changed, 19 insertions(+), 18 deletions(-)
-
-diff --git a/kernel/sys.c b/kernel/sys.c
-index bc3cd0ef894e6..76b601d56c027 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -1712,6 +1712,7 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- unsigned long flags;
- u64 tgutime, tgstime, utime, stime;
- unsigned long maxrss = 0;
-+ struct signal_struct *sig = p->signal;
-
- memset((char *)r, 0, sizeof (*r));
- utime = stime = 0;
-@@ -1719,7 +1720,7 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- if (who == RUSAGE_THREAD) {
- task_cputime_adjusted(current, &utime, &stime);
- accumulate_thread_rusage(p, r);
-- maxrss = p->signal->maxrss;
-+ maxrss = sig->maxrss;
- goto out;
- }
-
-@@ -1729,15 +1730,15 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- switch (who) {
- case RUSAGE_BOTH:
- case RUSAGE_CHILDREN:
-- utime = p->signal->cutime;
-- stime = p->signal->cstime;
-- r->ru_nvcsw = p->signal->cnvcsw;
-- r->ru_nivcsw = p->signal->cnivcsw;
-- r->ru_minflt = p->signal->cmin_flt;
-- r->ru_majflt = p->signal->cmaj_flt;
-- r->ru_inblock = p->signal->cinblock;
-- r->ru_oublock = p->signal->coublock;
-- maxrss = p->signal->cmaxrss;
-+ utime = sig->cutime;
-+ stime = sig->cstime;
-+ r->ru_nvcsw = sig->cnvcsw;
-+ r->ru_nivcsw = sig->cnivcsw;
-+ r->ru_minflt = sig->cmin_flt;
-+ r->ru_majflt = sig->cmaj_flt;
-+ r->ru_inblock = sig->cinblock;
-+ r->ru_oublock = sig->coublock;
-+ maxrss = sig->cmaxrss;
-
- if (who == RUSAGE_CHILDREN)
- break;
-@@ -1747,14 +1748,14 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- thread_group_cputime_adjusted(p, &tgutime, &tgstime);
- utime += tgutime;
- stime += tgstime;
-- r->ru_nvcsw += p->signal->nvcsw;
-- r->ru_nivcsw += p->signal->nivcsw;
-- r->ru_minflt += p->signal->min_flt;
-- r->ru_majflt += p->signal->maj_flt;
-- r->ru_inblock += p->signal->inblock;
-- r->ru_oublock += p->signal->oublock;
-- if (maxrss < p->signal->maxrss)
-- maxrss = p->signal->maxrss;
-+ r->ru_nvcsw += sig->nvcsw;
-+ r->ru_nivcsw += sig->nivcsw;
-+ r->ru_minflt += sig->min_flt;
-+ r->ru_majflt += sig->maj_flt;
-+ r->ru_inblock += sig->inblock;
-+ r->ru_oublock += sig->oublock;
-+ if (maxrss < sig->maxrss)
-+ maxrss = sig->maxrss;
- t = p;
- do {
- accumulate_thread_rusage(t, r);
---
-2.43.0
-
diff --git a/queue-5.4/getrusage-move-thread_group_cputime_adjusted-outside.patch b/queue-5.4/getrusage-move-thread_group_cputime_adjusted-outside.patch
deleted file mode 100644
index 9b368b9096..0000000000
--- a/queue-5.4/getrusage-move-thread_group_cputime_adjusted-outside.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From 9692651ea2f138a80620182402239fe56a3e3cc1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 22 Jan 2024 16:50:50 +0100
-Subject: getrusage: move thread_group_cputime_adjusted() outside of
- lock_task_sighand()
-
-From: Oleg Nesterov <oleg@redhat.com>
-
-[ Upstream commit daa694e4137571b4ebec330f9a9b4d54aa8b8089 ]
-
-Patch series "getrusage: use sig->stats_lock", v2.
-
-This patch (of 2):
-
-thread_group_cputime() does its own locking, we can safely shift
-thread_group_cputime_adjusted() which does another for_each_thread loop
-outside of ->siglock protected section.
-
-This is also preparation for the next patch which changes getrusage() to
-use stats_lock instead of siglock, thread_group_cputime() takes the same
-lock. With the current implementation recursive read_seqbegin_or_lock()
-is fine, thread_group_cputime() can't enter the slow mode if the caller
-holds stats_lock, yet this looks more safe and better performance-wise.
-
-Link: https://lkml.kernel.org/r/20240122155023.GA26169@redhat.com
-Link: https://lkml.kernel.org/r/20240122155050.GA26205@redhat.com
-Signed-off-by: Oleg Nesterov <oleg@redhat.com>
-Reported-by: Dylan Hatch <dylanbhatch@google.com>
-Tested-by: Dylan Hatch <dylanbhatch@google.com>
-Cc: Eric W. Biederman <ebiederm@xmission.com>
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- kernel/sys.c | 34 +++++++++++++++++++---------------
- 1 file changed, 19 insertions(+), 15 deletions(-)
-
-diff --git a/kernel/sys.c b/kernel/sys.c
-index 76b601d56c027..b53ad9e50e465 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -1711,17 +1711,19 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- struct task_struct *t;
- unsigned long flags;
- u64 tgutime, tgstime, utime, stime;
-- unsigned long maxrss = 0;
-+ unsigned long maxrss;
-+ struct mm_struct *mm;
- struct signal_struct *sig = p->signal;
-
-- memset((char *)r, 0, sizeof (*r));
-+ memset(r, 0, sizeof(*r));
- utime = stime = 0;
-+ maxrss = 0;
-
- if (who == RUSAGE_THREAD) {
- task_cputime_adjusted(current, &utime, &stime);
- accumulate_thread_rusage(p, r);
- maxrss = sig->maxrss;
-- goto out;
-+ goto out_thread;
- }
-
- if (!lock_task_sighand(p, &flags))
-@@ -1745,9 +1747,6 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- /* fall through */
-
- case RUSAGE_SELF:
-- thread_group_cputime_adjusted(p, &tgutime, &tgstime);
-- utime += tgutime;
-- stime += tgstime;
- r->ru_nvcsw += sig->nvcsw;
- r->ru_nivcsw += sig->nivcsw;
- r->ru_minflt += sig->min_flt;
-@@ -1767,19 +1766,24 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- }
- unlock_task_sighand(p, &flags);
-
--out:
-- r->ru_utime = ns_to_kernel_old_timeval(utime);
-- r->ru_stime = ns_to_kernel_old_timeval(stime);
-+ if (who == RUSAGE_CHILDREN)
-+ goto out_children;
-
-- if (who != RUSAGE_CHILDREN) {
-- struct mm_struct *mm = get_task_mm(p);
-+ thread_group_cputime_adjusted(p, &tgutime, &tgstime);
-+ utime += tgutime;
-+ stime += tgstime;
-
-- if (mm) {
-- setmax_mm_hiwater_rss(&maxrss, mm);
-- mmput(mm);
-- }
-+out_thread:
-+ mm = get_task_mm(p);
-+ if (mm) {
-+ setmax_mm_hiwater_rss(&maxrss, mm);
-+ mmput(mm);
- }
-+
-+out_children:
- r->ru_maxrss = maxrss * (PAGE_SIZE / 1024); /* convert pages to KBs */
-+ r->ru_utime = ns_to_kernel_old_timeval(utime);
-+ r->ru_stime = ns_to_kernel_old_timeval(stime);
- }
-
- SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)
---
-2.43.0
-
diff --git a/queue-5.4/getrusage-use-__for_each_thread.patch b/queue-5.4/getrusage-use-__for_each_thread.patch
deleted file mode 100644
index ea3c605a43..0000000000
--- a/queue-5.4/getrusage-use-__for_each_thread.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 6be831de71f2408044b8bbbe43b5cd8373bee791 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 9 Sep 2023 19:26:29 +0200
-Subject: getrusage: use __for_each_thread()
-
-From: Oleg Nesterov <oleg@redhat.com>
-
-[ Upstream commit 13b7bc60b5353371460a203df6c38ccd38ad7a3a ]
-
-do/while_each_thread should be avoided when possible.
-
-Plus this change allows to avoid lock_task_sighand(), we can use rcu
-and/or sig->stats_lock instead.
-
-Link: https://lkml.kernel.org/r/20230909172629.GA20454@redhat.com
-Signed-off-by: Oleg Nesterov <oleg@redhat.com>
-Cc: Eric W. Biederman <ebiederm@xmission.com>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Stable-dep-of: f7ec1cd5cc7e ("getrusage: use sig->stats_lock rather than lock_task_sighand()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- kernel/sys.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/kernel/sys.c b/kernel/sys.c
-index b53ad9e50e465..4a5b03ad6e9b4 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -1755,10 +1755,8 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- r->ru_oublock += sig->oublock;
- if (maxrss < sig->maxrss)
- maxrss = sig->maxrss;
-- t = p;
-- do {
-+ __for_each_thread(sig, t)
- accumulate_thread_rusage(t, r);
-- } while_each_thread(p, t);
- break;
-
- default:
---
-2.43.0
-
diff --git a/queue-5.4/getrusage-use-sig-stats_lock-rather-than-lock_task_s.patch b/queue-5.4/getrusage-use-sig-stats_lock-rather-than-lock_task_s.patch
deleted file mode 100644
index 04b1495498..0000000000
--- a/queue-5.4/getrusage-use-sig-stats_lock-rather-than-lock_task_s.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From 718c1b93d5f861bcd400e2d97f6f1813ad5deddb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 22 Jan 2024 16:50:53 +0100
-Subject: getrusage: use sig->stats_lock rather than lock_task_sighand()
-
-From: Oleg Nesterov <oleg@redhat.com>
-
-[ Upstream commit f7ec1cd5cc7ef3ad964b677ba82b8b77f1c93009 ]
-
-lock_task_sighand() can trigger a hard lockup. If NR_CPUS threads call
-getrusage() at the same time and the process has NR_THREADS, spin_lock_irq
-will spin with irqs disabled O(NR_CPUS * NR_THREADS) time.
-
-Change getrusage() to use sig->stats_lock, it was specifically designed
-for this type of use. This way it runs lockless in the likely case.
-
-TODO:
- - Change do_task_stat() to use sig->stats_lock too, then we can
- remove spin_lock_irq(siglock) in wait_task_zombie().
-
- - Turn sig->stats_lock into seqcount_rwlock_t, this way the
- readers in the slow mode won't exclude each other. See
- https://lore.kernel.org/all/20230913154907.GA26210@redhat.com/
-
- - stats_lock has to disable irqs because ->siglock can be taken
- in irq context, it would be very nice to change __exit_signal()
- to avoid the siglock->stats_lock dependency.
-
-Link: https://lkml.kernel.org/r/20240122155053.GA26214@redhat.com
-Signed-off-by: Oleg Nesterov <oleg@redhat.com>
-Reported-by: Dylan Hatch <dylanbhatch@google.com>
-Tested-by: Dylan Hatch <dylanbhatch@google.com>
-Cc: Eric W. Biederman <ebiederm@xmission.com>
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- kernel/sys.c | 16 +++++++++++++---
- 1 file changed, 13 insertions(+), 3 deletions(-)
-
-diff --git a/kernel/sys.c b/kernel/sys.c
-index 4a5b03ad6e9b4..23e88587df87d 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -1714,7 +1714,9 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- unsigned long maxrss;
- struct mm_struct *mm;
- struct signal_struct *sig = p->signal;
-+ unsigned int seq = 0;
-
-+retry:
- memset(r, 0, sizeof(*r));
- utime = stime = 0;
- maxrss = 0;
-@@ -1726,8 +1728,7 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- goto out_thread;
- }
-
-- if (!lock_task_sighand(p, &flags))
-- return;
-+ flags = read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq);
-
- switch (who) {
- case RUSAGE_BOTH:
-@@ -1755,14 +1756,23 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- r->ru_oublock += sig->oublock;
- if (maxrss < sig->maxrss)
- maxrss = sig->maxrss;
-+
-+ rcu_read_lock();
- __for_each_thread(sig, t)
- accumulate_thread_rusage(t, r);
-+ rcu_read_unlock();
-+
- break;
-
- default:
- BUG();
- }
-- unlock_task_sighand(p, &flags);
-+
-+ if (need_seqretry(&sig->stats_lock, seq)) {
-+ seq = 1;
-+ goto retry;
-+ }
-+ done_seqretry_irqrestore(&sig->stats_lock, seq, flags);
-
- if (who == RUSAGE_CHILDREN)
- goto out_children;
---
-2.43.0
-
diff --git a/queue-5.4/hv_netvsc-make-netvsc-vf-binding-check-both-mac-and-.patch b/queue-5.4/hv_netvsc-make-netvsc-vf-binding-check-both-mac-and-.patch
deleted file mode 100644
index 5785b43335..0000000000
--- a/queue-5.4/hv_netvsc-make-netvsc-vf-binding-check-both-mac-and-.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 9abf378f71894606bbd59d9cbc15cd23b62d8d24 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 23 Apr 2021 18:12:35 -0700
-Subject: hv_netvsc: Make netvsc/VF binding check both MAC and serial number
-
-From: Dexuan Cui <decui@microsoft.com>
-
-[ Upstream commit 64ff412ad41fe3a5bf759ff4844dc1382176485c ]
-
-Currently the netvsc/VF binding logic only checks the PCI serial number.
-
-The Microsoft Azure Network Adapter (MANA) supports multiple net_device
-interfaces (each such interface is called a "vPort", and has its unique
-MAC address) which are backed by the same VF PCI device, so the binding
-logic should check both the MAC address and the PCI serial number.
-
-The change should not break any other existing VF drivers, because
-Hyper-V NIC SR-IOV implementation requires the netvsc network
-interface and the VF network interface have the same MAC address.
-
-Co-developed-by: Haiyang Zhang <haiyangz@microsoft.com>
-Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
-Co-developed-by: Shachar Raindel <shacharr@microsoft.com>
-Signed-off-by: Shachar Raindel <shacharr@microsoft.com>
-Acked-by: Stephen Hemminger <stephen@networkplumber.org>
-Signed-off-by: Dexuan Cui <decui@microsoft.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/hyperv/netvsc_drv.c | 13 +++++++++++--
- 1 file changed, 11 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
-index 31301cd242076..5697fe709f687 100644
---- a/drivers/net/hyperv/netvsc_drv.c
-+++ b/drivers/net/hyperv/netvsc_drv.c
-@@ -2153,8 +2153,17 @@ static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev)
- if (!ndev_ctx->vf_alloc)
- continue;
-
-- if (ndev_ctx->vf_serial == serial)
-- return hv_get_drvdata(ndev_ctx->device_ctx);
-+ if (ndev_ctx->vf_serial != serial)
-+ continue;
-+
-+ ndev = hv_get_drvdata(ndev_ctx->device_ctx);
-+ if (ndev->addr_len != vf_netdev->addr_len ||
-+ memcmp(ndev->perm_addr, vf_netdev->perm_addr,
-+ ndev->addr_len) != 0)
-+ continue;
-+
-+ return ndev;
-+
- }
-
- /* Fallback path to check synthetic vf with help of mac addr.
---
-2.43.0
-
diff --git a/queue-5.4/hv_netvsc-register-vf-in-netvsc_probe-if-net_device_.patch b/queue-5.4/hv_netvsc-register-vf-in-netvsc_probe-if-net_device_.patch
deleted file mode 100644
index 56eb6a5632..0000000000
--- a/queue-5.4/hv_netvsc-register-vf-in-netvsc_probe-if-net_device_.patch
+++ /dev/null
@@ -1,184 +0,0 @@
-From 9c78b28af28a27e4f666bbda91057683beaf4210 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 1 Feb 2024 20:40:38 -0800
-Subject: hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed
-
-From: Shradha Gupta <shradhagupta@linux.microsoft.com>
-
-[ Upstream commit 9cae43da9867412f8bd09aee5c8a8dc5e8dc3dc2 ]
-
-If hv_netvsc driver is unloaded and reloaded, the NET_DEVICE_REGISTER
-handler cannot perform VF register successfully as the register call
-is received before netvsc_probe is finished. This is because we
-register register_netdevice_notifier() very early( even before
-vmbus_driver_register()).
-To fix this, we try to register each such matching VF( if it is visible
-as a netdevice) at the end of netvsc_probe.
-
-Cc: stable@vger.kernel.org
-Fixes: 85520856466e ("hv_netvsc: Fix race of register_netdevice_notifier and VF register")
-Suggested-by: Dexuan Cui <decui@microsoft.com>
-Signed-off-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
-Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
-Reviewed-by: Dexuan Cui <decui@microsoft.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/hyperv/netvsc_drv.c | 82 +++++++++++++++++++++++++--------
- 1 file changed, 62 insertions(+), 20 deletions(-)
-
-diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
-index 880c3f69c9c10..e42102a1de41f 100644
---- a/drivers/net/hyperv/netvsc_drv.c
-+++ b/drivers/net/hyperv/netvsc_drv.c
-@@ -43,6 +43,10 @@
- #define LINKCHANGE_INT (2 * HZ)
- #define VF_TAKEOVER_INT (HZ / 10)
-
-+/* Macros to define the context of vf registration */
-+#define VF_REG_IN_PROBE 1
-+#define VF_REG_IN_NOTIFIER 2
-+
- static unsigned int ring_size __ro_after_init = 128;
- module_param(ring_size, uint, 0444);
- MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)");
-@@ -2037,7 +2041,7 @@ static rx_handler_result_t netvsc_vf_handle_frame(struct sk_buff **pskb)
- }
-
- static int netvsc_vf_join(struct net_device *vf_netdev,
-- struct net_device *ndev)
-+ struct net_device *ndev, int context)
- {
- struct net_device_context *ndev_ctx = netdev_priv(ndev);
- int ret;
-@@ -2060,7 +2064,11 @@ static int netvsc_vf_join(struct net_device *vf_netdev,
- goto upper_link_failed;
- }
-
-- schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT);
-+ /* If this registration is called from probe context vf_takeover
-+ * is taken care of later in probe itself.
-+ */
-+ if (context == VF_REG_IN_NOTIFIER)
-+ schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT);
-
- call_netdevice_notifiers(NETDEV_JOIN, vf_netdev);
-
-@@ -2198,7 +2206,7 @@ static int netvsc_prepare_bonding(struct net_device *vf_netdev)
- return NOTIFY_DONE;
- }
-
--static int netvsc_register_vf(struct net_device *vf_netdev)
-+static int netvsc_register_vf(struct net_device *vf_netdev, int context)
- {
- struct net_device_context *net_device_ctx;
- struct netvsc_device *netvsc_dev;
-@@ -2237,7 +2245,7 @@ static int netvsc_register_vf(struct net_device *vf_netdev)
-
- netdev_info(ndev, "VF registering: %s\n", vf_netdev->name);
-
-- if (netvsc_vf_join(vf_netdev, ndev) != 0)
-+ if (netvsc_vf_join(vf_netdev, ndev, context) != 0)
- return NOTIFY_DONE;
-
- dev_hold(vf_netdev);
-@@ -2301,10 +2309,31 @@ static int netvsc_unregister_vf(struct net_device *vf_netdev)
- return NOTIFY_OK;
- }
-
-+static int check_dev_is_matching_vf(struct net_device *event_ndev)
-+{
-+ /* Skip NetVSC interfaces */
-+ if (event_ndev->netdev_ops == &device_ops)
-+ return -ENODEV;
-+
-+ /* Avoid non-Ethernet type devices */
-+ if (event_ndev->type != ARPHRD_ETHER)
-+ return -ENODEV;
-+
-+ /* Avoid Vlan dev with same MAC registering as VF */
-+ if (is_vlan_dev(event_ndev))
-+ return -ENODEV;
-+
-+ /* Avoid Bonding master dev with same MAC registering as VF */
-+ if (netif_is_bond_master(event_ndev))
-+ return -ENODEV;
-+
-+ return 0;
-+}
-+
- static int netvsc_probe(struct hv_device *dev,
- const struct hv_vmbus_device_id *dev_id)
- {
-- struct net_device *net = NULL;
-+ struct net_device *net = NULL, *vf_netdev;
- struct net_device_context *net_device_ctx;
- struct netvsc_device_info *device_info = NULL;
- struct netvsc_device *nvdev;
-@@ -2405,6 +2434,30 @@ static int netvsc_probe(struct hv_device *dev,
- }
-
- list_add(&net_device_ctx->list, &netvsc_dev_list);
-+
-+ /* When the hv_netvsc driver is unloaded and reloaded, the
-+ * NET_DEVICE_REGISTER for the vf device is replayed before probe
-+ * is complete. This is because register_netdevice_notifier() gets
-+ * registered before vmbus_driver_register() so that callback func
-+ * is set before probe and we don't miss events like NETDEV_POST_INIT
-+ * So, in this section we try to register the matching vf device that
-+ * is present as a netdevice, knowing that its register call is not
-+ * processed in the netvsc_netdev_notifier(as probing is progress and
-+ * get_netvsc_byslot fails).
-+ */
-+ for_each_netdev(dev_net(net), vf_netdev) {
-+ ret = check_dev_is_matching_vf(vf_netdev);
-+ if (ret != 0)
-+ continue;
-+
-+ if (net != get_netvsc_byslot(vf_netdev))
-+ continue;
-+
-+ netvsc_prepare_bonding(vf_netdev);
-+ netvsc_register_vf(vf_netdev, VF_REG_IN_PROBE);
-+ __netvsc_vf_setup(net, vf_netdev);
-+ break;
-+ }
- rtnl_unlock();
-
- kfree(device_info);
-@@ -2497,28 +2550,17 @@ static int netvsc_netdev_event(struct notifier_block *this,
- unsigned long event, void *ptr)
- {
- struct net_device *event_dev = netdev_notifier_info_to_dev(ptr);
-+ int ret = 0;
-
-- /* Skip our own events */
-- if (event_dev->netdev_ops == &device_ops)
-- return NOTIFY_DONE;
--
-- /* Avoid non-Ethernet type devices */
-- if (event_dev->type != ARPHRD_ETHER)
-- return NOTIFY_DONE;
--
-- /* Avoid Vlan dev with same MAC registering as VF */
-- if (is_vlan_dev(event_dev))
-- return NOTIFY_DONE;
--
-- /* Avoid Bonding master dev with same MAC registering as VF */
-- if (netif_is_bond_master(event_dev))
-+ ret = check_dev_is_matching_vf(event_dev);
-+ if (ret != 0)
- return NOTIFY_DONE;
-
- switch (event) {
- case NETDEV_POST_INIT:
- return netvsc_prepare_bonding(event_dev);
- case NETDEV_REGISTER:
-- return netvsc_register_vf(event_dev);
-+ return netvsc_register_vf(event_dev, VF_REG_IN_NOTIFIER);
- case NETDEV_UNREGISTER:
- return netvsc_unregister_vf(event_dev);
- case NETDEV_UP:
---
-2.43.0
-
diff --git a/queue-5.4/hv_netvsc-use-netif_is_bond_master-instead-of-open-c.patch b/queue-5.4/hv_netvsc-use-netif_is_bond_master-instead-of-open-c.patch
deleted file mode 100644
index f5ecd10618..0000000000
--- a/queue-5.4/hv_netvsc-use-netif_is_bond_master-instead-of-open-c.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 937eea928bffd0cd94b2c3232260e7e91c1433c8 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 10 Oct 2021 13:03:28 +0900
-Subject: hv_netvsc: use netif_is_bond_master() instead of open code
-
-From: Juhee Kang <claudiajkang@gmail.com>
-
-[ Upstream commit c60882a4566a0a62dc3a40c85131103aad83dcb3 ]
-
-Use netif_is_bond_master() function instead of open code, which is
-((event_dev->priv_flags & IFF_BONDING) && (event_dev->flags & IFF_MASTER)).
-This patch doesn't change logic.
-
-Signed-off-by: Juhee Kang <claudiajkang@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/hyperv/netvsc_drv.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
-index 5697fe709f687..880c3f69c9c10 100644
---- a/drivers/net/hyperv/netvsc_drv.c
-+++ b/drivers/net/hyperv/netvsc_drv.c
-@@ -2511,8 +2511,7 @@ static int netvsc_netdev_event(struct notifier_block *this,
- return NOTIFY_DONE;
-
- /* Avoid Bonding master dev with same MAC registering as VF */
-- if ((event_dev->priv_flags & IFF_BONDING) &&
-- (event_dev->flags & IFF_MASTER))
-+ if (netif_is_bond_master(event_dev))
- return NOTIFY_DONE;
-
- switch (event) {
---
-2.43.0
-
diff --git a/queue-5.4/input-i8042-fix-strange-behavior-of-touchpad-on-clev.patch b/queue-5.4/input-i8042-fix-strange-behavior-of-touchpad-on-clev.patch
deleted file mode 100644
index ff177054a3..0000000000
--- a/queue-5.4/input-i8042-fix-strange-behavior-of-touchpad-on-clev.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 8eb55170abc5fa5188f30a429872f516c5883cf9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 5 Dec 2023 17:36:01 +0100
-Subject: Input: i8042 - fix strange behavior of touchpad on Clevo NS70PU
-
-From: Werner Sembach <wse@tuxedocomputers.com>
-
-[ Upstream commit a60e6c3918d20848906ffcdfcf72ca6a8cfbcf2e ]
-
-When closing the laptop lid with an external screen connected, the mouse
-pointer has a constant movement to the lower right corner. Opening the
-lid again stops this movement, but after that the touchpad does no longer
-register clicks.
-
-The touchpad is connected both via i2c-hid and PS/2, the predecessor of
-this device (NS70MU) has the same layout in this regard and also strange
-behaviour caused by the psmouse and the i2c-hid driver fighting over
-touchpad control. This fix is reusing the same workaround by just
-disabling the PS/2 aux port, that is only used by the touchpad, to give the
-i2c-hid driver the lone control over the touchpad.
-
-v2: Rebased on current master
-
-Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
-Cc: stable@vger.kernel.org
-Link: https://lore.kernel.org/r/20231205163602.16106-1-wse@tuxedocomputers.com
-Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/input/serio/i8042-x86ia64io.h | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
-index 1ab7f27bc9062..4ae96bd56253c 100644
---- a/drivers/input/serio/i8042-x86ia64io.h
-+++ b/drivers/input/serio/i8042-x86ia64io.h
-@@ -1179,6 +1179,12 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
- SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
- SERIO_QUIRK_NOPNP)
- },
-+ {
-+ .matches = {
-+ DMI_MATCH(DMI_BOARD_NAME, "NS5x_7xPU"),
-+ },
-+ .driver_data = (void *)(SERIO_QUIRK_NOAUX)
-+ },
- {
- .matches = {
- DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"),
---
-2.43.0
-
diff --git a/queue-5.4/ixgbe-dis-en-able-irqs-in-ixgbe_txrx_ring_-dis-en-ab.patch b/queue-5.4/ixgbe-dis-en-able-irqs-in-ixgbe_txrx_ring_-dis-en-ab.patch
deleted file mode 100644
index 44d1b709b4..0000000000
--- a/queue-5.4/ixgbe-dis-en-able-irqs-in-ixgbe_txrx_ring_-dis-en-ab.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From 452387ea92c054bfaa0a1a1f44eb498cb0d3162f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 20 Feb 2024 22:45:51 +0100
-Subject: ixgbe: {dis, en}able irqs in ixgbe_txrx_ring_{dis, en}able
-
-From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
-
-[ Upstream commit cbf996f52c4e658b3fb4349a869a62fd2d4c3c1c ]
-
-Currently routines that are supposed to toggle state of ring pair do not
-take care of associated interrupt with queue vector that these rings
-belong to. This causes funky issues such as dead interface due to irq
-misconfiguration, as per Pavel's report from Closes: tag.
-
-Add a function responsible for disabling single IRQ in EIMC register and
-call this as a very first thing when disabling ring pair during xsk_pool
-setup. For enable let's reuse ixgbe_irq_enable_queues(). Besides this,
-disable/enable NAPI as first/last thing when dealing with closing or
-opening ring pair that xsk_pool is being configured on.
-
-Reported-by: Pavel Vazharov <pavel@x3me.net>
-Closes: https://lore.kernel.org/netdev/CAJEV1ijxNyPTwASJER1bcZzS9nMoZJqfR86nu_3jFFVXzZQ4NA@mail.gmail.com/
-Fixes: 024aa5800f32 ("ixgbe: added Rx/Tx ring disable/enable functions")
-Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
-Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
-Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> (A Contingent Worker at Intel)
-Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 56 ++++++++++++++++---
- 1 file changed, 49 insertions(+), 7 deletions(-)
-
-diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-index 805aa9f53fc1f..3a188576f4c88 100644
---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-@@ -2938,8 +2938,8 @@ static void ixgbe_check_lsc(struct ixgbe_adapter *adapter)
- static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter,
- u64 qmask)
- {
-- u32 mask;
- struct ixgbe_hw *hw = &adapter->hw;
-+ u32 mask;
-
- switch (hw->mac.type) {
- case ixgbe_mac_82598EB:
-@@ -10528,6 +10528,44 @@ static void ixgbe_reset_rxr_stats(struct ixgbe_ring *rx_ring)
- memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats));
- }
-
-+/**
-+ * ixgbe_irq_disable_single - Disable single IRQ vector
-+ * @adapter: adapter structure
-+ * @ring: ring index
-+ **/
-+static void ixgbe_irq_disable_single(struct ixgbe_adapter *adapter, u32 ring)
-+{
-+ struct ixgbe_hw *hw = &adapter->hw;
-+ u64 qmask = BIT_ULL(ring);
-+ u32 mask;
-+
-+ switch (adapter->hw.mac.type) {
-+ case ixgbe_mac_82598EB:
-+ mask = qmask & IXGBE_EIMC_RTX_QUEUE;
-+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, mask);
-+ break;
-+ case ixgbe_mac_82599EB:
-+ case ixgbe_mac_X540:
-+ case ixgbe_mac_X550:
-+ case ixgbe_mac_X550EM_x:
-+ case ixgbe_mac_x550em_a:
-+ mask = (qmask & 0xFFFFFFFF);
-+ if (mask)
-+ IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
-+ mask = (qmask >> 32);
-+ if (mask)
-+ IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
-+ break;
-+ default:
-+ break;
-+ }
-+ IXGBE_WRITE_FLUSH(&adapter->hw);
-+ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED)
-+ synchronize_irq(adapter->msix_entries[ring].vector);
-+ else
-+ synchronize_irq(adapter->pdev->irq);
-+}
-+
- /**
- * ixgbe_txrx_ring_disable - Disable Rx/Tx/XDP Tx rings
- * @adapter: adapter structure
-@@ -10544,6 +10582,11 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring)
- tx_ring = adapter->tx_ring[ring];
- xdp_ring = adapter->xdp_ring[ring];
-
-+ ixgbe_irq_disable_single(adapter, ring);
-+
-+ /* Rx/Tx/XDP Tx share the same napi context. */
-+ napi_disable(&rx_ring->q_vector->napi);
-+
- ixgbe_disable_txr(adapter, tx_ring);
- if (xdp_ring)
- ixgbe_disable_txr(adapter, xdp_ring);
-@@ -10552,9 +10595,6 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring)
- if (xdp_ring)
- synchronize_rcu();
-
-- /* Rx/Tx/XDP Tx share the same napi context. */
-- napi_disable(&rx_ring->q_vector->napi);
--
- ixgbe_clean_tx_ring(tx_ring);
- if (xdp_ring)
- ixgbe_clean_tx_ring(xdp_ring);
-@@ -10582,9 +10622,6 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring)
- tx_ring = adapter->tx_ring[ring];
- xdp_ring = adapter->xdp_ring[ring];
-
-- /* Rx/Tx/XDP Tx share the same napi context. */
-- napi_enable(&rx_ring->q_vector->napi);
--
- ixgbe_configure_tx_ring(adapter, tx_ring);
- if (xdp_ring)
- ixgbe_configure_tx_ring(adapter, xdp_ring);
-@@ -10593,6 +10630,11 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring)
- clear_bit(__IXGBE_TX_DISABLED, &tx_ring->state);
- if (xdp_ring)
- clear_bit(__IXGBE_TX_DISABLED, &xdp_ring->state);
-+
-+ /* Rx/Tx/XDP Tx share the same napi context. */
-+ napi_enable(&rx_ring->q_vector->napi);
-+ ixgbe_irq_enable_queues(adapter, BIT_ULL(ring));
-+ IXGBE_WRITE_FLUSH(&adapter->hw);
- }
-
- /**
---
-2.43.0
-
diff --git a/queue-5.4/lan78xx-add-missing-return-code-checks.patch b/queue-5.4/lan78xx-add-missing-return-code-checks.patch
deleted file mode 100644
index eb13d01f58..0000000000
--- a/queue-5.4/lan78xx-add-missing-return-code-checks.patch
+++ /dev/null
@@ -1,776 +0,0 @@
-From 6fadd55a3b6f52232f0e60e7caf5fa97f4bb92af Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 24 Aug 2021 19:56:08 +0100
-Subject: lan78xx: Add missing return code checks
-
-From: John Efstathiades <john.efstathiades@pebblebay.com>
-
-[ Upstream commit 3415f6baaddb9b39d7112247ab39ef3c700f882e ]
-
-There are many places in the driver where the return code from a
-function call is captured but without a subsequent test of the
-return code and appropriate action taken.
-
-This patch adds the missing return code tests and action. In most
-cases the action is an early exit from the calling function.
-
-The function lan78xx_set_suspend() was also updated to make it
-consistent with lan78xx_suspend().
-
-Signed-off-by: John Efstathiades <john.efstathiades@pebblebay.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow on link stop")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/usb/lan78xx.c | 399 +++++++++++++++++++++++++++++++-------
- 1 file changed, 333 insertions(+), 66 deletions(-)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 67c5787d749d8..372fca3bfc9a2 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -1165,7 +1165,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
- /* clear LAN78xx interrupt status */
- ret = lan78xx_write_reg(dev, INT_STS, INT_STS_PHY_INT_);
- if (unlikely(ret < 0))
-- return -EIO;
-+ return ret;
-
- mutex_lock(&phydev->lock);
- phy_read_status(phydev);
-@@ -1178,11 +1178,11 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
- /* reset MAC */
- ret = lan78xx_read_reg(dev, MAC_CR, &buf);
- if (unlikely(ret < 0))
-- return -EIO;
-+ return ret;
- buf |= MAC_CR_RST_;
- ret = lan78xx_write_reg(dev, MAC_CR, buf);
- if (unlikely(ret < 0))
-- return -EIO;
-+ return ret;
-
- del_timer(&dev->stat_monitor);
- } else if (link && !dev->link_on) {
-@@ -1194,18 +1194,30 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
- if (ecmd.base.speed == 1000) {
- /* disable U2 */
- ret = lan78xx_read_reg(dev, USB_CFG1, &buf);
-+ if (ret < 0)
-+ return ret;
- buf &= ~USB_CFG1_DEV_U2_INIT_EN_;
- ret = lan78xx_write_reg(dev, USB_CFG1, buf);
-+ if (ret < 0)
-+ return ret;
- /* enable U1 */
- ret = lan78xx_read_reg(dev, USB_CFG1, &buf);
-+ if (ret < 0)
-+ return ret;
- buf |= USB_CFG1_DEV_U1_INIT_EN_;
- ret = lan78xx_write_reg(dev, USB_CFG1, buf);
-+ if (ret < 0)
-+ return ret;
- } else {
- /* enable U1 & U2 */
- ret = lan78xx_read_reg(dev, USB_CFG1, &buf);
-+ if (ret < 0)
-+ return ret;
- buf |= USB_CFG1_DEV_U2_INIT_EN_;
- buf |= USB_CFG1_DEV_U1_INIT_EN_;
- ret = lan78xx_write_reg(dev, USB_CFG1, buf);
-+ if (ret < 0)
-+ return ret;
- }
- }
-
-@@ -1223,6 +1235,8 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
-
- ret = lan78xx_update_flowcontrol(dev, ecmd.base.duplex, ladv,
- radv);
-+ if (ret < 0)
-+ return ret;
-
- if (!timer_pending(&dev->stat_monitor)) {
- dev->delta = 1;
-@@ -1233,7 +1247,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
- tasklet_schedule(&dev->bh);
- }
-
-- return ret;
-+ return 0;
- }
-
- /* some work can't be done in tasklets, so we use keventd
-@@ -2434,23 +2448,33 @@ static void lan78xx_init_ltm(struct lan78xx_net *dev)
- static int lan78xx_reset(struct lan78xx_net *dev)
- {
- struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0]);
-- u32 buf;
-- int ret = 0;
- unsigned long timeout;
-+ int ret;
-+ u32 buf;
- u8 sig;
-
- ret = lan78xx_read_reg(dev, HW_CFG, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= HW_CFG_LRST_;
-+
- ret = lan78xx_write_reg(dev, HW_CFG, buf);
-+ if (ret < 0)
-+ return ret;
-
- timeout = jiffies + HZ;
- do {
- mdelay(1);
- ret = lan78xx_read_reg(dev, HW_CFG, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- if (time_after(jiffies, timeout)) {
- netdev_warn(dev->net,
- "timeout on completion of LiteReset");
-- return -EIO;
-+ ret = -ETIMEDOUT;
-+ return ret;
- }
- } while (buf & HW_CFG_LRST_);
-
-@@ -2458,13 +2482,22 @@ static int lan78xx_reset(struct lan78xx_net *dev)
-
- /* save DEVID for later usage */
- ret = lan78xx_read_reg(dev, ID_REV, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- dev->chipid = (buf & ID_REV_CHIP_ID_MASK_) >> 16;
- dev->chiprev = buf & ID_REV_CHIP_REV_MASK_;
-
- /* Respond to the IN token with a NAK */
- ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= USB_CFG_BIR_;
-+
- ret = lan78xx_write_reg(dev, USB_CFG0, buf);
-+ if (ret < 0)
-+ return ret;
-
- /* Init LTM */
- lan78xx_init_ltm(dev);
-@@ -2487,53 +2520,105 @@ static int lan78xx_reset(struct lan78xx_net *dev)
- }
-
- ret = lan78xx_write_reg(dev, BURST_CAP, buf);
-+ if (ret < 0)
-+ return ret;
-+
- ret = lan78xx_write_reg(dev, BULK_IN_DLY, DEFAULT_BULK_IN_DELAY);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, HW_CFG, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= HW_CFG_MEF_;
-+
- ret = lan78xx_write_reg(dev, HW_CFG, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= USB_CFG_BCE_;
-+
- ret = lan78xx_write_reg(dev, USB_CFG0, buf);
-+ if (ret < 0)
-+ return ret;
-
- /* set FIFO sizes */
- buf = (MAX_RX_FIFO_SIZE - 512) / 512;
-+
- ret = lan78xx_write_reg(dev, FCT_RX_FIFO_END, buf);
-+ if (ret < 0)
-+ return ret;
-
- buf = (MAX_TX_FIFO_SIZE - 512) / 512;
-+
- ret = lan78xx_write_reg(dev, FCT_TX_FIFO_END, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL_);
-+ if (ret < 0)
-+ return ret;
-+
- ret = lan78xx_write_reg(dev, FLOW, 0);
-+ if (ret < 0)
-+ return ret;
-+
- ret = lan78xx_write_reg(dev, FCT_FLOW, 0);
-+ if (ret < 0)
-+ return ret;
-
- /* Don't need rfe_ctl_lock during initialisation */
- ret = lan78xx_read_reg(dev, RFE_CTL, &pdata->rfe_ctl);
-+ if (ret < 0)
-+ return ret;
-+
- pdata->rfe_ctl |= RFE_CTL_BCAST_EN_ | RFE_CTL_DA_PERFECT_;
-+
- ret = lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
-+ if (ret < 0)
-+ return ret;
-
- /* Enable or disable checksum offload engines */
-- lan78xx_set_features(dev->net, dev->net->features);
-+ ret = lan78xx_set_features(dev->net, dev->net->features);
-+ if (ret < 0)
-+ return ret;
-
- lan78xx_set_multicast(dev->net);
-
- /* reset PHY */
- ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= PMT_CTL_PHY_RST_;
-+
- ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-
- timeout = jiffies + HZ;
- do {
- mdelay(1);
- ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- if (time_after(jiffies, timeout)) {
- netdev_warn(dev->net, "timeout waiting for PHY Reset");
-- return -EIO;
-+ ret = -ETIMEDOUT;
-+ return ret;
- }
- } while ((buf & PMT_CTL_PHY_RST_) || !(buf & PMT_CTL_READY_));
-
- ret = lan78xx_read_reg(dev, MAC_CR, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- /* LAN7801 only has RGMII mode */
- if (dev->chipid == ID_REV_CHIP_ID_7801_)
- buf &= ~MAC_CR_GMII_EN_;
-@@ -2548,25 +2633,53 @@ static int lan78xx_reset(struct lan78xx_net *dev)
- }
- }
- ret = lan78xx_write_reg(dev, MAC_CR, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= MAC_TX_TXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, FCT_TX_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= FCT_TX_CTL_EN_;
-+
- ret = lan78xx_write_reg(dev, FCT_TX_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_set_rx_max_frame_length(dev,
- dev->net->mtu + VLAN_ETH_HLEN);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= MAC_RX_RXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, FCT_RX_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= FCT_RX_CTL_EN_;
-+
- ret = lan78xx_write_reg(dev, FCT_RX_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-
- return 0;
- }
-@@ -2604,7 +2717,7 @@ static int lan78xx_open(struct net_device *net)
-
- ret = usb_autopm_get_interface(dev->intf);
- if (ret < 0)
-- goto out;
-+ return ret;
-
- phy_start(net->phydev);
-
-@@ -2632,7 +2745,6 @@ static int lan78xx_open(struct net_device *net)
- done:
- usb_autopm_put_interface(dev->intf);
-
--out:
- return ret;
- }
-
-@@ -3796,35 +3908,62 @@ static u16 lan78xx_wakeframe_crc16(const u8 *buf, int len)
-
- static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- {
-- u32 buf;
-- int mask_index;
-- u16 crc;
-- u32 temp_wucsr;
-- u32 temp_pmt_ctl;
- const u8 ipv4_multicast[3] = { 0x01, 0x00, 0x5E };
- const u8 ipv6_multicast[3] = { 0x33, 0x33 };
- const u8 arp_type[2] = { 0x08, 0x06 };
-+ u32 temp_pmt_ctl;
-+ int mask_index;
-+ u32 temp_wucsr;
-+ u32 buf;
-+ u16 crc;
-+ int ret;
-+
-+ ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ if (ret < 0)
-+ return ret;
-
-- lan78xx_read_reg(dev, MAC_TX, &buf);
- buf &= ~MAC_TX_TXEN_;
-- lan78xx_write_reg(dev, MAC_TX, buf);
-- lan78xx_read_reg(dev, MAC_RX, &buf);
-+
-+ ret = lan78xx_write_reg(dev, MAC_TX, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf &= ~MAC_RX_RXEN_;
-- lan78xx_write_reg(dev, MAC_RX, buf);
-
-- lan78xx_write_reg(dev, WUCSR, 0);
-- lan78xx_write_reg(dev, WUCSR2, 0);
-- lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
-+ ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_write_reg(dev, WUCSR, 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUCSR2, 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
-+ if (ret < 0)
-+ return ret;
-
- temp_wucsr = 0;
-
- temp_pmt_ctl = 0;
-- lan78xx_read_reg(dev, PMT_CTL, &temp_pmt_ctl);
-+
-+ ret = lan78xx_read_reg(dev, PMT_CTL, &temp_pmt_ctl);
-+ if (ret < 0)
-+ return ret;
-+
- temp_pmt_ctl &= ~PMT_CTL_RES_CLR_WKP_EN_;
- temp_pmt_ctl |= PMT_CTL_RES_CLR_WKP_STS_;
-
-- for (mask_index = 0; mask_index < NUM_OF_WUF_CFG; mask_index++)
-- lan78xx_write_reg(dev, WUF_CFG(mask_index), 0);
-+ for (mask_index = 0; mask_index < NUM_OF_WUF_CFG; mask_index++) {
-+ ret = lan78xx_write_reg(dev, WUF_CFG(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ }
-
- mask_index = 0;
- if (wol & WAKE_PHY) {
-@@ -3853,30 +3992,52 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
-
- /* set WUF_CFG & WUF_MASK for IPv4 Multicast */
- crc = lan78xx_wakeframe_crc16(ipv4_multicast, 3);
-- lan78xx_write_reg(dev, WUF_CFG(mask_index),
-- WUF_CFGX_EN_ |
-- WUF_CFGX_TYPE_MCAST_ |
-- (0 << WUF_CFGX_OFFSET_SHIFT_) |
-- (crc & WUF_CFGX_CRC16_MASK_));
--
-- lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7);
-- lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-- lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
-- lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
-+ ret = lan78xx_write_reg(dev, WUF_CFG(mask_index),
-+ WUF_CFGX_EN_ |
-+ WUF_CFGX_TYPE_MCAST_ |
-+ (0 << WUF_CFGX_OFFSET_SHIFT_) |
-+ (crc & WUF_CFGX_CRC16_MASK_));
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+
- mask_index++;
-
- /* for IPv6 Multicast */
- crc = lan78xx_wakeframe_crc16(ipv6_multicast, 2);
-- lan78xx_write_reg(dev, WUF_CFG(mask_index),
-- WUF_CFGX_EN_ |
-- WUF_CFGX_TYPE_MCAST_ |
-- (0 << WUF_CFGX_OFFSET_SHIFT_) |
-- (crc & WUF_CFGX_CRC16_MASK_));
--
-- lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3);
-- lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-- lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
-- lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
-+ ret = lan78xx_write_reg(dev, WUF_CFG(mask_index),
-+ WUF_CFGX_EN_ |
-+ WUF_CFGX_TYPE_MCAST_ |
-+ (0 << WUF_CFGX_OFFSET_SHIFT_) |
-+ (crc & WUF_CFGX_CRC16_MASK_));
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+
- mask_index++;
-
- temp_pmt_ctl |= PMT_CTL_WOL_EN_;
-@@ -3897,16 +4058,27 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- * for packettype (offset 12,13) = ARP (0x0806)
- */
- crc = lan78xx_wakeframe_crc16(arp_type, 2);
-- lan78xx_write_reg(dev, WUF_CFG(mask_index),
-- WUF_CFGX_EN_ |
-- WUF_CFGX_TYPE_ALL_ |
-- (0 << WUF_CFGX_OFFSET_SHIFT_) |
-- (crc & WUF_CFGX_CRC16_MASK_));
--
-- lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000);
-- lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-- lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
-- lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
-+ ret = lan78xx_write_reg(dev, WUF_CFG(mask_index),
-+ WUF_CFGX_EN_ |
-+ WUF_CFGX_TYPE_ALL_ |
-+ (0 << WUF_CFGX_OFFSET_SHIFT_) |
-+ (crc & WUF_CFGX_CRC16_MASK_));
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
-+ if (ret < 0)
-+ return ret;
-+
- mask_index++;
-
- temp_pmt_ctl |= PMT_CTL_WOL_EN_;
-@@ -3914,7 +4086,9 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- temp_pmt_ctl |= PMT_CTL_SUS_MODE_0_;
- }
-
-- lan78xx_write_reg(dev, WUCSR, temp_wucsr);
-+ ret = lan78xx_write_reg(dev, WUCSR, temp_wucsr);
-+ if (ret < 0)
-+ return ret;
-
- /* when multiple WOL bits are set */
- if (hweight_long((unsigned long)wol) > 1) {
-@@ -3922,16 +4096,30 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- temp_pmt_ctl &= ~PMT_CTL_SUS_MODE_MASK_;
- temp_pmt_ctl |= PMT_CTL_SUS_MODE_0_;
- }
-- lan78xx_write_reg(dev, PMT_CTL, temp_pmt_ctl);
-+ ret = lan78xx_write_reg(dev, PMT_CTL, temp_pmt_ctl);
-+ if (ret < 0)
-+ return ret;
-
- /* clear WUPS */
-- lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= PMT_CTL_WUPS_MASK_;
-- lan78xx_write_reg(dev, PMT_CTL, buf);
-+
-+ ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-
- lan78xx_read_reg(dev, MAC_RX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= MAC_RX_RXEN_;
-+
- lan78xx_write_reg(dev, MAC_RX, buf);
-+ if (ret < 0)
-+ return ret;
-
- return 0;
- }
-@@ -3939,7 +4127,6 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- {
- struct lan78xx_net *dev = usb_get_intfdata(intf);
-- struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0]);
- u32 buf;
- int ret;
- int event;
-@@ -3962,11 +4149,24 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
-
- /* stop TX & RX */
- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf &= ~MAC_TX_TXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-+ if (ret < 0)
-+ return ret;
-+
- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf &= ~MAC_RX_RXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ if (ret < 0)
-+ return ret;
-
- /* empty out the rx and queues */
- netif_device_detach(dev->net);
-@@ -3983,25 +4183,50 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- if (PMSG_IS_AUTO(message)) {
- /* auto suspend (selective suspend) */
- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf &= ~MAC_TX_TXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-+ if (ret < 0)
-+ return ret;
-+
- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf &= ~MAC_RX_RXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_write_reg(dev, WUCSR, 0);
-+ if (ret < 0)
-+ return ret;
- ret = lan78xx_write_reg(dev, WUCSR2, 0);
-+ if (ret < 0)
-+ return ret;
- ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
-+ if (ret < 0)
-+ return ret;
-
- /* set goodframe wakeup */
- ret = lan78xx_read_reg(dev, WUCSR, &buf);
-+ if (ret < 0)
-+ return ret;
-
- buf |= WUCSR_RFE_WAKE_EN_;
- buf |= WUCSR_STORE_WAKE_;
-
- ret = lan78xx_write_reg(dev, WUCSR, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-
- buf &= ~PMT_CTL_RES_CLR_WKP_EN_;
- buf |= PMT_CTL_RES_CLR_WKP_STS_;
-@@ -4012,18 +4237,36 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- buf |= PMT_CTL_SUS_MODE_3_;
-
- ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-
- buf |= PMT_CTL_WUPS_MASK_;
-
- ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= MAC_RX_RXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ if (ret < 0)
-+ return ret;
- } else {
-- lan78xx_set_suspend(dev, pdata->wol);
-+ struct lan78xx_priv *pdata;
-+
-+ pdata = (struct lan78xx_priv *)(dev->data[0]);
-+
-+ ret = lan78xx_set_suspend(dev, pdata->wol);
-+ if (ret < 0)
-+ return ret;
- }
- }
-
-@@ -4048,8 +4291,11 @@ static int lan78xx_resume(struct usb_interface *intf)
-
- if (!--dev->suspend_count) {
- /* resume interrupt URBs */
-- if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags))
-- usb_submit_urb(dev->urb_intr, GFP_NOIO);
-+ if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) {
-+ ret = usb_submit_urb(dev->urb_intr, GFP_NOIO);
-+ if (ret < 0)
-+ return ret;
-+ }
-
- spin_lock_irq(&dev->txq.lock);
- while ((res = usb_get_from_anchor(&dev->deferred))) {
-@@ -4076,13 +4322,21 @@ static int lan78xx_resume(struct usb_interface *intf)
- }
-
- ret = lan78xx_write_reg(dev, WUCSR2, 0);
-+ if (ret < 0)
-+ return ret;
- ret = lan78xx_write_reg(dev, WUCSR, 0);
-+ if (ret < 0)
-+ return ret;
- ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_write_reg(dev, WUCSR2, WUCSR2_NS_RCD_ |
- WUCSR2_ARP_RCD_ |
- WUCSR2_IPV6_TCPSYN_RCD_ |
- WUCSR2_IPV4_TCPSYN_RCD_);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_write_reg(dev, WUCSR, WUCSR_EEE_TX_WAKE_ |
- WUCSR_EEE_RX_WAKE_ |
-@@ -4091,10 +4345,18 @@ static int lan78xx_resume(struct usb_interface *intf)
- WUCSR_WUFR_ |
- WUCSR_MPR_ |
- WUCSR_BCST_FR_);
-+ if (ret < 0)
-+ return ret;
-
- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ if (ret < 0)
-+ return ret;
-+
- buf |= MAC_TX_TXEN_;
-+
- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-+ if (ret < 0)
-+ return ret;
-
- return 0;
- }
-@@ -4102,12 +4364,17 @@ static int lan78xx_resume(struct usb_interface *intf)
- static int lan78xx_reset_resume(struct usb_interface *intf)
- {
- struct lan78xx_net *dev = usb_get_intfdata(intf);
-+ int ret;
-
-- lan78xx_reset(dev);
-+ ret = lan78xx_reset(dev);
-+ if (ret < 0)
-+ return ret;
-
- phy_start(dev->net->phydev);
-
-- return lan78xx_resume(intf);
-+ ret = lan78xx_resume(intf);
-+
-+ return ret;
- }
-
- static const struct usb_device_id products[] = {
---
-2.43.0
-
diff --git a/queue-5.4/lan78xx-fix-partial-packet-errors-on-suspend-resume.patch b/queue-5.4/lan78xx-fix-partial-packet-errors-on-suspend-resume.patch
deleted file mode 100644
index ccc05bd106..0000000000
--- a/queue-5.4/lan78xx-fix-partial-packet-errors-on-suspend-resume.patch
+++ /dev/null
@@ -1,455 +0,0 @@
-From b4109e7e39d82ab9e11932a1abd2ae7ad86f2d36 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 24 Aug 2021 19:56:10 +0100
-Subject: lan78xx: Fix partial packet errors on suspend/resume
-
-From: John Efstathiades <john.efstathiades@pebblebay.com>
-
-[ Upstream commit e1210fe63bf8b080edd0805240e90b81b6b069c1 ]
-
-The MAC can get out of step with the internal packet FIFOs if the
-system goes to sleep when the link is active, especially at high
-data rates. This can result in partial frames in the packet FIFOs
-that in result in malformed frames being delivered to the host.
-This occurs because the driver does not enable/disable the internal
-packet FIFOs in step with the corresponding MAC data path. The
-following changes fix this problem.
-
-Update code that enables/disables the MAC receiver and transmitter
-to the more general Rx and Tx data path, where the data path in each
-direction consists of both the MAC function (Tx or Rx) and the
-corresponding packet FIFO.
-
-In the receive path the packet FIFO must be enabled before the MAC
-receiver but disabled after the MAC receiver.
-
-In the transmit path the opposite is true: the packet FIFO must be
-enabled after the MAC transmitter but disabled before the MAC
-transmitter.
-
-The packet FIFOs can be flushed safely once the corresponding data
-path is stopped.
-
-Signed-off-by: John Efstathiades <john.efstathiades@pebblebay.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow on link stop")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/usb/lan78xx.c | 303 +++++++++++++++++++++++++-------------
- 1 file changed, 197 insertions(+), 106 deletions(-)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 372fca3bfc9a2..020ea7b960936 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -90,6 +90,12 @@
- /* statistic update interval (mSec) */
- #define STAT_UPDATE_TIMER (1 * 1000)
-
-+/* time to wait for MAC or FCT to stop (jiffies) */
-+#define HW_DISABLE_TIMEOUT (HZ / 10)
-+
-+/* time to wait between polling MAC or FCT state (ms) */
-+#define HW_DISABLE_DELAY_MS 1
-+
- /* defines interrupts from interrupt EP */
- #define MAX_INT_EP (32)
- #define INT_EP_INTEP (31)
-@@ -479,6 +485,26 @@ static int lan78xx_write_reg(struct lan78xx_net *dev, u32 index, u32 data)
- return ret;
- }
-
-+static int lan78xx_update_reg(struct lan78xx_net *dev, u32 reg, u32 mask,
-+ u32 data)
-+{
-+ int ret;
-+ u32 buf;
-+
-+ ret = lan78xx_read_reg(dev, reg, &buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ buf &= ~mask;
-+ buf |= (mask & data);
-+
-+ ret = lan78xx_write_reg(dev, reg, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
- static int lan78xx_read_stats(struct lan78xx_net *dev,
- struct lan78xx_statstage *data)
- {
-@@ -2445,6 +2471,156 @@ static void lan78xx_init_ltm(struct lan78xx_net *dev)
- lan78xx_write_reg(dev, LTM_INACTIVE1, regs[5]);
- }
-
-+static int lan78xx_start_hw(struct lan78xx_net *dev, u32 reg, u32 hw_enable)
-+{
-+ return lan78xx_update_reg(dev, reg, hw_enable, hw_enable);
-+}
-+
-+static int lan78xx_stop_hw(struct lan78xx_net *dev, u32 reg, u32 hw_enabled,
-+ u32 hw_disabled)
-+{
-+ unsigned long timeout;
-+ bool stopped = true;
-+ int ret;
-+ u32 buf;
-+
-+ /* Stop the h/w block (if not already stopped) */
-+
-+ ret = lan78xx_read_reg(dev, reg, &buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ if (buf & hw_enabled) {
-+ buf &= ~hw_enabled;
-+
-+ ret = lan78xx_write_reg(dev, reg, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ stopped = false;
-+ timeout = jiffies + HW_DISABLE_TIMEOUT;
-+ do {
-+ ret = lan78xx_read_reg(dev, reg, &buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ if (buf & hw_disabled)
-+ stopped = true;
-+ else
-+ msleep(HW_DISABLE_DELAY_MS);
-+ } while (!stopped && !time_after(jiffies, timeout));
-+ }
-+
-+ ret = stopped ? 0 : -ETIME;
-+
-+ return ret;
-+}
-+
-+static int lan78xx_flush_fifo(struct lan78xx_net *dev, u32 reg, u32 fifo_flush)
-+{
-+ return lan78xx_update_reg(dev, reg, fifo_flush, fifo_flush);
-+}
-+
-+static int lan78xx_start_tx_path(struct lan78xx_net *dev)
-+{
-+ int ret;
-+
-+ netif_dbg(dev, drv, dev->net, "start tx path");
-+
-+ /* Start the MAC transmitter */
-+
-+ ret = lan78xx_start_hw(dev, MAC_TX, MAC_TX_TXEN_);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* Start the Tx FIFO */
-+
-+ ret = lan78xx_start_hw(dev, FCT_TX_CTL, FCT_TX_CTL_EN_);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int lan78xx_stop_tx_path(struct lan78xx_net *dev)
-+{
-+ int ret;
-+
-+ netif_dbg(dev, drv, dev->net, "stop tx path");
-+
-+ /* Stop the Tx FIFO */
-+
-+ ret = lan78xx_stop_hw(dev, FCT_TX_CTL, FCT_TX_CTL_EN_, FCT_TX_CTL_DIS_);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* Stop the MAC transmitter */
-+
-+ ret = lan78xx_stop_hw(dev, MAC_TX, MAC_TX_TXEN_, MAC_TX_TXD_);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+/* The caller must ensure the Tx path is stopped before calling
-+ * lan78xx_flush_tx_fifo().
-+ */
-+static int lan78xx_flush_tx_fifo(struct lan78xx_net *dev)
-+{
-+ return lan78xx_flush_fifo(dev, FCT_TX_CTL, FCT_TX_CTL_RST_);
-+}
-+
-+static int lan78xx_start_rx_path(struct lan78xx_net *dev)
-+{
-+ int ret;
-+
-+ netif_dbg(dev, drv, dev->net, "start rx path");
-+
-+ /* Start the Rx FIFO */
-+
-+ ret = lan78xx_start_hw(dev, FCT_RX_CTL, FCT_RX_CTL_EN_);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* Start the MAC receiver*/
-+
-+ ret = lan78xx_start_hw(dev, MAC_RX, MAC_RX_RXEN_);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int lan78xx_stop_rx_path(struct lan78xx_net *dev)
-+{
-+ int ret;
-+
-+ netif_dbg(dev, drv, dev->net, "stop rx path");
-+
-+ /* Stop the MAC receiver */
-+
-+ ret = lan78xx_stop_hw(dev, MAC_RX, MAC_RX_RXEN_, MAC_RX_RXD_);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* Stop the Rx FIFO */
-+
-+ ret = lan78xx_stop_hw(dev, FCT_RX_CTL, FCT_RX_CTL_EN_, FCT_RX_CTL_DIS_);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+/* The caller must ensure the Rx path is stopped before calling
-+ * lan78xx_flush_rx_fifo().
-+ */
-+static int lan78xx_flush_rx_fifo(struct lan78xx_net *dev)
-+{
-+ return lan78xx_flush_fifo(dev, FCT_RX_CTL, FCT_RX_CTL_RST_);
-+}
-+
- static int lan78xx_reset(struct lan78xx_net *dev)
- {
- struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0]);
-@@ -2636,23 +2812,7 @@ static int lan78xx_reset(struct lan78xx_net *dev)
- if (ret < 0)
- return ret;
-
-- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf |= MAC_TX_TXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-- if (ret < 0)
-- return ret;
--
-- ret = lan78xx_read_reg(dev, FCT_TX_CTL, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf |= FCT_TX_CTL_EN_;
--
-- ret = lan78xx_write_reg(dev, FCT_TX_CTL, buf);
-+ ret = lan78xx_start_tx_path(dev);
- if (ret < 0)
- return ret;
-
-@@ -2661,27 +2821,9 @@ static int lan78xx_reset(struct lan78xx_net *dev)
- if (ret < 0)
- return ret;
-
-- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf |= MAC_RX_RXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-- if (ret < 0)
-- return ret;
-+ ret = lan78xx_start_rx_path(dev);
-
-- ret = lan78xx_read_reg(dev, FCT_RX_CTL, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf |= FCT_RX_CTL_EN_;
--
-- ret = lan78xx_write_reg(dev, FCT_RX_CTL, buf);
-- if (ret < 0)
-- return ret;
--
-- return 0;
-+ return ret;
- }
-
- static void lan78xx_init_stats(struct lan78xx_net *dev)
-@@ -3918,23 +4060,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- u16 crc;
- int ret;
-
-- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ ret = lan78xx_stop_tx_path(dev);
- if (ret < 0)
- return ret;
--
-- buf &= ~MAC_TX_TXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-- if (ret < 0)
-- return ret;
--
-- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf &= ~MAC_RX_RXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ ret = lan78xx_stop_rx_path(dev);
- if (ret < 0)
- return ret;
-
-@@ -4111,17 +4240,9 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- if (ret < 0)
- return ret;
-
-- lan78xx_read_reg(dev, MAC_RX, &buf);
-- if (ret < 0)
-- return ret;
-+ ret = lan78xx_start_rx_path(dev);
-
-- buf |= MAC_RX_RXEN_;
--
-- lan78xx_write_reg(dev, MAC_RX, buf);
-- if (ret < 0)
-- return ret;
--
-- return 0;
-+ return ret;
- }
-
- static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
-@@ -4147,24 +4268,17 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- spin_unlock_irq(&dev->txq.lock);
- }
-
-- /* stop TX & RX */
-- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-+ /* stop RX */
-+ ret = lan78xx_stop_rx_path(dev);
- if (ret < 0)
- return ret;
-
-- buf &= ~MAC_TX_TXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-+ ret = lan78xx_flush_rx_fifo(dev);
- if (ret < 0)
- return ret;
-
-- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf &= ~MAC_RX_RXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ /* stop Tx */
-+ ret = lan78xx_stop_tx_path(dev);
- if (ret < 0)
- return ret;
-
-@@ -4182,23 +4296,11 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
-
- if (PMSG_IS_AUTO(message)) {
- /* auto suspend (selective suspend) */
-- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf &= ~MAC_TX_TXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-- if (ret < 0)
-- return ret;
--
-- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-+ ret = lan78xx_stop_tx_path(dev);
- if (ret < 0)
- return ret;
-
-- buf &= ~MAC_RX_RXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ ret = lan78xx_stop_rx_path(dev);
- if (ret < 0)
- return ret;
-
-@@ -4250,13 +4352,7 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- if (ret < 0)
- return ret;
-
-- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf |= MAC_RX_RXEN_;
--
-- ret = lan78xx_write_reg(dev, MAC_RX, buf);
-+ ret = lan78xx_start_rx_path(dev);
- if (ret < 0)
- return ret;
- } else {
-@@ -4281,7 +4377,6 @@ static int lan78xx_resume(struct usb_interface *intf)
- struct sk_buff *skb;
- struct urb *res;
- int ret;
-- u32 buf;
-
- if (!timer_pending(&dev->stat_monitor)) {
- dev->delta = 1;
-@@ -4289,6 +4384,10 @@ static int lan78xx_resume(struct usb_interface *intf)
- jiffies + STAT_UPDATE_TIMER);
- }
-
-+ ret = lan78xx_flush_tx_fifo(dev);
-+ if (ret < 0)
-+ return ret;
-+
- if (!--dev->suspend_count) {
- /* resume interrupt URBs */
- if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) {
-@@ -4348,17 +4447,9 @@ static int lan78xx_resume(struct usb_interface *intf)
- if (ret < 0)
- return ret;
-
-- ret = lan78xx_read_reg(dev, MAC_TX, &buf);
-- if (ret < 0)
-- return ret;
--
-- buf |= MAC_TX_TXEN_;
-+ ret = lan78xx_start_tx_path(dev);
-
-- ret = lan78xx_write_reg(dev, MAC_TX, buf);
-- if (ret < 0)
-- return ret;
--
-- return 0;
-+ return ret;
- }
-
- static int lan78xx_reset_resume(struct usb_interface *intf)
---
-2.43.0
-
diff --git a/queue-5.4/lan78xx-fix-race-conditions-in-suspend-resume-handli.patch b/queue-5.4/lan78xx-fix-race-conditions-in-suspend-resume-handli.patch
deleted file mode 100644
index 3defe43798..0000000000
--- a/queue-5.4/lan78xx-fix-race-conditions-in-suspend-resume-handli.patch
+++ /dev/null
@@ -1,749 +0,0 @@
-From eebaf4bfd11087e838b7690d3cb07fb3c260bd7e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 24 Aug 2021 19:56:11 +0100
-Subject: lan78xx: Fix race conditions in suspend/resume handling
-
-From: John Efstathiades <john.efstathiades@pebblebay.com>
-
-[ Upstream commit 5f4cc6e25148cc141f97afb41b4dfe9eb1cce613 ]
-
-If the interface is given an IP address while the device is
-suspended (as a result of an auto-suspend event) there is a race
-between lan78xx_resume() and lan78xx_open() that can result in an
-exception or failure to handle incoming packets. The following
-changes fix this problem.
-
-Introduce a mutex to serialise operations in the network interface
-open and stop entry points with respect to the USB driver suspend
-and resume entry points.
-
-Move Tx and Rx data path start/stop to lan78xx_start() and
-lan78xx_stop() respectively and flush the packet FIFOs before
-starting the Tx and Rx data paths. This prevents the MAC and FIFOs
-getting out of step and delivery of malformed packets to the network
-stack.
-
-Stop processing of received packets before disconnecting the
-PHY from the MAC to prevent a kernel exception caused by handling
-packets after the PHY device has been removed.
-
-Refactor device auto-suspend code to make it consistent with the
-the system suspend code and make the suspend handler easier to read.
-
-Add new code to stop wake-on-lan packets or PHY events resuming the
-host or device from suspend if the device has not been opened
-(typically after an IP address is assigned).
-
-This patch is dependent on changes to lan78xx_suspend() and
-lan78xx_resume() introduced in the previous patch of this patch set.
-
-Signed-off-by: John Efstathiades <john.efstathiades@pebblebay.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow on link stop")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/usb/lan78xx.c | 419 ++++++++++++++++++++++++++------------
- 1 file changed, 284 insertions(+), 135 deletions(-)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 020ea7b960936..42fe7753ff76d 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -390,6 +390,7 @@ struct lan78xx_net {
- struct urb *urb_intr;
- struct usb_anchor deferred;
-
-+ struct mutex dev_mutex; /* serialise open/stop wrt suspend/resume */
- struct mutex phy_mutex; /* for phy access */
- unsigned int pipe_in, pipe_out, pipe_intr;
-
-@@ -2295,11 +2296,16 @@ static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
- int ll_mtu = new_mtu + netdev->hard_header_len;
- int old_hard_mtu = dev->hard_mtu;
- int old_rx_urb_size = dev->rx_urb_size;
-+ int ret;
-
- /* no second zero-length packet read wanted after mtu-sized packets */
- if ((ll_mtu % dev->maxpacket) == 0)
- return -EDOM;
-
-+ ret = usb_autopm_get_interface(dev->intf);
-+ if (ret < 0)
-+ return ret;
-+
- lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN);
-
- netdev->mtu = new_mtu;
-@@ -2315,6 +2321,8 @@ static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
- }
- }
-
-+ usb_autopm_put_interface(dev->intf);
-+
- return 0;
- }
-
-@@ -2812,16 +2820,8 @@ static int lan78xx_reset(struct lan78xx_net *dev)
- if (ret < 0)
- return ret;
-
-- ret = lan78xx_start_tx_path(dev);
-- if (ret < 0)
-- return ret;
--
- ret = lan78xx_set_rx_max_frame_length(dev,
- dev->net->mtu + VLAN_ETH_HLEN);
-- if (ret < 0)
-- return ret;
--
-- ret = lan78xx_start_rx_path(dev);
-
- return ret;
- }
-@@ -2857,10 +2857,14 @@ static int lan78xx_open(struct net_device *net)
- struct lan78xx_net *dev = netdev_priv(net);
- int ret;
-
-+ netif_dbg(dev, ifup, dev->net, "open device");
-+
- ret = usb_autopm_get_interface(dev->intf);
- if (ret < 0)
- return ret;
-
-+ mutex_lock(&dev->dev_mutex);
-+
- phy_start(net->phydev);
-
- netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
-@@ -2875,6 +2879,20 @@ static int lan78xx_open(struct net_device *net)
- }
- }
-
-+ ret = lan78xx_flush_rx_fifo(dev);
-+ if (ret < 0)
-+ goto done;
-+ ret = lan78xx_flush_tx_fifo(dev);
-+ if (ret < 0)
-+ goto done;
-+
-+ ret = lan78xx_start_tx_path(dev);
-+ if (ret < 0)
-+ goto done;
-+ ret = lan78xx_start_rx_path(dev);
-+ if (ret < 0)
-+ goto done;
-+
- lan78xx_init_stats(dev);
-
- set_bit(EVENT_DEV_OPEN, &dev->flags);
-@@ -2885,6 +2903,8 @@ static int lan78xx_open(struct net_device *net)
-
- lan78xx_defer_kevent(dev, EVENT_LINK_RESET);
- done:
-+ mutex_unlock(&dev->dev_mutex);
-+
- usb_autopm_put_interface(dev->intf);
-
- return ret;
-@@ -2903,38 +2923,56 @@ static void lan78xx_terminate_urbs(struct lan78xx_net *dev)
- temp = unlink_urbs(dev, &dev->txq) + unlink_urbs(dev, &dev->rxq);
-
- /* maybe wait for deletions to finish. */
-- while (!skb_queue_empty(&dev->rxq) &&
-- !skb_queue_empty(&dev->txq) &&
-- !skb_queue_empty(&dev->done)) {
-+ while (!skb_queue_empty(&dev->rxq) ||
-+ !skb_queue_empty(&dev->txq)) {
- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS));
- set_current_state(TASK_UNINTERRUPTIBLE);
- netif_dbg(dev, ifdown, dev->net,
-- "waited for %d urb completions\n", temp);
-+ "waited for %d urb completions", temp);
- }
- set_current_state(TASK_RUNNING);
- dev->wait = NULL;
- remove_wait_queue(&unlink_wakeup, &wait);
-+
-+ while (!skb_queue_empty(&dev->done)) {
-+ struct skb_data *entry;
-+ struct sk_buff *skb;
-+
-+ skb = skb_dequeue(&dev->done);
-+ entry = (struct skb_data *)(skb->cb);
-+ usb_free_urb(entry->urb);
-+ dev_kfree_skb(skb);
-+ }
- }
-
- static int lan78xx_stop(struct net_device *net)
- {
- struct lan78xx_net *dev = netdev_priv(net);
-
-+ netif_dbg(dev, ifup, dev->net, "stop device");
-+
-+ mutex_lock(&dev->dev_mutex);
-+
- if (timer_pending(&dev->stat_monitor))
- del_timer_sync(&dev->stat_monitor);
-
-- if (net->phydev)
-- phy_stop(net->phydev);
--
- clear_bit(EVENT_DEV_OPEN, &dev->flags);
- netif_stop_queue(net);
-+ tasklet_kill(&dev->bh);
-+
-+ lan78xx_terminate_urbs(dev);
-
- netif_info(dev, ifdown, dev->net,
- "stop stats: rx/tx %lu/%lu, errs %lu/%lu\n",
- net->stats.rx_packets, net->stats.tx_packets,
- net->stats.rx_errors, net->stats.tx_errors);
-
-- lan78xx_terminate_urbs(dev);
-+ /* ignore errors that occur stopping the Tx and Rx data paths */
-+ lan78xx_stop_tx_path(dev);
-+ lan78xx_stop_rx_path(dev);
-+
-+ if (net->phydev)
-+ phy_stop(net->phydev);
-
- usb_kill_urb(dev->urb_intr);
-
-@@ -2944,12 +2982,17 @@ static int lan78xx_stop(struct net_device *net)
- * can't flush_scheduled_work() until we drop rtnl (later),
- * else workers could deadlock; so make workers a NOP.
- */
-- dev->flags = 0;
-+ clear_bit(EVENT_TX_HALT, &dev->flags);
-+ clear_bit(EVENT_RX_HALT, &dev->flags);
-+ clear_bit(EVENT_LINK_RESET, &dev->flags);
-+ clear_bit(EVENT_STAT_UPDATE, &dev->flags);
-+
- cancel_delayed_work_sync(&dev->wq);
-- tasklet_kill(&dev->bh);
-
- usb_autopm_put_interface(dev->intf);
-
-+ mutex_unlock(&dev->dev_mutex);
-+
- return 0;
- }
-
-@@ -3072,6 +3115,9 @@ lan78xx_start_xmit(struct sk_buff *skb, struct net_device *net)
- struct lan78xx_net *dev = netdev_priv(net);
- struct sk_buff *skb2 = NULL;
-
-+ if (test_bit(EVENT_DEV_ASLEEP, &dev->flags))
-+ schedule_delayed_work(&dev->wq, 0);
-+
- if (skb) {
- skb_tx_timestamp(skb);
- skb2 = lan78xx_tx_prep(dev, skb, GFP_ATOMIC);
-@@ -3678,18 +3724,17 @@ static void lan78xx_delayedwork(struct work_struct *work)
-
- dev = container_of(work, struct lan78xx_net, wq.work);
-
-+ if (usb_autopm_get_interface(dev->intf) < 0)
-+ return;
-+
- if (test_bit(EVENT_TX_HALT, &dev->flags)) {
- unlink_urbs(dev, &dev->txq);
-- status = usb_autopm_get_interface(dev->intf);
-- if (status < 0)
-- goto fail_pipe;
-+
- status = usb_clear_halt(dev->udev, dev->pipe_out);
-- usb_autopm_put_interface(dev->intf);
- if (status < 0 &&
- status != -EPIPE &&
- status != -ESHUTDOWN) {
- if (netif_msg_tx_err(dev))
--fail_pipe:
- netdev_err(dev->net,
- "can't clear tx halt, status %d\n",
- status);
-@@ -3699,18 +3744,14 @@ static void lan78xx_delayedwork(struct work_struct *work)
- netif_wake_queue(dev->net);
- }
- }
-+
- if (test_bit(EVENT_RX_HALT, &dev->flags)) {
- unlink_urbs(dev, &dev->rxq);
-- status = usb_autopm_get_interface(dev->intf);
-- if (status < 0)
-- goto fail_halt;
- status = usb_clear_halt(dev->udev, dev->pipe_in);
-- usb_autopm_put_interface(dev->intf);
- if (status < 0 &&
- status != -EPIPE &&
- status != -ESHUTDOWN) {
- if (netif_msg_rx_err(dev))
--fail_halt:
- netdev_err(dev->net,
- "can't clear rx halt, status %d\n",
- status);
-@@ -3724,16 +3765,9 @@ static void lan78xx_delayedwork(struct work_struct *work)
- int ret = 0;
-
- clear_bit(EVENT_LINK_RESET, &dev->flags);
-- status = usb_autopm_get_interface(dev->intf);
-- if (status < 0)
-- goto skip_reset;
- if (lan78xx_link_reset(dev) < 0) {
-- usb_autopm_put_interface(dev->intf);
--skip_reset:
- netdev_info(dev->net, "link reset failed (%d)\n",
- ret);
-- } else {
-- usb_autopm_put_interface(dev->intf);
- }
- }
-
-@@ -3747,6 +3781,8 @@ static void lan78xx_delayedwork(struct work_struct *work)
-
- dev->delta = min((dev->delta * 2), 50);
- }
-+
-+ usb_autopm_put_interface(dev->intf);
- }
-
- static void intr_complete(struct urb *urb)
-@@ -3906,6 +3942,7 @@ static int lan78xx_probe(struct usb_interface *intf,
- skb_queue_head_init(&dev->rxq_pause);
- skb_queue_head_init(&dev->txq_pend);
- mutex_init(&dev->phy_mutex);
-+ mutex_init(&dev->dev_mutex);
-
- tasklet_init(&dev->bh, lan78xx_bh, (unsigned long)dev);
- INIT_DELAYED_WORK(&dev->wq, lan78xx_delayedwork);
-@@ -4048,6 +4085,74 @@ static u16 lan78xx_wakeframe_crc16(const u8 *buf, int len)
- return crc;
- }
-
-+static int lan78xx_set_auto_suspend(struct lan78xx_net *dev)
-+{
-+ u32 buf;
-+ int ret;
-+
-+ ret = lan78xx_stop_tx_path(dev);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_stop_rx_path(dev);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* auto suspend (selective suspend) */
-+
-+ ret = lan78xx_write_reg(dev, WUCSR, 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WUCSR2, 0);
-+ if (ret < 0)
-+ return ret;
-+ ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* set goodframe wakeup */
-+
-+ ret = lan78xx_read_reg(dev, WUCSR, &buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ buf |= WUCSR_RFE_WAKE_EN_;
-+ buf |= WUCSR_STORE_WAKE_;
-+
-+ ret = lan78xx_write_reg(dev, WUCSR, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ buf &= ~PMT_CTL_RES_CLR_WKP_EN_;
-+ buf |= PMT_CTL_RES_CLR_WKP_STS_;
-+ buf |= PMT_CTL_PHY_WAKE_EN_;
-+ buf |= PMT_CTL_WOL_EN_;
-+ buf &= ~PMT_CTL_SUS_MODE_MASK_;
-+ buf |= PMT_CTL_SUS_MODE_3_;
-+
-+ ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ buf |= PMT_CTL_WUPS_MASK_;
-+
-+ ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = lan78xx_start_rx_path(dev);
-+
-+ return ret;
-+}
-+
- static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- {
- const u8 ipv4_multicast[3] = { 0x01, 0x00, 0x5E };
-@@ -4248,18 +4353,25 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- {
- struct lan78xx_net *dev = usb_get_intfdata(intf);
-- u32 buf;
-+ bool dev_open;
- int ret;
- int event;
-
- event = message.event;
-
-- if (!dev->suspend_count++) {
-+ mutex_lock(&dev->dev_mutex);
-+
-+ netif_dbg(dev, ifdown, dev->net,
-+ "suspending: pm event %#x", message.event);
-+
-+ dev_open = test_bit(EVENT_DEV_OPEN, &dev->flags);
-+
-+ if (dev_open) {
- spin_lock_irq(&dev->txq.lock);
- /* don't autosuspend while transmitting */
- if ((skb_queue_len(&dev->txq) ||
- skb_queue_len(&dev->txq_pend)) &&
-- PMSG_IS_AUTO(message)) {
-+ PMSG_IS_AUTO(message)) {
- spin_unlock_irq(&dev->txq.lock);
- ret = -EBUSY;
- goto out;
-@@ -4271,171 +4383,204 @@ static int lan78xx_suspend(struct usb_interface *intf, pm_message_t message)
- /* stop RX */
- ret = lan78xx_stop_rx_path(dev);
- if (ret < 0)
-- return ret;
-+ goto out;
-
- ret = lan78xx_flush_rx_fifo(dev);
- if (ret < 0)
-- return ret;
-+ goto out;
-
- /* stop Tx */
- ret = lan78xx_stop_tx_path(dev);
- if (ret < 0)
-- return ret;
-+ goto out;
-
-- /* empty out the rx and queues */
-+ /* empty out the Rx and Tx queues */
- netif_device_detach(dev->net);
- lan78xx_terminate_urbs(dev);
- usb_kill_urb(dev->urb_intr);
-
- /* reattach */
- netif_device_attach(dev->net);
-- }
-
-- if (test_bit(EVENT_DEV_ASLEEP, &dev->flags)) {
- del_timer(&dev->stat_monitor);
-
- if (PMSG_IS_AUTO(message)) {
-- /* auto suspend (selective suspend) */
-- ret = lan78xx_stop_tx_path(dev);
-+ ret = lan78xx_set_auto_suspend(dev);
- if (ret < 0)
-- return ret;
-+ goto out;
-+ } else {
-+ struct lan78xx_priv *pdata;
-
-- ret = lan78xx_stop_rx_path(dev);
-+ pdata = (struct lan78xx_priv *)(dev->data[0]);
-+ netif_carrier_off(dev->net);
-+ ret = lan78xx_set_suspend(dev, pdata->wol);
- if (ret < 0)
-- return ret;
-+ goto out;
-+ }
-+ } else {
-+ /* Interface is down; don't allow WOL and PHY
-+ * events to wake up the host
-+ */
-+ u32 buf;
-
-- ret = lan78xx_write_reg(dev, WUCSR, 0);
-- if (ret < 0)
-- return ret;
-- ret = lan78xx_write_reg(dev, WUCSR2, 0);
-- if (ret < 0)
-- return ret;
-- ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
-- if (ret < 0)
-- return ret;
-+ set_bit(EVENT_DEV_ASLEEP, &dev->flags);
-
-- /* set goodframe wakeup */
-- ret = lan78xx_read_reg(dev, WUCSR, &buf);
-- if (ret < 0)
-- return ret;
-+ ret = lan78xx_write_reg(dev, WUCSR, 0);
-+ if (ret < 0)
-+ goto out;
-+ ret = lan78xx_write_reg(dev, WUCSR2, 0);
-+ if (ret < 0)
-+ goto out;
-
-- buf |= WUCSR_RFE_WAKE_EN_;
-- buf |= WUCSR_STORE_WAKE_;
-+ ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ goto out;
-
-- ret = lan78xx_write_reg(dev, WUCSR, buf);
-- if (ret < 0)
-- return ret;
-+ buf &= ~PMT_CTL_RES_CLR_WKP_EN_;
-+ buf |= PMT_CTL_RES_CLR_WKP_STS_;
-+ buf &= ~PMT_CTL_SUS_MODE_MASK_;
-+ buf |= PMT_CTL_SUS_MODE_3_;
-
-- ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-- if (ret < 0)
-- return ret;
-+ ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ goto out;
-
-- buf &= ~PMT_CTL_RES_CLR_WKP_EN_;
-- buf |= PMT_CTL_RES_CLR_WKP_STS_;
-+ ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-+ if (ret < 0)
-+ goto out;
-
-- buf |= PMT_CTL_PHY_WAKE_EN_;
-- buf |= PMT_CTL_WOL_EN_;
-- buf &= ~PMT_CTL_SUS_MODE_MASK_;
-- buf |= PMT_CTL_SUS_MODE_3_;
-+ buf |= PMT_CTL_WUPS_MASK_;
-
-- ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-- if (ret < 0)
-- return ret;
-+ ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-+ if (ret < 0)
-+ goto out;
-+ }
-
-- ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
-- if (ret < 0)
-- return ret;
-+ ret = 0;
-+out:
-+ mutex_unlock(&dev->dev_mutex);
-
-- buf |= PMT_CTL_WUPS_MASK_;
-+ return ret;
-+}
-
-- ret = lan78xx_write_reg(dev, PMT_CTL, buf);
-- if (ret < 0)
-- return ret;
-+static bool lan78xx_submit_deferred_urbs(struct lan78xx_net *dev)
-+{
-+ bool pipe_halted = false;
-+ struct urb *urb;
-
-- ret = lan78xx_start_rx_path(dev);
-- if (ret < 0)
-- return ret;
-- } else {
-- struct lan78xx_priv *pdata;
-+ while ((urb = usb_get_from_anchor(&dev->deferred))) {
-+ struct sk_buff *skb = urb->context;
-+ int ret;
-
-- pdata = (struct lan78xx_priv *)(dev->data[0]);
-+ if (!netif_device_present(dev->net) ||
-+ !netif_carrier_ok(dev->net) ||
-+ pipe_halted) {
-+ usb_free_urb(urb);
-+ dev_kfree_skb(skb);
-+ continue;
-+ }
-
-- ret = lan78xx_set_suspend(dev, pdata->wol);
-- if (ret < 0)
-- return ret;
-+ ret = usb_submit_urb(urb, GFP_ATOMIC);
-+
-+ if (ret == 0) {
-+ netif_trans_update(dev->net);
-+ lan78xx_queue_skb(&dev->txq, skb, tx_start);
-+ } else {
-+ usb_free_urb(urb);
-+ dev_kfree_skb(skb);
-+
-+ if (ret == -EPIPE) {
-+ netif_stop_queue(dev->net);
-+ pipe_halted = true;
-+ } else if (ret == -ENODEV) {
-+ netif_device_detach(dev->net);
-+ }
- }
- }
-
-- ret = 0;
--out:
-- return ret;
-+ return pipe_halted;
- }
-
- static int lan78xx_resume(struct usb_interface *intf)
- {
- struct lan78xx_net *dev = usb_get_intfdata(intf);
-- struct sk_buff *skb;
-- struct urb *res;
-+ bool dev_open;
- int ret;
-
-- if (!timer_pending(&dev->stat_monitor)) {
-- dev->delta = 1;
-- mod_timer(&dev->stat_monitor,
-- jiffies + STAT_UPDATE_TIMER);
-- }
-+ mutex_lock(&dev->dev_mutex);
-
-- ret = lan78xx_flush_tx_fifo(dev);
-- if (ret < 0)
-- return ret;
-+ netif_dbg(dev, ifup, dev->net, "resuming device");
-
-- if (!--dev->suspend_count) {
-- /* resume interrupt URBs */
-- if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) {
-- ret = usb_submit_urb(dev->urb_intr, GFP_NOIO);
-- if (ret < 0)
-- return ret;
-- }
-+ dev_open = test_bit(EVENT_DEV_OPEN, &dev->flags);
-+
-+ if (dev_open) {
-+ bool pipe_halted = false;
-+
-+ ret = lan78xx_flush_tx_fifo(dev);
-+ if (ret < 0)
-+ goto out;
-+
-+ if (dev->urb_intr) {
-+ int ret = usb_submit_urb(dev->urb_intr, GFP_KERNEL);
-
-- spin_lock_irq(&dev->txq.lock);
-- while ((res = usb_get_from_anchor(&dev->deferred))) {
-- skb = (struct sk_buff *)res->context;
-- ret = usb_submit_urb(res, GFP_ATOMIC);
- if (ret < 0) {
-- dev_kfree_skb_any(skb);
-- usb_free_urb(res);
-- usb_autopm_put_interface_async(dev->intf);
-- } else {
-- netif_trans_update(dev->net);
-- lan78xx_queue_skb(&dev->txq, skb, tx_start);
-+ if (ret == -ENODEV)
-+ netif_device_detach(dev->net);
-+
-+ netdev_warn(dev->net, "Failed to submit intr URB");
- }
- }
-
-+ spin_lock_irq(&dev->txq.lock);
-+
-+ if (netif_device_present(dev->net)) {
-+ pipe_halted = lan78xx_submit_deferred_urbs(dev);
-+
-+ if (pipe_halted)
-+ lan78xx_defer_kevent(dev, EVENT_TX_HALT);
-+ }
-+
- clear_bit(EVENT_DEV_ASLEEP, &dev->flags);
-+
- spin_unlock_irq(&dev->txq.lock);
-
-- if (test_bit(EVENT_DEV_OPEN, &dev->flags)) {
-- if (!(skb_queue_len(&dev->txq) >= dev->tx_qlen))
-- netif_start_queue(dev->net);
-- tasklet_schedule(&dev->bh);
-+ if (!pipe_halted &&
-+ netif_device_present(dev->net) &&
-+ (skb_queue_len(&dev->txq) < dev->tx_qlen))
-+ netif_start_queue(dev->net);
-+
-+ ret = lan78xx_start_tx_path(dev);
-+ if (ret < 0)
-+ goto out;
-+
-+ tasklet_schedule(&dev->bh);
-+
-+ if (!timer_pending(&dev->stat_monitor)) {
-+ dev->delta = 1;
-+ mod_timer(&dev->stat_monitor,
-+ jiffies + STAT_UPDATE_TIMER);
- }
-+
-+ } else {
-+ clear_bit(EVENT_DEV_ASLEEP, &dev->flags);
- }
-
- ret = lan78xx_write_reg(dev, WUCSR2, 0);
- if (ret < 0)
-- return ret;
-+ goto out;
- ret = lan78xx_write_reg(dev, WUCSR, 0);
- if (ret < 0)
-- return ret;
-+ goto out;
- ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
- if (ret < 0)
-- return ret;
-+ goto out;
-
- ret = lan78xx_write_reg(dev, WUCSR2, WUCSR2_NS_RCD_ |
- WUCSR2_ARP_RCD_ |
- WUCSR2_IPV6_TCPSYN_RCD_ |
- WUCSR2_IPV4_TCPSYN_RCD_);
- if (ret < 0)
-- return ret;
-+ goto out;
-
- ret = lan78xx_write_reg(dev, WUCSR, WUCSR_EEE_TX_WAKE_ |
- WUCSR_EEE_RX_WAKE_ |
-@@ -4445,9 +4590,11 @@ static int lan78xx_resume(struct usb_interface *intf)
- WUCSR_MPR_ |
- WUCSR_BCST_FR_);
- if (ret < 0)
-- return ret;
-+ goto out;
-
-- ret = lan78xx_start_tx_path(dev);
-+ ret = 0;
-+out:
-+ mutex_unlock(&dev->dev_mutex);
-
- return ret;
- }
-@@ -4457,6 +4604,8 @@ static int lan78xx_reset_resume(struct usb_interface *intf)
- struct lan78xx_net *dev = usb_get_intfdata(intf);
- int ret;
-
-+ netif_dbg(dev, ifup, dev->net, "(reset) resuming device");
-+
- ret = lan78xx_reset(dev);
- if (ret < 0)
- return ret;
---
-2.43.0
-
diff --git a/queue-5.4/lan78xx-fix-white-space-and-style-issues.patch b/queue-5.4/lan78xx-fix-white-space-and-style-issues.patch
deleted file mode 100644
index 0d11daa732..0000000000
--- a/queue-5.4/lan78xx-fix-white-space-and-style-issues.patch
+++ /dev/null
@@ -1,255 +0,0 @@
-From 79f611683f92b220eac088624a9938dd602be573 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 24 Aug 2021 19:56:04 +0100
-Subject: lan78xx: Fix white space and style issues
-
-From: John Efstathiades <john.efstathiades@pebblebay.com>
-
-[ Upstream commit 9ceec7d33adf9647293f24d2fd9a055b89c63864 ]
-
-Fix white space and code style issues identified by checkpatch.
-
-Signed-off-by: John Efstathiades <john.efstathiades@pebblebay.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow on link stop")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/usb/lan78xx.c | 80 ++++++++++++++++++++-------------------
- 1 file changed, 42 insertions(+), 38 deletions(-)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 454a03f0bc69f..67c5787d749d8 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -385,7 +385,7 @@ struct lan78xx_net {
- struct usb_anchor deferred;
-
- struct mutex phy_mutex; /* for phy access */
-- unsigned pipe_in, pipe_out, pipe_intr;
-+ unsigned int pipe_in, pipe_out, pipe_intr;
-
- u32 hard_mtu; /* count any extra framing */
- size_t rx_urb_size; /* size for rx urbs */
-@@ -395,7 +395,7 @@ struct lan78xx_net {
- wait_queue_head_t *wait;
- unsigned char suspend_count;
-
-- unsigned maxpacket;
-+ unsigned int maxpacket;
- struct timer_list delay;
- struct timer_list stat_monitor;
-
-@@ -504,7 +504,7 @@ static int lan78xx_read_stats(struct lan78xx_net *dev,
- if (likely(ret >= 0)) {
- src = (u32 *)stats;
- dst = (u32 *)data;
-- for (i = 0; i < sizeof(*stats)/sizeof(u32); i++) {
-+ for (i = 0; i < sizeof(*stats) / sizeof(u32); i++) {
- le32_to_cpus(&src[i]);
- dst[i] = src[i];
- }
-@@ -518,10 +518,11 @@ static int lan78xx_read_stats(struct lan78xx_net *dev,
- return ret;
- }
-
--#define check_counter_rollover(struct1, dev_stats, member) { \
-- if (struct1->member < dev_stats.saved.member) \
-- dev_stats.rollover_count.member++; \
-- }
-+#define check_counter_rollover(struct1, dev_stats, member) \
-+ do { \
-+ if ((struct1)->member < (dev_stats).saved.member) \
-+ (dev_stats).rollover_count.member++; \
-+ } while (0)
-
- static void lan78xx_check_stat_rollover(struct lan78xx_net *dev,
- struct lan78xx_statstage *stats)
-@@ -847,9 +848,9 @@ static int lan78xx_read_raw_otp(struct lan78xx_net *dev, u32 offset,
-
- for (i = 0; i < length; i++) {
- lan78xx_write_reg(dev, OTP_ADDR1,
-- ((offset + i) >> 8) & OTP_ADDR1_15_11);
-+ ((offset + i) >> 8) & OTP_ADDR1_15_11);
- lan78xx_write_reg(dev, OTP_ADDR2,
-- ((offset + i) & OTP_ADDR2_10_3));
-+ ((offset + i) & OTP_ADDR2_10_3));
-
- lan78xx_write_reg(dev, OTP_FUNC_CMD, OTP_FUNC_CMD_READ_);
- lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_);
-@@ -903,9 +904,9 @@ static int lan78xx_write_raw_otp(struct lan78xx_net *dev, u32 offset,
-
- for (i = 0; i < length; i++) {
- lan78xx_write_reg(dev, OTP_ADDR1,
-- ((offset + i) >> 8) & OTP_ADDR1_15_11);
-+ ((offset + i) >> 8) & OTP_ADDR1_15_11);
- lan78xx_write_reg(dev, OTP_ADDR2,
-- ((offset + i) & OTP_ADDR2_10_3));
-+ ((offset + i) & OTP_ADDR2_10_3));
- lan78xx_write_reg(dev, OTP_PRGM_DATA, data[i]);
- lan78xx_write_reg(dev, OTP_TST_CMD, OTP_TST_CMD_PRGVRFY_);
- lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_);
-@@ -962,7 +963,7 @@ static int lan78xx_dataport_wait_not_busy(struct lan78xx_net *dev)
- usleep_range(40, 100);
- }
-
-- netdev_warn(dev->net, "lan78xx_dataport_wait_not_busy timed out");
-+ netdev_warn(dev->net, "%s timed out", __func__);
-
- return -EIO;
- }
-@@ -975,7 +976,7 @@ static int lan78xx_dataport_write(struct lan78xx_net *dev, u32 ram_select,
- int i, ret;
-
- if (usb_autopm_get_interface(dev->intf) < 0)
-- return 0;
-+ return 0;
-
- mutex_lock(&pdata->dataport_mutex);
-
-@@ -1048,9 +1049,9 @@ static void lan78xx_deferred_multicast_write(struct work_struct *param)
- for (i = 1; i < NUM_OF_MAF; i++) {
- lan78xx_write_reg(dev, MAF_HI(i), 0);
- lan78xx_write_reg(dev, MAF_LO(i),
-- pdata->pfilter_table[i][1]);
-+ pdata->pfilter_table[i][1]);
- lan78xx_write_reg(dev, MAF_HI(i),
-- pdata->pfilter_table[i][0]);
-+ pdata->pfilter_table[i][0]);
- }
-
- lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
-@@ -1069,11 +1070,12 @@ static void lan78xx_set_multicast(struct net_device *netdev)
- RFE_CTL_DA_PERFECT_ | RFE_CTL_MCAST_HASH_);
-
- for (i = 0; i < DP_SEL_VHF_HASH_LEN; i++)
-- pdata->mchash_table[i] = 0;
-+ pdata->mchash_table[i] = 0;
-+
- /* pfilter_table[0] has own HW address */
- for (i = 1; i < NUM_OF_MAF; i++) {
-- pdata->pfilter_table[i][0] =
-- pdata->pfilter_table[i][1] = 0;
-+ pdata->pfilter_table[i][0] = 0;
-+ pdata->pfilter_table[i][1] = 0;
- }
-
- pdata->rfe_ctl |= RFE_CTL_BCAST_EN_;
-@@ -1267,9 +1269,10 @@ static void lan78xx_status(struct lan78xx_net *dev, struct urb *urb)
- generic_handle_irq(dev->domain_data.phyirq);
- local_irq_enable();
- }
-- } else
-+ } else {
- netdev_warn(dev->net,
- "unexpected interrupt: 0x%08x\n", intdata);
-+ }
- }
-
- static int lan78xx_ethtool_get_eeprom_len(struct net_device *netdev)
-@@ -1358,7 +1361,7 @@ static void lan78xx_get_wol(struct net_device *netdev,
- struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0]);
-
- if (usb_autopm_get_interface(dev->intf) < 0)
-- return;
-+ return;
-
- ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
- if (unlikely(ret < 0)) {
-@@ -1988,7 +1991,7 @@ static int lan8835_fixup(struct phy_device *phydev)
-
- /* RGMII MAC TXC Delay Enable */
- lan78xx_write_reg(dev, MAC_RGMII_ID,
-- MAC_RGMII_ID_TXC_DELAY_EN_);
-+ MAC_RGMII_ID_TXC_DELAY_EN_);
-
- /* RGMII TX DLL Tune Adjust */
- lan78xx_write_reg(dev, RGMII_TX_BYP_DLL, 0x3D00);
-@@ -3342,9 +3345,10 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
- if (skb)
- dev_kfree_skb_any(skb);
- usb_free_urb(urb);
-- } else
-+ } else {
- netif_dbg(dev, tx_queued, dev->net,
- "> tx, len %d, type 0x%x\n", length, skb->protocol);
-+ }
- }
-
- static void lan78xx_rx_bh(struct lan78xx_net *dev)
-@@ -3445,7 +3449,7 @@ static void lan78xx_delayedwork(struct work_struct *work)
- unlink_urbs(dev, &dev->rxq);
- status = usb_autopm_get_interface(dev->intf);
- if (status < 0)
-- goto fail_halt;
-+ goto fail_halt;
- status = usb_clear_halt(dev->udev, dev->pipe_in);
- usb_autopm_put_interface(dev->intf);
- if (status < 0 &&
-@@ -3618,8 +3622,8 @@ static int lan78xx_probe(struct usb_interface *intf,
- struct net_device *netdev;
- struct usb_device *udev;
- int ret;
-- unsigned maxp;
-- unsigned period;
-+ unsigned int maxp;
-+ unsigned int period;
- u8 *buf = NULL;
-
- udev = interface_to_usbdev(intf);
-@@ -3850,10 +3854,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- /* set WUF_CFG & WUF_MASK for IPv4 Multicast */
- crc = lan78xx_wakeframe_crc16(ipv4_multicast, 3);
- lan78xx_write_reg(dev, WUF_CFG(mask_index),
-- WUF_CFGX_EN_ |
-- WUF_CFGX_TYPE_MCAST_ |
-- (0 << WUF_CFGX_OFFSET_SHIFT_) |
-- (crc & WUF_CFGX_CRC16_MASK_));
-+ WUF_CFGX_EN_ |
-+ WUF_CFGX_TYPE_MCAST_ |
-+ (0 << WUF_CFGX_OFFSET_SHIFT_) |
-+ (crc & WUF_CFGX_CRC16_MASK_));
-
- lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7);
- lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-@@ -3864,10 +3868,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- /* for IPv6 Multicast */
- crc = lan78xx_wakeframe_crc16(ipv6_multicast, 2);
- lan78xx_write_reg(dev, WUF_CFG(mask_index),
-- WUF_CFGX_EN_ |
-- WUF_CFGX_TYPE_MCAST_ |
-- (0 << WUF_CFGX_OFFSET_SHIFT_) |
-- (crc & WUF_CFGX_CRC16_MASK_));
-+ WUF_CFGX_EN_ |
-+ WUF_CFGX_TYPE_MCAST_ |
-+ (0 << WUF_CFGX_OFFSET_SHIFT_) |
-+ (crc & WUF_CFGX_CRC16_MASK_));
-
- lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3);
- lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-@@ -3894,10 +3898,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
- */
- crc = lan78xx_wakeframe_crc16(arp_type, 2);
- lan78xx_write_reg(dev, WUF_CFG(mask_index),
-- WUF_CFGX_EN_ |
-- WUF_CFGX_TYPE_ALL_ |
-- (0 << WUF_CFGX_OFFSET_SHIFT_) |
-- (crc & WUF_CFGX_CRC16_MASK_));
-+ WUF_CFGX_EN_ |
-+ WUF_CFGX_TYPE_ALL_ |
-+ (0 << WUF_CFGX_OFFSET_SHIFT_) |
-+ (crc & WUF_CFGX_CRC16_MASK_));
-
- lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000);
- lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
-@@ -4045,7 +4049,7 @@ static int lan78xx_resume(struct usb_interface *intf)
- if (!--dev->suspend_count) {
- /* resume interrupt URBs */
- if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags))
-- usb_submit_urb(dev->urb_intr, GFP_NOIO);
-+ usb_submit_urb(dev->urb_intr, GFP_NOIO);
-
- spin_lock_irq(&dev->txq.lock);
- while ((res = usb_get_from_anchor(&dev->deferred))) {
---
-2.43.0
-
diff --git a/queue-5.4/net-ice-fix-potential-null-pointer-dereference-in-ic.patch b/queue-5.4/net-ice-fix-potential-null-pointer-dereference-in-ic.patch
deleted file mode 100644
index 0d47eb8336..0000000000
--- a/queue-5.4/net-ice-fix-potential-null-pointer-dereference-in-ic.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0639a725b8a48593d24df99cb75086d8efa5a7ea Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 28 Feb 2024 18:54:48 +0300
-Subject: net: ice: Fix potential NULL pointer dereference in
- ice_bridge_setlink()
-
-From: Rand Deeb <rand.sec96@gmail.com>
-
-[ Upstream commit 06e456a05d669ca30b224b8ed962421770c1496c ]
-
-The function ice_bridge_setlink() may encounter a NULL pointer dereference
-if nlmsg_find_attr() returns NULL and br_spec is dereferenced subsequently
-in nla_for_each_nested(). To address this issue, add a check to ensure that
-br_spec is not NULL before proceeding with the nested attribute iteration.
-
-Fixes: b1edc14a3fbf ("ice: Implement ice_bridge_getlink and ice_bridge_setlink")
-Signed-off-by: Rand Deeb <rand.sec96@gmail.com>
-Reviewed-by: Simon Horman <horms@kernel.org>
-Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/intel/ice/ice_main.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
-index 209ae96875849..cf1baae963de2 100644
---- a/drivers/net/ethernet/intel/ice/ice_main.c
-+++ b/drivers/net/ethernet/intel/ice/ice_main.c
-@@ -4594,6 +4594,8 @@ ice_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
- pf_sw = pf->first_sw;
- /* find the attribute in the netlink message */
- br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
-+ if (!br_spec)
-+ return -EINVAL;
-
- nla_for_each_nested(attr, br_spec, rem) {
- __u16 mode;
---
-2.43.0
-
diff --git a/queue-5.4/net-ipv6-avoid-possible-uaf-in-ip6_route_mpath_notif.patch b/queue-5.4/net-ipv6-avoid-possible-uaf-in-ip6_route_mpath_notif.patch
deleted file mode 100644
index 901ed87d3c..0000000000
--- a/queue-5.4/net-ipv6-avoid-possible-uaf-in-ip6_route_mpath_notif.patch
+++ /dev/null
@@ -1,258 +0,0 @@
-From e9be17f73722d02ac3ea4c34171c6da1e8096b09 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 3 Mar 2024 14:48:00 +0000
-Subject: net/ipv6: avoid possible UAF in ip6_route_mpath_notify()
-
-From: Eric Dumazet <edumazet@google.com>
-
-[ Upstream commit 685f7d531264599b3f167f1e94bbd22f120e5fab ]
-
-syzbot found another use-after-free in ip6_route_mpath_notify() [1]
-
-Commit f7225172f25a ("net/ipv6: prevent use after free in
-ip6_route_mpath_notify") was not able to fix the root cause.
-
-We need to defer the fib6_info_release() calls after
-ip6_route_mpath_notify(), in the cleanup phase.
-
-[1]
-BUG: KASAN: slab-use-after-free in rt6_fill_node+0x1460/0x1ac0
-Read of size 4 at addr ffff88809a07fc64 by task syz-executor.2/23037
-
-CPU: 0 PID: 23037 Comm: syz-executor.2 Not tainted 6.8.0-rc4-syzkaller-01035-gea7f3cfaa588 #0
-Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/25/2024
-Call Trace:
- <TASK>
- __dump_stack lib/dump_stack.c:88 [inline]
- dump_stack_lvl+0x1e7/0x2e0 lib/dump_stack.c:106
- print_address_description mm/kasan/report.c:377 [inline]
- print_report+0x167/0x540 mm/kasan/report.c:488
- kasan_report+0x142/0x180 mm/kasan/report.c:601
- rt6_fill_node+0x1460/0x1ac0
- inet6_rt_notify+0x13b/0x290 net/ipv6/route.c:6184
- ip6_route_mpath_notify net/ipv6/route.c:5198 [inline]
- ip6_route_multipath_add net/ipv6/route.c:5404 [inline]
- inet6_rtm_newroute+0x1d0f/0x2300 net/ipv6/route.c:5517
- rtnetlink_rcv_msg+0x885/0x1040 net/core/rtnetlink.c:6597
- netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2543
- netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline]
- netlink_unicast+0x7ea/0x980 net/netlink/af_netlink.c:1367
- netlink_sendmsg+0xa3b/0xd70 net/netlink/af_netlink.c:1908
- sock_sendmsg_nosec net/socket.c:730 [inline]
- __sock_sendmsg+0x221/0x270 net/socket.c:745
- ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584
- ___sys_sendmsg net/socket.c:2638 [inline]
- __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667
- do_syscall_64+0xf9/0x240
- entry_SYSCALL_64_after_hwframe+0x6f/0x77
-RIP: 0033:0x7f73dd87dda9
-Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 e1 20 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b0 ff ff ff f7 d8 64 89 01 48
-RSP: 002b:00007f73de6550c8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
-RAX: ffffffffffffffda RBX: 00007f73dd9ac050 RCX: 00007f73dd87dda9
-RDX: 0000000000000000 RSI: 0000000020000140 RDI: 0000000000000005
-RBP: 00007f73dd8ca47a R08: 0000000000000000 R09: 0000000000000000
-R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
-R13: 000000000000006e R14: 00007f73dd9ac050 R15: 00007ffdbdeb7858
- </TASK>
-
-Allocated by task 23037:
- kasan_save_stack mm/kasan/common.c:47 [inline]
- kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
- poison_kmalloc_redzone mm/kasan/common.c:372 [inline]
- __kasan_kmalloc+0x98/0xb0 mm/kasan/common.c:389
- kasan_kmalloc include/linux/kasan.h:211 [inline]
- __do_kmalloc_node mm/slub.c:3981 [inline]
- __kmalloc+0x22e/0x490 mm/slub.c:3994
- kmalloc include/linux/slab.h:594 [inline]
- kzalloc include/linux/slab.h:711 [inline]
- fib6_info_alloc+0x2e/0xf0 net/ipv6/ip6_fib.c:155
- ip6_route_info_create+0x445/0x12b0 net/ipv6/route.c:3758
- ip6_route_multipath_add net/ipv6/route.c:5298 [inline]
- inet6_rtm_newroute+0x744/0x2300 net/ipv6/route.c:5517
- rtnetlink_rcv_msg+0x885/0x1040 net/core/rtnetlink.c:6597
- netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2543
- netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline]
- netlink_unicast+0x7ea/0x980 net/netlink/af_netlink.c:1367
- netlink_sendmsg+0xa3b/0xd70 net/netlink/af_netlink.c:1908
- sock_sendmsg_nosec net/socket.c:730 [inline]
- __sock_sendmsg+0x221/0x270 net/socket.c:745
- ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584
- ___sys_sendmsg net/socket.c:2638 [inline]
- __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667
- do_syscall_64+0xf9/0x240
- entry_SYSCALL_64_after_hwframe+0x6f/0x77
-
-Freed by task 16:
- kasan_save_stack mm/kasan/common.c:47 [inline]
- kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
- kasan_save_free_info+0x4e/0x60 mm/kasan/generic.c:640
- poison_slab_object+0xa6/0xe0 mm/kasan/common.c:241
- __kasan_slab_free+0x34/0x70 mm/kasan/common.c:257
- kasan_slab_free include/linux/kasan.h:184 [inline]
- slab_free_hook mm/slub.c:2121 [inline]
- slab_free mm/slub.c:4299 [inline]
- kfree+0x14a/0x380 mm/slub.c:4409
- rcu_do_batch kernel/rcu/tree.c:2190 [inline]
- rcu_core+0xd76/0x1810 kernel/rcu/tree.c:2465
- __do_softirq+0x2bb/0x942 kernel/softirq.c:553
-
-Last potentially related work creation:
- kasan_save_stack+0x3f/0x60 mm/kasan/common.c:47
- __kasan_record_aux_stack+0xae/0x100 mm/kasan/generic.c:586
- __call_rcu_common kernel/rcu/tree.c:2715 [inline]
- call_rcu+0x167/0xa80 kernel/rcu/tree.c:2829
- fib6_info_release include/net/ip6_fib.h:341 [inline]
- ip6_route_multipath_add net/ipv6/route.c:5344 [inline]
- inet6_rtm_newroute+0x114d/0x2300 net/ipv6/route.c:5517
- rtnetlink_rcv_msg+0x885/0x1040 net/core/rtnetlink.c:6597
- netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2543
- netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline]
- netlink_unicast+0x7ea/0x980 net/netlink/af_netlink.c:1367
- netlink_sendmsg+0xa3b/0xd70 net/netlink/af_netlink.c:1908
- sock_sendmsg_nosec net/socket.c:730 [inline]
- __sock_sendmsg+0x221/0x270 net/socket.c:745
- ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584
- ___sys_sendmsg net/socket.c:2638 [inline]
- __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667
- do_syscall_64+0xf9/0x240
- entry_SYSCALL_64_after_hwframe+0x6f/0x77
-
-The buggy address belongs to the object at ffff88809a07fc00
- which belongs to the cache kmalloc-512 of size 512
-The buggy address is located 100 bytes inside of
- freed 512-byte region [ffff88809a07fc00, ffff88809a07fe00)
-
-The buggy address belongs to the physical page:
-page:ffffea0002681f00 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x9a07c
-head:ffffea0002681f00 order:2 entire_mapcount:0 nr_pages_mapped:0 pincount:0
-flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff)
-page_type: 0xffffffff()
-raw: 00fff00000000840 ffff888014c41c80 dead000000000122 0000000000000000
-raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000
-page dumped because: kasan: bad access detected
-page_owner tracks the page as allocated
-page last allocated via order 2, migratetype Unmovable, gfp_mask 0x1d20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_HARDWALL), pid 23028, tgid 23027 (syz-executor.4), ts 2340253595219, free_ts 2339107097036
- set_page_owner include/linux/page_owner.h:31 [inline]
- post_alloc_hook+0x1ea/0x210 mm/page_alloc.c:1533
- prep_new_page mm/page_alloc.c:1540 [inline]
- get_page_from_freelist+0x33ea/0x3580 mm/page_alloc.c:3311
- __alloc_pages+0x255/0x680 mm/page_alloc.c:4567
- __alloc_pages_node include/linux/gfp.h:238 [inline]
- alloc_pages_node include/linux/gfp.h:261 [inline]
- alloc_slab_page+0x5f/0x160 mm/slub.c:2190
- allocate_slab mm/slub.c:2354 [inline]
- new_slab+0x84/0x2f0 mm/slub.c:2407
- ___slab_alloc+0xd17/0x13e0 mm/slub.c:3540
- __slab_alloc mm/slub.c:3625 [inline]
- __slab_alloc_node mm/slub.c:3678 [inline]
- slab_alloc_node mm/slub.c:3850 [inline]
- __do_kmalloc_node mm/slub.c:3980 [inline]
- __kmalloc+0x2e0/0x490 mm/slub.c:3994
- kmalloc include/linux/slab.h:594 [inline]
- kzalloc include/linux/slab.h:711 [inline]
- new_dir fs/proc/proc_sysctl.c:956 [inline]
- get_subdir fs/proc/proc_sysctl.c:1000 [inline]
- sysctl_mkdir_p fs/proc/proc_sysctl.c:1295 [inline]
- __register_sysctl_table+0xb30/0x1440 fs/proc/proc_sysctl.c:1376
- neigh_sysctl_register+0x416/0x500 net/core/neighbour.c:3859
- devinet_sysctl_register+0xaf/0x1f0 net/ipv4/devinet.c:2644
- inetdev_init+0x296/0x4d0 net/ipv4/devinet.c:286
- inetdev_event+0x338/0x15c0 net/ipv4/devinet.c:1555
- notifier_call_chain+0x18f/0x3b0 kernel/notifier.c:93
- call_netdevice_notifiers_extack net/core/dev.c:1987 [inline]
- call_netdevice_notifiers net/core/dev.c:2001 [inline]
- register_netdevice+0x15b2/0x1a20 net/core/dev.c:10340
- br_dev_newlink+0x27/0x100 net/bridge/br_netlink.c:1563
- rtnl_newlink_create net/core/rtnetlink.c:3497 [inline]
- __rtnl_newlink net/core/rtnetlink.c:3717 [inline]
- rtnl_newlink+0x158f/0x20a0 net/core/rtnetlink.c:3730
-page last free pid 11583 tgid 11583 stack trace:
- reset_page_owner include/linux/page_owner.h:24 [inline]
- free_pages_prepare mm/page_alloc.c:1140 [inline]
- free_unref_page_prepare+0x968/0xa90 mm/page_alloc.c:2346
- free_unref_page+0x37/0x3f0 mm/page_alloc.c:2486
- kasan_depopulate_vmalloc_pte+0x74/0x90 mm/kasan/shadow.c:415
- apply_to_pte_range mm/memory.c:2619 [inline]
- apply_to_pmd_range mm/memory.c:2663 [inline]
- apply_to_pud_range mm/memory.c:2699 [inline]
- apply_to_p4d_range mm/memory.c:2735 [inline]
- __apply_to_page_range+0x8ec/0xe40 mm/memory.c:2769
- kasan_release_vmalloc+0x9a/0xb0 mm/kasan/shadow.c:532
- __purge_vmap_area_lazy+0x163f/0x1a10 mm/vmalloc.c:1770
- drain_vmap_area_work+0x40/0xd0 mm/vmalloc.c:1804
- process_one_work kernel/workqueue.c:2633 [inline]
- process_scheduled_works+0x913/0x1420 kernel/workqueue.c:2706
- worker_thread+0xa5f/0x1000 kernel/workqueue.c:2787
- kthread+0x2ef/0x390 kernel/kthread.c:388
- ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
- ret_from_fork_asm+0x1b/0x30 arch/x86/entry/entry_64.S:242
-
-Memory state around the buggy address:
- ffff88809a07fb00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
- ffff88809a07fb80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
->ffff88809a07fc00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
- ^
- ffff88809a07fc80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
- ffff88809a07fd00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
-
-Fixes: 3b1137fe7482 ("net: ipv6: Change notifications for multipath add to RTA_MULTIPATH")
-Reported-by: syzbot <syzkaller@googlegroups.com>
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Reviewed-by: David Ahern <dsahern@kernel.org>
-Link: https://lore.kernel.org/r/20240303144801.702646-1-edumazet@google.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/ipv6/route.c | 21 +++++++--------------
- 1 file changed, 7 insertions(+), 14 deletions(-)
-
-diff --git a/net/ipv6/route.c b/net/ipv6/route.c
-index c26e832fddb7d..8eac2c890449f 100644
---- a/net/ipv6/route.c
-+++ b/net/ipv6/route.c
-@@ -5218,19 +5218,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
- err_nh = NULL;
- list_for_each_entry(nh, &rt6_nh_list, next) {
- err = __ip6_ins_rt(nh->fib6_info, info, extack);
-- fib6_info_release(nh->fib6_info);
--
-- if (!err) {
-- /* save reference to last route successfully inserted */
-- rt_last = nh->fib6_info;
--
-- /* save reference to first route for notification */
-- if (!rt_notif)
-- rt_notif = nh->fib6_info;
-- }
-
-- /* nh->fib6_info is used or freed at this point, reset to NULL*/
-- nh->fib6_info = NULL;
- if (err) {
- if (replace && nhn)
- NL_SET_ERR_MSG_MOD(extack,
-@@ -5238,6 +5226,12 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
- err_nh = nh;
- goto add_errout;
- }
-+ /* save reference to last route successfully inserted */
-+ rt_last = nh->fib6_info;
-+
-+ /* save reference to first route for notification */
-+ if (!rt_notif)
-+ rt_notif = nh->fib6_info;
-
- /* Because each route is added like a single route we remove
- * these flags after the first nexthop: if there is a collision,
-@@ -5284,8 +5278,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
-
- cleanup:
- list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
-- if (nh->fib6_info)
-- fib6_info_release(nh->fib6_info);
-+ fib6_info_release(nh->fib6_info);
- list_del(&nh->next);
- kfree(nh);
- }
---
-2.43.0
-
diff --git a/queue-5.4/net-lan78xx-fix-runtime-pm-count-underflow-on-link-s.patch b/queue-5.4/net-lan78xx-fix-runtime-pm-count-underflow-on-link-s.patch
deleted file mode 100644
index cbc02acffb..0000000000
--- a/queue-5.4/net-lan78xx-fix-runtime-pm-count-underflow-on-link-s.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 317dced42dc4429296f7a6aa52d322e5579326f4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 28 Feb 2024 13:45:17 +0100
-Subject: net: lan78xx: fix runtime PM count underflow on link stop
-
-From: Oleksij Rempel <o.rempel@pengutronix.de>
-
-[ Upstream commit 1eecc7ab82c42133b748e1895275942a054a7f67 ]
-
-Current driver has some asymmetry in the runtime PM calls. On lan78xx_open()
-it will call usb_autopm_get() and unconditionally usb_autopm_put(). And
-on lan78xx_stop() it will call only usb_autopm_put(). So far, it was
-working only because this driver do not activate autosuspend by default,
-so it was visible only by warning "Runtime PM usage count underflow!".
-
-Since, with current driver, we can't use runtime PM with active link,
-execute lan78xx_open()->usb_autopm_put() only in error case. Otherwise,
-keep ref counting high as long as interface is open.
-
-Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver")
-Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
-Reviewed-by: Jiri Pirko <jiri@nvidia.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/usb/lan78xx.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 42fe7753ff76d..b0efaf56d78f3 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -2905,7 +2905,8 @@ static int lan78xx_open(struct net_device *net)
- done:
- mutex_unlock(&dev->dev_mutex);
-
-- usb_autopm_put_interface(dev->intf);
-+ if (ret < 0)
-+ usb_autopm_put_interface(dev->intf);
-
- return ret;
- }
---
-2.43.0
-
diff --git a/queue-5.4/net-rds-fix-warning-in-rds_conn_connect_if_down.patch b/queue-5.4/net-rds-fix-warning-in-rds_conn_connect_if_down.patch
deleted file mode 100644
index c9a9e65035..0000000000
--- a/queue-5.4/net-rds-fix-warning-in-rds_conn_connect_if_down.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From a0949b1ffc2bf19110fa8785f19fd5a5112a66b5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 5 Mar 2024 08:13:08 +0800
-Subject: net/rds: fix WARNING in rds_conn_connect_if_down
-
-From: Edward Adam Davis <eadavis@qq.com>
-
-[ Upstream commit c055fc00c07be1f0df7375ab0036cebd1106ed38 ]
-
-If connection isn't established yet, get_mr() will fail, trigger connection after
-get_mr().
-
-Fixes: 584a8279a44a ("RDS: RDMA: return appropriate error on rdma map failures")
-Reported-and-tested-by: syzbot+d4faee732755bba9838e@syzkaller.appspotmail.com
-Signed-off-by: Edward Adam Davis <eadavis@qq.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/rds/rdma.c | 3 +++
- net/rds/send.c | 6 +-----
- 2 files changed, 4 insertions(+), 5 deletions(-)
-
-diff --git a/net/rds/rdma.c b/net/rds/rdma.c
-index 1c42a600fe7fa..dc0f7cf1917ff 100644
---- a/net/rds/rdma.c
-+++ b/net/rds/rdma.c
-@@ -279,6 +279,9 @@ static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args,
- put_page(sg_page(&sg[i]));
- kfree(sg);
- ret = PTR_ERR(trans_private);
-+ /* Trigger connection so that its ready for the next retry */
-+ if (ret == -ENODEV)
-+ rds_conn_connect_if_down(cp->cp_conn);
- goto out;
- }
-
-diff --git a/net/rds/send.c b/net/rds/send.c
-index 68e2bdb08fd09..6c2c5667e3a39 100644
---- a/net/rds/send.c
-+++ b/net/rds/send.c
-@@ -1314,12 +1314,8 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
-
- /* Parse any control messages the user may have included. */
- ret = rds_cmsg_send(rs, rm, msg, &allocated_mr, &vct);
-- if (ret) {
-- /* Trigger connection so that its ready for the next retry */
-- if (ret == -EAGAIN)
-- rds_conn_connect_if_down(conn);
-+ if (ret)
- goto out;
-- }
-
- if (rm->rdma.op_active && !conn->c_trans->xmit_rdma) {
- printk_ratelimited(KERN_NOTICE "rdma_op %p conn xmit_rdma %p\n",
---
-2.43.0
-
diff --git a/queue-5.4/netfilter-nf_conntrack_h323-add-protection-for-bmp-l.patch b/queue-5.4/netfilter-nf_conntrack_h323-add-protection-for-bmp-l.patch
deleted file mode 100644
index 18e7d1a6af..0000000000
--- a/queue-5.4/netfilter-nf_conntrack_h323-add-protection-for-bmp-l.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From e786cb07cd8f73f6f0c326250b394a4753c7f47e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 5 Mar 2024 11:38:55 +0000
-Subject: netfilter: nf_conntrack_h323: Add protection for bmp length out of
- range
-
-From: Lena Wang <lena.wang@mediatek.com>
-
-[ Upstream commit 767146637efc528b5e3d31297df115e85a2fd362 ]
-
-UBSAN load reports an exception of BRK#5515 SHIFT_ISSUE:Bitwise shifts
-that are out of bounds for their data type.
-
-vmlinux get_bitmap(b=75) + 712
-<net/netfilter/nf_conntrack_h323_asn1.c:0>
-vmlinux decode_seq(bs=0xFFFFFFD008037000, f=0xFFFFFFD008037018, level=134443100) + 1956
-<net/netfilter/nf_conntrack_h323_asn1.c:592>
-vmlinux decode_choice(base=0xFFFFFFD0080370F0, level=23843636) + 1216
-<net/netfilter/nf_conntrack_h323_asn1.c:814>
-vmlinux decode_seq(f=0xFFFFFFD0080371A8, level=134443500) + 812
-<net/netfilter/nf_conntrack_h323_asn1.c:576>
-vmlinux decode_choice(base=0xFFFFFFD008037280, level=0) + 1216
-<net/netfilter/nf_conntrack_h323_asn1.c:814>
-vmlinux DecodeRasMessage() + 304
-<net/netfilter/nf_conntrack_h323_asn1.c:833>
-vmlinux ras_help() + 684
-<net/netfilter/nf_conntrack_h323_main.c:1728>
-vmlinux nf_confirm() + 188
-<net/netfilter/nf_conntrack_proto.c:137>
-
-Due to abnormal data in skb->data, the extension bitmap length
-exceeds 32 when decoding ras message then uses the length to make
-a shift operation. It will change into negative after several loop.
-UBSAN load could detect a negative shift as an undefined behaviour
-and reports exception.
-So we add the protection to avoid the length exceeding 32. Or else
-it will return out of range error and stop decoding.
-
-Fixes: 5e35941d9901 ("[NETFILTER]: Add H.323 conntrack/NAT helper")
-Signed-off-by: Lena Wang <lena.wang@mediatek.com>
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netfilter/nf_conntrack_h323_asn1.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conntrack_h323_asn1.c
-index 573cb44814813..814857ae3b812 100644
---- a/net/netfilter/nf_conntrack_h323_asn1.c
-+++ b/net/netfilter/nf_conntrack_h323_asn1.c
-@@ -533,6 +533,8 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
- /* Get fields bitmap */
- if (nf_h323_error_boundary(bs, 0, f->sz))
- return H323_ERROR_BOUND;
-+ if (f->sz > 32)
-+ return H323_ERROR_RANGE;
- bmp = get_bitmap(bs, f->sz);
- if (base)
- *(unsigned int *)base = bmp;
-@@ -589,6 +591,8 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
- bmp2_len = get_bits(bs, 7) + 1;
- if (nf_h323_error_boundary(bs, 0, bmp2_len))
- return H323_ERROR_BOUND;
-+ if (bmp2_len > 32)
-+ return H323_ERROR_RANGE;
- bmp2 = get_bitmap(bs, bmp2_len);
- bmp |= bmp2 >> f->sz;
- if (base)
---
-2.43.0
-
diff --git a/queue-5.4/netfilter-nft_ct-fix-l3num-expectations-with-inet-ps.patch b/queue-5.4/netfilter-nft_ct-fix-l3num-expectations-with-inet-ps.patch
deleted file mode 100644
index d7b4bea8a9..0000000000
--- a/queue-5.4/netfilter-nft_ct-fix-l3num-expectations-with-inet-ps.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 6c5a87dafbdbf5e5fa4169c99049d551e44e97c0 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 1 Mar 2024 13:38:15 +0100
-Subject: netfilter: nft_ct: fix l3num expectations with inet pseudo family
-
-From: Florian Westphal <fw@strlen.de>
-
-[ Upstream commit 99993789966a6eb4f1295193dc543686899892d3 ]
-
-Following is rejected but should be allowed:
-
-table inet t {
- ct expectation exp1 {
- [..]
- l3proto ip
-
-Valid combos are:
-table ip t, l3proto ip
-table ip6 t, l3proto ip6
-table inet t, l3proto ip OR l3proto ip6
-
-Disallow inet pseudeo family, the l3num must be a on-wire protocol known
-to conntrack.
-
-Retain NFPROTO_INET case to make it clear its rejected
-intentionally rather as oversight.
-
-Fixes: 8059918a1377 ("netfilter: nft_ct: sanitize layer 3 and 4 protocol number in custom expectations")
-Signed-off-by: Florian Westphal <fw@strlen.de>
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netfilter/nft_ct.c | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c
-index 161c4fd715fa5..0c7f091d7d54d 100644
---- a/net/netfilter/nft_ct.c
-+++ b/net/netfilter/nft_ct.c
-@@ -1180,14 +1180,13 @@ static int nft_ct_expect_obj_init(const struct nft_ctx *ctx,
- switch (priv->l3num) {
- case NFPROTO_IPV4:
- case NFPROTO_IPV6:
-- if (priv->l3num != ctx->family)
-- return -EINVAL;
-+ if (priv->l3num == ctx->family || ctx->family == NFPROTO_INET)
-+ break;
-
-- fallthrough;
-- case NFPROTO_INET:
-- break;
-+ return -EINVAL;
-+ case NFPROTO_INET: /* tuple.src.l3num supports NFPROTO_IPV4/6 only */
- default:
-- return -EOPNOTSUPP;
-+ return -EAFNOSUPPORT;
- }
-
- priv->l4proto = nla_get_u8(tb[NFTA_CT_EXPECT_L4PROTO]);
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_default_.patch b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_default_.patch
deleted file mode 100644
index 069a94efcb..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_default_.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 7f2113aa581203dafa6a588ffffc35869fae08c4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:35 +0800
-Subject: netrom: Fix a data-race around sysctl_netrom_default_path_quality
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit 958d6145a6d9ba9e075c921aead8753fb91c9101 ]
-
-We need to protect the reader reading sysctl_netrom_default_path_quality
-because the value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/nr_route.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c
-index 89cd9de215948..b7be86d41d965 100644
---- a/net/netrom/nr_route.c
-+++ b/net/netrom/nr_route.c
-@@ -153,7 +153,7 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
- nr_neigh->digipeat = NULL;
- nr_neigh->ax25 = NULL;
- nr_neigh->dev = dev;
-- nr_neigh->quality = sysctl_netrom_default_path_quality;
-+ nr_neigh->quality = READ_ONCE(sysctl_netrom_default_path_quality);
- nr_neigh->locked = 0;
- nr_neigh->count = 0;
- nr_neigh->number = nr_neigh_no++;
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_link_fai.patch b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_link_fai.patch
deleted file mode 100644
index b4ab3b9271..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_link_fai.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 434c9c18dd4ee3082ed0b99f9655f609a9c2ce41 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:45 +0800
-Subject: netrom: Fix a data-race around sysctl_netrom_link_fails_count
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit bc76645ebdd01be9b9994dac39685a3d0f6f7985 ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/nr_route.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c
-index 4fb5959a7f070..37cfa880c2d05 100644
---- a/net/netrom/nr_route.c
-+++ b/net/netrom/nr_route.c
-@@ -725,7 +725,7 @@ void nr_link_failed(ax25_cb *ax25, int reason)
- nr_neigh->ax25 = NULL;
- ax25_cb_put(ax25);
-
-- if (++nr_neigh->failed < sysctl_netrom_link_fails_count) {
-+ if (++nr_neigh->failed < READ_ONCE(sysctl_netrom_link_fails_count)) {
- nr_neigh_put(nr_neigh);
- return;
- }
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_obsolesc.patch b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_obsolesc.patch
deleted file mode 100644
index 3392de8824..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_obsolesc.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 699c1e6c9b21681ea5bdbe5d60927c875dd960dd Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:36 +0800
-Subject: netrom: Fix a data-race around
- sysctl_netrom_obsolescence_count_initialiser
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit cfd9f4a740f772298308b2e6070d2c744fb5cf79 ]
-
-We need to protect the reader reading the sysctl value
-because the value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/nr_route.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c
-index b7be86d41d965..7859217249124 100644
---- a/net/netrom/nr_route.c
-+++ b/net/netrom/nr_route.c
-@@ -763,7 +763,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
- if (ax25 != NULL) {
- ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
- ax25->ax25_dev->dev, 0,
-- sysctl_netrom_obsolescence_count_initialiser);
-+ READ_ONCE(sysctl_netrom_obsolescence_count_initialiser));
- if (ret)
- return ret;
- }
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_routing_.patch b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_routing_.patch
deleted file mode 100644
index 2735f20379..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_routing_.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 63e301a8873f80fd039b97fdd1d84631d7d5d0c5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:44 +0800
-Subject: netrom: Fix a data-race around sysctl_netrom_routing_control
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit b5dffcb8f71bdd02a4e5799985b51b12f4eeaf76 ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/nr_route.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c
-index 7859217249124..4fb5959a7f070 100644
---- a/net/netrom/nr_route.c
-+++ b/net/netrom/nr_route.c
-@@ -777,7 +777,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
- return ret;
- }
-
-- if (!sysctl_netrom_routing_control && ax25 != NULL)
-+ if (!READ_ONCE(sysctl_netrom_routing_control) && ax25 != NULL)
- return 0;
-
- /* Its Time-To-Live has expired */
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch
deleted file mode 100644
index ecb88aa52f..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From b8de7e201007099a5307f95a20707b313ea82a4c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:38 +0800
-Subject: netrom: Fix a data-race around sysctl_netrom_transport_timeout
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit 60a7a152abd494ed4f69098cf0f322e6bb140612 ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index e18a73264c103..097f4f3b4929f 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -431,7 +431,7 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
- nr_init_timers(sk);
-
- nr->t1 =
-- msecs_to_jiffies(sysctl_netrom_transport_timeout);
-+ msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_timeout));
- nr->t2 =
- msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay);
- nr->n2 =
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-16607 b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-16607
deleted file mode 100644
index 7b6d1f4fb3..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-16607
+++ /dev/null
@@ -1,36 +0,0 @@
-From 48ce1283a167d82d49cc409e1c2e033656fa6933 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:39 +0800
-Subject: netrom: Fix a data-race around sysctl_netrom_transport_maximum_tries
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit e799299aafed417cc1f32adccb2a0e5268b3f6d5 ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index 097f4f3b4929f..d05d56cb9c660 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -435,7 +435,7 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
- nr->t2 =
- msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay);
- nr->n2 =
-- msecs_to_jiffies(sysctl_netrom_transport_maximum_tries);
-+ msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries));
- nr->t4 =
- msecs_to_jiffies(sysctl_netrom_transport_busy_delay);
- nr->idle =
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-21095 b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-21095
deleted file mode 100644
index 8cbd48754f..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-21095
+++ /dev/null
@@ -1,37 +0,0 @@
-From f7118e48ad36113e101e9ede1a7fbf4f394f9e2c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:40 +0800
-Subject: netrom: Fix a data-race around
- sysctl_netrom_transport_acknowledge_delay
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit 806f462ba9029d41aadf8ec93f2f99c5305deada ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index d05d56cb9c660..97a13de007e12 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -433,7 +433,7 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
- nr->t1 =
- msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_timeout));
- nr->t2 =
-- msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay);
-+ msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_acknowledge_delay));
- nr->n2 =
- msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries));
- nr->t4 =
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-24362 b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-24362
deleted file mode 100644
index 8a2ea8cde3..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-24362
+++ /dev/null
@@ -1,36 +0,0 @@
-From adfdcc58389b1e33076e77fbec21c85235664b95 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:41 +0800
-Subject: netrom: Fix a data-race around sysctl_netrom_transport_busy_delay
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit 43547d8699439a67b78d6bb39015113f7aa360fd ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index 97a13de007e12..d02db01edf2fd 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -437,7 +437,7 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
- nr->n2 =
- msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries));
- nr->t4 =
-- msecs_to_jiffies(sysctl_netrom_transport_busy_delay);
-+ msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay));
- nr->idle =
- msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout);
- nr->window = sysctl_netrom_transport_requested_window_size;
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-31728 b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-31728
deleted file mode 100644
index a7ec4d2946..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-31728
+++ /dev/null
@@ -1,37 +0,0 @@
-From 4e466e059a9bb0b5f83be4c3218dad05cc082702 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:43 +0800
-Subject: netrom: Fix a data-race around
- sysctl_netrom_transport_no_activity_timeout
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit f99b494b40431f0ca416859f2345746199398e2b ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index bf29260f6e52a..e25bb0fe6d13c 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -439,7 +439,7 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
- nr->t4 =
- msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay));
- nr->idle =
-- msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout);
-+ msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_no_activity_timeout));
- nr->window = READ_ONCE(sysctl_netrom_transport_requested_window_size);
-
- nr->bpqext = 1;
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-4080 b/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-4080
deleted file mode 100644
index 76dd772068..0000000000
--- a/queue-5.4/netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-4080
+++ /dev/null
@@ -1,37 +0,0 @@
-From f35ed10b48c20db956fdef478503a5a8b182f232 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:42 +0800
-Subject: netrom: Fix a data-race around
- sysctl_netrom_transport_requested_window_size
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit a2e706841488f474c06e9b33f71afc947fb3bf56 ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index d02db01edf2fd..bf29260f6e52a 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -440,7 +440,7 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
- msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay));
- nr->idle =
- msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout);
-- nr->window = sysctl_netrom_transport_requested_window_size;
-+ nr->window = READ_ONCE(sysctl_netrom_transport_requested_window_size);
-
- nr->bpqext = 1;
- nr->state = NR_STATE_0;
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-data-races-around-sysctl_net_busy_read.patch b/queue-5.4/netrom-fix-data-races-around-sysctl_net_busy_read.patch
deleted file mode 100644
index 9c6fa32b12..0000000000
--- a/queue-5.4/netrom-fix-data-races-around-sysctl_net_busy_read.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 7ad7355c5d36fdd9c2f4351f8bfae33cfc33a63a Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:46 +0800
-Subject: netrom: Fix data-races around sysctl_net_busy_read
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit d380ce70058a4ccddc3e5f5c2063165dc07672c6 ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/af_netrom.c | 2 +-
- net/netrom/nr_in.c | 6 +++---
- 2 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index e25bb0fe6d13c..abb69c149644a 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -932,7 +932,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
- * G8PZT's Xrouter which is sending packets with command type 7
- * as an extension of the protocol.
- */
-- if (sysctl_netrom_reset_circuit &&
-+ if (READ_ONCE(sysctl_netrom_reset_circuit) &&
- (frametype != NR_RESET || flags != 0))
- nr_transmit_reset(skb, 1);
-
-diff --git a/net/netrom/nr_in.c b/net/netrom/nr_in.c
-index 2bef3779f8935..8cbb57678a9ea 100644
---- a/net/netrom/nr_in.c
-+++ b/net/netrom/nr_in.c
-@@ -97,7 +97,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
- break;
-
- case NR_RESET:
-- if (sysctl_netrom_reset_circuit)
-+ if (READ_ONCE(sysctl_netrom_reset_circuit))
- nr_disconnect(sk, ECONNRESET);
- break;
-
-@@ -128,7 +128,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
- break;
-
- case NR_RESET:
-- if (sysctl_netrom_reset_circuit)
-+ if (READ_ONCE(sysctl_netrom_reset_circuit))
- nr_disconnect(sk, ECONNRESET);
- break;
-
-@@ -263,7 +263,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
- break;
-
- case NR_RESET:
-- if (sysctl_netrom_reset_circuit)
-+ if (READ_ONCE(sysctl_netrom_reset_circuit))
- nr_disconnect(sk, ECONNRESET);
- break;
-
---
-2.43.0
-
diff --git a/queue-5.4/netrom-fix-data-races-around-sysctl_netrom_network_t.patch b/queue-5.4/netrom-fix-data-races-around-sysctl_netrom_network_t.patch
deleted file mode 100644
index dc652795c0..0000000000
--- a/queue-5.4/netrom-fix-data-races-around-sysctl_netrom_network_t.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From f47b53fae30193aaf83e125e6313828d1be6fb28 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 16:20:37 +0800
-Subject: netrom: Fix data-races around sysctl_netrom_network_ttl_initialiser
-
-From: Jason Xing <kernelxing@tencent.com>
-
-[ Upstream commit 119cae5ea3f9e35cdada8e572cc067f072fa825a ]
-
-We need to protect the reader reading the sysctl value because the
-value can be changed concurrently.
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Jason Xing <kernelxing@tencent.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netrom/nr_dev.c | 2 +-
- net/netrom/nr_out.c | 2 +-
- net/netrom/nr_subr.c | 5 +++--
- 3 files changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c
-index 29e418c8c6c30..4caee8754b794 100644
---- a/net/netrom/nr_dev.c
-+++ b/net/netrom/nr_dev.c
-@@ -81,7 +81,7 @@ static int nr_header(struct sk_buff *skb, struct net_device *dev,
- buff[6] |= AX25_SSSID_SPARE;
- buff += AX25_ADDR_LEN;
-
-- *buff++ = sysctl_netrom_network_ttl_initialiser;
-+ *buff++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
-
- *buff++ = NR_PROTO_IP;
- *buff++ = NR_PROTO_IP;
-diff --git a/net/netrom/nr_out.c b/net/netrom/nr_out.c
-index 44929657f5b71..5e531394a724b 100644
---- a/net/netrom/nr_out.c
-+++ b/net/netrom/nr_out.c
-@@ -204,7 +204,7 @@ void nr_transmit_buffer(struct sock *sk, struct sk_buff *skb)
- dptr[6] |= AX25_SSSID_SPARE;
- dptr += AX25_ADDR_LEN;
-
-- *dptr++ = sysctl_netrom_network_ttl_initialiser;
-+ *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
-
- if (!nr_route_frame(skb, NULL)) {
- kfree_skb(skb);
-diff --git a/net/netrom/nr_subr.c b/net/netrom/nr_subr.c
-index e2d2af924cff4..c3bbd5880850b 100644
---- a/net/netrom/nr_subr.c
-+++ b/net/netrom/nr_subr.c
-@@ -182,7 +182,8 @@ void nr_write_internal(struct sock *sk, int frametype)
- *dptr++ = nr->my_id;
- *dptr++ = frametype;
- *dptr++ = nr->window;
-- if (nr->bpqext) *dptr++ = sysctl_netrom_network_ttl_initialiser;
-+ if (nr->bpqext)
-+ *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
- break;
-
- case NR_DISCREQ:
-@@ -236,7 +237,7 @@ void __nr_transmit_reply(struct sk_buff *skb, int mine, unsigned char cmdflags)
- dptr[6] |= AX25_SSSID_SPARE;
- dptr += AX25_ADDR_LEN;
-
-- *dptr++ = sysctl_netrom_network_ttl_initialiser;
-+ *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
-
- if (mine) {
- *dptr++ = 0;
---
-2.43.0
-
diff --git a/queue-5.4/regmap-add-bulk-read-write-callbacks-into-regmap_con.patch b/queue-5.4/regmap-add-bulk-read-write-callbacks-into-regmap_con.patch
deleted file mode 100644
index 47aae53ade..0000000000
--- a/queue-5.4/regmap-add-bulk-read-write-callbacks-into-regmap_con.patch
+++ /dev/null
@@ -1,300 +0,0 @@
-From 252006fc58a9519446186d9f0ef8b0b98e604b44 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 30 Apr 2022 04:51:44 +0200
-Subject: regmap: Add bulk read/write callbacks into regmap_config
-
-From: Marek Vasut <marex@denx.de>
-
-[ Upstream commit d77e745613680c54708470402e2b623dcd769681 ]
-
-Currently the regmap_config structure only allows the user to implement
-single element register read/write using .reg_read/.reg_write callbacks.
-The regmap_bus already implements bulk counterparts of both, and is being
-misused as a workaround for the missing bulk read/write callbacks in
-regmap_config by a couple of drivers. To stop this misuse, add the bulk
-read/write callbacks to regmap_config and call them from the regmap core
-code.
-
-Signed-off-by: Marek Vasut <marex@denx.de>
-Cc: Jagan Teki <jagan@amarulasolutions.com>
-Cc: Mark Brown <broonie@kernel.org>
-Cc: Maxime Ripard <maxime@cerno.tech>
-Cc: Robert Foss <robert.foss@linaro.org>
-Cc: Sam Ravnborg <sam@ravnborg.org>
-Cc: Thomas Zimmermann <tzimmermann@suse.de>
-To: dri-devel@lists.freedesktop.org
-Link: https://lore.kernel.org/r/20220430025145.640305-1-marex@denx.de
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in batched operations")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/base/regmap/internal.h | 4 ++
- drivers/base/regmap/regmap.c | 76 ++++++++++++++++++----------------
- include/linux/regmap.h | 12 ++++++
- 3 files changed, 56 insertions(+), 36 deletions(-)
-
-diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
-index d7c01b70e43db..af6ac068ca5d3 100644
---- a/drivers/base/regmap/internal.h
-+++ b/drivers/base/regmap/internal.h
-@@ -104,6 +104,10 @@ struct regmap {
- int (*reg_write)(void *context, unsigned int reg, unsigned int val);
- int (*reg_update_bits)(void *context, unsigned int reg,
- unsigned int mask, unsigned int val);
-+ /* Bulk read/write */
-+ int (*read)(void *context, const void *reg_buf, size_t reg_size,
-+ void *val_buf, size_t val_size);
-+ int (*write)(void *context, const void *data, size_t count);
-
- bool defer_caching;
-
-diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
-index 961b206f6ab2d..6f580883c1973 100644
---- a/drivers/base/regmap/regmap.c
-+++ b/drivers/base/regmap/regmap.c
-@@ -771,12 +771,15 @@ struct regmap *__regmap_init(struct device *dev,
- map->reg_stride_order = ilog2(map->reg_stride);
- else
- map->reg_stride_order = -1;
-- map->use_single_read = config->use_single_read || !bus || !bus->read;
-- map->use_single_write = config->use_single_write || !bus || !bus->write;
-- map->can_multi_write = config->can_multi_write && bus && bus->write;
-+ map->use_single_read = config->use_single_read || !(config->read || (bus && bus->read));
-+ map->use_single_write = config->use_single_write || !(config->write || (bus && bus->write));
-+ map->can_multi_write = config->can_multi_write && (config->write || (bus && bus->write));
- if (bus) {
- map->max_raw_read = bus->max_raw_read;
- map->max_raw_write = bus->max_raw_write;
-+ } else if (config->max_raw_read && config->max_raw_write) {
-+ map->max_raw_read = config->max_raw_read;
-+ map->max_raw_write = config->max_raw_write;
- }
- map->dev = dev;
- map->bus = bus;
-@@ -810,7 +813,16 @@ struct regmap *__regmap_init(struct device *dev,
- map->read_flag_mask = bus->read_flag_mask;
- }
-
-- if (!bus) {
-+ if (config && config->read && config->write) {
-+ map->reg_read = _regmap_bus_read;
-+
-+ /* Bulk read/write */
-+ map->read = config->read;
-+ map->write = config->write;
-+
-+ reg_endian = REGMAP_ENDIAN_NATIVE;
-+ val_endian = REGMAP_ENDIAN_NATIVE;
-+ } else if (!bus) {
- map->reg_read = config->reg_read;
- map->reg_write = config->reg_write;
- map->reg_update_bits = config->reg_update_bits;
-@@ -826,10 +838,13 @@ struct regmap *__regmap_init(struct device *dev,
- } else {
- map->reg_read = _regmap_bus_read;
- map->reg_update_bits = bus->reg_update_bits;
-- }
-+ /* Bulk read/write */
-+ map->read = bus->read;
-+ map->write = bus->write;
-
-- reg_endian = regmap_get_reg_endian(bus, config);
-- val_endian = regmap_get_val_endian(dev, bus, config);
-+ reg_endian = regmap_get_reg_endian(bus, config);
-+ val_endian = regmap_get_val_endian(dev, bus, config);
-+ }
-
- switch (config->reg_bits + map->reg_shift) {
- case 2:
-@@ -1480,8 +1495,6 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
- size_t len;
- int i;
-
-- WARN_ON(!map->bus);
--
- /* Check for unwritable or noinc registers in range
- * before we start
- */
-@@ -1563,7 +1576,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
- val = work_val;
- }
-
-- if (map->async && map->bus->async_write) {
-+ if (map->async && map->bus && map->bus->async_write) {
- struct regmap_async *async;
-
- trace_regmap_async_write_start(map, reg, val_len);
-@@ -1631,10 +1644,10 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
- * write.
- */
- if (val == work_val)
-- ret = map->bus->write(map->bus_context, map->work_buf,
-- map->format.reg_bytes +
-- map->format.pad_bytes +
-- val_len);
-+ ret = map->write(map->bus_context, map->work_buf,
-+ map->format.reg_bytes +
-+ map->format.pad_bytes +
-+ val_len);
- else if (map->bus->gather_write)
- ret = map->bus->gather_write(map->bus_context, map->work_buf,
- map->format.reg_bytes +
-@@ -1653,7 +1666,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
- memcpy(buf, map->work_buf, map->format.reg_bytes);
- memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
- val, val_len);
-- ret = map->bus->write(map->bus_context, buf, len);
-+ ret = map->write(map->bus_context, buf, len);
-
- kfree(buf);
- } else if (ret != 0 && !map->cache_bypass && map->format.parse_val) {
-@@ -1710,7 +1723,7 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
- struct regmap_range_node *range;
- struct regmap *map = context;
-
-- WARN_ON(!map->bus || !map->format.format_write);
-+ WARN_ON(!map->format.format_write);
-
- range = _regmap_range_lookup(map, reg);
- if (range) {
-@@ -1723,8 +1736,7 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
-
- trace_regmap_hw_write_start(map, reg, 1);
-
-- ret = map->bus->write(map->bus_context, map->work_buf,
-- map->format.buf_size);
-+ ret = map->write(map->bus_context, map->work_buf, map->format.buf_size);
-
- trace_regmap_hw_write_done(map, reg, 1);
-
-@@ -1744,7 +1756,7 @@ static int _regmap_bus_raw_write(void *context, unsigned int reg,
- {
- struct regmap *map = context;
-
-- WARN_ON(!map->bus || !map->format.format_val);
-+ WARN_ON(!map->format.format_val);
-
- map->format.format_val(map->work_buf + map->format.reg_bytes
- + map->format.pad_bytes, val, 0);
-@@ -1758,7 +1770,7 @@ static int _regmap_bus_raw_write(void *context, unsigned int reg,
-
- static inline void *_regmap_map_get_context(struct regmap *map)
- {
-- return (map->bus) ? map : map->bus_context;
-+ return (map->bus || (!map->bus && map->read)) ? map : map->bus_context;
- }
-
- int _regmap_write(struct regmap *map, unsigned int reg,
-@@ -2167,7 +2179,7 @@ static int _regmap_raw_multi_reg_write(struct regmap *map,
- u8 = buf;
- *u8 |= map->write_flag_mask;
-
-- ret = map->bus->write(map->bus_context, buf, len);
-+ ret = map->write(map->bus_context, buf, len);
-
- kfree(buf);
-
-@@ -2465,9 +2477,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
- struct regmap_range_node *range;
- int ret;
-
-- WARN_ON(!map->bus);
--
-- if (!map->bus || !map->bus->read)
-+ if (!map->read)
- return -EINVAL;
-
- range = _regmap_range_lookup(map, reg);
-@@ -2483,9 +2493,9 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
- map->read_flag_mask);
- trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes);
-
-- ret = map->bus->read(map->bus_context, map->work_buf,
-- map->format.reg_bytes + map->format.pad_bytes,
-- val, val_len);
-+ ret = map->read(map->bus_context, map->work_buf,
-+ map->format.reg_bytes + map->format.pad_bytes,
-+ val, val_len);
-
- trace_regmap_hw_read_done(map, reg, val_len / map->format.val_bytes);
-
-@@ -2596,8 +2606,6 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
- unsigned int v;
- int ret, i;
-
-- if (!map->bus)
-- return -EINVAL;
- if (val_len % map->format.val_bytes)
- return -EINVAL;
- if (!IS_ALIGNED(reg, map->reg_stride))
-@@ -2612,7 +2620,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
- size_t chunk_count, chunk_bytes;
- size_t chunk_regs = val_count;
-
-- if (!map->bus->read) {
-+ if (!map->read) {
- ret = -ENOTSUPP;
- goto out;
- }
-@@ -2672,7 +2680,7 @@ EXPORT_SYMBOL_GPL(regmap_raw_read);
- * @val: Pointer to data buffer
- * @val_len: Length of output buffer in bytes.
- *
-- * The regmap API usually assumes that bulk bus read operations will read a
-+ * The regmap API usually assumes that bulk read operations will read a
- * range of registers. Some devices have certain registers for which a read
- * operation read will read from an internal FIFO.
- *
-@@ -2690,10 +2698,6 @@ int regmap_noinc_read(struct regmap *map, unsigned int reg,
- size_t read_len;
- int ret;
-
-- if (!map->bus)
-- return -EINVAL;
-- if (!map->bus->read)
-- return -ENOTSUPP;
- if (val_len % map->format.val_bytes)
- return -EINVAL;
- if (!IS_ALIGNED(reg, map->reg_stride))
-@@ -2807,7 +2811,7 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
- if (val_count == 0)
- return -EINVAL;
-
-- if (map->bus && map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) {
-+ if (map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) {
- ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
- if (ret != 0)
- return ret;
-diff --git a/include/linux/regmap.h b/include/linux/regmap.h
-index 29661bbd137d7..edc095434787b 100644
---- a/include/linux/regmap.h
-+++ b/include/linux/regmap.h
-@@ -300,6 +300,12 @@ typedef void (*regmap_unlock)(void *);
- * if the function require special handling with lock and reg
- * handling and the operation cannot be represented as a simple
- * update_bits operation on a bus such as SPI, I2C, etc.
-+ * @read: Optional callback that if filled will be used to perform all the
-+ * bulk reads from the registers. Data is returned in the buffer used
-+ * to transmit data.
-+ * @write: Same as above for writing.
-+ * @max_raw_read: Max raw read size that can be used on the device.
-+ * @max_raw_write: Max raw write size that can be used on the device.
- * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
- * to perform locking. This field is ignored if custom lock/unlock
- * functions are used (see fields lock/unlock of struct regmap_config).
-@@ -378,6 +384,12 @@ struct regmap_config {
- int (*reg_write)(void *context, unsigned int reg, unsigned int val);
- int (*reg_update_bits)(void *context, unsigned int reg,
- unsigned int mask, unsigned int val);
-+ /* Bulk read/write */
-+ int (*read)(void *context, const void *reg_buf, size_t reg_size,
-+ void *val_buf, size_t val_size);
-+ int (*write)(void *context, const void *data, size_t count);
-+ size_t max_raw_read;
-+ size_t max_raw_write;
-
- bool fast_io;
-
---
-2.43.0
-
diff --git a/queue-5.4/regmap-allow-to-define-reg_update_bits-for-no-bus-co.patch b/queue-5.4/regmap-allow-to-define-reg_update_bits-for-no-bus-co.patch
deleted file mode 100644
index b65b424c67..0000000000
--- a/queue-5.4/regmap-allow-to-define-reg_update_bits-for-no-bus-co.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 12a1eb8fcdfa672b3d3c13044754643d8986cf66 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 4 Nov 2021 16:00:40 +0100
-Subject: regmap: allow to define reg_update_bits for no bus configuration
-
-From: Ansuel Smith <ansuelsmth@gmail.com>
-
-[ Upstream commit 02d6fdecb9c38de19065f6bed8d5214556fd061d ]
-
-Some device requires a special handling for reg_update_bits and can't use
-the normal regmap read write logic. An example is when locking is
-handled by the device and rmw operations requires to do atomic operations.
-Allow to declare a dedicated function in regmap_config for
-reg_update_bits in no bus configuration.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
-Link: https://lore.kernel.org/r/20211104150040.1260-1-ansuelsmth@gmail.com
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in batched operations")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/base/regmap/regmap.c | 1 +
- include/linux/regmap.h | 7 +++++++
- 2 files changed, 8 insertions(+)
-
-diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
-index 23574c328616f..961b206f6ab2d 100644
---- a/drivers/base/regmap/regmap.c
-+++ b/drivers/base/regmap/regmap.c
-@@ -813,6 +813,7 @@ struct regmap *__regmap_init(struct device *dev,
- if (!bus) {
- map->reg_read = config->reg_read;
- map->reg_write = config->reg_write;
-+ map->reg_update_bits = config->reg_update_bits;
-
- map->defer_caching = false;
- goto skip_format_initialization;
-diff --git a/include/linux/regmap.h b/include/linux/regmap.h
-index dfe493ac692d2..29661bbd137d7 100644
---- a/include/linux/regmap.h
-+++ b/include/linux/regmap.h
-@@ -295,6 +295,11 @@ typedef void (*regmap_unlock)(void *);
- * read operation on a bus such as SPI, I2C, etc. Most of the
- * devices do not need this.
- * @reg_write: Same as above for writing.
-+ * @reg_update_bits: Optional callback that if filled will be used to perform
-+ * all the update_bits(rmw) operation. Should only be provided
-+ * if the function require special handling with lock and reg
-+ * handling and the operation cannot be represented as a simple
-+ * update_bits operation on a bus such as SPI, I2C, etc.
- * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
- * to perform locking. This field is ignored if custom lock/unlock
- * functions are used (see fields lock/unlock of struct regmap_config).
-@@ -371,6 +376,8 @@ struct regmap_config {
-
- int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
- int (*reg_write)(void *context, unsigned int reg, unsigned int val);
-+ int (*reg_update_bits)(void *context, unsigned int reg,
-+ unsigned int mask, unsigned int val);
-
- bool fast_io;
-
---
-2.43.0
-
diff --git a/queue-5.4/selftests-mm-fix-map_hugetlb-failure-on-64k-page-siz.patch b/queue-5.4/selftests-mm-fix-map_hugetlb-failure-on-64k-page-siz.patch
deleted file mode 100644
index 3e02ca4f3c..0000000000
--- a/queue-5.4/selftests-mm-fix-map_hugetlb-failure-on-64k-page-siz.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From f3f9371cf2f034ed30820fe6668cdea470858ed1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 19 Jan 2024 06:14:29 -0700
-Subject: selftests: mm: fix map_hugetlb failure on 64K page size systems
-
-From: Nico Pache <npache@redhat.com>
-
-[ Upstream commit 91b80cc5b39f00399e8e2d17527cad2c7fa535e2 ]
-
-On systems with 64k page size and 512M huge page sizes, the allocation and
-test succeeds but errors out at the munmap. As the comment states, munmap
-will failure if its not HUGEPAGE aligned. This is due to the length of
-the mapping being 1/2 the size of the hugepage causing the munmap to not
-be hugepage aligned. Fix this by making the mapping length the full
-hugepage if the hugepage is larger than the length of the mapping.
-
-Link: https://lkml.kernel.org/r/20240119131429.172448-1-npache@redhat.com
-Signed-off-by: Nico Pache <npache@redhat.com>
-Cc: Donet Tom <donettom@linux.vnet.ibm.com>
-Cc: Shuah Khan <shuah@kernel.org>
-Cc: Christophe Leroy <christophe.leroy@c-s.fr>
-Cc: Michael Ellerman <mpe@ellerman.id.au>
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- tools/testing/selftests/vm/map_hugetlb.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/tools/testing/selftests/vm/map_hugetlb.c b/tools/testing/selftests/vm/map_hugetlb.c
-index 312889edb84ab..c65c55b7a789f 100644
---- a/tools/testing/selftests/vm/map_hugetlb.c
-+++ b/tools/testing/selftests/vm/map_hugetlb.c
-@@ -15,6 +15,7 @@
- #include <unistd.h>
- #include <sys/mman.h>
- #include <fcntl.h>
-+#include "vm_util.h"
-
- #define LENGTH (256UL*1024*1024)
- #define PROTECTION (PROT_READ | PROT_WRITE)
-@@ -70,10 +71,16 @@ int main(int argc, char **argv)
- {
- void *addr;
- int ret;
-+ size_t hugepage_size;
- size_t length = LENGTH;
- int flags = FLAGS;
- int shift = 0;
-
-+ hugepage_size = default_huge_page_size();
-+ /* munmap with fail if the length is not page aligned */
-+ if (hugepage_size > length)
-+ length = hugepage_size;
-+
- if (argc > 1)
- length = atol(argv[1]) << 20;
- if (argc > 2) {
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-fail-probe-if-clock-crystal-is-unstab.patch b/queue-5.4/serial-max310x-fail-probe-if-clock-crystal-is-unstab.patch
deleted file mode 100644
index 26c580dfa3..0000000000
--- a/queue-5.4/serial-max310x-fail-probe-if-clock-crystal-is-unstab.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From e542be1e38a3d629ccc7dbc1322a7e59df70f243 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 16 Jan 2024 16:30:00 -0500
-Subject: serial: max310x: fail probe if clock crystal is unstable
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
-
-[ Upstream commit 8afa6c6decea37e7cb473d2c60473f37f46cea35 ]
-
-A stable clock is really required in order to use this UART, so log an
-error message and bail out if the chip reports that the clock is not
-stable.
-
-Fixes: 4cf9a888fd3c ("serial: max310x: Check the clock readiness")
-Cc: stable@vger.kernel.org
-Suggested-by: Jan Kundrát <jan.kundrat@cesnet.cz>
-Link: https://www.spinics.net/lists/linux-serial/msg35773.html
-Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
-Link: https://lore.kernel.org/r/20240116213001.3691629-4-hugo@hugovil.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 12 +++++++++---
- 1 file changed, 9 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 0e0f778d75cd4..bbf45c0626681 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -556,7 +556,7 @@ static int max310x_update_best_err(unsigned long f, long *besterr)
- return 1;
- }
-
--static u32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
-+static s32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
- unsigned long freq, bool xtal)
- {
- unsigned int div, clksrc, pllcfg = 0;
-@@ -626,7 +626,8 @@ static u32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
- } while (!stable && (++try < MAX310X_XTAL_WAIT_RETRIES));
-
- if (!stable)
-- dev_warn(dev, "clock is not stable yet\n");
-+ return dev_err_probe(dev, -EAGAIN,
-+ "clock is not stable\n");
- }
-
- return bestfreq;
-@@ -1266,7 +1267,7 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- {
- int i, ret, fmin, fmax, freq;
- struct max310x_port *s;
-- u32 uartclk = 0;
-+ s32 uartclk = 0;
- bool xtal;
-
- if (IS_ERR(regmap))
-@@ -1350,6 +1351,11 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- }
-
- uartclk = max310x_set_ref_clk(dev, s, freq, xtal);
-+ if (uartclk < 0) {
-+ ret = uartclk;
-+ goto out_uart;
-+ }
-+
- dev_dbg(dev, "Reference clock set to %i Hz\n", uartclk);
-
- for (i = 0; i < devtype->nr; i++) {
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-fix-io-data-corruption-in-batched-ope.patch b/queue-5.4/serial-max310x-fix-io-data-corruption-in-batched-ope.patch
deleted file mode 100644
index 5a90acb6a6..0000000000
--- a/queue-5.4/serial-max310x-fix-io-data-corruption-in-batched-ope.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-From d7faa29817ea3f45b730da93db62aab57b9e9f4b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 5 Apr 2023 22:14:23 +0200
-Subject: serial: max310x: fix IO data corruption in batched operations
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Jan Kundrát <jan.kundrat@cesnet.cz>
-
-[ Upstream commit 3f42b142ea1171967e40e10e4b0241c0d6d28d41 ]
-
-After upgrading from 5.16 to 6.1, our board with a MAX14830 started
-producing lots of garbage data over UART. Bisection pointed out commit
-285e76fc049c as the culprit. That patch tried to replace hand-written
-code which I added in 2b4bac48c1084 ("serial: max310x: Use batched reads
-when reasonably safe") with the generic regmap infrastructure for
-batched operations.
-
-Unfortunately, the `regmap_raw_read` and `regmap_raw_write` which were
-used are actually functions which perform IO over *multiple* registers.
-That's not what is needed for accessing these Tx/Rx FIFOs; the
-appropriate functions are the `_noinc_` versions, not the `_raw_` ones.
-
-Fix this regression by using `regmap_noinc_read()` and
-`regmap_noinc_write()` along with the necessary `regmap_config` setup;
-with this patch in place, our board communicates happily again. Since
-our board uses SPI for talking to this chip, the I2C part is completely
-untested.
-
-Fixes: 285e76fc049c ("serial: max310x: use regmap methods for SPI batch operations")
-Cc: stable@vger.kernel.org
-Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
-Link: https://lore.kernel.org/r/79db8e82aadb0e174bc82b9996423c3503c8fb37.1680732084.git.jan.kundrat@cesnet.cz
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 17 +++++++++++++++--
- 1 file changed, 15 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index ed1aaa19854fd..2f88eae8a55a1 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -533,6 +533,11 @@ static bool max310x_reg_precious(struct device *dev, unsigned int reg)
- return false;
- }
-
-+static bool max310x_reg_noinc(struct device *dev, unsigned int reg)
-+{
-+ return reg == MAX310X_RHR_REG;
-+}
-+
- static int max310x_set_baud(struct uart_port *port, int baud)
- {
- unsigned int mode = 0, div = 0, frac = 0, c = 0, F = 0;
-@@ -667,14 +672,14 @@ static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigned int
- {
- struct max310x_one *one = to_max310x_port(port);
-
-- regmap_raw_write(one->regmap, MAX310X_THR_REG, txbuf, len);
-+ regmap_noinc_write(one->regmap, MAX310X_THR_REG, txbuf, len);
- }
-
- static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned int len)
- {
- struct max310x_one *one = to_max310x_port(port);
-
-- regmap_raw_read(one->regmap, MAX310X_RHR_REG, rxbuf, len);
-+ regmap_noinc_read(one->regmap, MAX310X_RHR_REG, rxbuf, len);
- }
-
- static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen)
-@@ -1508,6 +1513,10 @@ static struct regmap_config regcfg = {
- .writeable_reg = max310x_reg_writeable,
- .volatile_reg = max310x_reg_volatile,
- .precious_reg = max310x_reg_precious,
-+ .writeable_noinc_reg = max310x_reg_noinc,
-+ .readable_noinc_reg = max310x_reg_noinc,
-+ .max_raw_read = MAX310X_FIFO_SIZE,
-+ .max_raw_write = MAX310X_FIFO_SIZE,
- };
-
- #ifdef CONFIG_SPI_MASTER
-@@ -1593,6 +1602,10 @@ static struct regmap_config regcfg_i2c = {
- .volatile_reg = max310x_reg_volatile,
- .precious_reg = max310x_reg_precious,
- .max_register = MAX310X_I2C_REVID_EXTREG,
-+ .writeable_noinc_reg = max310x_reg_noinc,
-+ .readable_noinc_reg = max310x_reg_noinc,
-+ .max_raw_read = MAX310X_FIFO_SIZE,
-+ .max_raw_write = MAX310X_FIFO_SIZE,
- };
-
- static const struct max310x_if_cfg max310x_i2c_if_cfg = {
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-implement-i2c-support.patch b/queue-5.4/serial-max310x-implement-i2c-support.patch
deleted file mode 100644
index 602d5ef555..0000000000
--- a/queue-5.4/serial-max310x-implement-i2c-support.patch
+++ /dev/null
@@ -1,270 +0,0 @@
-From ce44f6e98f89dcb367521cd8df8d1f42847ed7e9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 5 Jun 2022 17:46:59 +0300
-Subject: serial: max310x: implement I2C support
-
-From: Cosmin Tanislav <cosmin.tanislav@analog.com>
-
-[ Upstream commit 2e1f2d9a9bdbe12ee475c82a45ac46a278e8049a ]
-
-I2C implementation on this chip has a few key differences
-compared to SPI, as described in previous patches.
- * extended register space access needs no extra logic
- * slave address is used to select which UART to communicate
- with
-
-To accommodate these differences, add an I2C interface config,
-set the RevID register address and implement an empty method
-for setting the GlobalCommand register, since no special handling
-is needed for the extended register space.
-
-To handle the port-specific slave address, create an I2C dummy
-device for each port, except the base one (UART0), which is
-expected to be the one specified in firmware, and create a
-regmap for each I2C device.
-Add minimum and maximum slave addresses to each devtype for
-sanity checking.
-
-Also, use a separate regmap config with no write_flag_mask,
-since I2C has a R/W bit in its slave address, and set the
-max register to the address of the RevID register, since the
-extended register space needs no extra logic.
-
-Finally, add the I2C driver.
-
-Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Signed-off-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
-Link: https://lore.kernel.org/r/20220605144659.4169853-5-demonsingur@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in batched operations")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/Kconfig | 1 +
- drivers/tty/serial/max310x.c | 135 ++++++++++++++++++++++++++++++++++-
- 2 files changed, 135 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
-index a9751a83d5dbb..def45baec28f8 100644
---- a/drivers/tty/serial/Kconfig
-+++ b/drivers/tty/serial/Kconfig
-@@ -354,6 +354,7 @@ config SERIAL_MAX310X
- depends on SPI_MASTER
- select SERIAL_CORE
- select REGMAP_SPI if SPI_MASTER
-+ select REGMAP_I2C if I2C
- help
- This selects support for an advanced UART from Maxim (Dallas).
- Supported ICs are MAX3107, MAX3108, MAX3109, MAX14830.
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index b90281ac54c85..ed1aaa19854fd 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -14,6 +14,7 @@
- #include <linux/delay.h>
- #include <linux/device.h>
- #include <linux/gpio/driver.h>
-+#include <linux/i2c.h>
- #include <linux/module.h>
- #include <linux/mod_devicetable.h>
- #include <linux/property.h>
-@@ -73,6 +74,7 @@
-
- /* Extended registers */
- #define MAX310X_SPI_REVID_EXTREG MAX310X_REG_05 /* Revision ID */
-+#define MAX310X_I2C_REVID_EXTREG (0x25) /* Revision ID */
-
- /* IRQ register bits */
- #define MAX310X_IRQ_LSR_BIT (1 << 0) /* LSR interrupt */
-@@ -260,6 +262,10 @@ struct max310x_if_cfg {
- };
-
- struct max310x_devtype {
-+ struct {
-+ unsigned short min;
-+ unsigned short max;
-+ } slave_addr;
- char name[9];
- int nr;
- u8 mode1;
-@@ -431,6 +437,10 @@ static const struct max310x_devtype max3107_devtype = {
- .mode1 = MAX310X_MODE1_AUTOSLEEP_BIT | MAX310X_MODE1_IRQSEL_BIT,
- .detect = max3107_detect,
- .power = max310x_power,
-+ .slave_addr = {
-+ .min = 0x2c,
-+ .max = 0x2f,
-+ },
- };
-
- static const struct max310x_devtype max3108_devtype = {
-@@ -439,6 +449,10 @@ static const struct max310x_devtype max3108_devtype = {
- .mode1 = MAX310X_MODE1_AUTOSLEEP_BIT,
- .detect = max3108_detect,
- .power = max310x_power,
-+ .slave_addr = {
-+ .min = 0x60,
-+ .max = 0x6f,
-+ },
- };
-
- static const struct max310x_devtype max3109_devtype = {
-@@ -447,6 +461,10 @@ static const struct max310x_devtype max3109_devtype = {
- .mode1 = MAX310X_MODE1_AUTOSLEEP_BIT,
- .detect = max3109_detect,
- .power = max310x_power,
-+ .slave_addr = {
-+ .min = 0x60,
-+ .max = 0x6f,
-+ },
- };
-
- static const struct max310x_devtype max14830_devtype = {
-@@ -455,6 +473,10 @@ static const struct max310x_devtype max14830_devtype = {
- .mode1 = MAX310X_MODE1_IRQSEL_BIT,
- .detect = max14830_detect,
- .power = max14830_power,
-+ .slave_addr = {
-+ .min = 0x60,
-+ .max = 0x6f,
-+ },
- };
-
- static bool max310x_reg_writeable(struct device *dev, unsigned int reg)
-@@ -1557,6 +1579,97 @@ static struct spi_driver max310x_spi_driver = {
- };
- #endif
-
-+#ifdef CONFIG_I2C
-+static int max310x_i2c_extended_reg_enable(struct device *dev, bool enable)
-+{
-+ return 0;
-+}
-+
-+static struct regmap_config regcfg_i2c = {
-+ .reg_bits = 8,
-+ .val_bits = 8,
-+ .cache_type = REGCACHE_RBTREE,
-+ .writeable_reg = max310x_reg_writeable,
-+ .volatile_reg = max310x_reg_volatile,
-+ .precious_reg = max310x_reg_precious,
-+ .max_register = MAX310X_I2C_REVID_EXTREG,
-+};
-+
-+static const struct max310x_if_cfg max310x_i2c_if_cfg = {
-+ .extended_reg_enable = max310x_i2c_extended_reg_enable,
-+ .rev_id_reg = MAX310X_I2C_REVID_EXTREG,
-+};
-+
-+static unsigned short max310x_i2c_slave_addr(unsigned short addr,
-+ unsigned int nr)
-+{
-+ /*
-+ * For MAX14830 and MAX3109, the slave address depends on what the
-+ * A0 and A1 pins are tied to.
-+ * See Table I2C Address Map of the datasheet.
-+ * Based on that table, the following formulas were determined.
-+ * UART1 - UART0 = 0x10
-+ * UART2 - UART1 = 0x20 + 0x10
-+ * UART3 - UART2 = 0x10
-+ */
-+
-+ addr -= nr * 0x10;
-+
-+ if (nr >= 2)
-+ addr -= 0x20;
-+
-+ return addr;
-+}
-+
-+static int max310x_i2c_probe(struct i2c_client *client)
-+{
-+ const struct max310x_devtype *devtype =
-+ device_get_match_data(&client->dev);
-+ struct i2c_client *port_client;
-+ struct regmap *regmaps[4];
-+ unsigned int i;
-+ u8 port_addr;
-+
-+ if (client->addr < devtype->slave_addr.min ||
-+ client->addr > devtype->slave_addr.max)
-+ return dev_err_probe(&client->dev, -EINVAL,
-+ "Slave addr 0x%x outside of range [0x%x, 0x%x]\n",
-+ client->addr, devtype->slave_addr.min,
-+ devtype->slave_addr.max);
-+
-+ regmaps[0] = devm_regmap_init_i2c(client, &regcfg_i2c);
-+
-+ for (i = 1; i < devtype->nr; i++) {
-+ port_addr = max310x_i2c_slave_addr(client->addr, i);
-+ port_client = devm_i2c_new_dummy_device(&client->dev,
-+ client->adapter,
-+ port_addr);
-+
-+ regmaps[i] = devm_regmap_init_i2c(port_client, &regcfg_i2c);
-+ }
-+
-+ return max310x_probe(&client->dev, devtype, &max310x_i2c_if_cfg,
-+ regmaps, client->irq);
-+}
-+
-+static int max310x_i2c_remove(struct i2c_client *client)
-+{
-+ max310x_remove(&client->dev);
-+
-+ return 0;
-+}
-+
-+static struct i2c_driver max310x_i2c_driver = {
-+ .driver = {
-+ .name = MAX310X_NAME,
-+ .of_match_table = max310x_dt_ids,
-+ .pm = &max310x_pm_ops,
-+ },
-+ .probe_new = max310x_i2c_probe,
-+ .remove = max310x_i2c_remove,
-+};
-+#endif
-+
- static int __init max310x_uart_init(void)
- {
- int ret;
-@@ -1570,15 +1683,35 @@ static int __init max310x_uart_init(void)
- #ifdef CONFIG_SPI_MASTER
- ret = spi_register_driver(&max310x_spi_driver);
- if (ret)
-- uart_unregister_driver(&max310x_uart);
-+ goto err_spi_register;
-+#endif
-+
-+#ifdef CONFIG_I2C
-+ ret = i2c_add_driver(&max310x_i2c_driver);
-+ if (ret)
-+ goto err_i2c_register;
- #endif
-
-+ return 0;
-+
-+#ifdef CONFIG_I2C
-+err_i2c_register:
-+ spi_unregister_driver(&max310x_spi_driver);
-+#endif
-+
-+err_spi_register:
-+ uart_unregister_driver(&max310x_uart);
-+
- return ret;
- }
- module_init(max310x_uart_init);
-
- static void __exit max310x_uart_exit(void)
- {
-+#ifdef CONFIG_I2C
-+ i2c_del_driver(&max310x_i2c_driver);
-+#endif
-+
- #ifdef CONFIG_SPI_MASTER
- spi_unregister_driver(&max310x_spi_driver);
- #endif
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-make-accessing-revision-id-interface-.patch b/queue-5.4/serial-max310x-make-accessing-revision-id-interface-.patch
deleted file mode 100644
index 8218082611..0000000000
--- a/queue-5.4/serial-max310x-make-accessing-revision-id-interface-.patch
+++ /dev/null
@@ -1,157 +0,0 @@
-From f628946031c9456db1a1d2f4df172ce9e7486ce1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 5 Jun 2022 17:46:58 +0300
-Subject: serial: max310x: make accessing revision id interface-agnostic
-
-From: Cosmin Tanislav <cosmin.tanislav@analog.com>
-
-[ Upstream commit b3883ab5e95713e479f774ea68be275413e8e5b2 ]
-
-SPI can only use 5 address bits, since one bit is reserved for
-specifying R/W and 2 bits are used to specify the UART port.
-To access registers that have addresses past 0x1F, an extended
-register space can be enabled by writing to the GlobalCommand
-register (address 0x1F).
-
-I2C uses 8 address bits. The R/W bit is placed in the slave
-address, and so is the UART port. Because of this, registers
-that have addresses higher than 0x1F can be accessed normally.
-
-To access the RevID register, on SPI, 0xCE must be written to
-the 0x1F address to enable the extended register space, after
-which the RevID register is accessible at address 0x5. 0xCD
-must be written to the 0x1F address to disable the extended
-register space.
-
-On I2C, the RevID register is accessible at address 0x25.
-
-Create an interface config struct, and add a method for
-toggling the extended register space and a member for the RevId
-register address. Implement these for SPI.
-
-Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Signed-off-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
-Link: https://lore.kernel.org/r/20220605144659.4169853-4-demonsingur@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in batched operations")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 40 +++++++++++++++++++++++++++---------
- 1 file changed, 30 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index a09ec46e0310d..b90281ac54c85 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -72,7 +72,7 @@
- #define MAX310X_GLOBALCMD_REG MAX310X_REG_1F /* Global Command (WO) */
-
- /* Extended registers */
--#define MAX310X_REVID_EXTREG MAX310X_REG_05 /* Revision ID */
-+#define MAX310X_SPI_REVID_EXTREG MAX310X_REG_05 /* Revision ID */
-
- /* IRQ register bits */
- #define MAX310X_IRQ_LSR_BIT (1 << 0) /* LSR interrupt */
-@@ -253,6 +253,12 @@
- #define MAX14830_BRGCFG_CLKDIS_BIT (1 << 6) /* Clock Disable */
- #define MAX14830_REV_ID (0xb0)
-
-+struct max310x_if_cfg {
-+ int (*extended_reg_enable)(struct device *dev, bool enable);
-+
-+ unsigned int rev_id_reg;
-+};
-+
- struct max310x_devtype {
- char name[9];
- int nr;
-@@ -275,6 +281,7 @@ struct max310x_one {
-
- struct max310x_port {
- const struct max310x_devtype *devtype;
-+ const struct max310x_if_cfg *if_cfg;
- struct regmap *regmap;
- struct clk *clk;
- #ifdef CONFIG_GPIOLIB
-@@ -364,13 +371,12 @@ static int max3109_detect(struct device *dev)
- unsigned int val = 0;
- int ret;
-
-- ret = regmap_write(s->regmap, MAX310X_GLOBALCMD_REG,
-- MAX310X_EXTREG_ENBL);
-+ ret = s->if_cfg->extended_reg_enable(dev, true);
- if (ret)
- return ret;
-
-- regmap_read(s->regmap, MAX310X_REVID_EXTREG, &val);
-- regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, MAX310X_EXTREG_DSBL);
-+ regmap_read(s->regmap, s->if_cfg->rev_id_reg, &val);
-+ s->if_cfg->extended_reg_enable(dev, false);
- if (((val & MAX310x_REV_MASK) != MAX3109_REV_ID)) {
- dev_err(dev,
- "%s ID 0x%02x does not match\n", s->devtype->name, val);
-@@ -395,13 +401,12 @@ static int max14830_detect(struct device *dev)
- unsigned int val = 0;
- int ret;
-
-- ret = regmap_write(s->regmap, MAX310X_GLOBALCMD_REG,
-- MAX310X_EXTREG_ENBL);
-+ ret = s->if_cfg->extended_reg_enable(dev, true);
- if (ret)
- return ret;
-
-- regmap_read(s->regmap, MAX310X_REVID_EXTREG, &val);
-- regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, MAX310X_EXTREG_DSBL);
-+ regmap_read(s->regmap, s->if_cfg->rev_id_reg, &val);
-+ s->if_cfg->extended_reg_enable(dev, false);
- if (((val & MAX310x_REV_MASK) != MAX14830_REV_ID)) {
- dev_err(dev,
- "%s ID 0x%02x does not match\n", s->devtype->name, val);
-@@ -1250,6 +1255,7 @@ static int max310x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
- #endif
-
- static int max310x_probe(struct device *dev, const struct max310x_devtype *devtype,
-+ const struct max310x_if_cfg *if_cfg,
- struct regmap *regmaps[], int irq)
- {
- int i, ret, fmin, fmax, freq;
-@@ -1313,6 +1319,7 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
-
- s->regmap = regmaps[0];
- s->devtype = devtype;
-+ s->if_cfg = if_cfg;
- dev_set_drvdata(dev, s);
-
- /* Check device to ensure we are talking to what we expect */
-@@ -1482,6 +1489,19 @@ static struct regmap_config regcfg = {
- };
-
- #ifdef CONFIG_SPI_MASTER
-+static int max310x_spi_extended_reg_enable(struct device *dev, bool enable)
-+{
-+ struct max310x_port *s = dev_get_drvdata(dev);
-+
-+ return regmap_write(s->regmap, MAX310X_GLOBALCMD_REG,
-+ enable ? MAX310X_EXTREG_ENBL : MAX310X_EXTREG_DSBL);
-+}
-+
-+static const struct max310x_if_cfg __maybe_unused max310x_spi_if_cfg = {
-+ .extended_reg_enable = max310x_spi_extended_reg_enable,
-+ .rev_id_reg = MAX310X_SPI_REVID_EXTREG,
-+};
-+
- static int max310x_spi_probe(struct spi_device *spi)
- {
- const struct max310x_devtype *devtype;
-@@ -1508,7 +1528,7 @@ static int max310x_spi_probe(struct spi_device *spi)
- regmaps[i] = devm_regmap_init_spi(spi, &regcfg);
- }
-
-- return max310x_probe(&spi->dev, devtype, regmaps, spi->irq);
-+ return max310x_probe(&spi->dev, devtype, &max310x_spi_if_cfg, regmaps, spi->irq);
- }
-
- static int max310x_spi_remove(struct spi_device *spi)
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-make-use-of-device-properties.patch b/queue-5.4/serial-max310x-make-use-of-device-properties.patch
deleted file mode 100644
index 6d2688af4a..0000000000
--- a/queue-5.4/serial-max310x-make-use-of-device-properties.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 42c6a6b7bb0caada01334af98ab3386e6f8451a2 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 7 Oct 2020 11:46:34 +0300
-Subject: serial: max310x: Make use of device properties
-
-From: Andy Shevchenko <andy.shevchenko@gmail.com>
-
-[ Upstream commit c808fab604ca62cff19ee6b261211483830807aa ]
-
-Device property API allows to gather device resources from different sources,
-such as ACPI. Convert the drivers to unleash the power of device property API.
-
-Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Link: https://lore.kernel.org/r/20201007084635.594991-1-andy.shevchenko@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: b35f8dbbce81 ("serial: max310x: prevent infinite while() loop in port startup")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 27 +++++++++------------------
- 1 file changed, 9 insertions(+), 18 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index bbf45c0626681..8d42c537ee5ea 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -15,8 +15,8 @@
- #include <linux/device.h>
- #include <linux/gpio/driver.h>
- #include <linux/module.h>
--#include <linux/of.h>
--#include <linux/of_device.h>
-+#include <linux/mod_devicetable.h>
-+#include <linux/property.h>
- #include <linux/regmap.h>
- #include <linux/serial_core.h>
- #include <linux/serial.h>
-@@ -271,7 +271,7 @@ struct max310x_one {
- container_of(_port, struct max310x_one, port)
-
- struct max310x_port {
-- struct max310x_devtype *devtype;
-+ const struct max310x_devtype *devtype;
- struct regmap *regmap;
- struct clk *clk;
- #ifdef CONFIG_GPIOLIB
-@@ -1262,7 +1262,7 @@ static int max310x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
- }
- #endif
-
--static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
-+static int max310x_probe(struct device *dev, const struct max310x_devtype *devtype,
- struct regmap *regmap, int irq)
- {
- int i, ret, fmin, fmax, freq;
-@@ -1488,7 +1488,7 @@ static struct regmap_config regcfg = {
- #ifdef CONFIG_SPI_MASTER
- static int max310x_spi_probe(struct spi_device *spi)
- {
-- struct max310x_devtype *devtype;
-+ const struct max310x_devtype *devtype;
- struct regmap *regmap;
- int ret;
-
-@@ -1500,18 +1500,9 @@ static int max310x_spi_probe(struct spi_device *spi)
- if (ret)
- return ret;
-
-- if (spi->dev.of_node) {
-- const struct of_device_id *of_id =
-- of_match_device(max310x_dt_ids, &spi->dev);
-- if (!of_id)
-- return -ENODEV;
--
-- devtype = (struct max310x_devtype *)of_id->data;
-- } else {
-- const struct spi_device_id *id_entry = spi_get_device_id(spi);
--
-- devtype = (struct max310x_devtype *)id_entry->driver_data;
-- }
-+ devtype = device_get_match_data(&spi->dev);
-+ if (!devtype)
-+ devtype = (struct max310x_devtype *)spi_get_device_id(spi)->driver_data;
-
- regcfg.max_register = devtype->nr * 0x20 - 1;
- regmap = devm_regmap_init_spi(spi, &regcfg);
-@@ -1536,7 +1527,7 @@ MODULE_DEVICE_TABLE(spi, max310x_id_table);
- static struct spi_driver max310x_spi_driver = {
- .driver = {
- .name = MAX310X_NAME,
-- .of_match_table = of_match_ptr(max310x_dt_ids),
-+ .of_match_table = max310x_dt_ids,
- .pm = &max310x_pm_ops,
- },
- .probe = max310x_spi_probe,
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-prevent-infinite-while-loop-in-port-s.patch b/queue-5.4/serial-max310x-prevent-infinite-while-loop-in-port-s.patch
deleted file mode 100644
index 1670435dd6..0000000000
--- a/queue-5.4/serial-max310x-prevent-infinite-while-loop-in-port-s.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From 75e06784237bda9c93318d2b291801fda5dbdc6a Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 16 Jan 2024 16:30:01 -0500
-Subject: serial: max310x: prevent infinite while() loop in port startup
-
-From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
-
-[ Upstream commit b35f8dbbce818b02c730dc85133dc7754266e084 ]
-
-If there is a problem after resetting a port, the do/while() loop that
-checks the default value of DIVLSB register may run forever and spam the
-I2C bus.
-
-Add a delay before each read of DIVLSB, and a maximum number of tries to
-prevent that situation from happening.
-
-Also fail probe if port reset is unsuccessful.
-
-Fixes: 10d8b34a4217 ("serial: max310x: Driver rework")
-Cc: stable@vger.kernel.org
-Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
-Link: https://lore.kernel.org/r/20240116213001.3691629-5-hugo@hugovil.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 20 ++++++++++++++++++--
- 1 file changed, 18 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 80298a5714bcb..978d9d93127e5 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -235,6 +235,10 @@
- #define MAX310x_REV_MASK (0xf8)
- #define MAX310X_WRITE_BIT 0x80
-
-+/* Port startup definitions */
-+#define MAX310X_PORT_STARTUP_WAIT_RETRIES 20 /* Number of retries */
-+#define MAX310X_PORT_STARTUP_WAIT_DELAY_MS 10 /* Delay between retries */
-+
- /* Crystal-related definitions */
- #define MAX310X_XTAL_WAIT_RETRIES 20 /* Number of retries */
- #define MAX310X_XTAL_WAIT_DELAY_MS 10 /* Delay between retries */
-@@ -1316,6 +1320,9 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
- goto out_clk;
-
- for (i = 0; i < devtype->nr; i++) {
-+ bool started = false;
-+ unsigned int try = 0, val = 0;
-+
- /* Reset port */
- regmap_write(regmaps[i], MAX310X_MODE2_REG,
- MAX310X_MODE2_RST_BIT);
-@@ -1324,8 +1331,17 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
-
- /* Wait for port startup */
- do {
-- regmap_read(regmaps[i], MAX310X_BRGDIVLSB_REG, &ret);
-- } while (ret != 0x01);
-+ msleep(MAX310X_PORT_STARTUP_WAIT_DELAY_MS);
-+ regmap_read(regmaps[i], MAX310X_BRGDIVLSB_REG, &val);
-+
-+ if (val == 0x01)
-+ started = true;
-+ } while (!started && (++try < MAX310X_PORT_STARTUP_WAIT_RETRIES));
-+
-+ if (!started) {
-+ ret = dev_err_probe(dev, -EAGAIN, "port reset failed\n");
-+ goto out_uart;
-+ }
-
- regmap_write(regmaps[i], MAX310X_MODE1_REG, devtype->mode1);
- }
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-try-to-get-crystal-clock-rate-from-pr.patch b/queue-5.4/serial-max310x-try-to-get-crystal-clock-rate-from-pr.patch
deleted file mode 100644
index aeefcc85d5..0000000000
--- a/queue-5.4/serial-max310x-try-to-get-crystal-clock-rate-from-pr.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-From c8f40c24cc6ed198202f32af1eb395087de90936 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 17 May 2021 20:29:30 +0300
-Subject: serial: max310x: Try to get crystal clock rate from property
-
-From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-
-[ Upstream commit d4d6f03c4fb3a91dadfe147b47edd40e4d7e4d36 ]
-
-In some configurations, mainly ACPI-based, the clock frequency of the device
-is supplied by very well established 'clock-frequency' property. Hence, try
-to get it from the property at last if no other providers are available.
-
-Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-Link: https://lore.kernel.org/r/20210517172930.83353-1-andriy.shevchenko@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: 8afa6c6decea ("serial: max310x: fail probe if clock crystal is unstable")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 40 +++++++++++++++++++++++-------------
- 1 file changed, 26 insertions(+), 14 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 8bf3c5ab59431..0e0f778d75cd4 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -556,7 +556,7 @@ static int max310x_update_best_err(unsigned long f, long *besterr)
- return 1;
- }
-
--static int max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
-+static u32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
- unsigned long freq, bool xtal)
- {
- unsigned int div, clksrc, pllcfg = 0;
-@@ -629,7 +629,7 @@ static int max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
- dev_warn(dev, "clock is not stable yet\n");
- }
-
-- return (int)bestfreq;
-+ return bestfreq;
- }
-
- static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigned int len)
-@@ -1264,9 +1264,10 @@ static int max310x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
- static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- struct regmap *regmap, int irq)
- {
-- int i, ret, fmin, fmax, freq, uartclk;
-+ int i, ret, fmin, fmax, freq;
- struct max310x_port *s;
-- bool xtal = false;
-+ u32 uartclk = 0;
-+ bool xtal;
-
- if (IS_ERR(regmap))
- return PTR_ERR(regmap);
-@@ -1278,24 +1279,20 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- return -ENOMEM;
- }
-
-+ /* Always ask for fixed clock rate from a property. */
-+ device_property_read_u32(dev, "clock-frequency", &uartclk);
-+
- s->clk = devm_clk_get_optional(dev, "osc");
- if (IS_ERR(s->clk))
- return PTR_ERR(s->clk);
- if (s->clk) {
-- fmin = 500000;
-- fmax = 35000000;
-+ xtal = false;
- } else {
- s->clk = devm_clk_get_optional(dev, "xtal");
- if (IS_ERR(s->clk))
- return PTR_ERR(s->clk);
-- if (s->clk) {
-- fmin = 1000000;
-- fmax = 4000000;
-- xtal = true;
-- } else {
-- dev_err(dev, "Cannot get clock\n");
-- return -EINVAL;
-- }
-+
-+ xtal = true;
- }
-
- ret = clk_prepare_enable(s->clk);
-@@ -1303,6 +1300,21 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- return ret;
-
- freq = clk_get_rate(s->clk);
-+ if (freq == 0)
-+ freq = uartclk;
-+ if (freq == 0) {
-+ dev_err(dev, "Cannot get clock rate\n");
-+ return -EINVAL;
-+ }
-+
-+ if (xtal) {
-+ fmin = 1000000;
-+ fmax = 4000000;
-+ } else {
-+ fmin = 500000;
-+ fmax = 35000000;
-+ }
-+
- /* Check frequency limits */
- if (freq < fmin || freq > fmax) {
- ret = -ERANGE;
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-unprepare-and-disable-clock-in-error-.patch b/queue-5.4/serial-max310x-unprepare-and-disable-clock-in-error-.patch
deleted file mode 100644
index 8d8c7ed619..0000000000
--- a/queue-5.4/serial-max310x-unprepare-and-disable-clock-in-error-.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 540ef3422d7c8b78f5c8f628e07ea8d0fc2687ac Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 25 Jun 2021 18:37:33 +0300
-Subject: serial: max310x: Unprepare and disable clock in error path
-
-From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-
-[ Upstream commit 61acabaae5ba58b3c32e6e90d24c2c0827fd27a8 ]
-
-In one error case the clock may be left prepared and enabled.
-Unprepare and disable clock in that case to balance state of
-the hardware.
-
-Fixes: d4d6f03c4fb3 ("serial: max310x: Try to get crystal clock rate from property")
-Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
-Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-Link: https://lore.kernel.org/r/20210625153733.12911-1-andriy.shevchenko@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 978d9d93127e5..a09ec46e0310d 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -1293,7 +1293,8 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
- freq = uartclk;
- if (freq == 0) {
- dev_err(dev, "Cannot get clock rate\n");
-- return -EINVAL;
-+ ret = -EINVAL;
-+ goto out_clk;
- }
-
- if (xtal) {
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-use-a-separate-regmap-for-each-port.patch b/queue-5.4/serial-max310x-use-a-separate-regmap-for-each-port.patch
deleted file mode 100644
index 8f1452e7f9..0000000000
--- a/queue-5.4/serial-max310x-use-a-separate-regmap-for-each-port.patch
+++ /dev/null
@@ -1,243 +0,0 @@
-From 2b22639ab2198e802bce2d213ac11c3a9ef69a54 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 5 Jun 2022 17:46:57 +0300
-Subject: serial: max310x: use a separate regmap for each port
-
-From: Cosmin Tanislav <cosmin.tanislav@analog.com>
-
-[ Upstream commit 6ef281daf020592c219fa91780abc381c6c20db5 ]
-
-The driver currently does manual register manipulation in
-multiple places to talk to a specific UART port.
-
-In order to talk to a specific UART port over SPI, the bits U1
-and U0 of the register address can be set, as explained in the
-Command byte configuration section of the datasheet.
-
-Make this more elegant by creating regmaps for each UART port
-and setting the read_flag_mask and write_flag_mask
-accordingly.
-
-All communcations regarding global registers are done on UART
-port 0, so replace the global regmap entirely with the port 0
-regmap.
-
-Also, remove the 0x1f masks from reg_writeable(), reg_volatile()
-and reg_precious() methods, since setting the U1 and U0 bits of
-the register address happens inside the regmap core now.
-
-Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Signed-off-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
-Link: https://lore.kernel.org/r/20220605144659.4169853-3-demonsingur@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: b35f8dbbce81 ("serial: max310x: prevent infinite while() loop in port startup")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 68 +++++++++++++++++++-----------------
- 1 file changed, 36 insertions(+), 32 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index c0fa4ad104774..80298a5714bcb 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -262,6 +262,7 @@ struct max310x_one {
- struct work_struct tx_work;
- struct work_struct md_work;
- struct work_struct rs_work;
-+ struct regmap *regmap;
-
- u8 rx_buf[MAX310X_FIFO_SIZE];
- };
-@@ -291,26 +292,26 @@ static DECLARE_BITMAP(max310x_lines, MAX310X_UART_NRMAX);
-
- static u8 max310x_port_read(struct uart_port *port, u8 reg)
- {
-- struct max310x_port *s = dev_get_drvdata(port->dev);
-+ struct max310x_one *one = to_max310x_port(port);
- unsigned int val = 0;
-
-- regmap_read(s->regmap, port->iobase + reg, &val);
-+ regmap_read(one->regmap, reg, &val);
-
- return val;
- }
-
- static void max310x_port_write(struct uart_port *port, u8 reg, u8 val)
- {
-- struct max310x_port *s = dev_get_drvdata(port->dev);
-+ struct max310x_one *one = to_max310x_port(port);
-
-- regmap_write(s->regmap, port->iobase + reg, val);
-+ regmap_write(one->regmap, reg, val);
- }
-
- static void max310x_port_update(struct uart_port *port, u8 reg, u8 mask, u8 val)
- {
-- struct max310x_port *s = dev_get_drvdata(port->dev);
-+ struct max310x_one *one = to_max310x_port(port);
-
-- regmap_update_bits(s->regmap, port->iobase + reg, mask, val);
-+ regmap_update_bits(one->regmap, reg, mask, val);
- }
-
- static int max3107_detect(struct device *dev)
-@@ -449,7 +450,7 @@ static const struct max310x_devtype max14830_devtype = {
-
- static bool max310x_reg_writeable(struct device *dev, unsigned int reg)
- {
-- switch (reg & 0x1f) {
-+ switch (reg) {
- case MAX310X_IRQSTS_REG:
- case MAX310X_LSR_IRQSTS_REG:
- case MAX310X_SPCHR_IRQSTS_REG:
-@@ -466,7 +467,7 @@ static bool max310x_reg_writeable(struct device *dev, unsigned int reg)
-
- static bool max310x_reg_volatile(struct device *dev, unsigned int reg)
- {
-- switch (reg & 0x1f) {
-+ switch (reg) {
- case MAX310X_RHR_REG:
- case MAX310X_IRQSTS_REG:
- case MAX310X_LSR_IRQSTS_REG:
-@@ -488,7 +489,7 @@ static bool max310x_reg_volatile(struct device *dev, unsigned int reg)
-
- static bool max310x_reg_precious(struct device *dev, unsigned int reg)
- {
-- switch (reg & 0x1f) {
-+ switch (reg) {
- case MAX310X_RHR_REG:
- case MAX310X_IRQSTS_REG:
- case MAX310X_SPCHR_IRQSTS_REG:
-@@ -633,18 +634,16 @@ static s32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
-
- static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigned int len)
- {
-- struct max310x_port *s = dev_get_drvdata(port->dev);
-- u8 reg = port->iobase + MAX310X_THR_REG;
-+ struct max310x_one *one = to_max310x_port(port);
-
-- regmap_raw_write(s->regmap, reg, txbuf, len);
-+ regmap_raw_write(one->regmap, MAX310X_THR_REG, txbuf, len);
- }
-
- static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned int len)
- {
-- struct max310x_port *s = dev_get_drvdata(port->dev);
-- u8 reg = port->iobase + MAX310X_RHR_REG;
-+ struct max310x_one *one = to_max310x_port(port);
-
-- regmap_raw_read(s->regmap, reg, rxbuf, len);
-+ regmap_raw_read(one->regmap, MAX310X_RHR_REG, rxbuf, len);
- }
-
- static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen)
-@@ -1247,15 +1246,16 @@ static int max310x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
- #endif
-
- static int max310x_probe(struct device *dev, const struct max310x_devtype *devtype,
-- struct regmap *regmap, int irq)
-+ struct regmap *regmaps[], int irq)
- {
- int i, ret, fmin, fmax, freq;
- struct max310x_port *s;
- s32 uartclk = 0;
- bool xtal;
-
-- if (IS_ERR(regmap))
-- return PTR_ERR(regmap);
-+ for (i = 0; i < devtype->nr; i++)
-+ if (IS_ERR(regmaps[i]))
-+ return PTR_ERR(regmaps[i]);
-
- /* Alloc port structure */
- s = devm_kzalloc(dev, struct_size(s, p, devtype->nr), GFP_KERNEL);
-@@ -1306,7 +1306,7 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
- goto out_clk;
- }
-
-- s->regmap = regmap;
-+ s->regmap = regmaps[0];
- s->devtype = devtype;
- dev_set_drvdata(dev, s);
-
-@@ -1316,22 +1316,18 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
- goto out_clk;
-
- for (i = 0; i < devtype->nr; i++) {
-- unsigned int offs = i << 5;
--
- /* Reset port */
-- regmap_write(s->regmap, MAX310X_MODE2_REG + offs,
-+ regmap_write(regmaps[i], MAX310X_MODE2_REG,
- MAX310X_MODE2_RST_BIT);
- /* Clear port reset */
-- regmap_write(s->regmap, MAX310X_MODE2_REG + offs, 0);
-+ regmap_write(regmaps[i], MAX310X_MODE2_REG, 0);
-
- /* Wait for port startup */
- do {
-- regmap_read(s->regmap,
-- MAX310X_BRGDIVLSB_REG + offs, &ret);
-+ regmap_read(regmaps[i], MAX310X_BRGDIVLSB_REG, &ret);
- } while (ret != 0x01);
-
-- regmap_write(s->regmap, MAX310X_MODE1_REG + offs,
-- devtype->mode1);
-+ regmap_write(regmaps[i], MAX310X_MODE1_REG, devtype->mode1);
- }
-
- uartclk = max310x_set_ref_clk(dev, s, freq, xtal);
-@@ -1359,11 +1355,13 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
- s->p[i].port.fifosize = MAX310X_FIFO_SIZE;
- s->p[i].port.flags = UPF_FIXED_TYPE | UPF_LOW_LATENCY;
- s->p[i].port.iotype = UPIO_PORT;
-- s->p[i].port.iobase = i * 0x20;
-+ s->p[i].port.iobase = i;
- s->p[i].port.membase = (void __iomem *)~0;
- s->p[i].port.uartclk = uartclk;
- s->p[i].port.rs485_config = max310x_rs485_config;
- s->p[i].port.ops = &max310x_ops;
-+ s->p[i].regmap = regmaps[i];
-+
- /* Disable all interrupts */
- max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0);
- /* Clear IRQ status register */
-@@ -1460,6 +1458,7 @@ static struct regmap_config regcfg = {
- .val_bits = 8,
- .write_flag_mask = MAX310X_WRITE_BIT,
- .cache_type = REGCACHE_RBTREE,
-+ .max_register = MAX310X_REG_1F,
- .writeable_reg = max310x_reg_writeable,
- .volatile_reg = max310x_reg_volatile,
- .precious_reg = max310x_reg_precious,
-@@ -1469,7 +1468,8 @@ static struct regmap_config regcfg = {
- static int max310x_spi_probe(struct spi_device *spi)
- {
- const struct max310x_devtype *devtype;
-- struct regmap *regmap;
-+ struct regmap *regmaps[4];
-+ unsigned int i;
- int ret;
-
- /* Setup SPI bus */
-@@ -1484,10 +1484,14 @@ static int max310x_spi_probe(struct spi_device *spi)
- if (!devtype)
- devtype = (struct max310x_devtype *)spi_get_device_id(spi)->driver_data;
-
-- regcfg.max_register = devtype->nr * 0x20 - 1;
-- regmap = devm_regmap_init_spi(spi, &regcfg);
-+ for (i = 0; i < devtype->nr; i++) {
-+ u8 port_mask = i * 0x20;
-+ regcfg.read_flag_mask = port_mask;
-+ regcfg.write_flag_mask = port_mask | MAX310X_WRITE_BIT;
-+ regmaps[i] = devm_regmap_init_spi(spi, &regcfg);
-+ }
-
-- return max310x_probe(&spi->dev, devtype, regmap, spi->irq);
-+ return max310x_probe(&spi->dev, devtype, regmaps, spi->irq);
- }
-
- static int max310x_spi_remove(struct spi_device *spi)
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-use-devm_clk_get_optional-to-get-the-.patch b/queue-5.4/serial-max310x-use-devm_clk_get_optional-to-get-the-.patch
deleted file mode 100644
index d9ae97b8f9..0000000000
--- a/queue-5.4/serial-max310x-use-devm_clk_get_optional-to-get-the-.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From e1028af9d83efd88d3e0edd666d1b874945d446c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 7 Oct 2020 11:46:35 +0300
-Subject: serial: max310x: Use devm_clk_get_optional() to get the input clock
-
-From: Andy Shevchenko <andy.shevchenko@gmail.com>
-
-[ Upstream commit 974e454d6f96da0c0ab1b4115b92587dd9406f6a ]
-
-Simplify the code which fetches the input clock by using
-devm_clk_get_optional(). If no input clock is present
-devm_clk_get_optional() will return NULL instead of an error
-which matches the behavior of the old code.
-
-Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Link: https://lore.kernel.org/r/20201007084635.594991-2-andy.shevchenko@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: 8afa6c6decea ("serial: max310x: fail probe if clock crystal is unstable")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 30 +++++++++++++++---------------
- 1 file changed, 15 insertions(+), 15 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 14537878f9855..8bf3c5ab59431 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -1265,7 +1265,6 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- struct regmap *regmap, int irq)
- {
- int i, ret, fmin, fmax, freq, uartclk;
-- struct clk *clk_osc, *clk_xtal;
- struct max310x_port *s;
- bool xtal = false;
-
-@@ -1279,23 +1278,24 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- return -ENOMEM;
- }
-
-- clk_osc = devm_clk_get(dev, "osc");
-- clk_xtal = devm_clk_get(dev, "xtal");
-- if (!IS_ERR(clk_osc)) {
-- s->clk = clk_osc;
-+ s->clk = devm_clk_get_optional(dev, "osc");
-+ if (IS_ERR(s->clk))
-+ return PTR_ERR(s->clk);
-+ if (s->clk) {
- fmin = 500000;
- fmax = 35000000;
-- } else if (!IS_ERR(clk_xtal)) {
-- s->clk = clk_xtal;
-- fmin = 1000000;
-- fmax = 4000000;
-- xtal = true;
-- } else if (PTR_ERR(clk_osc) == -EPROBE_DEFER ||
-- PTR_ERR(clk_xtal) == -EPROBE_DEFER) {
-- return -EPROBE_DEFER;
- } else {
-- dev_err(dev, "Cannot get clock\n");
-- return -EINVAL;
-+ s->clk = devm_clk_get_optional(dev, "xtal");
-+ if (IS_ERR(s->clk))
-+ return PTR_ERR(s->clk);
-+ if (s->clk) {
-+ fmin = 1000000;
-+ fmax = 4000000;
-+ xtal = true;
-+ } else {
-+ dev_err(dev, "Cannot get clock\n");
-+ return -EINVAL;
-+ }
- }
-
- ret = clk_prepare_enable(s->clk);
---
-2.43.0
-
diff --git a/queue-5.4/serial-max310x-use-regmap-methods-for-spi-batch-oper.patch b/queue-5.4/serial-max310x-use-regmap-methods-for-spi-batch-oper.patch
deleted file mode 100644
index 55e4ffe078..0000000000
--- a/queue-5.4/serial-max310x-use-regmap-methods-for-spi-batch-oper.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 169b9e3eb17685a3681218505fb91fac050bef77 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 5 Jun 2022 17:46:56 +0300
-Subject: serial: max310x: use regmap methods for SPI batch operations
-
-From: Cosmin Tanislav <cosmin.tanislav@analog.com>
-
-[ Upstream commit 285e76fc049c4d32c772eea9460a7ef28a193802 ]
-
-The SPI batch read/write operations can be implemented as simple
-regmap raw read and write, which will also try to do a gather
-write just as it is done here.
-
-Use the regmap raw read and write methods.
-
-Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
-Signed-off-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
-Link: https://lore.kernel.org/r/20220605144659.4169853-2-demonsingur@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: b35f8dbbce81 ("serial: max310x: prevent infinite while() loop in port startup")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/tty/serial/max310x.c | 36 ++++++++----------------------------
- 1 file changed, 8 insertions(+), 28 deletions(-)
-
-diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 8d42c537ee5ea..c0fa4ad104774 100644
---- a/drivers/tty/serial/max310x.c
-+++ b/drivers/tty/serial/max310x.c
-@@ -263,8 +263,6 @@ struct max310x_one {
- struct work_struct md_work;
- struct work_struct rs_work;
-
-- u8 wr_header;
-- u8 rd_header;
- u8 rx_buf[MAX310X_FIFO_SIZE];
- };
- #define to_max310x_port(_port) \
-@@ -635,32 +633,18 @@ static s32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
-
- static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigned int len)
- {
-- struct max310x_one *one = to_max310x_port(port);
-- struct spi_transfer xfer[] = {
-- {
-- .tx_buf = &one->wr_header,
-- .len = sizeof(one->wr_header),
-- }, {
-- .tx_buf = txbuf,
-- .len = len,
-- }
-- };
-- spi_sync_transfer(to_spi_device(port->dev), xfer, ARRAY_SIZE(xfer));
-+ struct max310x_port *s = dev_get_drvdata(port->dev);
-+ u8 reg = port->iobase + MAX310X_THR_REG;
-+
-+ regmap_raw_write(s->regmap, reg, txbuf, len);
- }
-
- static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned int len)
- {
-- struct max310x_one *one = to_max310x_port(port);
-- struct spi_transfer xfer[] = {
-- {
-- .tx_buf = &one->rd_header,
-- .len = sizeof(one->rd_header),
-- }, {
-- .rx_buf = rxbuf,
-- .len = len,
-- }
-- };
-- spi_sync_transfer(to_spi_device(port->dev), xfer, ARRAY_SIZE(xfer));
-+ struct max310x_port *s = dev_get_drvdata(port->dev);
-+ u8 reg = port->iobase + MAX310X_RHR_REG;
-+
-+ regmap_raw_read(s->regmap, reg, rxbuf, len);
- }
-
- static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen)
-@@ -1390,10 +1374,6 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
- INIT_WORK(&s->p[i].md_work, max310x_md_proc);
- /* Initialize queue for changing RS485 mode */
- INIT_WORK(&s->p[i].rs_work, max310x_rs_proc);
-- /* Initialize SPI-transfer buffers */
-- s->p[i].wr_header = (s->p[i].port.iobase + MAX310X_THR_REG) |
-- MAX310X_WRITE_BIT;
-- s->p[i].rd_header = (s->p[i].port.iobase + MAX310X_RHR_REG);
-
- /* Register port */
- ret = uart_add_one_port(&max310x_uart, &s->p[i].port);
---
-2.43.0
-
diff --git a/queue-5.4/series b/queue-5.4/series
deleted file mode 100644
index 2e969d62c3..0000000000
--- a/queue-5.4/series
+++ /dev/null
@@ -1,50 +0,0 @@
-lan78xx-fix-white-space-and-style-issues.patch
-lan78xx-add-missing-return-code-checks.patch
-lan78xx-fix-partial-packet-errors-on-suspend-resume.patch
-lan78xx-fix-race-conditions-in-suspend-resume-handli.patch
-net-lan78xx-fix-runtime-pm-count-underflow-on-link-s.patch
-ixgbe-dis-en-able-irqs-in-ixgbe_txrx_ring_-dis-en-ab.patch
-geneve-make-sure-to-pull-inner-header-in-geneve_rx.patch
-net-ice-fix-potential-null-pointer-dereference-in-ic.patch
-net-ipv6-avoid-possible-uaf-in-ip6_route_mpath_notif.patch
-net-rds-fix-warning-in-rds_conn_connect_if_down.patch
-netfilter-nft_ct-fix-l3num-expectations-with-inet-ps.patch
-netfilter-nf_conntrack_h323-add-protection-for-bmp-l.patch
-netrom-fix-a-data-race-around-sysctl_netrom_default_.patch
-netrom-fix-a-data-race-around-sysctl_netrom_obsolesc.patch
-netrom-fix-data-races-around-sysctl_netrom_network_t.patch
-netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch
-netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-16607
-netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-21095
-netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-24362
-netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-4080
-netrom-fix-a-data-race-around-sysctl_netrom_transpor.patch-31728
-netrom-fix-a-data-race-around-sysctl_netrom_routing_.patch
-netrom-fix-a-data-race-around-sysctl_netrom_link_fai.patch
-netrom-fix-data-races-around-sysctl_net_busy_read.patch
-selftests-mm-fix-map_hugetlb-failure-on-64k-page-siz.patch
-um-allow-not-setting-extra-rpaths-in-the-linux-binar.patch
-serial-max310x-use-devm_clk_get_optional-to-get-the-.patch
-serial-max310x-try-to-get-crystal-clock-rate-from-pr.patch
-serial-max310x-fail-probe-if-clock-crystal-is-unstab.patch
-serial-max310x-make-use-of-device-properties.patch
-serial-max310x-use-regmap-methods-for-spi-batch-oper.patch
-serial-max310x-use-a-separate-regmap-for-each-port.patch
-serial-max310x-prevent-infinite-while-loop-in-port-s.patch
-input-i8042-fix-strange-behavior-of-touchpad-on-clev.patch
-hv_netvsc-make-netvsc-vf-binding-check-both-mac-and-.patch
-hv_netvsc-use-netif_is_bond_master-instead-of-open-c.patch
-hv_netvsc-register-vf-in-netvsc_probe-if-net_device_.patch
-y2038-rusage-use-__kernel_old_timeval.patch
-getrusage-add-the-signal_struct-sig-local-variable.patch
-getrusage-move-thread_group_cputime_adjusted-outside.patch
-getrusage-use-__for_each_thread.patch
-getrusage-use-sig-stats_lock-rather-than-lock_task_s.patch
-serial-max310x-unprepare-and-disable-clock-in-error-.patch
-regmap-allow-to-define-reg_update_bits-for-no-bus-co.patch
-regmap-add-bulk-read-write-callbacks-into-regmap_con.patch
-serial-max310x-make-accessing-revision-id-interface-.patch
-serial-max310x-implement-i2c-support.patch
-serial-max310x-fix-io-data-corruption-in-batched-ope.patch
-arm64-dts-qcom-add-pdc-interrupt-controller-for-sdm8.patch
-arm64-dts-qcom-sdm845-fix-usb-dp-dm-hs-phy-interrupt.patch
diff --git a/queue-5.4/um-allow-not-setting-extra-rpaths-in-the-linux-binar.patch b/queue-5.4/um-allow-not-setting-extra-rpaths-in-the-linux-binar.patch
deleted file mode 100644
index b287803214..0000000000
--- a/queue-5.4/um-allow-not-setting-extra-rpaths-in-the-linux-binar.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 26f3b5f71fb03300d8be7a87bf4ce8ef00880be5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 8 Mar 2021 14:02:37 +0100
-Subject: um: allow not setting extra rpaths in the linux binary
-
-From: Johannes Berg <johannes.berg@intel.com>
-
-[ Upstream commit 386093c68ba3e8bcfe7f46deba901e0e80713c29 ]
-
-There doesn't seem to be any reason for the rpath being set in
-the binaries, at on systems that I tested on. On the other hand,
-setting rpath is actually harming binaries in some cases, e.g.
-if using nix-based compilation environments where /lib & /lib64
-are not part of the actual environment.
-
-Add a new Kconfig option (under EXPERT, for less user confusion)
-that allows disabling the rpath additions.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Signed-off-by: Richard Weinberger <richard@nod.at>
-Stable-dep-of: 846cfbeed09b ("um: Fix adding '-no-pie' for clang")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/um/Kconfig | 13 +++++++++++++
- arch/um/Makefile | 3 ++-
- arch/x86/Makefile.um | 2 +-
- 3 files changed, 16 insertions(+), 2 deletions(-)
-
-diff --git a/arch/um/Kconfig b/arch/um/Kconfig
-index 468a5d63ef269..107a0bc668e9f 100644
---- a/arch/um/Kconfig
-+++ b/arch/um/Kconfig
-@@ -85,6 +85,19 @@ config LD_SCRIPT_DYN
- depends on !LD_SCRIPT_STATIC
- select MODULE_REL_CRCS if MODVERSIONS
-
-+config LD_SCRIPT_DYN_RPATH
-+ bool "set rpath in the binary" if EXPERT
-+ default y
-+ depends on LD_SCRIPT_DYN
-+ help
-+ Add /lib (and /lib64 for 64-bit) to the linux binary's rpath
-+ explicitly.
-+
-+ You may need to turn this off if compiling for nix systems
-+ that have their libraries in random /nix directories and
-+ might otherwise unexpected use libraries from /lib or /lib64
-+ instead of the desired ones.
-+
- config HOSTFS
- tristate "Host filesystem"
- help
-diff --git a/arch/um/Makefile b/arch/um/Makefile
-index 773120be0f56f..94cea8d46b222 100644
---- a/arch/um/Makefile
-+++ b/arch/um/Makefile
-@@ -118,7 +118,8 @@ archprepare:
- $(Q)$(MAKE) $(build)=$(HOST_DIR)/um include/generated/user_constants.h
-
- LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static
--LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib $(call cc-option, -no-pie)
-+LINK-$(CONFIG_LD_SCRIPT_DYN) += $(call cc-option, -no-pie)
-+LINK-$(CONFIG_LD_SCRIPT_DYN_RPATH) += -Wl,-rpath,/lib
-
- CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,) \
- $(call cc-option, -fno-stack-protector,) \
-diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um
-index 1db7913795f51..b3c1ae084180d 100644
---- a/arch/x86/Makefile.um
-+++ b/arch/x86/Makefile.um
-@@ -44,7 +44,7 @@ ELF_FORMAT := elf64-x86-64
-
- # Not on all 64-bit distros /lib is a symlink to /lib64. PLD is an example.
-
--LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64
-+LINK-$(CONFIG_LD_SCRIPT_DYN_RPATH) += -Wl,-rpath,/lib64
- LINK-y += -m64
-
- endif
---
-2.43.0
-
diff --git a/queue-5.4/y2038-rusage-use-__kernel_old_timeval.patch b/queue-5.4/y2038-rusage-use-__kernel_old_timeval.patch
deleted file mode 100644
index 4dd88a236c..0000000000
--- a/queue-5.4/y2038-rusage-use-__kernel_old_timeval.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From fd7d98c0acaaecde1cb3206f834d95079d7e2a39 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 25 Oct 2019 22:46:48 +0200
-Subject: y2038: rusage: use __kernel_old_timeval
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit bdd565f817a74b9e30edec108f7cb1dbc762b8a6 ]
-
-There are two 'struct timeval' fields in 'struct rusage'.
-
-Unfortunately the definition of timeval is now ambiguous when used in
-user space with a libc that has a 64-bit time_t, and this also changes
-the 'rusage' definition in user space in a way that is incompatible with
-the system call interface.
-
-While there is no good solution to avoid all ambiguity here, change
-the definition in the kernel headers to be compatible with the kernel
-ABI, using __kernel_old_timeval as an unambiguous base type.
-
-In previous discussions, there was also a plan to add a replacement
-for rusage based on 64-bit timestamps and nanosecond resolution,
-i.e. 'struct __kernel_timespec'. I have patches for that as well,
-if anyone thinks we should do that.
-
-Reviewed-by: Cyrill Gorcunov <gorcunov@gmail.com>
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Stable-dep-of: daa694e41375 ("getrusage: move thread_group_cputime_adjusted() outside of lock_task_sighand()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/alpha/kernel/osf_sys.c | 2 +-
- include/uapi/linux/resource.h | 4 ++--
- kernel/sys.c | 4 ++--
- 3 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c
-index bf497b8b0ec60..bbe7a0da6264f 100644
---- a/arch/alpha/kernel/osf_sys.c
-+++ b/arch/alpha/kernel/osf_sys.c
-@@ -963,7 +963,7 @@ put_tv32(struct timeval32 __user *o, struct timespec64 *i)
- }
-
- static inline long
--put_tv_to_tv32(struct timeval32 __user *o, struct timeval *i)
-+put_tv_to_tv32(struct timeval32 __user *o, struct __kernel_old_timeval *i)
- {
- return copy_to_user(o, &(struct timeval32){
- .tv_sec = i->tv_sec,
-diff --git a/include/uapi/linux/resource.h b/include/uapi/linux/resource.h
-index cc00fd0796317..74ef57b38f9f5 100644
---- a/include/uapi/linux/resource.h
-+++ b/include/uapi/linux/resource.h
-@@ -22,8 +22,8 @@
- #define RUSAGE_THREAD 1 /* only the calling thread */
-
- struct rusage {
-- struct timeval ru_utime; /* user time used */
-- struct timeval ru_stime; /* system time used */
-+ struct __kernel_old_timeval ru_utime; /* user time used */
-+ struct __kernel_old_timeval ru_stime; /* system time used */
- __kernel_long_t ru_maxrss; /* maximum resident set size */
- __kernel_long_t ru_ixrss; /* integral shared memory size */
- __kernel_long_t ru_idrss; /* integral unshared data size */
-diff --git a/kernel/sys.c b/kernel/sys.c
-index f6d6ce8da3e4a..bc3cd0ef894e6 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -1767,8 +1767,8 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
- unlock_task_sighand(p, &flags);
-
- out:
-- r->ru_utime = ns_to_timeval(utime);
-- r->ru_stime = ns_to_timeval(stime);
-+ r->ru_utime = ns_to_kernel_old_timeval(utime);
-+ r->ru_stime = ns_to_kernel_old_timeval(stime);
-
- if (who != RUSAGE_CHILDREN) {
- struct mm_struct *mm = get_task_mm(p);
---
-2.43.0
-