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-05-06 19:17:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ethtool (Old)
 and      /work/SRC/openSUSE:Factory/.ethtool.new.30200 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ethtool"

Wed May  6 19:17:42 2026 rev:90 rq:1350992 version:7.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/ethtool/ethtool.changes  2026-04-26 
21:12:04.607292185 +0200
+++ /work/SRC/openSUSE:Factory/.ethtool.new.30200/ethtool.changes       
2026-05-06 19:18:22.090249522 +0200
@@ -1,0 +2,10 @@
+Tue Apr 28 13:15:47 UTC 2026 - Michal Kubecek <[email protected]>
+
+- update to upstream release 7.0
+  * Feature: support MSE display (--show-mse)
+  * Feature: add 2 new link_ext_state names
+  * Fix: fix index calculation in ixgbe register dump (-d)
+  * Fix: cmis wavelength tolerance output (-m)
+  * Fix: duplicate sfpid Active Cu compliance output (-m)
+
+-------------------------------------------------------------------

Old:
----
  ethtool-6.19.tar.sign
  ethtool-6.19.tar.xz

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

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

Other differences:
------------------
++++++ ethtool.spec ++++++
--- /var/tmp/diff_new_pack.3zZLZ6/_old  2026-05-06 19:18:22.742276391 +0200
+++ /var/tmp/diff_new_pack.3zZLZ6/_new  2026-05-06 19:18:22.746276555 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           ethtool
-Version:        6.19
+Version:        7.0
 Release:        0
 Summary:        Utility for examining and tuning Ethernet-based network 
interfaces
 License:        GPL-2.0-only

++++++ ethtool-6.19.tar.xz -> ethtool-7.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/Makefile.am new/ethtool-7.0/Makefile.am
--- old/ethtool-6.19/Makefile.am        2026-03-05 12:59:06.000000000 +0100
+++ new/ethtool-7.0/Makefile.am 2026-04-28 15:03:52.000000000 +0200
@@ -55,11 +55,18 @@
                  netlink/pse-pd.c \
                  netlink/phy.c \
                  netlink/tsconfig.c \
+                 netlink/mse.c \
+                 uapi/linux/const.h uapi/linux/ethtool.h \
                  uapi/linux/ethtool_netlink.h \
                  uapi/linux/ethtool_netlink_generated.h \
-                 uapi/linux/netlink.h uapi/linux/genetlink.h \
-                 uapi/linux/rtnetlink.h uapi/linux/if_link.h \
-                 uapi/linux/if.h uapi/linux/hdlc/ioctl.h
+                 uapi/linux/genetlink.h uapi/linux/hdlc/ioctl.h \
+                 uapi/linux/if.h uapi/linux/if_addr.h \
+                 uapi/linux/if_ether.h uapi/linux/if_link.h \
+                 uapi/linux/libc-compat.h uapi/linux/neighbour.h \
+                 uapi/linux/net_tstamp.h uapi/linux/netlink.h \
+                 uapi/linux/posix_types.h uapi/linux/rtnetlink.h \
+                 uapi/linux/socket.h uapi/linux/stddef.h \
+                 uapi/linux/typelimits.h uapi/linux/types.h
 AM_CPPFLAGS += @MNL_CFLAGS@
 LDADD += @MNL_LIBS@
 endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/Makefile.in new/ethtool-7.0/Makefile.in
--- old/ethtool-6.19/Makefile.in        2026-03-05 13:02:42.000000000 +0100
+++ new/ethtool-7.0/Makefile.in 2026-04-28 15:05:05.000000000 +0200
@@ -118,11 +118,18 @@
 @ETHTOOL_ENABLE_NETLINK_TRUE@            netlink/pse-pd.c \
 @ETHTOOL_ENABLE_NETLINK_TRUE@            netlink/phy.c \
 @ETHTOOL_ENABLE_NETLINK_TRUE@            netlink/tsconfig.c \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            netlink/mse.c \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/const.h 
uapi/linux/ethtool.h \
 @ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/ethtool_netlink.h \
 @ETHTOOL_ENABLE_NETLINK_TRUE@            
uapi/linux/ethtool_netlink_generated.h \
-@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/netlink.h 
uapi/linux/genetlink.h \
-@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/rtnetlink.h 
uapi/linux/if_link.h \
-@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/if.h 
uapi/linux/hdlc/ioctl.h
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/genetlink.h 
uapi/linux/hdlc/ioctl.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/if.h uapi/linux/if_addr.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/if_ether.h 
uapi/linux/if_link.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/libc-compat.h 
uapi/linux/neighbour.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/net_tstamp.h 
uapi/linux/netlink.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/posix_types.h 
uapi/linux/rtnetlink.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/socket.h 
uapi/linux/stddef.h \
+@ETHTOOL_ENABLE_NETLINK_TRUE@            uapi/linux/typelimits.h 
uapi/linux/types.h
 
 @ETHTOOL_ENABLE_NETLINK_TRUE@am__append_3 = @MNL_CFLAGS@
 @ETHTOOL_ENABLE_NETLINK_TRUE@am__append_4 = @MNL_LIBS@
@@ -179,9 +186,9 @@
        netlink/module-eeprom.c netlink/module.c netlink/rss.c \
        netlink/desc-rtnl.c netlink/cable_test.c netlink/tunnels.c \
        netlink/plca.c netlink/pse-pd.c netlink/phy.c \
-       netlink/tsconfig.c uapi/linux/ethtool_netlink.h \
-       uapi/linux/ethtool_netlink_generated.h uapi/linux/netlink.h \
-       uapi/linux/genetlink.h
+       netlink/tsconfig.c netlink/mse.c uapi/linux/ethtool_netlink.h \
+       uapi/linux/ethtool_netlink_generated.h uapi/linux/genetlink.h \
+       uapi/linux/netlink.h uapi/linux/typelimits.h
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@am__objects_1 = amd8111e.$(OBJEXT) \
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@      de2104x.$(OBJEXT) \
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@      dsa.$(OBJEXT) e100.$(OBJEXT) \
@@ -253,7 +260,8 @@
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/plca.$(OBJEXT) \
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/pse-pd.$(OBJEXT) \
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/phy.$(OBJEXT) \
-@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/tsconfig.$(OBJEXT)
+@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/tsconfig.$(OBJEXT) \
+@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/mse.$(OBJEXT)
 am_ethtool_OBJECTS = ethtool.$(OBJEXT) rxclass.$(OBJEXT) \
        common.$(OBJEXT) json_writer.$(OBJEXT) json_print.$(OBJEXT) \
        $(am__objects_1) $(am__objects_2)
@@ -291,9 +299,9 @@
        netlink/module-eeprom.c netlink/module.c netlink/rss.c \
        netlink/desc-rtnl.c netlink/cable_test.c netlink/tunnels.c \
        netlink/plca.c netlink/pse-pd.c netlink/phy.c \
-       netlink/tsconfig.c uapi/linux/ethtool_netlink.h \
-       uapi/linux/ethtool_netlink_generated.h uapi/linux/netlink.h \
-       uapi/linux/genetlink.h
+       netlink/tsconfig.c netlink/mse.c uapi/linux/ethtool_netlink.h \
+       uapi/linux/ethtool_netlink_generated.h uapi/linux/genetlink.h \
+       uapi/linux/netlink.h uapi/linux/typelimits.h
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@am__objects_3 = 
test_cmdline-amd8111e.$(OBJEXT) \
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@      test_cmdline-de2104x.$(OBJEXT) \
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@      test_cmdline-dsa.$(OBJEXT) \
@@ -368,7 +376,8 @@
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_cmdline-plca.$(OBJEXT) \
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_cmdline-pse-pd.$(OBJEXT) \
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_cmdline-phy.$(OBJEXT) \
-@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_cmdline-tsconfig.$(OBJEXT)
+@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_cmdline-tsconfig.$(OBJEXT) \
+@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_cmdline-mse.$(OBJEXT)
 am__objects_5 = test_cmdline-ethtool.$(OBJEXT) \
        test_cmdline-rxclass.$(OBJEXT) test_cmdline-common.$(OBJEXT) \
        test_cmdline-json_writer.$(OBJEXT) \
@@ -411,9 +420,9 @@
        netlink/module-eeprom.c netlink/module.c netlink/rss.c \
        netlink/desc-rtnl.c netlink/cable_test.c netlink/tunnels.c \
        netlink/plca.c netlink/pse-pd.c netlink/phy.c \
-       netlink/tsconfig.c uapi/linux/ethtool_netlink.h \
-       uapi/linux/ethtool_netlink_generated.h uapi/linux/netlink.h \
-       uapi/linux/genetlink.h
+       netlink/tsconfig.c netlink/mse.c uapi/linux/ethtool_netlink.h \
+       uapi/linux/ethtool_netlink_generated.h uapi/linux/genetlink.h \
+       uapi/linux/netlink.h uapi/linux/typelimits.h
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@am__objects_6 = 
test_features-amd8111e.$(OBJEXT) \
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@      test_features-de2104x.$(OBJEXT) \
 @ETHTOOL_ENABLE_PRETTY_DUMP_TRUE@      test_features-dsa.$(OBJEXT) \
@@ -488,7 +497,8 @@
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_features-plca.$(OBJEXT) \
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_features-pse-pd.$(OBJEXT) \
 @ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_features-phy.$(OBJEXT) \
-@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_features-tsconfig.$(OBJEXT)
+@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_features-tsconfig.$(OBJEXT) \
+@ETHTOOL_ENABLE_NETLINK_TRUE@  netlink/test_features-mse.$(OBJEXT)
 am__objects_8 = test_features-ethtool.$(OBJEXT) \
        test_features-rxclass.$(OBJEXT) test_features-common.$(OBJEXT) \
        test_features-json_writer.$(OBJEXT) \
