Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ethtool for openSUSE:Factory checked 
in at 2026-07-12 16:20:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ethtool (Old)
 and      /work/SRC/openSUSE:Factory/.ethtool.new.1991 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ethtool"

Sun Jul 12 16:20:59 2026 rev:91 rq:1364884 version:7.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/ethtool/ethtool.changes  2026-05-06 
19:18:22.090249522 +0200
+++ /work/SRC/openSUSE:Factory/.ethtool.new.1991/ethtool.changes        
2026-07-12 16:21:36.556923563 +0200
@@ -1,0 +2,17 @@
+Fri Jul 10 08:44:07 UTC 2026 - Jan Engelhardt <[email protected]>
+
+- Update to release 7.1
+  * Added netlink support for RX CQE Coalescing params
+  * netlink: module-eeprom: Add 'hex on pages on' option for
+    page-organized hex dump
+  * netlink: fec: Add missing newlines in FEC statistics output
+  * ethtool: Add man page and bash completion for 'pages on|off'
+  * ethtool: Update pause stats struct
+  * ethtool: Add --disable-netlink to help output
+  * qsfp: add support for newer SFF-8636 compliance codes
+  * sfpid: add support for newer SFF-8472 compliance codes
+  * sfpid: fix 10G Base-ER module detection
+- Delete bf023af442f63e16f1699128c7ce467eddc6d340.patch,
+  d35d87fbcda97fe31df79d62277743214641892a.patch (merged)
+
+-------------------------------------------------------------------

Old:
----
  bf023af442f63e16f1699128c7ce467eddc6d340.patch
  d35d87fbcda97fe31df79d62277743214641892a.patch
  ethtool-7.0.tar.sign
  ethtool-7.0.tar.xz

New:
----
  ethtool-7.1.tar.sign
  ethtool-7.1.tar.xz

----------(Old B)----------
  Old:  * sfpid: fix 10G Base-ER module detection
- Delete bf023af442f63e16f1699128c7ce467eddc6d340.patch,
  d35d87fbcda97fe31df79d62277743214641892a.patch (merged)
  Old:- Delete bf023af442f63e16f1699128c7ce467eddc6d340.patch,
  d35d87fbcda97fe31df79d62277743214641892a.patch (merged)
----------(Old E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ethtool.spec ++++++
--- /var/tmp/diff_new_pack.4TBl6n/_old  2026-07-12 16:21:37.132942978 +0200
+++ /var/tmp/diff_new_pack.4TBl6n/_new  2026-07-12 16:21:37.132942978 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           ethtool
-Version:        7.0
+Version:        7.1
 Release:        0
 Summary:        Utility for examining and tuning Ethernet-based network 
interfaces
 License:        GPL-2.0-only
@@ -28,8 +28,6 @@
 Source:         
https://www.kernel.org/pub/software/network/ethtool/%{name}-%{version}.tar.xz
 Source2:        
https://www.kernel.org/pub/software/network/ethtool/%{name}-%{version}.tar.sign
 Source3:        %{name}.keyring
-Patch12612562:  d35d87fbcda97fe31df79d62277743214641892a.patch
-Patch12612563:  bf023af442f63e16f1699128c7ce467eddc6d340.patch
 BuildRequires:  pkg-config
 BuildRequires:  xz
 BuildRequires:  pkgconfig(libmnl)

++++++ ethtool-7.0.tar.xz -> ethtool-7.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/NEWS new/ethtool-7.1/NEWS
--- old/ethtool-7.0/NEWS        2026-04-28 15:04:53.000000000 +0200
+++ new/ethtool-7.1/NEWS        2026-07-06 23:33:09.000000000 +0200
@@ -1,3 +1,15 @@
+Version 7.1 - Jul 7, 2026
+       * Feature: track TX pause storm events (-I -a)
+       * Feature: update doc for ETHTOOL_PFC_PREVENTION_TOUT tunable
+       * Feature: RX CQE coalescing params (-c, -C)
+       * Feature: allow hex dump of all pages (-m)
+       * Feature: qsfp: support newer SFF-8636 compliance codes (-m)
+       * Feature: sfpid: support newer SFF-8636 compliance codes (-m)
+       * Fix: document --disable-netlink in help output (-h)
+       * Fix: add missing newlines in FEC output (--show-fec)
+       * Fix: sfpid: fix 10G Base-ER module detection (-m)
+       * Misc: clarify 10000baseCR link mode in man page
+
 Version 7.0 - Apr 28, 2026
        * Feature: support MSE display (--show-mse)
        * Feature: add 2 new link_ext_state names
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/cmis.c new/ethtool-7.1/cmis.c
--- old/ethtool-7.0/cmis.c      2026-03-23 23:16:37.000000000 +0100
+++ new/ethtool-7.1/cmis.c      2026-07-06 21:43:40.000000000 +0200
@@ -1022,6 +1022,64 @@
        cmis_show_all_common(&map);
 }
 
+static void cmis_hex_dump(struct cmd_context *ctx,
+                         const struct cmis_memory_map *map)
+{
+       struct module_eeprom_dump dump = {
+               .length = CMIS_PAGE_SIZE,
+               .i2c_address = CMIS_I2C_ADDRESS,
+               .print_bank = true,
+       };
+       u8 bank, page;
+
+       new_json_obj(ctx->json);
+       if (is_json_context()) {
+               open_json_object(NULL);
+               open_json_array("pages", "");
+       }
+
+       dump.data = map->lower_memory;
+       module_dump_eeprom_hex(&dump);
+
+       for (bank = 0; bank < CMIS_MAX_BANKS; bank++) {
+               for (page = 0; page < CMIS_MAX_PAGES; page++) {
+                       const __u8 *buf = map->upper_memory[bank][page];
+
+                       if (!buf)
+                               continue;
+
+                       /* Upper memory starts at one page size into
+                        * the buffer, since pages are accessed at
+                        * offset between page size and twice the
+                        * page size.
+                        */
+                       dump.offset = CMIS_PAGE_SIZE;
+                       dump.page = page;
+                       dump.bank = bank;
+                       dump.data = buf + CMIS_PAGE_SIZE;
+                       module_dump_eeprom_hex(&dump);
+               }
+       }
+
+       if (is_json_context()) {
+               close_json_array("");
+               close_json_object();
+       }
+       delete_json_obj();
+}
+
+static void cmis_pretty_print(struct cmd_context *ctx,
+                             const struct cmis_memory_map *map)
+{
+       new_json_obj(ctx->json);
+       open_json_object(NULL);
+
+       cmis_show_all_common(map);
+
+       close_json_object();
+       delete_json_obj();
+}
+
 static void cmis_request_init(struct ethtool_module_eeprom *request, u8 bank,
                              u8 page, u32 offset)
 {
@@ -1117,21 +1175,19 @@
        return 0;
 }
 
