diff options
author | Sasha Levin <sashal@kernel.org> | 2024-03-15 15:17:17 -0400 |
---|---|---|
committer | Sasha Levin <sashal@kernel.org> | 2024-03-15 15:17:17 -0400 |
commit | e959bb7661f42487b08977264a176e908bd1f997 (patch) | |
tree | 90081657f28f25ebdbb76b6250cc83936ab22e89 /queue-5.4 | |
parent | a63aeec32555da7d8bea9b0d4cb5473d709932a8 (diff) | |
download | stable-queue-e959bb7661f42487b08977264a176e908bd1f997.tar.gz |
Linux 5.4.272v5.4.272
Diffstat (limited to 'queue-5.4')
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, ®cfg_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, ®cfg_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, ®cfg); - } - -- 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, ®cfg); -@@ -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, ®cfg); -+ 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, ®cfg); -+ } - -- 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 - |