@@ -643,14 +653,15 @@
        netlink/$(DEPDIR)/features.Po netlink/$(DEPDIR)/fec.Po \
        netlink/$(DEPDIR)/mm.Po netlink/$(DEPDIR)/module-eeprom.Po \
        netlink/$(DEPDIR)/module.Po netlink/$(DEPDIR)/monitor.Po \
-       netlink/$(DEPDIR)/msgbuff.Po netlink/$(DEPDIR)/netlink.Po \
-       netlink/$(DEPDIR)/nlsock.Po netlink/$(DEPDIR)/parser.Po \
-       netlink/$(DEPDIR)/pause.Po netlink/$(DEPDIR)/permaddr.Po \
-       netlink/$(DEPDIR)/phy.Po netlink/$(DEPDIR)/plca.Po \
-       netlink/$(DEPDIR)/prettymsg.Po netlink/$(DEPDIR)/privflags.Po \
-       netlink/$(DEPDIR)/pse-pd.Po netlink/$(DEPDIR)/rings.Po \
-       netlink/$(DEPDIR)/rss.Po netlink/$(DEPDIR)/settings.Po \
-       netlink/$(DEPDIR)/stats.Po netlink/$(DEPDIR)/strset.Po \
+       netlink/$(DEPDIR)/mse.Po netlink/$(DEPDIR)/msgbuff.Po \
+       netlink/$(DEPDIR)/netlink.Po netlink/$(DEPDIR)/nlsock.Po \
+       netlink/$(DEPDIR)/parser.Po netlink/$(DEPDIR)/pause.Po \
+       netlink/$(DEPDIR)/permaddr.Po netlink/$(DEPDIR)/phy.Po \
+       netlink/$(DEPDIR)/plca.Po netlink/$(DEPDIR)/prettymsg.Po \
+       netlink/$(DEPDIR)/privflags.Po netlink/$(DEPDIR)/pse-pd.Po \
+       netlink/$(DEPDIR)/rings.Po netlink/$(DEPDIR)/rss.Po \
+       netlink/$(DEPDIR)/settings.Po netlink/$(DEPDIR)/stats.Po \
+       netlink/$(DEPDIR)/strset.Po \
        netlink/$(DEPDIR)/test_cmdline-bitset.Po \
        netlink/$(DEPDIR)/test_cmdline-cable_test.Po \
        netlink/$(DEPDIR)/test_cmdline-channels.Po \
@@ -665,6 +676,7 @@
        netlink/$(DEPDIR)/test_cmdline-module-eeprom.Po \
        netlink/$(DEPDIR)/test_cmdline-module.Po \
        netlink/$(DEPDIR)/test_cmdline-monitor.Po \
+       netlink/$(DEPDIR)/test_cmdline-mse.Po \
        netlink/$(DEPDIR)/test_cmdline-msgbuff.Po \
        netlink/$(DEPDIR)/test_cmdline-netlink.Po \
        netlink/$(DEPDIR)/test_cmdline-nlsock.Po \
@@ -698,6 +710,7 @@
        netlink/$(DEPDIR)/test_features-module-eeprom.Po \
        netlink/$(DEPDIR)/test_features-module.Po \
        netlink/$(DEPDIR)/test_features-monitor.Po \
+       netlink/$(DEPDIR)/test_features-mse.Po \
        netlink/$(DEPDIR)/test_features-msgbuff.Po \
        netlink/$(DEPDIR)/test_features-netlink.Po \
        netlink/$(DEPDIR)/test_features-nlsock.Po \
@@ -1302,6 +1315,8 @@
        netlink/$(DEPDIR)/$(am__dirstamp)
 netlink/tsconfig.$(OBJEXT): netlink/$(am__dirstamp) \
        netlink/$(DEPDIR)/$(am__dirstamp)
+netlink/mse.$(OBJEXT): netlink/$(am__dirstamp) \
+       netlink/$(DEPDIR)/$(am__dirstamp)
 
 ethtool$(EXEEXT): $(ethtool_OBJECTS) $(ethtool_DEPENDENCIES) 
$(EXTRA_ethtool_DEPENDENCIES) 
        @rm -f ethtool$(EXEEXT)
@@ -1372,6 +1387,8 @@
        netlink/$(DEPDIR)/$(am__dirstamp)
 netlink/test_cmdline-tsconfig.$(OBJEXT): netlink/$(am__dirstamp) \
        netlink/$(DEPDIR)/$(am__dirstamp)
+netlink/test_cmdline-mse.$(OBJEXT): netlink/$(am__dirstamp) \
+       netlink/$(DEPDIR)/$(am__dirstamp)
 
 test-cmdline$(EXEEXT): $(test_cmdline_OBJECTS) $(test_cmdline_DEPENDENCIES) 
$(EXTRA_test_cmdline_DEPENDENCIES) 
        @rm -f test-cmdline$(EXEEXT)
@@ -1442,6 +1459,8 @@
        netlink/$(DEPDIR)/$(am__dirstamp)
 netlink/test_features-tsconfig.$(OBJEXT): netlink/$(am__dirstamp) \
        netlink/$(DEPDIR)/$(am__dirstamp)
+netlink/test_features-mse.$(OBJEXT): netlink/$(am__dirstamp) \
+       netlink/$(DEPDIR)/$(am__dirstamp)
 
 test-features$(EXEEXT): $(test_features_OBJECTS) $(test_features_DEPENDENCIES) 
$(EXTRA_test_features_DEPENDENCIES) 
        @rm -f test-features$(EXEEXT)
@@ -1613,6 +1632,7 @@
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/module-eeprom.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@netlink/$(DEPDIR)/module.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@netlink/$(DEPDIR)/monitor.Po@am__quote@ # 
am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@netlink/$(DEPDIR)/mse.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@netlink/$(DEPDIR)/msgbuff.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@netlink/$(DEPDIR)/netlink.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@netlink/$(DEPDIR)/nlsock.Po@am__quote@ # 
am--include-marker
@@ -1643,6 +1663,7 @@
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-module-eeprom.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-module.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-monitor.Po@am__quote@ # 
am--include-marker
+@AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-mse.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-msgbuff.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-netlink.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_cmdline-nlsock.Po@am__quote@ # 
am--include-marker
@@ -1676,6 +1697,7 @@
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-module-eeprom.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-module.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-monitor.Po@am__quote@ # 
am--include-marker
+@AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-mse.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-msgbuff.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-netlink.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@netlink/$(DEPDIR)/test_features-nlsock.Po@am__quote@ # 
am--include-marker
@@ -2869,6 +2891,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cmdline_CFLAGS) $(CFLAGS) -c -o 
netlink/test_cmdline-tsconfig.obj `if test -f 'netlink/tsconfig.c'; then 
$(CYGPATH_W) 'netlink/tsconfig.c'; else $(CYGPATH_W) 
'$(srcdir)/netlink/tsconfig.c'; fi`
 
+netlink/test_cmdline-mse.o: netlink/mse.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(test_cmdline_CFLAGS) $(CFLAGS) -MT 
netlink/test_cmdline-mse.o -MD -MP -MF netlink/$(DEPDIR)/test_cmdline-mse.Tpo 
-c -o netlink/test_cmdline-mse.o `test -f 'netlink/mse.c' || echo 
'$(srcdir)/'`netlink/mse.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
netlink/$(DEPDIR)/test_cmdline-mse.Tpo netlink/$(DEPDIR)/test_cmdline-mse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='netlink/mse.c' 
object='netlink/test_cmdline-mse.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cmdline_CFLAGS) $(CFLAGS) -c -o 
netlink/test_cmdline-mse.o `test -f 'netlink/mse.c' || echo 
'$(srcdir)/'`netlink/mse.c
+
+netlink/test_cmdline-mse.obj: netlink/mse.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(test_cmdline_CFLAGS) $(CFLAGS) -MT 
netlink/test_cmdline-mse.obj -MD -MP -MF netlink/$(DEPDIR)/test_cmdline-mse.Tpo 
-c -o netlink/test_cmdline-mse.obj `if test -f 'netlink/mse.c'; then 
$(CYGPATH_W) 'netlink/mse.c'; else $(CYGPATH_W) '$(srcdir)/netlink/mse.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
netlink/$(DEPDIR)/test_cmdline-mse.Tpo netlink/$(DEPDIR)/test_cmdline-mse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='netlink/mse.c' 
object='netlink/test_cmdline-mse.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cmdline_CFLAGS) $(CFLAGS) -c -o 
netlink/test_cmdline-mse.obj `if test -f 'netlink/mse.c'; then $(CYGPATH_W) 
'netlink/mse.c'; else $(CYGPATH_W) '$(srcdir)/netlink/mse.c'; fi`
+
 test_features-test-features.o: test-features.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(test_features_CFLAGS) $(CFLAGS) -MT 
test_features-test-features.o -MD -MP -MF 
$(DEPDIR)/test_features-test-features.Tpo -c -o test_features-test-features.o 
`test -f 'test-features.c' || echo '$(srcdir)/'`test-features.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
$(DEPDIR)/test_features-test-features.Tpo 
$(DEPDIR)/test_features-test-features.Po
@@ -4016,6 +4052,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='netlink/tsconfig.c' 
object='netlink/test_features-tsconfig.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_features_CFLAGS) $(CFLAGS) -c -o 
netlink/test_features-tsconfig.obj `if test -f 'netlink/tsconfig.c'; then 
$(CYGPATH_W) 'netlink/tsconfig.c'; else $(CYGPATH_W) 
'$(srcdir)/netlink/tsconfig.c'; fi`
+
+netlink/test_features-mse.o: netlink/mse.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(test_features_CFLAGS) $(CFLAGS) -MT 
netlink/test_features-mse.o -MD -MP -MF netlink/$(DEPDIR)/test_features-mse.Tpo 
-c -o netlink/test_features-mse.o `test -f 'netlink/mse.c' || echo 
'$(srcdir)/'`netlink/mse.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
netlink/$(DEPDIR)/test_features-mse.Tpo netlink/$(DEPDIR)/test_features-mse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='netlink/mse.c' 
object='netlink/test_features-mse.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_features_CFLAGS) $(CFLAGS) -c -o 
netlink/test_features-mse.o `test -f 'netlink/mse.c' || echo 
'$(srcdir)/'`netlink/mse.c
+
+netlink/test_features-mse.obj: netlink/mse.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(test_features_CFLAGS) $(CFLAGS) -MT 
netlink/test_features-mse.obj -MD -MP -MF 
netlink/$(DEPDIR)/test_features-mse.Tpo -c -o netlink/test_features-mse.obj `if 
test -f 'netlink/mse.c'; then $(CYGPATH_W) 'netlink/mse.c'; else $(CYGPATH_W) 
'$(srcdir)/netlink/mse.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
netlink/$(DEPDIR)/test_features-mse.Tpo netlink/$(DEPDIR)/test_features-mse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='netlink/mse.c' 
object='netlink/test_features-mse.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_features_CFLAGS) $(CFLAGS) -c -o 
netlink/test_features-mse.obj `if test -f 'netlink/mse.c'; then $(CYGPATH_W) 
'netlink/mse.c'; else $(CYGPATH_W) '$(srcdir)/netlink/mse.c'; fi`
 install-man8: $(man_MANS)
        @$(NORMAL_INSTALL)
        @list1=''; \