-int cmis_show_all_nl(struct cmd_context *ctx)
+int cmis_show_all_nl(struct cmd_context *ctx, bool dump_pages)
 {
        struct cmis_memory_map map = {};
        int ret;
 
-       new_json_obj(ctx->json);
-       open_json_object(NULL);
-
        ret = cmis_memory_map_init_pages(ctx, &map);
        if (ret < 0)
                return ret;
-       cmis_show_all_common(&map);
 
-       close_json_object();
-       delete_json_obj();
+       if (dump_pages)
+               cmis_hex_dump(ctx, &map);
+       else
+               cmis_pretty_print(ctx, &map);
 
        return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/cmis.h new/ethtool-7.1/cmis.h
--- old/ethtool-7.0/cmis.h      2025-06-23 22:25:49.000000000 +0200
+++ new/ethtool-7.1/cmis.h      2026-07-06 21:43:40.000000000 +0200
@@ -201,6 +201,6 @@
 
 void cmis_show_all_ioctl(const __u8 *id);
 
-int cmis_show_all_nl(struct cmd_context *ctx);
+int cmis_show_all_nl(struct cmd_context *ctx, bool dump_pages);
 
 #endif /* CMIS_H__ */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/configure new/ethtool-7.1/configure
--- old/ethtool-7.0/configure   2026-04-28 15:05:05.000000000 +0200
+++ new/ethtool-7.1/configure   2026-07-06 23:39:19.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for ethtool 7.0.
+# Generated by GNU Autoconf 2.72 for ethtool 7.1.
 #
 # Report bugs to <[email protected]>.
 #
@@ -604,8 +604,8 @@
 # Identity of this package.
 PACKAGE_NAME='ethtool'
 PACKAGE_TARNAME='ethtool'
-PACKAGE_VERSION='7.0'
-PACKAGE_STRING='ethtool 7.0'
+PACKAGE_VERSION='7.1'
+PACKAGE_STRING='ethtool 7.1'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1322,7 +1322,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-'configure' configures ethtool 7.0 to adapt to many kinds of systems.
+'configure' configures ethtool 7.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1389,7 +1389,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of ethtool 7.0:";;
+     short | recursive ) echo "Configuration of ethtool 7.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1499,7 +1499,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ethtool configure 7.0
+ethtool configure 7.1
 generated by GNU Autoconf 2.72
 
 Copyright (C) 2023 Free Software Foundation, Inc.
@@ -1723,7 +1723,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by ethtool $as_me 7.0, which was
+It was created by ethtool $as_me 7.1, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3203,7 +3203,7 @@
 
 # Define the identity of the package.
  PACKAGE='ethtool'
- VERSION='7.0'
+ VERSION='7.1'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -6050,7 +6050,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by ethtool $as_me 7.0, which was
+This file was extended by ethtool $as_me 7.1, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6118,7 +6118,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-ethtool config.status 7.0
+ethtool config.status 7.1
 configured by $0, generated by GNU Autoconf 2.72,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/configure.ac new/ethtool-7.1/configure.ac
--- old/ethtool-7.0/configure.ac        2026-04-28 15:04:53.000000000 +0200
+++ new/ethtool-7.1/configure.ac        2026-07-06 23:18:04.000000000 +0200
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT(ethtool, 7.0, [email protected])
+AC_INIT(ethtool, 7.1, [email protected])
 AC_PREREQ(2.52)
 AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_SRCDIR([ethtool.c])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/ethtool.8 new/ethtool-7.1/ethtool.8
