]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.10
authorSasha Levin <sashal@kernel.org>
Fri, 2 Feb 2024 21:37:33 +0000 (16:37 -0500)
committerSasha Levin <sashal@kernel.org>
Fri, 2 Feb 2024 21:37:33 +0000 (16:37 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
19 files changed:
queue-5.10/af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch [new file with mode: 0644]
queue-5.10/ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch [new file with mode: 0644]
queue-5.10/ip6_tunnel-use-dev_sw_netstats_rx_add.patch [new file with mode: 0644]
queue-5.10/ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch [new file with mode: 0644]
queue-5.10/ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch [new file with mode: 0644]
queue-5.10/ixgbe-refactor-overtemp-event-handling.patch [new file with mode: 0644]
queue-5.10/ixgbe-refactor-returning-internal-error-codes.patch [new file with mode: 0644]
queue-5.10/ixgbe-remove-non-inclusive-language.patch [new file with mode: 0644]
queue-5.10/llc-call-sock_orphan-at-release-time.patch [new file with mode: 0644]
queue-5.10/net-ipv4-fix-a-memleak-in-ip_setup_cork.patch [new file with mode: 0644]
queue-5.10/net-sysfs-fix-sys-class-net-iface-path.patch [new file with mode: 0644]
queue-5.10/net-zerocopy-refactor-frag-is-remappable-test.patch [new file with mode: 0644]
queue-5.10/netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch [new file with mode: 0644]
queue-5.10/netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch [new file with mode: 0644]
queue-5.10/scsi-core-introduce-enum-scsi_disposition.patch [new file with mode: 0644]
queue-5.10/scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch [new file with mode: 0644]
queue-5.10/scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch [new file with mode: 0644]
queue-5.10/series
queue-5.10/tcp-add-sanity-checks-to-rx-zerocopy.patch [new file with mode: 0644]

diff --git a/queue-5.10/af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch b/queue-5.10/af_unix-fix-lockdep-positive-in-sk_diag_dump_icons.patch
new file mode 100644 (file)
index 0000000..8786216
--- /dev/null
@@ -0,0 +1,243 @@
+From c1166a0c5e0f80f8a4b3b1fe65b2a25c4be77368 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 f42fdddecd41..a6b6ce8b918b 100644
+--- a/include/net/af_unix.h
++++ b/include/net/af_unix.h
+@@ -47,12 +47,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 @@ static inline struct unix_sock *unix_sk(const struct sock *sk)
+       return (struct unix_sock *)sk;
+ }
++#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 237488b1b58b..b003d0597f4b 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -1126,13 +1126,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)
+@@ -1352,7 +1350,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 951b33fa8f5c..2975e7a061d0 100644
+--- a/net/unix/diag.c
++++ b/net/unix/diag.c
+@@ -83,7 +83,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-5.10/ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch b/queue-5.10/ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch
new file mode 100644 (file)
index 0000000..15c1ac1
--- /dev/null
@@ -0,0 +1,138 @@
+From 4036b9117a81cb31c9fb178037533e8f672c500f 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 9b8b209b780a..d1f819238414 100644
+--- a/net/ipv6/ip6_tunnel.c
++++ b/net/ipv6/ip6_tunnel.c
+@@ -829,8 +829,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)) ||
+@@ -862,14 +862,29 @@ 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 {
+               skb->dev = tunnel->dev;
+       }
++      /* 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-5.10/ip6_tunnel-use-dev_sw_netstats_rx_add.patch b/queue-5.10/ip6_tunnel-use-dev_sw_netstats_rx_add.patch
new file mode 100644 (file)
index 0000000..e4fbc0d
--- /dev/null
@@ -0,0 +1,47 @@
+From 42b2e7bce8a4b13f46a60cb4d8d1a787d3adfda2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Jun 2022 08:46:35 -0700
+Subject: ip6_tunnel: use dev_sw_netstats_rx_add()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit afd2051b18404640a116fd3bb2460da214ccbda4 ]
+
+We have a convenient helper, let's use it.
+
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: 8d975c15c0cd ("ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/ip6_tunnel.c | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
+index edf4a842506f..9b8b209b780a 100644
+--- a/net/ipv6/ip6_tunnel.c
++++ b/net/ipv6/ip6_tunnel.c
+@@ -829,7 +829,6 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
+                                               struct sk_buff *skb),
+                        bool log_ecn_err)
+ {
+-      struct pcpu_sw_netstats *tstats;
+       const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
+       int err;
+@@ -888,11 +887,7 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
+               }
+       }
+-      tstats = this_cpu_ptr(tunnel->dev->tstats);
+-      u64_stats_update_begin(&tstats->syncp);
+-      tstats->rx_packets++;
+-      tstats->rx_bytes += skb->len;
+-      u64_stats_update_end(&tstats->syncp);
++      dev_sw_netstats_rx_add(tunnel->dev, skb->len);
+       skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
+-- 
+2.43.0
+
diff --git a/queue-5.10/ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch b/queue-5.10/ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch
new file mode 100644 (file)
index 0000000..95b5747
--- /dev/null
@@ -0,0 +1,78 @@
+From 026f198239d13634bf1342b27f6d7600e48e39d0 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 c70c192bc91b..5e0e2b5ba34e 100644
+--- a/net/ipv6/addrconf_core.c
++++ b/net/ipv6/addrconf_core.c
+@@ -213,19 +213,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-5.10/ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch b/queue-5.10/ixgbe-fix-an-error-handling-path-in-ixgbe_read_iosf_.patch
new file mode 100644 (file)
index 0000000..f01d8eb
--- /dev/null
@@ -0,0 +1,44 @@
+From 85d692dcf8c945aff5aebfaede9af0d891c0bd15 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 73d1a8b85449..9347dc786b5b 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-5.10/ixgbe-refactor-overtemp-event-handling.patch b/queue-5.10/ixgbe-refactor-overtemp-event-handling.patch
new file mode 100644 (file)
index 0000000..02c2dfb
--- /dev/null
@@ -0,0 +1,293 @@
+From 8265301bbe9e726c473dc482e0c40050d6d661bc 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 3692e73f5339..b16cb2365d96 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -2766,7 +2766,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;
+@@ -2800,14 +2799,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:
+@@ -7844,7 +7842,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;
+@@ -7854,11 +7852,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 acc2596596b5..9d8b018b4f23 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+@@ -405,8 +405,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 */
+@@ -2617,22 +2616,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 66963e142024..e84dbf6a3cb8 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+@@ -3505,10 +3505,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 ec532f469535..73d1a8b85449 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;
+ }
+@@ -2319,18 +2321,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 */
+@@ -2362,7 +2364,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 */
+@@ -2376,7 +2379,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;
+               }
+       }
+@@ -2412,12 +2416,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 */
+@@ -2496,21 +2500,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;
+@@ -3138,21 +3141,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-5.10/ixgbe-refactor-returning-internal-error-codes.patch b/queue-5.10/ixgbe-refactor-returning-internal-error-codes.patch
new file mode 100644 (file)
index 0000000..b3be01c
--- /dev/null
@@ -0,0 +1,2368 @@
+From 8828768bca195ce6eedc6528fc48315c13ace865 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 95c92fe890a1..ed35e06537a0 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 8d3798a32f0e..46ed20005d67 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,13 +1554,13 @@ 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;
+               }
+       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) {
+@@ -1582,7 +1581,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) {
+@@ -1594,7 +1593,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 */
+@@ -1823,7 +1822,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;
+ }
+@@ -1862,13 +1861,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;
+@@ -1882,7 +1881,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;
+@@ -1890,7 +1889,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;
+@@ -1904,7 +1903,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;
+ }
+ /**
+@@ -2037,7 +2036,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;
+       }
+@@ -2086,7 +2085,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;
+               }
+       }
+@@ -2140,7 +2139,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 bf5134563ede..22595d22167d 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+@@ -123,7 +123,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;
+       }
+       /*
+@@ -214,7 +214,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) {
+@@ -499,7 +499,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);
+@@ -525,7 +525,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 */
+@@ -562,13 +562,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 */
+@@ -804,7 +804,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);
+@@ -825,7 +825,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);
+@@ -903,11 +903,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
+@@ -961,7 +958,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++) {
+@@ -1027,7 +1024,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);
+ }
+@@ -1049,11 +1046,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
+@@ -1098,7 +1092,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++) {
+@@ -1141,7 +1135,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);
+ }
+@@ -1164,11 +1158,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) |
+@@ -1261,11 +1252,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) |
+@@ -1327,7 +1315,7 @@ static s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg)
+               }
+               udelay(5);
+       }
+-      return IXGBE_ERR_EEPROM;
++      return -EIO;
+ }
+ /**
+@@ -1343,7 +1331,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));
+@@ -1365,7 +1353,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 */
+@@ -1418,7 +1406,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;
+               }
+       }
+@@ -1446,7 +1434,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;
+@@ -1502,7 +1490,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;
+@@ -1714,7 +1702,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 */
+@@ -1723,7 +1711,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)
+@@ -1732,7 +1720,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;
+               }
+@@ -1785,7 +1773,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)
+@@ -1844,7 +1832,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 */
+@@ -1896,7 +1884,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;
+       }
+       /*
+@@ -2145,7 +2133,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++) {
+@@ -2154,7 +2142,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;
+                       }
+               }
+       }
+@@ -2211,7 +2199,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. */
+@@ -2268,7 +2256,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)) {
+               /*
+@@ -2320,7 +2308,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);
+@@ -2352,12 +2340,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
+@@ -2406,8 +2394,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;
+       /*
+@@ -2509,7 +2497,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.
+  **/
+@@ -2574,7 +2562,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;
+ }
+ /**
+@@ -2599,7 +2587,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))) {
+@@ -2619,7 +2607,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;
+ }
+ /**
+@@ -2756,7 +2744,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;
+@@ -2802,7 +2790,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)
+@@ -2962,7 +2950,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));
+@@ -3013,7 +3001,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) {
+@@ -3090,7 +3078,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;
+@@ -3114,7 +3102,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;
+ }
+ /**
+@@ -3134,7 +3122,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
+@@ -3595,7 +3583,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.
+@@ -3608,7 +3597,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 */
+@@ -3619,13 +3608,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;
+@@ -3650,7 +3639,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;
+ }
+@@ -3670,7 +3659,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,
+@@ -3687,7 +3676,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);
+@@ -3717,7 +3706,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;
+       }
+@@ -3748,8 +3737,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,
+@@ -3785,7 +3774,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;
+       }
+@@ -3883,14 +3872,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;
+ }
+@@ -3913,7 +3902,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)
+@@ -3973,7 +3962,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 2eb133183473..93532f3a3fb9 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+@@ -3346,7 +3346,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 85c17391a6c5..3692e73f5339 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -5520,7 +5520,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);
+@@ -5946,13 +5946,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 "
+@@ -7735,10 +7735,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;
+@@ -7764,7 +7764,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;
+@@ -7773,8 +7773,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 "
+@@ -10796,9 +10796,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;
+@@ -11015,7 +11015,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 a148534d7256..def067b15873 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 b0413904b798..acc2596596b5 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++) {
+@@ -454,7 +454,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;
+@@ -496,7 +496,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
+@@ -523,7 +523,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
+@@ -555,7 +555,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;
+@@ -600,7 +600,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;
+       }
+       /*
+@@ -628,7 +628,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;
+@@ -653,7 +653,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;
+@@ -1299,7 +1299,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 */
+@@ -1356,12 +1356,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;
+               }
+       }
+@@ -1369,7 +1369,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;
+ }
+ /**
+@@ -1387,10 +1387,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;
+ }
+ /**
+@@ -1415,7 +1415,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 */
+@@ -1430,7 +1430,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,
+@@ -1621,7 +1621,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 */
+@@ -1645,7 +1645,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;
+@@ -1655,7 +1655,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;
+ }
+ /**
+@@ -1682,7 +1682,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 */
+@@ -1696,7 +1696,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;
+@@ -1764,7 +1764,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;
+               }
+       }
+@@ -1824,7 +1824,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;
+       }
+@@ -1835,7 +1835,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;
+ }
+ /**
+@@ -1855,14 +1855,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
+@@ -1883,11 +1883,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)++;
+@@ -1906,7 +1906,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;
+                       }
+@@ -1919,14 +1919,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;
+ }
+ /**
+@@ -2021,7 +2021,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);
+@@ -2137,7 +2137,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);
+@@ -2379,7 +2379,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);
+@@ -2451,7 +2451,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;
+@@ -2547,7 +2547,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 5eba086690ef..0cd8bec6ae5e 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+@@ -1279,7 +1279,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 039f7c73a3b5..66963e142024 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+@@ -3661,45 +3661,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 4b93ba149ec5..fb4ced963c88 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 37f2bc6de4b6..ec532f469535 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;
+       }
+       status = mac->ops.write_iosf_sb_reg(hw,
+@@ -1753,7 +1753,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)
+@@ -1803,7 +1803,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)
+@@ -1813,7 +1813,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,
+@@ -1912,7 +1912,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);
+@@ -2095,9 +2095,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.
+@@ -2115,7 +2115,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;
+       }
+@@ -2642,7 +2642,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))) {
+@@ -2685,7 +2685,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);
+@@ -2717,7 +2717,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,
+@@ -2739,7 +2739,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,
+@@ -2763,8 +2763,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,
+@@ -2775,7 +2776,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;
+@@ -2800,7 +2801,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;
+       }
+@@ -2857,7 +2858,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
+@@ -2892,7 +2893,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) {
+@@ -2936,8 +2937,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.
+@@ -2963,7 +2964,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;
+       }
+@@ -3201,8 +3202,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 */
+@@ -3410,8 +3410,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 */
+@@ -3427,7 +3426,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 */
+@@ -3451,7 +3450,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);
+@@ -3469,7 +3468,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");
+       }
+@@ -3565,7 +3564,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)
+@@ -3622,7 +3621,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,
+@@ -3718,7 +3717,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);
+       }
+@@ -3762,7 +3761,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);
+@@ -3788,7 +3787,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-5.10/ixgbe-remove-non-inclusive-language.patch b/queue-5.10/ixgbe-remove-non-inclusive-language.patch
new file mode 100644 (file)
index 0000000..d6ba757
--- /dev/null
@@ -0,0 +1,188 @@
+From 956da29e861fabd043474273583775be237fd7b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Jan 2022 11:27:23 +0100
+Subject: ixgbe: Remove non-inclusive language
+
+From: Piotr Skajewski <piotrx.skajewski@intel.com>
+
+[ Upstream commit 93b067f154b3edfd3d75a272fd9433bf787e2e1d ]
+
+Remove non-inclusive language from the driver.
+
+Additionally correct the duplication "from from"
+reported by checkpatch after the changes above.
+
+Signed-off-by: Piotr Skajewski <piotrx.skajewski@intel.com>
+Tested-by: Dave Switzer <david.switzer@intel.com>
+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_common.c   | 36 +++++++++----------
+ drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |  4 +--
+ drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 10 +++---
+ 3 files changed, 25 insertions(+), 25 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+index 62ddb452f862..bf5134563ede 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+@@ -30,7 +30,7 @@ static s32 ixgbe_write_eeprom_buffer_bit_bang(struct ixgbe_hw *hw, u16 offset,
+                                            u16 words, u16 *data);
+ static s32 ixgbe_detect_eeprom_page_size_generic(struct ixgbe_hw *hw,
+                                                u16 offset);
+-static s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw);
++static s32 ixgbe_disable_pcie_primary(struct ixgbe_hw *hw);
+ /* Base table for registers values that change by MAC */
+ const u32 ixgbe_mvals_8259X[IXGBE_MVALS_IDX_LIMIT] = {
+@@ -745,10 +745,10 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw)
+       usleep_range(1000, 2000);
+       /*
+-       * Prevent the PCI-E bus from from hanging by disabling PCI-E master
++       * Prevent the PCI-E bus from hanging by disabling PCI-E primary
+        * access and verify no pending requests
+        */
+-      return ixgbe_disable_pcie_master(hw);
++      return ixgbe_disable_pcie_primary(hw);
+ }
+ /**
+@@ -2505,15 +2505,15 @@ static u32 ixgbe_pcie_timeout_poll(struct ixgbe_hw *hw)
+ }
+ /**
+- *  ixgbe_disable_pcie_master - Disable PCI-express master access
++ *  ixgbe_disable_pcie_primary - Disable PCI-express primary access
+  *  @hw: pointer to hardware structure
+  *
+- *  Disables PCI-Express master access and verifies there are no pending
+- *  requests. IXGBE_ERR_MASTER_REQUESTS_PENDING is returned if master disable
+- *  bit hasn't caused the master requests to be disabled, else 0
+- *  is returned signifying master requests disabled.
++ *  Disables PCI-Express primary access and verifies there are no pending
++ *  requests. IXGBE_ERR_PRIMARY_REQUESTS_PENDING is returned if primary disable
++ *  bit hasn't caused the primary requests to be disabled, else 0
++ *  is returned signifying primary requests disabled.
+  **/
+-static s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
++static s32 ixgbe_disable_pcie_primary(struct ixgbe_hw *hw)
+ {
+       u32 i, poll;
+       u16 value;
+@@ -2522,23 +2522,23 @@ static s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
+       IXGBE_WRITE_REG(hw, IXGBE_CTRL, IXGBE_CTRL_GIO_DIS);
+       /* Poll for bit to read as set */
+-      for (i = 0; i < IXGBE_PCI_MASTER_DISABLE_TIMEOUT; i++) {
++      for (i = 0; i < IXGBE_PCI_PRIMARY_DISABLE_TIMEOUT; i++) {
+               if (IXGBE_READ_REG(hw, IXGBE_CTRL) & IXGBE_CTRL_GIO_DIS)
+                       break;
+               usleep_range(100, 120);
+       }
+-      if (i >= IXGBE_PCI_MASTER_DISABLE_TIMEOUT) {
++      if (i >= IXGBE_PCI_PRIMARY_DISABLE_TIMEOUT) {
+               hw_dbg(hw, "GIO disable did not set - requesting resets\n");
+               goto gio_disable_fail;
+       }
+-      /* Exit if master requests are blocked */
++      /* Exit if primary requests are blocked */
+       if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO) ||
+           ixgbe_removed(hw->hw_addr))
+               return 0;
+-      /* Poll for master request bit to clear */
+-      for (i = 0; i < IXGBE_PCI_MASTER_DISABLE_TIMEOUT; i++) {
++      /* Poll for primary request bit to clear */
++      for (i = 0; i < IXGBE_PCI_PRIMARY_DISABLE_TIMEOUT; i++) {
+               udelay(100);
+               if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO))
+                       return 0;
+@@ -2546,13 +2546,13 @@ static s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
+       /*
+        * Two consecutive resets are required via CTRL.RST per datasheet
+-       * 5.2.5.3.2 Master Disable.  We set a flag to inform the reset routine
+-       * of this need.  The first reset prevents new master requests from
++       * 5.2.5.3.2 Primary Disable.  We set a flag to inform the reset routine
++       * of this need.  The first reset prevents new primary requests from
+        * being issued by our device.  We then must wait 1usec or more for any
+        * remaining completions from the PCIe bus to trickle in, and then reset
+        * again to clear out any effects they may have had on our device.
+        */
+-      hw_dbg(hw, "GIO Master Disable bit didn't clear - requesting resets\n");
++      hw_dbg(hw, "GIO Primary Disable bit didn't clear - requesting resets\n");
+ gio_disable_fail:
+       hw->mac.flags |= IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
+@@ -2574,7 +2574,7 @@ static s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
+       }
+       hw_dbg(hw, "PCIe transaction pending bit also did not clear.\n");
+-      return IXGBE_ERR_MASTER_REQUESTS_PENDING;
++      return IXGBE_ERR_PRIMARY_REQUESTS_PENDING;
+ }
+ /**
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+index 5829d81f2cb1..85c17391a6c5 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -5949,8 +5949,8 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
+       case IXGBE_ERR_SFP_NOT_PRESENT:
+       case IXGBE_ERR_SFP_NOT_SUPPORTED:
+               break;
+-      case IXGBE_ERR_MASTER_REQUESTS_PENDING:
+-              e_dev_err("master disable timed out\n");
++      case IXGBE_ERR_PRIMARY_REQUESTS_PENDING:
++              e_dev_err("primary disable timed out\n");
+               break;
+       case IXGBE_ERR_EEPROM_VERSION:
+               /* We are running on a pre-production device, log a warning */
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+index 2be1c4c72435..039f7c73a3b5 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+@@ -1247,7 +1247,7 @@ struct ixgbe_nvm_version {
+ #define IXGBE_PSRTYPE_RQPL_SHIFT    29
+ /* CTRL Bit Masks */
+-#define IXGBE_CTRL_GIO_DIS      0x00000004 /* Global IO Master Disable bit */
++#define IXGBE_CTRL_GIO_DIS      0x00000004 /* Global IO Primary Disable bit */
+ #define IXGBE_CTRL_LNK_RST      0x00000008 /* Link Reset. Resets everything. */
+ #define IXGBE_CTRL_RST          0x04000000 /* Reset (SW) */
+ #define IXGBE_CTRL_RST_MASK     (IXGBE_CTRL_LNK_RST | IXGBE_CTRL_RST)
+@@ -1810,7 +1810,7 @@ enum {
+ /* STATUS Bit Masks */
+ #define IXGBE_STATUS_LAN_ID         0x0000000C /* LAN ID */
+ #define IXGBE_STATUS_LAN_ID_SHIFT   2          /* LAN ID Shift*/
+-#define IXGBE_STATUS_GIO            0x00080000 /* GIO Master Enable Status */
++#define IXGBE_STATUS_GIO            0x00080000 /* GIO Primary Enable Status */
+ #define IXGBE_STATUS_LAN_ID_0   0x00000000 /* LAN ID 0 */
+ #define IXGBE_STATUS_LAN_ID_1   0x00000004 /* LAN ID 1 */
+@@ -2192,8 +2192,8 @@ enum {
+ #define IXGBE_PCIDEVCTRL2_4_8s                0xd
+ #define IXGBE_PCIDEVCTRL2_17_34s      0xe
+-/* Number of 100 microseconds we wait for PCI Express master disable */
+-#define IXGBE_PCI_MASTER_DISABLE_TIMEOUT      800
++/* Number of 100 microseconds we wait for PCI Express primary disable */
++#define IXGBE_PCI_PRIMARY_DISABLE_TIMEOUT     800
+ /* RAH */
+ #define IXGBE_RAH_VIND_MASK     0x003C0000
+@@ -3674,7 +3674,7 @@ struct ixgbe_info {
+ #define IXGBE_ERR_ADAPTER_STOPPED               -9
+ #define IXGBE_ERR_INVALID_MAC_ADDR              -10
+ #define IXGBE_ERR_DEVICE_NOT_SUPPORTED          -11
+-#define IXGBE_ERR_MASTER_REQUESTS_PENDING       -12
++#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
+-- 
+2.43.0
+
diff --git a/queue-5.10/llc-call-sock_orphan-at-release-time.patch b/queue-5.10/llc-call-sock_orphan-at-release-time.patch
new file mode 100644 (file)
index 0000000..bfc8a8c
--- /dev/null
@@ -0,0 +1,205 @@
+From 3f1e89f40d2f7ccb3c281bcb5c8d49668d5d9819 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 f9785150bfcc..dae978badd26 100644
+--- a/net/llc/af_llc.c
++++ b/net/llc/af_llc.c
+@@ -227,6 +227,8 @@ static int llc_ui_release(struct socket *sock)
+       if (llc->dev)
+               dev_put(llc->dev);
+       sock_put(sk);
++      sock_orphan(sk);
++      sock->sk = NULL;
+       llc_sk_free(sk);
+ out:
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-5.10/net-ipv4-fix-a-memleak-in-ip_setup_cork.patch b/queue-5.10/net-ipv4-fix-a-memleak-in-ip_setup_cork.patch
new file mode 100644 (file)
index 0000000..010ef42
--- /dev/null
@@ -0,0 +1,55 @@
+From 04a74d488e5a7eae662c5ecdd2d5dcde29db3ad0 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 a99c374101fc..12ee857d6cfe 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -1260,6 +1260,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.
+        */
+@@ -1276,12 +1282,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-5.10/net-sysfs-fix-sys-class-net-iface-path.patch b/queue-5.10/net-sysfs-fix-sys-class-net-iface-path.patch
new file mode 100644 (file)
index 0000000..6ef846f
--- /dev/null
@@ -0,0 +1,127 @@
+From 65e2cedd396f1152bf5ba8eb975c81c09e0c3de3 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 978b76358661..40d5aab8452d 100644
+--- a/Documentation/ABI/testing/sysfs-class-net-queues
++++ b/Documentation/ABI/testing/sysfs-class-net-queues
+@@ -1,4 +1,4 @@
+-What:         /sys/class/<iface>/queues/rx-<queue>/rps_cpus
++What:         /sys/class/net/<iface>/queues/rx-<queue>/rps_cpus
+ Date:         March 2010
+ KernelVersion:        2.6.35
+ Contact:      netdev@vger.kernel.org
+@@ -8,7 +8,7 @@ Description:
+               network device queue. Possible values depend on the number
+               of available CPU(s) in the system.
+-What:         /sys/class/<iface>/queues/rx-<queue>/rps_flow_cnt
++What:         /sys/class/net/<iface>/queues/rx-<queue>/rps_flow_cnt
+ Date:         April 2010
+ KernelVersion:        2.6.35
+ Contact:      netdev@vger.kernel.org
+@@ -16,7 +16,7 @@ Description:
+               Number of Receive Packet Steering flows being currently
+               processed by this particular network device receive queue.
+-What:         /sys/class/<iface>/queues/tx-<queue>/tx_timeout
++What:         /sys/class/net/<iface>/queues/tx-<queue>/tx_timeout
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -24,7 +24,7 @@ Description:
+               Indicates the number of transmit timeout events seen by this
+               network interface transmit queue.
+-What:         /sys/class/<iface>/queues/tx-<queue>/tx_maxrate
++What:         /sys/class/net/<iface>/queues/tx-<queue>/tx_maxrate
+ Date:         March 2015
+ KernelVersion:        4.1
+ Contact:      netdev@vger.kernel.org
+@@ -32,7 +32,7 @@ Description:
+               A Mbps max-rate set for the queue, a value of zero means disabled,
+               default is disabled.
+-What:         /sys/class/<iface>/queues/tx-<queue>/xps_cpus
++What:         /sys/class/net/<iface>/queues/tx-<queue>/xps_cpus
+ Date:         November 2010
+ KernelVersion:        2.6.38
+ Contact:      netdev@vger.kernel.org
+@@ -42,7 +42,7 @@ Description:
+               network device transmit queue. Possible vaules depend on the
+               number of available CPU(s) in the system.
+-What:         /sys/class/<iface>/queues/tx-<queue>/xps_rxqs
++What:         /sys/class/net/<iface>/queues/tx-<queue>/xps_rxqs
+ Date:         June 2018
+ KernelVersion:        4.18.0
+ Contact:      netdev@vger.kernel.org
+@@ -53,7 +53,7 @@ Description:
+               number of available receive queue(s) in the network device.
+               Default is disabled.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -62,7 +62,7 @@ Description:
+               of this particular network device transmit queue.
+               Default value is 1000.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -70,7 +70,7 @@ Description:
+               Indicates the number of bytes (objects) in flight on this
+               network device transmit queue.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -79,7 +79,7 @@ Description:
+               on this network device transmit queue. This value is clamped
+               to be within the bounds defined by limit_max and limit_min.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+@@ -88,7 +88,7 @@ Description:
+               queued on this network device transmit queue. See
+               include/linux/dynamic_queue_limits.h for the default value.
+-What:         /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
++What:         /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
+ Date:         November 2011
+ KernelVersion:        3.3
+ Contact:      netdev@vger.kernel.org
+-- 
+2.43.0
+
diff --git a/queue-5.10/net-zerocopy-refactor-frag-is-remappable-test.patch b/queue-5.10/net-zerocopy-refactor-frag-is-remappable-test.patch
new file mode 100644 (file)
index 0000000..11d9273
--- /dev/null
@@ -0,0 +1,87 @@
+From 329d2b969069c7ad1afa59c9bd6139d3a866a378 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Dec 2020 14:53:45 -0800
+Subject: net-zerocopy: Refactor frag-is-remappable test.
+
+From: Arjun Roy <arjunroy@google.com>
+
+[ Upstream commit 98917cf0d6eda01e8c3c34d35398d46b247b6fd3 ]
+
+Refactor frag-is-remappable test for tcp receive zerocopy. This is
+part of a patch set that introduces short-circuited hybrid copies
+for small receive operations, which results in roughly 33% fewer
+syscalls for small RPC scenarios.
+
+Signed-off-by: Arjun Roy <arjunroy@google.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: 577e4432f3ac ("tcp: add sanity checks to rx zerocopy")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp.c | 34 ++++++++++++++++++++++++++--------
+ 1 file changed, 26 insertions(+), 8 deletions(-)
+
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index 27e0d3dfc5bd..18541527abce 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -1778,6 +1778,26 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,
+       return frag;
+ }
++static bool can_map_frag(const skb_frag_t *frag)
++{
++      return skb_frag_size(frag) == PAGE_SIZE && !skb_frag_off(frag);
++}
++
++static int find_next_mappable_frag(const skb_frag_t *frag,
++                                 int remaining_in_skb)
++{
++      int offset = 0;
++
++      if (likely(can_map_frag(frag)))
++              return 0;
++
++      while (offset < remaining_in_skb && !can_map_frag(frag)) {
++              offset += skb_frag_size(frag);
++              ++frag;
++      }
++      return offset;
++}
++
+ static int tcp_copy_straggler_data(struct tcp_zerocopy_receive *zc,
+                                  struct sk_buff *skb, u32 copylen,
+                                  u32 *offset, u32 *seq)
+@@ -1903,6 +1923,8 @@ static int tcp_zerocopy_receive(struct sock *sk,
+       ret = 0;
+       curr_addr = address;
+       while (length + PAGE_SIZE <= zc->length) {
++              int mappable_offset;
++
+               if (zc->recv_skip_hint < PAGE_SIZE) {
+                       u32 offset_frag;
+@@ -1930,15 +1952,11 @@ static int tcp_zerocopy_receive(struct sock *sk,
+                       if (!frags || offset_frag)
+                               break;
+               }
+-              if (skb_frag_size(frags) != PAGE_SIZE || skb_frag_off(frags)) {
+-                      int remaining = zc->recv_skip_hint;
+-                      while (remaining && (skb_frag_size(frags) != PAGE_SIZE ||
+-                                           skb_frag_off(frags))) {
+-                              remaining -= skb_frag_size(frags);
+-                              frags++;
+-                      }
+-                      zc->recv_skip_hint -= remaining;
++              mappable_offset = find_next_mappable_frag(frags,
++                                                        zc->recv_skip_hint);
++              if (mappable_offset) {
++                      zc->recv_skip_hint = mappable_offset;
+                       break;
+               }
+               pages[pg_idx] = skb_frag_page(frags);
+-- 
+2.43.0
+
diff --git a/queue-5.10/netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch b/queue-5.10/netfilter-nf_log-replace-bug_on-by-warn_on_once-when.patch
new file mode 100644 (file)
index 0000000..4d36b0f
--- /dev/null
@@ -0,0 +1,46 @@
+From bd25b7ed01a4f0d1248e21ae774b742a2706a92f 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 6cb9f9474b05..28c6cb5cff0e 100644
+--- a/net/netfilter/nf_log.c
++++ b/net/netfilter/nf_log.c
+@@ -203,11 +203,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-5.10/netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch b/queue-5.10/netfilter-nft_ct-sanitize-layer-3-and-4-protocol-num.patch
new file mode 100644 (file)
index 0000000..4db357d
--- /dev/null
@@ -0,0 +1,60 @@
+From 8d9387de450cb762bf1d5fc1ef0a6d89c04cc052 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 14093d86e682..5b16161526e7 100644
+--- a/net/netfilter/nft_ct.c
++++ b/net/netfilter/nft_ct.c
+@@ -1182,7 +1182,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-5.10/scsi-core-introduce-enum-scsi_disposition.patch b/queue-5.10/scsi-core-introduce-enum-scsi_disposition.patch
new file mode 100644 (file)
index 0000000..e848be8
--- /dev/null
@@ -0,0 +1,415 @@
+From 6a9ed4bab73d8fba5684f1bc749d5c94be34d874 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 15 Apr 2021 15:08:11 -0700
+Subject: scsi: core: Introduce enum scsi_disposition
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ Upstream commit b8e162f9e7e2da6e823a4984d6aa0523e278babf ]
+
+Improve readability of the code in the SCSI core by introducing an
+enumeration type for the values used internally that decide how to continue
+processing a SCSI command. The eh_*_handler return values have not been
+changed because that would involve modifying all SCSI drivers.
+
+The output of the following command has been inspected to verify that no
+out-of-range values are assigned to a variable of type enum
+scsi_disposition:
+
+KCFLAGS=-Wassign-enum make CC=clang W=1 drivers/scsi/
+
+Link: https://lore.kernel.org/r/20210415220826.29438-6-bvanassche@acm.org
+Cc: Christoph Hellwig <hch@lst.de>
+Cc: Johannes Thumshirn <johannes.thumshirn@wdc.com>
+Cc: Hannes Reinecke <hare@suse.de>
+Cc: Daniel Wagner <dwagner@suse.de>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Stable-dep-of: 4373534a9850 ("scsi: core: Move scsi_host_busy() out of host lock for waking up EH handler")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ata/libata-eh.c                    |  2 +-
+ drivers/scsi/device_handler/scsi_dh_alua.c |  4 +-
+ drivers/scsi/device_handler/scsi_dh_emc.c  |  4 +-
+ drivers/scsi/device_handler/scsi_dh_rdac.c |  4 +-
+ drivers/scsi/scsi_error.c                  | 64 ++++++++++++----------
+ drivers/scsi/scsi_lib.c                    |  2 +-
+ drivers/scsi/scsi_priv.h                   |  2 +-
+ include/scsi/scsi.h                        | 21 +++----
+ include/scsi/scsi_dh.h                     |  3 +-
+ include/scsi/scsi_eh.h                     |  2 +-
+ 10 files changed, 57 insertions(+), 51 deletions(-)
+
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index 2308c2be85a1..48130b254396 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -1607,7 +1607,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
+       }
+       if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
+-              int ret = scsi_check_sense(qc->scsicmd);
++              enum scsi_disposition ret = scsi_check_sense(qc->scsicmd);
+               /*
+                * SUCCESS here means that the sense code could be
+                * evaluated and should be passed to the upper layers
+diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
+index bf0b3178f84d..4371d8b00656 100644
+--- a/drivers/scsi/device_handler/scsi_dh_alua.c
++++ b/drivers/scsi/device_handler/scsi_dh_alua.c
+@@ -405,8 +405,8 @@ static char print_alua_state(unsigned char state)
+       }
+ }
+-static int alua_check_sense(struct scsi_device *sdev,
+-                          struct scsi_sense_hdr *sense_hdr)
++static enum scsi_disposition alua_check_sense(struct scsi_device *sdev,
++                                            struct scsi_sense_hdr *sense_hdr)
+ {
+       switch (sense_hdr->sense_key) {
+       case NOT_READY:
+diff --git a/drivers/scsi/device_handler/scsi_dh_emc.c b/drivers/scsi/device_handler/scsi_dh_emc.c
+index caa685cfe3d4..bd28ec6cfb72 100644
+--- a/drivers/scsi/device_handler/scsi_dh_emc.c
++++ b/drivers/scsi/device_handler/scsi_dh_emc.c
+@@ -280,8 +280,8 @@ static int send_trespass_cmd(struct scsi_device *sdev,
+       return res;
+ }
+-static int clariion_check_sense(struct scsi_device *sdev,
+-                              struct scsi_sense_hdr *sense_hdr)
++static enum scsi_disposition clariion_check_sense(struct scsi_device *sdev,
++                                      struct scsi_sense_hdr *sense_hdr)
+ {
+       switch (sense_hdr->sense_key) {
+       case NOT_READY:
+diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
+index 85a71bafaea7..66652ab409cc 100644
+--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
++++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
+@@ -656,8 +656,8 @@ static blk_status_t rdac_prep_fn(struct scsi_device *sdev, struct request *req)
+       return BLK_STS_OK;
+ }
+-static int rdac_check_sense(struct scsi_device *sdev,
+-                              struct scsi_sense_hdr *sense_hdr)
++static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
++                                            struct scsi_sense_hdr *sense_hdr)
+ {
+       struct rdac_dh_data *h = sdev->handler_data;
+diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
+index 3d3d139127ee..242e5ea5e0c3 100644
+--- a/drivers/scsi/scsi_error.c
++++ b/drivers/scsi/scsi_error.c
+@@ -60,8 +60,8 @@ static void scsi_eh_done(struct scsi_cmnd *scmd);
+ #define HOST_RESET_SETTLE_TIME  (10)
+ static int scsi_eh_try_stu(struct scsi_cmnd *scmd);
+-static int scsi_try_to_abort_cmd(struct scsi_host_template *,
+-                               struct scsi_cmnd *);
++static enum scsi_disposition scsi_try_to_abort_cmd(struct scsi_host_template *,
++                                                 struct scsi_cmnd *);
+ void scsi_eh_wakeup(struct Scsi_Host *shost)
+ {
+@@ -140,7 +140,7 @@ scmd_eh_abort_handler(struct work_struct *work)
+       struct scsi_cmnd *scmd =
+               container_of(work, struct scsi_cmnd, abort_work.work);
+       struct scsi_device *sdev = scmd->device;
+-      int rtn;
++      enum scsi_disposition rtn;
+       if (scsi_host_eh_past_deadline(sdev->host)) {
+               SCSI_LOG_ERROR_RECOVERY(3,
+@@ -478,7 +478,7 @@ static void scsi_report_sense(struct scsi_device *sdev,
+  *    When a deferred error is detected the current command has
+  *    not been executed and needs retrying.
+  */
+-int scsi_check_sense(struct scsi_cmnd *scmd)
++enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
+ {
+       struct scsi_device *sdev = scmd->device;
+       struct scsi_sense_hdr sshdr;
+@@ -492,7 +492,7 @@ int scsi_check_sense(struct scsi_cmnd *scmd)
+               return NEEDS_RETRY;
+       if (sdev->handler && sdev->handler->check_sense) {
+-              int rc;
++              enum scsi_disposition rc;
+               rc = sdev->handler->check_sense(sdev, &sshdr);
+               if (rc != SCSI_RETURN_NOT_HANDLED)
+@@ -703,7 +703,7 @@ static void scsi_handle_queue_full(struct scsi_device *sdev)
+  *    don't allow for the possibility of retries here, and we are a lot
+  *    more restrictive about what we consider acceptable.
+  */
+-static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
++static enum scsi_disposition scsi_eh_completed_normally(struct scsi_cmnd *scmd)
+ {
+       /*
+        * first check the host byte, to see if there is anything in there
+@@ -784,10 +784,10 @@ static void scsi_eh_done(struct scsi_cmnd *scmd)
+  * scsi_try_host_reset - ask host adapter to reset itself
+  * @scmd:     SCSI cmd to send host reset.
+  */
+-static int scsi_try_host_reset(struct scsi_cmnd *scmd)
++static enum scsi_disposition scsi_try_host_reset(struct scsi_cmnd *scmd)
+ {
+       unsigned long flags;
+-      int rtn;
++      enum scsi_disposition rtn;
+       struct Scsi_Host *host = scmd->device->host;
+       struct scsi_host_template *hostt = host->hostt;
+@@ -814,10 +814,10 @@ static int scsi_try_host_reset(struct scsi_cmnd *scmd)
+  * scsi_try_bus_reset - ask host to perform a bus reset
+  * @scmd:     SCSI cmd to send bus reset.
+  */
+-static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
++static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd)
+ {
+       unsigned long flags;
+-      int rtn;
++      enum scsi_disposition rtn;
+       struct Scsi_Host *host = scmd->device->host;
+       struct scsi_host_template *hostt = host->hostt;
+@@ -856,10 +856,10 @@ static void __scsi_report_device_reset(struct scsi_device *sdev, void *data)
+  *    timer on it, and set the host back to a consistent state prior to
+  *    returning.
+  */
+-static int scsi_try_target_reset(struct scsi_cmnd *scmd)
++static enum scsi_disposition scsi_try_target_reset(struct scsi_cmnd *scmd)
+ {
+       unsigned long flags;
+-      int rtn;
++      enum scsi_disposition rtn;
+       struct Scsi_Host *host = scmd->device->host;
+       struct scsi_host_template *hostt = host->hostt;
+@@ -887,9 +887,9 @@ static int scsi_try_target_reset(struct scsi_cmnd *scmd)
+  *    timer on it, and set the host back to a consistent state prior to
+  *    returning.
+  */
+-static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
++static enum scsi_disposition scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
+ {
+-      int rtn;
++      enum scsi_disposition rtn;
+       struct scsi_host_template *hostt = scmd->device->host->hostt;
+       if (!hostt->eh_device_reset_handler)
+@@ -918,8 +918,8 @@ static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
+  *    if the device is temporarily unavailable (eg due to a
+  *    link down on FibreChannel)
+  */
+-static int scsi_try_to_abort_cmd(struct scsi_host_template *hostt,
+-                               struct scsi_cmnd *scmd)
++static enum scsi_disposition
++scsi_try_to_abort_cmd(struct scsi_host_template *hostt, struct scsi_cmnd *scmd)
+ {
+       if (!hostt->eh_abort_handler)
+               return FAILED;
+@@ -1052,8 +1052,8 @@ EXPORT_SYMBOL(scsi_eh_restore_cmnd);
+  * Return value:
+  *    SUCCESS or FAILED or NEEDS_RETRY
+  */
+-static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
+-                           int cmnd_size, int timeout, unsigned sense_bytes)
++static enum scsi_disposition scsi_send_eh_cmnd(struct scsi_cmnd *scmd,
++      unsigned char *cmnd, int cmnd_size, int timeout, unsigned sense_bytes)
+ {
+       struct scsi_device *sdev = scmd->device;
+       struct Scsi_Host *shost = sdev->host;
+@@ -1161,12 +1161,13 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
+  *    that we obtain it on our own. This function will *not* return until
+  *    the command either times out, or it completes.
+  */
+-static int scsi_request_sense(struct scsi_cmnd *scmd)
++static enum scsi_disposition scsi_request_sense(struct scsi_cmnd *scmd)
+ {
+       return scsi_send_eh_cmnd(scmd, NULL, 0, scmd->device->eh_timeout, ~0);
+ }
+-static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn)
++static enum scsi_disposition
++scsi_eh_action(struct scsi_cmnd *scmd, enum scsi_disposition rtn)
+ {
+       if (!blk_rq_is_passthrough(scmd->request)) {
+               struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd);
+@@ -1219,7 +1220,7 @@ int scsi_eh_get_sense(struct list_head *work_q,
+ {
+       struct scsi_cmnd *scmd, *next;
+       struct Scsi_Host *shost;
+-      int rtn;
++      enum scsi_disposition rtn;
+       /*
+        * If SCSI_EH_ABORT_SCHEDULED has been set, it is timeout IO,
+@@ -1297,7 +1298,8 @@ EXPORT_SYMBOL_GPL(scsi_eh_get_sense);
+ static int scsi_eh_tur(struct scsi_cmnd *scmd)
+ {
+       static unsigned char tur_command[6] = {TEST_UNIT_READY, 0, 0, 0, 0, 0};
+-      int retry_cnt = 1, rtn;
++      int retry_cnt = 1;
++      enum scsi_disposition rtn;
+ retry_tur:
+       rtn = scsi_send_eh_cmnd(scmd, tur_command, 6,
+@@ -1385,7 +1387,8 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd)
+       static unsigned char stu_command[6] = {START_STOP, 0, 0, 0, 1, 0};
+       if (scmd->device->allow_restart) {
+-              int i, rtn = NEEDS_RETRY;
++              int i;
++              enum scsi_disposition rtn = NEEDS_RETRY;
+               for (i = 0; rtn == NEEDS_RETRY && i < 2; i++)
+                       rtn = scsi_send_eh_cmnd(scmd, stu_command, 6, scmd->device->request_queue->rq_timeout, 0);
+@@ -1479,7 +1482,7 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,
+ {
+       struct scsi_cmnd *scmd, *bdr_scmd, *next;
+       struct scsi_device *sdev;
+-      int rtn;
++      enum scsi_disposition rtn;
+       shost_for_each_device(sdev, shost) {
+               if (scsi_host_eh_past_deadline(shost)) {
+@@ -1546,7 +1549,7 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost,
+       while (!list_empty(&tmp_list)) {
+               struct scsi_cmnd *next, *scmd;
+-              int rtn;
++              enum scsi_disposition rtn;
+               unsigned int id;
+               if (scsi_host_eh_past_deadline(shost)) {
+@@ -1604,7 +1607,7 @@ static int scsi_eh_bus_reset(struct Scsi_Host *shost,
+       struct scsi_cmnd *scmd, *chan_scmd, *next;
+       LIST_HEAD(check_list);
+       unsigned int channel;
+-      int rtn;
++      enum scsi_disposition rtn;
+       /*
+        * we really want to loop over the various channels, and do this on
+@@ -1675,7 +1678,7 @@ static int scsi_eh_host_reset(struct Scsi_Host *shost,
+ {
+       struct scsi_cmnd *scmd, *next;
+       LIST_HEAD(check_list);
+-      int rtn;
++      enum scsi_disposition rtn;
+       if (!list_empty(work_q)) {
+               scmd = list_entry(work_q->next,
+@@ -1781,9 +1784,9 @@ int scsi_noretry_cmd(struct scsi_cmnd *scmd)
+  *    doesn't require the error handler read (i.e. we don't need to
+  *    abort/reset), this function should return SUCCESS.
+  */
+-int scsi_decide_disposition(struct scsi_cmnd *scmd)
++enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *scmd)
+ {
+-      int rtn;
++      enum scsi_disposition rtn;
+       /*
+        * if the device is offline, then we clearly just pass the result back
+@@ -2339,7 +2342,8 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg)
+       struct Scsi_Host *shost = dev->host;
+       struct request *rq;
+       unsigned long flags;
+-      int error = 0, rtn, val;
++      int error = 0, val;
++      enum scsi_disposition rtn;
+       if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+               return -EACCES;
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index 99b90031500b..38f82d15248b 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -1426,7 +1426,7 @@ static bool scsi_mq_lld_busy(struct request_queue *q)
+ static void scsi_softirq_done(struct request *rq)
+ {
+       struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
+-      int disposition;
++      enum scsi_disposition disposition;
+       INIT_LIST_HEAD(&cmd->eh_entry);
+diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
+index 180636d54982..8a015af4aa11 100644
+--- a/drivers/scsi/scsi_priv.h
++++ b/drivers/scsi/scsi_priv.h
+@@ -73,7 +73,7 @@ extern void scsi_exit_devinfo(void);
+ extern void scmd_eh_abort_handler(struct work_struct *work);
+ extern enum blk_eh_timer_return scsi_times_out(struct request *req);
+ extern int scsi_error_handler(void *host);
+-extern int scsi_decide_disposition(struct scsi_cmnd *cmd);
++extern enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *cmd);
+ extern void scsi_eh_wakeup(struct Scsi_Host *shost);
+ extern void scsi_eh_scmd_add(struct scsi_cmnd *);
+ void scsi_eh_ready_devs(struct Scsi_Host *shost,
+diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
+index 5339baadc082..39c7a36cd6ce 100644
+--- a/include/scsi/scsi.h
++++ b/include/scsi/scsi.h
+@@ -178,16 +178,17 @@ static inline int scsi_is_wlun(u64 lun)
+ /*
+  * Internal return values.
+  */
+-
+-#define NEEDS_RETRY     0x2001
+-#define SUCCESS         0x2002
+-#define FAILED          0x2003
+-#define QUEUED          0x2004
+-#define SOFT_ERROR      0x2005
+-#define ADD_TO_MLQUEUE  0x2006
+-#define TIMEOUT_ERROR   0x2007
+-#define SCSI_RETURN_NOT_HANDLED   0x2008
+-#define FAST_IO_FAIL  0x2009
++enum scsi_disposition {
++      NEEDS_RETRY             = 0x2001,
++      SUCCESS                 = 0x2002,
++      FAILED                  = 0x2003,
++      QUEUED                  = 0x2004,
++      SOFT_ERROR              = 0x2005,
++      ADD_TO_MLQUEUE          = 0x2006,
++      TIMEOUT_ERROR           = 0x2007,
++      SCSI_RETURN_NOT_HANDLED = 0x2008,
++      FAST_IO_FAIL            = 0x2009,
++};
+ /*
+  * Midlevel queue return values.
+diff --git a/include/scsi/scsi_dh.h b/include/scsi/scsi_dh.h
+index 2852e470a8ed..47ccf2f11d89 100644
+--- a/include/scsi/scsi_dh.h
++++ b/include/scsi/scsi_dh.h
+@@ -52,7 +52,8 @@ struct scsi_device_handler {
+       /* Filled by the hardware handler */
+       struct module *module;
+       const char *name;
+-      int (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *);
++      enum scsi_disposition (*check_sense)(struct scsi_device *,
++                                           struct scsi_sense_hdr *);
+       int (*attach)(struct scsi_device *);
+       void (*detach)(struct scsi_device *);
+       int (*activate)(struct scsi_device *, activate_complete, void *);
+diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h
+index 6bd5ed695a5e..468094254b3c 100644
+--- a/include/scsi/scsi_eh.h
++++ b/include/scsi/scsi_eh.h
+@@ -17,7 +17,7 @@ extern void scsi_report_device_reset(struct Scsi_Host *, int, int);
+ extern int scsi_block_when_processing_errors(struct scsi_device *);
+ extern bool scsi_command_normalize_sense(const struct scsi_cmnd *cmd,
+                                        struct scsi_sense_hdr *sshdr);
+-extern int scsi_check_sense(struct scsi_cmnd *);
++extern enum scsi_disposition scsi_check_sense(struct scsi_cmnd *);
+ static inline bool scsi_sense_is_deferred(const struct scsi_sense_hdr *sshdr)
+ {
+-- 
+2.43.0
+
diff --git a/queue-5.10/scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch b/queue-5.10/scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch
new file mode 100644 (file)
index 0000000..1cea932
--- /dev/null
@@ -0,0 +1,116 @@
+From f7823aa6b07e75210a06d3e4c7df3584e827bd7a 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 242e5ea5e0c3..7618a31358e6 100644
+--- a/drivers/scsi/scsi_error.c
++++ b/drivers/scsi/scsi_error.c
+@@ -63,11 +63,11 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd);
+ static enum scsi_disposition scsi_try_to_abort_cmd(struct scsi_host_template *,
+                                                  struct scsi_cmnd *);
+-void scsi_eh_wakeup(struct Scsi_Host *shost)
++void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy)
+ {
+       lockdep_assert_held(shost->host_lock);
+-      if (scsi_host_busy(shost) == shost->host_failed) {
++      if (busy == shost->host_failed) {
+               trace_scsi_eh_wakeup(shost);
+               wake_up_process(shost->ehandler);
+               SCSI_LOG_ERROR_RECOVERY(5, shost_printk(KERN_INFO, shost,
+@@ -90,7 +90,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);
+@@ -245,7 +245,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 38f82d15248b..625d1c2015d6 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -312,7 +312,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 8a015af4aa11..1183dbed687c 100644
+--- a/drivers/scsi/scsi_priv.h
++++ b/drivers/scsi/scsi_priv.h
+@@ -74,7 +74,7 @@ extern void scmd_eh_abort_handler(struct work_struct *work);
+ extern enum blk_eh_timer_return scsi_times_out(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-5.10/scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch b/queue-5.10/scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch
new file mode 100644 (file)
index 0000000..1fdd44b
--- /dev/null
@@ -0,0 +1,38 @@
+From f681e89d1ae5bd5edef195b95f44e1073ae420b3 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 b6d68d871b6c..a4129e456efa 100644
+--- a/drivers/scsi/isci/request.c
++++ b/drivers/scsi/isci/request.c
+@@ -3398,7 +3398,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
+
index 2b2291c5acd9439591dfa232aa17a64bca656198..2f1cd77816bb3542e61b6d2895072e671b41d06b 100644 (file)
@@ -222,3 +222,21 @@ drm-amdgpu-release-adev-pm.fw-before-return-in-amdgp.patch
 perf-fix-the-nr_addr_filters-fix.patch
 wifi-cfg80211-fix-rcu-dereference-in-__cfg80211_bss_.patch
 drm-using-mul_u32_u32-requires-linux-math64.h.patch
+scsi-isci-fix-an-error-code-problem-in-isci_io_reque.patch
+scsi-core-introduce-enum-scsi_disposition.patch
+scsi-core-move-scsi_host_busy-out-of-host-lock-for-w.patch
+ip6_tunnel-use-dev_sw_netstats_rx_add.patch
+ip6_tunnel-make-sure-to-pull-inner-header-in-__ip6_t.patch
+net-zerocopy-refactor-frag-is-remappable-test.patch
+tcp-add-sanity-checks-to-rx-zerocopy.patch
+ixgbe-remove-non-inclusive-language.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
+ipv6-ensure-natural-alignment-of-const-ipv6-loopback.patch
+llc-call-sock_orphan-at-release-time.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
+net-sysfs-fix-sys-class-net-iface-path.patch
diff --git a/queue-5.10/tcp-add-sanity-checks-to-rx-zerocopy.patch b/queue-5.10/tcp-add-sanity-checks-to-rx-zerocopy.patch
new file mode 100644 (file)
index 0000000..466532d
--- /dev/null
@@ -0,0 +1,78 @@
+From 5bd5edb76eee5f61ca3db12982f4f252b2715adf 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 18541527abce..a5c15e2d193f 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -1780,7 +1780,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
+