@@ -4747,6 +4797,7 @@
        -rm -f netlink/$(DEPDIR)/module-eeprom.Po
        -rm -f netlink/$(DEPDIR)/module.Po
        -rm -f netlink/$(DEPDIR)/monitor.Po
+       -rm -f netlink/$(DEPDIR)/mse.Po
        -rm -f netlink/$(DEPDIR)/msgbuff.Po
        -rm -f netlink/$(DEPDIR)/netlink.Po
        -rm -f netlink/$(DEPDIR)/nlsock.Po
@@ -4777,6 +4828,7 @@
        -rm -f netlink/$(DEPDIR)/test_cmdline-module-eeprom.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-module.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-monitor.Po
+       -rm -f netlink/$(DEPDIR)/test_cmdline-mse.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-msgbuff.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-netlink.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-nlsock.Po
@@ -4810,6 +4862,7 @@
        -rm -f netlink/$(DEPDIR)/test_features-module-eeprom.Po
        -rm -f netlink/$(DEPDIR)/test_features-module.Po
        -rm -f netlink/$(DEPDIR)/test_features-monitor.Po
+       -rm -f netlink/$(DEPDIR)/test_features-mse.Po
        -rm -f netlink/$(DEPDIR)/test_features-msgbuff.Po
        -rm -f netlink/$(DEPDIR)/test_features-netlink.Po
        -rm -f netlink/$(DEPDIR)/test_features-nlsock.Po
@@ -5039,6 +5092,7 @@
        -rm -f netlink/$(DEPDIR)/module-eeprom.Po
        -rm -f netlink/$(DEPDIR)/module.Po
        -rm -f netlink/$(DEPDIR)/monitor.Po
+       -rm -f netlink/$(DEPDIR)/mse.Po
        -rm -f netlink/$(DEPDIR)/msgbuff.Po
        -rm -f netlink/$(DEPDIR)/netlink.Po
        -rm -f netlink/$(DEPDIR)/nlsock.Po
@@ -5069,6 +5123,7 @@
        -rm -f netlink/$(DEPDIR)/test_cmdline-module-eeprom.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-module.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-monitor.Po
+       -rm -f netlink/$(DEPDIR)/test_cmdline-mse.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-msgbuff.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-netlink.Po
        -rm -f netlink/$(DEPDIR)/test_cmdline-nlsock.Po
@@ -5102,6 +5157,7 @@
        -rm -f netlink/$(DEPDIR)/test_features-module-eeprom.Po
        -rm -f netlink/$(DEPDIR)/test_features-module.Po
        -rm -f netlink/$(DEPDIR)/test_features-monitor.Po
+       -rm -f netlink/$(DEPDIR)/test_features-mse.Po
        -rm -f netlink/$(DEPDIR)/test_features-msgbuff.Po
        -rm -f netlink/$(DEPDIR)/test_features-netlink.Po
        -rm -f netlink/$(DEPDIR)/test_features-nlsock.Po
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/NEWS new/ethtool-7.0/NEWS
--- old/ethtool-6.19/NEWS       2026-02-23 01:02:22.000000000 +0100
+++ new/ethtool-7.0/NEWS        2026-04-28 15:04:53.000000000 +0200
@@ -1,3 +1,10 @@
+Version 7.0 - Apr 28, 2026
+       * Feature: support MSE display (--show-mse)
+       * Feature: add 2 new link_ext_state names
+       * Fix: fix index calculation in ixgbe register dump (-d)
+       * Fix: cmis wavelength tolerance output (-m)
+       * Fix: duplicate sfpid Active Cu compliance output (-m)
+
 Version 6.19 - Feb 14, 2026
        * Feature: support HW timestamp configuration (--set-hwtimestamp-cfg)
        * Feature: display HW timestamp source (-T)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/cmis.c new/ethtool-7.0/cmis.c
--- old/ethtool-6.19/cmis.c     2025-06-23 22:25:49.000000000 +0200
+++ new/ethtool-7.0/cmis.c      2026-03-23 23:16:37.000000000 +0100
@@ -276,7 +276,7 @@
                                       "nm");
                module_print_any_float("Laser wavelength tolerance",
                                       
(((map->page_01h[CMIS_WAVELENGTH_TOL_MSB] << 8) |
-                                       map->page_01h[CMIS_NOM_WAVELENGTH_LSB]) 
* 0.05),
+                                       map->page_01h[CMIS_WAVELENGTH_TOL_LSB]) 
* 0.005),
                                       "nm");
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/configure new/ethtool-7.0/configure
--- old/ethtool-6.19/configure  2026-03-05 13:02:42.000000000 +0100
+++ new/ethtool-7.0/configure   2026-04-28 15:05:05.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 6.19.
+# Generated by GNU Autoconf 2.72 for ethtool 7.0.
 #
 # Report bugs to <[email protected]>.
 #
@@ -604,8 +604,8 @@
 # Identity of this package.
 PACKAGE_NAME='ethtool'
 PACKAGE_TARNAME='ethtool'
-PACKAGE_VERSION='6.19'
-PACKAGE_STRING='ethtool 6.19'
+PACKAGE_VERSION='7.0'
+PACKAGE_STRING='ethtool 7.0'
 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 6.19 to adapt to many kinds of systems.
+'configure' configures ethtool 7.0 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 6.19:";;
+     short | recursive ) echo "Configuration of ethtool 7.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1499,7 +1499,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ethtool configure 6.19
+ethtool configure 7.0
 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 6.19, which was
+It was created by ethtool $as_me 7.0, 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='6.19'
+ VERSION='7.0'
 
 
 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 6.19, which was
+This file was extended by ethtool $as_me 7.0, 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 6.19
+ethtool config.status 7.0
 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-6.19/configure.ac 