--- old/ethtool-7.0/ethtool.8   2026-04-28 15:05:06.000000000 +0200
+++ new/ethtool-7.1/ethtool.8   2026-07-06 23:39:22.000000000 +0200
@@ -117,7 +117,7 @@
 .  hy \\n(HY
 ..
 .
-.TH ETHTOOL 8 "Apr 2026" "Ethtool version 7.0"
+.TH ETHTOOL 8 "Jul 2026" "Ethtool version 7.1"
 .SH NAME
 ethtool \- query or control network driver and hardware settings
 .
@@ -198,6 +198,8 @@
 .BN tx\-aggr\-max\-bytes
 .BN tx\-aggr\-max\-frames
 .BN tx\-aggr\-time\-usecs
+.BN rx\-cqe\-frames
+.BN rx\-cqe\-nsecs
 .HP
 .B ethtool \-g|\-\-show\-ring
 .I devname
@@ -401,6 +403,7 @@
 .I devname
 .B2 raw on off
 .B2 hex on off
+.B2 pages on off
 .BN offset
 .BN length
 .BN page
@@ -934,7 +937,7 @@
 0x40000        10000baseKX4 Full
 0x80000        10000baseKR Full
 0x100000       10000baseR_FEC
-0x40000000000  10000baseCR Full
+0x40000000000  10000baseCR Full        (a.k.a 10G_SFI_DA, SFF-8431 Appendix-E)
 0x80000000000  10000baseSR Full
 0x100000000000 10000baseLR Full
 0x200000000000 10000baseLRM Full
@@ -1429,6 +1432,24 @@
 and
 .I length
 parameters are treated relatively to EEPROM page boundaries.
+When
+.B hex on pages on
+is specified, dumps all relevant EEPROM pages in hex, organized by page.
+Each page is preceded by a header identifying the page number. For banked 
pages,
+the bank number is also shown, and for SFP modules, the I2C address is also
+shown, as different parts of the EEPROM memory map are accessible via different
+I2C addresses. The set of pages dumped matches what the pretty-printer reads 
for
+each module type. This option cannot be combined with
+.I offset, length, page, bank
+or
+.I i2c
+parameters. When combined with
+.BI \-\-json ,
+the output is a JSON object with a "pages" array. Each element is an
+object with the fields "bank", "page", "offset", "i2c_address" and "data",
+emitted unconditionally regardless of module type. "data" is an array of
+lowercase hex strings, one per byte; its length is the length of the
+memory block.
 .TP
 .B \-\-show\-priv\-flags
 Queries the specified network device for its private flags.  The
@@ -1550,7 +1571,13 @@
 Get the current tx copybreak buffer size in bytes.
 .TP
 .B pfc\-prevention\-tout
-Get the current pfc prevention timeout value in msecs.
+Get the PFC storm prevention timeout value in milliseconds.
+This timeout value applies to both PFC (Priority Flow Control) and standard
+link-level pause storms (IEEE 802.3x). A pause storm occurs when a device
+continously sends TX pause frames to the switch, resulting in persistent
+backpressure. When enabled, if the NIC detects that pause assertion has
+exceeded the configured timeout, the device takes protective action (stops
+sending pause frames) to prevent a complete traffic stall.
 .RE
 .TP
 .B \-\-set\-tunable
@@ -1567,7 +1594,16 @@
 Set the tx copybreak buffer size in bytes.
 .TP
 .BI pfc\-prevention\-tout \ N
-Set pfc prevention timeout in msecs. Value of 0 means disable and 65535 means 
auto.
+Set the PFC storm prevention timeout in milliseconds. The range of valid
+values is device specific. Special values:
+.RS 4
+.TP
+.B 0
+Disable storm prevention.
+.TP
+.B 65535
+Use device-local default timeout (auto).
+.RE
 .RE
 .TP
 .B \-\-reset
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/ethtool.8.in new/ethtool-7.1/ethtool.8.in
--- old/ethtool-7.0/ethtool.8.in        2026-04-28 15:04:53.000000000 +0200
+++ new/ethtool-7.1/ethtool.8.in        2026-07-06 23:18:24.000000000 +0200
@@ -117,7 +117,7 @@
 .  hy \\n(HY
 ..
 .
-.TH ETHTOOL 8 "Apr 2026" "Ethtool version @VERSION@"
+.TH ETHTOOL 8 "Jul 2026" "Ethtool version @VERSION@"
 .SH NAME
 ethtool \- query or control network driver and hardware settings
 .
@@ -198,6 +198,8 @@
 .BN tx\-aggr\-max\-bytes
 .BN tx\-aggr\-max\-frames
 .BN tx\-aggr\-time\-usecs
+.BN rx\-cqe\-frames
+.BN rx\-cqe\-nsecs
 .HP
 .B ethtool \-g|\-\-show\-ring
 .I devname
@@ -401,6 +403,7 @@
 .I devname
 .B2 raw on off
 .B2 hex on off
+.B2 pages on off
 .BN offset
 .BN length
 .BN page
@@ -934,7 +937,7 @@
 0x40000        10000baseKX4 Full
 0x80000        10000baseKR Full
 0x100000       10000baseR_FEC
-0x40000000000  10000baseCR Full
+0x40000000000  10000baseCR Full        (a.k.a 10G_SFI_DA, SFF-8431 Appendix-E)
 0x80000000000  10000baseSR Full
 0x100000000000 10000baseLR Full
 0x200000000000 10000baseLRM Full
@@ -1429,6 +1432,24 @@
 and
 .I length
 parameters are treated relatively to EEPROM page boundaries.
+When
+.B hex on pages on
+is specified, dumps all relevant EEPROM pages in hex, organized by page.
+Each page is preceded by a header identifying the page number. For banked 
pages,
+the bank number is also shown, and for SFP modules, the I2C address is also
+shown, as different parts of the EEPROM memory map are accessible via different
+I2C addresses. The set of pages dumped matches what the pretty-printer reads 
for
+each module type. This option cannot be combined with
+.I offset, length, page, bank
+or
+.I i2c
+parameters. When combined with
+.BI \-\-json ,
+the output is a JSON object with a "pages" array. Each element is an
+object with the fields "bank", "page", "offset", "i2c_address" and "data",
+emitted unconditionally regardless of module type. "data" is an array of
+lowercase hex strings, one per byte; its length is the length of the
+memory block.
 .TP
 .B \-\-show\-priv\-flags
 Queries the specified network device for its private flags.  The
@@ -1550,7 +1571,13 @@
 Get the current tx copybreak buffer size in bytes.
 .TP
 .B pfc\-prevention\-tout
-Get the current pfc prevention timeout value in msecs.
+Get the PFC storm prevention timeout value in milliseconds.
+This timeout value applies to both PFC (Priority Flow Control) and standard
+link-level pause storms (IEEE 802.3x). A pause storm occurs when a device
+continously sends TX pause frames to the switch, resulting in persistent
+backpressure. When enabled, if the NIC detects that pause assertion has
+exceeded the configured timeout, the device takes protective action (stops
+sending pause frames) to prevent a complete traffic stall.
 .RE
 .TP
 .B \-\-set\-tunable
@@ -1567,7 +1594,16 @@
 Set the tx copybreak buffer size in bytes.
 .TP
 .BI pfc\-prevention\-tout \ N
-Set pfc prevention timeout in msecs. Value of 0 means disable and 65535 means 
auto.
+Set the PFC storm prevention timeout in milliseconds. The range of valid
+values is device specific. Special values:
+.RS 4
+.TP
+.B 0
+Disable storm prevention.
+.TP
+.B 65535
+Use device-local default timeout (auto).
+.RE
 .RE
 .TP
 .B \-\-reset
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/ethtool.c new/ethtool-7.1/ethtool.c
--- old/ethtool-7.0/ethtool.c   2026-04-28 12:45:15.000000000 +0200
+++ new/ethtool-7.1/ethtool.c   2026-07-06 21:44:29.000000000 +0200
@@ -5925,6 +5925,8 @@
                          "             [tx-aggr-max-bytes N]\n"
                          "             [tx-aggr-max-frames N]\n"
                          "             [tx-aggr-time-usecs N]\n"
+                         "             [rx-cqe-frames N]\n"
+                         "             [rx-cqe-nsecs N]\n"
        },
        {
                .opts   = "-g|--show-ring",
@@ -6163,6 +6165,7 @@
                .help   = "Query/Decode Module EEPROM information and optical 
diagnostics if available",
                .xhelp  = "             [ raw on|off ]\n"
                          "             [ hex on|off ]\n"
+                         "             [ pages on|off ]\n"
                          "             [ offset N ]\n"
                          "             [ length N ]\n"
                          "             [ page N ]\n"
@@ -6414,6 +6417,7 @@
        fprintf(stdout, "\n");
        fprintf(stdout, "FLAGS:\n");
        fprintf(stdout, "       --debug MASK    turn on debugging messages\n");
+       fprintf(stdout, "       --disable-netlink       do not use netlink, 
fall back to ioctl interface\n");
        fprintf(stdout, "       -j|--json       enable JSON output format (not 
supported by all commands)\n");
        fprintf(stdout, "       -I|--include-statistics         request device 
statistics related to the command (not supported by all commands)\n");
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/ethtool.spec new/ethtool-7.1/ethtool.spec
--- old/ethtool-7.0/ethtool.spec        2026-04-28 15:05:06.000000000 +0200
+++ new/ethtool-7.1/ethtool.spec        2026-07-06 23:39:24.000000000 +0200
@@ -1,5 +1,5 @@
 Name           : ethtool
-Version                : 7.0
+Version                : 7.1
 Release                : 1
 Group          : Utilities
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/internal.h new/ethtool-7.1/internal.h
--- old/ethtool-7.0/internal.h  2026-03-23 19:00:01.000000000 +0100
+++ new/ethtool-7.1/internal.h  2026-07-06 21:43:40.000000000 +0200
@@ -381,14 +381,14 @@
 
 /* Module EEPROM parsing code */
 void sff8079_show_all_ioctl(const __u8 *id);
-int sff8079_show_all_nl(struct cmd_context *ctx);
+int sff8079_show_all_nl(struct cmd_context *ctx, bool dump_pages);
 
 /* Optics diagnostics */
 void sff8472_show_all(const __u8 *id);
 
 /* QSFP Optics diagnostics */
 void sff8636_show_all_ioctl(const __u8 *id, __u32 eeprom_len);
-int sff8636_show_all_nl(struct cmd_context *ctx);
+int sff8636_show_all_nl(struct cmd_context *ctx, bool dump_pages);
 
 /* FUJITSU Extended Socket network device */
 int fjes_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/module-common.c 
new/ethtool-7.1/module-common.c
--- old/ethtool-7.0/module-common.c     2025-11-19 23:18:51.000000000 +0100
+++ new/ethtool-7.1/module-common.c     2026-07-06 21:43:40.000000000 +0200
@@ -656,3 +656,39 @@
        PRINT_VCC_ALL("Module voltage", "module_voltage_measurement",
                      sd->sfp_voltage[MCURR]);
 }
+
+/* Print one EEPROM memory block with a descriptive header followed by hex
+ * dump. The header is selected by the dump->print_i2c and dump->print_bank
+ * flags: "Page: 0xN" is always printed, an I2C-addressed block prints
+ * "I2C Address: 0xN" and a banked page prints "Bank: 0xN".
+ *
+ * In JSON context, all fields (bank, page, offset, i2c_address) are emitted
+ * unconditionally as a JSON object inside the enclosing "pages" array.
+ */
+void module_dump_eeprom_hex(const struct module_eeprom_dump *dump)
+{
+       u32 i;
+
+       if (is_json_context()) {
+               open_json_object(NULL);
+               print_uint(PRINT_JSON, "bank", "%u", dump->bank);
+               print_uint(PRINT_JSON, "page", "%u", dump->page);
+               print_uint(PRINT_JSON, "offset", "%u", dump->offset);
+               print_uint(PRINT_JSON, "i2c_address", "%u", dump->i2c_address);
+               open_json_array("data", "");
+               for (i = 0; i < dump->length; i++)
+                       print_hex(PRINT_JSON, NULL, "%02x", dump->data[i]);
+               close_json_array("");
+               close_json_object();
+               return;
+       }
+
+       if (dump->print_i2c)
+               printf("I2C Address: 0x%02x\n", dump->i2c_address);
+       if (dump->print_bank)
+               printf("Bank: 0x%x\n", dump->bank);
+       printf("Page: 0x%x\n\n", dump->page);
+
+       dump_hex(stdout, dump->data, dump->length, dump->offset);
+       printf("\n");
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/module-common.h 
new/ethtool-7.1/module-common.h
--- old/ethtool-7.0/module-common.h     2025-06-23 22:25:49.000000000 +0200
+++ new/ethtool-7.1/module-common.h     2026-07-06 21:43:40.000000000 +0200
@@ -261,6 +261,17 @@
        __u8 adver_value;       /* Supported if (offset & value) != 0. */
 };
 
+struct module_eeprom_dump {
+       u32 offset;
+       u32 length;
+       u8 page;
+       u8 bank;
+       u8 i2c_address;
+       bool print_bank;
+       bool print_i2c;
+       const u8 *data;
+};
+
 extern const struct module_aw_mod module_aw_mod_flags[];
 extern const struct module_aw_chan module_aw_chan_flags[];
 
@@ -283,5 +294,6 @@
 void module_show_connector(const __u8 *id, int ctor_offset);
 void module_show_mit_compliance(u16 value);
 void module_show_dom_mod_lvl_monitors(const struct sff_diags *sd);
+void module_dump_eeprom_hex(const struct module_eeprom_dump *dump);
 
 #endif /* MODULE_COMMON_H__ */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/netlink/coalesce.c 
new/ethtool-7.1/netlink/coalesce.c
--- old/ethtool-7.0/netlink/coalesce.c  2026-04-28 12:45:15.000000000 +0200
+++ new/ethtool-7.1/netlink/coalesce.c  2026-07-06 21:43:40.000000000 +0200
@@ -96,6 +96,11 @@
        show_u32("tx-aggr-time-usecs", "tx-aggr-time-usecs:\t",
                 tb[ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS]);
        show_cr();
+       show_u32("rx-cqe-frames", "rx-cqe-frames:\t\t",
+                tb[ETHTOOL_A_COALESCE_RX_CQE_FRAMES]);
+       show_u32("rx-cqe-nsecs", "rx-cqe-nsecs:\t\t",
+                tb[ETHTOOL_A_COALESCE_RX_CQE_NSECS]);
+       show_cr();
 
        close_json_object();
 
@@ -292,6 +297,18 @@
                .handler        = nl_parse_direct_u32,
                .min_argc       = 1,
        },
+       {
+               .arg            = "rx-cqe-frames",
+               .type           = ETHTOOL_A_COALESCE_RX_CQE_FRAMES,
+               .handler        = nl_parse_direct_u32,
+               .min_argc       = 1,
+       },
+       {
+               .arg            = "rx-cqe-nsecs",
+               .type           = ETHTOOL_A_COALESCE_RX_CQE_NSECS,
+               .handler        = nl_parse_direct_u32,
+               .min_argc       = 1,
+       },
        {}
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/netlink/desc-ethtool.c 
new/ethtool-7.1/netlink/desc-ethtool.c
--- old/ethtool-7.0/netlink/desc-ethtool.c      2026-04-28 13:34:19.000000000 
+0200
+++ new/ethtool-7.1/netlink/desc-ethtool.c      2026-07-06 21:43:40.000000000 
+0200
@@ -249,6 +249,8 @@
        NLATTR_DESC_U32(ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS),
        NLATTR_DESC_NESTED(ETHTOOL_A_COALESCE_RX_PROFILE, profile),
        NLATTR_DESC_NESTED(ETHTOOL_A_COALESCE_TX_PROFILE, profile),
+       NLATTR_DESC_U32(ETHTOOL_A_COALESCE_RX_CQE_FRAMES),
+       NLATTR_DESC_U32(ETHTOOL_A_COALESCE_RX_CQE_NSECS),
 };
 
 static const struct pretty_nla_desc __pause_stats_desc[] = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/netlink/fec.c 
new/ethtool-7.1/netlink/fec.c
--- old/ethtool-7.0/netlink/fec.c       2026-01-05 17:57:34.000000000 +0100
+++ new/ethtool-7.1/netlink/fec.c       2026-07-06 21:43:40.000000000 +0200
@@ -166,6 +166,8 @@
                if (lanes) {
                        close_json_array("");
                        printf(" ]\n");
+               } else {
+                       printf("\n");
                }
 
                close_json_object();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/netlink/module-eeprom.c 
new/ethtool-7.1/netlink/module-eeprom.c
--- old/ethtool-7.0/netlink/module-eeprom.c     2025-06-23 22:25:49.000000000 
+0200
+++ new/ethtool-7.1/netlink/module-eeprom.c     2026-07-06 21:43:40.000000000 
+0200
@@ -25,6 +25,7 @@
        unsigned long present;
        u8 dump_hex;
        u8 dump_raw;
+       u8 dump_pages;
        u32 offset;
        u32 length;
        u32 page;
@@ -83,6 +84,12 @@
                .dest_offset    = offsetof(struct cmd_params, i2c_address),
                .min_argc       = 1,
        },
