]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.6
authorSasha Levin <sashal@kernel.org>
Fri, 2 Feb 2024 21:37:31 +0000 (16:37 -0500)
committerSasha Levin <sashal@kernel.org>
Fri, 2 Feb 2024 21:37:31 +0000 (16:37 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
53 files changed:
queue-6.6/af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch [new file with mode: 0644]
queue-6.6/bridge-mcast-fix-disabled-snooping-after-long-uptime.patch [new file with mode: 0644]
queue-6.6/devlink-fix-referring-to-hw_addr-attribute-during-st.patch [new file with mode: 0644]
queue-6.6/e1000e-correct-maximum-frequency-adjustment-values.patch [new file with mode: 0644]
queue-6.6/gve-fix-skb-truesize-underestimation.patch [new file with mode: 0644]
queue-6.6/hid-hidraw-fix-a-problem-of-memory-leak-in-hidraw_re.patch [new file with mode: 0644]
queue-6.6/ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch [new file with mode: 0644]
queue-6.6/ipmr-fix-kernel-panic-when-forwarding-mcast-packets.patch [new file with mode: 0644]
queue-6.6/ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch [new file with mode: 0644]
queue-6.6/ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch [new file with mode: 0644]
queue-6.6/ixgbe-refactor-overtemp-event-handling.patch [new file with mode: 0644]
queue-6.6/ixgbe-refactor-returning-internal-error-codes.patch [new file with mode: 0644]
queue-6.6/kunit-run-test-suites-only-after-module-initializati.patch [new file with mode: 0644]
queue-6.6/llc-call-sock_orphan-at-release-time.patch [new file with mode: 0644]
queue-6.6/net-dsa-mt7530-fix-10m-100m-speed-on-mt7988-switch.patch [new file with mode: 0644]
queue-6.6/net-dsa-qca8k-fix-illegal-usage-of-gpio.patch [new file with mode: 0644]
queue-6.6/net-ethernet-mtk_eth_soc-set-dma-coherent-mask-to-ge.patch [new file with mode: 0644]
queue-6.6/net-ipv4-fix-a-memleak-in-ip_setup_cork.patch [new file with mode: 0644]
queue-6.6/net-lan966x-fix-port-configuration-when-using-sgmii-.patch [new file with mode: 0644]
queue-6.6/net-phy-mediatek-ge-soc-sync-driver-with-mediatek-sd.patch [new file with mode: 0644]
queue-6.6/net-sysfs-fix-sys-class-net-iface-path.patch [new file with mode: 0644]
queue-6.6/netfilter-conntrack-correct-window-scaling-with-retr.patch [new file with mode: 0644]
queue-6.6/netfilter-ipset-fix-performance-regression-in-swap-o.patch [new file with mode: 0644]
queue-6.6/netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch [new file with mode: 0644]
queue-6.6/netfilter-nf_tables-restrict-tunnel-object-to-nfprot.patch [new file with mode: 0644]
queue-6.6/netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch [new file with mode: 0644]
queue-6.6/octeontx2-pf-remove-xdp-queues-on-program-detach.patch [new file with mode: 0644]
queue-6.6/pds_core-cancel-aq-work-on-teardown.patch [new file with mode: 0644]
queue-6.6/pds_core-clear-bars-on-reset.patch [new file with mode: 0644]
queue-6.6/pds_core-implement-pci-reset-handlers.patch [new file with mode: 0644]
queue-6.6/pds_core-prevent-race-issues-involving-the-adminq.patch [new file with mode: 0644]
queue-6.6/pds_core-rework-teardown-setup-flow-to-be-more-commo.patch [new file with mode: 0644]
queue-6.6/pds_core-use-struct-pdsc-for-the-pdsc_adminq_isr-pri.patch [new file with mode: 0644]
queue-6.6/regulator-ti-abb-don-t-use-devm_platform_ioremap_res.patch [new file with mode: 0644]
queue-6.6/scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch [new file with mode: 0644]
queue-6.6/scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch [new file with mode: 0644]
queue-6.6/selftests-bonding-check-initial-state.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-config-for-big-tcp-tests.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-config-for-geneve.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-config-for-nf_target_ttl.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-config-for-nftables-backed.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-config-for-pmtu.sh-tests.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-matchall-classifier.patch [new file with mode: 0644]
queue-6.6/selftests-net-add-missing-required-classifier.patch [new file with mode: 0644]
queue-6.6/selftests-net-don-t-access-dev-stdout-in-pmtu.sh.patch [new file with mode: 0644]
queue-6.6/selftests-net-enable-some-more-knobs.patch [new file with mode: 0644]
queue-6.6/selftests-net-explicitly-wait-for-listener-ready.patch [new file with mode: 0644]
queue-6.6/selftests-net-fix-available-tunnels-detection.patch [new file with mode: 0644]
queue-6.6/selftests-net-give-more-time-for-gro-aggregation.patch [new file with mode: 0644]
queue-6.6/selftests-net-remove-dependency-on-ebpf-tests.patch [new file with mode: 0644]
queue-6.6/selftests-team-add-missing-config-options.patch [new file with mode: 0644]
queue-6.6/series
queue-6.6/tcp-add-sanity-checks-to-rx-zerocopy.patch [new file with mode: 0644]

diff --git a/queue-6.6/af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch b/queue-6.6/af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch
new file mode 100644 (file)
index 0000000..b58a652
--- /dev/null
@@ -0,0 +1,243 @@
+From 948d478e08f85a584715eb61488c38026c5717eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jan 2024 18:42:35 +0000
+Subject: af_unix: fix lockdep positive in sk_diag_dump_icons()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 4d322dce82a1d44f8c83f0f54f95dd1b8dcf46c9 ]
+
+syzbot reported a lockdep splat [1].
+
+Blamed commit hinted about the possible lockdep
+violation, and code used unix_state_lock_nested()
+in an attempt to silence lockdep.
+
+It is not sufficient, because unix_state_lock_nested()
+is already used from unix_state_double_lock().
+
+We need to use a separate subclass.
+
+This patch adds a distinct enumeration to make things
+more explicit.
+
+Also use swap() in unix_state_double_lock() as a clean up.
+
+v2: add a missing inline keyword to unix_state_lock_nested()
+
+[1]
+WARNING: possible circular locking dependency detected
+6.8.0-rc1-syzkaller-00356-g8a696a29c690 #0 Not tainted
+
+syz-executor.1/2542 is trying to acquire lock:
+ ffff88808b5df9e8 (rlock-AF_UNIX){+.+.}-{2:2}, at: skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
+
+but task is already holding lock:
+ ffff88808b5dfe70 (&u->lock/1){+.+.}-{2:2}, at: unix_dgram_sendmsg+0xfc7/0x2200 net/unix/af_unix.c:2089
+
+which lock already depends on the new lock.
+
+the existing dependency chain (in reverse order) is:
+
+-> #1 (&u->lock/1){+.+.}-{2:2}:
+        lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
+        _raw_spin_lock_nested+0x31/0x40 kernel/locking/spinlock.c:378
+        sk_diag_dump_icons net/unix/diag.c:87 [inline]
+        sk_diag_fill+0x6ea/0xfe0 net/unix/diag.c:157
+        sk_diag_dump net/unix/diag.c:196 [inline]
+        unix_diag_dump+0x3e9/0x630 net/unix/diag.c:220
+        netlink_dump+0x5c1/0xcd0 net/netlink/af_netlink.c:2264
+        __netlink_dump_start+0x5d7/0x780 net/netlink/af_netlink.c:2370
+        netlink_dump_start include/linux/netlink.h:338 [inline]
+        unix_diag_handler_dump+0x1c3/0x8f0 net/unix/diag.c:319
+       sock_diag_rcv_msg+0xe3/0x400
+        netlink_rcv_skb+0x1df/0x430 net/netlink/af_netlink.c:2543
+        sock_diag_rcv+0x2a/0x40 net/core/sock_diag.c:280
+        netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline]
+        netlink_unicast+0x7e6/0x980 net/netlink/af_netlink.c:1367
+        netlink_sendmsg+0xa37/0xd70 net/netlink/af_netlink.c:1908
+        sock_sendmsg_nosec net/socket.c:730 [inline]
+        __sock_sendmsg net/socket.c:745 [inline]
+        sock_write_iter+0x39a/0x520 net/socket.c:1160
+        call_write_iter include/linux/fs.h:2085 [inline]
+        new_sync_write fs/read_write.c:497 [inline]
+        vfs_write+0xa74/0xca0 fs/read_write.c:590
+        ksys_write+0x1a0/0x2c0 fs/read_write.c:643
+        do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+        do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
+       entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+-> #0 (rlock-AF_UNIX){+.+.}-{2:2}:
+        check_prev_add kernel/locking/lockdep.c:3134 [inline]
+        check_prevs_add kernel/locking/lockdep.c:3253 [inline]
+        validate_chain+0x1909/0x5ab0 kernel/locking/lockdep.c:3869
+        __lock_acquire+0x1345/0x1fd0 kernel/locking/lockdep.c:5137
+        lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
+        __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
+        _raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
+        skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
+        unix_dgram_sendmsg+0x15d9/0x2200 net/unix/af_unix.c:2112
+        sock_sendmsg_nosec net/socket.c:730 [inline]
+        __sock_sendmsg net/socket.c:745 [inline]
+        ____sys_sendmsg+0x592/0x890 net/socket.c:2584
+        ___sys_sendmsg net/socket.c:2638 [inline]
+        __sys_sendmmsg+0x3b2/0x730 net/socket.c:2724
+        __do_sys_sendmmsg net/socket.c:2753 [inline]
+        __se_sys_sendmmsg net/socket.c:2750 [inline]
+        __x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2750
+        do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+        do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
+       entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+other info that might help us debug this:
+
+ Possible unsafe locking scenario:
+
+       CPU0                    CPU1
+       ----                    ----
+  lock(&u->lock/1);
+                               lock(rlock-AF_UNIX);
+                               lock(&u->lock/1);
+  lock(rlock-AF_UNIX);
+
+ *** DEADLOCK ***
+
+1 lock held by syz-executor.1/2542:
+  #0: ffff88808b5dfe70 (&u->lock/1){+.+.}-{2:2}, at: unix_dgram_sendmsg+0xfc7/0x2200 net/unix/af_unix.c:2089
+
+stack backtrace:
+CPU: 1 PID: 2542 Comm: syz-executor.1 Not tainted 6.8.0-rc1-syzkaller-00356-g8a696a29c690 #0
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023
+Call Trace:
+ <TASK>
+  __dump_stack lib/dump_stack.c:88 [inline]
+  dump_stack_lvl+0x1e7/0x2d0 lib/dump_stack.c:106
+  check_noncircular+0x366/0x490 kernel/locking/lockdep.c:2187
+  check_prev_add kernel/locking/lockdep.c:3134 [inline]
+  check_prevs_add kernel/locking/lockdep.c:3253 [inline]
+  validate_chain+0x1909/0x5ab0 kernel/locking/lockdep.c:3869
+  __lock_acquire+0x1345/0x1fd0 kernel/locking/lockdep.c:5137
+  lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
+  __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
+  _raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
+  skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
+  unix_dgram_sendmsg+0x15d9/0x2200 net/unix/af_unix.c:2112
+  sock_sendmsg_nosec net/socket.c:730 [inline]
+  __sock_sendmsg net/socket.c:745 [inline]
+  ____sys_sendmsg+0x592/0x890 net/socket.c:2584
+  ___sys_sendmsg net/socket.c:2638 [inline]
+  __sys_sendmmsg+0x3b2/0x730 net/socket.c:2724
+  __do_sys_sendmmsg net/socket.c:2753 [inline]
+  __se_sys_sendmmsg net/socket.c:2750 [inline]
+  __x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2750
+  do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+  do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+RIP: 0033:0x7f26d887cda9
+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:00007f26d95a60c8 EFLAGS: 00000246 ORIG_RAX: 0000000000000133
+RAX: ffffffffffffffda RBX: 00007f26d89abf80 RCX: 00007f26d887cda9
+RDX: 000000000000003e RSI: 00000000200bd000 RDI: 0000000000000004
+RBP: 00007f26d88c947a R08: 0000000000000000 R09: 0000000000000000
+R10: 00000000000008c0 R11: 0000000000000246 R12: 0000000000000000
+R13: 000000000000000b R14: 00007f26d89abf80 R15: 00007ffcfe081a68
+
+Fixes: 2aac7a2cb0d9 ("unix_diag: Pending connections IDs NLA")
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Link: https://lore.kernel.org/r/20240130184235.1620738-1-edumazet@google.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/af_unix.h | 20 ++++++++++++++------
+ net/unix/af_unix.c    | 14 ++++++--------
+ net/unix/diag.c       |  2 +-
+ 3 files changed, 21 insertions(+), 15 deletions(-)
+
+diff --git a/include/net/af_unix.h b/include/net/af_unix.h
+index 49c4640027d8..afd40dce40f3 100644
+--- a/include/net/af_unix.h
++++ b/include/net/af_unix.h
+@@ -46,12 +46,6 @@ struct scm_stat {
+ #define UNIXCB(skb)   (*(struct unix_skb_parms *)&((skb)->cb))
+-#define unix_state_lock(s)    spin_lock(&unix_sk(s)->lock)
+-#define unix_state_unlock(s)  spin_unlock(&unix_sk(s)->lock)
+-#define unix_state_lock_nested(s) \
+-                              spin_lock_nested(&unix_sk(s)->lock, \
+-                              SINGLE_DEPTH_NESTING)
+-
+ /* The AF_UNIX socket */
+ struct unix_sock {
+       /* WARNING: sk has to be the first member */
+@@ -77,6 +71,20 @@ struct unix_sock {
+ #define unix_sk(ptr) container_of_const(ptr, struct unix_sock, sk)
+ #define unix_peer(sk) (unix_sk(sk)->peer)
++#define unix_state_lock(s)    spin_lock(&unix_sk(s)->lock)
++#define unix_state_unlock(s)  spin_unlock(&unix_sk(s)->lock)
++enum unix_socket_lock_class {
++      U_LOCK_NORMAL,
++      U_LOCK_SECOND,  /* for double locking, see unix_state_double_lock(). */
++      U_LOCK_DIAG, /* used while dumping icons, see sk_diag_dump_icons(). */
++};
++
++static inline void unix_state_lock_nested(struct sock *sk,
++                                 enum unix_socket_lock_class subclass)
++{
++      spin_lock_nested(&unix_sk(sk)->lock, subclass);
++}
++
+ #define peer_wait peer_wq.wait
+ long unix_inq_len(struct sock *sk);
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index 1e1a88bd4e68..510b1d6758db 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -1343,13 +1343,11 @@ static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)
+               unix_state_lock(sk1);
+               return;
+       }
+-      if (sk1 < sk2) {
+-              unix_state_lock(sk1);
+-              unix_state_lock_nested(sk2);
+-      } else {
+-              unix_state_lock(sk2);
+-              unix_state_lock_nested(sk1);
+-      }
++      if (sk1 > sk2)
++              swap(sk1, sk2);
++
++      unix_state_lock(sk1);
++      unix_state_lock_nested(sk2, U_LOCK_SECOND);
+ }
+ static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)
+@@ -1582,7 +1580,7 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
+               goto out_unlock;
+       }
+-      unix_state_lock_nested(sk);
++      unix_state_lock_nested(sk, U_LOCK_SECOND);
+       if (sk->sk_state != st) {
+               unix_state_unlock(sk);
+diff --git a/net/unix/diag.c b/net/unix/diag.c
+index 616b55c5b890..3438b7af09af 100644
+--- a/net/unix/diag.c
++++ b/net/unix/diag.c
+@@ -84,7 +84,7 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)
+                        * queue lock. With the other's queue locked it's
+                        * OK to lock the state.
+                        */
+-                      unix_state_lock_nested(req);
++                      unix_state_lock_nested(req, U_LOCK_DIAG);
+                       peer = unix_sk(req)->peer;
+                       buf[i++] = (peer ? sock_i_ino(peer) : 0);
+                       unix_state_unlock(req);
+-- 
+2.43.0
+
diff --git a/queue-6.6/bridge-mcast-fix-disabled-snooping-after-long-uptime.patch b/queue-6.6/bridge-mcast-fix-disabled-snooping-after-long-uptime.patch
new file mode 100644 (file)
index 0000000..cf8aa3e
--- /dev/null
@@ -0,0 +1,158 @@
+From 92018ec1c45973af50f0035bf6ed95e008192b42 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 27 Jan 2024 18:50:32 +0100
+Subject: bridge: mcast: fix disabled snooping after long uptime
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Linus Lüssing <linus.luessing@c0d3.blue>
+
+[ Upstream commit f5c3eb4b7251baba5cd72c9e93920e710ac8194a ]
+
+The original idea of the delay_time check was to not apply multicast
+snooping too early when an MLD querier appears. And to instead wait at
+least for MLD reports to arrive before switching from flooding to group
+based, MLD snooped forwarding, to avoid temporary packet loss.
+
+However in a batman-adv mesh network it was noticed that after 248 days of
+uptime 32bit MIPS based devices would start to signal that they had
+stopped applying multicast snooping due to missing queriers - even though
+they were the elected querier and still sending MLD queries themselves.
+
+While time_is_before_jiffies() generally is safe against jiffies
+wrap-arounds, like the code comments in jiffies.h explain, it won't
+be able to track a difference larger than ULONG_MAX/2. With a 32bit
+large jiffies and one jiffies tick every 10ms (CONFIG_HZ=100) on these MIPS
+devices running OpenWrt this would result in a difference larger than
+ULONG_MAX/2 after 248 (= 2^32/100/60/60/24/2) days and
+time_is_before_jiffies() would then start to return false instead of
+true. Leading to multicast snooping not being applied to multicast
+packets anymore.
+
+Fix this issue by using a proper timer_list object which won't have this
+ULONG_MAX/2 difference limitation.
+
+Fixes: b00589af3b04 ("bridge: disable snooping if there is no querier")
+Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
+Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
+Link: https://lore.kernel.org/r/20240127175033.9640-1-linus.luessing@c0d3.blue
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bridge/br_multicast.c | 20 +++++++++++++++-----
+ net/bridge/br_private.h   |  4 ++--
+ 2 files changed, 17 insertions(+), 7 deletions(-)
+
+diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
+index 96d1fc78dd39..38373b4fb7dd 100644
+--- a/net/bridge/br_multicast.c
++++ b/net/bridge/br_multicast.c
+@@ -1761,6 +1761,10 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t)
+ }
+ #endif
++static void br_multicast_query_delay_expired(struct timer_list *t)
++{
++}
++
+ static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx,
+                                           struct br_ip *ip,
+                                           struct sk_buff *skb)
+@@ -3197,7 +3201,7 @@ br_multicast_update_query_timer(struct net_bridge_mcast *brmctx,
+                               unsigned long max_delay)
+ {
+       if (!timer_pending(&query->timer))
+-              query->delay_time = jiffies + max_delay;
++              mod_timer(&query->delay_timer, jiffies + max_delay);
+       mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval);
+ }
+@@ -4040,13 +4044,11 @@ void br_multicast_ctx_init(struct net_bridge *br,
+       brmctx->multicast_querier_interval = 255 * HZ;
+       brmctx->multicast_membership_interval = 260 * HZ;
+-      brmctx->ip4_other_query.delay_time = 0;
+       brmctx->ip4_querier.port_ifidx = 0;
+       seqcount_spinlock_init(&brmctx->ip4_querier.seq, &br->multicast_lock);
+       brmctx->multicast_igmp_version = 2;
+ #if IS_ENABLED(CONFIG_IPV6)
+       brmctx->multicast_mld_version = 1;
+-      brmctx->ip6_other_query.delay_time = 0;
+       brmctx->ip6_querier.port_ifidx = 0;
+       seqcount_spinlock_init(&brmctx->ip6_querier.seq, &br->multicast_lock);
+ #endif
+@@ -4055,6 +4057,8 @@ void br_multicast_ctx_init(struct net_bridge *br,
+                   br_ip4_multicast_local_router_expired, 0);
+       timer_setup(&brmctx->ip4_other_query.timer,
+                   br_ip4_multicast_querier_expired, 0);
++      timer_setup(&brmctx->ip4_other_query.delay_timer,
++                  br_multicast_query_delay_expired, 0);
+       timer_setup(&brmctx->ip4_own_query.timer,
+                   br_ip4_multicast_query_expired, 0);
+ #if IS_ENABLED(CONFIG_IPV6)
+@@ -4062,6 +4066,8 @@ void br_multicast_ctx_init(struct net_bridge *br,
+                   br_ip6_multicast_local_router_expired, 0);
+       timer_setup(&brmctx->ip6_other_query.timer,
+                   br_ip6_multicast_querier_expired, 0);
++      timer_setup(&brmctx->ip6_other_query.delay_timer,
++                  br_multicast_query_delay_expired, 0);
+       timer_setup(&brmctx->ip6_own_query.timer,
+                   br_ip6_multicast_query_expired, 0);
+ #endif
+@@ -4196,10 +4202,12 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
+ {
+       del_timer_sync(&brmctx->ip4_mc_router_timer);
+       del_timer_sync(&brmctx->ip4_other_query.timer);
++      del_timer_sync(&brmctx->ip4_other_query.delay_timer);
+       del_timer_sync(&brmctx->ip4_own_query.timer);
+ #if IS_ENABLED(CONFIG_IPV6)
+       del_timer_sync(&brmctx->ip6_mc_router_timer);
+       del_timer_sync(&brmctx->ip6_other_query.timer);
++      del_timer_sync(&brmctx->ip6_other_query.delay_timer);
+       del_timer_sync(&brmctx->ip6_own_query.timer);
+ #endif
+ }
+@@ -4642,13 +4650,15 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
+       max_delay = brmctx->multicast_query_response_interval;
+       if (!timer_pending(&brmctx->ip4_other_query.timer))
+-              brmctx->ip4_other_query.delay_time = jiffies + max_delay;
++              mod_timer(&brmctx->ip4_other_query.delay_timer,
++                        jiffies + max_delay);
+       br_multicast_start_querier(brmctx, &brmctx->ip4_own_query);
+ #if IS_ENABLED(CONFIG_IPV6)
+       if (!timer_pending(&brmctx->ip6_other_query.timer))
+-              brmctx->ip6_other_query.delay_time = jiffies + max_delay;
++              mod_timer(&brmctx->ip6_other_query.delay_timer,
++                        jiffies + max_delay);
+       br_multicast_start_querier(brmctx, &brmctx->ip6_own_query);
+ #endif
+diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
+index a1f4acfa6994..82e63908dce8 100644
+--- a/net/bridge/br_private.h
++++ b/net/bridge/br_private.h
+@@ -78,7 +78,7 @@ struct bridge_mcast_own_query {
+ /* other querier */
+ struct bridge_mcast_other_query {
+       struct timer_list               timer;
+-      unsigned long                   delay_time;
++      struct timer_list               delay_timer;
+ };
+ /* selected querier */
+@@ -1149,7 +1149,7 @@ __br_multicast_querier_exists(struct net_bridge_mcast *brmctx,
+               own_querier_enabled = false;
+       }
+-      return time_is_before_jiffies(querier->delay_time) &&
++      return !timer_pending(&querier->delay_timer) &&
+              (own_querier_enabled || timer_pending(&querier->timer));
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/devlink-fix-referring-to-hw_addr-attribute-during-st.patch b/queue-6.6/devlink-fix-referring-to-hw_addr-attribute-during-st.patch
new file mode 100644 (file)
index 0000000..85e31aa
--- /dev/null
@@ -0,0 +1,41 @@
+From 8c9d370ec83c0cb0da458ac6e3f1c1ad324bff46 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 21:10:59 +0200
+Subject: devlink: Fix referring to hw_addr attribute during state validation
+
+From: Parav Pandit <parav@nvidia.com>
+
+[ Upstream commit 1a89e24f8bfd3e3562d69709c9d9cd185ded869b ]
+
+When port function state change is requested, and when the driver
+does not support it, it refers to the hw address attribute instead
+of state attribute. Seems like a copy paste error.
+
+Fix it by referring to the port function state attribute.
+
+Fixes: c0bea69d1ca7 ("devlink: Validate port function request")
+Signed-off-by: Parav Pandit <parav@nvidia.com>
+Reviewed-by: Jiri Pirko <jiri@nvidia.com>
+Link: https://lore.kernel.org/r/20240129191059.129030-1-parav@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/devlink/port.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/devlink/port.c b/net/devlink/port.c
+index 4763b42885fb..91ba1ca0f355 100644
+--- a/net/devlink/port.c
++++ b/net/devlink/port.c
+@@ -665,7 +665,7 @@ static int devlink_port_function_validate(struct devlink_port *devlink_port,
+               return -EOPNOTSUPP;
+       }
+       if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) {
+-              NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
++              NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FN_ATTR_STATE],
+                                   "Function does not support state setting");
+               return -EOPNOTSUPP;
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/e1000e-correct-maximum-frequency-adjustment-values.patch b/queue-6.6/e1000e-correct-maximum-frequency-adjustment-values.patch
new file mode 100644 (file)
index 0000000..17d6b2d
--- /dev/null
@@ -0,0 +1,175 @@
+From b4dc3fec7b327224d67b8016e0d277293ef4ec63 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Dec 2023 18:05:52 -0800
+Subject: e1000e: correct maximum frequency adjustment values
+
+From: Jacob Keller <jacob.e.keller@intel.com>
+
+[ Upstream commit f1f6a6b1830a8f1dc92ee26fae76333f446b0663 ]
+
+The e1000e driver supports hardware with a variety of different clock
+speeds, and thus a variety of different increment values used for
+programming its PTP hardware clock.
+
+The values currently programmed in e1000e_ptp_init are incorrect. In
+particular, only two maximum adjustments are used: 24000000 - 1, and
+600000000 - 1. These were originally intended to be used with the 96 MHz
+clock and the 25 MHz clock.
+
+Both of these values are actually slightly too high. For the 96 MHz clock,
+the actual maximum value that can safely be programmed is 23,999,938. For
+the 25 MHz clock, the maximum value is 599,999,904.
+
+Worse, several devices use a 24 MHz clock or a 38.4 MHz clock. These parts
+are incorrectly assigned one of either the 24million or 600million values.
+For the 24 MHz clock, this is not a significant issue: its current
+increment value can support an adjustment up to 7billion in the positive
+direction. However, the 38.4 KHz clock uses an increment value which can
+only support up to 230,769,157 before it starts overflowing.
+
+To understand where these values come from, consider that frequency
+adjustments have the form of:
+
+new_incval = base_incval + (base_incval * adjustment) / (unit of adjustment)
+
+The maximum adjustment is reported in terms of parts per billion:
+new_incval = base_incval + (base_incval * adjustment) / 1 billion
+
+The largest possible adjustment is thus given by the following:
+max_incval = base_incval + (base_incval * max_adj) / 1 billion
+
+Re-arranging to solve for max_adj:
+max_adj = (max_incval - base_incval) * 1 billion / base_incval
+
+We also need to ensure that negative adjustments cannot underflow. This can
+be achieved simply by ensuring max_adj is always less than 1 billion.
+
+Introduce new macros in e1000.h codifying the maximum adjustment in PPB for
+each frequency given its associated increment values. Also clarify where
+these values come from by commenting about the above equations.
+
+Replace the switch statement in e1000e_ptp_init with one which mirrors the
+increment value switch statement from e1000e_get_base_timinica. For each
+device, assign the appropriate maximum adjustment based on its frequency.
+Some parts can have one of two frequency modes as determined by
+E1000_TSYNCRXCTL_SYSCFI.
+
+Since the new flow directly matches the assignments in
+e1000e_get_base_timinca, and uses well defined macro names, it is much
+easier to verify that the resulting maximum adjustments are correct. It
+also avoids difficult to parse construction such as the "hw->mac.type <
+e1000_phc_lpt", and the use of fallthrough which was especially confusing
+when combined with a conditional block.
+
+Note that I believe the current increment value configuration used for
+24MHz clocks is sub-par, as it leaves at least 3 extra bits available in
+the INCVALUE register. However, fixing that requires more careful review of
+the clock rate and associated values.
+
+Reported-by: Trey Harrison <harrisondigitalmedia@gmail.com>
+Fixes: 68fe1d5da548 ("e1000e: Add Support for 38.4MHZ frequency")
+Fixes: d89777bf0e42 ("e1000e: add support for IEEE-1588 PTP")
+Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
+Tested-by: Naama Meir <naamax.meir@linux.intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/e1000e/e1000.h | 20 ++++++++++++++++++++
+ drivers/net/ethernet/intel/e1000e/ptp.c   | 22 +++++++++++++++-------
+ 2 files changed, 35 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h
+index a187582d2299..ba9c19e6994c 100644
+--- a/drivers/net/ethernet/intel/e1000e/e1000.h
++++ b/drivers/net/ethernet/intel/e1000e/e1000.h
+@@ -360,23 +360,43 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca);
+  * As a result, a shift of INCVALUE_SHIFT_n is used to fit a value of
+  * INCVALUE_n into the TIMINCA register allowing 32+8+(24-INCVALUE_SHIFT_n)
+  * bits to count nanoseconds leaving the rest for fractional nonseconds.
++ *
++ * Any given INCVALUE also has an associated maximum adjustment value. This
++ * maximum adjustment value is the largest increase (or decrease) which can be
++ * safely applied without overflowing the INCVALUE. Since INCVALUE has
++ * a maximum range of 24 bits, its largest value is 0xFFFFFF.
++ *
++ * To understand where the maximum value comes from, consider the following
++ * equation:
++ *
++ *   new_incval = base_incval + (base_incval * adjustment) / 1billion
++ *
++ * To avoid overflow that means:
++ *   max_incval = base_incval + (base_incval * max_adj) / billion
++ *
++ * Re-arranging:
++ *   max_adj = floor(((max_incval - base_incval) * 1billion) / 1billion)
+  */
+ #define INCVALUE_96MHZ                125
+ #define INCVALUE_SHIFT_96MHZ  17
+ #define INCPERIOD_SHIFT_96MHZ 2
+ #define INCPERIOD_96MHZ               (12 >> INCPERIOD_SHIFT_96MHZ)
++#define MAX_PPB_96MHZ         23999900 /* 23,999,900 ppb */
+ #define INCVALUE_25MHZ                40
+ #define INCVALUE_SHIFT_25MHZ  18
+ #define INCPERIOD_25MHZ               1
++#define MAX_PPB_25MHZ         599999900 /* 599,999,900 ppb */
+ #define INCVALUE_24MHZ                125
+ #define INCVALUE_SHIFT_24MHZ  14
+ #define INCPERIOD_24MHZ               3
++#define MAX_PPB_24MHZ         999999999 /* 999,999,999 ppb */
+ #define INCVALUE_38400KHZ     26
+ #define INCVALUE_SHIFT_38400KHZ       19
+ #define INCPERIOD_38400KHZ    1
++#define MAX_PPB_38400KHZ      230769100 /* 230,769,100 ppb */
+ /* Another drawback of scaling the incvalue by a large factor is the
+  * 64-bit SYSTIM register overflows more quickly.  This is dealt with
+diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c
+index 02d871bc112a..bbcfd529399b 100644
+--- a/drivers/net/ethernet/intel/e1000e/ptp.c
++++ b/drivers/net/ethernet/intel/e1000e/ptp.c
+@@ -280,8 +280,17 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
+       switch (hw->mac.type) {
+       case e1000_pch2lan:
++              adapter->ptp_clock_info.max_adj = MAX_PPB_96MHZ;
++              break;
+       case e1000_pch_lpt:
++              if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)
++                      adapter->ptp_clock_info.max_adj = MAX_PPB_96MHZ;
++              else
++                      adapter->ptp_clock_info.max_adj = MAX_PPB_25MHZ;
++              break;
+       case e1000_pch_spt:
++              adapter->ptp_clock_info.max_adj = MAX_PPB_24MHZ;
++              break;
+       case e1000_pch_cnp:
+       case e1000_pch_tgp:
+       case e1000_pch_adp:
+@@ -289,15 +298,14 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
+       case e1000_pch_lnp:
+       case e1000_pch_ptp:
+       case e1000_pch_nvp:
+-              if ((hw->mac.type < e1000_pch_lpt) ||
+-                  (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)) {
+-                      adapter->ptp_clock_info.max_adj = 24000000 - 1;
+-                      break;
+-              }
+-              fallthrough;
++              if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)
++                      adapter->ptp_clock_info.max_adj = MAX_PPB_24MHZ;
++              else
++                      adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ;
++              break;
+       case e1000_82574:
+       case e1000_82583:
+-              adapter->ptp_clock_info.max_adj = 600000000 - 1;
++              adapter->ptp_clock_info.max_adj = MAX_PPB_25MHZ;
+               break;
+       default:
+               break;
+-- 
+2.43.0
+
diff --git a/queue-6.6/gve-fix-skb-truesize-underestimation.patch b/queue-6.6/gve-fix-skb-truesize-underestimation.patch
new file mode 100644 (file)
index 0000000..91ebe31
--- /dev/null
@@ -0,0 +1,60 @@
+From a136392c72e50b3986cc26c5cf834d4d0e1a0720 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 08:10:25 -0800
+Subject: gve: Fix skb truesize underestimation
+
+From: Praveen Kaligineedi <pkaligineedi@google.com>
+
+[ Upstream commit 534326711000c318fe1523c77308450522baa499 ]
+
+For a skb frag with a newly allocated copy page, the true size is
+incorrectly set to packet buffer size. It should be set to PAGE_SIZE
+instead.
+
+Fixes: 82fd151d38d9 ("gve: Reduce alloc and copy costs in the GQ rx path")
+Signed-off-by: Praveen Kaligineedi <pkaligineedi@google.com>
+Link: https://lore.kernel.org/r/20240124161025.1819836-1-pkaligineedi@google.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/google/gve/gve_rx.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/google/gve/gve_rx.c b/drivers/net/ethernet/google/gve/gve_rx.c
+index 73655347902d..93ff7c8ec905 100644
+--- a/drivers/net/ethernet/google/gve/gve_rx.c
++++ b/drivers/net/ethernet/google/gve/gve_rx.c
+@@ -362,7 +362,7 @@ static enum pkt_hash_types gve_rss_type(__be16 pkt_flags)
+ static struct sk_buff *gve_rx_add_frags(struct napi_struct *napi,
+                                       struct gve_rx_slot_page_info *page_info,
+-                                      u16 packet_buffer_size, u16 len,
++                                      unsigned int truesize, u16 len,
+                                       struct gve_rx_ctx *ctx)
+ {
+       u32 offset = page_info->page_offset + page_info->pad;
+@@ -395,10 +395,10 @@ static struct sk_buff *gve_rx_add_frags(struct napi_struct *napi,
+       if (skb != ctx->skb_head) {
+               ctx->skb_head->len += len;
+               ctx->skb_head->data_len += len;
+-              ctx->skb_head->truesize += packet_buffer_size;
++              ctx->skb_head->truesize += truesize;
+       }
+       skb_add_rx_frag(skb, num_frags, page_info->page,
+-                      offset, len, packet_buffer_size);
++                      offset, len, truesize);
+       return ctx->skb_head;
+ }
+@@ -492,7 +492,7 @@ static struct sk_buff *gve_rx_copy_to_pool(struct gve_rx_ring *rx,
+               memcpy(alloc_page_info.page_address, src, page_info->pad + len);
+               skb = gve_rx_add_frags(napi, &alloc_page_info,
+-                                     rx->packet_buffer_size,
++                                     PAGE_SIZE,
+                                      len, ctx);
+               u64_stats_update_begin(&rx->statss);
+-- 
+2.43.0
+
diff --git a/queue-6.6/hid-hidraw-fix-a-problem-of-memory-leak-in-hidraw_re.patch b/queue-6.6/hid-hidraw-fix-a-problem-of-memory-leak-in-hidraw_re.patch
new file mode 100644 (file)
index 0000000..59d3f69
--- /dev/null
@@ -0,0 +1,43 @@
+From fa7fa451927ae3bbf99680655616640ed701b44e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Jan 2024 14:32:26 +0800
+Subject: HID: hidraw: fix a problem of memory leak in hidraw_release()
+
+From: Su Hui <suhui@nfschina.com>
+
+[ Upstream commit a3bdcdd022c68942a774e8e63424cc11c85aab78 ]
+
+'struct hidraw_list' is a circular queue whose head can be smaller than
+tail. Using 'list->tail != list->head' to release all memory that should
+be released.
+
+Fixes: a5623a203cff ("HID: hidraw: fix memory leak in hidraw_release()")
+Signed-off-by: Su Hui <suhui@nfschina.com>
+Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hidraw.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
+index 13c8dd8cd350..2bc762d31ac7 100644
+--- a/drivers/hid/hidraw.c
++++ b/drivers/hid/hidraw.c
+@@ -357,8 +357,11 @@ static int hidraw_release(struct inode * inode, struct file * file)
+       down_write(&minors_rwsem);
+       spin_lock_irqsave(&hidraw_table[minor]->list_lock, flags);
+-      for (int i = list->tail; i < list->head; i++)
+-              kfree(list->buffer[i].value);
++      while (list->tail != list->head) {
++              kfree(list->buffer[list->tail].value);
++              list->buffer[list->tail].value = NULL;
++              list->tail = (list->tail + 1) & (HIDRAW_BUFFER_SIZE - 1);
++      }
+       list_del(&list->node);
+       spin_unlock_irqrestore(&hidraw_table[minor]->list_lock, flags);
+       kfree(list);
+-- 
+2.43.0
+
diff --git a/queue-6.6/ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch b/queue-6.6/ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch
new file mode 100644 (file)
index 0000000..d5622f3
--- /dev/null
@@ -0,0 +1,139 @@
+From 23ef75ff153a8563e7d44e06f2016e0a978b91fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Jan 2024 17:05:57 +0000
+Subject: ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 8d975c15c0cd744000ca386247432d57b21f9df0 ]
+
+syzbot found __ip6_tnl_rcv() could access unitiliazed data [1].
+
+Call pskb_inet_may_pull() to fix this, and initialize ipv6h
+variable after this call as it can change skb->head.
+
+[1]
+ BUG: KMSAN: uninit-value in __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline]
+ BUG: KMSAN: uninit-value in INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline]
+ BUG: KMSAN: uninit-value in IP6_ECN_decapsulate+0x7df/0x1e50 include/net/inet_ecn.h:321
+  __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline]
+  INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline]
+  IP6_ECN_decapsulate+0x7df/0x1e50 include/net/inet_ecn.h:321
+  ip6ip6_dscp_ecn_decapsulate+0x178/0x1b0 net/ipv6/ip6_tunnel.c:727
+  __ip6_tnl_rcv+0xd4e/0x1590 net/ipv6/ip6_tunnel.c:845
+  ip6_tnl_rcv+0xce/0x100 net/ipv6/ip6_tunnel.c:888
+ gre_rcv+0x143f/0x1870
+  ip6_protocol_deliver_rcu+0xda6/0x2a60 net/ipv6/ip6_input.c:438
+  ip6_input_finish net/ipv6/ip6_input.c:483 [inline]
+  NF_HOOK include/linux/netfilter.h:314 [inline]
+  ip6_input+0x15d/0x430 net/ipv6/ip6_input.c:492
+  ip6_mc_input+0xa7e/0xc80 net/ipv6/ip6_input.c:586
+  dst_input include/net/dst.h:461 [inline]
+  ip6_rcv_finish+0x5db/0x870 net/ipv6/ip6_input.c:79
+  NF_HOOK include/linux/netfilter.h:314 [inline]
+  ipv6_rcv+0xda/0x390 net/ipv6/ip6_input.c:310
+  __netif_receive_skb_one_core net/core/dev.c:5532 [inline]
+  __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5646
+  netif_receive_skb_internal net/core/dev.c:5732 [inline]
+  netif_receive_skb+0x58/0x660 net/core/dev.c:5791
+  tun_rx_batched+0x3ee/0x980 drivers/net/tun.c:1555
+  tun_get_user+0x53af/0x66d0 drivers/net/tun.c:2002
+  tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2048
+  call_write_iter include/linux/fs.h:2084 [inline]
+  new_sync_write fs/read_write.c:497 [inline]
+  vfs_write+0x786/0x1200 fs/read_write.c:590
+  ksys_write+0x20f/0x4c0 fs/read_write.c:643
+  __do_sys_write fs/read_write.c:655 [inline]
+  __se_sys_write fs/read_write.c:652 [inline]
+  __x64_sys_write+0x93/0xd0 fs/read_write.c:652
+  do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+  do_syscall_64+0x6d/0x140 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+Uninit was created at:
+  slab_post_alloc_hook+0x129/0xa70 mm/slab.h:768
+  slab_alloc_node mm/slub.c:3478 [inline]
+  kmem_cache_alloc_node+0x5e9/0xb10 mm/slub.c:3523
+  kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:560
+  __alloc_skb+0x318/0x740 net/core/skbuff.c:651
+  alloc_skb include/linux/skbuff.h:1286 [inline]
+  alloc_skb_with_frags+0xc8/0xbd0 net/core/skbuff.c:6334
+  sock_alloc_send_pskb+0xa80/0xbf0 net/core/sock.c:2787
+  tun_alloc_skb drivers/net/tun.c:1531 [inline]
+  tun_get_user+0x1e8a/0x66d0 drivers/net/tun.c:1846
+  tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2048
+  call_write_iter include/linux/fs.h:2084 [inline]
+  new_sync_write fs/read_write.c:497 [inline]
+  vfs_write+0x786/0x1200 fs/read_write.c:590
+  ksys_write+0x20f/0x4c0 fs/read_write.c:643
+  __do_sys_write fs/read_write.c:655 [inline]
+  __se_sys_write fs/read_write.c:652 [inline]
+  __x64_sys_write+0x93/0xd0 fs/read_write.c:652
+  do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+  do_syscall_64+0x6d/0x140 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+CPU: 0 PID: 5034 Comm: syz-executor331 Not tainted 6.7.0-syzkaller-00562-g9f8413c4a66f #0
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023
+
+Fixes: 0d3c703a9d17 ("ipv6: Cleanup IPv6 tunnel receive path")
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://lore.kernel.org/r/20240125170557.2663942-1-edumazet@google.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/ip6_tunnel.c | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
+index 46c19bd48990..9bbabf750a21 100644
+--- a/net/ipv6/ip6_tunnel.c
++++ b/net/ipv6/ip6_tunnel.c
+@@ -796,8 +796,8 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
+                                               struct sk_buff *skb),
+                        bool log_ecn_err)
+ {
+-      const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
+-      int err;
++      const struct ipv6hdr *ipv6h;
++      int nh, err;
+       if ((!(tpi->flags & TUNNEL_CSUM) &&
+            (tunnel->parms.i_flags & TUNNEL_CSUM)) ||
+@@ -829,7 +829,6 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
+                       goto drop;
+               }
+-              ipv6h = ipv6_hdr(skb);
+               skb->protocol = eth_type_trans(skb, tunnel->dev);
+               skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
+       } else {
+@@ -837,7 +836,23 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
+               skb_reset_mac_header(skb);
+       }
++      /* Save offset of outer header relative to skb->head,
++       * because we are going to reset the network header to the inner header
++       * and might change skb->head.
++       */
++      nh = skb_network_header(skb) - skb->head;
++
+       skb_reset_network_header(skb);
++
++      if (!pskb_inet_may_pull(skb)) {
++              DEV_STATS_INC(tunnel->dev, rx_length_errors);
++              DEV_STATS_INC(tunnel->dev, rx_errors);
++              goto drop;
++      }
++
++      /* Get the outer header. */
++      ipv6h = (struct ipv6hdr *)(skb->head + nh);
++
+       memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
+       __skb_tunnel_rx(skb, tunnel->dev, tunnel->net);
+-- 
+2.43.0
+
diff --git a/queue-6.6/ipmr-fix-kernel-panic-when-forwarding-mcast-packets.patch b/queue-6.6/ipmr-fix-kernel-panic-when-forwarding-mcast-packets.patch
new file mode 100644 (file)
index 0000000..5a3980b
--- /dev/null
@@ -0,0 +1,170 @@
+From 89a198ff69fe47d43bd7f0bf1e3c7227db26a2e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Jan 2024 15:18:47 +0100
+Subject: ipmr: fix kernel panic when forwarding mcast packets
+
+From: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+
+[ Upstream commit e622502c310f1069fd9f41cd38210553115f610a ]
+
+The stacktrace was:
+[   86.305548] BUG: kernel NULL pointer dereference, address: 0000000000000092
+[   86.306815] #PF: supervisor read access in kernel mode
+[   86.307717] #PF: error_code(0x0000) - not-present page
+[   86.308624] PGD 0 P4D 0
+[   86.309091] Oops: 0000 [#1] PREEMPT SMP NOPTI
+[   86.309883] CPU: 2 PID: 3139 Comm: pimd Tainted: G     U             6.8.0-6wind-knet #1
+[   86.311027] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.11.1-0-g0551a4be2c-prebuilt.qemu-project.org 04/01/2014
+[   86.312728] RIP: 0010:ip_mr_forward (/build/work/knet/net/ipv4/ipmr.c:1985)
+[ 86.313399] Code: f9 1f 0f 87 85 03 00 00 48 8d 04 5b 48 8d 04 83 49 8d 44 c5 00 48 8b 40 70 48 39 c2 0f 84 d9 00 00 00 49 8b 46 58 48 83 e0 fe <80> b8 92 00 00 00 00 0f 84 55 ff ff ff 49 83 47 38 01 45 85 e4 0f
+[   86.316565] RSP: 0018:ffffad21c0583ae0 EFLAGS: 00010246
+[   86.317497] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
+[   86.318596] RDX: ffff9559cb46c000 RSI: 0000000000000000 RDI: 0000000000000000
+[   86.319627] RBP: ffffad21c0583b30 R08: 0000000000000000 R09: 0000000000000000
+[   86.320650] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001
+[   86.321672] R13: ffff9559c093a000 R14: ffff9559cc00b800 R15: ffff9559c09c1d80
+[   86.322873] FS:  00007f85db661980(0000) GS:ffff955a79d00000(0000) knlGS:0000000000000000
+[   86.324291] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+[   86.325314] CR2: 0000000000000092 CR3: 000000002f13a000 CR4: 0000000000350ef0
+[   86.326589] Call Trace:
+[   86.327036]  <TASK>
+[   86.327434] ? show_regs (/build/work/knet/arch/x86/kernel/dumpstack.c:479)
+[   86.328049] ? __die (/build/work/knet/arch/x86/kernel/dumpstack.c:421 /build/work/knet/arch/x86/kernel/dumpstack.c:434)
+[   86.328508] ? page_fault_oops (/build/work/knet/arch/x86/mm/fault.c:707)
+[   86.329107] ? do_user_addr_fault (/build/work/knet/arch/x86/mm/fault.c:1264)
+[   86.329756] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.330350] ? __irq_work_queue_local (/build/work/knet/kernel/irq_work.c:111 (discriminator 1))
+[   86.331013] ? exc_page_fault (/build/work/knet/./arch/x86/include/asm/paravirt.h:693 /build/work/knet/arch/x86/mm/fault.c:1515 /build/work/knet/arch/x86/mm/fault.c:1563)
+[   86.331702] ? asm_exc_page_fault (/build/work/knet/./arch/x86/include/asm/idtentry.h:570)
+[   86.332468] ? ip_mr_forward (/build/work/knet/net/ipv4/ipmr.c:1985)
+[   86.333183] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.333920] ipmr_mfc_add (/build/work/knet/./include/linux/rcupdate.h:782 /build/work/knet/net/ipv4/ipmr.c:1009 /build/work/knet/net/ipv4/ipmr.c:1273)
+[   86.334583] ? __pfx_ipmr_hash_cmp (/build/work/knet/net/ipv4/ipmr.c:363)
+[   86.335357] ip_mroute_setsockopt (/build/work/knet/net/ipv4/ipmr.c:1470)
+[   86.336135] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.336854] ? ip_mroute_setsockopt (/build/work/knet/net/ipv4/ipmr.c:1470)
+[   86.337679] do_ip_setsockopt (/build/work/knet/net/ipv4/ip_sockglue.c:944)
+[   86.338408] ? __pfx_unix_stream_read_actor (/build/work/knet/net/unix/af_unix.c:2862)
+[   86.339232] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.339809] ? aa_sk_perm (/build/work/knet/security/apparmor/include/cred.h:153 /build/work/knet/security/apparmor/net.c:181)
+[   86.340342] ip_setsockopt (/build/work/knet/net/ipv4/ip_sockglue.c:1415)
+[   86.340859] raw_setsockopt (/build/work/knet/net/ipv4/raw.c:836)
+[   86.341408] ? security_socket_setsockopt (/build/work/knet/security/security.c:4561 (discriminator 13))
+[   86.342116] sock_common_setsockopt (/build/work/knet/net/core/sock.c:3716)
+[   86.342747] do_sock_setsockopt (/build/work/knet/net/socket.c:2313)
+[   86.343363] __sys_setsockopt (/build/work/knet/./include/linux/file.h:32 /build/work/knet/net/socket.c:2336)
+[   86.344020] __x64_sys_setsockopt (/build/work/knet/net/socket.c:2340)
+[   86.344766] do_syscall_64 (/build/work/knet/arch/x86/entry/common.c:52 /build/work/knet/arch/x86/entry/common.c:83)
+[   86.345433] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.346161] ? syscall_exit_work (/build/work/knet/./include/linux/audit.h:357 /build/work/knet/kernel/entry/common.c:160)
+[   86.346938] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.347657] ? syscall_exit_to_user_mode (/build/work/knet/kernel/entry/common.c:215)
+[   86.348538] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223)
+[   86.349262] ? do_syscall_64 (/build/work/knet/./arch/x86/include/asm/cpufeature.h:171 /build/work/knet/arch/x86/entry/common.c:98)
+[   86.349971] entry_SYSCALL_64_after_hwframe (/build/work/knet/arch/x86/entry/entry_64.S:129)
+
+The original packet in ipmr_cache_report() may be queued and then forwarded
+with ip_mr_forward(). This last function has the assumption that the skb
+dst is set.
+
+After the below commit, the skb dst is dropped by ipv4_pktinfo_prepare(),
+which causes the oops.
+
+Fixes: bb7403655b3c ("ipmr: support IP_PKTINFO on cache report IGMP msg")
+Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Link: https://lore.kernel.org/r/20240125141847.1931933-1-nicolas.dichtel@6wind.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/ip.h       | 2 +-
+ net/ipv4/ip_sockglue.c | 6 ++++--
+ net/ipv4/ipmr.c        | 2 +-
+ net/ipv4/raw.c         | 2 +-
+ net/ipv4/udp.c         | 2 +-
+ 5 files changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/include/net/ip.h b/include/net/ip.h
+index 3489a1cca5e7..162cf2d2f841 100644
+--- a/include/net/ip.h
++++ b/include/net/ip.h
+@@ -758,7 +758,7 @@ int ip_options_rcv_srr(struct sk_buff *skb, struct net_device *dev);
+  *    Functions provided by ip_sockglue.c
+  */
+-void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb);
++void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb, bool drop_dst);
+ void ip_cmsg_recv_offset(struct msghdr *msg, struct sock *sk,
+                        struct sk_buff *skb, int tlen, int offset);
+ int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
+diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
+index cce9cb25f3b3..1a6952921e07 100644
+--- a/net/ipv4/ip_sockglue.c
++++ b/net/ipv4/ip_sockglue.c
+@@ -1369,12 +1369,13 @@ int do_ip_setsockopt(struct sock *sk, int level, int optname,
+  * ipv4_pktinfo_prepare - transfer some info from rtable to skb
+  * @sk: socket
+  * @skb: buffer
++ * @drop_dst: if true, drops skb dst
+  *
+  * To support IP_CMSG_PKTINFO option, we store rt_iif and specific
+  * destination in skb->cb[] before dst drop.
+  * This way, receiver doesn't make cache line misses to read rtable.
+  */
+-void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
++void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb, bool drop_dst)
+ {
+       struct in_pktinfo *pktinfo = PKTINFO_SKB_CB(skb);
+       bool prepare = inet_test_bit(PKTINFO, sk) ||
+@@ -1403,7 +1404,8 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
+               pktinfo->ipi_ifindex = 0;
+               pktinfo->ipi_spec_dst.s_addr = 0;
+       }
+-      skb_dst_drop(skb);
++      if (drop_dst)
++              skb_dst_drop(skb);
+ }
+ int ip_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
+diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
+index 0063a237253b..e49242706b5f 100644
+--- a/net/ipv4/ipmr.c
++++ b/net/ipv4/ipmr.c
+@@ -1073,7 +1073,7 @@ static int ipmr_cache_report(const struct mr_table *mrt,
+               msg = (struct igmpmsg *)skb_network_header(skb);
+               msg->im_vif = vifi;
+               msg->im_vif_hi = vifi >> 8;
+-              ipv4_pktinfo_prepare(mroute_sk, pkt);
++              ipv4_pktinfo_prepare(mroute_sk, pkt, false);
+               memcpy(skb->cb, pkt->cb, sizeof(skb->cb));
+               /* Add our header */
+               igmp = skb_put(skb, sizeof(struct igmphdr));
+diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
+index 4b5db5d1edc2..c0ef81f0bcee 100644
+--- a/net/ipv4/raw.c
++++ b/net/ipv4/raw.c
+@@ -292,7 +292,7 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)
+       /* Charge it to the socket. */
+-      ipv4_pktinfo_prepare(sk, skb);
++      ipv4_pktinfo_prepare(sk, skb, true);
+       if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0) {
+               kfree_skb_reason(skb, reason);
+               return NET_RX_DROP;
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 7be4ddc80d95..8e5a8b3b22c6 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -2167,7 +2167,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
+       udp_csum_pull_header(skb);
+-      ipv4_pktinfo_prepare(sk, skb);
++      ipv4_pktinfo_prepare(sk, skb, true);
+       return __udp_queue_rcv_skb(sk, skb);
+ csum_error:
+-- 
+2.43.0
+
diff --git a/queue-6.6/ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch b/queue-6.6/ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch
new file mode 100644 (file)
index 0000000..fae61c9
--- /dev/null
@@ -0,0 +1,78 @@
+From 81b6d2d11b72f557766c69c160808a381cccc8be Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 26 Jan 2024 09:32:20 +0100
+Subject: ipv6: Ensure natural alignment of const ipv6 loopback and router
+ addresses
+
+From: Helge Deller <deller@kernel.org>
+
+[ Upstream commit 60365049ccbacd101654a66ddcb299abfabd4fc5 ]
+
+On a parisc64 kernel I sometimes notice this kernel warning:
+Kernel unaligned access to 0x40ff8814 at ndisc_send_skb+0xc0/0x4d8
+
+The address 0x40ff8814 points to the in6addr_linklocal_allrouters
+variable and the warning simply means that some ipv6 function tries to
+read a 64-bit word directly from the not-64-bit aligned
+in6addr_linklocal_allrouters variable.
+
+Unaligned accesses are non-critical as the architecture or exception
+handlers usually will fix it up at runtime. Nevertheless it may trigger
+a performance penality for some architectures. For details read the
+"unaligned-memory-access" kernel documentation.
+
+The patch below ensures that the ipv6 loopback and router addresses will
+always be naturally aligned. This prevents the unaligned accesses for
+all architectures.
+
+Signed-off-by: Helge Deller <deller@gmx.de>
+Fixes: 034dfc5df99eb ("ipv6: export in6addr_loopback to modules")
+Acked-by: Paolo Abeni <pabeni@redhat.com>
+Link: https://lore.kernel.org/r/ZbNuFM1bFqoH-UoY@p100
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/addrconf_core.c | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c
+index 507a8353a6bd..c008d21925d7 100644
+--- a/net/ipv6/addrconf_core.c
++++ b/net/ipv6/addrconf_core.c
+@@ -220,19 +220,26 @@ const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {
+ EXPORT_SYMBOL_GPL(ipv6_stub);
+ /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
+-const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
++const struct in6_addr in6addr_loopback __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_LOOPBACK_INIT;
+ EXPORT_SYMBOL(in6addr_loopback);
+-const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
++const struct in6_addr in6addr_any __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_ANY_INIT;
+ EXPORT_SYMBOL(in6addr_any);
+-const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
++const struct in6_addr in6addr_linklocal_allnodes __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
+ EXPORT_SYMBOL(in6addr_linklocal_allnodes);
+-const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
++const struct in6_addr in6addr_linklocal_allrouters __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
+ EXPORT_SYMBOL(in6addr_linklocal_allrouters);
+-const struct in6_addr in6addr_interfacelocal_allnodes = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
++const struct in6_addr in6addr_interfacelocal_allnodes __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
+ EXPORT_SYMBOL(in6addr_interfacelocal_allnodes);
+-const struct in6_addr in6addr_interfacelocal_allrouters = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
++const struct in6_addr in6addr_interfacelocal_allrouters __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
+ EXPORT_SYMBOL(in6addr_interfacelocal_allrouters);
+-const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
++const struct in6_addr in6addr_sitelocal_allrouters __aligned(BITS_PER_LONG/8)
++      = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
+ EXPORT_SYMBOL(in6addr_sitelocal_allrouters);
+ static void snmp6_free_dev(struct inet6_dev *idev)
+-- 
+2.43.0
+
diff --git a/queue-6.6/ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch b/queue-6.6/ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch
new file mode 100644 (file)
index 0000000..0bb2070
--- /dev/null
@@ -0,0 +1,44 @@
+From e60020b174f1f72f41b95759081b3e5d401bbd68 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Jan 2024 18:25:36 +0100
+Subject: ixgbe: Fix an error handling path in ixgbe_read_iosf_sb_reg_x550()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit bbc404d20d1b46d89b461918bc44587620eda200 ]
+
+All error handling paths, except this one, go to 'out' where
+release_swfw_sync() is called.
+This call balances the acquire_swfw_sync() call done at the beginning of
+the function.
+
+Branch to the error handling path in order to correctly release some
+resources in case of error.
+
+Fixes: ae14a1d8e104 ("ixgbe: Fix IOSF SB access issues")
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@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_x550.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+index fe2d2d2f0494..cdc912bba808 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+@@ -717,7 +717,8 @@ static s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+               error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
+                        IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
+               hw_dbg(hw, "Failed to read, error %x\n", error);
+-              return -EIO;
++              ret = -EIO;
++              goto out;
+       }
+       if (!ret)
+-- 
+2.43.0
+
diff --git a/queue-6.6/ixgbe-refactor-overtemp-event-handling.patch b/queue-6.6/ixgbe-refactor-overtemp-event-handling.patch
new file mode 100644 (file)
index 0000000..3df3a08
--- /dev/null
@@ -0,0 +1,293 @@
+From 4dbe1430932b42809f96ecf5ab329597ae1c64ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Dec 2023 11:39:25 +0100
+Subject: ixgbe: Refactor overtemp event handling
+
+From: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+
+[ Upstream commit 6c1b4af8c1b20c70dde01e58381685d6a4a1d2c8 ]
+
+Currently ixgbe driver is notified of overheating events
+via internal IXGBE_ERR_OVERTEMP error code.
+
+Change the approach for handle_lasi() to use freshly introduced
+is_overtemp function parameter which set when such event occurs.
+Change check_overtemp() to bool and return true if overtemp
+event occurs.
+
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Tested-by: Sunitha Mekala <sunithax.d.mekala@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 | 16 +++-----
+ drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c  | 21 +++++-----
+ drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h  |  2 +-
+ drivers/net/ethernet/intel/ixgbe/ixgbe_type.h |  4 +-
+ drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 41 +++++++++++--------
+ 5 files changed, 43 insertions(+), 41 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+index f7c6482d6b63..9d4f808c4bfa 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -2756,7 +2756,6 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter)
+ {
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 eicr = adapter->interrupt_event;
+-      s32 rc;
+       if (test_bit(__IXGBE_DOWN, &adapter->state))
+               return;
+@@ -2790,14 +2789,13 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter)
+               }
+               /* Check if this is not due to overtemp */
+-              if (hw->phy.ops.check_overtemp(hw) != IXGBE_ERR_OVERTEMP)
++              if (!hw->phy.ops.check_overtemp(hw))
+                       return;
+               break;
+       case IXGBE_DEV_ID_X550EM_A_1G_T:
+       case IXGBE_DEV_ID_X550EM_A_1G_T_L:
+-              rc = hw->phy.ops.check_overtemp(hw);
+-              if (rc != IXGBE_ERR_OVERTEMP)
++              if (!hw->phy.ops.check_overtemp(hw))
+                       return;
+               break;
+       default:
+@@ -7938,7 +7936,7 @@ static void ixgbe_service_timer(struct timer_list *t)
+ static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)
+ {
+       struct ixgbe_hw *hw = &adapter->hw;
+-      u32 status;
++      bool overtemp;
+       if (!(adapter->flags2 & IXGBE_FLAG2_PHY_INTERRUPT))
+               return;
+@@ -7948,11 +7946,9 @@ static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)
+       if (!hw->phy.ops.handle_lasi)
+               return;
+-      status = hw->phy.ops.handle_lasi(&adapter->hw);
+-      if (status != IXGBE_ERR_OVERTEMP)
+-              return;
+-
+-      e_crit(drv, "%s\n", ixgbe_overheat_msg);
++      hw->phy.ops.handle_lasi(&adapter->hw, &overtemp);
++      if (overtemp)
++              e_crit(drv, "%s\n", ixgbe_overheat_msg);
+ }
+ static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+index 7c0a1a0a5eda..930dc5071936 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+@@ -408,8 +408,7 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
+               return status;
+       /* Don't reset PHY if it's shut down due to overtemp. */
+-      if (!hw->phy.reset_if_overtemp &&
+-          (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
++      if (!hw->phy.reset_if_overtemp && hw->phy.ops.check_overtemp(hw))
+               return 0;
+       /* Blocked by MNG FW so bail */
+@@ -2748,22 +2747,24 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
+  *  @hw: pointer to hardware structure
+  *
+  *  Checks if the LASI temp alarm status was triggered due to overtemp
++ *
++ *  Return true when an overtemp event detected, otherwise false.
+  **/
+-s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
++bool ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
+ {
+       u16 phy_data = 0;
++      u32 status;
+       if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
+-              return 0;
++              return false;
+       /* Check that the LASI temp alarm status was triggered */
+-      hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
+-                           MDIO_MMD_PMAPMD, &phy_data);
+-
+-      if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
+-              return 0;
++      status = hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
++                                    MDIO_MMD_PMAPMD, &phy_data);
++      if (status)
++              return false;
+-      return IXGBE_ERR_OVERTEMP;
++      return !!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM);
+ }
+ /** ixgbe_set_copper_phy_power - Control power for copper phy
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
+index 6544c4539c0d..ef72729d7c93 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
+@@ -155,7 +155,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw);
+ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
+                                       u16 *list_offset,
+                                       u16 *data_offset);
+-s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw);
++bool ixgbe_tn_check_overtemp(struct ixgbe_hw *hw);
+ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
+                               u8 dev_addr, u8 *data);
+ s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+index 4b19b1282f28..61b9774b3d31 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+@@ -3509,10 +3509,10 @@ struct ixgbe_phy_operations {
+       s32 (*read_i2c_sff8472)(struct ixgbe_hw *, u8 , u8 *);
+       s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *);
+       s32 (*write_i2c_eeprom)(struct ixgbe_hw *, u8, u8);
+-      s32 (*check_overtemp)(struct ixgbe_hw *);
++      bool (*check_overtemp)(struct ixgbe_hw *);
+       s32 (*set_phy_power)(struct ixgbe_hw *, bool on);
+       s32 (*enter_lplu)(struct ixgbe_hw *);
+-      s32 (*handle_lasi)(struct ixgbe_hw *hw);
++      s32 (*handle_lasi)(struct ixgbe_hw *hw, bool *);
+       s32 (*read_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
+                                     u8 *value);
+       s32 (*write_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+index 19de26520a88..fe2d2d2f0494 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+@@ -600,8 +600,10 @@ static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
+       rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup);
+       if (rc)
+               return rc;
++
+       if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN)
+-              return IXGBE_ERR_OVERTEMP;
++              return -EIO;
++
+       return 0;
+ }
+@@ -2369,18 +2371,18 @@ static s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
+  * @hw: pointer to hardware structure
+  * @lsc: pointer to boolean flag which indicates whether external Base T
+  *     PHY interrupt is lsc
++ * @is_overtemp: indicate whether an overtemp event encountered
+  *
+  * Determime if external Base T PHY interrupt cause is high temperature
+  * failure alarm or link status change.
+- *
+- * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
+- * failure alarm, else return PHY access status.
+  **/
+-static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
++static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc,
++                                     bool *is_overtemp)
+ {
+       u32 status;
+       u16 reg;
++      *is_overtemp = false;
+       *lsc = false;
+       /* Vendor alarm triggered */
+@@ -2412,7 +2414,8 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
+       if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
+               /* power down the PHY in case the PHY FW didn't already */
+               ixgbe_set_copper_phy_power(hw, false);
+-              return IXGBE_ERR_OVERTEMP;
++              *is_overtemp = true;
++              return -EIO;
+       }
+       if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
+               /*  device fault alarm triggered */
+@@ -2426,7 +2429,8 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
+               if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) {
+                       /* power down the PHY in case the PHY FW didn't */
+                       ixgbe_set_copper_phy_power(hw, false);
+-                      return IXGBE_ERR_OVERTEMP;
++                      *is_overtemp = true;
++                      return -EIO;
+               }
+       }
+@@ -2462,12 +2466,12 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
+  **/
+ static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
+ {
++      bool lsc, overtemp;
+       u32 status;
+       u16 reg;
+-      bool lsc;
+       /* Clear interrupt flags */
+-      status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
++      status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc, &overtemp);
+       /* Enable link status change alarm */
+@@ -2546,21 +2550,20 @@ static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
+ /**
+  * ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
+  * @hw: pointer to hardware structure
++ * @is_overtemp: indicate whether an overtemp event encountered
+  *
+  * Handle external Base T PHY interrupt. If high temperature
+  * failure alarm then return error, else if link status change
+  * then setup internal/external PHY link
+- *
+- * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
+- * failure alarm, else return PHY access status.
+  **/
+-static s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
++static s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw,
++                                        bool *is_overtemp)
+ {
+       struct ixgbe_phy_info *phy = &hw->phy;
+       bool lsc;
+       u32 status;
+-      status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
++      status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc, is_overtemp);
+       if (status)
+               return status;
+@@ -3188,21 +3191,23 @@ static s32 ixgbe_reset_phy_fw(struct ixgbe_hw *hw)
+ /**
+  * ixgbe_check_overtemp_fw - Check firmware-controlled PHYs for overtemp
+  * @hw: pointer to hardware structure
++ *
++ * Return true when an overtemp event detected, otherwise false.
+  */
+-static s32 ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
++static bool ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
+ {
+       u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 };
+       s32 rc;
+       rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &store);
+       if (rc)
+-              return rc;
++              return false;
+       if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) {
+               ixgbe_shutdown_fw_phy(hw);
+-              return IXGBE_ERR_OVERTEMP;
++              return true;
+       }
+-      return 0;
++      return false;
+ }
+ /**
+-- 
+2.43.0
+
diff --git a/queue-6.6/ixgbe-refactor-returning-internal-error-codes.patch b/queue-6.6/ixgbe-refactor-returning-internal-error-codes.patch
new file mode 100644 (file)
index 0000000..fff6dd0
--- /dev/null
@@ -0,0 +1,2369 @@
+From 6215781929fe2dbe7d1c6ab1349d4c2c5c5fe548 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Dec 2023 11:39:26 +0100
+Subject: ixgbe: Refactor returning internal error codes
+
+From: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+
+[ Upstream commit 5795f533f30a80aa0473652876296ebc9129e33a ]
+
+Change returning codes to the kernel ones instead of
+the internal ones for the entire ixgbe driver.
+
+Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+Tested-by: Sunitha Mekala <sunithax.d.mekala@intel.com> (A Contingent worker at Intel)
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Stable-dep-of: bbc404d20d1b ("ixgbe: Fix an error handling path in ixgbe_read_iosf_sb_reg_x550()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../net/ethernet/intel/ixgbe/ixgbe_82598.c    |  36 ++---
+ .../net/ethernet/intel/ixgbe/ixgbe_82599.c    |  61 ++++----
+ .../net/ethernet/intel/ixgbe/ixgbe_common.c   | 145 ++++++++----------
+ .../net/ethernet/intel/ixgbe/ixgbe_ethtool.c  |   2 +-
+ drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |  26 ++--
+ drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c  |  34 ++--
+ drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h  |   1 -
+ drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c  |  84 +++++-----
+ .../net/ethernet/intel/ixgbe/ixgbe_sriov.c    |   2 +-
+ drivers/net/ethernet/intel/ixgbe/ixgbe_type.h |  39 -----
+ drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c |  44 +++---
+ drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 107 +++++++------
+ 12 files changed, 264 insertions(+), 317 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
+index 100388968e4d..3d56481e16bc 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
+@@ -123,14 +123,14 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
+               if (ret_val)
+                       return ret_val;
+               if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
+-                      return IXGBE_ERR_SFP_NOT_SUPPORTED;
++                      return -EOPNOTSUPP;
+               /* Check to see if SFP+ module is supported */
+               ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
+                                                           &list_offset,
+                                                           &data_offset);
+               if (ret_val)
+-                      return IXGBE_ERR_SFP_NOT_SUPPORTED;
++                      return -EOPNOTSUPP;
+               break;
+       default:
+               break;
+@@ -213,7 +213,7 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
+               break;
+       default:
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EIO;
+       }
+       return 0;
+@@ -283,7 +283,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
+       /* Validate the water mark configuration */
+       if (!hw->fc.pause_time)
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       /* Low water mark of zero causes XOFF floods */
+       for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
+@@ -292,7 +292,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
+                       if (!hw->fc.low_water[i] ||
+                           hw->fc.low_water[i] >= hw->fc.high_water[i]) {
+                               hw_dbg(hw, "Invalid water mark configuration\n");
+-                              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++                              return -EINVAL;
+                       }
+               }
+       }
+@@ -369,7 +369,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
+               break;
+       default:
+               hw_dbg(hw, "Flow control param set incorrectly\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       /* Set 802.3x based flow control settings. */
+@@ -438,7 +438,7 @@ static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
+                               msleep(100);
+                       }
+                       if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
+-                              status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
++                              status = -EIO;
+                               hw_dbg(hw, "Autonegotiation did not complete.\n");
+                       }
+               }
+@@ -478,7 +478,7 @@ static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
+       if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
+               hw_dbg(hw, "Link was indicated but link is down\n");
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EIO;
+       }
+       return 0;
+@@ -594,7 +594,7 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
+       speed &= link_capabilities;
+       if (speed == IXGBE_LINK_SPEED_UNKNOWN)
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EINVAL;
+       /* Set KX4/KX support according to speed requested */
+       else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
+@@ -701,9 +701,9 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
+               /* Init PHY and function pointers, perform SFP setup */
+               phy_status = hw->phy.ops.init(hw);
+-              if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED)
++              if (phy_status == -EOPNOTSUPP)
+                       return phy_status;
+-              if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
++              if (phy_status == -ENOENT)
+                       goto mac_reset_top;
+               hw->phy.ops.reset(hw);
+@@ -727,7 +727,7 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
+               udelay(1);
+       }
+       if (ctrl & IXGBE_CTRL_RST) {
+-              status = IXGBE_ERR_RESET_FAILED;
++              status = -EIO;
+               hw_dbg(hw, "Reset polling failed to complete.\n");
+       }
+@@ -789,7 +789,7 @@ static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
+       /* Make sure we are using a valid rar index range */
+       if (rar >= rar_entries) {
+               hw_dbg(hw, "RAR index %d is out of range.\n", rar);
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
+@@ -814,7 +814,7 @@ static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
+       /* Make sure we are using a valid rar index range */
+       if (rar >= rar_entries) {
+               hw_dbg(hw, "RAR index %d is out of range.\n", rar);
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
+@@ -845,7 +845,7 @@ static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
+       u32 vftabyte;
+       if (vlan > 4095)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* Determine 32-bit word position in array */
+       regindex = (vlan >> 5) & 0x7F;   /* upper seven bits */
+@@ -964,7 +964,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
+               gssr = IXGBE_GSSR_PHY0_SM;
+       if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != 0)
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       if (hw->phy.type == ixgbe_phy_nl) {
+               /*
+@@ -993,7 +993,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
+               if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) {
+                       hw_dbg(hw, "EEPROM read did not pass.\n");
+-                      status = IXGBE_ERR_SFP_NOT_PRESENT;
++                      status = -ENOENT;
+                       goto out;
+               }
+@@ -1003,7 +1003,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
+               *eeprom_data = (u8)(sfp_data >> 8);
+       } else {
+-              status = IXGBE_ERR_PHY;
++              status = -EIO;
+       }
+ out:
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
+index 58ea959a4482..339e106a5732 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
+@@ -117,7 +117,7 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
+               ret_val = hw->mac.ops.acquire_swfw_sync(hw,
+                                                       IXGBE_GSSR_MAC_CSR_SM);
+               if (ret_val)
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               if (hw->eeprom.ops.read(hw, ++data_offset, &data_value))
+                       goto setup_sfp_err;
+@@ -144,7 +144,7 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
+               if (ret_val) {
+                       hw_dbg(hw, " sfp module setup not complete\n");
+-                      return IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
++                      return -EIO;
+               }
+       }
+@@ -159,7 +159,7 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
+       usleep_range(hw->eeprom.semaphore_delay * 1000,
+                    hw->eeprom.semaphore_delay * 2000);
+       hw_err(hw, "eeprom read at offset %d failed\n", data_offset);
+-      return IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
++      return -EIO;
+ }
+ /**
+@@ -184,7 +184,7 @@ static s32 prot_autoc_read_82599(struct ixgbe_hw *hw, bool *locked,
+               ret_val = hw->mac.ops.acquire_swfw_sync(hw,
+                                       IXGBE_GSSR_MAC_CSR_SM);
+               if (ret_val)
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               *locked = true;
+       }
+@@ -219,7 +219,7 @@ static s32 prot_autoc_write_82599(struct ixgbe_hw *hw, u32 autoc, bool locked)
+               ret_val = hw->mac.ops.acquire_swfw_sync(hw,
+                                       IXGBE_GSSR_MAC_CSR_SM);
+               if (ret_val)
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               locked = true;
+       }
+@@ -400,7 +400,7 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
+               break;
+       default:
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EIO;
+       }
+       if (hw->phy.multispeed_fiber) {
+@@ -541,7 +541,7 @@ static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
+                               msleep(100);
+                       }
+                       if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
+-                              status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
++                              status = -EIO;
+                               hw_dbg(hw, "Autoneg did not complete.\n");
+                       }
+               }
+@@ -794,7 +794,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
+       speed &= link_capabilities;
+       if (speed == IXGBE_LINK_SPEED_UNKNOWN)
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EINVAL;
+       /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/
+       if (hw->mac.orig_link_settings_stored)
+@@ -861,8 +861,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
+                                       msleep(100);
+                               }
+                               if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
+-                                      status =
+-                                              IXGBE_ERR_AUTONEG_NOT_COMPLETE;
++                                      status = -EIO;
+                                       hw_dbg(hw, "Autoneg did not complete.\n");
+                               }
+                       }
+@@ -927,7 +926,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
+       /* Identify PHY and related function pointers */
+       status = hw->phy.ops.init(hw);
+-      if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
++      if (status == -EOPNOTSUPP)
+               return status;
+       /* Setup SFP module if there is one present. */
+@@ -936,7 +935,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
+               hw->phy.sfp_setup_needed = false;
+       }
+-      if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
++      if (status == -EOPNOTSUPP)
+               return status;
+       /* Reset PHY */
+@@ -974,7 +973,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
+       }
+       if (ctrl & IXGBE_CTRL_RST_MASK) {
+-              status = IXGBE_ERR_RESET_FAILED;
++              status = -EIO;
+               hw_dbg(hw, "Reset polling failed to complete.\n");
+       }
+@@ -1093,7 +1092,7 @@ static s32 ixgbe_fdir_check_cmd_complete(struct ixgbe_hw *hw, u32 *fdircmd)
+               udelay(10);
+       }
+-      return IXGBE_ERR_FDIR_CMD_INCOMPLETE;
++      return -EIO;
+ }
+ /**
+@@ -1155,7 +1154,7 @@ s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw)
+       }
+       if (i >= IXGBE_FDIR_INIT_DONE_POLL) {
+               hw_dbg(hw, "Flow Director Signature poll time exceeded!\n");
+-              return IXGBE_ERR_FDIR_REINIT_FAILED;
++              return -EIO;
+       }
+       /* Clear FDIR statistics registers (read to clear) */
+@@ -1387,7 +1386,7 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw,
+               break;
+       default:
+               hw_dbg(hw, " Error on flow type input\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       /* configure FDIRCMD register */
+@@ -1546,7 +1545,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
+               break;
+       default:
+               hw_dbg(hw, " Error on vm pool mask\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       switch (input_mask->formatted.flow_type & IXGBE_ATR_L4TYPE_MASK) {
+@@ -1555,14 +1554,14 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
+               if (input_mask->formatted.dst_port ||
+                   input_mask->formatted.src_port) {
+                       hw_dbg(hw, " Error on src/dst port mask\n");
+-                      return IXGBE_ERR_CONFIG;
++                      return -EIO;
+               }
+               break;
+       case IXGBE_ATR_L4TYPE_MASK:
+               break;
+       default:
+               hw_dbg(hw, " Error on flow type mask\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       switch (ntohs(input_mask->formatted.vlan_id) & 0xEFFF) {
+@@ -1583,7 +1582,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
+               break;
+       default:
+               hw_dbg(hw, " Error on VLAN mask\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       switch ((__force u16)input_mask->formatted.flex_bytes & 0xFFFF) {
+@@ -1595,7 +1594,7 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
+               break;
+       default:
+               hw_dbg(hw, " Error on flexible byte mask\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       /* Now mask VM pool and destination IPv6 - bits 5 and 2 */
+@@ -1824,7 +1823,7 @@ static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
+       /* Return error if SFP module has been detected but is not supported */
+       if (hw->phy.type == ixgbe_phy_sfp_unsupported)
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       return status;
+ }
+@@ -1863,13 +1862,13 @@ static s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval)
+  *  Verifies that installed the firmware version is 0.6 or higher
+  *  for SFI devices. All 82599 SFI devices should have version 0.6 or higher.
+  *
+- *  Returns IXGBE_ERR_EEPROM_VERSION if the FW is not present or
+- *  if the FW version is not supported.
++ *  Return: -EACCES if the FW is not present or if the FW version is
++ *  not supported.
+  **/
+ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
+ {
+-      s32 status = IXGBE_ERR_EEPROM_VERSION;
+       u16 fw_offset, fw_ptp_cfg_offset;
++      s32 status = -EACCES;
+       u16 offset;
+       u16 fw_version = 0;
+@@ -1883,7 +1882,7 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
+               goto fw_version_err;
+       if (fw_offset == 0 || fw_offset == 0xFFFF)
+-              return IXGBE_ERR_EEPROM_VERSION;
++              return -EACCES;
+       /* get the offset to the Pass Through Patch Configuration block */
+       offset = fw_offset + IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR;
+@@ -1891,7 +1890,7 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
+               goto fw_version_err;
+       if (fw_ptp_cfg_offset == 0 || fw_ptp_cfg_offset == 0xFFFF)
+-              return IXGBE_ERR_EEPROM_VERSION;
++              return -EACCES;
+       /* get the firmware version */
+       offset = fw_ptp_cfg_offset + IXGBE_FW_PATCH_VERSION_4;
+@@ -1905,7 +1904,7 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
+ fw_version_err:
+       hw_err(hw, "eeprom read at offset %d failed\n", offset);
+-      return IXGBE_ERR_EEPROM_VERSION;
++      return -EACCES;
+ }
+ /**
+@@ -2038,7 +2037,7 @@ static s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw)
+       if (!(anlp1_reg & IXGBE_ANLP1_AN_STATE_MASK)) {
+               hw_dbg(hw, "auto negotiation not completed\n");
+-              ret_val = IXGBE_ERR_RESET_FAILED;
++              ret_val = -EIO;
+               goto reset_pipeline_out;
+       }
+@@ -2087,7 +2086,7 @@ static s32 ixgbe_read_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
+               if (!timeout) {
+                       hw_dbg(hw, "Driver can't access resource, acquiring I2C bus timeout.\n");
+-                      status = IXGBE_ERR_I2C;
++                      status = -EIO;
+                       goto release_i2c_access;
+               }
+       }
+@@ -2141,7 +2140,7 @@ static s32 ixgbe_write_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
+               if (!timeout) {
+                       hw_dbg(hw, "Driver can't access resource, acquiring I2C bus timeout.\n");
+-                      status = IXGBE_ERR_I2C;
++                      status = -EIO;
+                       goto release_i2c_access;
+               }
+       }
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+index 878dd8dff528..b2a0f2aaa05b 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+@@ -124,7 +124,7 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw)
+        */
+       if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
+               hw_dbg(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       }
+       /*
+@@ -215,7 +215,7 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw)
+               break;
+       default:
+               hw_dbg(hw, "Flow control param set incorrectly\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       if (hw->mac.type != ixgbe_mac_X540) {
+@@ -500,7 +500,7 @@ s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,
+       if (pba_num == NULL) {
+               hw_dbg(hw, "PBA string buffer was null\n");
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       ret_val = hw->eeprom.ops.read(hw, IXGBE_PBANUM0_PTR, &data);
+@@ -526,7 +526,7 @@ s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,
+               /* we will need 11 characters to store the PBA */
+               if (pba_num_size < 11) {
+                       hw_dbg(hw, "PBA string buffer too small\n");
+-                      return IXGBE_ERR_NO_SPACE;
++                      return -ENOSPC;
+               }
+               /* extract hex string from data and pba_ptr */
+@@ -563,13 +563,13 @@ s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,
+       if (length == 0xFFFF || length == 0) {
+               hw_dbg(hw, "NVM PBA number section invalid length\n");
+-              return IXGBE_ERR_PBA_SECTION;
++              return -EIO;
+       }
+       /* check if pba_num buffer is big enough */
+       if (pba_num_size  < (((u32)length * 2) - 1)) {
+               hw_dbg(hw, "PBA string buffer too small\n");
+-              return IXGBE_ERR_NO_SPACE;
++              return -ENOSPC;
+       }
+       /* trim pba length from start of string */
+@@ -805,7 +805,7 @@ s32 ixgbe_led_on_generic(struct ixgbe_hw *hw, u32 index)
+       u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
+       if (index > 3)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* To turn on the LED, set mode to ON. */
+       led_reg &= ~IXGBE_LED_MODE_MASK(index);
+@@ -826,7 +826,7 @@ s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index)
+       u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
+       if (index > 3)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* To turn off the LED, set mode to OFF. */
+       led_reg &= ~IXGBE_LED_MODE_MASK(index);
+@@ -904,11 +904,8 @@ s32 ixgbe_write_eeprom_buffer_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
+       hw->eeprom.ops.init_params(hw);
+-      if (words == 0)
+-              return IXGBE_ERR_INVALID_ARGUMENT;
+-
+-      if (offset + words > hw->eeprom.word_size)
+-              return IXGBE_ERR_EEPROM;
++      if (words == 0 || (offset + words > hw->eeprom.word_size))
++              return -EINVAL;
+       /*
+        * The EEPROM page size cannot be queried from the chip. We do lazy
+@@ -962,7 +959,7 @@ static s32 ixgbe_write_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset,
+       if (ixgbe_ready_eeprom(hw) != 0) {
+               ixgbe_release_eeprom(hw);
+-              return IXGBE_ERR_EEPROM;
++              return -EIO;
+       }
+       for (i = 0; i < words; i++) {
+@@ -1028,7 +1025,7 @@ s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data)
+       hw->eeprom.ops.init_params(hw);
+       if (offset >= hw->eeprom.word_size)
+-              return IXGBE_ERR_EEPROM;
++              return -EINVAL;
+       return ixgbe_write_eeprom_buffer_bit_bang(hw, offset, 1, &data);
+ }
+@@ -1050,11 +1047,8 @@ s32 ixgbe_read_eeprom_buffer_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
+       hw->eeprom.ops.init_params(hw);
+-      if (words == 0)
+-              return IXGBE_ERR_INVALID_ARGUMENT;
+-
+-      if (offset + words > hw->eeprom.word_size)
+-              return IXGBE_ERR_EEPROM;
++      if (words == 0 || (offset + words > hw->eeprom.word_size))
++              return -EINVAL;
+       /*
+        * We cannot hold synchronization semaphores for too long
+@@ -1099,7 +1093,7 @@ static s32 ixgbe_read_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset,
+       if (ixgbe_ready_eeprom(hw) != 0) {
+               ixgbe_release_eeprom(hw);
+-              return IXGBE_ERR_EEPROM;
++              return -EIO;
+       }
+       for (i = 0; i < words; i++) {
+@@ -1142,7 +1136,7 @@ s32 ixgbe_read_eeprom_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
+       hw->eeprom.ops.init_params(hw);
+       if (offset >= hw->eeprom.word_size)
+-              return IXGBE_ERR_EEPROM;
++              return -EINVAL;
+       return ixgbe_read_eeprom_buffer_bit_bang(hw, offset, 1, data);
+ }
+@@ -1165,11 +1159,8 @@ s32 ixgbe_read_eerd_buffer_generic(struct ixgbe_hw *hw, u16 offset,
+       hw->eeprom.ops.init_params(hw);
+-      if (words == 0)
+-              return IXGBE_ERR_INVALID_ARGUMENT;
+-
+-      if (offset >= hw->eeprom.word_size)
+-              return IXGBE_ERR_EEPROM;
++      if (words == 0 || offset >= hw->eeprom.word_size)
++              return -EINVAL;
+       for (i = 0; i < words; i++) {
+               eerd = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |
+@@ -1262,11 +1253,8 @@ s32 ixgbe_write_eewr_buffer_generic(struct ixgbe_hw *hw, u16 offset,
+       hw->eeprom.ops.init_params(hw);
+-      if (words == 0)
+-              return IXGBE_ERR_INVALID_ARGUMENT;
+-
+-      if (offset >= hw->eeprom.word_size)
+-              return IXGBE_ERR_EEPROM;
++      if (words == 0 || offset >= hw->eeprom.word_size)
++              return -EINVAL;
+       for (i = 0; i < words; i++) {
+               eewr = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |
+@@ -1328,7 +1316,7 @@ static s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg)
+               }
+               udelay(5);
+       }
+-      return IXGBE_ERR_EEPROM;
++      return -EIO;
+ }
+ /**
+@@ -1344,7 +1332,7 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
+       u32 i;
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) != 0)
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       eec = IXGBE_READ_REG(hw, IXGBE_EEC(hw));
+@@ -1366,7 +1354,7 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
+               hw_dbg(hw, "Could not acquire EEPROM grant\n");
+               hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+-              return IXGBE_ERR_EEPROM;
++              return -EIO;
+       }
+       /* Setup EEPROM for Read/Write */
+@@ -1419,7 +1407,7 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
+               swsm = IXGBE_READ_REG(hw, IXGBE_SWSM(hw));
+               if (swsm & IXGBE_SWSM_SMBI) {
+                       hw_dbg(hw, "Software semaphore SMBI between device drivers not granted.\n");
+-                      return IXGBE_ERR_EEPROM;
++                      return -EIO;
+               }
+       }
+@@ -1447,7 +1435,7 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
+       if (i >= timeout) {
+               hw_dbg(hw, "SWESMBI Software EEPROM semaphore not granted.\n");
+               ixgbe_release_eeprom_semaphore(hw);
+-              return IXGBE_ERR_EEPROM;
++              return -EIO;
+       }
+       return 0;
+@@ -1503,7 +1491,7 @@ static s32 ixgbe_ready_eeprom(struct ixgbe_hw *hw)
+        */
+       if (i >= IXGBE_EEPROM_MAX_RETRY_SPI) {
+               hw_dbg(hw, "SPI EEPROM Status error\n");
+-              return IXGBE_ERR_EEPROM;
++              return -EIO;
+       }
+       return 0;
+@@ -1715,7 +1703,7 @@ s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
+       for (i = IXGBE_PCIE_ANALOG_PTR; i < IXGBE_FW_PTR; i++) {
+               if (hw->eeprom.ops.read(hw, i, &pointer)) {
+                       hw_dbg(hw, "EEPROM read failed\n");
+-                      return IXGBE_ERR_EEPROM;
++                      return -EIO;
+               }
+               /* If the pointer seems invalid */
+@@ -1724,7 +1712,7 @@ s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
+               if (hw->eeprom.ops.read(hw, pointer, &length)) {
+                       hw_dbg(hw, "EEPROM read failed\n");
+-                      return IXGBE_ERR_EEPROM;
++                      return -EIO;
+               }
+               if (length == 0xFFFF || length == 0)
+@@ -1733,7 +1721,7 @@ s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
+               for (j = pointer + 1; j <= pointer + length; j++) {
+                       if (hw->eeprom.ops.read(hw, j, &word)) {
+                               hw_dbg(hw, "EEPROM read failed\n");
+-                              return IXGBE_ERR_EEPROM;
++                              return -EIO;
+                       }
+                       checksum += word;
+               }
+@@ -1786,7 +1774,7 @@ s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw,
+        * calculated checksum
+        */
+       if (read_checksum != checksum)
+-              status = IXGBE_ERR_EEPROM_CHECKSUM;
++              status = -EIO;
+       /* If the user cares, return the calculated checksum */
+       if (checksum_val)
+@@ -1845,7 +1833,7 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
+       /* Make sure we are using a valid rar index range */
+       if (index >= rar_entries) {
+               hw_dbg(hw, "RAR index %d is out of range.\n", index);
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       /* setup VMDq pool selection before this RAR gets enabled */
+@@ -1897,7 +1885,7 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index)
+       /* Make sure we are using a valid rar index range */
+       if (index >= rar_entries) {
+               hw_dbg(hw, "RAR index %d is out of range.\n", index);
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       /*
+@@ -2146,7 +2134,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
+       /* Validate the water mark configuration. */
+       if (!hw->fc.pause_time)
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       /* Low water mark of zero causes XOFF floods */
+       for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
+@@ -2155,7 +2143,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
+                       if (!hw->fc.low_water[i] ||
+                           hw->fc.low_water[i] >= hw->fc.high_water[i]) {
+                               hw_dbg(hw, "Invalid water mark configuration\n");
+-                              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++                              return -EINVAL;
+                       }
+               }
+       }
+@@ -2212,7 +2200,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
+               break;
+       default:
+               hw_dbg(hw, "Flow control param set incorrectly\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       /* Set 802.3x based flow control settings. */
+@@ -2269,7 +2257,7 @@ s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
+                      u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm)
+ {
+       if ((!(adv_reg)) ||  (!(lp_reg)))
+-              return IXGBE_ERR_FC_NOT_NEGOTIATED;
++              return -EINVAL;
+       if ((adv_reg & adv_sym) && (lp_reg & lp_sym)) {
+               /*
+@@ -2321,7 +2309,7 @@ static s32 ixgbe_fc_autoneg_fiber(struct ixgbe_hw *hw)
+       linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA);
+       if ((!!(linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) ||
+           (!!(linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1))
+-              return IXGBE_ERR_FC_NOT_NEGOTIATED;
++              return -EIO;
+       pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
+       pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP);
+@@ -2353,12 +2341,12 @@ static s32 ixgbe_fc_autoneg_backplane(struct ixgbe_hw *hw)
+        */
+       links = IXGBE_READ_REG(hw, IXGBE_LINKS);
+       if ((links & IXGBE_LINKS_KX_AN_COMP) == 0)
+-              return IXGBE_ERR_FC_NOT_NEGOTIATED;
++              return -EIO;
+       if (hw->mac.type == ixgbe_mac_82599EB) {
+               links2 = IXGBE_READ_REG(hw, IXGBE_LINKS2);
+               if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0)
+-                      return IXGBE_ERR_FC_NOT_NEGOTIATED;
++                      return -EIO;
+       }
+       /*
+        * Read the 10g AN autoc and LP ability registers and resolve
+@@ -2407,8 +2395,8 @@ static s32 ixgbe_fc_autoneg_copper(struct ixgbe_hw *hw)
+  **/
+ void ixgbe_fc_autoneg(struct ixgbe_hw *hw)
+ {
+-      s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED;
+       ixgbe_link_speed speed;
++      s32 ret_val = -EIO;
+       bool link_up;
+       /*
+@@ -2510,7 +2498,7 @@ static u32 ixgbe_pcie_timeout_poll(struct ixgbe_hw *hw)
+  *  @hw: pointer to hardware structure
+  *
+  *  Disables PCI-Express primary access and verifies there are no pending
+- *  requests. IXGBE_ERR_PRIMARY_REQUESTS_PENDING is returned if primary disable
++ *  requests. -EALREADY is returned if primary disable
+  *  bit hasn't caused the primary requests to be disabled, else 0
+  *  is returned signifying primary requests disabled.
+  **/
+@@ -2575,7 +2563,7 @@ static s32 ixgbe_disable_pcie_primary(struct ixgbe_hw *hw)
+       }
+       hw_dbg(hw, "PCIe transaction pending bit also did not clear.\n");
+-      return IXGBE_ERR_PRIMARY_REQUESTS_PENDING;
++      return -EALREADY;
+ }
+ /**
+@@ -2600,7 +2588,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u32 mask)
+                * SW_FW_SYNC bits (not just NVM)
+                */
+               if (ixgbe_get_eeprom_semaphore(hw))
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               gssr = IXGBE_READ_REG(hw, IXGBE_GSSR);
+               if (!(gssr & (fwmask | swmask))) {
+@@ -2620,7 +2608,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u32 mask)
+               ixgbe_release_swfw_sync(hw, gssr & (fwmask | swmask));
+       usleep_range(5000, 10000);
+-      return IXGBE_ERR_SWFW_SYNC;
++      return -EBUSY;
+ }
+ /**
+@@ -2757,7 +2745,7 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index)
+       s32 ret_val;
+       if (index > 3)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /*
+        * Link must be up to auto-blink the LEDs;
+@@ -2803,7 +2791,7 @@ s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index)
+       s32 ret_val;
+       if (index > 3)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       ret_val = hw->mac.ops.prot_autoc_read(hw, &locked, &autoc_reg);
+       if (ret_val)
+@@ -2963,7 +2951,7 @@ s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
+       /* Make sure we are using a valid rar index range */
+       if (rar >= rar_entries) {
+               hw_dbg(hw, "RAR index %d is out of range.\n", rar);
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
+@@ -3014,7 +3002,7 @@ s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
+       /* Make sure we are using a valid rar index range */
+       if (rar >= rar_entries) {
+               hw_dbg(hw, "RAR index %d is out of range.\n", rar);
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       if (vmdq < 32) {
+@@ -3091,7 +3079,7 @@ static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass)
+        * will simply bypass the VLVF if there are no entries present in the
+        * VLVF that contain our VLAN
+        */
+-      first_empty_slot = vlvf_bypass ? IXGBE_ERR_NO_SPACE : 0;
++      first_empty_slot = vlvf_bypass ? -ENOSPC : 0;
+       /* add VLAN enable bit for comparison */
+       vlan |= IXGBE_VLVF_VIEN;
+@@ -3115,7 +3103,7 @@ static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass)
+       if (!first_empty_slot)
+               hw_dbg(hw, "No space in VLVF.\n");
+-      return first_empty_slot ? : IXGBE_ERR_NO_SPACE;
++      return first_empty_slot ? : -ENOSPC;
+ }
+ /**
+@@ -3135,7 +3123,7 @@ s32 ixgbe_set_vfta_generic(struct ixgbe_hw *hw, u32 vlan, u32 vind,
+       s32 vlvf_index;
+       if ((vlan > 4095) || (vind > 63))
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /*
+        * this is a 2 part operation - first the VFTA, then the
+@@ -3611,7 +3599,8 @@ u8 ixgbe_calculate_checksum(u8 *buffer, u32 length)
+  *
+  *  Communicates with the manageability block. On success return 0
+  *  else returns semaphore error when encountering an error acquiring
+- *  semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
++ *  semaphore, -EINVAL when incorrect parameters passed or -EIO when
++ *  command fails.
+  *
+  *  This function assumes that the IXGBE_GSSR_SW_MNG_SM semaphore is held
+  *  by the caller.
+@@ -3624,7 +3613,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
+       if (!length || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
+               hw_dbg(hw, "Buffer length failure buffersize-%d.\n", length);
+-              return IXGBE_ERR_HOST_INTERFACE_COMMAND;
++              return -EINVAL;
+       }
+       /* Set bit 9 of FWSTS clearing FW reset indication */
+@@ -3635,13 +3624,13 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
+       hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
+       if (!(hicr & IXGBE_HICR_EN)) {
+               hw_dbg(hw, "IXGBE_HOST_EN bit disabled.\n");
+-              return IXGBE_ERR_HOST_INTERFACE_COMMAND;
++              return -EIO;
+       }
+       /* Calculate length in DWORDs. We must be DWORD aligned */
+       if (length % sizeof(u32)) {
+               hw_dbg(hw, "Buffer length failure, not aligned to dword");
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       }
+       dword_len = length >> 2;
+@@ -3666,7 +3655,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
+       /* Check command successful completion. */
+       if ((timeout && i == timeout) ||
+           !(IXGBE_READ_REG(hw, IXGBE_HICR) & IXGBE_HICR_SV))
+-              return IXGBE_ERR_HOST_INTERFACE_COMMAND;
++              return -EIO;
+       return 0;
+ }
+@@ -3686,7 +3675,7 @@ s32 ixgbe_hic_unlocked(struct ixgbe_hw *hw, u32 *buffer, u32 length,
+  *  in these cases.
+  *
+  *  Communicates with the manageability block.  On success return 0
+- *  else return IXGBE_ERR_HOST_INTERFACE_COMMAND.
++ *  else return -EIO or -EINVAL.
+  **/
+ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
+                                u32 length, u32 timeout,
+@@ -3701,7 +3690,7 @@ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
+       if (!length || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
+               hw_dbg(hw, "Buffer length failure buffersize-%d.\n", length);
+-              return IXGBE_ERR_HOST_INTERFACE_COMMAND;
++              return -EINVAL;
+       }
+       /* Take management host interface semaphore */
+       status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_SW_MNG_SM);
+@@ -3731,7 +3720,7 @@ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
+       if (length < round_up(buf_len, 4) + hdr_size) {
+               hw_dbg(hw, "Buffer not large enough for reply message.\n");
+-              status = IXGBE_ERR_HOST_INTERFACE_COMMAND;
++              status = -EIO;
+               goto rel_out;
+       }
+@@ -3762,8 +3751,8 @@ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, void *buffer,
+  *
+  *  Sends driver version number to firmware through the manageability
+  *  block.  On success return 0
+- *  else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
+- *  semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
++ *  else returns -EBUSY when encountering an error acquiring
++ *  semaphore or -EIO when command fails.
+  **/
+ s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
+                                u8 build, u8 sub, __always_unused u16 len,
+@@ -3799,7 +3788,7 @@ s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
+                   FW_CEM_RESP_STATUS_SUCCESS)
+                       ret_val = 0;
+               else
+-                      ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
++                      ret_val = -EIO;
+               break;
+       }
+@@ -3897,14 +3886,14 @@ static s32 ixgbe_get_ets_data(struct ixgbe_hw *hw, u16 *ets_cfg,
+               return status;
+       if ((*ets_offset == 0x0000) || (*ets_offset == 0xFFFF))
+-              return IXGBE_NOT_IMPLEMENTED;
++              return -EOPNOTSUPP;
+       status = hw->eeprom.ops.read(hw, *ets_offset, ets_cfg);
+       if (status)
+               return status;
+       if ((*ets_cfg & IXGBE_ETS_TYPE_MASK) != IXGBE_ETS_TYPE_EMC_SHIFTED)
+-              return IXGBE_NOT_IMPLEMENTED;
++              return -EOPNOTSUPP;
+       return 0;
+ }
+@@ -3927,7 +3916,7 @@ s32 ixgbe_get_thermal_sensor_data_generic(struct ixgbe_hw *hw)
+       /* Only support thermal sensors attached to physical port 0 */
+       if ((IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1))
+-              return IXGBE_NOT_IMPLEMENTED;
++              return -EOPNOTSUPP;
+       status = ixgbe_get_ets_data(hw, &ets_cfg, &ets_offset);
+       if (status)
+@@ -3987,7 +3976,7 @@ s32 ixgbe_init_thermal_sensor_thresh_generic(struct ixgbe_hw *hw)
+       /* Only support thermal sensors attached to physical port 0 */
+       if ((IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1))
+-              return IXGBE_NOT_IMPLEMENTED;
++              return -EOPNOTSUPP;
+       status = ixgbe_get_ets_data(hw, &ets_cfg, &ets_offset);
+       if (status)
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+index 0bbad4a5cc2f..9f2820a08b72 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+@@ -3370,7 +3370,7 @@ static int ixgbe_get_module_eeprom(struct net_device *dev,
+ {
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       struct ixgbe_hw *hw = &adapter->hw;
+-      s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
++      s32 status = -EFAULT;
+       u8 databyte = 0xFF;
+       int i = 0;
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+index dd03b017dfc5..f7c6482d6b63 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -5512,7 +5512,7 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw)
+ {
+       u32 speed;
+       bool autoneg, link_up = false;
+-      int ret = IXGBE_ERR_LINK_SETUP;
++      int ret = -EIO;
+       if (hw->mac.ops.check_link)
+               ret = hw->mac.ops.check_link(hw, &speed, &link_up, false);
+@@ -5983,13 +5983,13 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
+       err = hw->mac.ops.init_hw(hw);
+       switch (err) {
+       case 0:
+-      case IXGBE_ERR_SFP_NOT_PRESENT:
+-      case IXGBE_ERR_SFP_NOT_SUPPORTED:
++      case -ENOENT:
++      case -EOPNOTSUPP:
+               break;
+-      case IXGBE_ERR_PRIMARY_REQUESTS_PENDING:
++      case -EALREADY:
+               e_dev_err("primary disable timed out\n");
+               break;
+-      case IXGBE_ERR_EEPROM_VERSION:
++      case -EACCES:
+               /* We are running on a pre-production device, log a warning */
+               e_dev_warn("This device is a pre-production adapter/LOM. "
+                          "Please be aware there may be issues associated with "
+@@ -7829,10 +7829,10 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
+       adapter->sfp_poll_time = jiffies + IXGBE_SFP_POLL_JIFFIES - 1;
+       err = hw->phy.ops.identify_sfp(hw);
+-      if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
++      if (err == -EOPNOTSUPP)
+               goto sfp_out;
+-      if (err == IXGBE_ERR_SFP_NOT_PRESENT) {
++      if (err == -ENOENT) {
+               /* If no cable is present, then we need to reset
+                * the next time we find a good cable. */
+               adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
+@@ -7858,7 +7858,7 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
+       else
+               err = hw->mac.ops.setup_sfp(hw);
+-      if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
++      if (err == -EOPNOTSUPP)
+               goto sfp_out;
+       adapter->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;
+@@ -7867,8 +7867,8 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
+ sfp_out:
+       clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state);
+-      if ((err == IXGBE_ERR_SFP_NOT_SUPPORTED) &&
+-          (adapter->netdev->reg_state == NETREG_REGISTERED)) {
++      if (err == -EOPNOTSUPP &&
++          adapter->netdev->reg_state == NETREG_REGISTERED) {
+               e_dev_err("failed to initialize because an unsupported "
+                         "SFP+ module type was detected.\n");
+               e_dev_err("Reload the driver after installing a "
+@@ -10922,9 +10922,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+       err = hw->mac.ops.reset_hw(hw);
+       hw->phy.reset_if_overtemp = false;
+       ixgbe_set_eee_capable(adapter);
+-      if (err == IXGBE_ERR_SFP_NOT_PRESENT) {
++      if (err == -ENOENT) {
+               err = 0;
+-      } else if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
++      } else if (err == -EOPNOTSUPP) {
+               e_dev_err("failed to load because an unsupported SFP+ or QSFP module type was detected.\n");
+               e_dev_err("Reload the driver after installing a supported module.\n");
+               goto err_sw_init;
+@@ -11143,7 +11143,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+       /* reset the hardware with the new settings */
+       err = hw->mac.ops.start_hw(hw);
+-      if (err == IXGBE_ERR_EEPROM_VERSION) {
++      if (err == -EACCES) {
+               /* We are running on a pre-production device, log a warning */
+               e_dev_warn("This device is a pre-production adapter/LOM. "
+                          "Please be aware there may be issues associated "
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c
+index 5679293e53f7..fe7ef5773369 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c
+@@ -24,7 +24,7 @@ s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
+               size = mbx->size;
+       if (!mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       return mbx->ops->read(hw, msg, size, mbx_id);
+ }
+@@ -43,10 +43,10 @@ s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
+       struct ixgbe_mbx_info *mbx = &hw->mbx;
+       if (size > mbx->size)
+-              return IXGBE_ERR_MBX;
++              return -EINVAL;
+       if (!mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       return mbx->ops->write(hw, msg, size, mbx_id);
+ }
+@@ -63,7 +63,7 @@ s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
+       struct ixgbe_mbx_info *mbx = &hw->mbx;
+       if (!mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       return mbx->ops->check_for_msg(hw, mbx_id);
+ }
+@@ -80,7 +80,7 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
+       struct ixgbe_mbx_info *mbx = &hw->mbx;
+       if (!mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       return mbx->ops->check_for_ack(hw, mbx_id);
+ }
+@@ -97,7 +97,7 @@ s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)
+       struct ixgbe_mbx_info *mbx = &hw->mbx;
+       if (!mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       return mbx->ops->check_for_rst(hw, mbx_id);
+ }
+@@ -115,12 +115,12 @@ static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
+       int countdown = mbx->timeout;
+       if (!countdown || !mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       while (mbx->ops->check_for_msg(hw, mbx_id)) {
+               countdown--;
+               if (!countdown)
+-                      return IXGBE_ERR_MBX;
++                      return -EIO;
+               udelay(mbx->usec_delay);
+       }
+@@ -140,12 +140,12 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
+       int countdown = mbx->timeout;
+       if (!countdown || !mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       while (mbx->ops->check_for_ack(hw, mbx_id)) {
+               countdown--;
+               if (!countdown)
+-                      return IXGBE_ERR_MBX;
++                      return -EIO;
+               udelay(mbx->usec_delay);
+       }
+@@ -169,7 +169,7 @@ static s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
+       s32 ret_val;
+       if (!mbx->ops)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       ret_val = ixgbe_poll_for_msg(hw, mbx_id);
+       if (ret_val)
+@@ -197,7 +197,7 @@ static s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
+       /* exit if either we can't write or there isn't a defined timeout */
+       if (!mbx->ops || !mbx->timeout)
+-              return IXGBE_ERR_MBX;
++              return -EIO;
+       /* send msg */
+       ret_val = mbx->ops->write(hw, msg, size, mbx_id);
+@@ -217,7 +217,7 @@ static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)
+               return 0;
+       }
+-      return IXGBE_ERR_MBX;
++      return -EIO;
+ }
+ /**
+@@ -238,7 +238,7 @@ static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)
+               return 0;
+       }
+-      return IXGBE_ERR_MBX;
++      return -EIO;
+ }
+ /**
+@@ -259,7 +259,7 @@ static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)
+               return 0;
+       }
+-      return IXGBE_ERR_MBX;
++      return -EIO;
+ }
+ /**
+@@ -295,7 +295,7 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
+               return 0;
+       }
+-      return IXGBE_ERR_MBX;
++      return -EIO;
+ }
+ /**
+@@ -317,7 +317,7 @@ static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
+       if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
+               return 0;
+-      return IXGBE_ERR_MBX;
++      return -EIO;
+ }
+ /**
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+index 8f4316b19278..6434c190e7a4 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+@@ -7,7 +7,6 @@
+ #include "ixgbe_type.h"
+ #define IXGBE_VFMAILBOX_SIZE        16 /* 16 32 bit words - 64 bytes */
+-#define IXGBE_ERR_MBX               -100
+ #define IXGBE_VFMAILBOX             0x002FC
+ #define IXGBE_VFMBMEM               0x00200
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+index 689470c1e8ad..7c0a1a0a5eda 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+@@ -102,7 +102,7 @@ s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
+       csum = ~csum;
+       do {
+               if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               ixgbe_i2c_start(hw);
+               /* Device Address and write indication */
+               if (ixgbe_out_i2c_byte_ack(hw, addr))
+@@ -150,7 +150,7 @@ s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
+                       hw_dbg(hw, "I2C byte read combined error.\n");
+       } while (retry < max_retry);
+-      return IXGBE_ERR_I2C;
++      return -EIO;
+ }
+ /**
+@@ -179,7 +179,7 @@ s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
+       csum = ~csum;
+       do {
+               if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               ixgbe_i2c_start(hw);
+               /* Device Address and write indication */
+               if (ixgbe_out_i2c_byte_ack(hw, addr))
+@@ -215,7 +215,7 @@ s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
+                       hw_dbg(hw, "I2C byte write combined error.\n");
+       } while (retry < max_retry);
+-      return IXGBE_ERR_I2C;
++      return -EIO;
+ }
+ /**
+@@ -262,8 +262,8 @@ static bool ixgbe_probe_phy(struct ixgbe_hw *hw, u16 phy_addr)
+  **/
+ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
+ {
++      u32 status = -EFAULT;
+       u32 phy_addr;
+-      u32 status = IXGBE_ERR_PHY_ADDR_INVALID;
+       if (!hw->phy.phy_semaphore_mask) {
+               if (hw->bus.lan_id)
+@@ -282,7 +282,7 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
+               if (ixgbe_probe_phy(hw, phy_addr))
+                       return 0;
+               else
+-                      return IXGBE_ERR_PHY_ADDR_INVALID;
++                      return -EFAULT;
+       }
+       for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
+@@ -457,7 +457,7 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
+       if (ctrl & MDIO_CTRL1_RESET) {
+               hw_dbg(hw, "PHY reset polling failed to complete.\n");
+-              return IXGBE_ERR_RESET_FAILED;
++              return -EIO;
+       }
+       return 0;
+@@ -500,7 +500,7 @@ s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
+       if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
+               hw_dbg(hw, "PHY address command did not complete.\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       /* Address cycle complete, setup and write the read
+@@ -527,7 +527,7 @@ s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
+       if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
+               hw_dbg(hw, "PHY read command didn't complete\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       /* Read operation is complete.  Get the data
+@@ -559,7 +559,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
+                                               phy_data);
+               hw->mac.ops.release_swfw_sync(hw, gssr);
+       } else {
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       }
+       return status;
+@@ -604,7 +604,7 @@ s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
+       if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
+               hw_dbg(hw, "PHY address cmd didn't complete\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       /*
+@@ -632,7 +632,7 @@ s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
+       if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
+               hw_dbg(hw, "PHY write cmd didn't complete\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       return 0;
+@@ -657,7 +657,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
+                                                phy_data);
+               hw->mac.ops.release_swfw_sync(hw, gssr);
+       } else {
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       }
+       return status;
+@@ -1430,7 +1430,7 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
+       if ((phy_data & MDIO_CTRL1_RESET) != 0) {
+               hw_dbg(hw, "PHY reset did not complete.\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       /* Get init offsets */
+@@ -1487,12 +1487,12 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
+                               hw_dbg(hw, "SOL\n");
+                       } else {
+                               hw_dbg(hw, "Bad control value\n");
+-                              return IXGBE_ERR_PHY;
++                              return -EIO;
+                       }
+                       break;
+               default:
+                       hw_dbg(hw, "Bad control type\n");
+-                      return IXGBE_ERR_PHY;
++                      return -EIO;
+               }
+       }
+@@ -1500,7 +1500,7 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
+ err_eeprom:
+       hw_err(hw, "eeprom read at offset %d failed\n", data_offset);
+-      return IXGBE_ERR_PHY;
++      return -EIO;
+ }
+ /**
+@@ -1518,10 +1518,10 @@ s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw)
+               return ixgbe_identify_qsfp_module_generic(hw);
+       default:
+               hw->phy.sfp_type = ixgbe_sfp_type_not_present;
+-              return IXGBE_ERR_SFP_NOT_PRESENT;
++              return -ENOENT;
+       }
+-      return IXGBE_ERR_SFP_NOT_PRESENT;
++      return -ENOENT;
+ }
+ /**
+@@ -1546,7 +1546,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
+       if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
+               hw->phy.sfp_type = ixgbe_sfp_type_not_present;
+-              return IXGBE_ERR_SFP_NOT_PRESENT;
++              return -ENOENT;
+       }
+       /* LAN ID is needed for sfp_type determination */
+@@ -1561,7 +1561,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
+       if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
+               hw->phy.type = ixgbe_phy_sfp_unsupported;
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       }
+       status = hw->phy.ops.read_i2c_eeprom(hw,
+                                            IXGBE_SFF_1GBE_COMP_CODES,
+@@ -1752,7 +1752,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
+             hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
+             hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
+               hw->phy.type = ixgbe_phy_sfp_unsupported;
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       }
+       /* Anything else 82598-based is supported */
+@@ -1776,7 +1776,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
+               }
+               hw_dbg(hw, "SFP+ module not supported\n");
+               hw->phy.type = ixgbe_phy_sfp_unsupported;
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       }
+       return 0;
+@@ -1786,7 +1786,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
+               hw->phy.id = 0;
+               hw->phy.type = ixgbe_phy_unknown;
+       }
+-      return IXGBE_ERR_SFP_NOT_PRESENT;
++      return -ENOENT;
+ }
+ /**
+@@ -1813,7 +1813,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
+       if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) {
+               hw->phy.sfp_type = ixgbe_sfp_type_not_present;
+-              return IXGBE_ERR_SFP_NOT_PRESENT;
++              return -ENOENT;
+       }
+       /* LAN ID is needed for sfp_type determination */
+@@ -1827,7 +1827,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
+       if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
+               hw->phy.type = ixgbe_phy_sfp_unsupported;
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       }
+       hw->phy.id = identifier;
+@@ -1895,7 +1895,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
+               } else {
+                       /* unsupported module type */
+                       hw->phy.type = ixgbe_phy_sfp_unsupported;
+-                      return IXGBE_ERR_SFP_NOT_SUPPORTED;
++                      return -EOPNOTSUPP;
+               }
+       }
+@@ -1955,7 +1955,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
+                       }
+                       hw_dbg(hw, "QSFP module not supported\n");
+                       hw->phy.type = ixgbe_phy_sfp_unsupported;
+-                      return IXGBE_ERR_SFP_NOT_SUPPORTED;
++                      return -EOPNOTSUPP;
+               }
+               return 0;
+       }
+@@ -1966,7 +1966,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
+       hw->phy.id = 0;
+       hw->phy.type = ixgbe_phy_unknown;
+-      return IXGBE_ERR_SFP_NOT_PRESENT;
++      return -ENOENT;
+ }
+ /**
+@@ -1986,14 +1986,14 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
+       u16 sfp_type = hw->phy.sfp_type;
+       if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
+-              return IXGBE_ERR_SFP_NOT_PRESENT;
++              return -ENOENT;
+       if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
+           (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       /*
+        * Limiting active cables and 1G Phys must be initialized as
+@@ -2014,11 +2014,11 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
+       if (hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset)) {
+               hw_err(hw, "eeprom read at %d failed\n",
+                      IXGBE_PHY_INIT_OFFSET_NL);
+-              return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
++              return -EIO;
+       }
+       if ((!*list_offset) || (*list_offset == 0xFFFF))
+-              return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
++              return -EIO;
+       /* Shift offset to first ID word */
+       (*list_offset)++;
+@@ -2037,7 +2037,7 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
+                               goto err_phy;
+                       if ((!*data_offset) || (*data_offset == 0xFFFF)) {
+                               hw_dbg(hw, "SFP+ module not supported\n");
+-                              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++                              return -EOPNOTSUPP;
+                       } else {
+                               break;
+                       }
+@@ -2050,14 +2050,14 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
+       if (sfp_id == IXGBE_PHY_INIT_END_NL) {
+               hw_dbg(hw, "No matching SFP+ module found\n");
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       }
+       return 0;
+ err_phy:
+       hw_err(hw, "eeprom read at offset %d failed\n", *list_offset);
+-      return IXGBE_ERR_PHY;
++      return -EIO;
+ }
+ /**
+@@ -2152,7 +2152,7 @@ static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
+       do {
+               if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               ixgbe_i2c_start(hw);
+@@ -2268,7 +2268,7 @@ static s32 ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
+       u32 swfw_mask = hw->phy.phy_semaphore_mask;
+       if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       do {
+               ixgbe_i2c_start(hw);
+@@ -2510,7 +2510,7 @@ static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
+       if (ack == 1) {
+               hw_dbg(hw, "I2C ack was not received.\n");
+-              status = IXGBE_ERR_I2C;
++              status = -EIO;
+       }
+       ixgbe_lower_i2c_clk(hw, &i2cctl);
+@@ -2582,7 +2582,7 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
+               udelay(IXGBE_I2C_T_LOW);
+       } else {
+               hw_dbg(hw, "I2C data was not set to %X\n", data);
+-              return IXGBE_ERR_I2C;
++              return -EIO;
+       }
+       return 0;
+@@ -2678,7 +2678,7 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
+       *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL(hw));
+       if (data != ixgbe_get_i2c_data(hw, i2cctl)) {
+               hw_dbg(hw, "Error - I2C data was not set to %X.\n", data);
+-              return IXGBE_ERR_I2C;
++              return -EIO;
+       }
+       return 0;
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+index ea88ac04ab9a..198ab9d97618 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+@@ -1329,7 +1329,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
+               break;
+       default:
+               e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
+-              retval = IXGBE_ERR_MBX;
++              retval = -EIO;
+               break;
+       }
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+index 2b00db92b08f..4b19b1282f28 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+@@ -3665,45 +3665,6 @@ struct ixgbe_info {
+       const u32                       *mvals;
+ };
+-
+-/* Error Codes */
+-#define IXGBE_ERR_EEPROM                        -1
+-#define IXGBE_ERR_EEPROM_CHECKSUM               -2
+-#define IXGBE_ERR_PHY                           -3
+-#define IXGBE_ERR_CONFIG                        -4
+-#define IXGBE_ERR_PARAM                         -5
+-#define IXGBE_ERR_MAC_TYPE                      -6
+-#define IXGBE_ERR_UNKNOWN_PHY                   -7
+-#define IXGBE_ERR_LINK_SETUP                    -8
+-#define IXGBE_ERR_ADAPTER_STOPPED               -9
+-#define IXGBE_ERR_INVALID_MAC_ADDR              -10
+-#define IXGBE_ERR_DEVICE_NOT_SUPPORTED          -11
+-#define IXGBE_ERR_PRIMARY_REQUESTS_PENDING      -12
+-#define IXGBE_ERR_INVALID_LINK_SETTINGS         -13
+-#define IXGBE_ERR_AUTONEG_NOT_COMPLETE          -14
+-#define IXGBE_ERR_RESET_FAILED                  -15
+-#define IXGBE_ERR_SWFW_SYNC                     -16
+-#define IXGBE_ERR_PHY_ADDR_INVALID              -17
+-#define IXGBE_ERR_I2C                           -18
+-#define IXGBE_ERR_SFP_NOT_SUPPORTED             -19
+-#define IXGBE_ERR_SFP_NOT_PRESENT               -20
+-#define IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT       -21
+-#define IXGBE_ERR_NO_SAN_ADDR_PTR               -22
+-#define IXGBE_ERR_FDIR_REINIT_FAILED            -23
+-#define IXGBE_ERR_EEPROM_VERSION                -24
+-#define IXGBE_ERR_NO_SPACE                      -25
+-#define IXGBE_ERR_OVERTEMP                      -26
+-#define IXGBE_ERR_FC_NOT_NEGOTIATED             -27
+-#define IXGBE_ERR_FC_NOT_SUPPORTED              -28
+-#define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE        -30
+-#define IXGBE_ERR_PBA_SECTION                   -31
+-#define IXGBE_ERR_INVALID_ARGUMENT              -32
+-#define IXGBE_ERR_HOST_INTERFACE_COMMAND        -33
+-#define IXGBE_ERR_FDIR_CMD_INCOMPLETE         -38
+-#define IXGBE_ERR_FW_RESP_INVALID             -39
+-#define IXGBE_ERR_TOKEN_RETRY                 -40
+-#define IXGBE_NOT_IMPLEMENTED                   0x7FFFFFFF
+-
+ #define IXGBE_FUSES0_GROUP(_i)                (0x11158 + ((_i) * 4))
+ #define IXGBE_FUSES0_300MHZ           BIT(5)
+ #define IXGBE_FUSES0_REV_MASK         (3u << 6)
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
+index d5cfb51ff648..15325c549d9b 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
+@@ -84,7 +84,7 @@ s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
+       status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
+       if (status) {
+               hw_dbg(hw, "semaphore failed with %d", status);
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       }
+       ctrl = IXGBE_CTRL_RST;
+@@ -103,7 +103,7 @@ s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
+       }
+       if (ctrl & IXGBE_CTRL_RST_MASK) {
+-              status = IXGBE_ERR_RESET_FAILED;
++              status = -EIO;
+               hw_dbg(hw, "Reset polling failed to complete.\n");
+       }
+       msleep(100);
+@@ -220,7 +220,7 @@ static s32 ixgbe_read_eerd_X540(struct ixgbe_hw *hw, u16 offset, u16 *data)
+       s32 status;
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = ixgbe_read_eerd_generic(hw, offset, data);
+@@ -243,7 +243,7 @@ static s32 ixgbe_read_eerd_buffer_X540(struct ixgbe_hw *hw,
+       s32 status;
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = ixgbe_read_eerd_buffer_generic(hw, offset, words, data);
+@@ -264,7 +264,7 @@ static s32 ixgbe_write_eewr_X540(struct ixgbe_hw *hw, u16 offset, u16 data)
+       s32 status;
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = ixgbe_write_eewr_generic(hw, offset, data);
+@@ -287,7 +287,7 @@ static s32 ixgbe_write_eewr_buffer_X540(struct ixgbe_hw *hw,
+       s32 status;
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = ixgbe_write_eewr_buffer_generic(hw, offset, words, data);
+@@ -324,7 +324,7 @@ static s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
+       for (i = 0; i < checksum_last_word; i++) {
+               if (ixgbe_read_eerd_generic(hw, i, &word)) {
+                       hw_dbg(hw, "EEPROM read failed\n");
+-                      return IXGBE_ERR_EEPROM;
++                      return -EIO;
+               }
+               checksum += word;
+       }
+@@ -349,7 +349,7 @@ static s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
+               if (ixgbe_read_eerd_generic(hw, pointer, &length)) {
+                       hw_dbg(hw, "EEPROM read failed\n");
+-                      return IXGBE_ERR_EEPROM;
++                      return -EIO;
+               }
+               /* Skip pointer section if length is invalid. */
+@@ -360,7 +360,7 @@ static s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
+               for (j = pointer + 1; j <= pointer + length; j++) {
+                       if (ixgbe_read_eerd_generic(hw, j, &word)) {
+                               hw_dbg(hw, "EEPROM read failed\n");
+-                              return IXGBE_ERR_EEPROM;
++                              return -EIO;
+                       }
+                       checksum += word;
+               }
+@@ -397,7 +397,7 @@ static s32 ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
+       }
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = hw->eeprom.ops.calc_checksum(hw);
+       if (status < 0)
+@@ -418,7 +418,7 @@ static s32 ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
+        */
+       if (read_checksum != checksum) {
+               hw_dbg(hw, "Invalid EEPROM checksum");
+-              status = IXGBE_ERR_EEPROM_CHECKSUM;
++              status = -EIO;
+       }
+       /* If the user cares, return the calculated checksum */
+@@ -455,7 +455,7 @@ static s32 ixgbe_update_eeprom_checksum_X540(struct ixgbe_hw *hw)
+       }
+       if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
+-              return  IXGBE_ERR_SWFW_SYNC;
++              return  -EBUSY;
+       status = hw->eeprom.ops.calc_checksum(hw);
+       if (status < 0)
+@@ -490,7 +490,7 @@ static s32 ixgbe_update_flash_X540(struct ixgbe_hw *hw)
+       s32 status;
+       status = ixgbe_poll_flash_update_done_X540(hw);
+-      if (status == IXGBE_ERR_EEPROM) {
++      if (status == -EIO) {
+               hw_dbg(hw, "Flash update time out\n");
+               return status;
+       }
+@@ -540,7 +540,7 @@ static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw)
+                       return 0;
+               udelay(5);
+       }
+-      return IXGBE_ERR_EEPROM;
++      return -EIO;
+ }
+ /**
+@@ -575,7 +575,7 @@ s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
+                * SW_FW_SYNC bits (not just NVM)
+                */
+               if (ixgbe_get_swfw_sync_semaphore(hw))
+-                      return IXGBE_ERR_SWFW_SYNC;
++                      return -EBUSY;
+               swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC(hw));
+               if (!(swfw_sync & (fwmask | swmask | hwmask))) {
+@@ -599,7 +599,7 @@ s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
+        * bits in the SW_FW_SYNC register.
+        */
+       if (ixgbe_get_swfw_sync_semaphore(hw))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC(hw));
+       if (swfw_sync & (fwmask | hwmask)) {
+               swfw_sync |= swmask;
+@@ -622,11 +622,11 @@ s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
+                       rmask |= IXGBE_GSSR_I2C_MASK;
+               ixgbe_release_swfw_sync_X540(hw, rmask);
+               ixgbe_release_swfw_sync_semaphore(hw);
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       }
+       ixgbe_release_swfw_sync_semaphore(hw);
+-      return IXGBE_ERR_SWFW_SYNC;
++      return -EBUSY;
+ }
+ /**
+@@ -680,7 +680,7 @@ static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
+       if (i == timeout) {
+               hw_dbg(hw,
+                      "Software semaphore SMBI between device drivers not granted.\n");
+-              return IXGBE_ERR_EEPROM;
++              return -EIO;
+       }
+       /* Now get the semaphore between SW/FW through the REGSMP bit */
+@@ -697,7 +697,7 @@ static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
+        */
+       hw_dbg(hw, "REGSMP Software NVM semaphore not granted\n");
+       ixgbe_release_swfw_sync_semaphore(hw);
+-      return IXGBE_ERR_EEPROM;
++      return -EIO;
+ }
+ /**
+@@ -768,7 +768,7 @@ s32 ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, u32 index)
+       bool link_up;
+       if (index > 3)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* Link should be up in order for the blink bit in the LED control
+        * register to work. Force link and speed in the MAC if link is down.
+@@ -804,7 +804,7 @@ s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, u32 index)
+       u32 ledctl_reg;
+       if (index > 3)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* Restore the LED to its default value. */
+       ledctl_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+index aa4bf6c9a2f7..19de26520a88 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+@@ -206,13 +206,13 @@ static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
+       }
+       if (retry == IXGBE_CS4227_RETRIES) {
+               hw_err(hw, "CS4227 reset did not complete\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value);
+       if (status || !(value & IXGBE_CS4227_EEPROM_LOAD_OK)) {
+               hw_err(hw, "CS4227 EEPROM did not load successfully\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       return 0;
+@@ -350,13 +350,13 @@ static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
+ static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
+                                    u32 device_type, u16 *phy_data)
+ {
+-      return IXGBE_NOT_IMPLEMENTED;
++      return -EOPNOTSUPP;
+ }
+ static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
+                                     u32 device_type, u16 phy_data)
+ {
+-      return IXGBE_NOT_IMPLEMENTED;
++      return -EOPNOTSUPP;
+ }
+ /**
+@@ -463,7 +463,7 @@ s32 ixgbe_fw_phy_activity(struct ixgbe_hw *hw, u16 activity,
+               --retries;
+       } while (retries > 0);
+-      return IXGBE_ERR_HOST_INTERFACE_COMMAND;
++      return -EIO;
+ }
+ static const struct {
+@@ -511,7 +511,7 @@ static s32 ixgbe_get_phy_id_fw(struct ixgbe_hw *hw)
+       hw->phy.id |= phy_id_lo & IXGBE_PHY_REVISION_MASK;
+       hw->phy.revision = phy_id_lo & ~IXGBE_PHY_REVISION_MASK;
+       if (!hw->phy.id || hw->phy.id == IXGBE_PHY_REVISION_MASK)
+-              return IXGBE_ERR_PHY_ADDR_INVALID;
++              return -EFAULT;
+       hw->phy.autoneg_advertised = hw->phy.speeds_supported;
+       hw->phy.eee_speeds_supported = IXGBE_LINK_SPEED_100_FULL |
+@@ -568,7 +568,7 @@ static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
+       if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
+               hw_err(hw, "rx_pause not valid in strict IEEE mode\n");
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       }
+       switch (hw->fc.requested_mode) {
+@@ -675,7 +675,7 @@ static s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl)
+               *ctrl = command;
+       if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
+               hw_dbg(hw, "IOSF wait timed out\n");
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       return 0;
+@@ -715,7 +715,7 @@ static s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+               error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
+                        IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
+               hw_dbg(hw, "Failed to read, error %x\n", error);
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+       if (!ret)
+@@ -750,9 +750,9 @@ static s32 ixgbe_get_phy_token(struct ixgbe_hw *hw)
+       if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
+               return 0;
+       if (token_cmd.hdr.cmd_or_resp.ret_status != FW_PHY_TOKEN_RETRY)
+-              return IXGBE_ERR_FW_RESP_INVALID;
++              return -EIO;
+-      return IXGBE_ERR_TOKEN_RETRY;
++      return -EAGAIN;
+ }
+ /**
+@@ -778,7 +778,7 @@ static s32 ixgbe_put_phy_token(struct ixgbe_hw *hw)
+               return status;
+       if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
+               return 0;
+-      return IXGBE_ERR_FW_RESP_INVALID;
++      return -EIO;
+ }
+ /**
+@@ -942,7 +942,7 @@ static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
+               local_buffer = buf;
+       } else {
+               if (buffer_size < ptr)
+-                      return  IXGBE_ERR_PARAM;
++                      return  -EINVAL;
+               local_buffer = &buffer[ptr];
+       }
+@@ -960,7 +960,7 @@ static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
+       }
+       if (buffer && ((u32)start + (u32)length > buffer_size))
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       for (i = start; length; i++, length--) {
+               if (i == bufsz && !buffer) {
+@@ -1012,7 +1012,7 @@ static s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer,
+               local_buffer = eeprom_ptrs;
+       } else {
+               if (buffer_size < IXGBE_EEPROM_LAST_WORD)
+-                      return IXGBE_ERR_PARAM;
++                      return -EINVAL;
+               local_buffer = buffer;
+       }
+@@ -1148,7 +1148,7 @@ static s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw,
+        * calculated checksum
+        */
+       if (read_checksum != checksum) {
+-              status = IXGBE_ERR_EEPROM_CHECKSUM;
++              status = -EIO;
+               hw_dbg(hw, "Invalid EEPROM checksum");
+       }
+@@ -1203,7 +1203,7 @@ static s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 data)
+               hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+       } else {
+               hw_dbg(hw, "write ee hostif failed to get semaphore");
+-              status = IXGBE_ERR_SWFW_SYNC;
++              status = -EBUSY;
+       }
+       return status;
+@@ -1415,7 +1415,7 @@ static s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+               error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
+                        IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
+               hw_dbg(hw, "Failed to write, error %x\n", error);
+-              return IXGBE_ERR_PHY;
++              return -EIO;
+       }
+ out:
+@@ -1558,7 +1558,7 @@ static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
+       /* iXFI is only supported with X552 */
+       if (mac->type != ixgbe_mac_X550EM_x)
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EIO;
+       /* Disable AN and force speed to 10G Serial. */
+       status = ixgbe_read_iosf_sb_reg_x550(hw,
+@@ -1580,7 +1580,7 @@ static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
+               break;
+       default:
+               /* Other link speeds are not supported by internal KR PHY. */
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EINVAL;
+       }
+       status = ixgbe_write_iosf_sb_reg_x550(hw,
+@@ -1611,7 +1611,7 @@ static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
+ {
+       switch (hw->phy.sfp_type) {
+       case ixgbe_sfp_type_not_present:
+-              return IXGBE_ERR_SFP_NOT_PRESENT;
++              return -ENOENT;
+       case ixgbe_sfp_type_da_cu_core0:
+       case ixgbe_sfp_type_da_cu_core1:
+               *linear = true;
+@@ -1630,7 +1630,7 @@ static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
+       case ixgbe_sfp_type_1g_cu_core0:
+       case ixgbe_sfp_type_1g_cu_core1:
+       default:
+-              return IXGBE_ERR_SFP_NOT_SUPPORTED;
++              return -EOPNOTSUPP;
+       }
+       return 0;
+@@ -1660,7 +1660,7 @@ ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
+        * there is no reason to configure CS4227 and SFP not present error is
+        * not accepted in the setup MAC link flow.
+        */
+-      if (status == IXGBE_ERR_SFP_NOT_PRESENT)
++      if (status == -ENOENT)
+               return 0;
+       if (status)
+@@ -1718,7 +1718,7 @@ static s32 ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
+               break;
+       default:
+               /* Other link speeds are not supported by internal PHY. */
+-              return IXGBE_ERR_LINK_SETUP;
++              return -EINVAL;
+       }
+       (void)mac->ops.write_iosf_sb_reg(hw,
+@@ -1803,7 +1803,7 @@ ixgbe_setup_mac_link_sfp_n(struct ixgbe_hw *hw, ixgbe_link_speed speed,
+       /* If no SFP module present, then return success. Return success since
+        * SFP not present error is not excepted in the setup MAC link flow.
+        */
+-      if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
++      if (ret_val == -ENOENT)
+               return 0;
+       if (ret_val)
+@@ -1853,7 +1853,7 @@ ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw, ixgbe_link_speed speed,
+       /* If no SFP module present, then return success. Return success since
+        * SFP not present error is not excepted in the setup MAC link flow.
+        */
+-      if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
++      if (ret_val == -ENOENT)
+               return 0;
+       if (ret_val)
+@@ -1863,7 +1863,7 @@ ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw, ixgbe_link_speed speed,
+       ixgbe_setup_kr_speed_x550em(hw, speed);
+       if (hw->phy.mdio.prtad == MDIO_PRTAD_NONE)
+-              return IXGBE_ERR_PHY_ADDR_INVALID;
++              return -EFAULT;
+       /* Get external PHY SKU id */
+       ret_val = hw->phy.ops.read_reg(hw, IXGBE_CS4227_EFUSE_PDF_SKU,
+@@ -1962,7 +1962,7 @@ static s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw,
+       u16 i, autoneg_status;
+       if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       status = ixgbe_check_mac_link_generic(hw, speed, link_up,
+                                             link_up_wait_to_complete);
+@@ -2145,9 +2145,9 @@ static s32 ixgbe_setup_sgmii_fw(struct ixgbe_hw *hw, ixgbe_link_speed speed,
+  */
+ static void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
+ {
+-      s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
+       u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
+       ixgbe_link_speed speed;
++      s32 status = -EIO;
+       bool link_up;
+       /* AN should have completed when the cable was plugged in.
+@@ -2165,7 +2165,7 @@ static void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
+       /* Check if auto-negotiation has completed */
+       status = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &info);
+       if (status || !(info[0] & FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE)) {
+-              status = IXGBE_ERR_FC_NOT_NEGOTIATED;
++              status = -EIO;
+               goto out;
+       }
+@@ -2692,7 +2692,7 @@ static s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
+       u16 speed;
+       if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       if (!(hw->mac.type == ixgbe_mac_X550EM_x &&
+             !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE))) {
+@@ -2735,7 +2735,7 @@ static s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
+               break;
+       default:
+               /* Internal PHY does not support anything else */
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       }
+       return ixgbe_setup_ixfi_x550em(hw, &force_speed);
+@@ -2767,7 +2767,7 @@ static s32 ixgbe_led_on_t_x550em(struct ixgbe_hw *hw, u32 led_idx)
+       u16 phy_data;
+       if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* To turn on the LED, set mode to ON. */
+       hw->phy.ops.read_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
+@@ -2789,7 +2789,7 @@ static s32 ixgbe_led_off_t_x550em(struct ixgbe_hw *hw, u32 led_idx)
+       u16 phy_data;
+       if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
+-              return IXGBE_ERR_PARAM;
++              return -EINVAL;
+       /* To turn on the LED, set mode to ON. */
+       hw->phy.ops.read_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
+@@ -2813,8 +2813,9 @@ static s32 ixgbe_led_off_t_x550em(struct ixgbe_hw *hw, u32 led_idx)
+  *
+  *  Sends driver version number to firmware through the manageability
+  *  block.  On success return 0
+- *  else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
+- *  semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
++ *  else returns -EBUSY when encountering an error acquiring
++ *  semaphore, -EIO when command fails or -ENIVAL when incorrect
++ *  params passed.
+  **/
+ static s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
+                                    u8 build, u8 sub, u16 len,
+@@ -2825,7 +2826,7 @@ static s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
+       int i;
+       if (!len || !driver_ver || (len > sizeof(fw_cmd.driver_string)))
+-              return IXGBE_ERR_INVALID_ARGUMENT;
++              return -EINVAL;
+       fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO;
+       fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN + len;
+@@ -2850,7 +2851,7 @@ static s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
+               if (fw_cmd.hdr.cmd_or_resp.ret_status !=
+                   FW_CEM_RESP_STATUS_SUCCESS)
+-                      return IXGBE_ERR_HOST_INTERFACE_COMMAND;
++                      return -EIO;
+               return 0;
+       }
+@@ -2907,7 +2908,7 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
+       /* Validate the requested mode */
+       if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
+               hw_err(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       }
+       /* 10gig parts do not have a word in the EEPROM to determine the
+@@ -2942,7 +2943,7 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
+               break;
+       default:
+               hw_err(hw, "Flow control param set incorrectly\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       switch (hw->device_id) {
+@@ -2986,8 +2987,8 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
+ static void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
+ {
+       u32 link_s1, lp_an_page_low, an_cntl_1;
+-      s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
+       ixgbe_link_speed speed;
++      s32 status = -EIO;
+       bool link_up;
+       /* AN should have completed when the cable was plugged in.
+@@ -3013,7 +3014,7 @@ static void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
+       if (status || (link_s1 & IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE) == 0) {
+               hw_dbg(hw, "Auto-Negotiation did not complete\n");
+-              status = IXGBE_ERR_FC_NOT_NEGOTIATED;
++              status = -EIO;
+               goto out;
+       }
+@@ -3251,8 +3252,7 @@ static s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
+       /* Identify the PHY or SFP module */
+       ret_val = phy->ops.identify(hw);
+-      if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED ||
+-          ret_val == IXGBE_ERR_PHY_ADDR_INVALID)
++      if (ret_val == -EOPNOTSUPP || ret_val == -EFAULT)
+               return ret_val;
+       /* Setup function pointers based on detected hardware */
+@@ -3460,8 +3460,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
+       /* PHY ops must be identified and initialized prior to reset */
+       status = hw->phy.ops.init(hw);
+-      if (status == IXGBE_ERR_SFP_NOT_SUPPORTED ||
+-          status == IXGBE_ERR_PHY_ADDR_INVALID)
++      if (status == -EOPNOTSUPP || status == -EFAULT)
+               return status;
+       /* start the external PHY */
+@@ -3477,7 +3476,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
+               hw->phy.sfp_setup_needed = false;
+       }
+-      if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
++      if (status == -EOPNOTSUPP)
+               return status;
+       /* Reset PHY */
+@@ -3501,7 +3500,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
+       status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
+       if (status) {
+               hw_dbg(hw, "semaphore failed with %d", status);
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       }
+       ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
+@@ -3519,7 +3518,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
+       }
+       if (ctrl & IXGBE_CTRL_RST_MASK) {
+-              status = IXGBE_ERR_RESET_FAILED;
++              status = -EIO;
+               hw_dbg(hw, "Reset polling failed to complete.\n");
+       }
+@@ -3615,7 +3614,7 @@ static s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
+       /* Validate the requested mode */
+       if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
+               hw_err(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
+-              return IXGBE_ERR_INVALID_LINK_SETTINGS;
++              return -EINVAL;
+       }
+       if (hw->fc.requested_mode == ixgbe_fc_default)
+@@ -3672,7 +3671,7 @@ static s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
+               break;
+       default:
+               hw_err(hw, "Flow control param set incorrectly\n");
+-              return IXGBE_ERR_CONFIG;
++              return -EIO;
+       }
+       status = hw->mac.ops.write_iosf_sb_reg(hw,
+@@ -3768,7 +3767,7 @@ static s32 ixgbe_acquire_swfw_sync_x550em_a(struct ixgbe_hw *hw, u32 mask)
+                       return 0;
+               if (hmask)
+                       ixgbe_release_swfw_sync_X540(hw, hmask);
+-              if (status != IXGBE_ERR_TOKEN_RETRY)
++              if (status != -EAGAIN)
+                       return status;
+               msleep(FW_PHY_TOKEN_DELAY);
+       }
+@@ -3812,7 +3811,7 @@ static s32 ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
+       s32 status;
+       if (hw->mac.ops.acquire_swfw_sync(hw, mask))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
+@@ -3838,7 +3837,7 @@ static s32 ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
+       s32 status;
+       if (hw->mac.ops.acquire_swfw_sync(hw, mask))
+-              return IXGBE_ERR_SWFW_SYNC;
++              return -EBUSY;
+       status = ixgbe_write_phy_reg_mdi(hw, reg_addr, device_type, phy_data);
+       hw->mac.ops.release_swfw_sync(hw, mask);
+-- 
+2.43.0
+
diff --git a/queue-6.6/kunit-run-test-suites-only-after-module-initializati.patch b/queue-6.6/kunit-run-test-suites-only-after-module-initializati.patch
new file mode 100644 (file)
index 0000000..6c5124d
--- /dev/null
@@ -0,0 +1,137 @@
+From a00f99d94312a4ef2f3b64fb622ffc5cf854da99 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jan 2024 16:59:47 +0100
+Subject: kunit: run test suites only after module initialization completes
+
+From: Marco Pagani <marpagan@redhat.com>
+
+[ Upstream commit a1af6a2bfa0cb46d70b7df5352993e750da6c79b ]
+
+Commit 2810c1e99867 ("kunit: Fix wild-memory-access bug in
+kunit_free_suite_set()") fixed a wild-memory-access bug that could have
+happened during the loading phase of test suites built and executed as
+loadable modules. However, it also introduced a problematic side effect
+that causes test suites modules to crash when they attempt to register
+fake devices.
+
+When a module is loaded, it traverses the MODULE_STATE_UNFORMED and
+MODULE_STATE_COMING states before reaching the normal operating state
+MODULE_STATE_LIVE. Finally, when the module is removed, it moves to
+MODULE_STATE_GOING before being released. However, if the loading
+function load_module() fails between complete_formation() and
+do_init_module(), the module goes directly from MODULE_STATE_COMING to
+MODULE_STATE_GOING without passing through MODULE_STATE_LIVE.
+
+This behavior was causing kunit_module_exit() to be called without
+having first executed kunit_module_init(). Since kunit_module_exit() is
+responsible for freeing the memory allocated by kunit_module_init()
+through kunit_filter_suites(), this behavior was resulting in a
+wild-memory-access bug.
+
+Commit 2810c1e99867 ("kunit: Fix wild-memory-access bug in
+kunit_free_suite_set()") fixed this issue by running the tests when the
+module is still in MODULE_STATE_COMING. However, modules in that state
+are not fully initialized, lacking sysfs kobjects. Therefore, if a test
+module attempts to register a fake device, it will inevitably crash.
+
+This patch proposes a different approach to fix the original
+wild-memory-access bug while restoring the normal module execution flow
+by making kunit_module_exit() able to detect if kunit_module_init() has
+previously initialized the tests suite set. In this way, test modules
+can once again register fake devices without crashing.
+
+This behavior is achieved by checking whether mod->kunit_suites is a
+virtual or direct mapping address. If it is a virtual address, then
+kunit_module_init() has allocated the suite_set in kunit_filter_suites()
+using kmalloc_array(). On the contrary, if mod->kunit_suites is still
+pointing to the original address that was set when looking up the
+.kunit_test_suites section of the module, then the loading phase has
+failed and there's no memory to be freed.
+
+v4:
+- rebased on 6.8
+- noted that kunit_filter_suites() must return a virtual address
+v3:
+- add a comment to clarify why the start address is checked
+v2:
+- add include <linux/mm.h>
+
+Fixes: 2810c1e99867 ("kunit: Fix wild-memory-access bug in kunit_free_suite_set()")
+Reviewed-by: David Gow <davidgow@google.com>
+Tested-by: Rae Moar <rmoar@google.com>
+Tested-by: Richard Fitzgerald <rf@opensource.cirrus.com>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Signed-off-by: Marco Pagani <marpagan@redhat.com>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/kunit/executor.c |  4 ++++
+ lib/kunit/test.c     | 14 +++++++++++---
+ 2 files changed, 15 insertions(+), 3 deletions(-)
+
+diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c
+index 1236b3cd2fbb..51013feba58b 100644
+--- a/lib/kunit/executor.c
++++ b/lib/kunit/executor.c
+@@ -144,6 +144,10 @@ void kunit_free_suite_set(struct kunit_suite_set suite_set)
+       kfree(suite_set.start);
+ }
++/*
++ * Filter and reallocate test suites. Must return the filtered test suites set
++ * allocated at a valid virtual address or NULL in case of error.
++ */
+ struct kunit_suite_set
+ kunit_filter_suites(const struct kunit_suite_set *suite_set,
+                   const char *filter_glob,
+diff --git a/lib/kunit/test.c b/lib/kunit/test.c
+index 7452d1a2acd9..1d151f6dc1cd 100644
+--- a/lib/kunit/test.c
++++ b/lib/kunit/test.c
+@@ -16,6 +16,7 @@
+ #include <linux/panic.h>
+ #include <linux/sched/debug.h>
+ #include <linux/sched.h>
++#include <linux/mm.h>
+ #include "debugfs.h"
+ #include "hooks-impl.h"
+@@ -807,12 +808,19 @@ static void kunit_module_exit(struct module *mod)
+       };
+       const char *action = kunit_action();
++      /*
++       * Check if the start address is a valid virtual address to detect
++       * if the module load sequence has failed and the suite set has not
++       * been initialized and filtered.
++       */
++      if (!suite_set.start || !virt_addr_valid(suite_set.start))
++              return;
++
+       if (!action)
+               __kunit_test_suites_exit(mod->kunit_suites,
+                                        mod->num_kunit_suites);
+-      if (suite_set.start)
+-              kunit_free_suite_set(suite_set);
++      kunit_free_suite_set(suite_set);
+ }
+ static int kunit_module_notify(struct notifier_block *nb, unsigned long val,
+@@ -822,12 +830,12 @@ static int kunit_module_notify(struct notifier_block *nb, unsigned long val,
+       switch (val) {
+       case MODULE_STATE_LIVE:
++              kunit_module_init(mod);
+               break;
+       case MODULE_STATE_GOING:
+               kunit_module_exit(mod);
+               break;
+       case MODULE_STATE_COMING:
+-              kunit_module_init(mod);
+               break;
+       case MODULE_STATE_UNFORMED:
+               break;
+-- 
+2.43.0
+
diff --git a/queue-6.6/llc-call-sock_orphan-at-release-time.patch b/queue-6.6/llc-call-sock_orphan-at-release-time.patch
new file mode 100644 (file)
index 0000000..b775b75
--- /dev/null
@@ -0,0 +1,205 @@
+From b6cd1b9f03a8479ae17134b2bef0ecb381191846 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 26 Jan 2024 16:55:32 +0000
+Subject: llc: call sock_orphan() at release time
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit aa2b2eb3934859904c287bf5434647ba72e14c1c ]
+
+syzbot reported an interesting trace [1] caused by a stale sk->sk_wq
+pointer in a closed llc socket.
+
+In commit ff7b11aa481f ("net: socket: set sock->sk to NULL after
+calling proto_ops::release()") Eric Biggers hinted that some protocols
+are missing a sock_orphan(), we need to perform a full audit.
+
+In net-next, I plan to clear sock->sk from sock_orphan() and
+amend Eric patch to add a warning.
+
+[1]
+ BUG: KASAN: slab-use-after-free in list_empty include/linux/list.h:373 [inline]
+ BUG: KASAN: slab-use-after-free in waitqueue_active include/linux/wait.h:127 [inline]
+ BUG: KASAN: slab-use-after-free in sock_def_write_space_wfree net/core/sock.c:3384 [inline]
+ BUG: KASAN: slab-use-after-free in sock_wfree+0x9a8/0x9d0 net/core/sock.c:2468
+Read of size 8 at addr ffff88802f4fc880 by task ksoftirqd/1/27
+
+CPU: 1 PID: 27 Comm: ksoftirqd/1 Not tainted 6.8.0-rc1-syzkaller-00049-g6098d87eaf31 #0
+Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
+Call Trace:
+ <TASK>
+  __dump_stack lib/dump_stack.c:88 [inline]
+  dump_stack_lvl+0xd9/0x1b0 lib/dump_stack.c:106
+  print_address_description mm/kasan/report.c:377 [inline]
+  print_report+0xc4/0x620 mm/kasan/report.c:488
+  kasan_report+0xda/0x110 mm/kasan/report.c:601
+  list_empty include/linux/list.h:373 [inline]
+  waitqueue_active include/linux/wait.h:127 [inline]
+  sock_def_write_space_wfree net/core/sock.c:3384 [inline]
+  sock_wfree+0x9a8/0x9d0 net/core/sock.c:2468
+  skb_release_head_state+0xa3/0x2b0 net/core/skbuff.c:1080
+  skb_release_all net/core/skbuff.c:1092 [inline]
+  napi_consume_skb+0x119/0x2b0 net/core/skbuff.c:1404
+  e1000_unmap_and_free_tx_resource+0x144/0x200 drivers/net/ethernet/intel/e1000/e1000_main.c:1970
+  e1000_clean_tx_irq drivers/net/ethernet/intel/e1000/e1000_main.c:3860 [inline]
+  e1000_clean+0x4a1/0x26e0 drivers/net/ethernet/intel/e1000/e1000_main.c:3801
+  __napi_poll.constprop.0+0xb4/0x540 net/core/dev.c:6576
+  napi_poll net/core/dev.c:6645 [inline]
+  net_rx_action+0x956/0xe90 net/core/dev.c:6778
+  __do_softirq+0x21a/0x8de kernel/softirq.c:553
+  run_ksoftirqd kernel/softirq.c:921 [inline]
+  run_ksoftirqd+0x31/0x60 kernel/softirq.c:913
+  smpboot_thread_fn+0x660/0xa10 kernel/smpboot.c:164
+  kthread+0x2c6/0x3a0 kernel/kthread.c:388
+  ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147
+  ret_from_fork_asm+0x11/0x20 arch/x86/entry/entry_64.S:242
+ </TASK>
+
+Allocated by task 5167:
+  kasan_save_stack+0x33/0x50 mm/kasan/common.c:47
+  kasan_save_track+0x14/0x30 mm/kasan/common.c:68
+  unpoison_slab_object mm/kasan/common.c:314 [inline]
+  __kasan_slab_alloc+0x81/0x90 mm/kasan/common.c:340
+  kasan_slab_alloc include/linux/kasan.h:201 [inline]
+  slab_post_alloc_hook mm/slub.c:3813 [inline]
+  slab_alloc_node mm/slub.c:3860 [inline]
+  kmem_cache_alloc_lru+0x142/0x6f0 mm/slub.c:3879
+  alloc_inode_sb include/linux/fs.h:3019 [inline]
+  sock_alloc_inode+0x25/0x1c0 net/socket.c:308
+  alloc_inode+0x5d/0x220 fs/inode.c:260
+  new_inode_pseudo+0x16/0x80 fs/inode.c:1005
+  sock_alloc+0x40/0x270 net/socket.c:634
+  __sock_create+0xbc/0x800 net/socket.c:1535
+  sock_create net/socket.c:1622 [inline]
+  __sys_socket_create net/socket.c:1659 [inline]
+  __sys_socket+0x14c/0x260 net/socket.c:1706
+  __do_sys_socket net/socket.c:1720 [inline]
+  __se_sys_socket net/socket.c:1718 [inline]
+  __x64_sys_socket+0x72/0xb0 net/socket.c:1718
+  do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+  do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+Freed by task 0:
+  kasan_save_stack+0x33/0x50 mm/kasan/common.c:47
+  kasan_save_track+0x14/0x30 mm/kasan/common.c:68
+  kasan_save_free_info+0x3f/0x60 mm/kasan/generic.c:640
+  poison_slab_object mm/kasan/common.c:241 [inline]
+  __kasan_slab_free+0x121/0x1b0 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]
+  kmem_cache_free+0x129/0x350 mm/slub.c:4363
+  i_callback+0x43/0x70 fs/inode.c:249
+  rcu_do_batch kernel/rcu/tree.c:2158 [inline]
+  rcu_core+0x819/0x1680 kernel/rcu/tree.c:2433
+  __do_softirq+0x21a/0x8de kernel/softirq.c:553
+
+Last potentially related work creation:
+  kasan_save_stack+0x33/0x50 mm/kasan/common.c:47
+  __kasan_record_aux_stack+0xba/0x100 mm/kasan/generic.c:586
+  __call_rcu_common.constprop.0+0x9a/0x7b0 kernel/rcu/tree.c:2683
+  destroy_inode+0x129/0x1b0 fs/inode.c:315
+  iput_final fs/inode.c:1739 [inline]
+  iput.part.0+0x560/0x7b0 fs/inode.c:1765
+  iput+0x5c/0x80 fs/inode.c:1755
+  dentry_unlink_inode+0x292/0x430 fs/dcache.c:400
+  __dentry_kill+0x1ca/0x5f0 fs/dcache.c:603
+  dput.part.0+0x4ac/0x9a0 fs/dcache.c:845
+  dput+0x1f/0x30 fs/dcache.c:835
+  __fput+0x3b9/0xb70 fs/file_table.c:384
+  task_work_run+0x14d/0x240 kernel/task_work.c:180
+  exit_task_work include/linux/task_work.h:38 [inline]
+  do_exit+0xa8a/0x2ad0 kernel/exit.c:871
+  do_group_exit+0xd4/0x2a0 kernel/exit.c:1020
+  __do_sys_exit_group kernel/exit.c:1031 [inline]
+  __se_sys_exit_group kernel/exit.c:1029 [inline]
+  __x64_sys_exit_group+0x3e/0x50 kernel/exit.c:1029
+  do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+  do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+The buggy address belongs to the object at ffff88802f4fc800
+ which belongs to the cache sock_inode_cache of size 1408
+The buggy address is located 128 bytes inside of
+ freed 1408-byte region [ffff88802f4fc800, ffff88802f4fcd80)
+
+The buggy address belongs to the physical page:
+page:ffffea0000bd3e00 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x2f4f8
+head:ffffea0000bd3e00 order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0
+anon flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff)
+page_type: 0xffffffff()
+raw: 00fff00000000840 ffff888013b06b40 0000000000000000 0000000000000001
+raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
+page dumped because: kasan: bad access detected
+page_owner tracks the page as allocated
+page last allocated via order 3, migratetype Reclaimable, gfp_mask 0xd20d0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_RECLAIMABLE), pid 4956, tgid 4956 (sshd), ts 31423924727, free_ts 0
+  set_page_owner include/linux/page_owner.h:31 [inline]
+  post_alloc_hook+0x2d0/0x350 mm/page_alloc.c:1533
+  prep_new_page mm/page_alloc.c:1540 [inline]
+  get_page_from_freelist+0xa28/0x3780 mm/page_alloc.c:3311
+  __alloc_pages+0x22f/0x2440 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 mm/slub.c:2190 [inline]
+  allocate_slab mm/slub.c:2354 [inline]
+  new_slab+0xcc/0x3a0 mm/slub.c:2407
+  ___slab_alloc+0x4af/0x19a0 mm/slub.c:3540
+  __slab_alloc.constprop.0+0x56/0xa0 mm/slub.c:3625
+  __slab_alloc_node mm/slub.c:3678 [inline]
+  slab_alloc_node mm/slub.c:3850 [inline]
+  kmem_cache_alloc_lru+0x379/0x6f0 mm/slub.c:3879
+  alloc_inode_sb include/linux/fs.h:3019 [inline]
+  sock_alloc_inode+0x25/0x1c0 net/socket.c:308
+  alloc_inode+0x5d/0x220 fs/inode.c:260
+  new_inode_pseudo+0x16/0x80 fs/inode.c:1005
+  sock_alloc+0x40/0x270 net/socket.c:634
+  __sock_create+0xbc/0x800 net/socket.c:1535
+  sock_create net/socket.c:1622 [inline]
+  __sys_socket_create net/socket.c:1659 [inline]
+  __sys_socket+0x14c/0x260 net/socket.c:1706
+  __do_sys_socket net/socket.c:1720 [inline]
+  __se_sys_socket net/socket.c:1718 [inline]
+  __x64_sys_socket+0x72/0xb0 net/socket.c:1718
+  do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+  do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+page_owner free stack trace missing
+
+Memory state around the buggy address:
+ ffff88802f4fc780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+ ffff88802f4fc800: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+>ffff88802f4fc880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+                   ^
+ ffff88802f4fc900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+ ffff88802f4fc980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+
+Fixes: 43815482370c ("net: sock_def_readable() and friends RCU conversion")
+Reported-and-tested-by: syzbot+32b89eaa102b372ff76d@syzkaller.appspotmail.com
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Cc: Eric Biggers <ebiggers@google.com>
+Cc: Kuniyuki Iwashima <kuniyu@amazon.com>
+Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Link: https://lore.kernel.org/r/20240126165532.3396702-1-edumazet@google.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/llc/af_llc.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
+index 20551cfb7da6..fde1140d899e 100644
+--- a/net/llc/af_llc.c
++++ b/net/llc/af_llc.c
+@@ -226,6 +226,8 @@ static int llc_ui_release(struct socket *sock)
+       }
+       netdev_put(llc->dev, &llc->dev_tracker);
+       sock_put(sk);
++      sock_orphan(sk);
++      sock->sk = NULL;
+       llc_sk_free(sk);
+ out:
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-dsa-mt7530-fix-10m-100m-speed-on-mt7988-switch.patch b/queue-6.6/net-dsa-mt7530-fix-10m-100m-speed-on-mt7988-switch.patch
new file mode 100644 (file)
index 0000000..cca146d
--- /dev/null
@@ -0,0 +1,44 @@
+From 3593bd9d87aa4c2c45db5f4f5fac1cecb7609218 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 05:17:25 +0000
+Subject: net: dsa: mt7530: fix 10M/100M speed on MT7988 switch
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Daniel Golle <daniel@makrotopia.org>
+
+[ Upstream commit dfa988b4c7c3a48bde7c2713308920c7741fff29 ]
+
+Setup PMCR port register for actual speed and duplex on internally
+connected PHYs of the MT7988 built-in switch. This fixes links with
+speeds other than 1000M.
+
+Fixes: 110c18bfed41 ("net: dsa: mt7530: introduce driver for MT7988 built-in switch")
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
+Acked-by: Arınç ÜNAL <arinc.unal@arinc9.com>
+Link: https://lore.kernel.org/r/a5b04dfa8256d8302f402545a51ac4c626fdba25.1706071272.git.daniel@makrotopia.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/mt7530.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
+index 035a34b50f31..4b6ac3f29f8f 100644
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -2848,8 +2848,7 @@ static void mt753x_phylink_mac_link_up(struct dsa_switch *ds, int port,
+       /* MT753x MAC works in 1G full duplex mode for all up-clocked
+        * variants.
+        */
+-      if (interface == PHY_INTERFACE_MODE_INTERNAL ||
+-          interface == PHY_INTERFACE_MODE_TRGMII ||
++      if (interface == PHY_INTERFACE_MODE_TRGMII ||
+           (phy_interface_mode_is_8023z(interface))) {
+               speed = SPEED_1000;
+               duplex = DUPLEX_FULL;
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-dsa-qca8k-fix-illegal-usage-of-gpio.patch b/queue-6.6/net-dsa-qca8k-fix-illegal-usage-of-gpio.patch
new file mode 100644 (file)
index 0000000..5af737a
--- /dev/null
@@ -0,0 +1,53 @@
+From 49ee86dd0bea7e1c74d99a0ed57c75ea4070afbc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 26 Jan 2024 11:49:35 +0100
+Subject: net: dsa: qca8k: fix illegal usage of GPIO
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Michal Vokáč <michal.vokac@ysoft.com>
+
+[ Upstream commit c44fc98f0a8ffd94fa0bd291928e7e312ffc7ca4 ]
+
+When working with GPIO, its direction must be set either when the GPIO is
+requested by gpiod_get*() or later on by one of the gpiod_direction_*()
+functions. Neither of this is done here which results in undefined
+behavior on some systems.
+
+As the reset GPIO is used right after it is requested here, it makes sense
+to configure it as GPIOD_OUT_HIGH right away. With that, the following
+gpiod_set_value_cansleep(1) becomes redundant and can be safely
+removed.
+
+Fixes: a653f2f538f9 ("net: dsa: qca8k: introduce reset via gpio feature")
+Signed-off-by: Michal Vokáč <michal.vokac@ysoft.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/r/1706266175-3408-1-git-send-email-michal.vokac@ysoft.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/qca/qca8k-8xxx.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
+index 368d53d3b1d6..17c28fe2d743 100644
+--- a/drivers/net/dsa/qca/qca8k-8xxx.c
++++ b/drivers/net/dsa/qca/qca8k-8xxx.c
+@@ -2049,12 +2049,11 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
+       priv->info = of_device_get_match_data(priv->dev);
+       priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset",
+-                                                 GPIOD_ASIS);
++                                                 GPIOD_OUT_HIGH);
+       if (IS_ERR(priv->reset_gpio))
+               return PTR_ERR(priv->reset_gpio);
+       if (priv->reset_gpio) {
+-              gpiod_set_value_cansleep(priv->reset_gpio, 1);
+               /* The active low duration must be greater than 10 ms
+                * and checkpatch.pl wants 20 ms.
+                */
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-ethernet-mtk_eth_soc-set-dma-coherent-mask-to-ge.patch b/queue-6.6/net-ethernet-mtk_eth_soc-set-dma-coherent-mask-to-ge.patch
new file mode 100644 (file)
index 0000000..b5d7ff3
--- /dev/null
@@ -0,0 +1,41 @@
+From 55cf7a1a4a3f7d902361f018cdf19d86b9eaf3ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 16:22:09 +0000
+Subject: net: ethernet: mtk_eth_soc: set DMA coherent mask to get PPE working
+
+From: Daniel Golle <daniel@makrotopia.org>
+
+[ Upstream commit cae1f1c36661f28c92a1db9113961a9ebd61dbaa ]
+
+Set DMA coherent mask to 32-bit which makes PPE offloading engine start
+working on BPi-R4 which got 4 GiB of RAM.
+
+Fixes: 2d75891ebc09 ("net: ethernet: mtk_eth_soc: support 36-bit DMA addressing on MT7988")
+Suggested-by: Elad Yifee <eladwf@users.github.com>
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Link: https://lore.kernel.org/r/97e90925368b405f0974b9b15f1b7377c4a329ad.1706113251.git.daniel@makrotopia.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+index 20afe79f380a..73ea1e22b1fa 100644
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -4757,7 +4757,10 @@ static int mtk_probe(struct platform_device *pdev)
+       }
+       if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) {
+-              err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(36));
++              err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(36));
++              if (!err)
++                      err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
++
+               if (err) {
+                       dev_err(&pdev->dev, "Wrong DMA config\n");
+                       return -EINVAL;
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-ipv4-fix-a-memleak-in-ip_setup_cork.patch b/queue-6.6/net-ipv4-fix-a-memleak-in-ip_setup_cork.patch
new file mode 100644 (file)
index 0000000..3aea33d
--- /dev/null
@@ -0,0 +1,55 @@
+From 352bef12303ab69a8596bc4d893152d91bd7c050 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 17:10:17 +0800
+Subject: net: ipv4: fix a memleak in ip_setup_cork
+
+From: Zhipeng Lu <alexious@zju.edu.cn>
+
+[ Upstream commit 5dee6d6923458e26966717f2a3eae7d09fc10bf6 ]
+
+When inetdev_valid_mtu fails, cork->opt should be freed if it is
+allocated in ip_setup_cork. Otherwise there could be a memleak.
+
+Fixes: 501a90c94510 ("inet: protect against too small mtu values.")
+Signed-off-by: Zhipeng Lu <alexious@zju.edu.cn>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Link: https://lore.kernel.org/r/20240129091017.2938835-1-alexious@zju.edu.cn
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/ip_output.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index 4ab877cf6d35..ea0247485757 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -1285,6 +1285,12 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
+       if (unlikely(!rt))
+               return -EFAULT;
++      cork->fragsize = ip_sk_use_pmtu(sk) ?
++                       dst_mtu(&rt->dst) : READ_ONCE(rt->dst.dev->mtu);
++
++      if (!inetdev_valid_mtu(cork->fragsize))
++              return -ENETUNREACH;
++
+       /*
+        * setup for corking.
+        */
+@@ -1301,12 +1307,6 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
+               cork->addr = ipc->addr;
+       }
+-      cork->fragsize = ip_sk_use_pmtu(sk) ?
+-                       dst_mtu(&rt->dst) : READ_ONCE(rt->dst.dev->mtu);
+-
+-      if (!inetdev_valid_mtu(cork->fragsize))
+-              return -ENETUNREACH;
+-
+       cork->gso_size = ipc->gso_size;
+       cork->dst = &rt->dst;
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-lan966x-fix-port-configuration-when-using-sgmii-.patch b/queue-6.6/net-lan966x-fix-port-configuration-when-using-sgmii-.patch
new file mode 100644 (file)
index 0000000..7ba30ff
--- /dev/null
@@ -0,0 +1,42 @@
+From 4d09bf9191734e0992726b33f48631167318e706 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 11:17:58 +0100
+Subject: net: lan966x: Fix port configuration when using SGMII interface
+
+From: Horatiu Vultur <horatiu.vultur@microchip.com>
+
+[ Upstream commit 62b4248105353e7d1debd30ca5c57ec5e5f28e35 ]
+
+In case the interface between the MAC and the PHY is SGMII, then the bit
+GIGA_MODE on the MAC side needs to be set regardless of the speed at
+which it is running.
+
+Fixes: d28d6d2e37d1 ("net: lan966x: add port module support")
+Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
+Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/microchip/lan966x/lan966x_port.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_port.c b/drivers/net/ethernet/microchip/lan966x/lan966x_port.c
+index 92108d354051..2e83bbb9477e 100644
+--- a/drivers/net/ethernet/microchip/lan966x/lan966x_port.c
++++ b/drivers/net/ethernet/microchip/lan966x/lan966x_port.c
+@@ -168,9 +168,10 @@ static void lan966x_port_link_up(struct lan966x_port *port)
+       lan966x_taprio_speed_set(port, config->speed);
+       /* Also the GIGA_MODE_ENA(1) needs to be set regardless of the
+-       * port speed for QSGMII ports.
++       * port speed for QSGMII or SGMII ports.
+        */
+-      if (phy_interface_num_ports(config->portmode) == 4)
++      if (phy_interface_num_ports(config->portmode) == 4 ||
++          config->portmode == PHY_INTERFACE_MODE_SGMII)
+               mode = DEV_MAC_MODE_CFG_GIGA_MODE_ENA_SET(1);
+       lan_wr(config->duplex | mode,
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-phy-mediatek-ge-soc-sync-driver-with-mediatek-sd.patch b/queue-6.6/net-phy-mediatek-ge-soc-sync-driver-with-mediatek-sd.patch
new file mode 100644 (file)
index 0000000..526d484
--- /dev/null
@@ -0,0 +1,265 @@
+From 98810e9861d437aece68e01a1c53996523af2fa1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 05:18:23 +0000
+Subject: net: phy: mediatek-ge-soc: sync driver with MediaTek SDK
+
+From: Daniel Golle <daniel@makrotopia.org>
+
+[ Upstream commit ff63cc2e95065bea978d2db01f7e7356cca3d021 ]
+
+Sync initialization and calibration routines with MediaTek's reference
+driver. Improves compliance and resolves link stability issues with
+CH340 IoT devices connected to MT798x built-in PHYs.
+
+Fixes: 98c485eaf509 ("net: phy: add driver for MediaTek SoC built-in GE PHYs")
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Link: https://lore.kernel.org/r/f2195279c234c0f618946424b8236026126bc595.1706071311.git.daniel@makrotopia.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/mediatek-ge-soc.c | 147 ++++++++++++++++--------------
+ 1 file changed, 81 insertions(+), 66 deletions(-)
+
+diff --git a/drivers/net/phy/mediatek-ge-soc.c b/drivers/net/phy/mediatek-ge-soc.c
+index 8a20d9889f10..0f3a1538a8b8 100644
+--- a/drivers/net/phy/mediatek-ge-soc.c
++++ b/drivers/net/phy/mediatek-ge-soc.c
+@@ -489,7 +489,7 @@ static int tx_r50_fill_result(struct phy_device *phydev, u16 tx_r50_cal_val,
+       u16 reg, val;
+       if (phydev->drv->phy_id == MTK_GPHY_ID_MT7988)
+-              bias = -2;
++              bias = -1;
+       val = clamp_val(bias + tx_r50_cal_val, 0, 63);
+@@ -705,6 +705,11 @@ static int tx_vcm_cal_sw(struct phy_device *phydev, u8 rg_txreserve_x)
+ static void mt798x_phy_common_finetune(struct phy_device *phydev)
+ {
+       phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
++      /* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */
++      __phy_write(phydev, 0x11, 0xc71);
++      __phy_write(phydev, 0x12, 0xc);
++      __phy_write(phydev, 0x10, 0x8fae);
++
+       /* EnabRandUpdTrig = 1 */
+       __phy_write(phydev, 0x11, 0x2f00);
+       __phy_write(phydev, 0x12, 0xe);
+@@ -715,15 +720,56 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)
+       __phy_write(phydev, 0x12, 0x0);
+       __phy_write(phydev, 0x10, 0x83aa);
+-      /* TrFreeze = 0 */
++      /* FfeUpdGainForce = 1(Enable), FfeUpdGainForceVal = 4 */
++      __phy_write(phydev, 0x11, 0x240);
++      __phy_write(phydev, 0x12, 0x0);
++      __phy_write(phydev, 0x10, 0x9680);
++
++      /* TrFreeze = 0 (mt7988 default) */
+       __phy_write(phydev, 0x11, 0x0);
+       __phy_write(phydev, 0x12, 0x0);
+       __phy_write(phydev, 0x10, 0x9686);
++      /* SSTrKp100 = 5 */
++      /* SSTrKf100 = 6 */
++      /* SSTrKp1000Mas = 5 */
++      /* SSTrKf1000Mas = 6 */
+       /* SSTrKp1000Slv = 5 */
++      /* SSTrKf1000Slv = 6 */
+       __phy_write(phydev, 0x11, 0xbaef);
+       __phy_write(phydev, 0x12, 0x2e);
+       __phy_write(phydev, 0x10, 0x968c);
++      phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
++}
++
++static void mt7981_phy_finetune(struct phy_device *phydev)
++{
++      u16 val[8] = { 0x01ce, 0x01c1,
++                     0x020f, 0x0202,
++                     0x03d0, 0x03c0,
++                     0x0013, 0x0005 };
++      int i, k;
++
++      /* 100M eye finetune:
++       * Keep middle level of TX MLT3 shapper as default.
++       * Only change TX MLT3 overshoot level here.
++       */
++      for (k = 0, i = 1; i < 12; i++) {
++              if (i % 3 == 0)
++                      continue;
++              phy_write_mmd(phydev, MDIO_MMD_VEND1, i, val[k++]);
++      }
++
++      phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
++      /* ResetSyncOffset = 6 */
++      __phy_write(phydev, 0x11, 0x600);
++      __phy_write(phydev, 0x12, 0x0);
++      __phy_write(phydev, 0x10, 0x8fc0);
++
++      /* VgaDecRate = 1 */
++      __phy_write(phydev, 0x11, 0x4c2a);
++      __phy_write(phydev, 0x12, 0x3e);
++      __phy_write(phydev, 0x10, 0x8fa4);
+       /* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2,
+        * MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
+@@ -738,7 +784,7 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)
+       __phy_write(phydev, 0x10, 0x8ec0);
+       phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
+-      /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/
++      /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9 */
+       phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
+                      MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
+                      BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0x9));
+@@ -771,48 +817,6 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)
+       phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_OUTPUT_V, 0x2222);
+ }
+-static void mt7981_phy_finetune(struct phy_device *phydev)
+-{
+-      u16 val[8] = { 0x01ce, 0x01c1,
+-                     0x020f, 0x0202,
+-                     0x03d0, 0x03c0,
+-                     0x0013, 0x0005 };
+-      int i, k;
+-
+-      /* 100M eye finetune:
+-       * Keep middle level of TX MLT3 shapper as default.
+-       * Only change TX MLT3 overshoot level here.
+-       */
+-      for (k = 0, i = 1; i < 12; i++) {
+-              if (i % 3 == 0)
+-                      continue;
+-              phy_write_mmd(phydev, MDIO_MMD_VEND1, i, val[k++]);
+-      }
+-
+-      phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
+-      /* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */
+-      __phy_write(phydev, 0x11, 0xc71);
+-      __phy_write(phydev, 0x12, 0xc);
+-      __phy_write(phydev, 0x10, 0x8fae);
+-
+-      /* ResetSyncOffset = 6 */
+-      __phy_write(phydev, 0x11, 0x600);
+-      __phy_write(phydev, 0x12, 0x0);
+-      __phy_write(phydev, 0x10, 0x8fc0);
+-
+-      /* VgaDecRate = 1 */
+-      __phy_write(phydev, 0x11, 0x4c2a);
+-      __phy_write(phydev, 0x12, 0x3e);
+-      __phy_write(phydev, 0x10, 0x8fa4);
+-
+-      /* FfeUpdGainForce = 4 */
+-      __phy_write(phydev, 0x11, 0x240);
+-      __phy_write(phydev, 0x12, 0x0);
+-      __phy_write(phydev, 0x10, 0x9680);
+-
+-      phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
+-}
+-
+ static void mt7988_phy_finetune(struct phy_device *phydev)
+ {
+       u16 val[12] = { 0x0187, 0x01cd, 0x01c8, 0x0182,
+@@ -827,17 +831,7 @@ static void mt7988_phy_finetune(struct phy_device *phydev)
+       /* TCT finetune */
+       phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_TX_FILTER, 0x5);
+-      /* Disable TX power saving */
+-      phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG7,
+-                     MTK_PHY_DA_AD_BUF_BIAS_LP_MASK, 0x3 << 8);
+-
+       phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
+-
+-      /* SlvDSPreadyTime = 24, MasDSPreadyTime = 12 */
+-      __phy_write(phydev, 0x11, 0x671);
+-      __phy_write(phydev, 0x12, 0xc);
+-      __phy_write(phydev, 0x10, 0x8fae);
+-
+       /* ResetSyncOffset = 5 */
+       __phy_write(phydev, 0x11, 0x500);
+       __phy_write(phydev, 0x12, 0x0);
+@@ -845,13 +839,27 @@ static void mt7988_phy_finetune(struct phy_device *phydev)
+       /* VgaDecRate is 1 at default on mt7988 */
+-      phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
++      /* MrvlTrFix100Kp = 6, MrvlTrFix100Kf = 7,
++       * MrvlTrFix1000Kp = 6, MrvlTrFix1000Kf = 7
++       */
++      __phy_write(phydev, 0x11, 0xb90a);
++      __phy_write(phydev, 0x12, 0x6f);
++      __phy_write(phydev, 0x10, 0x8f82);
++
++      /* RemAckCntLimitCtrl = 1 */
++      __phy_write(phydev, 0x11, 0xfbba);
++      __phy_write(phydev, 0x12, 0xc3);
++      __phy_write(phydev, 0x10, 0x87f8);
+-      phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_2A30);
+-      /* TxClkOffset = 2 */
+-      __phy_modify(phydev, MTK_PHY_ANARG_RG, MTK_PHY_TCLKOFFSET_MASK,
+-                   FIELD_PREP(MTK_PHY_TCLKOFFSET_MASK, 0x2));
+       phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
++
++      /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 10 */
++      phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
++                     MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
++                     BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0xa));
++
++      /* rg_tr_lpf_cnt_val = 1023 */
++      phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x3ff);
+ }
+ static void mt798x_phy_eee(struct phy_device *phydev)
+@@ -884,11 +892,11 @@ static void mt798x_phy_eee(struct phy_device *phydev)
+                      MTK_PHY_LPI_SLV_SEND_TX_EN,
+                      FIELD_PREP(MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK, 0x120));
+-      phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG239,
+-                     MTK_PHY_LPI_SEND_LOC_TIMER_MASK |
+-                     MTK_PHY_LPI_TXPCS_LOC_RCV,
+-                     FIELD_PREP(MTK_PHY_LPI_SEND_LOC_TIMER_MASK, 0x117));
++      /* Keep MTK_PHY_LPI_SEND_LOC_TIMER as 375 */
++      phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG239,
++                         MTK_PHY_LPI_TXPCS_LOC_RCV);
++      /* This also fixes some IoT issues, such as CH340 */
+       phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG2C7,
+                      MTK_PHY_MAX_GAIN_MASK | MTK_PHY_MIN_GAIN_MASK,
+                      FIELD_PREP(MTK_PHY_MAX_GAIN_MASK, 0x8) |
+@@ -922,7 +930,7 @@ static void mt798x_phy_eee(struct phy_device *phydev)
+       __phy_write(phydev, 0x12, 0x0);
+       __phy_write(phydev, 0x10, 0x9690);
+-      /* REG_EEE_st2TrKf1000 = 3 */
++      /* REG_EEE_st2TrKf1000 = 2 */
+       __phy_write(phydev, 0x11, 0x114f);
+       __phy_write(phydev, 0x12, 0x2);
+       __phy_write(phydev, 0x10, 0x969a);
+@@ -947,7 +955,7 @@ static void mt798x_phy_eee(struct phy_device *phydev)
+       __phy_write(phydev, 0x12, 0x0);
+       __phy_write(phydev, 0x10, 0x96b8);
+-      /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 1 */
++      /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 0 */
+       __phy_write(phydev, 0x11, 0x1463);
+       __phy_write(phydev, 0x12, 0x0);
+       __phy_write(phydev, 0x10, 0x96ca);
+@@ -1459,6 +1467,13 @@ static int mt7988_phy_probe(struct phy_device *phydev)
+       if (err)
+               return err;
++      /* Disable TX power saving at probing to:
++       * 1. Meet common mode compliance test criteria
++       * 2. Make sure that TX-VCM calibration works fine
++       */
++      phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG7,
++                     MTK_PHY_DA_AD_BUF_BIAS_LP_MASK, 0x3 << 8);
++
+       return mt798x_phy_calibration(phydev);
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-sysfs-fix-sys-class-net-iface-path.patch b/queue-6.6/net-sysfs-fix-sys-class-net-iface-path.patch
new file mode 100644 (file)
index 0000000..7a0fa18
--- /dev/null
@@ -0,0 +1,127 @@
+From 77166198afef78632dfcc26142fc60575dd7d497 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 Jan 2024 02:21:49 -0800
+Subject: net: sysfs: Fix /sys/class/net/<iface> path
+
+From: Breno Leitao <leitao@debian.org>
+
+[ Upstream commit ae3f4b44641dfff969604735a0dcbf931f383285 ]
+
+The documentation is pointing to the wrong path for the interface.
+Documentation is pointing to /sys/class/<iface>, instead of
+/sys/class/net/<iface>.
+
+Fix it by adding the `net/` directory before the interface.
+
+Fixes: 1a02ef76acfa ("net: sysfs: add documentation entries for /sys/class/<iface>/queues")
+Signed-off-by: Breno Leitao <leitao@debian.org>
+Link: https://lore.kernel.org/r/20240131102150.728960-2-leitao@debian.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../ABI/testing/sysfs-class-net-queues        | 22 +++++++++----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/Documentation/ABI/testing/sysfs-class-net-queues b/Documentation/ABI/testing/sysfs-class-net-queues
+index 906ff3ca928a..5bff64d256c2 100644
+--- a/Documentation/ABI/testing/sysfs-class-net-queues
++++ b/Documentation/ABI/testing/sysfs-class-net-queues
+@@ -1,4 +1,4 @@
+-What:         /sys/class/<iface>/queues/rx-<queue>/rps_cpus
++What:         /sys/class/net/<iface>/queues/rx-<queue>/rps_cpus
+ Date:         March 2010
+ KernelVersion:        2.6.35
+ Contact:      netdev@vger.kernel.org
+@@ -8,7 +8,7 @@ Description:
+               network device queue. Possible values depend on the number
+               of available CPU(s) in the system.
+-What:         /sys/class/<iface>/queues/rx-<queue>/rps_flow_cnt
++What:         /sys/class/net/<iface>/queues/rx-<queue>/rps_flow_cnt
+ Date:         April 2010
+ KernelVersion:        2.6.35
+ Contact:      netdev@vger.kernel.org
+@@ -16,7 +16,7 @@ Description:
+               Number of Receive Packet Steering flows being currently
+               processed by this particular network device receive queue.
+-What:         /sys/class/<iface>/queues/tx-<queue>/tx_timeout
++What:         /sys/class/net/<iface>/queues/tx-<queue>/tx_timeout
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -24,7 +24,7 @@ Description:
+               Indicates the number of transmit timeout events seen by this
+               network interface transmit queue.
+-What:         /sys/class/<iface>/queues/tx-<queue>/tx_maxrate
++What:         /sys/class/net/<iface>/queues/tx-<queue>/tx_maxrate
+ Date:         March 2015
+ KernelVersion:        4.1
+ Contact:      netdev@vger.kernel.org
+@@ -32,7 +32,7 @@ Description:
+               A Mbps max-rate set for the queue, a value of zero means disabled,
+               default is disabled.
+-What:         /sys/class/<iface>/queues/tx-<queue>/xps_cpus
++What:         /sys/class/net/<iface>/queues/tx-<queue>/xps_cpus
+ Date:         November 2010
+ KernelVersion:        2.6.38
+ Contact:      netdev@vger.kernel.org
+@@ -42,7 +42,7 @@ Description:
+               network device transmit queue. Possible values depend on the
+               number of available CPU(s) in the system.
+-What:         /sys/class/<iface>/queues/tx-<queue>/xps_rxqs
++What:         /sys/class/net/<iface>/queues/tx-<queue>/xps_rxqs
+ Date:         June 2018
+ KernelVersion:        4.18.0
+ Contact:      netdev@vger.kernel.org
+@@ -53,7 +53,7 @@ Description:
+               number of available receive queue(s) in the network device.
+               Default is disabled.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -62,7 +62,7 @@ Description:
+               of this particular network device transmit queue.
+               Default value is 1000.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -70,7 +70,7 @@ Description:
+               Indicates the number of bytes (objects) in flight on this
+               network device transmit queue.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -79,7 +79,7 @@ Description:
+               on this network device transmit queue. This value is clamped
+               to be within the bounds defined by limit_max and limit_min.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -88,7 +88,7 @@ Description:
+               queued on this network device transmit queue. See
+               include/linux/dynamic_queue_limits.h for the default value.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+-- 
+2.43.0
+
diff --git a/queue-6.6/netfilter-conntrack-correct-window-scaling-with-retr.patch b/queue-6.6/netfilter-conntrack-correct-window-scaling-with-retr.patch
new file mode 100644 (file)
index 0000000..4e6df0b
--- /dev/null
@@ -0,0 +1,84 @@
+From bd95f53a6c88e5178883a3d93352662c076e2128 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 21 Jan 2024 21:51:44 +0000
+Subject: netfilter: conntrack: correct window scaling with retransmitted SYN
+
+From: Ryan Schaefer <ryanschf@amazon.com>
+
+[ Upstream commit fb366fc7541a1de521ab3df58471746aa793b833 ]
+
+commit c7aab4f17021 ("netfilter: nf_conntrack_tcp: re-init for syn packets
+only") introduces a bug where SYNs in ORIGINAL direction on reused 5-tuple
+result in incorrect window scale negotiation. This commit merged the SYN
+re-initialization and simultaneous open or SYN retransmits cases. Merging
+this block added the logic in tcp_init_sender() that performed window scale
+negotiation to the retransmitted syn case. Previously. this would only
+result in updating the sender's scale and flags. After the merge the
+additional logic results in improperly clearing the scale in ORIGINAL
+direction before any packets in the REPLY direction are received. This
+results in packets incorrectly being marked invalid for being
+out-of-window.
+
+This can be reproduced with the following trace:
+
+Packet Sequence:
+> Flags [S], seq 1687765604, win 62727, options [.. wscale 7], length 0
+> Flags [S], seq 1944817196, win 62727, options [.. wscale 7], length 0
+
+In order to fix the issue, only evaluate window negotiation for packets
+in the REPLY direction. This was tested with simultaneous open, fast
+open, and the above reproduction.
+
+Fixes: c7aab4f17021 ("netfilter: nf_conntrack_tcp: re-init for syn packets only")
+Signed-off-by: Ryan Schaefer <ryanschf@amazon.com>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_conntrack_proto_tcp.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
+index 4018acb1d674..53d46ebcb5f7 100644
+--- a/net/netfilter/nf_conntrack_proto_tcp.c
++++ b/net/netfilter/nf_conntrack_proto_tcp.c
+@@ -457,7 +457,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,
+                           const struct sk_buff *skb,
+                           unsigned int dataoff,
+                           const struct tcphdr *tcph,
+-                          u32 end, u32 win)
++                          u32 end, u32 win,
++                          enum ip_conntrack_dir dir)
+ {
+       /* SYN-ACK in reply to a SYN
+        * or SYN from reply direction in simultaneous open.
+@@ -471,7 +472,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,
+        * Both sides must send the Window Scale option
+        * to enable window scaling in either direction.
+        */
+-      if (!(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE &&
++      if (dir == IP_CT_DIR_REPLY &&
++          !(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE &&
+             receiver->flags & IP_CT_TCP_FLAG_WINDOW_SCALE)) {
+               sender->td_scale = 0;
+               receiver->td_scale = 0;
+@@ -542,7 +544,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,
+               if (tcph->syn) {
+                       tcp_init_sender(sender, receiver,
+                                       skb, dataoff, tcph,
+-                                      end, win);
++                                      end, win, dir);
+                       if (!tcph->ack)
+                               /* Simultaneous open */
+                               return NFCT_TCP_ACCEPT;
+@@ -585,7 +587,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,
+                */
+               tcp_init_sender(sender, receiver,
+                               skb, dataoff, tcph,
+-                              end, win);
++                              end, win, dir);
+               if (dir == IP_CT_DIR_REPLY && !tcph->ack)
+                       return NFCT_TCP_ACCEPT;
+-- 
+2.43.0
+
diff --git a/queue-6.6/netfilter-ipset-fix-performance-regression-in-swap-o.patch b/queue-6.6/netfilter-ipset-fix-performance-regression-in-swap-o.patch
new file mode 100644 (file)
index 0000000..de91ddf
--- /dev/null
@@ -0,0 +1,301 @@
+From a2337a34cfe7956a7342b96d41ccd74210fa8830 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 10:57:01 +0100
+Subject: netfilter: ipset: fix performance regression in swap operation
+
+From: Jozsef Kadlecsik <kadlec@netfilter.org>
+
+[ Upstream commit 97f7cf1cd80eeed3b7c808b7c12463295c751001 ]
+
+The patch "netfilter: ipset: fix race condition between swap/destroy
+and kernel side add/del/test", commit 28628fa9 fixes a race condition.
+But the synchronize_rcu() added to the swap function unnecessarily slows
+it down: it can safely be moved to destroy and use call_rcu() instead.
+
+Eric Dumazet pointed out that simply calling the destroy functions as
+rcu callback does not work: sets with timeout use garbage collectors
+which need cancelling at destroy which can wait. Therefore the destroy
+functions are split into two: cancelling garbage collectors safely at
+executing the command received by netlink and moving the remaining
+part only into the rcu callback.
+
+Link: https://lore.kernel.org/lkml/C0829B10-EAA6-4809-874E-E1E9C05A8D84@automattic.com/
+Fixes: 28628fa952fe ("netfilter: ipset: fix race condition between swap/destroy and kernel side add/del/test")
+Reported-by: Ale Crismani <ale.crismani@automattic.com>
+Reported-by: David Wang <00107082@163.com>
+Tested-by: David Wang <00107082@163.com>
+Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/netfilter/ipset/ip_set.h  |  4 +++
+ net/netfilter/ipset/ip_set_bitmap_gen.h | 14 ++++++++--
+ net/netfilter/ipset/ip_set_core.c       | 37 +++++++++++++++++++------
+ net/netfilter/ipset/ip_set_hash_gen.h   | 15 ++++++++--
+ net/netfilter/ipset/ip_set_list_set.c   | 13 +++++++--
+ 5 files changed, 65 insertions(+), 18 deletions(-)
+
+diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h
+index e8c350a3ade1..e9f4f845d760 100644
+--- a/include/linux/netfilter/ipset/ip_set.h
++++ b/include/linux/netfilter/ipset/ip_set.h
+@@ -186,6 +186,8 @@ struct ip_set_type_variant {
+       /* Return true if "b" set is the same as "a"
+        * according to the create set parameters */
+       bool (*same_set)(const struct ip_set *a, const struct ip_set *b);
++      /* Cancel ongoing garbage collectors before destroying the set*/
++      void (*cancel_gc)(struct ip_set *set);
+       /* Region-locking is used */
+       bool region_lock;
+ };
+@@ -242,6 +244,8 @@ extern void ip_set_type_unregister(struct ip_set_type *set_type);
+ /* A generic IP set */
+ struct ip_set {
++      /* For call_cru in destroy */
++      struct rcu_head rcu;
+       /* The name of the set */
+       char name[IPSET_MAXNAMELEN];
+       /* Lock protecting the set data */
+diff --git a/net/netfilter/ipset/ip_set_bitmap_gen.h b/net/netfilter/ipset/ip_set_bitmap_gen.h
+index 26ab0e9612d8..9523104a90da 100644
+--- a/net/netfilter/ipset/ip_set_bitmap_gen.h
++++ b/net/netfilter/ipset/ip_set_bitmap_gen.h
+@@ -28,6 +28,7 @@
+ #define mtype_del             IPSET_TOKEN(MTYPE, _del)
+ #define mtype_list            IPSET_TOKEN(MTYPE, _list)
+ #define mtype_gc              IPSET_TOKEN(MTYPE, _gc)
++#define mtype_cancel_gc               IPSET_TOKEN(MTYPE, _cancel_gc)
+ #define mtype                 MTYPE
+ #define get_ext(set, map, id) ((map)->extensions + ((set)->dsize * (id)))
+@@ -57,9 +58,6 @@ mtype_destroy(struct ip_set *set)
+ {
+       struct mtype *map = set->data;
+-      if (SET_WITH_TIMEOUT(set))
+-              del_timer_sync(&map->gc);
+-
+       if (set->dsize && set->extensions & IPSET_EXT_DESTROY)
+               mtype_ext_cleanup(set);
+       ip_set_free(map->members);
+@@ -288,6 +286,15 @@ mtype_gc(struct timer_list *t)
+       add_timer(&map->gc);
+ }
++static void
++mtype_cancel_gc(struct ip_set *set)
++{
++      struct mtype *map = set->data;
++
++      if (SET_WITH_TIMEOUT(set))
++              del_timer_sync(&map->gc);
++}
++
+ static const struct ip_set_type_variant mtype = {
+       .kadt   = mtype_kadt,
+       .uadt   = mtype_uadt,
+@@ -301,6 +308,7 @@ static const struct ip_set_type_variant mtype = {
+       .head   = mtype_head,
+       .list   = mtype_list,
+       .same_set = mtype_same_set,
++      .cancel_gc = mtype_cancel_gc,
+ };
+ #endif /* __IP_SET_BITMAP_IP_GEN_H */
+diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c
+index 4c133e06be1d..bcaad9c009fe 100644
+--- a/net/netfilter/ipset/ip_set_core.c
++++ b/net/netfilter/ipset/ip_set_core.c
+@@ -1182,6 +1182,14 @@ ip_set_destroy_set(struct ip_set *set)
+       kfree(set);
+ }
++static void
++ip_set_destroy_set_rcu(struct rcu_head *head)
++{
++      struct ip_set *set = container_of(head, struct ip_set, rcu);
++
++      ip_set_destroy_set(set);
++}
++
+ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,
+                         const struct nlattr * const attr[])
+ {
+@@ -1193,8 +1201,6 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,
+       if (unlikely(protocol_min_failed(attr)))
+               return -IPSET_ERR_PROTOCOL;
+-      /* Must wait for flush to be really finished in list:set */
+-      rcu_barrier();
+       /* Commands are serialized and references are
+        * protected by the ip_set_ref_lock.
+@@ -1206,8 +1212,10 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,
+        * counter, so if it's already zero, we can proceed
+        * without holding the lock.
+        */
+-      read_lock_bh(&ip_set_ref_lock);
+       if (!attr[IPSET_ATTR_SETNAME]) {
++              /* Must wait for flush to be really finished in list:set */
++              rcu_barrier();
++              read_lock_bh(&ip_set_ref_lock);
+               for (i = 0; i < inst->ip_set_max; i++) {
+                       s = ip_set(inst, i);
+                       if (s && (s->ref || s->ref_netlink)) {
+@@ -1221,6 +1229,8 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,
+                       s = ip_set(inst, i);
+                       if (s) {
+                               ip_set(inst, i) = NULL;
++                              /* Must cancel garbage collectors */
++                              s->variant->cancel_gc(s);
+                               ip_set_destroy_set(s);
+                       }
+               }
+@@ -1228,6 +1238,9 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,
+               inst->is_destroyed = false;
+       } else {
+               u32 flags = flag_exist(info->nlh);
++              u16 features = 0;
++
++              read_lock_bh(&ip_set_ref_lock);
+               s = find_set_and_id(inst, nla_data(attr[IPSET_ATTR_SETNAME]),
+                                   &i);
+               if (!s) {
+@@ -1238,10 +1251,16 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,
+                       ret = -IPSET_ERR_BUSY;
+                       goto out;
+               }
++              features = s->type->features;
+               ip_set(inst, i) = NULL;
+               read_unlock_bh(&ip_set_ref_lock);
+-
+-              ip_set_destroy_set(s);
++              if (features & IPSET_TYPE_NAME) {
++                      /* Must wait for flush to be really finished  */
++                      rcu_barrier();
++              }
++              /* Must cancel garbage collectors */
++              s->variant->cancel_gc(s);
++              call_rcu(&s->rcu, ip_set_destroy_set_rcu);
+       }
+       return 0;
+ out:
+@@ -1394,9 +1413,6 @@ static int ip_set_swap(struct sk_buff *skb, const struct nfnl_info *info,
+       ip_set(inst, to_id) = from;
+       write_unlock_bh(&ip_set_ref_lock);
+-      /* Make sure all readers of the old set pointers are completed. */
+-      synchronize_rcu();
+-
+       return 0;
+ }
+@@ -2409,8 +2425,11 @@ ip_set_fini(void)
+ {
+       nf_unregister_sockopt(&so_set);
+       nfnetlink_subsys_unregister(&ip_set_netlink_subsys);
+-
+       unregister_pernet_subsys(&ip_set_net_ops);
++
++      /* Wait for call_rcu() in destroy */
++      rcu_barrier();
++
+       pr_debug("these are the famous last words\n");
+ }
+diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
+index 7c2399541771..c62998b46f00 100644
+--- a/net/netfilter/ipset/ip_set_hash_gen.h
++++ b/net/netfilter/ipset/ip_set_hash_gen.h
+@@ -221,6 +221,7 @@ static const union nf_inet_addr zeromask = {};
+ #undef mtype_gc_do
+ #undef mtype_gc
+ #undef mtype_gc_init
++#undef mtype_cancel_gc
+ #undef mtype_variant
+ #undef mtype_data_match
+@@ -265,6 +266,7 @@ static const union nf_inet_addr zeromask = {};
+ #define mtype_gc_do           IPSET_TOKEN(MTYPE, _gc_do)
+ #define mtype_gc              IPSET_TOKEN(MTYPE, _gc)
+ #define mtype_gc_init         IPSET_TOKEN(MTYPE, _gc_init)
++#define mtype_cancel_gc               IPSET_TOKEN(MTYPE, _cancel_gc)
+ #define mtype_variant         IPSET_TOKEN(MTYPE, _variant)
+ #define mtype_data_match      IPSET_TOKEN(MTYPE, _data_match)
+@@ -449,9 +451,6 @@ mtype_destroy(struct ip_set *set)
+       struct htype *h = set->data;
+       struct list_head *l, *lt;
+-      if (SET_WITH_TIMEOUT(set))
+-              cancel_delayed_work_sync(&h->gc.dwork);
+-
+       mtype_ahash_destroy(set, ipset_dereference_nfnl(h->table), true);
+       list_for_each_safe(l, lt, &h->ad) {
+               list_del(l);
+@@ -598,6 +597,15 @@ mtype_gc_init(struct htable_gc *gc)
+       queue_delayed_work(system_power_efficient_wq, &gc->dwork, HZ);
+ }
++static void
++mtype_cancel_gc(struct ip_set *set)
++{
++      struct htype *h = set->data;
++
++      if (SET_WITH_TIMEOUT(set))
++              cancel_delayed_work_sync(&h->gc.dwork);
++}
++
+ static int
+ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
+         struct ip_set_ext *mext, u32 flags);
+@@ -1440,6 +1448,7 @@ static const struct ip_set_type_variant mtype_variant = {
+       .uref   = mtype_uref,
+       .resize = mtype_resize,
+       .same_set = mtype_same_set,
++      .cancel_gc = mtype_cancel_gc,
+       .region_lock = true,
+ };
+diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c
+index e162636525cf..6c3f28bc59b3 100644
+--- a/net/netfilter/ipset/ip_set_list_set.c
++++ b/net/netfilter/ipset/ip_set_list_set.c
+@@ -426,9 +426,6 @@ list_set_destroy(struct ip_set *set)
+       struct list_set *map = set->data;
+       struct set_elem *e, *n;
+-      if (SET_WITH_TIMEOUT(set))
+-              timer_shutdown_sync(&map->gc);
+-
+       list_for_each_entry_safe(e, n, &map->members, list) {
+               list_del(&e->list);
+               ip_set_put_byindex(map->net, e->id);
+@@ -545,6 +542,15 @@ list_set_same_set(const struct ip_set *a, const struct ip_set *b)
+              a->extensions == b->extensions;
+ }
++static void
++list_set_cancel_gc(struct ip_set *set)
++{
++      struct list_set *map = set->data;
++
++      if (SET_WITH_TIMEOUT(set))
++              timer_shutdown_sync(&map->gc);
++}
++
+ static const struct ip_set_type_variant set_variant = {
+       .kadt   = list_set_kadt,
+       .uadt   = list_set_uadt,
+@@ -558,6 +564,7 @@ static const struct ip_set_type_variant set_variant = {
+       .head   = list_set_head,
+       .list   = list_set_list,
+       .same_set = list_set_same_set,
++      .cancel_gc = list_set_cancel_gc,
+ };
+ static void
+-- 
+2.43.0
+
diff --git a/queue-6.6/netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch b/queue-6.6/netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch
new file mode 100644 (file)
index 0000000..b5bbdc1
--- /dev/null
@@ -0,0 +1,46 @@
+From f43ebf92a8dc43c39b832185c326eee075f701e5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 11:09:43 +0100
+Subject: netfilter: nf_log: replace BUG_ON by WARN_ON_ONCE when putting logger
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit 259eb32971e9eb24d1777a28d82730659f50fdcb ]
+
+Module reference is bumped for each user, this should not ever happen.
+
+But BUG_ON check should use rcu_access_pointer() instead.
+
+If this ever happens, do WARN_ON_ONCE() instead of BUG_ON() and
+consolidate pointer check under the rcu read side lock section.
+
+Fixes: fab4085f4e24 ("netfilter: log: nf_log_packet() as real unified interface")
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_log.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c
+index 8cc52d2bd31b..e16f158388bb 100644
+--- a/net/netfilter/nf_log.c
++++ b/net/netfilter/nf_log.c
+@@ -193,11 +193,12 @@ void nf_logger_put(int pf, enum nf_log_type type)
+               return;
+       }
+-      BUG_ON(loggers[pf][type] == NULL);
+-
+       rcu_read_lock();
+       logger = rcu_dereference(loggers[pf][type]);
+-      module_put(logger->me);
++      if (!logger)
++              WARN_ON_ONCE(1);
++      else
++              module_put(logger->me);
+       rcu_read_unlock();
+ }
+ EXPORT_SYMBOL_GPL(nf_logger_put);
+-- 
+2.43.0
+
diff --git a/queue-6.6/netfilter-nf_tables-restrict-tunnel-object-to-nfprot.patch b/queue-6.6/netfilter-nf_tables-restrict-tunnel-object-to-nfprot.patch
new file mode 100644 (file)
index 0000000..3c3c7f7
--- /dev/null
@@ -0,0 +1,109 @@
+From d4cfc4b0623347a90f3a084e298678304b8d4760 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 23 Jan 2024 23:45:32 +0100
+Subject: netfilter: nf_tables: restrict tunnel object to NFPROTO_NETDEV
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit 776d451648443f9884be4a1b4e38e8faf1c621f9 ]
+
+Bail out on using the tunnel dst template from other than netdev family.
+Add the infrastructure to check for the family in objects.
+
+Fixes: af308b94a2a4 ("netfilter: nf_tables: add tunnel support")
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/netfilter/nf_tables.h |  2 ++
+ net/netfilter/nf_tables_api.c     | 14 +++++++++-----
+ net/netfilter/nft_tunnel.c        |  1 +
+ 3 files changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h
+index 75972e211ba1..5bb8a83e2604 100644
+--- a/include/net/netfilter/nf_tables.h
++++ b/include/net/netfilter/nf_tables.h
+@@ -1307,6 +1307,7 @@ void nft_obj_notify(struct net *net, const struct nft_table *table,
+  *    @type: stateful object numeric type
+  *    @owner: module owner
+  *    @maxattr: maximum netlink attribute
++ *    @family: address family for AF-specific object types
+  *    @policy: netlink attribute policy
+  */
+ struct nft_object_type {
+@@ -1316,6 +1317,7 @@ struct nft_object_type {
+       struct list_head                list;
+       u32                             type;
+       unsigned int                    maxattr;
++      u8                              family;
+       struct module                   *owner;
+       const struct nla_policy         *policy;
+ };
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
+index 4fc8348dd799..cb7d42a3faab 100644
+--- a/net/netfilter/nf_tables_api.c
++++ b/net/netfilter/nf_tables_api.c
+@@ -7415,11 +7415,15 @@ static int nft_object_dump(struct sk_buff *skb, unsigned int attr,
+       return -1;
+ }
+-static const struct nft_object_type *__nft_obj_type_get(u32 objtype)
++static const struct nft_object_type *__nft_obj_type_get(u32 objtype, u8 family)
+ {
+       const struct nft_object_type *type;
+       list_for_each_entry(type, &nf_tables_objects, list) {
++              if (type->family != NFPROTO_UNSPEC &&
++                  type->family != family)
++                      continue;
++
+               if (objtype == type->type)
+                       return type;
+       }
+@@ -7427,11 +7431,11 @@ static const struct nft_object_type *__nft_obj_type_get(u32 objtype)
+ }
+ static const struct nft_object_type *
+-nft_obj_type_get(struct net *net, u32 objtype)
++nft_obj_type_get(struct net *net, u32 objtype, u8 family)
+ {
+       const struct nft_object_type *type;
+-      type = __nft_obj_type_get(objtype);
++      type = __nft_obj_type_get(objtype, family);
+       if (type != NULL && try_module_get(type->owner))
+               return type;
+@@ -7524,7 +7528,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
+               if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
+                       return -EOPNOTSUPP;
+-              type = __nft_obj_type_get(objtype);
++              type = __nft_obj_type_get(objtype, family);
+               if (WARN_ON_ONCE(!type))
+                       return -ENOENT;
+@@ -7538,7 +7542,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
+       if (!nft_use_inc(&table->use))
+               return -EMFILE;
+-      type = nft_obj_type_get(net, objtype);
++      type = nft_obj_type_get(net, objtype, family);
+       if (IS_ERR(type)) {
+               err = PTR_ERR(type);
+               goto err_type;
+diff --git a/net/netfilter/nft_tunnel.c b/net/netfilter/nft_tunnel.c
+index 9f21953c7433..f735d79d8be5 100644
+--- a/net/netfilter/nft_tunnel.c
++++ b/net/netfilter/nft_tunnel.c
+@@ -713,6 +713,7 @@ static const struct nft_object_ops nft_tunnel_obj_ops = {
+ static struct nft_object_type nft_tunnel_obj_type __read_mostly = {
+       .type           = NFT_OBJECT_TUNNEL,
++      .family         = NFPROTO_NETDEV,
+       .ops            = &nft_tunnel_obj_ops,
+       .maxattr        = NFTA_TUNNEL_KEY_MAX,
+       .policy         = nft_tunnel_key_policy,
+-- 
+2.43.0
+
diff --git a/queue-6.6/netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch b/queue-6.6/netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch
new file mode 100644 (file)
index 0000000..109bdf2
--- /dev/null
@@ -0,0 +1,60 @@
+From 98ce0345632d3edc744d0c1409291cab49d51e56 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 13:12:33 +0100
+Subject: netfilter: nft_ct: sanitize layer 3 and 4 protocol number in custom
+ expectations
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit 8059918a1377f2f1fff06af4f5a4ed3d5acd6bc4 ]
+
+- Disallow families other than NFPROTO_{IPV4,IPV6,INET}.
+- Disallow layer 4 protocol with no ports, since destination port is a
+  mandatory attribute for this object.
+
+Fixes: 857b46027d6f ("netfilter: nft_ct: add ct expectations support")
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nft_ct.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c
+index 86bb9d7797d9..aac98a3c966e 100644
+--- a/net/netfilter/nft_ct.c
++++ b/net/netfilter/nft_ct.c
+@@ -1250,7 +1250,31 @@ static int nft_ct_expect_obj_init(const struct nft_ctx *ctx,
+       if (tb[NFTA_CT_EXPECT_L3PROTO])
+               priv->l3num = ntohs(nla_get_be16(tb[NFTA_CT_EXPECT_L3PROTO]));
++      switch (priv->l3num) {
++      case NFPROTO_IPV4:
++      case NFPROTO_IPV6:
++              if (priv->l3num != ctx->family)
++                      return -EINVAL;
++
++              fallthrough;
++      case NFPROTO_INET:
++              break;
++      default:
++              return -EOPNOTSUPP;
++      }
++
+       priv->l4proto = nla_get_u8(tb[NFTA_CT_EXPECT_L4PROTO]);
++      switch (priv->l4proto) {
++      case IPPROTO_TCP:
++      case IPPROTO_UDP:
++      case IPPROTO_UDPLITE:
++      case IPPROTO_DCCP:
++      case IPPROTO_SCTP:
++              break;
++      default:
++              return -EOPNOTSUPP;
++      }
++
+       priv->dport = nla_get_be16(tb[NFTA_CT_EXPECT_DPORT]);
+       priv->timeout = nla_get_u32(tb[NFTA_CT_EXPECT_TIMEOUT]);
+       priv->size = nla_get_u8(tb[NFTA_CT_EXPECT_SIZE]);
+-- 
+2.43.0
+
diff --git a/queue-6.6/octeontx2-pf-remove-xdp-queues-on-program-detach.patch b/queue-6.6/octeontx2-pf-remove-xdp-queues-on-program-detach.patch
new file mode 100644 (file)
index 0000000..e5d2b3c
--- /dev/null
@@ -0,0 +1,89 @@
+From f9fc88b884d7b289e250c6a897e8e25329975f24 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jan 2024 17:36:10 +0530
+Subject: octeontx2-pf: Remove xdp queues on program detach
+
+From: Geetha sowjanya <gakula@marvell.com>
+
+[ Upstream commit 04f647c8e456fcfabe9c252a4dcaee03b586fa4f ]
+
+XDP queues are created/destroyed when a XDP program
+is attached/detached. In current driver xdp_queues are not
+getting destroyed on program exit due to incorrect xdp_queue
+and tot_tx_queue count values.
+
+This patch fixes the issue by setting tot_tx_queue and xdp_queue
+count to correct values. It also fixes xdp.data_hard_start address.
+
+Fixes: 06059a1a9a4a ("octeontx2-pf: Add XDP support to netdev PF")
+Signed-off-by: Geetha sowjanya <gakula@marvell.com>
+Link: https://lore.kernel.org/r/20240130120610.16673-1-gakula@marvell.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 1 -
+ drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c      | 3 +--
+ drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c    | 7 +++----
+ 3 files changed, 4 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+index 53f6258a973c..8b7fc0af91ce 100644
+--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
++++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+@@ -314,7 +314,6 @@ static int otx2_set_channels(struct net_device *dev,
+       pfvf->hw.tx_queues = channel->tx_count;
+       if (pfvf->xdp_prog)
+               pfvf->hw.xdp_queues = channel->rx_count;
+-      pfvf->hw.non_qos_queues =  pfvf->hw.tx_queues + pfvf->hw.xdp_queues;
+       if (if_up)
+               err = dev->netdev_ops->ndo_open(dev);
+diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+index a57455aebff6..e5fe67e73865 100644
+--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
++++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+@@ -1744,6 +1744,7 @@ int otx2_open(struct net_device *netdev)
+       /* RQ and SQs are mapped to different CQs,
+        * so find out max CQ IRQs (i.e CINTs) needed.
+        */
++      pf->hw.non_qos_queues =  pf->hw.tx_queues + pf->hw.xdp_queues;
+       pf->hw.cint_cnt = max3(pf->hw.rx_queues, pf->hw.tx_queues,
+                              pf->hw.tc_tx_queues);
+@@ -2643,8 +2644,6 @@ static int otx2_xdp_setup(struct otx2_nic *pf, struct bpf_prog *prog)
+               xdp_features_clear_redirect_target(dev);
+       }
+-      pf->hw.non_qos_queues += pf->hw.xdp_queues;
+-
+       if (if_up)
+               otx2_open(pf->netdev);
+diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
+index 4d519ea833b2..f828d32737af 100644
+--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
++++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
+@@ -1403,7 +1403,7 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
+                                    struct otx2_cq_queue *cq,
+                                    bool *need_xdp_flush)
+ {
+-      unsigned char *hard_start, *data;
++      unsigned char *hard_start;
+       int qidx = cq->cq_idx;
+       struct xdp_buff xdp;
+       struct page *page;
+@@ -1417,9 +1417,8 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
+       xdp_init_buff(&xdp, pfvf->rbsize, &cq->xdp_rxq);
+-      data = (unsigned char *)phys_to_virt(pa);
+-      hard_start = page_address(page);
+-      xdp_prepare_buff(&xdp, hard_start, data - hard_start,
++      hard_start = (unsigned char *)phys_to_virt(pa);
++      xdp_prepare_buff(&xdp, hard_start, OTX2_HEAD_ROOM,
+                        cqe->sg.seg_size, false);
+       act = bpf_prog_run_xdp(prog, &xdp);
+-- 
+2.43.0
+
diff --git a/queue-6.6/pds_core-cancel-aq-work-on-teardown.patch b/queue-6.6/pds_core-cancel-aq-work-on-teardown.patch
new file mode 100644 (file)
index 0000000..de39868
--- /dev/null
@@ -0,0 +1,53 @@
+From 99fbdc683a1064c86150a53f816d935dd6726965 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 15:40:31 -0800
+Subject: pds_core: Cancel AQ work on teardown
+
+From: Brett Creeley <brett.creeley@amd.com>
+
+[ Upstream commit d321067e2cfa4d5e45401a00912ca9da8d1af631 ]
+
+There is a small window where pdsc_work_thread()
+calls pdsc_process_adminq() and pdsc_process_adminq()
+passes the PDSC_S_STOPPING_DRIVER check and starts
+to process adminq/notifyq work and then the driver
+starts a fw_down cycle. This could cause some
+undefined behavior if the notifyqcq/adminqcq are
+free'd while pdsc_process_adminq() is running. Use
+cancel_work_sync() on the adminqcq's work struct
+to make sure any pending work items are cancelled
+and any in progress work items are completed.
+
+Also, make sure to not call cancel_work_sync() if
+the work item has not be initialized. Without this,
+traces will happen in cases where a reset fails and
+teardown is called again or if reset fails and the
+driver is removed.
+
+Fixes: 01ba61b55b20 ("pds_core: Add adminq processing and commands")
+Signed-off-by: Brett Creeley <brett.creeley@amd.com>
+Reviewed-by: Shannon Nelson <shannon.nelson@amd.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Link: https://lore.kernel.org/r/20240129234035.69802-3-brett.creeley@amd.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/pds_core/core.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c
+index 36f9b932b9e2..b58c166d438d 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.c
++++ b/drivers/net/ethernet/amd/pds_core/core.c
+@@ -466,6 +466,8 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)
+       if (!pdsc->pdev->is_virtfn)
+               pdsc_devcmd_reset(pdsc);
++      if (pdsc->adminqcq.work.func)
++              cancel_work_sync(&pdsc->adminqcq.work);
+       pdsc_qcq_free(pdsc, &pdsc->notifyqcq);
+       pdsc_qcq_free(pdsc, &pdsc->adminqcq);
+-- 
+2.43.0
+
diff --git a/queue-6.6/pds_core-clear-bars-on-reset.patch b/queue-6.6/pds_core-clear-bars-on-reset.patch
new file mode 100644 (file)
index 0000000..ba8c06c
--- /dev/null
@@ -0,0 +1,158 @@
+From 65a4a27982b343aefa71859169eaf060f5c2794f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 15:40:34 -0800
+Subject: pds_core: Clear BARs on reset
+
+From: Brett Creeley <brett.creeley@amd.com>
+
+[ Upstream commit e96094c1d11cce4deb5da3c0500d49041ab845b8 ]
+
+During reset the BARs might be accessed when they are
+unmapped. This can cause unexpected issues, so fix it by
+clearing the cached BAR values so they are not accessed
+until they are re-mapped.
+
+Also, make sure any places that can access the BARs
+when they are NULL are prevented.
+
+Fixes: 49ce92fbee0b ("pds_core: add FW update feature to devlink")
+Signed-off-by: Brett Creeley <brett.creeley@amd.com>
+Reviewed-by: Shannon Nelson <shannon.nelson@amd.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Link: https://lore.kernel.org/r/20240129234035.69802-6-brett.creeley@amd.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/pds_core/adminq.c  | 28 +++++++++++++++------
+ drivers/net/ethernet/amd/pds_core/dev.c     |  9 ++++++-
+ drivers/net/ethernet/amd/pds_core/devlink.c |  3 ++-
+ drivers/net/ethernet/amd/pds_core/fw.c      |  3 +++
+ drivers/net/ethernet/amd/pds_core/main.c    |  5 ++++
+ 5 files changed, 38 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/pds_core/adminq.c b/drivers/net/ethernet/amd/pds_core/adminq.c
+index 5edff33d56f3..ea773cfa0af6 100644
+--- a/drivers/net/ethernet/amd/pds_core/adminq.c
++++ b/drivers/net/ethernet/amd/pds_core/adminq.c
+@@ -191,10 +191,16 @@ static int __pdsc_adminq_post(struct pdsc *pdsc,
+       /* Check that the FW is running */
+       if (!pdsc_is_fw_running(pdsc)) {
+-              u8 fw_status = ioread8(&pdsc->info_regs->fw_status);
+-
+-              dev_info(pdsc->dev, "%s: post failed - fw not running %#02x:\n",
+-                       __func__, fw_status);
++              if (pdsc->info_regs) {
++                      u8 fw_status =
++                              ioread8(&pdsc->info_regs->fw_status);
++
++                      dev_info(pdsc->dev, "%s: post failed - fw not running %#02x:\n",
++                               __func__, fw_status);
++              } else {
++                      dev_info(pdsc->dev, "%s: post failed - BARs not setup\n",
++                               __func__);
++              }
+               ret = -ENXIO;
+               goto err_out_unlock;
+@@ -266,10 +272,16 @@ int pdsc_adminq_post(struct pdsc *pdsc,
+                       break;
+               if (!pdsc_is_fw_running(pdsc)) {
+-                      u8 fw_status = ioread8(&pdsc->info_regs->fw_status);
+-
+-                      dev_dbg(pdsc->dev, "%s: post wait failed - fw not running %#02x:\n",
+-                              __func__, fw_status);
++                      if (pdsc->info_regs) {
++                              u8 fw_status =
++                                      ioread8(&pdsc->info_regs->fw_status);
++
++                              dev_dbg(pdsc->dev, "%s: post wait failed - fw not running %#02x:\n",
++                                      __func__, fw_status);
++                      } else {
++                              dev_dbg(pdsc->dev, "%s: post wait failed - BARs not setup\n",
++                                      __func__);
++                      }
+                       err = -ENXIO;
+                       break;
+               }
+diff --git a/drivers/net/ethernet/amd/pds_core/dev.c b/drivers/net/ethernet/amd/pds_core/dev.c
+index eb178728edba..1d590eb463d0 100644
+--- a/drivers/net/ethernet/amd/pds_core/dev.c
++++ b/drivers/net/ethernet/amd/pds_core/dev.c
+@@ -55,6 +55,9 @@ int pdsc_err_to_errno(enum pds_core_status_code code)
+ bool pdsc_is_fw_running(struct pdsc *pdsc)
+ {
++      if (!pdsc->info_regs)
++              return false;
++
+       pdsc->fw_status = ioread8(&pdsc->info_regs->fw_status);
+       pdsc->last_fw_time = jiffies;
+       pdsc->last_hb = ioread32(&pdsc->info_regs->fw_heartbeat);
+@@ -175,13 +178,17 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,
+ {
+       int err;
++      if (!pdsc->cmd_regs)
++              return -ENXIO;
++
+       memcpy_toio(&pdsc->cmd_regs->cmd, cmd, sizeof(*cmd));
+       pdsc_devcmd_dbell(pdsc);
+       err = pdsc_devcmd_wait(pdsc, cmd->opcode, max_seconds);
+-      memcpy_fromio(comp, &pdsc->cmd_regs->comp, sizeof(*comp));
+       if ((err == -ENXIO || err == -ETIMEDOUT) && pdsc->wq)
+               queue_work(pdsc->wq, &pdsc->health_work);
++      else
++              memcpy_fromio(comp, &pdsc->cmd_regs->comp, sizeof(*comp));
+       return err;
+ }
+diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c b/drivers/net/ethernet/amd/pds_core/devlink.c
+index d2abf32b93fe..d8218bb153d9 100644
+--- a/drivers/net/ethernet/amd/pds_core/devlink.c
++++ b/drivers/net/ethernet/amd/pds_core/devlink.c
+@@ -111,7 +111,8 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
+       mutex_lock(&pdsc->devcmd_lock);
+       err = pdsc_devcmd_locked(pdsc, &cmd, &comp, pdsc->devcmd_timeout * 2);
+-      memcpy_fromio(&fw_list, pdsc->cmd_regs->data, sizeof(fw_list));
++      if (!err)
++              memcpy_fromio(&fw_list, pdsc->cmd_regs->data, sizeof(fw_list));
+       mutex_unlock(&pdsc->devcmd_lock);
+       if (err && err != -EIO)
+               return err;
+diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/amd/pds_core/fw.c
+index 90a811f3878a..fa626719e68d 100644
+--- a/drivers/net/ethernet/amd/pds_core/fw.c
++++ b/drivers/net/ethernet/amd/pds_core/fw.c
+@@ -107,6 +107,9 @@ int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw,
+       dev_info(pdsc->dev, "Installing firmware\n");
++      if (!pdsc->cmd_regs)
++              return -ENXIO;
++
+       dl = priv_to_devlink(pdsc);
+       devlink_flash_update_status_notify(dl, "Preparing to flash",
+                                          NULL, 0, 0);
+diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c
+index 4c7f982c12a1..7471a751e4d8 100644
+--- a/drivers/net/ethernet/amd/pds_core/main.c
++++ b/drivers/net/ethernet/amd/pds_core/main.c
+@@ -37,6 +37,11 @@ static void pdsc_unmap_bars(struct pdsc *pdsc)
+       struct pdsc_dev_bar *bars = pdsc->bars;
+       unsigned int i;
++      pdsc->info_regs = NULL;
++      pdsc->cmd_regs = NULL;
++      pdsc->intr_status = NULL;
++      pdsc->intr_ctrl = NULL;
++
+       for (i = 0; i < PDS_CORE_BARS_MAX; i++) {
+               if (bars[i].vaddr)
+                       pci_iounmap(pdsc->pdev, bars[i].vaddr);
+-- 
+2.43.0
+
diff --git a/queue-6.6/pds_core-implement-pci-reset-handlers.patch b/queue-6.6/pds_core-implement-pci-reset-handlers.patch
new file mode 100644 (file)
index 0000000..a527a89
--- /dev/null
@@ -0,0 +1,156 @@
+From bed0ccacdf6940ceef1556ba6574226f5ab1fdea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Sep 2023 15:31:59 -0700
+Subject: pds_core: implement pci reset handlers
+
+From: Shannon Nelson <shannon.nelson@amd.com>
+
+[ Upstream commit ffa55858330f267beec995fc4f68098c91311c64 ]
+
+Implement the callbacks for a nice PCI reset.  These get called
+when a user is nice enough to use the sysfs PCI reset entry, e.g.
+    echo 1 > /sys/bus/pci/devices/0000:2b:00.0/reset
+
+Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
+Reviewed-by: Brett Creeley <brett.creeley@amd.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Stable-dep-of: 7e82a8745b95 ("pds_core: Prevent race issues involving the adminq")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/pds_core/core.c | 14 +++++--
+ drivers/net/ethernet/amd/pds_core/core.h |  4 ++
+ drivers/net/ethernet/amd/pds_core/main.c | 50 ++++++++++++++++++++++++
+ 3 files changed, 65 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c
+index dfb43ed60e27..cc5e3d1fe652 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.c
++++ b/drivers/net/ethernet/amd/pds_core/core.c
+@@ -514,7 +514,7 @@ void pdsc_stop(struct pdsc *pdsc)
+                                          PDS_CORE_INTR_MASK_SET);
+ }
+-static void pdsc_fw_down(struct pdsc *pdsc)
++void pdsc_fw_down(struct pdsc *pdsc)
+ {
+       union pds_core_notifyq_comp reset_event = {
+               .reset.ecode = cpu_to_le16(PDS_EVENT_RESET),
+@@ -522,10 +522,13 @@ static void pdsc_fw_down(struct pdsc *pdsc)
+       };
+       if (test_and_set_bit(PDSC_S_FW_DEAD, &pdsc->state)) {
+-              dev_err(pdsc->dev, "%s: already happening\n", __func__);
++              dev_warn(pdsc->dev, "%s: already happening\n", __func__);
+               return;
+       }
++      if (pdsc->pdev->is_virtfn)
++              return;
++
+       /* Notify clients of fw_down */
+       if (pdsc->fw_reporter)
+               devlink_health_report(pdsc->fw_reporter, "FW down reported", pdsc);
+@@ -535,7 +538,7 @@ static void pdsc_fw_down(struct pdsc *pdsc)
+       pdsc_teardown(pdsc, PDSC_TEARDOWN_RECOVERY);
+ }
+-static void pdsc_fw_up(struct pdsc *pdsc)
++void pdsc_fw_up(struct pdsc *pdsc)
+ {
+       union pds_core_notifyq_comp reset_event = {
+               .reset.ecode = cpu_to_le16(PDS_EVENT_RESET),
+@@ -548,6 +551,11 @@ static void pdsc_fw_up(struct pdsc *pdsc)
+               return;
+       }
++      if (pdsc->pdev->is_virtfn) {
++              clear_bit(PDSC_S_FW_DEAD, &pdsc->state);
++              return;
++      }
++
+       err = pdsc_setup(pdsc, PDSC_SETUP_RECOVERY);
+       if (err)
+               goto err_out;
+diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/ethernet/amd/pds_core/core.h
+index b1c1f1007b06..860bce1731c7 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.h
++++ b/drivers/net/ethernet/amd/pds_core/core.h
+@@ -309,4 +309,8 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data);
+ int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw,
+                        struct netlink_ext_ack *extack);
++
++void pdsc_fw_down(struct pdsc *pdsc);
++void pdsc_fw_up(struct pdsc *pdsc);
++
+ #endif /* _PDSC_H_ */
+diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c
+index 3a45bf474a19..4c7f982c12a1 100644
+--- a/drivers/net/ethernet/amd/pds_core/main.c
++++ b/drivers/net/ethernet/amd/pds_core/main.c
+@@ -445,12 +445,62 @@ static void pdsc_remove(struct pci_dev *pdev)
+       devlink_free(dl);
+ }
++static void pdsc_reset_prepare(struct pci_dev *pdev)
++{
++      struct pdsc *pdsc = pci_get_drvdata(pdev);
++
++      pdsc_fw_down(pdsc);
++
++      pci_free_irq_vectors(pdev);
++      pdsc_unmap_bars(pdsc);
++      pci_release_regions(pdev);
++      pci_disable_device(pdev);
++}
++
++static void pdsc_reset_done(struct pci_dev *pdev)
++{
++      struct pdsc *pdsc = pci_get_drvdata(pdev);
++      struct device *dev = pdsc->dev;
++      int err;
++
++      err = pci_enable_device(pdev);
++      if (err) {
++              dev_err(dev, "Cannot enable PCI device: %pe\n", ERR_PTR(err));
++              return;
++      }
++      pci_set_master(pdev);
++
++      if (!pdev->is_virtfn) {
++              pcie_print_link_status(pdsc->pdev);
++
++              err = pci_request_regions(pdsc->pdev, PDS_CORE_DRV_NAME);
++              if (err) {
++                      dev_err(pdsc->dev, "Cannot request PCI regions: %pe\n",
++                              ERR_PTR(err));
++                      return;
++              }
++
++              err = pdsc_map_bars(pdsc);
++              if (err)
++                      return;
++      }
++
++      pdsc_fw_up(pdsc);
++}
++
++static const struct pci_error_handlers pdsc_err_handler = {
++      /* FLR handling */
++      .reset_prepare      = pdsc_reset_prepare,
++      .reset_done         = pdsc_reset_done,
++};
++
+ static struct pci_driver pdsc_driver = {
+       .name = PDS_CORE_DRV_NAME,
+       .id_table = pdsc_id_table,
+       .probe = pdsc_probe,
+       .remove = pdsc_remove,
+       .sriov_configure = pdsc_sriov_configure,
++      .err_handler = &pdsc_err_handler,
+ };
+ void *pdsc_get_pf_struct(struct pci_dev *vf_pdev)
+-- 
+2.43.0
+
diff --git a/queue-6.6/pds_core-prevent-race-issues-involving-the-adminq.patch b/queue-6.6/pds_core-prevent-race-issues-involving-the-adminq.patch
new file mode 100644 (file)
index 0000000..bdcbd93
--- /dev/null
@@ -0,0 +1,203 @@
+From a73817269398d67b0a90d1226bb24efafad91a1f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 15:40:33 -0800
+Subject: pds_core: Prevent race issues involving the adminq
+
+From: Brett Creeley <brett.creeley@amd.com>
+
+[ Upstream commit 7e82a8745b951b1e794cc780d46f3fbee5e93447 ]
+
+There are multiple paths that can result in using the pdsc's
+adminq.
+
+[1] pdsc_adminq_isr and the resulting work from queue_work(),
+    i.e. pdsc_work_thread()->pdsc_process_adminq()
+
+[2] pdsc_adminq_post()
+
+When the device goes through reset via PCIe reset and/or
+a fw_down/fw_up cycle due to bad PCIe state or bad device
+state the adminq is destroyed and recreated.
+
+A NULL pointer dereference can happen if [1] or [2] happens
+after the adminq is already destroyed.
+
+In order to fix this, add some further state checks and
+implement reference counting for adminq uses. Reference
+counting was used because multiple threads can attempt to
+access the adminq at the same time via [1] or [2]. Additionally,
+multiple clients (i.e. pds-vfio-pci) can be using [2]
+at the same time.
+
+The adminq_refcnt is initialized to 1 when the adminq has been
+allocated and is ready to use. Users/clients of the adminq
+(i.e. [1] and [2]) will increment the refcnt when they are using
+the adminq. When the driver goes into a fw_down cycle it will
+set the PDSC_S_FW_DEAD bit and then wait for the adminq_refcnt
+to hit 1. Setting the PDSC_S_FW_DEAD before waiting will prevent
+any further adminq_refcnt increments. Waiting for the
+adminq_refcnt to hit 1 allows for any current users of the adminq
+to finish before the driver frees the adminq. Once the
+adminq_refcnt hits 1 the driver clears the refcnt to signify that
+the adminq is deleted and cannot be used. On the fw_up cycle the
+driver will once again initialize the adminq_refcnt to 1 allowing
+the adminq to be used again.
+
+Fixes: 01ba61b55b20 ("pds_core: Add adminq processing and commands")
+Signed-off-by: Brett Creeley <brett.creeley@amd.com>
+Reviewed-by: Shannon Nelson <shannon.nelson@amd.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Link: https://lore.kernel.org/r/20240129234035.69802-5-brett.creeley@amd.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/pds_core/adminq.c | 31 +++++++++++++++++-----
+ drivers/net/ethernet/amd/pds_core/core.c   | 21 +++++++++++++++
+ drivers/net/ethernet/amd/pds_core/core.h   |  1 +
+ 3 files changed, 47 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/pds_core/adminq.c b/drivers/net/ethernet/amd/pds_core/adminq.c
+index 68be5ea251fc..5edff33d56f3 100644
+--- a/drivers/net/ethernet/amd/pds_core/adminq.c
++++ b/drivers/net/ethernet/amd/pds_core/adminq.c
+@@ -63,6 +63,15 @@ static int pdsc_process_notifyq(struct pdsc_qcq *qcq)
+       return nq_work;
+ }
++static bool pdsc_adminq_inc_if_up(struct pdsc *pdsc)
++{
++      if (pdsc->state & BIT_ULL(PDSC_S_STOPPING_DRIVER) ||
++          pdsc->state & BIT_ULL(PDSC_S_FW_DEAD))
++              return false;
++
++      return refcount_inc_not_zero(&pdsc->adminq_refcnt);
++}
++
+ void pdsc_process_adminq(struct pdsc_qcq *qcq)
+ {
+       union pds_core_adminq_comp *comp;
+@@ -75,9 +84,9 @@ void pdsc_process_adminq(struct pdsc_qcq *qcq)
+       int aq_work = 0;
+       int credits;
+-      /* Don't process AdminQ when shutting down */
+-      if (pdsc->state & BIT_ULL(PDSC_S_STOPPING_DRIVER)) {
+-              dev_err(pdsc->dev, "%s: called while PDSC_S_STOPPING_DRIVER\n",
++      /* Don't process AdminQ when it's not up */
++      if (!pdsc_adminq_inc_if_up(pdsc)) {
++              dev_err(pdsc->dev, "%s: called while adminq is unavailable\n",
+                       __func__);
+               return;
+       }
+@@ -124,6 +133,7 @@ void pdsc_process_adminq(struct pdsc_qcq *qcq)
+               pds_core_intr_credits(&pdsc->intr_ctrl[qcq->intx],
+                                     credits,
+                                     PDS_CORE_INTR_CRED_REARM);
++      refcount_dec(&pdsc->adminq_refcnt);
+ }
+ void pdsc_work_thread(struct work_struct *work)
+@@ -138,9 +148,9 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data)
+       struct pdsc *pdsc = data;
+       struct pdsc_qcq *qcq;
+-      /* Don't process AdminQ when shutting down */
+-      if (pdsc->state & BIT_ULL(PDSC_S_STOPPING_DRIVER)) {
+-              dev_err(pdsc->dev, "%s: called while PDSC_S_STOPPING_DRIVER\n",
++      /* Don't process AdminQ when it's not up */
++      if (!pdsc_adminq_inc_if_up(pdsc)) {
++              dev_err(pdsc->dev, "%s: called while adminq is unavailable\n",
+                       __func__);
+               return IRQ_HANDLED;
+       }
+@@ -148,6 +158,7 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data)
+       qcq = &pdsc->adminqcq;
+       queue_work(pdsc->wq, &qcq->work);
+       pds_core_intr_mask(&pdsc->intr_ctrl[qcq->intx], PDS_CORE_INTR_MASK_CLEAR);
++      refcount_dec(&pdsc->adminq_refcnt);
+       return IRQ_HANDLED;
+ }
+@@ -231,6 +242,12 @@ int pdsc_adminq_post(struct pdsc *pdsc,
+       int err = 0;
+       int index;
++      if (!pdsc_adminq_inc_if_up(pdsc)) {
++              dev_dbg(pdsc->dev, "%s: preventing adminq cmd %u\n",
++                      __func__, cmd->opcode);
++              return -ENXIO;
++      }
++
+       wc.qcq = &pdsc->adminqcq;
+       index = __pdsc_adminq_post(pdsc, &pdsc->adminqcq, cmd, comp, &wc);
+       if (index < 0) {
+@@ -286,6 +303,8 @@ int pdsc_adminq_post(struct pdsc *pdsc,
+                       queue_work(pdsc->wq, &pdsc->health_work);
+       }
++      refcount_dec(&pdsc->adminq_refcnt);
++
+       return err;
+ }
+ EXPORT_SYMBOL_GPL(pdsc_adminq_post);
+diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c
+index cc5e3d1fe652..e1f554f25329 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.c
++++ b/drivers/net/ethernet/amd/pds_core/core.c
+@@ -452,6 +452,7 @@ int pdsc_setup(struct pdsc *pdsc, bool init)
+       if (init)
+               pdsc_debugfs_add_viftype(pdsc);
++      refcount_set(&pdsc->adminq_refcnt, 1);
+       clear_bit(PDSC_S_FW_DEAD, &pdsc->state);
+       return 0;
+@@ -514,6 +515,24 @@ void pdsc_stop(struct pdsc *pdsc)
+                                          PDS_CORE_INTR_MASK_SET);
+ }
++static void pdsc_adminq_wait_and_dec_once_unused(struct pdsc *pdsc)
++{
++      /* The driver initializes the adminq_refcnt to 1 when the adminq is
++       * allocated and ready for use. Other users/requesters will increment
++       * the refcnt while in use. If the refcnt is down to 1 then the adminq
++       * is not in use and the refcnt can be cleared and adminq freed. Before
++       * calling this function the driver will set PDSC_S_FW_DEAD, which
++       * prevent subsequent attempts to use the adminq and increment the
++       * refcnt to fail. This guarantees that this function will eventually
++       * exit.
++       */
++      while (!refcount_dec_if_one(&pdsc->adminq_refcnt)) {
++              dev_dbg_ratelimited(pdsc->dev, "%s: adminq in use\n",
++                                  __func__);
++              cpu_relax();
++      }
++}
++
+ void pdsc_fw_down(struct pdsc *pdsc)
+ {
+       union pds_core_notifyq_comp reset_event = {
+@@ -529,6 +548,8 @@ void pdsc_fw_down(struct pdsc *pdsc)
+       if (pdsc->pdev->is_virtfn)
+               return;
++      pdsc_adminq_wait_and_dec_once_unused(pdsc);
++
+       /* Notify clients of fw_down */
+       if (pdsc->fw_reporter)
+               devlink_health_report(pdsc->fw_reporter, "FW down reported", pdsc);
+diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/ethernet/amd/pds_core/core.h
+index 860bce1731c7..d6d19f72df00 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.h
++++ b/drivers/net/ethernet/amd/pds_core/core.h
+@@ -184,6 +184,7 @@ struct pdsc {
+       struct mutex devcmd_lock;       /* lock for dev_cmd operations */
+       struct mutex config_lock;       /* lock for configuration operations */
+       spinlock_t adminq_lock;         /* lock for adminq operations */
++      refcount_t adminq_refcnt;
+       struct pds_core_dev_info_regs __iomem *info_regs;
+       struct pds_core_dev_cmd_regs __iomem *cmd_regs;
+       struct pds_core_intr __iomem *intr_ctrl;
+-- 
+2.43.0
+
diff --git a/queue-6.6/pds_core-rework-teardown-setup-flow-to-be-more-commo.patch b/queue-6.6/pds_core-rework-teardown-setup-flow-to-be-more-commo.patch
new file mode 100644 (file)
index 0000000..00d7b6d
--- /dev/null
@@ -0,0 +1,154 @@
+From a17bfbfbb57e5ed3eb1dbbdc3bb14c0fdf2fd1a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 15:40:35 -0800
+Subject: pds_core: Rework teardown/setup flow to be more common
+
+From: Brett Creeley <brett.creeley@amd.com>
+
+[ Upstream commit bc90fbe0c3182157d2be100a2f6c2edbb1820677 ]
+
+Currently the teardown/setup flow for driver probe/remove is quite
+a bit different from the reset flows in pdsc_fw_down()/pdsc_fw_up().
+One key piece that's missing are the calls to pci_alloc_irq_vectors()
+and pci_free_irq_vectors(). The pcie reset case is calling
+pci_free_irq_vectors() on reset_prepare, but not calling the
+corresponding pci_alloc_irq_vectors() on reset_done. This is causing
+unexpected/unwanted interrupt behavior due to the adminq interrupt
+being accidentally put into legacy interrupt mode. Also, the
+pci_alloc_irq_vectors()/pci_free_irq_vectors() functions are being
+called directly in probe/remove respectively.
+
+Fix this inconsistency by making the following changes:
+  1. Always call pdsc_dev_init() in pdsc_setup(), which calls
+     pci_alloc_irq_vectors() and get rid of the now unused
+     pds_dev_reinit().
+  2. Always free/clear the pdsc->intr_info in pdsc_teardown()
+     since this structure will get re-alloced in pdsc_setup().
+  3. Move the calls of pci_free_irq_vectors() to pdsc_teardown()
+     since pci_alloc_irq_vectors() will always be called in
+     pdsc_setup()->pdsc_dev_init() for both the probe/remove and
+     reset flows.
+  4. Make sure to only create the debugfs "identity" entry when it
+     doesn't already exist, which it will in the reset case because
+     it's already been created in the initial call to pdsc_dev_init().
+
+Fixes: ffa55858330f ("pds_core: implement pci reset handlers")
+Signed-off-by: Brett Creeley <brett.creeley@amd.com>
+Reviewed-by: Shannon Nelson <shannon.nelson@amd.com>
+Link: https://lore.kernel.org/r/20240129234035.69802-7-brett.creeley@amd.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/pds_core/core.c    | 13 +++++--------
+ drivers/net/ethernet/amd/pds_core/core.h    |  1 -
+ drivers/net/ethernet/amd/pds_core/debugfs.c |  4 ++++
+ drivers/net/ethernet/amd/pds_core/dev.c     |  7 -------
+ drivers/net/ethernet/amd/pds_core/main.c    |  2 --
+ 5 files changed, 9 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c
+index e1f554f25329..eb73c921dc1e 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.c
++++ b/drivers/net/ethernet/amd/pds_core/core.c
+@@ -407,10 +407,7 @@ int pdsc_setup(struct pdsc *pdsc, bool init)
+       int numdescs;
+       int err;
+-      if (init)
+-              err = pdsc_dev_init(pdsc);
+-      else
+-              err = pdsc_dev_reinit(pdsc);
++      err = pdsc_dev_init(pdsc);
+       if (err)
+               return err;
+@@ -479,10 +476,9 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)
+               for (i = 0; i < pdsc->nintrs; i++)
+                       pdsc_intr_free(pdsc, i);
+-              if (removing) {
+-                      kfree(pdsc->intr_info);
+-                      pdsc->intr_info = NULL;
+-              }
++              kfree(pdsc->intr_info);
++              pdsc->intr_info = NULL;
++              pdsc->nintrs = 0;
+       }
+       if (pdsc->kern_dbpage) {
+@@ -490,6 +486,7 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)
+               pdsc->kern_dbpage = NULL;
+       }
++      pci_free_irq_vectors(pdsc->pdev);
+       set_bit(PDSC_S_FW_DEAD, &pdsc->state);
+ }
+diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/ethernet/amd/pds_core/core.h
+index d6d19f72df00..f410f7d13205 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.h
++++ b/drivers/net/ethernet/amd/pds_core/core.h
+@@ -281,7 +281,6 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,
+                      union pds_core_dev_comp *comp, int max_seconds);
+ int pdsc_devcmd_init(struct pdsc *pdsc);
+ int pdsc_devcmd_reset(struct pdsc *pdsc);
+-int pdsc_dev_reinit(struct pdsc *pdsc);
+ int pdsc_dev_init(struct pdsc *pdsc);
+ int pdsc_intr_alloc(struct pdsc *pdsc, char *name,
+diff --git a/drivers/net/ethernet/amd/pds_core/debugfs.c b/drivers/net/ethernet/amd/pds_core/debugfs.c
+index 8ec392299b7d..4e8579ca1c8c 100644
+--- a/drivers/net/ethernet/amd/pds_core/debugfs.c
++++ b/drivers/net/ethernet/amd/pds_core/debugfs.c
+@@ -64,6 +64,10 @@ DEFINE_SHOW_ATTRIBUTE(identity);
+ void pdsc_debugfs_add_ident(struct pdsc *pdsc)
+ {
++      /* This file will already exist in the reset flow */
++      if (debugfs_lookup("identity", pdsc->dentry))
++              return;
++
+       debugfs_create_file("identity", 0400, pdsc->dentry,
+                           pdsc, &identity_fops);
+ }
+diff --git a/drivers/net/ethernet/amd/pds_core/dev.c b/drivers/net/ethernet/amd/pds_core/dev.c
+index 1d590eb463d0..f0e39ab40045 100644
+--- a/drivers/net/ethernet/amd/pds_core/dev.c
++++ b/drivers/net/ethernet/amd/pds_core/dev.c
+@@ -309,13 +309,6 @@ static int pdsc_identify(struct pdsc *pdsc)
+       return 0;
+ }
+-int pdsc_dev_reinit(struct pdsc *pdsc)
+-{
+-      pdsc_init_devinfo(pdsc);
+-
+-      return pdsc_identify(pdsc);
+-}
+-
+ int pdsc_dev_init(struct pdsc *pdsc)
+ {
+       unsigned int nintrs;
+diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c
+index 7471a751e4d8..7cc5a6b94939 100644
+--- a/drivers/net/ethernet/amd/pds_core/main.c
++++ b/drivers/net/ethernet/amd/pds_core/main.c
+@@ -438,7 +438,6 @@ static void pdsc_remove(struct pci_dev *pdev)
+               mutex_destroy(&pdsc->config_lock);
+               mutex_destroy(&pdsc->devcmd_lock);
+-              pci_free_irq_vectors(pdev);
+               pdsc_unmap_bars(pdsc);
+               pci_release_regions(pdev);
+       }
+@@ -456,7 +455,6 @@ static void pdsc_reset_prepare(struct pci_dev *pdev)
+       pdsc_fw_down(pdsc);
+-      pci_free_irq_vectors(pdev);
+       pdsc_unmap_bars(pdsc);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+-- 
+2.43.0
+
diff --git a/queue-6.6/pds_core-use-struct-pdsc-for-the-pdsc_adminq_isr-pri.patch b/queue-6.6/pds_core-use-struct-pdsc-for-the-pdsc_adminq_isr-pri.patch
new file mode 100644 (file)
index 0000000..8f4b95d
--- /dev/null
@@ -0,0 +1,72 @@
+From a1f0fd84d2f6d70de72d1e837a9b4af21d5843dc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 15:40:32 -0800
+Subject: pds_core: Use struct pdsc for the pdsc_adminq_isr private data
+
+From: Brett Creeley <brett.creeley@amd.com>
+
+[ Upstream commit 951705151e50f9022bc96ec8b3fd5697380b1df6 ]
+
+The initial design for the adminq interrupt was done based
+on client drivers having their own adminq and adminq
+interrupt. So, each client driver's adminq isr would use
+their specific adminqcq for the private data struct. For the
+time being the design has changed to only use a single
+adminq for all clients. So, instead use the struct pdsc for
+the private data to simplify things a bit.
+
+This also has the benefit of not dereferencing the adminqcq
+to access the pdsc struct when the PDSC_S_STOPPING_DRIVER bit
+is set and the adminqcq has actually been cleared/freed.
+
+Fixes: 01ba61b55b20 ("pds_core: Add adminq processing and commands")
+Signed-off-by: Brett Creeley <brett.creeley@amd.com>
+Reviewed-by: Shannon Nelson <shannon.nelson@amd.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Link: https://lore.kernel.org/r/20240129234035.69802-4-brett.creeley@amd.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/pds_core/adminq.c | 5 +++--
+ drivers/net/ethernet/amd/pds_core/core.c   | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/pds_core/adminq.c b/drivers/net/ethernet/amd/pds_core/adminq.c
+index 5beadabc2136..68be5ea251fc 100644
+--- a/drivers/net/ethernet/amd/pds_core/adminq.c
++++ b/drivers/net/ethernet/amd/pds_core/adminq.c
+@@ -135,8 +135,8 @@ void pdsc_work_thread(struct work_struct *work)
+ irqreturn_t pdsc_adminq_isr(int irq, void *data)
+ {
+-      struct pdsc_qcq *qcq = data;
+-      struct pdsc *pdsc = qcq->pdsc;
++      struct pdsc *pdsc = data;
++      struct pdsc_qcq *qcq;
+       /* Don't process AdminQ when shutting down */
+       if (pdsc->state & BIT_ULL(PDSC_S_STOPPING_DRIVER)) {
+@@ -145,6 +145,7 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data)
+               return IRQ_HANDLED;
+       }
++      qcq = &pdsc->adminqcq;
+       queue_work(pdsc->wq, &qcq->work);
+       pds_core_intr_mask(&pdsc->intr_ctrl[qcq->intx], PDS_CORE_INTR_MASK_CLEAR);
+diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c
+index b58c166d438d..dfb43ed60e27 100644
+--- a/drivers/net/ethernet/amd/pds_core/core.c
++++ b/drivers/net/ethernet/amd/pds_core/core.c
+@@ -125,7 +125,7 @@ static int pdsc_qcq_intr_alloc(struct pdsc *pdsc, struct pdsc_qcq *qcq)
+       snprintf(name, sizeof(name), "%s-%d-%s",
+                PDS_CORE_DRV_NAME, pdsc->pdev->bus->number, qcq->q.name);
+-      index = pdsc_intr_alloc(pdsc, name, pdsc_adminq_isr, qcq);
++      index = pdsc_intr_alloc(pdsc, name, pdsc_adminq_isr, pdsc);
+       if (index < 0)
+               return index;
+       qcq->intx = index;
+-- 
+2.43.0
+
diff --git a/queue-6.6/regulator-ti-abb-don-t-use-devm_platform_ioremap_res.patch b/queue-6.6/regulator-ti-abb-don-t-use-devm_platform_ioremap_res.patch
new file mode 100644 (file)
index 0000000..006e0bc
--- /dev/null
@@ -0,0 +1,103 @@
+From 5ed74c001b3c23bb18cec08480d13def29d551f7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 23 Jan 2024 12:14:56 +0100
+Subject: regulator: ti-abb: don't use devm_platform_ioremap_resource_byname
+ for shared interrupt register
+
+From: Romain Naour <romain.naour@skf.com>
+
+[ Upstream commit a67e1f0bd4564b485e0f0c3ed7f6bf17688be268 ]
+
+We can't use devm_platform_ioremap_resource_byname() to remap the
+interrupt register that can be shared between
+regulator-abb-{ivahd,dspeve,gpu} drivers instances.
+
+The combined helper introduce a call to devm_request_mem_region() that
+creates a new busy resource region on PRM_IRQSTATUS_MPU register
+(0x4ae06010). The first devm_request_mem_region() call succeeds for
+regulator-abb-ivahd but fails for the two other regulator-abb-dspeve
+and regulator-abb-gpu.
+
+  # cat /proc/iomem | grep -i 4ae06
+  4ae06010-4ae06013 : 4ae07e34.regulator-abb-ivahd int-address
+  4ae06014-4ae06017 : 4ae07ddc.regulator-abb-mpu int-address
+
+regulator-abb-dspeve and regulator-abb-gpu are missing due to
+devm_request_mem_region() failure (EBUSY):
+
+  [    1.326660] ti_abb 4ae07e30.regulator-abb-dspeve: can't request region for resource [mem 0x4ae06010-0x4ae06013]
+  [    1.326660] ti_abb: probe of 4ae07e30.regulator-abb-dspeve failed with error -16
+  [    1.327239] ti_abb 4ae07de4.regulator-abb-gpu: can't request region for resource [mem 0x4ae06010-0x4ae06013]
+  [    1.327270] ti_abb: probe of 4ae07de4.regulator-abb-gpu failed with error -16
+
+>From arm/boot/dts/dra7.dtsi:
+
+The abb_mpu is the only instance using its own interrupt register:
+  (0x4ae06014) PRM_IRQSTATUS_MPU_2, ABB_MPU_DONE_ST (bit 7)
+
+The other tree instances (abb_ivahd, abb_dspeve, abb_gpu) share
+PRM_IRQSTATUS_MPU register (0x4ae06010) but use different bits
+ABB_IVA_DONE_ST (bit 30), ABB_DSPEVE_DONE_ST( bit 29) and
+ABB_GPU_DONE_ST (but 28).
+
+The commit b36c6b1887ff ("regulator: ti-abb: Make use of the helper
+function devm_ioremap related") overlooked the following comment
+implicitly explaining why devm_ioremap() is used in this case:
+
+  /*
+   * We may have shared interrupt register offsets which are
+   * write-1-to-clear between domains ensuring exclusivity.
+   */
+
+Fixes and partially reverts commit b36c6b1887ff ("regulator: ti-abb:
+Make use of the helper function devm_ioremap related").
+
+Improve the existing comment to avoid further conversion to
+devm_platform_ioremap_resource_byname().
+
+Fixes: b36c6b1887ff ("regulator: ti-abb: Make use of the helper function devm_ioremap related")
+Signed-off-by: Romain Naour <romain.naour@skf.com>
+Reviewed-by: Yoann Congal <yoann.congal@smile.fr>
+Link: https://msgid.link/r/20240123111456.739381-1-romain.naour@smile.fr
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/regulator/ti-abb-regulator.c | 22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/regulator/ti-abb-regulator.c b/drivers/regulator/ti-abb-regulator.c
+index 86d2d80b4b41..ae5dcaea84df 100644
+--- a/drivers/regulator/ti-abb-regulator.c
++++ b/drivers/regulator/ti-abb-regulator.c
+@@ -734,9 +734,25 @@ static int ti_abb_probe(struct platform_device *pdev)
+                       return PTR_ERR(abb->setup_reg);
+       }
+-      abb->int_base = devm_platform_ioremap_resource_byname(pdev, "int-address");
+-      if (IS_ERR(abb->int_base))
+-              return PTR_ERR(abb->int_base);
++      pname = "int-address";
++      res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname);
++      if (!res) {
++              dev_err(dev, "Missing '%s' IO resource\n", pname);
++              return -ENODEV;
++      }
++      /*
++       * The MPU interrupt status register (PRM_IRQSTATUS_MPU) is
++       * shared between regulator-abb-{ivahd,dspeve,gpu} driver
++       * instances. Therefore use devm_ioremap() rather than
++       * devm_platform_ioremap_resource_byname() to avoid busy
++       * resource region conflicts.
++       */
++      abb->int_base = devm_ioremap(dev, res->start,
++                                           resource_size(res));
++      if (!abb->int_base) {
++              dev_err(dev, "Unable to map '%s'\n", pname);
++              return -ENOMEM;
++      }
+       /* Map Optional resources */
+       pname = "efuse-address";
+-- 
+2.43.0
+
diff --git a/queue-6.6/scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch b/queue-6.6/scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch
new file mode 100644 (file)
index 0000000..bb1d3e8
--- /dev/null
@@ -0,0 +1,116 @@
+From d5b948bafbca7c10ce1957da131fd37b07f9dcf4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jan 2024 15:00:00 +0800
+Subject: scsi: core: Move scsi_host_busy() out of host lock for waking up EH
+ handler
+
+From: Ming Lei <ming.lei@redhat.com>
+
+[ Upstream commit 4373534a9850627a2695317944898eb1283a2db0 ]
+
+Inside scsi_eh_wakeup(), scsi_host_busy() is called & checked with host
+lock every time for deciding if error handler kthread needs to be waken up.
+
+This can be too heavy in case of recovery, such as:
+
+ - N hardware queues
+
+ - queue depth is M for each hardware queue
+
+ - each scsi_host_busy() iterates over (N * M) tag/requests
+
+If recovery is triggered in case that all requests are in-flight, each
+scsi_eh_wakeup() is strictly serialized, when scsi_eh_wakeup() is called
+for the last in-flight request, scsi_host_busy() has been run for (N * M -
+1) times, and request has been iterated for (N*M - 1) * (N * M) times.
+
+If both N and M are big enough, hard lockup can be triggered on acquiring
+host lock, and it is observed on mpi3mr(128 hw queues, queue depth 8169).
+
+Fix the issue by calling scsi_host_busy() outside the host lock. We don't
+need the host lock for getting busy count because host the lock never
+covers that.
+
+[mkp: Drop unnecessary 'busy' variables pointed out by Bart]
+
+Cc: Ewan Milne <emilne@redhat.com>
+Fixes: 6eb045e092ef ("scsi: core: avoid host-wide host_busy counter for scsi_mq")
+Signed-off-by: Ming Lei <ming.lei@redhat.com>
+Link: https://lore.kernel.org/r/20240112070000.4161982-1-ming.lei@redhat.com
+Reviewed-by: Ewan D. Milne <emilne@redhat.com>
+Reviewed-by: Sathya Prakash Veerichetty <safhya.prakash@broadcom.com>
+Tested-by: Sathya Prakash Veerichetty <safhya.prakash@broadcom.com>
+Reviewed-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/scsi_error.c | 8 ++++----
+ drivers/scsi/scsi_lib.c   | 2 +-
+ drivers/scsi/scsi_priv.h  | 2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
+index d983f4a0e9f1..3328b175a832 100644
+--- a/drivers/scsi/scsi_error.c
++++ b/drivers/scsi/scsi_error.c
+@@ -61,11 +61,11 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd);
+ static enum scsi_disposition scsi_try_to_abort_cmd(const struct scsi_host_template *,
+                                                  struct scsi_cmnd *);
+-void scsi_eh_wakeup(struct Scsi_Host *shost)
++void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy)
+ {
+       lockdep_assert_held(shost->host_lock);
+-      if (scsi_host_busy(shost) == shost->host_failed) {
++      if (busy == shost->host_failed) {
+               trace_scsi_eh_wakeup(shost);
+               wake_up_process(shost->ehandler);
+               SCSI_LOG_ERROR_RECOVERY(5, shost_printk(KERN_INFO, shost,
+@@ -88,7 +88,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)
+       if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 ||
+           scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) {
+               shost->host_eh_scheduled++;
+-              scsi_eh_wakeup(shost);
++              scsi_eh_wakeup(shost, scsi_host_busy(shost));
+       }
+       spin_unlock_irqrestore(shost->host_lock, flags);
+@@ -286,7 +286,7 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)
+       spin_lock_irqsave(shost->host_lock, flags);
+       shost->host_failed++;
+-      scsi_eh_wakeup(shost);
++      scsi_eh_wakeup(shost, scsi_host_busy(shost));
+       spin_unlock_irqrestore(shost->host_lock, flags);
+ }
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index c2f647a7c1b0..dfdffe55c5a6 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -280,7 +280,7 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
+       if (unlikely(scsi_host_in_recovery(shost))) {
+               spin_lock_irqsave(shost->host_lock, flags);
+               if (shost->host_failed || shost->host_eh_scheduled)
+-                      scsi_eh_wakeup(shost);
++                      scsi_eh_wakeup(shost, scsi_host_busy(shost));
+               spin_unlock_irqrestore(shost->host_lock, flags);
+       }
+       rcu_read_unlock();
+diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
+index 3f0dfb97db6b..1fbfe1b52c9f 100644
+--- a/drivers/scsi/scsi_priv.h
++++ b/drivers/scsi/scsi_priv.h
+@@ -92,7 +92,7 @@ extern void scmd_eh_abort_handler(struct work_struct *work);
+ extern enum blk_eh_timer_return scsi_timeout(struct request *req);
+ extern int scsi_error_handler(void *host);
+ extern enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *cmd);
+-extern void scsi_eh_wakeup(struct Scsi_Host *shost);
++extern void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy);
+ extern void scsi_eh_scmd_add(struct scsi_cmnd *);
+ void scsi_eh_ready_devs(struct Scsi_Host *shost,
+                       struct list_head *work_q,
+-- 
+2.43.0
+
diff --git a/queue-6.6/scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch b/queue-6.6/scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch
new file mode 100644 (file)
index 0000000..ee71b36
--- /dev/null
@@ -0,0 +1,38 @@
+From a90455370c015fd0c68b03fad0fb16a5a7f5c401 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jan 2024 12:19:27 +0800
+Subject: scsi: isci: Fix an error code problem in isci_io_request_build()
+
+From: Su Hui <suhui@nfschina.com>
+
+[ Upstream commit 658365c6b0857e6a306436e315a8633937e3af42 ]
+
+Clang static complains that Value stored to 'status' is never read. Return
+'status' rather than 'SCI_SUCCESS'.
+
+Fixes: f1f52e75939b ("isci: uplevel request infrastructure")
+Signed-off-by: Su Hui <suhui@nfschina.com>
+Link: https://lore.kernel.org/r/20240112041926.3924315-1-suhui@nfschina.com
+Reviewed-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/isci/request.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
+index a7b3243b471d..7162a5029b37 100644
+--- a/drivers/scsi/isci/request.c
++++ b/drivers/scsi/isci/request.c
+@@ -3390,7 +3390,7 @@ static enum sci_status isci_io_request_build(struct isci_host *ihost,
+               return SCI_FAILURE;
+       }
+-      return SCI_SUCCESS;
++      return status;
+ }
+ static struct isci_request *isci_request_from_tag(struct isci_host *ihost, u16 tag)
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-bonding-check-initial-state.patch b/queue-6.6/selftests-bonding-check-initial-state.patch
new file mode 100644 (file)
index 0000000..4c45477
--- /dev/null
@@ -0,0 +1,64 @@
+From 289e7b540e0a624e4572c3c466b01f1c91949239 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 Jan 2024 09:08:45 -0500
+Subject: selftests: bonding: Check initial state
+
+From: Benjamin Poirier <bpoirier@nvidia.com>
+
+[ Upstream commit 8cc063ae1b3dbe416ce62a15d49af4c2314b45fe ]
+
+The purpose of the test_LAG_cleanup() function is to check that some
+hardware addresses are removed from underlying devices after they have been
+unenslaved. The test function simply checks that those addresses are not
+present at the end. However, if the addresses were never added to begin
+with due to some error in device setup, the test function currently passes.
+This is a false positive since in that situation the test did not actually
+exercise the intended functionality.
+
+Add a check that the expected addresses are indeed present after device
+setup. This makes the test function more robust.
+
+I noticed this problem when running the team/dev_addr_lists.sh test on a
+system without support for dummy and ipv6:
+
+tools/testing/selftests/drivers/net/team# ./dev_addr_lists.sh
+Error: Unknown device type.
+Error: Unknown device type.
+This program is not intended to be run as root.
+RTNETLINK answers: Operation not supported
+TEST: team cleanup mode lacp                                        [ OK ]
+
+Fixes: bbb774d921e2 ("net: Add tests for bonding and team address list management")
+Signed-off-by: Benjamin Poirier <bpoirier@nvidia.com>
+Link: https://lore.kernel.org/r/20240131140848.360618-3-bpoirier@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../testing/selftests/drivers/net/bonding/lag_lib.sh  | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
+index 2a268b17b61f..dbdd736a41d3 100644
+--- a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
++++ b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
+@@ -48,6 +48,17 @@ test_LAG_cleanup()
+       ip link add mv0 link "$name" up address "$ucaddr" type macvlan
+       # Used to test dev->mc handling
+       ip address add "$addr6" dev "$name"
++
++      # Check that addresses were added as expected
++      (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 ||
++              grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null
++      check_err $? "macvlan unicast address not found on a slave"
++
++      # mcaddr is added asynchronously by addrconf_dad_work(), use busywait
++      (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 ||
++              grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null
++      check_err $? "IPv6 solicited-node multicast mac address not found on a slave"
++
+       ip link set dev "$name" down
+       ip link del "$name"
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-config-for-big-tcp-tests.patch b/queue-6.6/selftests-net-add-missing-config-for-big-tcp-tests.patch
new file mode 100644 (file)
index 0000000..e11c9da
--- /dev/null
@@ -0,0 +1,70 @@
+From d7638efa3aedaaaa9c1da09cb36a5b7e32c1f789 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 26 Jan 2024 16:32:36 +0100
+Subject: selftests: net: add missing config for big tcp tests
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit fcf67d82b8b878bdd95145382be43927bce07ec6 ]
+
+The big_tcp test-case requires a few kernel knobs currently
+not specified in the net selftests config, causing the
+following failure:
+
+  # selftests: net: big_tcp.sh
+  # Error: Failed to load TC action module.
+  # We have an error talking to the kernel
+...
+  # Testing for BIG TCP:
+  # CLI GSO | GW GRO | GW GSO | SER GRO
+  # ./big_tcp.sh: line 107: test: !=: unary operator expected
+...
+  # on        on       on       on      : [FAIL_on_link1]
+
+Add the missing configs
+
+Fixes: 6bb382bcf742 ("selftests: add a selftest for big tcp")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Acked-by: Aaron Conole <aconole@redhat.com>
+Acked-by: Xin Long <lucien.xin@gmail.com>
+Link: https://lore.kernel.org/all/21630ecea872fea13f071342ac64ef52a991a9b5.1706282943.git.pabeni@redhat.com/
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index 19ff75051660..413ab9abcf1b 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -29,7 +29,9 @@ CONFIG_NF_NAT=m
+ CONFIG_IP6_NF_IPTABLES=m
+ CONFIG_IP_NF_IPTABLES=m
+ CONFIG_IP6_NF_NAT=m
++CONFIG_IP6_NF_RAW=m
+ CONFIG_IP_NF_NAT=m
++CONFIG_IP_NF_RAW=m
+ CONFIG_IPV6_GRE=m
+ CONFIG_IPV6_SEG6_LWTUNNEL=y
+ CONFIG_L2TP_ETH=m
+@@ -45,6 +47,8 @@ CONFIG_NF_TABLES=m
+ CONFIG_NF_TABLES_IPV6=y
+ CONFIG_NF_TABLES_IPV4=y
+ CONFIG_NFT_NAT=m
++CONFIG_NETFILTER_XT_MATCH_LENGTH=m
++CONFIG_NET_ACT_CT=m
+ CONFIG_NET_ACT_GACT=m
+ CONFIG_NET_CLS_BASIC=m
+ CONFIG_NET_CLS_U32=m
+@@ -55,6 +59,7 @@ CONFIG_NET_SCH_HTB=m
+ CONFIG_NET_SCH_FQ=m
+ CONFIG_NET_SCH_ETF=m
+ CONFIG_NET_SCH_NETEM=y
++CONFIG_NF_FLOW_TABLE=m
+ CONFIG_PSAMPLE=m
+ CONFIG_TCP_MD5SIG=y
+ CONFIG_TEST_BLACKHOLE_DEV=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-config-for-geneve.patch b/queue-6.6/selftests-net-add-missing-config-for-geneve.patch
new file mode 100644 (file)
index 0000000..72809de
--- /dev/null
@@ -0,0 +1,40 @@
+From 4d8d0b9486b48eb0ad54a1e6dd9d1685a3d6bd33 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jan 2024 10:12:18 +0000
+Subject: selftests: net: add missing config for GENEVE
+
+From: Matthias May <Matthias.May@westermo.com>
+
+[ Upstream commit c9ec85153fea6873c52ed4f5055c87263f1b54f9 ]
+
+l2_tos_ttl_inherit.sh verifies the inheritance of tos and ttl
+for GRETAP, VXLAN and GENEVE.
+Before testing it checks if the required module is available
+and if not skips the tests accordingly.
+Currently only GRETAP and VXLAN are tested because the GENEVE
+module is missing.
+
+Fixes: b690842d12fd ("selftests/net: test l2 tunnel TOS/TTL inheriting")
+Signed-off-by: Matthias May <matthias.may@westermo.com>
+Link: https://lore.kernel.org/r/20240130101157.196006-1-matthias.may@westermo.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index b4e811f17eb1..dad385f73612 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -19,6 +19,7 @@ CONFIG_BRIDGE_VLAN_FILTERING=y
+ CONFIG_BRIDGE=y
+ CONFIG_CRYPTO_CHACHA20POLY1305=m
+ CONFIG_VLAN_8021Q=y
++CONFIG_GENEVE=m
+ CONFIG_IFB=y
+ CONFIG_INET_DIAG=y
+ CONFIG_IP_GRE=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-config-for-nf_target_ttl.patch b/queue-6.6/selftests-net-add-missing-config-for-nf_target_ttl.patch
new file mode 100644 (file)
index 0000000..2b09a1a
--- /dev/null
@@ -0,0 +1,37 @@
+From 8f4643c4ba8a8315217492dc3bf76be01698f910 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 Jan 2024 08:56:05 -0800
+Subject: selftests: net: add missing config for NF_TARGET_TTL
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+[ Upstream commit 1939f738c73dfdb8389839bdc9624c765e3326e6 ]
+
+amt test uses the TTL iptables module:
+
+  ip netns exec "${RELAY}" iptables -t mangle -I PREROUTING \
+       -d 239.0.0.1 -j TTL --ttl-set 2
+
+Fixes: c08e8baea78e ("selftests: add amt interface selftest script")
+Link: https://lore.kernel.org/r/20240131165605.4051645-1-kuba@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index 98c6bd2228c6..24a7c7bcbbc1 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -33,6 +33,7 @@ CONFIG_IP6_NF_NAT=m
+ CONFIG_IP6_NF_RAW=m
+ CONFIG_IP_NF_NAT=m
+ CONFIG_IP_NF_RAW=m
++CONFIG_IP_NF_TARGET_TTL=m
+ CONFIG_IPV6_GRE=m
+ CONFIG_IPV6_SEG6_LWTUNNEL=y
+ CONFIG_L2TP_ETH=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-config-for-nftables-backed.patch b/queue-6.6/selftests-net-add-missing-config-for-nftables-backed.patch
new file mode 100644 (file)
index 0000000..0ed0e35
--- /dev/null
@@ -0,0 +1,46 @@
+From 5c71820826ea0202a410c3384e378bb0f7deddfe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 26 Jan 2024 12:13:08 -0800
+Subject: selftests: net: add missing config for nftables-backed iptables
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+[ Upstream commit 59c93583491ab15db109f9902524d241c4fa4c0b ]
+
+Modern OSes use iptables implementation with nf_tables as a backend,
+e.g.:
+
+$ iptables -V
+iptables v1.8.8 (nf_tables)
+
+Pablo points out that we need CONFIG_NFT_COMPAT to make that work,
+otherwise we see a lot of:
+
+  Warning: Extension DNAT revision 0 not supported, missing kernel module?
+
+with DNAT being just an example here, other modules we need
+include udp, TTL, length etc.
+
+Link: https://lore.kernel.org/r/20240126201308.2903602-1-kuba@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: f7c25d8e17dd ("selftests: net: add missing config for pmtu.sh tests")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index dad385f73612..77a173635a29 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -62,6 +62,7 @@ CONFIG_NET_SCH_HTB=m
+ CONFIG_NET_SCH_FQ=m
+ CONFIG_NET_SCH_ETF=m
+ CONFIG_NET_SCH_NETEM=y
++CONFIG_NFT_COMPAT=m
+ CONFIG_NF_FLOW_TABLE=m
+ CONFIG_PSAMPLE=m
+ CONFIG_TCP_MD5SIG=y
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-config-for-pmtu.sh-tests.patch b/queue-6.6/selftests-net-add-missing-config-for-pmtu.sh-tests.patch
new file mode 100644 (file)
index 0000000..04c5bb8
--- /dev/null
@@ -0,0 +1,62 @@
+From 9b6fdd44034ae6030d18a143ee9bed1c61e1c1e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jan 2024 18:47:16 +0100
+Subject: selftests: net: add missing config for pmtu.sh tests
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit f7c25d8e17dd759d97ca093faf92eeb7da7b3890 ]
+
+The mentioned test uses a few Kconfig still missing the
+net config, add them.
+
+Before:
+  # Error: Specified qdisc kind is unknown.
+  # Error: Specified qdisc kind is unknown.
+  # Error: Qdisc not classful.
+  # We have an error talking to the kernel
+  # Error: Qdisc not classful.
+  # We have an error talking to the kernel
+  #   policy_routing not supported
+  # TEST: ICMPv4 with DSCP and ECN: PMTU exceptions                     [SKIP]
+
+After:
+  # TEST: ICMPv4 with DSCP and ECN: PMTU exceptions                     [ OK ]
+
+Fixes: ec730c3e1f0e ("selftest: net: Test IPv4 PMTU exceptions with DSCP and ECN")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Guillaume Nault <gnault@redhat.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Link: https://lore.kernel.org/r/8d27bf6762a5c7b3acc457d6e6872c533040f9c1.1706635101.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index 77a173635a29..98c6bd2228c6 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -49,8 +49,10 @@ CONFIG_NF_TABLES_IPV6=y
+ CONFIG_NF_TABLES_IPV4=y
+ CONFIG_NFT_NAT=m
+ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
++CONFIG_NET_ACT_CSUM=m
+ CONFIG_NET_ACT_CT=m
+ CONFIG_NET_ACT_GACT=m
++CONFIG_NET_ACT_PEDIT=m
+ CONFIG_NET_CLS_BASIC=m
+ CONFIG_NET_CLS_BPF=m
+ CONFIG_NET_CLS_MATCHALL=m
+@@ -62,6 +64,7 @@ CONFIG_NET_SCH_HTB=m
+ CONFIG_NET_SCH_FQ=m
+ CONFIG_NET_SCH_ETF=m
+ CONFIG_NET_SCH_NETEM=y
++CONFIG_NET_SCH_PRIO=m
+ CONFIG_NFT_COMPAT=m
+ CONFIG_NF_FLOW_TABLE=m
+ CONFIG_PSAMPLE=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-matchall-classifier.patch b/queue-6.6/selftests-net-add-missing-matchall-classifier.patch
new file mode 100644 (file)
index 0000000..6381370
--- /dev/null
@@ -0,0 +1,59 @@
+From 96f394e48a20a38e7a083c943d4f853ef90c2fd2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jan 2024 14:37:03 +0200
+Subject: selftests: net: Add missing matchall classifier
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit b40f873a7c80dbafbb6f4a7a569f2dcaf969d283 ]
+
+One of the test cases in the test_bridge_backup_port.sh selftest relies
+on a matchall classifier to drop unrelated traffic so that the Tx drop
+counter on the VXLAN device will only be incremented as a result of
+traffic generated by the test.
+
+However, the configuration option for the matchall classifier is
+missing from the configuration file which might explain the failures we
+see in the netdev CI [1].
+
+Fix by adding CONFIG_NET_CLS_MATCHALL to the configuration file.
+
+[1]
+ # Backup nexthop ID - invalid IDs
+ # -------------------------------
+ [...]
+ # TEST: Forwarding out of vx0                                         [ OK ]
+ # TEST: No forwarding using backup nexthop ID                         [ OK ]
+ # TEST: Tx drop increased                                             [FAIL]
+ # TEST: IPv6 address family nexthop as backup nexthop                 [ OK ]
+ # TEST: No forwarding out of swp1                                     [ OK ]
+ # TEST: Forwarding out of vx0                                         [ OK ]
+ # TEST: No forwarding using backup nexthop ID                         [ OK ]
+ # TEST: Tx drop increased                                             [FAIL]
+ [...]
+
+Fixes: b408453053fb ("selftests: net: Add bridge backup port and backup nexthop ID test")
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
+Link: https://lore.kernel.org/r/20240129123703.1857843-1-idosch@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index 56da5d52674c..b4e811f17eb1 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -52,6 +52,7 @@ CONFIG_NET_ACT_CT=m
+ CONFIG_NET_ACT_GACT=m
+ CONFIG_NET_CLS_BASIC=m
+ CONFIG_NET_CLS_BPF=m
++CONFIG_NET_CLS_MATCHALL=m
+ CONFIG_NET_CLS_U32=m
+ CONFIG_NET_IPGRE_DEMUX=m
+ CONFIG_NET_IPGRE=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-add-missing-required-classifier.patch b/queue-6.6/selftests-net-add-missing-required-classifier.patch
new file mode 100644 (file)
index 0000000..2a5fc63
--- /dev/null
@@ -0,0 +1,53 @@
+From b0043bd1c537c735a1e6e3cf694508a3a02562c7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Jan 2024 09:22:50 +0100
+Subject: selftests: net: add missing required classifier
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit d3cb3b0088ca92082e2bebc40cc6894a632173e2 ]
+
+the udpgro_fraglist self-test uses the BPF classifiers, but the
+current net self-test configuration does not include it, causing
+CI failures:
+
+ # selftests: net: udpgro_frglist.sh
+ # ipv6
+ # tcp - over veth touching data
+ # -l 4 -6 -D 2001:db8::1 -t rx -4 -t
+ # Error: TC classifier not found.
+ # We have an error talking to the kernel
+ # Error: TC classifier not found.
+ # We have an error talking to the kernel
+
+Add the missing knob.
+
+Fixes: edae34a3ed92 ("selftests net: add UDP GRO fraglist + bpf self-tests")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Maciej Żenczykowski <maze@google.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Link: https://lore.kernel.org/r/7c3643763b331e9a400e1874fe089193c99a1c3f.1706170897.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index 413ab9abcf1b..56da5d52674c 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -51,6 +51,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+ CONFIG_NET_ACT_CT=m
+ CONFIG_NET_ACT_GACT=m
+ CONFIG_NET_CLS_BASIC=m
++CONFIG_NET_CLS_BPF=m
+ CONFIG_NET_CLS_U32=m
+ CONFIG_NET_IPGRE_DEMUX=m
+ CONFIG_NET_IPGRE=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-don-t-access-dev-stdout-in-pmtu.sh.patch b/queue-6.6/selftests-net-don-t-access-dev-stdout-in-pmtu.sh.patch
new file mode 100644 (file)
index 0000000..bdd2c5b
--- /dev/null
@@ -0,0 +1,44 @@
+From fc7fa91148d86ce0991d3c4ad0d665417a555c6d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jan 2024 18:47:18 +0100
+Subject: selftests: net: don't access /dev/stdout in pmtu.sh
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit bc0970d5ac1d1317e212bdf55533935ecb6ae95c ]
+
+When running the pmtu.sh via the kselftest infra, accessing
+/dev/stdout gives unexpected results:
+  # dd: failed to open '/dev/stdout': Device or resource busy
+  # TEST: IPv4, bridged vxlan4: PMTU exceptions                         [FAIL]
+
+Let dd use directly the standard output to fix the above:
+  # TEST: IPv4, bridged vxlan4: PMTU exceptions - nexthop objects       [ OK ]
+
+Fixes: 136a1b434bbb ("selftests: net: test vxlan pmtu exceptions with tcp")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Guillaume Nault <gnault@redhat.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Link: https://lore.kernel.org/r/23d7592c5d77d75cff9b34f15c227f92e911c2ae.1706635101.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/pmtu.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/net/pmtu.sh b/tools/testing/selftests/net/pmtu.sh
+index 1f1e9a49f59a..4a5f031be232 100755
+--- a/tools/testing/selftests/net/pmtu.sh
++++ b/tools/testing/selftests/net/pmtu.sh
+@@ -1348,7 +1348,7 @@ test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception() {
+               sleep 1
+-              dd if=/dev/zero of=/dev/stdout status=none bs=1M count=1 | ${target} socat -T 3 -u STDIN $TCPDST,connect-timeout=3
++              dd if=/dev/zero status=none bs=1M count=1 | ${target} socat -T 3 -u STDIN $TCPDST,connect-timeout=3
+               size=$(du -sb $tmpoutfile)
+               size=${size%%/tmp/*}
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-enable-some-more-knobs.patch b/queue-6.6/selftests-net-enable-some-more-knobs.patch
new file mode 100644 (file)
index 0000000..a705079
--- /dev/null
@@ -0,0 +1,43 @@
+From 45c60d2c92ab52f7d8a17d0c88bf9bf0e0ccc81d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 Jan 2024 18:52:29 +0100
+Subject: selftests: net: enable some more knobs
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit c15a729c9d45aa142fb01a3afee822ab1f0e62a8 ]
+
+The rtnetlink tests require additional options currently
+off by default.
+
+Fixes: 2766a11161cc ("selftests: rtnetlink: add ipsec offload API test")
+Fixes: 5e596ee171ba ("selftests: add xfrm state-policy-monitor to rtnetlink.sh")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Link: https://lore.kernel.org/r/9048ca58e49b962f35dba1dfb2beaf3dab3e0411.1706723341.git.pabeni@redhat.com/
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/config | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
+index 24a7c7bcbbc1..3b749addd364 100644
+--- a/tools/testing/selftests/net/config
++++ b/tools/testing/selftests/net/config
+@@ -22,6 +22,8 @@ CONFIG_VLAN_8021Q=y
+ CONFIG_GENEVE=m
+ CONFIG_IFB=y
+ CONFIG_INET_DIAG=y
++CONFIG_INET_ESP=y
++CONFIG_INET_ESP_OFFLOAD=y
+ CONFIG_IP_GRE=m
+ CONFIG_NETFILTER=y
+ CONFIG_NETFILTER_ADVANCED=y
+@@ -93,3 +95,4 @@ CONFIG_IP_SCTP=m
+ CONFIG_NETFILTER_XT_MATCH_POLICY=m
+ CONFIG_CRYPTO_ARIA=y
+ CONFIG_XFRM_INTERFACE=m
++CONFIG_XFRM_USER=m
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-explicitly-wait-for-listener-ready.patch b/queue-6.6/selftests-net-explicitly-wait-for-listener-ready.patch
new file mode 100644 (file)
index 0000000..3fc4df5
--- /dev/null
@@ -0,0 +1,61 @@
+From f3359e0b2dcaca6f11a6c355ba2e1380030d8ac0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 22:33:22 +0100
+Subject: selftests: net: explicitly wait for listener ready
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit 4acffb66630a0e4800880baa61a54ef18047ccd3 ]
+
+The UDP GRO forwarding test still hard-code an arbitrary pause
+to wait for the UDP listener becoming ready in background.
+
+That causes sporadic failures depending on the host load.
+
+Replace the sleep with the existing helper waiting for the desired
+port being exposed.
+
+Fixes: a062260a9d5f ("selftests: net: add UDP GRO forwarding self-tests")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Willem de Bruijn <willemb@google.com>
+Link: https://lore.kernel.org/r/4d58900fb09cef42749cfcf2ad7f4b91a97d225c.1706131762.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/udpgro_fwd.sh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/tools/testing/selftests/net/udpgro_fwd.sh b/tools/testing/selftests/net/udpgro_fwd.sh
+index 5fa8659ab13d..d6b9c759043c 100755
+--- a/tools/testing/selftests/net/udpgro_fwd.sh
++++ b/tools/testing/selftests/net/udpgro_fwd.sh
+@@ -1,6 +1,8 @@
+ #!/bin/bash
+ # SPDX-License-Identifier: GPL-2.0
++source net_helper.sh
++
+ BPF_FILE="xdp_dummy.o"
+ readonly BASE="ns-$(mktemp -u XXXXXX)"
+ readonly SRC=2
+@@ -119,7 +121,7 @@ run_test() {
+       ip netns exec $NS_DST $ipt -A INPUT -p udp --dport 8000
+       ip netns exec $NS_DST ./udpgso_bench_rx -C 1000 -R 10 -n 10 -l 1300 $rx_args &
+       local spid=$!
+-      sleep 0.1
++      wait_local_port_listen "$NS_DST" 8000 udp
+       ip netns exec $NS_SRC ./udpgso_bench_tx $family -M 1 -s 13000 -S 1300 -D $dst
+       local retc=$?
+       wait $spid
+@@ -168,7 +170,7 @@ run_bench() {
+       ip netns exec $NS_DST bash -c "echo 2 > /sys/class/net/veth$DST/queues/rx-0/rps_cpus"
+       ip netns exec $NS_DST taskset 0x2 ./udpgso_bench_rx -C 1000 -R 10  &
+       local spid=$!
+-      sleep 0.1
++      wait_local_port_listen "$NS_DST" 8000 udp
+       ip netns exec $NS_SRC taskset 0x1 ./udpgso_bench_tx $family -l 3 -S 1300 -D $dst
+       local retc=$?
+       wait $spid
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-fix-available-tunnels-detection.patch b/queue-6.6/selftests-net-fix-available-tunnels-detection.patch
new file mode 100644 (file)
index 0000000..e067cbf
--- /dev/null
@@ -0,0 +1,77 @@
+From a971977417563ef633a7d86f2c2a6a439b2ad4c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jan 2024 18:47:17 +0100
+Subject: selftests: net: fix available tunnels detection
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit e4e4b6d568d2549583cbda3f8ce567e586cb05da ]
+
+The pmtu.sh test tries to detect the tunnel protocols available
+in the running kernel and properly skip the unsupported cases.
+
+In a few more complex setup, such detection is unsuccessful, as
+the script currently ignores some intermediate error code at
+setup time.
+
+Before:
+  # which: no nettest in (/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin)
+  # TEST: vti6: PMTU exceptions (ESP-in-UDP)                            [FAIL]
+  #   PMTU exception wasn't created after creating tunnel exceeding link layer MTU
+  # ./pmtu.sh: line 931: kill: (7543) - No such process
+  # ./pmtu.sh: line 931: kill: (7544) - No such process
+
+After:
+  #   xfrm4 not supported
+  # TEST: vti4: PMTU exceptions                                         [SKIP]
+
+Fixes: ece1278a9b81 ("selftests: net: add ESP-in-UDP PMTU test")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Guillaume Nault <gnault@redhat.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Link: https://lore.kernel.org/r/cab10e75fda618e6fff8c595b632f47db58b9309.1706635101.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/pmtu.sh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/tools/testing/selftests/net/pmtu.sh b/tools/testing/selftests/net/pmtu.sh
+index b3b2dc5a630c..1f1e9a49f59a 100755
+--- a/tools/testing/selftests/net/pmtu.sh
++++ b/tools/testing/selftests/net/pmtu.sh
+@@ -714,23 +714,23 @@ setup_xfrm6() {
+ }
+ setup_xfrm4udp() {
+-      setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0"
+-      setup_nettest_xfrm 4 4500
++      setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \
++              setup_nettest_xfrm 4 4500
+ }
+ setup_xfrm6udp() {
+-      setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0"
+-      setup_nettest_xfrm 6 4500
++      setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \
++              setup_nettest_xfrm 6 4500
+ }
+ setup_xfrm4udprouted() {
+-      setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0"
+-      setup_nettest_xfrm 4 4500
++      setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" && \
++              setup_nettest_xfrm 4 4500
+ }
+ setup_xfrm6udprouted() {
+-      setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0"
+-      setup_nettest_xfrm 6 4500
++      setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" && \
++              setup_nettest_xfrm 6 4500
+ }
+ setup_routing_old() {
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-give-more-time-for-gro-aggregation.patch b/queue-6.6/selftests-net-give-more-time-for-gro-aggregation.patch
new file mode 100644 (file)
index 0000000..fef2c14
--- /dev/null
@@ -0,0 +1,48 @@
+From 2545403b5379e99d3edb5b7f8d91cbc06264d30d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Jan 2024 19:09:06 +0100
+Subject: selftests: net: give more time for GRO aggregation
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit 89abe628375301fedb68770644df845d49018d8b ]
+
+The gro.sh test-case relay on the gro_flush_timeout to ensure
+that all the segments belonging to any given batch are properly
+aggregated.
+
+The other end, the sender is a user-space program transmitting
+each packet with a separate write syscall. A busy host and/or
+stracing the sender program can make the relevant segments reach
+the GRO engine after the flush timeout triggers.
+
+Give the GRO flush timeout more slack, to avoid sporadic self-tests
+failures.
+
+Fixes: 9af771d2ec04 ("selftests/net: allow GRO coalesce test on veth")
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Tested-by: Eric Dumazet <edumazet@google.com>
+Link: https://lore.kernel.org/r/bffec2beab3a5672dd13ecabe4fad81d2155b367.1706206101.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/setup_veth.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/net/setup_veth.sh b/tools/testing/selftests/net/setup_veth.sh
+index 1003ddf7b3b2..227fd1076f21 100644
+--- a/tools/testing/selftests/net/setup_veth.sh
++++ b/tools/testing/selftests/net/setup_veth.sh
+@@ -8,7 +8,7 @@ setup_veth_ns() {
+       local -r ns_mac="$4"
+       [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}"
+-      echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout"
++      echo 1000000 > "/sys/class/net/${ns_dev}/gro_flush_timeout"
+       ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535
+       ip -netns "${ns_name}" link set dev "${ns_dev}" up
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-remove-dependency-on-ebpf-tests.patch b/queue-6.6/selftests-net-remove-dependency-on-ebpf-tests.patch
new file mode 100644 (file)
index 0000000..343dc1f
--- /dev/null
@@ -0,0 +1,192 @@
+From cfc5384849467a98813caef79c0c7aa78f6965f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 24 Jan 2024 22:33:20 +0100
+Subject: selftests: net: remove dependency on ebpf tests
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+[ Upstream commit 98cb12eb52a780e682bea8372fdb2912c08132dd ]
+
+Several net tests requires an XDP program build under the ebpf
+directory, and error out if such program is not available.
+
+That makes running successful net test hard, let's duplicate into the
+net dir the [very small] program, re-using the existing rules to build
+it, and finally dropping the bogus dependency.
+
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Willem de Bruijn <willemb@google.com>
+Link: https://lore.kernel.org/r/28e7af7c031557f691dc8045ee41dd549dd5e74c.1706131762.git.pabeni@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: 4acffb66630a ("selftests: net: explicitly wait for listener ready")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/Makefile          |  5 +++--
+ tools/testing/selftests/net/udpgro.sh         |  4 ++--
+ tools/testing/selftests/net/udpgro_bench.sh   |  4 ++--
+ tools/testing/selftests/net/udpgro_frglist.sh |  6 +++---
+ tools/testing/selftests/net/udpgro_fwd.sh     |  2 +-
+ tools/testing/selftests/net/veth.sh           |  4 ++--
+ tools/testing/selftests/net/xdp_dummy.c       | 13 +++++++++++++
+ 7 files changed, 26 insertions(+), 12 deletions(-)
+ create mode 100644 tools/testing/selftests/net/xdp_dummy.c
+
+diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
+index 4a2881d43989..de4506e2a412 100644
+--- a/tools/testing/selftests/net/Makefile
++++ b/tools/testing/selftests/net/Makefile
+@@ -84,6 +84,7 @@ TEST_PROGS += sctp_vrf.sh
+ TEST_GEN_FILES += sctp_hello
+ TEST_GEN_FILES += csum
+ TEST_GEN_FILES += nat6to4.o
++TEST_GEN_FILES += xdp_dummy.o
+ TEST_GEN_FILES += ip_local_port_range
+ TEST_GEN_FILES += bind_wildcard
+ TEST_PROGS += test_vxlan_mdb.sh
+@@ -100,7 +101,7 @@ $(OUTPUT)/tcp_mmap: LDLIBS += -lpthread -lcrypto
+ $(OUTPUT)/tcp_inq: LDLIBS += -lpthread
+ $(OUTPUT)/bind_bhash: LDLIBS += -lpthread
+-# Rules to generate bpf obj nat6to4.o
++# Rules to generate bpf objs
+ CLANG ?= clang
+ SCRATCH_DIR := $(OUTPUT)/tools
+ BUILD_DIR := $(SCRATCH_DIR)/build
+@@ -135,7 +136,7 @@ endif
+ CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
+-$(OUTPUT)/nat6to4.o: nat6to4.c $(BPFOBJ) | $(MAKE_DIRS)
++$(OUTPUT)/nat6to4.o $(OUTPUT)/xdp_dummy.o: $(OUTPUT)/%.o : %.c $(BPFOBJ) | $(MAKE_DIRS)
+       $(CLANG) -O2 --target=bpf -c $< $(CCINCLUDE) $(CLANG_SYS_INCLUDES) -o $@
+ $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)                   \
+diff --git a/tools/testing/selftests/net/udpgro.sh b/tools/testing/selftests/net/udpgro.sh
+index 0c743752669a..3f09ac78f445 100755
+--- a/tools/testing/selftests/net/udpgro.sh
++++ b/tools/testing/selftests/net/udpgro.sh
+@@ -5,7 +5,7 @@
+ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
+-BPF_FILE="../bpf/xdp_dummy.bpf.o"
++BPF_FILE="xdp_dummy.o"
+ # set global exit status, but never reset nonzero one.
+ check_err()
+@@ -198,7 +198,7 @@ run_all() {
+ }
+ if [ ! -f ${BPF_FILE} ]; then
+-      echo "Missing ${BPF_FILE}. Build bpf selftest first"
++      echo "Missing ${BPF_FILE}. Run 'make' first"
+       exit -1
+ fi
+diff --git a/tools/testing/selftests/net/udpgro_bench.sh b/tools/testing/selftests/net/udpgro_bench.sh
+index 894972877e8b..65ff1d424008 100755
+--- a/tools/testing/selftests/net/udpgro_bench.sh
++++ b/tools/testing/selftests/net/udpgro_bench.sh
+@@ -5,7 +5,7 @@
+ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
+-BPF_FILE="../bpf/xdp_dummy.bpf.o"
++BPF_FILE="xdp_dummy.o"
+ cleanup() {
+       local -r jobs="$(jobs -p)"
+@@ -83,7 +83,7 @@ run_all() {
+ }
+ if [ ! -f ${BPF_FILE} ]; then
+-      echo "Missing ${BPF_FILE}. Build bpf selftest first"
++      echo "Missing ${BPF_FILE}. Run 'make' first"
+       exit -1
+ fi
+diff --git a/tools/testing/selftests/net/udpgro_frglist.sh b/tools/testing/selftests/net/udpgro_frglist.sh
+index 0a6359bed0b9..bd51d386b52e 100755
+--- a/tools/testing/selftests/net/udpgro_frglist.sh
++++ b/tools/testing/selftests/net/udpgro_frglist.sh
+@@ -5,7 +5,7 @@
+ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
+-BPF_FILE="../bpf/xdp_dummy.bpf.o"
++BPF_FILE="xdp_dummy.o"
+ cleanup() {
+       local -r jobs="$(jobs -p)"
+@@ -84,12 +84,12 @@ run_all() {
+ }
+ if [ ! -f ${BPF_FILE} ]; then
+-      echo "Missing ${BPF_FILE}. Build bpf selftest first"
++      echo "Missing ${BPF_FILE}. Run 'make' first"
+       exit -1
+ fi
+ if [ ! -f nat6to4.o ]; then
+-      echo "Missing nat6to4 helper. Build bpf nat6to4.o selftest first"
++      echo "Missing nat6to4 helper. Run 'make' first"
+       exit -1
+ fi
+diff --git a/tools/testing/selftests/net/udpgro_fwd.sh b/tools/testing/selftests/net/udpgro_fwd.sh
+index c079565add39..5fa8659ab13d 100755
+--- a/tools/testing/selftests/net/udpgro_fwd.sh
++++ b/tools/testing/selftests/net/udpgro_fwd.sh
+@@ -1,7 +1,7 @@
+ #!/bin/bash
+ # SPDX-License-Identifier: GPL-2.0
+-BPF_FILE="../bpf/xdp_dummy.bpf.o"
++BPF_FILE="xdp_dummy.o"
+ readonly BASE="ns-$(mktemp -u XXXXXX)"
+ readonly SRC=2
+ readonly DST=1
+diff --git a/tools/testing/selftests/net/veth.sh b/tools/testing/selftests/net/veth.sh
+index 2d073595c620..27574bbf2d63 100755
+--- a/tools/testing/selftests/net/veth.sh
++++ b/tools/testing/selftests/net/veth.sh
+@@ -1,7 +1,7 @@
+ #!/bin/sh
+ # SPDX-License-Identifier: GPL-2.0
+-BPF_FILE="../bpf/xdp_dummy.bpf.o"
++BPF_FILE="xdp_dummy.o"
+ readonly STATS="$(mktemp -p /tmp ns-XXXXXX)"
+ readonly BASE=`basename $STATS`
+ readonly SRC=2
+@@ -218,7 +218,7 @@ while getopts "hs:" option; do
+ done
+ if [ ! -f ${BPF_FILE} ]; then
+-      echo "Missing ${BPF_FILE}. Build bpf selftest first"
++      echo "Missing ${BPF_FILE}. Run 'make' first"
+       exit 1
+ fi
+diff --git a/tools/testing/selftests/net/xdp_dummy.c b/tools/testing/selftests/net/xdp_dummy.c
+new file mode 100644
+index 000000000000..d988b2e0cee8
+--- /dev/null
++++ b/tools/testing/selftests/net/xdp_dummy.c
+@@ -0,0 +1,13 @@
++// SPDX-License-Identifier: GPL-2.0
++
++#define KBUILD_MODNAME "xdp_dummy"
++#include <linux/bpf.h>
++#include <bpf/bpf_helpers.h>
++
++SEC("xdp")
++int xdp_dummy_prog(struct xdp_md *ctx)
++{
++      return XDP_PASS;
++}
++
++char _license[] SEC("license") = "GPL";
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-team-add-missing-config-options.patch b/queue-6.6/selftests-team-add-missing-config-options.patch
new file mode 100644 (file)
index 0000000..b270909
--- /dev/null
@@ -0,0 +1,40 @@
+From 250642fc886b522c369f7b3965a240dfed13ddb3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 Jan 2024 09:08:44 -0500
+Subject: selftests: team: Add missing config options
+
+From: Benjamin Poirier <bpoirier@nvidia.com>
+
+[ Upstream commit 7b6fb3050d8f5e2b6858eef344e47ac1f5442827 ]
+
+Similar to commit dd2d40acdbb2 ("selftests: bonding: Add more missing
+config options"), add more networking-specific config options which are
+needed for team device tests.
+
+For testing, I used the minimal config generated by virtme-ng and I added
+the options in the config file. Afterwards, the team device test passed.
+
+Fixes: bbb774d921e2 ("net: Add tests for bonding and team address list management")
+Reviewed-by: Petr Machata <petrm@nvidia.com>
+Signed-off-by: Benjamin Poirier <bpoirier@nvidia.com>
+Link: https://lore.kernel.org/r/20240131140848.360618-2-bpoirier@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/drivers/net/team/config | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/drivers/net/team/config b/tools/testing/selftests/drivers/net/team/config
+index 265b6882cc21..b5e3a3aad4bf 100644
+--- a/tools/testing/selftests/drivers/net/team/config
++++ b/tools/testing/selftests/drivers/net/team/config
+@@ -1,3 +1,5 @@
++CONFIG_DUMMY=y
++CONFIG_IPV6=y
++CONFIG_MACVLAN=y
+ CONFIG_NET_TEAM=y
+ CONFIG_NET_TEAM_MODE_LOADBALANCE=y
+-CONFIG_MACVLAN=y
+-- 
+2.43.0
+
index cc2e663a671096a00874c023f7e13f90b90a3e83..f778eb5217c69034350a4ba950d793d76141e395 100644 (file)
@@ -267,3 +267,55 @@ wifi-cfg80211-fix-rcu-dereference-in-__cfg80211_bss_.patch
 drm-using-mul_u32_u32-requires-linux-math64.h.patch
 drm-amdkfd-only-flush-mes-process-context-if-mes-sup.patch
 riscv-fix-build-error-on-rv32-xip.patch
+scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch
+kunit-run-test-suites-only-after-module-initializati.patch
+regulator-ti-abb-don-t-use-devm_platform_ioremap_res.patch
+scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch
+hid-hidraw-fix-a-problem-of-memory-leak-in-hidraw_re.patch
+selftests-net-remove-dependency-on-ebpf-tests.patch
+selftests-net-explicitly-wait-for-listener-ready.patch
+gve-fix-skb-truesize-underestimation.patch
+net-ethernet-mtk_eth_soc-set-dma-coherent-mask-to-ge.patch
+net-phy-mediatek-ge-soc-sync-driver-with-mediatek-sd.patch
+selftests-net-add-missing-config-for-big-tcp-tests.patch
+selftests-net-add-missing-required-classifier.patch
+selftests-net-give-more-time-for-gro-aggregation.patch
+ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch
+net-dsa-mt7530-fix-10m-100m-speed-on-mt7988-switch.patch
+ipmr-fix-kernel-panic-when-forwarding-mcast-packets.patch
+net-lan966x-fix-port-configuration-when-using-sgmii-.patch
+tcp-add-sanity-checks-to-rx-zerocopy.patch
+e1000e-correct-maximum-frequency-adjustment-values.patch
+ixgbe-refactor-returning-internal-error-codes.patch
+ixgbe-refactor-overtemp-event-handling.patch
+ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch
+net-dsa-qca8k-fix-illegal-usage-of-gpio.patch
+ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch
+llc-call-sock_orphan-at-release-time.patch
+selftests-net-add-missing-matchall-classifier.patch
+bridge-mcast-fix-disabled-snooping-after-long-uptime.patch
+devlink-fix-referring-to-hw_addr-attribute-during-st.patch
+selftests-net-add-missing-config-for-geneve.patch
+netfilter-conntrack-correct-window-scaling-with-retr.patch
+netfilter-nf_tables-restrict-tunnel-object-to-nfprot.patch
+netfilter-ipset-fix-performance-regression-in-swap-o.patch
+netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch
+netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch
+net-ipv4-fix-a-memleak-in-ip_setup_cork.patch
+af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch
+pds_core-cancel-aq-work-on-teardown.patch
+pds_core-use-struct-pdsc-for-the-pdsc_adminq_isr-pri.patch
+pds_core-implement-pci-reset-handlers.patch
+pds_core-prevent-race-issues-involving-the-adminq.patch
+pds_core-clear-bars-on-reset.patch
+pds_core-rework-teardown-setup-flow-to-be-more-commo.patch
+selftests-net-add-missing-config-for-nftables-backed.patch
+selftests-net-add-missing-config-for-pmtu.sh-tests.patch
+selftests-net-fix-available-tunnels-detection.patch
+selftests-net-don-t-access-dev-stdout-in-pmtu.sh.patch
+octeontx2-pf-remove-xdp-queues-on-program-detach.patch
+net-sysfs-fix-sys-class-net-iface-path.patch
+selftests-team-add-missing-config-options.patch
+selftests-bonding-check-initial-state.patch
+selftests-net-add-missing-config-for-nf_target_ttl.patch
+selftests-net-enable-some-more-knobs.patch
diff --git a/queue-6.6/tcp-add-sanity-checks-to-rx-zerocopy.patch b/queue-6.6/tcp-add-sanity-checks-to-rx-zerocopy.patch
new file mode 100644 (file)
index 0000000..6da7c32
--- /dev/null
@@ -0,0 +1,78 @@
+From 59563124589dec9cf592d0d59e846232fa48b1b3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Jan 2024 10:33:17 +0000
+Subject: tcp: add sanity checks to rx zerocopy
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 577e4432f3ac810049cb7e6b71f4d96ec7c6e894 ]
+
+TCP rx zerocopy intent is to map pages initially allocated
+from NIC drivers, not pages owned by a fs.
+
+This patch adds to can_map_frag() these additional checks:
+
+- Page must not be a compound one.
+- page->mapping must be NULL.
+
+This fixes the panic reported by ZhangPeng.
+
+syzbot was able to loopback packets built with sendfile(),
+mapping pages owned by an ext4 file to TCP rx zerocopy.
+
+r3 = socket$inet_tcp(0x2, 0x1, 0x0)
+mmap(&(0x7f0000ff9000/0x4000)=nil, 0x4000, 0x0, 0x12, r3, 0x0)
+r4 = socket$inet_tcp(0x2, 0x1, 0x0)
+bind$inet(r4, &(0x7f0000000000)={0x2, 0x4e24, @multicast1}, 0x10)
+connect$inet(r4, &(0x7f00000006c0)={0x2, 0x4e24, @empty}, 0x10)
+r5 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
+    0x181e42, 0x0)
+fallocate(r5, 0x0, 0x0, 0x85b8)
+sendfile(r4, r5, 0x0, 0x8ba0)
+getsockopt$inet_tcp_TCP_ZEROCOPY_RECEIVE(r4, 0x6, 0x23,
+    &(0x7f00000001c0)={&(0x7f0000ffb000/0x3000)=nil, 0x3000, 0x0, 0x0, 0x0,
+    0x0, 0x0, 0x0, 0x0}, &(0x7f0000000440)=0x40)
+r6 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
+    0x181e42, 0x0)
+
+Fixes: 93ab6cc69162 ("tcp: implement mmap() for zero copy receive")
+Link: https://lore.kernel.org/netdev/5106a58e-04da-372a-b836-9d3d0bd2507b@huawei.com/T/
+Reported-and-bisected-by: ZhangPeng <zhangpeng362@huawei.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Cc: Arjun Roy <arjunroy@google.com>
+Cc: Matthew Wilcox <willy@infradead.org>
+Cc: linux-mm@vger.kernel.org
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: linux-fsdevel@vger.kernel.org
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index fb417aee86e6..ab1308affa08 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -1786,7 +1786,17 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,
+ static bool can_map_frag(const skb_frag_t *frag)
+ {
+-      return skb_frag_size(frag) == PAGE_SIZE && !skb_frag_off(frag);
++      struct page *page;
++
++      if (skb_frag_size(frag) != PAGE_SIZE || skb_frag_off(frag))
++              return false;
++
++      page = skb_frag_page(frag);
++
++      if (PageCompound(page) || page->mapping)
++              return false;
++
++      return true;
+ }
+ static int find_next_mappable_frag(const skb_frag_t *frag,
+-- 
+2.43.0
+