new/ethtool-7.0/configure.ac
--- old/ethtool-6.19/configure.ac       2026-02-23 01:02:22.000000000 +0100
+++ new/ethtool-7.0/configure.ac        2026-04-28 15:04:53.000000000 +0200
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT(ethtool, 6.19, [email protected])
+AC_INIT(ethtool, 7.0, [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-6.19/ethtool.8 new/ethtool-7.0/ethtool.8
--- old/ethtool-6.19/ethtool.8  2026-03-05 13:02:42.000000000 +0100
+++ new/ethtool-7.0/ethtool.8   2026-04-28 15:05:06.000000000 +0200
@@ -117,7 +117,7 @@
 .  hy \\n(HY
 ..
 .
-.TH ETHTOOL 8 "Feb 2026" "Ethtool version 6.19"
+.TH ETHTOOL 8 "Apr 2026" "Ethtool version 7.0"
 .SH NAME
 ethtool \- query or control network driver and hardware settings
 .
@@ -639,6 +639,7 @@
 \-\-get\-plca\-status
 \-\-show-pse
 \-\-set-pse
+\-\-show-mse
 .TE
 .TP
 .B \-a \-\-show\-pause
@@ -1017,6 +1018,10 @@
 0x400000000000000000000000000000       800000baseDR4_2 Full
 0x800000000000000000000000000000       800000baseSR4 Full
 0x1000000000000000000000000000000      800000baseVR4 Full
+0x2000000000000000000000000000000      1600000baseCR8 Full
+0x4000000000000000000000000000000      1600000baseKR8 Full
+0x8000000000000000000000000000000      1600000baseDR8 Full
+0x10000000000000000000000000000000     1600000baseDR8_2 Full
 .TE
 .TP
 .BI phyad \ N
@@ -1896,13 +1901,13 @@
 .TP
 .B c33-pse-extended-state
 This attribute indicates the Extended state of the c33 PSE. The extended
-state correlated with the c33 PSE Extended Substate allows to have more
+state correlated with the c33 PSE Extended Substate allows one to have more
 detail on the c33 PSE current error state.
 It corresponds to IEEE 802.3-2022 33.2.4.4 Variables.
 .TP
 .B c33-pse-extended-substate
 This attribute indicates the Extended substate of the c33 PSE. Correlated
-with the c33 PSE Extended state value, it allows to have more detail on the
+with the c33 PSE Extended state value, it allows one to have more detail on the
 c33 PSE current error state.
 .TP
 .B c33-pse-power-class
@@ -1975,6 +1980,51 @@
 
 .RE
 .TP
+.B \-\-show\-mse
+Show PHY Mean Square Error (MSE) diagnostics.
+.RS 4
+.P
+Metrics follow the OPEN Alliance PHY diagnostics model (used by automotive and
+industrial PHYs). Numeric scaling, sampling windows, and update intervals are
+vendor specific and reported by the capability block.
+.P
+Values are raw snapshots from the PHY DSP. Lower values generally indicate
+better signal quality; 0 is ideal. Interpret values relative to the reported
+max-* scales for this PHY and link mode.
+.P
+The set of returned channels depends on PHY support. When per-channel data is
+available, Channel A/B/C/D nests are returned. Otherwise, the kernel may return
+a single WORST or LINK aggregate snapshot.
+.TP
+.B Capabilities
+Driver-provided scale and timing:
+.RS 4
+.TP
+.B max\-average\-mse
+Scale for average MSE values.
+.TP
+.B max\-peak\-mse
+Scale for peak MSE values. Present only if the PHY reports peak-mse and/or
+worst-peak-mse.
+.TP
+.B refresh\-rate\-ps
+Typical hardware update interval in picoseconds.
+.TP
+.B symbols\-per\-sample
+Number of symbols collected per hardware sample.
+.RE
+.TP
+.B Snapshots
+One nest per selector (Channel A/B/C/D, WORST, or LINK). Each contains the
+metrics supported by the PHY: average-mse and optionally peak-mse and/or
+worst-peak-mse. Values are raw and must be interpreted using the capability
+scales above.
+.P
+Short windows (low refresh-rate-ps or few symbols-per-sample) can yield high
+variance; userspace can improve stability by polling and averaging over time.
+
+.RE
+.TP
 .B \-\-flash\-module\-firmware
 Flash the transceiver module's firmware. The firmware update process is
 composed from three logical steps. Downloading a firmware image to the
@@ -2025,7 +2075,7 @@
 , this field indicates the phy_index of the upstream phy.
 .TP
 .B upstream_sfp_name
-If the PHY is withing an SFP/SFF module, this field contains the name of the
+If the PHY is within an SFP/SFF module, this field contains the name of the
 upstream SFP bus.
 
 .SH BUGS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/ethtool.8.in 
new/ethtool-7.0/ethtool.8.in
--- old/ethtool-6.19/ethtool.8.in       2026-03-05 12:59:06.000000000 +0100
+++ new/ethtool-7.0/ethtool.8.in        2026-04-28 15:04:53.000000000 +0200
@@ -117,7 +117,7 @@
 .  hy \\n(HY
 ..
 .
-.TH ETHTOOL 8 "Feb 2026" "Ethtool version @VERSION@"
+.TH ETHTOOL 8 "Apr 2026" "Ethtool version @VERSION@"
 .SH NAME
 ethtool \- query or control network driver and hardware settings
 .
@@ -639,6 +639,7 @@
 \-\-get\-plca\-status
 \-\-show-pse
 \-\-set-pse
+\-\-show-mse
 .TE
 .TP
 .B \-a \-\-show\-pause
@@ -1017,6 +1018,10 @@
 0x400000000000000000000000000000       800000baseDR4_2 Full
 0x800000000000000000000000000000       800000baseSR4 Full
 0x1000000000000000000000000000000      800000baseVR4 Full
+0x2000000000000000000000000000000      1600000baseCR8 Full
+0x4000000000000000000000000000000      1600000baseKR8 Full
+0x8000000000000000000000000000000      1600000baseDR8 Full
+0x10000000000000000000000000000000     1600000baseDR8_2 Full
 .TE
 .TP
 .BI phyad \ N
@@ -1896,13 +1901,13 @@
 .TP
 .B c33-pse-extended-state
 This attribute indicates the Extended state of the c33 PSE. The extended
-state correlated with the c33 PSE Extended Substate allows to have more
+state correlated with the c33 PSE Extended Substate allows one to have more
 detail on the c33 PSE current error state.
 It corresponds to IEEE 802.3-2022 33.2.4.4 Variables.
 .TP
 .B c33-pse-extended-substate
 This attribute indicates the Extended substate of the c33 PSE. Correlated
-with the c33 PSE Extended state value, it allows to have more detail on the
+with the c33 PSE Extended state value, it allows one to have more detail on the
 c33 PSE current error state.
 .TP
 .B c33-pse-power-class
@@ -1975,6 +1980,51 @@
 
 .RE
 .TP
+.B \-\-show\-mse
+Show PHY Mean Square Error (MSE) diagnostics.
+.RS 4
+.P
+Metrics follow the OPEN Alliance PHY diagnostics model (used by automotive and
+industrial PHYs). Numeric scaling, sampling windows, and update intervals are
+vendor specific and reported by the capability block.
+.P
+Values are raw snapshots from the PHY DSP. Lower values generally indicate
+better signal quality; 0 is ideal. Interpret values relative to the reported
+max-* scales for this PHY and link mode.
+.P
+The set of returned channels depends on PHY support. When per-channel data is
+available, Channel A/B/C/D nests are returned. Otherwise, the kernel may return
+a single WORST or LINK aggregate snapshot.
+.TP
+.B Capabilities
+Driver-provided scale and timing:
+.RS 4
+.TP
+.B max\-average\-mse
+Scale for average MSE values.
+.TP
+.B max\-peak\-mse
+Scale for peak MSE values. Present only if the PHY reports peak-mse and/or
+worst-peak-mse.
+.TP
+.B refresh\-rate\-ps
+Typical hardware update interval in picoseconds.
+.TP
+.B symbols\-per\-sample
+Number of symbols collected per hardware sample.
+.RE
+.TP
+.B Snapshots
+One nest per selector (Channel A/B/C/D, WORST, or LINK). Each contains the
+metrics supported by the PHY: average-mse and optionally peak-mse and/or
+worst-peak-mse. Values are raw and must be interpreted using the capability
+scales above.
+.P
+Short windows (low refresh-rate-ps or few symbols-per-sample) can yield high
+variance; userspace can improve stability by polling and averaging over time.
+
+.RE
+.TP
 .B \-\-flash\-module\-firmware
 Flash the transceiver module's firmware. The firmware update process is
 composed from three logical steps. Downloading a firmware image to the
@@ -2025,7 +2075,7 @@
 , this field indicates the phy_index of the upstream phy.
 .TP
 .B upstream_sfp_name
-If the PHY is withing an SFP/SFF module, this field contains the name of the
+If the PHY is within an SFP/SFF module, this field contains the name of the
 upstream SFP bus.
 
 .SH BUGS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/ethtool.c new/ethtool-7.0/ethtool.c
--- old/ethtool-6.19/ethtool.c  2026-03-05 12:59:06.000000000 +0100
+++ new/ethtool-7.0/ethtool.c   2026-04-28 12:45:15.000000000 +0200
@@ -538,6 +538,10 @@
                ETHTOOL_LINK_MODE_800000baseDR4_2_Full_BIT,
                ETHTOOL_LINK_MODE_800000baseSR4_Full_BIT,
                ETHTOOL_LINK_MODE_800000baseVR4_Full_BIT,
+               ETHTOOL_LINK_MODE_1600000baseCR8_Full_BIT,
+               ETHTOOL_LINK_MODE_1600000baseKR8_Full_BIT,
+               ETHTOOL_LINK_MODE_1600000baseDR8_Full_BIT,
+               ETHTOOL_LINK_MODE_1600000baseDR8_2_Full_BIT,
        };
        static const enum ethtool_link_mode_bit_indices
                additional_advertised_flags_bits[] = {
@@ -836,6 +840,14 @@
                  "800000baseSR4/Full" },
                { 0, ETHTOOL_LINK_MODE_800000baseVR4_Full_BIT,
                  "800000baseVR4/Full" },
+               { 0, ETHTOOL_LINK_MODE_1600000baseCR8_Full_BIT,
+                 "1600000baseCR8/Full" },
+               { 0, ETHTOOL_LINK_MODE_1600000baseKR8_Full_BIT,
+                 "1600000baseKR8/Full" },
+               { 0, ETHTOOL_LINK_MODE_1600000baseDR8_Full_BIT,
+                 "1600000baseDR8/Full" },
+               { 0, ETHTOOL_LINK_MODE_1600000baseDR8_2_Full_BIT,
+                 "1600000baseDR8_2/Full" },
        };
        int indent;
        int did1, new_line_pend;
@@ -6360,6 +6372,13 @@
                .help   = "List PHYs"
        },
        {
+               .opts   = "--show-mse",
+               .targets_phy    = true,
+               .json   = true,
+               .nlfunc = nl_gmse,
+               .help   = "Show Mean Square Error (MSE) diagnostics",
+       },
+       {
                .opts   = "-h|--help",
                .no_dev = true,
                .func   = show_usage,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/ethtool.spec 
new/ethtool-7.0/ethtool.spec
--- old/ethtool-6.19/ethtool.spec       2026-03-05 13:02:42.000000000 +0100
+++ new/ethtool-7.0/ethtool.spec        2026-04-28 15:05:06.000000000 +0200
@@ -1,5 +1,5 @@
 Name           : ethtool
-Version                : 6.19
+Version                : 7.0
 Release                : 1
 Group          : Utilities
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/internal.h new/ethtool-7.0/internal.h
--- old/ethtool-6.19/internal.h 2026-03-05 12:59:06.000000000 +0100
+++ new/ethtool-7.0/internal.h  2026-03-23 19:00:01.000000000 +0100
@@ -19,6 +19,7 @@
 #include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <limits.h>
 #include <endian.h>
 #include <sys/ioctl.h>
 #define __UAPI_DEF_IF_IFNAMSIZ 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/ixgbe.c new/ethtool-7.0/ixgbe.c
--- old/ethtool-6.19/ixgbe.c    2025-06-23 22:25:49.000000000 +0200
+++ new/ethtool-7.0/ixgbe.c     2026-03-23 23:16:37.000000000 +0100
@@ -732,7 +732,7 @@
                for (i = 0; i < 8; i++)
                        fprintf(stdout,
                        "0x%05X: RTTPT2C%d    (Tx Packet Plane T2 Config %d)    
0x%08X\n",
-                       0x0CD20 + (4 * i), i, i, regs_buff[865]);
+                       0x0CD20 + (4 * i), i, i, regs_buff[865 + i]);
 
                if (mac_type < ixgbe_mac_x550)
                        for (i = 0; i < 8; i++)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/netlink/desc-ethtool.c 
new/ethtool-7.0/netlink/desc-ethtool.c
--- old/ethtool-6.19/netlink/desc-ethtool.c     2025-09-29 18:39:10.000000000 
+0200
+++ new/ethtool-7.0/netlink/desc-ethtool.c      2026-04-28 13:34:19.000000000 
+0200
@@ -409,12 +409,22 @@
        NLATTR_DESC_NESTED(ETHTOOL_A_TUNNEL_INFO_UDP_PORTS, tunnel_udp),
 };
 