+       {
+               .arg            = "pages",
+               .handler        = nl_parse_u8bool,
+               .dest_offset    = offsetof(struct cmd_params, dump_pages),
+               .min_argc       = 1,
+       },
        {}
 };
 
@@ -207,7 +214,7 @@
        return 0;
 }
 
-static int eeprom_parse(struct cmd_context *ctx)
+static int eeprom_parse(struct cmd_context *ctx, bool dump_pages 
__maybe_unused)
 {
        struct ethtool_module_eeprom request = {
                .length = 1,
@@ -228,18 +235,18 @@
        case MODULE_ID_GBIC:
        case MODULE_ID_SOLDERED_MODULE:
        case MODULE_ID_SFP:
-               return sff8079_show_all_nl(ctx);
+               return sff8079_show_all_nl(ctx, dump_pages);
        case MODULE_ID_QSFP:
        case MODULE_ID_QSFP28:
        case MODULE_ID_QSFP_PLUS:
-               return sff8636_show_all_nl(ctx);
+               return sff8636_show_all_nl(ctx, dump_pages);
        case MODULE_ID_QSFP_DD:
        case MODULE_ID_OSFP:
        case MODULE_ID_DSFP:
        case MODULE_ID_QSFP_PLUS_CMIS:
        case MODULE_ID_SFP_DD_CMIS:
        case MODULE_ID_SFP_PLUS_CMIS:
-               return cmis_show_all_nl(ctx);
+               return cmis_show_all_nl(ctx, dump_pages);
 #endif
        default:
                /* If we cannot recognize the memory map, default to dumping
@@ -272,10 +279,28 @@
                return -EINVAL;
        }
 
+       if (getmodule_cmd_params.dump_pages && !getmodule_cmd_params.dump_hex) {
+               fprintf(stderr, "Pages dump requires hex on\n");
+               return -EINVAL;
+       }
+
+       if (getmodule_cmd_params.dump_pages &&
+           (getmodule_cmd_params.present & (1 << PARAM_PAGE |
+                                            1 << PARAM_BANK |
+                                            1 << PARAM_OFFSET |
+                                            1 << PARAM_LENGTH |
+                                            1 << PARAM_I2C))) {
+               fprintf(stderr,
+                       "Pages dump cannot be combined with offset, length, 
page, bank or i2c\n");
+               return -EINVAL;
+       }
+
        /* When complete hex/raw dump of the EEPROM is requested, fallback to
-        * ioctl. Netlink can only request specific pages.
+        * ioctl. Netlink can only request specific pages. Skip fallback when
+        * pages dump is requested, as it handles page selection internally.
         */
        if ((getmodule_cmd_params.dump_hex || getmodule_cmd_params.dump_raw) &&
+           !getmodule_cmd_params.dump_pages &&
            !(getmodule_cmd_params.present & (1 << PARAM_PAGE |
                                              1 << PARAM_BANK |
                                              1 << PARAM_I2C))) {
@@ -300,7 +325,11 @@
        if (request.page && !request.offset)
                request.offset = 128;
 
-       if (getmodule_cmd_params.dump_hex || getmodule_cmd_params.dump_raw) {
+       if (getmodule_cmd_params.dump_pages) {
+               ret = eeprom_parse(ctx, true);
+               if (ret < 0)
+                       goto cleanup;
+       } else if (getmodule_cmd_params.dump_hex || 
getmodule_cmd_params.dump_raw) {
                ret = nl_get_eeprom_page(ctx, &request);
                if (ret < 0)
                        goto cleanup;
@@ -311,7 +340,7 @@
                        dump_hex(stdout, request.data, request.length,
                                 request.offset);
        } else {
-               ret = eeprom_parse(ctx);
+               ret = eeprom_parse(ctx, false);
                if (ret < 0)
                        goto cleanup;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/netlink/pause.c 
new/ethtool-7.1/netlink/pause.c
--- old/ethtool-7.0/netlink/pause.c     2026-04-28 12:45:15.000000000 +0200
+++ new/ethtool-7.1/netlink/pause.c     2026-07-06 21:43:40.000000000 +0200
@@ -116,6 +116,7 @@
        } stats[] = {
                { ETHTOOL_A_PAUSE_STAT_TX_FRAMES, "tx_pause_frames" },
                { ETHTOOL_A_PAUSE_STAT_RX_FRAMES, "rx_pause_frames" },
+               { ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS, 
"tx_pause_storm_events" },
        };
        bool header = false;
        unsigned int i;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/qsfp.c new/ethtool-7.1/qsfp.c
--- old/ethtool-7.0/qsfp.c      2025-06-23 22:25:49.000000000 +0200
+++ new/ethtool-7.1/qsfp.c      2026-07-06 21:43:40.000000000 +0200
@@ -62,9 +62,11 @@
 #include "cmis.h"
 #include "netlink/extapi.h"
 
+#define SFF8636_MAX_PAGES      4
+
 struct sff8636_memory_map {
        const __u8 *lower_memory;
-       const __u8 *upper_memory[4];
+       const __u8 *upper_memory[SFF8636_MAX_PAGES];
 #define page_00h upper_memory[0x0]
 #define page_03h upper_memory[0x3]
 };
@@ -451,6 +453,10 @@
                sprintf(value, "%s", "SONET: OC-48, short reach");
 
        /* SAS/SATA Compliance Codes */
+       if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_24G))
+               sprintf(value, "%s", "SAS 24.0G");
+       if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_12G))
+               sprintf(value, "%s", "SAS 12.0G");
        if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_6G))
                sprintf(value, "%s", "SAS 6.0G");
        if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_3G))
