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 */