+const struct pretty_nla_desc __fec_stat_hist_desc[] = {
+       NLATTR_DESC_INVALID(0),
+       NLATTR_DESC_BINARY(ETHTOOL_A_FEC_HIST_PAD),
+       NLATTR_DESC_U32(ETHTOOL_A_FEC_HIST_BIN_LOW),
+       NLATTR_DESC_U32(ETHTOOL_A_FEC_HIST_BIN_HIGH),
+       NLATTR_DESC_UINT(ETHTOOL_A_FEC_HIST_BIN_VAL),
+       NLATTR_DESC_U64(ETHTOOL_A_FEC_HIST_BIN_VAL_PER_LANE),
+};
+
 const struct pretty_nla_desc __fec_stats_desc[] = {
        NLATTR_DESC_INVALID(ETHTOOL_A_FEC_STAT_UNSPEC),
        NLATTR_DESC_BINARY(ETHTOOL_A_FEC_STAT_PAD),
        NLATTR_DESC_U64(ETHTOOL_A_FEC_STAT_CORRECTED),
        NLATTR_DESC_U64(ETHTOOL_A_FEC_STAT_UNCORR),
        NLATTR_DESC_U64(ETHTOOL_A_FEC_STAT_CORR_BITS),
+       NLATTR_DESC_NESTED(ETHTOOL_A_FEC_STAT_HIST, fec_stat_hist),
 };
 
 static const struct pretty_nla_desc __fec_desc[] = {
@@ -529,6 +539,40 @@
        NLATTR_DESC_U32(ETHTOOL_A_C33_PSE_EXT_SUBSTATE),
        NLATTR_DESC_U32(ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT),
        NLATTR_DESC_NESTED(ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES, c33_pse_pw_limit),
+       NLATTR_DESC_U32(ETHTOOL_A_PSE_PW_D_ID),
+       NLATTR_DESC_U32(ETHTOOL_A_PSE_PRIO_MAX),
+       NLATTR_DESC_U32(ETHTOOL_A_PSE_PRIO),
+};
+
+static const struct pretty_nla_desc __rss_flow_hash_desc[] = {
+       NLATTR_DESC_INVALID(0),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_ETHER),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_IP4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_IP6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_TCP4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_TCP6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_UDP4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_UDP6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_SCTP4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_SCTP6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_AH4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_AH6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_ESP4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_ESP6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_AH_ESP4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_AH_ESP6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPC4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPC6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPC_TEID4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPC_TEID6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU_EH4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU_EH6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU_UL4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU_UL6),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU_DL4),
+       NLATTR_DESC_UINT(ETHTOOL_A_FLOW_GTPU_DL6),
 };
 
 static const struct pretty_nla_desc __rss_desc[] = {
@@ -540,6 +584,7 @@
        NLATTR_DESC_BINARY(ETHTOOL_A_RSS_HKEY),
        NLATTR_DESC_U32(ETHTOOL_A_RSS_INPUT_XFRM),
        NLATTR_DESC_U32(ETHTOOL_A_RSS_START_CONTEXT),
+       NLATTR_DESC_NESTED(ETHTOOL_A_RSS_FLOW_HASH, rss_flow_hash),
 };
 
 static const struct pretty_nla_desc __plca_desc[] = {
@@ -587,6 +632,38 @@
        NLATTR_DESC_NESTED(ETHTOOL_A_TSCONFIG_HWTSTAMP_FLAGS, bitset),
 };
 
+static const struct pretty_nla_desc __pse_ntf_desc[] = {
+       NLATTR_DESC_INVALID(0),
+       NLATTR_DESC_UINT(ETHTOOL_A_PSE_NTF_EVENTS),
+};
+
+static const struct pretty_nla_desc __mse_capabilities_desc[] = {
+       NLATTR_DESC_INVALID(0),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_CAPABILITIES_MAX_AVERAGE_MSE),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_CAPABILITIES_MAX_PEAK_MSE),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_CAPABILITIES_REFRESH_RATE_PS),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_CAPABILITIES_NUM_SYMBOLS),
+};
+
+static const struct pretty_nla_desc __mse_snapshot_desc[] = {
+       NLATTR_DESC_INVALID(0),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_SNAPSHOT_AVERAGE_MSE),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_SNAPSHOT_PEAK_MSE),
+       NLATTR_DESC_UINT(ETHTOOL_A_MSE_SNAPSHOT_WORST_PEAK_MSE),
+};
+
+static const struct pretty_nla_desc __mse_desc[] = {
+       NLATTR_DESC_INVALID(0),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_HEADER, header),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_CAPABILITIES, mse_capabilities),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_CHANNEL_A, mse_snapshot),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_CHANNEL_B, mse_snapshot),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_CHANNEL_C, mse_snapshot),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_CHANNEL_D, mse_snapshot),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_WORST_CHANNEL, mse_snapshot),
+       NLATTR_DESC_NESTED(ETHTOOL_A_MSE_LINK, mse_snapshot),
+};
+
 const struct pretty_nlmsg_desc ethnl_umsg_desc[] = {
        NLMSG_DESC_INVALID(ETHTOOL_MSG_USER_NONE),
        NLMSG_DESC(ETHTOOL_MSG_STRSET_GET, strset),
@@ -636,6 +713,10 @@
        NLMSG_DESC(ETHTOOL_MSG_PHY_GET, phy),
        NLMSG_DESC(ETHTOOL_MSG_TSCONFIG_GET, tsconfig),
        NLMSG_DESC(ETHTOOL_MSG_TSCONFIG_SET, tsconfig),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_SET, rss),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_CREATE_ACT, rss),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_DELETE_ACT, rss),
+       NLMSG_DESC(ETHTOOL_MSG_MSE_GET, mse),
 };
 
 const unsigned int ethnl_umsg_n_desc = ARRAY_SIZE(ethnl_umsg_desc);
@@ -690,6 +771,12 @@
        NLMSG_DESC(ETHTOOL_MSG_PHY_NTF, phy),
        NLMSG_DESC(ETHTOOL_MSG_TSCONFIG_GET_REPLY, tsconfig),
        NLMSG_DESC(ETHTOOL_MSG_TSCONFIG_SET_REPLY, tsconfig),
+       NLMSG_DESC(ETHTOOL_MSG_PSE_NTF, pse_ntf),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_NTF, rss),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_CREATE_ACT_REPLY, rss),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_CREATE_NTF, rss),
+       NLMSG_DESC(ETHTOOL_MSG_RSS_DELETE_NTF, rss),
+       NLMSG_DESC(ETHTOOL_MSG_MSE_GET_REPLY, mse),
 };
 
 const unsigned int ethnl_kmsg_n_desc = ARRAY_SIZE(ethnl_kmsg_desc);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/netlink/extapi.h 
new/ethtool-7.0/netlink/extapi.h
--- old/ethtool-6.19/netlink/extapi.h   2026-03-05 12:59:06.000000000 +0100
+++ new/ethtool-7.0/netlink/extapi.h    2026-03-23 19:00:01.000000000 +0100
@@ -59,6 +59,7 @@
 int nl_spse(struct cmd_context *ctx);
 int nl_flash_module_fw(struct cmd_context *ctx);
 int nl_get_phy(struct cmd_context *ctx);
+int nl_gmse(struct cmd_context *ctx);
 
 void nl_monitor_usage(void);
 
@@ -138,6 +139,7 @@
 #define nl_spse                        NULL
 #define nl_flash_module_fw     NULL
 #define nl_get_phy             NULL
+#define nl_gmse                        NULL
 
 #endif /* ETHTOOL_ENABLE_NETLINK */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/netlink/mse.c 