@@ -528,6 +534,8 @@
                sprintf(value, "%s", "FC: 1600 MBytes/sec");
        if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_400_MBPS)
                sprintf(value, "%s", "FC: 400 MBytes/sec");
+       if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_3200_MBPS)
+               sprintf(value, "%s", "FC: 3200 MBytes/sec");
        if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_200_MBPS)
                sprintf(value, "%s", "FC: 200 MBytes/sec");
        if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_100_MBPS)
@@ -1078,21 +1086,72 @@
        return 0;
 }
 
-int sff8636_show_all_nl(struct cmd_context *ctx)
+static void sff8636_hex_dump(struct cmd_context *ctx,
+                            const struct sff8636_memory_map *map)
 {
-       struct sff8636_memory_map map = {};
-       int ret;
+       struct module_eeprom_dump dump = {
+               .length = SFF8636_PAGE_SIZE,
+               .i2c_address = SFF8636_I2C_ADDRESS,
+       };
+       u8 page;
 
        new_json_obj(ctx->json);
+       if (is_json_context()) {
+               open_json_object(NULL);
+               open_json_array("pages", "");
+       }
+
+       dump.data = map->lower_memory;
+       module_dump_eeprom_hex(&dump);
+
+       for (page = 0; page < SFF8636_MAX_PAGES; page++) {
+               const __u8 *buf = map->upper_memory[page];
+
+               if (!buf)
+                       continue;
+
+               /* Upper memory starts at one page size into the
+                * buffer, since pages are accessed at offset between
+                * page size and twice the page size.
+                */
+               dump.offset = SFF8636_PAGE_SIZE;
+               dump.page = page;
+               dump.data = buf + SFF8636_PAGE_SIZE;
+               module_dump_eeprom_hex(&dump);
+       }
+
+       if (is_json_context()) {
+               close_json_array("");
+               close_json_object();
+       }
+       delete_json_obj();
+}
+
+static void sff8636_pretty_print(struct cmd_context *ctx,
+                                const struct sff8636_memory_map *map)
+{
+       new_json_obj(ctx->json);
        open_json_object(NULL);
 
+       sff8636_show_all_common(map);
+
+       close_json_object();
+       delete_json_obj();
+}
+
+int sff8636_show_all_nl(struct cmd_context *ctx, bool dump_pages)
+{
+       struct sff8636_memory_map map = {};
+       int ret;
+
        ret = sff8636_memory_map_init_pages(ctx, &map);
        if (ret < 0)
                return ret;
-       sff8636_show_all_common(&map);
 
-       close_json_object();
-       delete_json_obj();
+       if (dump_pages)
+               sff8636_hex_dump(ctx, &map);
+       else
+               sff8636_pretty_print(ctx, &map);
 
        return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/qsfp.h new/ethtool-7.1/qsfp.h
--- old/ethtool-7.0/qsfp.h      2025-06-23 22:25:49.000000000 +0200
+++ new/ethtool-7.1/qsfp.h      2026-07-06 21:43:40.000000000 +0200
@@ -217,6 +217,7 @@
 
 /* SAS/SATA Complaince Codes - 133 */
 #define        SFF8636_SAS_COMP_OFFSET         0x85
+#define         SFF8636_SAS_24G                        (1 << 7)
 #define         SFF8636_SAS_12G                        (1 << 6)
 #define         SFF8636_SAS_6G                         (1 << 5)
 #define         SFF8636_SAS_3G                         (1 << 4)
@@ -269,6 +270,7 @@
 #define         SFF8636_FC_SPEED_800_MBPS              (1 << 6)
 #define         SFF8636_FC_SPEED_1600_MBPS             (1 << 5)
 #define         SFF8636_FC_SPEED_400_MBPS              (1 << 4)
+#define         SFF8636_FC_SPEED_3200_MBPS             (1 << 3)
 #define         SFF8636_FC_SPEED_200_MBPS              (1 << 2)
 #define         SFF8636_FC_SPEED_100_MBPS              (1 << 0)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/sfpid.c new/ethtool-7.1/sfpid.c
--- old/ethtool-7.0/sfpid.c     2026-04-08 00:22:06.000000000 +0200
+++ new/ethtool-7.1/sfpid.c     2026-07-06 21:43:40.000000000 +0200
@@ -73,7 +73,7 @@
        /* 10G Ethernet Compliance Codes */
        if (id[3] & (1 << 7))
                sprintf(value, "%s",
-                       "10G Ethernet: 10G Base-LRM [SFF-8472 rev10.4 
onwards]");
+                       "10G Ethernet: 10G Base-ER [SFF-8472 rev10.4 onwards]");
        if (id[3] & (1 << 6))
                sprintf(value, "%s", "10G Ethernet: 10G Base-LRM");
        if (id[3] & (1 << 5))