new/ethtool-7.0/netlink/mse.c
--- old/ethtool-6.19/netlink/mse.c      1970-01-01 01:00:00.000000000 +0100
+++ new/ethtool-7.0/netlink/mse.c       2026-03-23 19:00:01.000000000 +0100
@@ -0,0 +1,388 @@
+/*
+ * Implementation of "ethtool --show-mse <dev>"
+ *
+ * Background:
+ * - Kernel MSE GET is defined in Documentation/netlink/specs/ethtool.yaml
+ *   and implemented in net/ethtool/mse.c.
+ * - Capabilities describe scale and timing for MSE readings:
+ *     max-average-mse / max-peak-mse : scale
+ *     refresh-rate-ps                : nominal update interval (picoseconds)
+ *     num-symbols                    : symbols per sample window
+ *   These two timing fields are mandatory in the kernel reply; limits are
+ *   present only when the corresponding metrics are supported.
+ * - Metrics originate from OPEN Alliance PHY diagnostics (100/1000BASE-T1),
+ *   but scaling, windows, and refresh reate are vendor-specific; the
+ *   capability block reports the implementation details provided by the PHY
+ *   driver.
+ * - Snapshots carry per-channel values (A-D, WORST, LINK) chosen by the
+ *   kernel in priority order (per-channel first, else WORST, else LINK).
+ */
+
+#include <errno.h>
+#include <inttypes.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "../internal.h"
+#include "../common.h"
+#include "netlink.h"
+#include "parser.h"
+
+enum mse_attr_kind {
+       MSE_ATTR_HEADER,
+       MSE_ATTR_CAPS,
+       MSE_ATTR_SNAPSHOT,
+       MSE_ATTR_UNKNOWN,
+};
+
+struct mse_field_desc {
+       uint16_t attr;
+       const char *json_key;
+       const char *plain_fmt;
+       bool required;
+};
+
+static const struct mse_field_desc mse_cap_fields[] = {
+       {
+               .attr = ETHTOOL_A_MSE_CAPABILITIES_REFRESH_RATE_PS,
+               .json_key = "refresh-rate-ps",
+               .plain_fmt = "\tRefresh Rate: %" PRIu64 " ps\n",
+               .required = true,
+       },
+       {
+               .attr = ETHTOOL_A_MSE_CAPABILITIES_NUM_SYMBOLS,
+               .json_key = "symbols-per-sample",
+               .plain_fmt = "\tSymbols per Sample: %" PRIu64 "\n",
+               .required = true,
+       },
+       {
+               .attr = ETHTOOL_A_MSE_CAPABILITIES_MAX_AVERAGE_MSE,
+               .json_key = "max-average-mse",
+               .plain_fmt = "\tMax Average MSE: %" PRIu64 "\n",
+               .required = false,
+       },
+       {
+               .attr = ETHTOOL_A_MSE_CAPABILITIES_MAX_PEAK_MSE,
+               .json_key = "max-peak-mse",
+               .plain_fmt = "\tMax Peak MSE: %" PRIu64 "\n",
+               .required = false,
+       },
+};
+
+static const struct mse_field_desc mse_snapshot_fields[] = {
+       {
+               .attr = ETHTOOL_A_MSE_SNAPSHOT_AVERAGE_MSE,
+               .json_key = "average-mse",
+               .plain_fmt = "\tAverage MSE: %" PRIu64 "\n",
+               .required = false,
+       },
+       {
+               .attr = ETHTOOL_A_MSE_SNAPSHOT_PEAK_MSE,
+               .json_key = "peak-mse",
+               .plain_fmt = "\tPeak MSE: %" PRIu64 "\n",
+               .required = false,
+       },
+       {
+               .attr = ETHTOOL_A_MSE_SNAPSHOT_WORST_PEAK_MSE,
+               .json_key = "worst-peak-mse",
+               .plain_fmt = "\tWorst-Peak MSE: %" PRIu64 "\n",
+               .required = false,
+       },
+};
+
+static enum mse_attr_kind mse_classify_attr(uint16_t at)
+{
+       switch (at) {
+       case ETHTOOL_A_MSE_HEADER:
+               return MSE_ATTR_HEADER;
+       case ETHTOOL_A_MSE_CAPABILITIES:
+               return MSE_ATTR_CAPS;
+       case ETHTOOL_A_MSE_CHANNEL_A:
+       case ETHTOOL_A_MSE_CHANNEL_B:
+       case ETHTOOL_A_MSE_CHANNEL_C:
+       case ETHTOOL_A_MSE_CHANNEL_D:
+       case ETHTOOL_A_MSE_WORST_CHANNEL:
+       case ETHTOOL_A_MSE_LINK:
+               return MSE_ATTR_SNAPSHOT;
+       default:
+               return MSE_ATTR_UNKNOWN;
+       }
+}
+
+/* Validate presence (if required) and width of integer attrs, then fetch the
+ * value. The kernel uses nla_put_uint(), which may encode values in
+ * 8/16/32/64-bit payloads; rely on attr_get_uint() for size handling.
+ * @present reports whether the attribute was found.
+ *
+ * Return: 0 on success, -EINVAL/-EMSGSIZE on malformed attributes.
+ */
+static int mse_validate_get_u64_attr(const struct nlattr *attr, const char 
*name,
+                                    bool required, u64 *val, bool *present)
+{
+       if (present)
+               *present = false;
+       if (!attr) {
+               if (required)
+                       fprintf(stderr, "warning: missing %s attribute in MSE 
reply; skipping\n",
+                               name);
+               if (val)
+                       *val = 0;
+               return 0;
+       }
+
+       *val = attr_get_uint(attr);
+       if (*val == UINT64_MAX) {
+               fprintf(stderr, "invalid %s attribute size in MSE reply\n", 
name);
+               return -EMSGSIZE;
+       }
+       if (present)
+               *present = true;
+
+       return 0;
+}
+
+static int mse_print_fields(const struct nlattr **tb,
+                           const struct mse_field_desc *fields, size_t n,
+                           bool *has_value)
+{
+       const struct mse_field_desc *f;
+       bool present;
+       u64 val;
+       int ret;
+
+       for (f = fields; f < fields + n; f++) {
+               ret = mse_validate_get_u64_attr(tb[f->attr], f->json_key,
+                                               f->required, &val, &present);
+               if (ret < 0)
+                       return ret;
+               if (present) {
+                       print_u64(PRINT_ANY, f->json_key, f->plain_fmt, val);
+                       if (has_value)
+                               *has_value = true;
+               }
+       }
+
+       return 0;
+}
+
+static const char *mse_get_channel_name(uint16_t channel)
+{
+       switch (channel) {
+       case ETHTOOL_A_MSE_CHANNEL_A:
+               return "a";
+       case ETHTOOL_A_MSE_CHANNEL_B:
+               return "b";
+       case ETHTOOL_A_MSE_CHANNEL_C:
+               return "c";
+       case ETHTOOL_A_MSE_CHANNEL_D:
+               return "d";
+       case ETHTOOL_A_MSE_WORST_CHANNEL:
+               return "worst";
+       case ETHTOOL_A_MSE_LINK:
+               return "link";
+       default:
+               return "unknown";
+       }
+}
+
+static int mse_dump_capabilities(const struct nlattr *cap_attr)
+{
+       const struct nlattr *tb[ETHTOOL_A_MSE_CAPABILITIES_MAX + 1] = {};
+       DECLARE_ATTR_TB_INFO(tb);
+       bool has_value = false;
+       int ret;
+
+       ret = mnl_attr_parse_nested(cap_attr, attr_cb, &tb_info);
+       if (ret != MNL_CB_OK) {
+               fprintf(stderr, "malformed netlink message (capabilities)\n");
+               return -EINVAL;
+       }
+
+       open_json_object("mse-capabilities");
+       if (!is_json_context())
+               printf("MSE Capabilities:\n");
+
+       /* Kernel sends max-average/peak only if corresponding PHY_MSE_CAP_* 
bits
+        * are set; refresh-rate-ps and num-symbols are always present.
+        */
+       ret = mse_print_fields(tb, mse_cap_fields, ARRAY_SIZE(mse_cap_fields),
+                              &has_value);
+
+       if (!has_value)
+               fprintf(stderr, "warning: kernel returned empty MSE capability 
block\n");
+
+       close_json_object();
+
+       return ret;
+}
+
+static int mse_dump_snapshot(const struct nlattr *snapshot_attr,
+                            uint16_t channel)
+{
+       const struct nlattr *tb[ETHTOOL_A_MSE_SNAPSHOT_MAX + 1] = {};
+       DECLARE_ATTR_TB_INFO(tb);
+       const char *channel_name;
+       bool has_value = false;
+       int ret;
+
+       ret = mnl_attr_parse_nested(snapshot_attr, attr_cb, &tb_info);
+       if (ret != MNL_CB_OK) {
+               fprintf(stderr, "malformed netlink message (snapshot)\n");
+               return -EINVAL;
+       }
+
+       channel_name = mse_get_channel_name(channel);
+       print_string(PRINT_ANY, "channel", "\nMSE Snapshot (Channel: %s):\n",
+                    channel_name);
+
+       ret = mse_print_fields(tb, mse_snapshot_fields,
+                              ARRAY_SIZE(mse_snapshot_fields), &has_value);
+       if (ret < 0)
+               return ret;
+
+       if (!has_value)
+               fprintf(stderr, "warning: kernel returned empty MSE snapshot 
for channel %s\n",
+                       channel_name);
+
+       return 0;
+}
+
+static int mse_process_snapshot_attr(const struct nlattr *attr)
+{
+       uint16_t channel = mnl_attr_get_type(attr);
+       int ret;
+
+       open_json_object(NULL);
+
+       ret = mse_dump_snapshot(attr, channel);
+
+       close_json_object();
+
+       return ret;
+}
+
+static int mse_dump_snapshots(const struct nlmsghdr *nlhdr)
+{
+       bool snapshots_started = false;
+       unsigned int unknown_cnt = 0;
+       const struct nlattr *attr;
+       int ret = 0;
+
+       /*
+        * If the kernel provides no per-channel snapshot nests, still emit an
+        * empty "mse-snapshots" array in JSON mode. This keeps the JSON schema
+        * stable for consumers (always an array, possibly empty).
+        */
+       if (is_json_context())
+               open_json_array("mse-snapshots", NULL);
+
+       /* Kernel already picks per-channel over WORST over LINK; we just dump
+        * whatever nests are present.
+        */
+       mnl_attr_for_each(attr, nlhdr, GENL_HDRLEN) {
+               uint16_t at = mnl_attr_get_type(attr);
+
+               switch (mse_classify_attr(at)) {
+               case MSE_ATTR_SNAPSHOT:
+                       ret = mse_process_snapshot_attr(attr);
+                       if (ret < 0)
+                               goto out;
+
+                       snapshots_started = true;
+
+                       break;
+               case MSE_ATTR_UNKNOWN:
+                       unknown_cnt++;
+                       break;
+               case MSE_ATTR_HEADER:
+               case MSE_ATTR_CAPS:
+               default:
+                       break;
+               }
+       }
+
+       if (!snapshots_started)
+               fprintf(stderr, "warning: no MSE snapshot data available from 
kernel\n");
+
+       if (unknown_cnt)
+               fprintf(stderr, "warning: %u unknown MSE attribute(s) 
ignored\n",
+                       unknown_cnt);
+out:
+       if (is_json_context())
+               close_json_array(NULL);
+
+       return ret;
+}
+
+int mse_reply_cb(const struct nlmsghdr *nlhdr, void *data)
+{
+       const struct nlattr *tb[ETHTOOL_A_MSE_MAX + 1] = {};
+       struct nl_context *nlctx = data;
+       DECLARE_ATTR_TB_INFO(tb);
+       int ret;
+
+       ret = mnl_attr_parse(nlhdr, GENL_HDRLEN, attr_cb, &tb_info);
+       if (ret != MNL_CB_OK)
+               return -EINVAL;
+
+       nlctx->devname = get_dev_name(tb[ETHTOOL_A_MSE_HEADER]);
+       if (!dev_ok(nlctx))
+               return 0;
+
+       open_json_object(NULL);
+       print_string(PRINT_ANY, "ifname", "MSE diagnostics for %s:\n",
+                    nlctx->devname);
+
+       if (tb[ETHTOOL_A_MSE_CAPABILITIES]) {
+               ret = mse_dump_capabilities(tb[ETHTOOL_A_MSE_CAPABILITIES]);
+               if (ret < 0)
+                       goto out;
+       } else {
+               fprintf(stderr, "warning: missing MSE capabilities; continuing 
with snapshots\n");
+       }
+
+       ret = mse_dump_snapshots(nlhdr);
+
+       print_nl();
+out:
+       close_json_object();
+
+       return ret;
+}
+
+int nl_gmse(struct cmd_context *ctx)
+{
+       struct nl_context *nlctx = ctx->nlctx;
+       struct nl_msg_buff *msgbuff;
+       struct nl_socket *nlsk;
+       int ret;
+
+       if (netlink_cmd_check(ctx, ETHTOOL_MSG_MSE_GET, true))
+               return -EOPNOTSUPP;
+
+       nlctx->cmd = "--show-mse";
+       nlctx->argp = ctx->argp;
+       nlctx->argc = ctx->argc;
+       nlctx->devname = ctx->devname;
+       nlsk = nlctx->ethnl_socket;
+       msgbuff = &nlsk->msgbuff;
+
+       ret = msg_init(nlctx, msgbuff, ETHTOOL_MSG_MSE_GET,
+                      NLM_F_REQUEST | NLM_F_ACK);
+       if (ret < 0)
+               return ret;
+       ret = ethnla_fill_header_phy(msgbuff, ETHTOOL_A_MSE_HEADER,
+                                    ctx->devname, ctx->phy_index, 0);
+       if (ret < 0)
+               return ret;
+
+       new_json_obj(ctx->json);
+       ret = nlsock_sendmsg(nlsk, NULL);
+       if (ret < 0)
+               goto out;
+       ret = nlsock_process_reply(nlsk, mse_reply_cb, nlctx);
+
+out:
+       delete_json_obj();
+       return ret;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/netlink/settings.c 
new/ethtool-7.0/netlink/settings.c
--- old/ethtool-6.19/netlink/settings.c 2026-03-05 12:59:06.000000000 +0100
+++ new/ethtool-7.0/netlink/settings.c  2026-04-08 00:22:06.000000000 +0200
@@ -196,6 +196,10 @@
        [ETHTOOL_LINK_MODE_800000baseDR4_2_Full_BIT]    = __REAL(800000),
        [ETHTOOL_LINK_MODE_800000baseSR4_Full_BIT]      = __REAL(800000),
        [ETHTOOL_LINK_MODE_800000baseVR4_Full_BIT]      = __REAL(800000),
+       [ETHTOOL_LINK_MODE_1600000baseCR8_Full_BIT]     = __REAL(1600000),
+       [ETHTOOL_LINK_MODE_1600000baseKR8_Full_BIT]     = __REAL(1600000),
+       [ETHTOOL_LINK_MODE_1600000baseDR8_Full_BIT]     = __REAL(1600000),
+       [ETHTOOL_LINK_MODE_1600000baseDR8_2_Full_BIT]   = __REAL(1600000),
 };
 const unsigned int link_modes_count = ARRAY_SIZE(link_modes);
 
@@ -667,6 +671,8 @@
        [ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED]  = "Power budget 
exceeded",
        [ETHTOOL_LINK_EXT_STATE_OVERHEAT]               = "Overheat",
        [ETHTOOL_LINK_EXT_STATE_MODULE]                 = "Module",
+       [ETHTOOL_LINK_EXT_STATE_OTP_SPEED_VIOLATION]    = "OTP speed violation",
+       [ETHTOOL_LINK_EXT_STATE_BMC_REQUEST_DOWN]       = "BMC request down",
 };
 
 static const char *const names_autoneg_link_ext_substate[] = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/sfpid.c new/ethtool-7.0/sfpid.c
--- old/ethtool-6.19/sfpid.c    2025-11-19 23:18:51.000000000 +0100
+++ new/ethtool-7.0/sfpid.c     2026-04-08 00:22:06.000000000 +0200
@@ -362,7 +362,6 @@
                                        "passive_cu_cmplnce.",
                                        id[60], description);
        } else if (id[8] & (1 << 3)) {
-               printf("\t%-41s : 0x%02x", "Active Cu cmplnce.", id[60]);
                switch (id[60]) {
                case 0x00:
                        strncpy(description, "unspecified",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/uapi/linux/ethtool.h 
new/ethtool-7.0/uapi/linux/ethtool.h
--- old/ethtool-6.19/uapi/linux/ethtool.h       2026-03-05 12:59:06.000000000 
+0100
+++ new/ethtool-7.0/uapi/linux/ethtool.h        2026-04-28 12:45:32.000000000 
+0200
@@ -15,11 +15,10 @@
 #define _LINUX_ETHTOOL_H
 
 #include <linux/const.h>
+#include <linux/typelimits.h>
 #include <linux/types.h>
 #include <linux/if_ether.h>
 
-#include <limits.h> /* for INT_MAX */
-
 /* All structures exposed to userland should be defined such that they
  * have the same layout for 32-bit and 64-bit userland.
  */
@@ -601,6 +600,8 @@
        ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED,
        ETHTOOL_LINK_EXT_STATE_OVERHEAT,
        ETHTOOL_LINK_EXT_STATE_MODULE,
+       ETHTOOL_LINK_EXT_STATE_OTP_SPEED_VIOLATION,
+       ETHTOOL_LINK_EXT_STATE_BMC_REQUEST_DOWN,
 };
 
 /* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */
@@ -1092,13 +1093,20 @@
  * struct ethtool_gstrings - string set for data tagging
  * @cmd: Command number = %ETHTOOL_GSTRINGS
  * @string_set: String set ID; one of &enum ethtool_stringset
- * @len: On return, the number of strings in the string set
+ * @len: Number of strings in the string set
  * @data: Buffer for strings.  Each string is null-padded to a size of
  *     %ETH_GSTRING_LEN.
  *
  * Users must use %ETHTOOL_GSSET_INFO to find the number of strings in
  * the string set.  They must allocate a buffer of the appropriate
  * size immediately following this structure.
+ *
+ * Setting @len on input is optional (though preferred), but must be zeroed
+ * otherwise.
+ * When set, @len will return the requested count if it matches the actual
+ * count; otherwise, it will be zero.
+ * This prevents issues when the number of strings is different than the
+ * userspace allocation.
  */
 struct ethtool_gstrings {
        __u32   cmd;
@@ -1175,13 +1183,20 @@
 /**
  * struct ethtool_stats - device-specific statistics
  * @cmd: Command number = %ETHTOOL_GSTATS
- * @n_stats: On return, the number of statistics
+ * @n_stats: Number of statistics
  * @data: Array of statistics
  *
  * Users must use %ETHTOOL_GSSET_INFO or %ETHTOOL_GDRVINFO to find the
  * number of statistics that will be returned.  They must allocate a
  * buffer of the appropriate size (8 * number of statistics)
  * immediately following this structure.
+ *
+ * Setting @n_stats on input is optional (though preferred), but must be zeroed
+ * otherwise.
+ * When set, @n_stats will return the requested count if it matches the actual
+ * count; otherwise, it will be zero.
+ * This prevents issues when the number of stats is different than the
+ * userspace allocation.
  */
 struct ethtool_stats {
        __u32   cmd;
@@ -2075,6 +2090,10 @@
        ETHTOOL_LINK_MODE_800000baseDR4_2_Full_BIT       = 118,
        ETHTOOL_LINK_MODE_800000baseSR4_Full_BIT         = 119,
        ETHTOOL_LINK_MODE_800000baseVR4_Full_BIT         = 120,
+       ETHTOOL_LINK_MODE_1600000baseCR8_Full_BIT        = 121,
+       ETHTOOL_LINK_MODE_1600000baseKR8_Full_BIT        = 122,
+       ETHTOOL_LINK_MODE_1600000baseDR8_Full_BIT        = 123,
+       ETHTOOL_LINK_MODE_1600000baseDR8_2_Full_BIT      = 124,
 
        /* must be last entry */
        __ETHTOOL_LINK_MODE_MASK_NBITS
@@ -2184,16 +2203,18 @@
 #define SPEED_40000            40000
 #define SPEED_50000            50000
 #define SPEED_56000            56000
+#define SPEED_80000            80000
 #define SPEED_100000           100000
 #define SPEED_200000           200000
 #define SPEED_400000           400000
 #define SPEED_800000           800000
+#define SPEED_1600000          1600000
 
 #define SPEED_UNKNOWN          -1
 
 static __inline__ int ethtool_validate_speed(__u32 speed)
 {
-       return speed <= INT_MAX || speed == (__u32)SPEED_UNKNOWN;
+       return speed <= __KERNEL_INT_MAX || speed == (__u32)SPEED_UNKNOWN;
 }
 
 /* Duplex, half or full. */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/uapi/linux/ethtool_netlink_generated.h 
new/ethtool-7.0/uapi/linux/ethtool_netlink_generated.h
--- old/ethtool-6.19/uapi/linux/ethtool_netlink_generated.h     2026-03-05 
12:59:06.000000000 +0100
+++ new/ethtool-7.0/uapi/linux/ethtool_netlink_generated.h      2026-04-28 
12:45:32.000000000 +0200
@@ -2,6 +2,7 @@
 /* Do not edit directly, auto-generated from: */
 /*     Documentation/netlink/specs/ethtool.yaml */
 /* YNL-GEN uapi header */
+/* To regenerate run: tools/net/ynl/ynl-regen.sh */
 
 #ifndef _LINUX_ETHTOOL_NETLINK_GENERATED_H
 #define _LINUX_ETHTOOL_NETLINK_GENERATED_H
@@ -804,6 +805,39 @@
 };
 
 enum {
+       ETHTOOL_A_MSE_CAPABILITIES_MAX_AVERAGE_MSE = 1,
+       ETHTOOL_A_MSE_CAPABILITIES_MAX_PEAK_MSE,
+       ETHTOOL_A_MSE_CAPABILITIES_REFRESH_RATE_PS,
+       ETHTOOL_A_MSE_CAPABILITIES_NUM_SYMBOLS,
+
+       __ETHTOOL_A_MSE_CAPABILITIES_CNT,
+       ETHTOOL_A_MSE_CAPABILITIES_MAX = (__ETHTOOL_A_MSE_CAPABILITIES_CNT - 1)
+};
+
+enum {
+       ETHTOOL_A_MSE_SNAPSHOT_AVERAGE_MSE = 1,
+       ETHTOOL_A_MSE_SNAPSHOT_PEAK_MSE,
+       ETHTOOL_A_MSE_SNAPSHOT_WORST_PEAK_MSE,
+
+       __ETHTOOL_A_MSE_SNAPSHOT_CNT,
+       ETHTOOL_A_MSE_SNAPSHOT_MAX = (__ETHTOOL_A_MSE_SNAPSHOT_CNT - 1)
+};
+
+enum {
+       ETHTOOL_A_MSE_HEADER = 1,
+       ETHTOOL_A_MSE_CAPABILITIES,
+       ETHTOOL_A_MSE_CHANNEL_A,
+       ETHTOOL_A_MSE_CHANNEL_B,
+       ETHTOOL_A_MSE_CHANNEL_C,
+       ETHTOOL_A_MSE_CHANNEL_D,
+       ETHTOOL_A_MSE_WORST_CHANNEL,
+       ETHTOOL_A_MSE_LINK,
+
+       __ETHTOOL_A_MSE_CNT,
+       ETHTOOL_A_MSE_MAX = (__ETHTOOL_A_MSE_CNT - 1)
+};
+
+enum {
        ETHTOOL_MSG_USER_NONE = 0,
        ETHTOOL_MSG_STRSET_GET = 1,
        ETHTOOL_MSG_LINKINFO_GET,
@@ -855,6 +889,7 @@
        ETHTOOL_MSG_RSS_SET,
        ETHTOOL_MSG_RSS_CREATE_ACT,
        ETHTOOL_MSG_RSS_DELETE_ACT,
+       ETHTOOL_MSG_MSE_GET,
 
        __ETHTOOL_MSG_USER_CNT,
        ETHTOOL_MSG_USER_MAX = (__ETHTOOL_MSG_USER_CNT - 1)
@@ -915,6 +950,7 @@
        ETHTOOL_MSG_RSS_CREATE_ACT_REPLY,
        ETHTOOL_MSG_RSS_CREATE_NTF,
        ETHTOOL_MSG_RSS_DELETE_NTF,
+       ETHTOOL_MSG_MSE_GET_REPLY,
 
        __ETHTOOL_MSG_KERNEL_CNT,
        ETHTOOL_MSG_KERNEL_MAX = (__ETHTOOL_MSG_KERNEL_CNT - 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/uapi/linux/if_ether.h 
new/ethtool-7.0/uapi/linux/if_ether.h
--- old/ethtool-6.19/uapi/linux/if_ether.h      2026-03-05 12:59:06.000000000 
+0100
+++ new/ethtool-7.0/uapi/linux/if_ether.h       2026-04-28 12:45:32.000000000 
+0200
@@ -92,6 +92,9 @@
 #define ETH_P_ETHERCAT 0x88A4          /* EtherCAT                     */
 #define ETH_P_8021AD   0x88A8          /* 802.1ad Service VLAN         */
 #define ETH_P_802_EX1  0x88B5          /* 802.1 Local Experimental 1.  */
+#define ETH_P_MXLGSW   0x88C3          /* Infineon Technologies Corporate 
Research ST
+                                        * Used by MaxLinear GSW DSA
+                                        */
 #define ETH_P_PREAUTH  0x88C7          /* 802.11 Preauthentication */
 #define ETH_P_TIPC     0x88CA          /* TIPC                         */
 #define ETH_P_LLDP     0x88CC          /* Link Layer Discovery Protocol */
@@ -114,6 +117,7 @@
 #define ETH_P_QINQ1    0x9100          /* deprecated QinQ VLAN [ NOT AN 
OFFICIALLY REGISTERED ID ] */
 #define ETH_P_QINQ2    0x9200          /* deprecated QinQ VLAN [ NOT AN 
OFFICIALLY REGISTERED ID ] */
 #define ETH_P_QINQ3    0x9300          /* deprecated QinQ VLAN [ NOT AN 
OFFICIALLY REGISTERED ID ] */
+#define ETH_P_YT921X   0x9988          /* Motorcomm YT921x DSA [ NOT AN 
OFFICIALLY REGISTERED ID ] */
 #define ETH_P_EDSA     0xDADA          /* Ethertype DSA [ NOT AN OFFICIALLY 
REGISTERED ID ] */
 #define ETH_P_DSA_8021Q        0xDADB          /* Fake VLAN Header for DSA [ 