@@ -188,8 +188,12 @@
                sprintf(value, "%s", "FC: 1200 MBytes/sec");
        if (id[10] & (1 << 6))
                sprintf(value, "%s", "FC: 800 MBytes/sec");
+       if (id[10] & (1 << 5))
+               sprintf(value, "%s", "FC: 1600 MBytes/sec");
        if (id[10] & (1 << 4))
                sprintf(value, "%s", "FC: 400 MBytes/sec");
+       if (id[10] & (1 << 3))
+               sprintf(value, "%s", "FC: 3200 MBytes/sec");
        if (id[10] & (1 << 2))
                sprintf(value, "%s", "FC: 200 MBytes/sec");
        if (id[10] & (1 << 0))
@@ -498,8 +502,54 @@
        return ret;
 }
 
-int sff8079_show_all_nl(struct cmd_context *ctx)
+static void sff8079_hex_dump(struct cmd_context *ctx, const u8 *buf,
+                            bool a2h_present)
 {
+       struct module_eeprom_dump dump = {
+               .length = SFF8079_PAGE_SIZE,
+               .print_i2c = true,
+       };
+
+       new_json_obj(ctx->json);
+       if (is_json_context()) {
+               open_json_object(NULL);
+               open_json_array("pages", "");
+       }
+
+       dump.i2c_address = SFF8079_I2C_ADDRESS_LOW;
+       dump.data = buf;
+       module_dump_eeprom_hex(&dump);
+
+       if (a2h_present) {
+               dump.i2c_address = SFF8079_I2C_ADDRESS_HIGH;
+               dump.data = buf + ETH_MODULE_SFF_8079_LEN;
+               module_dump_eeprom_hex(&dump);
+       }
+
+       if (is_json_context()) {
+               close_json_array("");
+               close_json_object();
+       }
+       delete_json_obj();
+}
+
+static void sff8079_pretty_print(struct cmd_context *ctx, const u8 *buf,
+                                bool a2h_present)
+{
+       new_json_obj(ctx->json);
+       open_json_object(NULL);
+       sff8079_show_all_common(buf);
+
+       if (a2h_present)
+               sff8472_show_all(buf);
+
+       close_json_object();
+       delete_json_obj();
+}
+
+int sff8079_show_all_nl(struct cmd_context *ctx, bool dump_pages)
+{
+       bool a2h_present;
        u8 *buf;
        int ret;
 
@@ -516,26 +566,23 @@
        if (ret)
                goto out;
 
-       new_json_obj(ctx->json);
-       open_json_object(NULL);
-       sff8079_show_all_common(buf);
+       /* Check if A2h page is present */
+       a2h_present = buf[92] & (1 << 6);
 
-       /* Finish if A2h page is not present */
-       if (!(buf[92] & (1 << 6)))
-               goto out_json;
-
-       /* Read A2h page */
-       ret = sff8079_get_eeprom_page(ctx, SFF8079_I2C_ADDRESS_HIGH,
-                                     buf + ETH_MODULE_SFF_8079_LEN);
-       if (ret) {
-               fprintf(stderr, "Failed to read Page A2h.\n");
-               goto out_json;
+       if (a2h_present) {
+               /* Read A2h page */
+               ret = sff8079_get_eeprom_page(ctx, SFF8079_I2C_ADDRESS_HIGH,
+                                             buf + ETH_MODULE_SFF_8079_LEN);
+               if (ret) {
+                       fprintf(stderr, "Failed to read Page A2h\n");
+                       goto out;
+               }
        }
 
-       sff8472_show_all(buf);
-out_json:
-       close_json_object();
-       delete_json_obj();
+       if (dump_pages)
+               sff8079_hex_dump(ctx, buf, a2h_present);
+       else
+               sff8079_pretty_print(ctx, buf, a2h_present);
 out:
        free(buf);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/shell-completion/bash/ethtool 
new/ethtool-7.1/shell-completion/bash/ethtool
--- old/ethtool-7.0/shell-completion/bash/ethtool       2026-04-28 
12:45:15.000000000 +0200
+++ new/ethtool-7.1/shell-completion/bash/ethtool       2026-07-06 
21:44:29.000000000 +0200
@@ -259,6 +259,8 @@
                [tx-aggr-max-bytes]=1
                [tx-aggr-max-frames]=1
                [tx-aggr-time-usecs]=1
+               [rx-cqe-frames]=1
+               [rx-cqe-nsecs]=1
        )
 
        case "$prev" in
@@ -669,11 +671,13 @@
                [hex]=1
                [length]=1
                [offset]=1
+               [pages]=1
                [raw]=1
        )
 
        case "$prev" in
                hex|\
+               pages|\
                raw)
                        COMPREPLY=( $( compgen -W 'on off' -- "$cur" ) )
                        return ;;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/uapi/linux/const.h 
new/ethtool-7.1/uapi/linux/const.h
--- old/ethtool-7.0/uapi/linux/const.h  2026-04-28 12:45:32.000000000 +0200
+++ new/ethtool-7.1/uapi/linux/const.h  2026-07-06 22:34:39.000000000 +0200
@@ -50,4 +50,22 @@
 
 #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
 
+/*
+ * Divide positive or negative dividend by positive or negative divisor
+ * and round to closest integer. Result is undefined for negative
+ * divisors if the dividend variable type is unsigned and for negative
+ * dividends if the divisor variable type is unsigned.
+ */
+#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor)         \
+({                                                     \
+       __typeof__(x) __x = x;                          \
+       __typeof__(divisor) __d = divisor;              \
+                                                       \
+       (((__typeof__(x))-1) > 0 ||                     \
+        ((__typeof__(divisor))-1) > 0 ||               \
+        (((__x) > 0) == ((__d) > 0))) ?                \
+               (((__x) + ((__d) / 2)) / (__d)) :       \
+               (((__x) - ((__d) / 2)) / (__d));        \
+})
+
 #endif /* _LINUX_CONST_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/uapi/linux/ethtool.h 