NOT AN OFFICIALLY REGISTERED ID ] */
 #define ETH_P_DSA_A5PSW        0xE001          /* A5PSW Tag Value [ NOT AN 
OFFICIALLY REGISTERED ID ] */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/uapi/linux/if_link.h 
new/ethtool-7.0/uapi/linux/if_link.h
--- old/ethtool-6.19/uapi/linux/if_link.h       2026-03-05 12:59:06.000000000 
+0100
+++ new/ethtool-7.0/uapi/linux/if_link.h        2026-04-28 12:45:32.000000000 
+0200
@@ -1441,6 +1441,7 @@
        IFLA_GENEVE_DF,
        IFLA_GENEVE_INNER_PROTO_INHERIT,
        IFLA_GENEVE_PORT_RANGE,
+       IFLA_GENEVE_GRO_HINT,
        __IFLA_GENEVE_MAX
 };
 #define IFLA_GENEVE_MAX        (__IFLA_GENEVE_MAX - 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/uapi/linux/stddef.h 
new/ethtool-7.0/uapi/linux/stddef.h
--- old/ethtool-6.19/uapi/linux/stddef.h        2026-03-05 12:59:06.000000000 
+0100
+++ new/ethtool-7.0/uapi/linux/stddef.h 2026-04-28 12:45:32.000000000 +0200
@@ -69,6 +69,10 @@
 #define __counted_by_be(m)
 #endif
 
+#ifndef __counted_by_ptr
+#define __counted_by_ptr(m)
+#endif
+
 #define __kernel_nonstring
 
 #endif /* _LINUX_STDDEF_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ethtool-6.19/uapi/linux/typelimits.h 
new/ethtool-7.0/uapi/linux/typelimits.h
--- old/ethtool-6.19/uapi/linux/typelimits.h    1970-01-01 01:00:00.000000000 
+0100
+++ new/ethtool-7.0/uapi/linux/typelimits.h     2026-04-28 12:45:32.000000000 
+0200
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef _LINUX_TYPELIMITS_H
+#define _LINUX_TYPELIMITS_H
+
+#define __KERNEL_INT_MAX ((int)(~0U >> 1))
+#define __KERNEL_INT_MIN (-__KERNEL_INT_MAX - 1)
+
+#endif /* _LINUX_TYPELIMITS_H */

Reply via email to