new/ethtool-7.1/uapi/linux/ethtool.h
--- old/ethtool-7.0/uapi/linux/ethtool.h        2026-04-28 12:45:32.000000000 
+0200
+++ new/ethtool-7.1/uapi/linux/ethtool.h        2026-07-06 22:34:39.000000000 
+0200
@@ -225,7 +225,7 @@
        ETHTOOL_ID_UNSPEC,
        ETHTOOL_RX_COPYBREAK,
        ETHTOOL_TX_COPYBREAK,
-       ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
+       ETHTOOL_PFC_PREVENTION_TOUT, /* both pause and pfc, see man ethtool */
        ETHTOOL_TX_COPYBREAK_BUF_SIZE,
        /*
         * Add your fresh new tunable attribute above and remember to update
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/uapi/linux/ethtool_netlink_generated.h 
new/ethtool-7.1/uapi/linux/ethtool_netlink_generated.h
--- old/ethtool-7.0/uapi/linux/ethtool_netlink_generated.h      2026-04-28 
12:45:32.000000000 +0200
+++ new/ethtool-7.1/uapi/linux/ethtool_netlink_generated.h      2026-07-06 
22:34:39.000000000 +0200
@@ -371,6 +371,8 @@
        ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS,
        ETHTOOL_A_COALESCE_RX_PROFILE,
        ETHTOOL_A_COALESCE_TX_PROFILE,
+       ETHTOOL_A_COALESCE_RX_CQE_FRAMES,
+       ETHTOOL_A_COALESCE_RX_CQE_NSECS,
 
        __ETHTOOL_A_COALESCE_CNT,
        ETHTOOL_A_COALESCE_MAX = (__ETHTOOL_A_COALESCE_CNT - 1)
@@ -381,6 +383,7 @@
        ETHTOOL_A_PAUSE_STAT_PAD,
        ETHTOOL_A_PAUSE_STAT_TX_FRAMES,
        ETHTOOL_A_PAUSE_STAT_RX_FRAMES,
+       ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS,
 
        __ETHTOOL_A_PAUSE_STAT_CNT,
        ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-7.0/uapi/linux/if_link.h 
new/ethtool-7.1/uapi/linux/if_link.h
--- old/ethtool-7.0/uapi/linux/if_link.h        2026-04-28 12:45:32.000000000 
+0200
+++ new/ethtool-7.1/uapi/linux/if_link.h        2026-07-06 22:34:39.000000000 
+0200
@@ -742,6 +742,11 @@
  * @IFLA_BR_FDB_MAX_LEARNED
  *   Set the number of max dynamically learned FDB entries for the current
  *   bridge.
+ *
+ * @IFLA_BR_STP_MODE
+ *   Set the STP mode for the bridge, which controls how the bridge
+ *   selects between userspace and kernel STP. The valid values are
+ *   documented below in the ``BR_STP_MODE_*`` constants.
  */
 enum {
        IFLA_BR_UNSPEC,
@@ -794,11 +799,45 @@
        IFLA_BR_MCAST_QUERIER_STATE,
        IFLA_BR_FDB_N_LEARNED,
        IFLA_BR_FDB_MAX_LEARNED,
+       IFLA_BR_STP_MODE,
        __IFLA_BR_MAX,
 };
 
 #define IFLA_BR_MAX    (__IFLA_BR_MAX - 1)
 
+/**
+ * DOC: Bridge STP mode values
+ *
+ * @BR_STP_MODE_AUTO
+ *   Default. The kernel invokes the ``/sbin/bridge-stp`` helper to hand
+ *   the bridge to a userspace STP daemon (e.g. mstpd). Only attempted in
+ *   the initial network namespace; in other namespaces this falls back to
+ *   kernel STP.
+ *
+ * @BR_STP_MODE_USER
+ *   Directly enable userspace STP (``BR_USER_STP``) without invoking the
+ *   ``/sbin/bridge-stp`` helper. Works in any network namespace.
+ *   Userspace is responsible for ensuring an STP daemon manages the
+ *   bridge.
+ *
+ * @BR_STP_MODE_KERNEL
+ *   Directly enable kernel STP (``BR_KERNEL_STP``) without invoking the
+ *   helper.
+ *
+ * The mode controls how the bridge selects between userspace and kernel
+ * STP when STP is enabled via ``IFLA_BR_STP_STATE``. It can only be
+ * changed while STP is disabled (``IFLA_BR_STP_STATE`` == 0), returns
+ * ``-EBUSY`` otherwise. The default value is ``BR_STP_MODE_AUTO``.
+ */
+enum br_stp_mode {
+       BR_STP_MODE_AUTO,
+       BR_STP_MODE_USER,
+       BR_STP_MODE_KERNEL,
+       __BR_STP_MODE_MAX
+};
+
+#define BR_STP_MODE_MAX (__BR_STP_MODE_MAX - 1)
+
 struct ifla_bridge_id {
        __u8    prio[2];
        __u8    addr[6]; /* ETH_ALEN */
@@ -1294,6 +1333,11 @@
        NETKIT_L3,
 };
 
+enum netkit_pairing {
+       NETKIT_DEVICE_PAIR,
+       NETKIT_DEVICE_SINGLE,
+};
+
 /* NETKIT_SCRUB_NONE leaves clearing skb->{mark,priority} up to
  * the BPF program if attached. This also means the latter can
  * consume the two fields if they were populated earlier.
@@ -1318,6 +1362,7 @@
        IFLA_NETKIT_PEER_SCRUB,
        IFLA_NETKIT_HEADROOM,
        IFLA_NETKIT_TAILROOM,
+       IFLA_NETKIT_PAIRING,
        __IFLA_NETKIT_MAX,
 };
 #define IFLA_NETKIT_MAX        (__IFLA_NETKIT_MAX - 1)
@@ -1566,6 +1611,8 @@
        IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
        IFLA_BOND_SLAVE_PRIO,
        IFLA_BOND_SLAVE_ACTOR_PORT_PRIO,
+       IFLA_BOND_SLAVE_AD_CHURN_ACTOR_STATE,
+       IFLA_BOND_SLAVE_AD_CHURN_PARTNER_STATE,
        __IFLA_BOND_SLAVE_MAX,
 };
 

Reply via email to