DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 00/46] Support AMD Solarflare X45xx adaptors
@ 2025-04-16 13:59 Ivan Malov
  2025-04-16 13:59 ` [PATCH 01/46] common/sfc_efx/base: add Medford4 PCI IDs to common code Ivan Malov
                   ` (47 more replies)
  0 siblings, 48 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
supports multiple network engine types. This series provides support
only for the Medford2-alike, 'full-feature' (FF) network engine. This
shall not be confused with the concept of 'datapath FW variants': the
FF network engine supports both 'full-feature' and 'ultra-low-latency'
datapath FW variants, with corresponding Medford2-alike feature sets.

The first part of the series provides general support for the adaptors,
whilst the second one adds support for the new management controller
interface for configuration of network port features (netport MCDI).

For now, only support for physical functions (PFs) is concerned. There
is a small number of TODO and FIXME markings in the code. Those are
normal at this development stage and will be removed by future patches
when VF support has fleshed out.


Andy Moreton (3):
  common/sfc_efx/base: update X4 BAR layout and PCI IDs
  net/sfc: add Medford4 with only full feature datapath engine
  common/sfc_efx/base: add port mode for 8 port hardware

Denis Pryazhennikov (15):
  common/sfc_efx/base: add Medford4 PCI IDs to common code
  common/sfc_efx/base: add efsys option for Medford4
  common/sfc_efx/base: add Medford4 support to NIC module
  common/sfc_efx/base: add Medford4 support to EV module
  common/sfc_efx/base: add Medford4 support to FILTER module
  common/sfc_efx/base: add Medford4 support to INTR module
  common/sfc_efx/base: add Medford4 support to MAC module
  common/sfc_efx/base: add Medford4 support to PHY module
  common/sfc_efx/base: add Medford4 support to TUNNEL module
  common/sfc_efx/base: add Medford4 support to MCDI module
  common/sfc_efx/base: add Medford4 support to Rx module
  common/sfc_efx/base: add Medford4 support to Tx module
  drivers: enable support for AMD Solarflare X4 adapter family
  common/sfc_efx/base: add new X4 port mode
  common/sfc_efx/base: extend list of supported X4 port modes

Ivan Malov (28):
  common/sfc_efx/base: update MCDI headers
  common/sfc_efx/base: provide a stub for basic netport attach
  common/sfc_efx/base: provide defaults on netport attach path
  common/sfc_efx/base: obtain assigned netport handle from NIC
  common/sfc_efx/base: allow for const in MCDI struct accessor
  common/sfc_efx/base: get netport fixed capabilities on probe
  common/sfc_efx/base: decode netport link state on probe path
  common/sfc_efx/base: fill in loopback modes on netport probe
  common/sfc_efx/base: introduce Medford4 stub for PHY methods
  common/sfc_efx/base: refactor EF10 link mode decoding helper
  common/sfc_efx/base: provide PHY link get method on Medford4
  common/sfc_efx/base: implement PHY link control for Medford4
  common/sfc_efx/base: introduce Medford4 stub for MAC methods
  common/sfc_efx/base: add MAC reconfigure method for Medford4
  common/sfc_efx/base: fill in software LUT for MAC statistics
  common/sfc_efx/base: fill in MAC statistics mask on Medford4
  common/sfc_efx/base: support MAC statistics on Medford4 NICs
  common/sfc_efx/base: implement MAC PDU controls for Medford4
  common/sfc_efx/base: correct MAC PDU calculation on Medford4
  net/sfc: make use of generic EFX MAC PDU calculation helpers
  common/sfc_efx/base: ignore legacy link events on new boards
  common/sfc_efx/base: add link event processing on new boards
  net/sfc: query link status on link change events on new NICs
  common/sfc_efx/base: subscribe to netport link change events
  net/sfc: offer support for 200G link ability on new adaptors
  common/sfc_efx/base: support controls for netport lane count
  net/sfc: add support for control of physical port lane count
  doc: advertise support for AMD Solarflare X45xx adapters

 .mailmap                                      |    3 +-
 doc/guides/nics/sfc_efx.rst                   |    9 +-
 doc/guides/rel_notes/release_25_07.rst        |    4 +
 drivers/common/sfc_efx/base/ef10_ev.c         |   39 +
 drivers/common/sfc_efx/base/ef10_impl.h       |   19 +
 drivers/common/sfc_efx/base/ef10_nic.c        |   98 +-
 drivers/common/sfc_efx/base/ef10_phy.c        |   43 +-
 drivers/common/sfc_efx/base/ef10_tlv_layout.h |    9 +-
 drivers/common/sfc_efx/base/efx.h             |   98 +-
 drivers/common/sfc_efx/base/efx_check.h       |   24 +-
 drivers/common/sfc_efx/base/efx_ev.c          |    6 +
 drivers/common/sfc_efx/base/efx_filter.c      |    6 +
 drivers/common/sfc_efx/base/efx_impl.h        |  115 +-
 drivers/common/sfc_efx/base/efx_intr.c        |    6 +
 drivers/common/sfc_efx/base/efx_mac.c         |   56 +-
 drivers/common/sfc_efx/base/efx_mcdi.c        |   18 +-
 drivers/common/sfc_efx/base/efx_mcdi.h        |    2 +-
 drivers/common/sfc_efx/base/efx_nic.c         |   60 +
 drivers/common/sfc_efx/base/efx_np.c          | 1625 +++++
 drivers/common/sfc_efx/base/efx_phy.c         |   88 +-
 drivers/common/sfc_efx/base/efx_port.c        |    1 +
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5868 ++++++++++++++++-
 drivers/common/sfc_efx/base/efx_rx.c          |    6 +
 drivers/common/sfc_efx/base/efx_tunnel.c      |   18 +-
 drivers/common/sfc_efx/base/efx_tx.c          |   33 +
 drivers/common/sfc_efx/base/medford4_impl.h   |  110 +
 drivers/common/sfc_efx/base/medford4_mac.c    |  299 +
 drivers/common/sfc_efx/base/medford4_phy.c    |  156 +
 drivers/common/sfc_efx/base/meson.build       |    3 +
 drivers/common/sfc_efx/efsys.h                |    2 +
 drivers/common/sfc_efx/sfc_base_symbols.c     |    2 +
 drivers/net/sfc/sfc.c                         |    5 +-
 drivers/net/sfc/sfc.h                         |    4 +
 drivers/net/sfc/sfc_dp_tx.h                   |    3 +
 drivers/net/sfc/sfc_ef10_tx.c                 |   13 +-
 drivers/net/sfc/sfc_ethdev.c                  |  186 +-
 drivers/net/sfc/sfc_ev.c                      |   51 +-
 drivers/net/sfc/sfc_port.c                    |   27 +-
 drivers/net/sfc/sfc_repr.c                    |    7 +-
 drivers/net/sfc/sfc_repr.h                    |    1 +
 drivers/net/sfc/sfc_tx.c                      |    2 +
 41 files changed, 9000 insertions(+), 125 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/efx_np.c
 create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
 create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c
 create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c

-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 01/46] common/sfc_efx/base: add Medford4 PCI IDs to common code
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4 Ivan Malov
                   ` (46 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Later patches will use this to implement support for Medford4.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 5773cb00b3..dabf2e0e0b 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -64,6 +64,7 @@ typedef enum efx_family_e {
 	EFX_FAMILY_MEDFORD,
 	EFX_FAMILY_MEDFORD2,
 	EFX_FAMILY_RIVERHEAD,
+	EFX_FAMILY_MEDFORD4,
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
@@ -172,6 +173,10 @@ efx_family_probe_bar(
 #define	EFX_PCI_DEVID_RIVERHEAD			0x0100
 #define	EFX_PCI_DEVID_RIVERHEAD_VF		0x1100
 
+#define	EFX_PCI_DEVID_MEDFORD4_PF_UNINIT	0x0C13
+#define	EFX_PCI_DEVID_MEDFORD4			0x0C03
+#define	EFX_PCI_DEVID_MEDFORD4_VF		0x1C03
+
 #define	EFX_MEM_BAR_SIENA			2
 
 #define	EFX_MEM_BAR_HUNTINGTON_PF		2
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
  2025-04-16 13:59 ` [PATCH 01/46] common/sfc_efx/base: add Medford4 PCI IDs to common code Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-17  7:08   ` Andrew Rybchenko
  2025-04-16 13:59 ` [PATCH 03/46] common/sfc_efx/base: add Medford4 support to NIC module Ivan Malov
                   ` (45 subsequent siblings)
  47 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Later patches will use this to implement support for Medford4.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 24 ++++++++++++++----------
 drivers/common/sfc_efx/efsys.h          |  2 ++
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 66b38eeae0..0b9f4fb516 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -32,7 +32,8 @@
 
 /* Check family options for EF10 architecture controllers. */
 #define	EFX_OPTS_EF10()	\
-	(EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+	(EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || \
+	EFSYS_OPT_MEDFORD4)
 
 #ifdef EFSYS_OPT_FALCON
 # error "FALCON is obsolete and is not supported."
@@ -197,7 +198,7 @@
 
 #if EFSYS_OPT_IMAGE_LAYOUT
 /* Support signed image layout handling */
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4)
 #  error "IMAGE_LAYOUT requires MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_IMAGE_LAYOUT */
@@ -338,8 +339,10 @@
 
 #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
 /* Support adapters with missing static config (for factory use only) */
-# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || \
+	EFSYS_OPT_MEDFORD4)
+#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2 " \
+	"or MEDFORD4"
 # endif
 #endif /* EFSYS_OPT_ALLOW_UNCONFIGURED_NIC */
 
@@ -352,22 +355,23 @@
 
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
 /* Support equal stride super-buffer mode */
-# if !(EFSYS_OPT_MEDFORD2)
-#  error "ES_SUPER_BUFFER requires MEDFORD2"
+# if !(EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4)
+#  error "ES_SUPER_BUFFER requires MEDFORD2 or MEDFORD4"
 # endif
 #endif
 
 /* Support hardware assistance for tunnels */
 #if EFSYS_OPT_TUNNEL
-# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "TUNNEL requires RIVERHEAD or MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || \
+	EFSYS_OPT_MEDFORD4)
+#  error "TUNNEL requires RIVERHEAD or MEDFORD or MEDFORD2 or MEDFORD4"
 # endif
 #endif /* EFSYS_OPT_TUNNEL */
 
 #if EFSYS_OPT_FW_SUBVARIANT_AWARE
 /* Advertise that the driver is firmware subvariant aware */
-# if !(EFSYS_OPT_MEDFORD2)
-#  error "FW_SUBVARIANT_AWARE requires MEDFORD2"
+# if !(EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4)
+#  error "FW_SUBVARIANT_AWARE requires MEDFORD2 or MEDFORD4"
 # endif
 #endif
 
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 41fa3da762..e63cbdbe8f 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -125,6 +125,8 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_MEDFORD2 1
 /* Enable Riverhead support */
 #define EFSYS_OPT_RIVERHEAD 1
+/* Disable Medford4 support (not supported yet) */
+#define EFSYS_OPT_MEDFORD4 0
 
 #ifdef RTE_DEBUG_COMMON_SFC_EFX
 #define EFSYS_OPT_CHECK_REG 1
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 03/46] common/sfc_efx/base: add Medford4 support to NIC module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
  2025-04-16 13:59 ` [PATCH 01/46] common/sfc_efx/base: add Medford4 PCI IDs to common code Ivan Malov
  2025-04-16 13:59 ` [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4 Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-17  7:14   ` Andrew Rybchenko
  2025-04-16 13:59 ` [PATCH 04/46] common/sfc_efx/base: add Medford4 support to EV module Ivan Malov
                   ` (44 subsequent siblings)
  47 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Implement NIC family discovery and minimum probe support.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 33 ++++++++++++++++-
 drivers/common/sfc_efx/base/efx.h      |  1 +
 drivers/common/sfc_efx/base/efx_impl.h |  7 +++-
 drivers/common/sfc_efx/base/efx_nic.c  | 50 ++++++++++++++++++++++++++
 4 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 79d596b5ef..77c97217ee 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1422,7 +1422,7 @@ ef10_get_datapath_caps(
 
 	/*
 	 * Check if firmware reports the VI window mode.
-	 * Medford2 has a variable VI window size (8K, 16K or 64K).
+	 * Medford2 and Medford4 have a variable VI window size (8K, 16K or 64K).
 	 * Medford and Huntington have a fixed 8K VI window size.
 	 */
 	if (req.emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V3_OUT_LEN) {
@@ -1479,6 +1479,7 @@ ef10_get_datapath_caps(
 
 		switch (enp->en_family) {
 		case EFX_FAMILY_MEDFORD2:
+		case EFX_FAMILY_MEDFORD4:
 			encp->enc_rx_scale_hash_alg_mask =
 			    (1U << EFX_RX_HASHALG_TOEPLITZ);
 			break;
@@ -1922,6 +1923,36 @@ static struct ef10_external_port_map_s {
 		(1U << TLV_PORT_MODE_1x1_1x1),			/* mode 2 */
 		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
+	/*
+	 * Modes that on Medford4 allocate 2 adjacent port numbers to cage 1
+	 * and the rest to cage 2.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 1
+	 *	port 2 -> cage 2
+	 *	port 3 -> cage 2
+	 */
+	{
+		EFX_FAMILY_MEDFORD4,
+		(1U << TLV_PORT_MODE_2x1_2x1) |			/* mode 5 */
+		(1U << TLV_PORT_MODE_2x1_1x4) |			/* mode 7 */
+		(1U << TLV_PORT_MODE_2x2_NA) |			/* mode 13 */
+		(1U << TLV_PORT_MODE_2x1_1x2),			/* mode 18 */
+		{ 0, 2, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
+	/*
+	 * Modes that on Medford4 allocate up to 4 adjacent port numbers
+	 * to cage 1.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 1
+	 *	port 2 -> cage 1
+	 *	port 3 -> cage 1
+	 */
+	{
+		EFX_FAMILY_MEDFORD4,
+		(1U << TLV_PORT_MODE_4x1_NA),			/* mode 4 */
+		{ 0, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
+	/* FIXME: review Medford4 port modes */
 };
 
 static	__checkReturn	efx_rc_t
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index dabf2e0e0b..442dfa0830 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -190,6 +190,7 @@ efx_family_probe_bar(
 /* FIXME Fix it when memory bar is fixed in FPGA image. It must be 0. */
 #define	EFX_MEM_BAR_RIVERHEAD			2
 
+#define	EFX_MEM_BAR_MEDFORD4			0
 
 /* Error codes */
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 662a21e90c..9d1f361c5d 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -972,7 +972,8 @@ struct efx_nic_s {
 };
 
 #define	EFX_FAMILY_IS_EF10(_enp) \
-	((_enp)->en_family == EFX_FAMILY_MEDFORD2 || \
+	((_enp)->en_family == EFX_FAMILY_MEDFORD4 || \
+	 (_enp)->en_family == EFX_FAMILY_MEDFORD2 || \
 	 (_enp)->en_family == EFX_FAMILY_MEDFORD || \
 	 (_enp)->en_family == EFX_FAMILY_HUNTINGTON)
 
@@ -1128,6 +1129,10 @@ struct efx_txq_s {
 			rev = 'G';					\
 			break;						\
 									\
+		case EFX_FAMILY_MEDFORD4:				\
+			rev = 'H';					\
+			break;						\
+									\
 		default:						\
 			rev = '?';					\
 			break;						\
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 172488e083..5bcc0a04ff 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -79,6 +79,19 @@ efx_family(
 			return (0);
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_MEDFORD4
+		case EFX_PCI_DEVID_MEDFORD4_PF_UNINIT:
+			/*
+			 * Hardware default for PF0 of uninitialised Medford4.
+			 * manftest must be able to cope with this device id.
+			 */
+		case EFX_PCI_DEVID_MEDFORD4:
+		case EFX_PCI_DEVID_MEDFORD4_VF:
+			*efp = EFX_FAMILY_MEDFORD4;
+			*membarp = EFX_MEM_BAR_MEDFORD4;
+			return (0);
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 		case EFX_PCI_DEVID_FALCON:	/* Obsolete, not supported */
 		default:
 			break;
@@ -251,6 +264,27 @@ static const efx_nic_ops_t	__efx_nic_riverhead_ops = {
 
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+
+static const efx_nic_ops_t	__efx_nic_medford4_ops = {
+	ef10_nic_probe,			/* eno_probe */
+	medford2_board_cfg,		/* eno_board_cfg */
+	ef10_nic_set_drv_limits,	/* eno_set_drv_limits */
+	ef10_nic_reset,			/* eno_reset */
+	ef10_nic_init,			/* eno_init */
+	ef10_nic_get_vi_pool,		/* eno_get_vi_pool */
+	ef10_nic_get_bar_region,	/* eno_get_bar_region */
+	ef10_nic_hw_unavailable,	/* eno_hw_unavailable */
+	ef10_nic_set_hw_unavailable,	/* eno_set_hw_unavailable */
+#if EFSYS_OPT_DIAG
+	ef10_nic_register_test,		/* eno_register_test */
+#endif	/* EFSYS_OPT_DIAG */
+	ef10_nic_fini,			/* eno_fini */
+	ef10_nic_unprobe,		/* eno_unprobe */
+};
+
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 
 	__checkReturn	efx_rc_t
 efx_nic_create(
@@ -363,6 +397,22 @@ efx_nic_create(
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		enp->en_enop = &__efx_nic_medford4_ops;
+		enp->en_features =
+		    EFX_FEATURE_IPV6 |
+		    EFX_FEATURE_LINK_EVENTS |
+		    EFX_FEATURE_PERIODIC_MAC_STATS |
+		    EFX_FEATURE_MCDI |
+		    EFX_FEATURE_MAC_HEADER_FILTERS |
+		    EFX_FEATURE_MCDI_DMA |
+		    EFX_FEATURE_FW_ASSISTED_TSO_V2 |
+		    EFX_FEATURE_PACKED_STREAM |
+		    EFX_FEATURE_TXQ_CKSUM_OP_DESC;
+		break;
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		rc = ENOTSUP;
 		goto fail2;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 04/46] common/sfc_efx/base: add Medford4 support to EV module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (2 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 03/46] common/sfc_efx/base: add Medford4 support to NIC module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 05/46] common/sfc_efx/base: add Medford4 support to FILTER module Ivan Malov
                   ` (43 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_ev.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 4808f8ddfc..13159a10f4 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -173,6 +173,12 @@ efx_ev_init(
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		eevop = &__efx_ev_ef10_ops;
+		break;
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 05/46] common/sfc_efx/base: add Medford4 support to FILTER module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (3 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 04/46] common/sfc_efx/base: add Medford4 support to EV module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 06/46] common/sfc_efx/base: add Medford4 support to INTR module Ivan Malov
                   ` (42 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_filter.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_filter.c b/drivers/common/sfc_efx/base/efx_filter.c
index 2c8c7bdc33..551db58fdd 100644
--- a/drivers/common/sfc_efx/base/efx_filter.c
+++ b/drivers/common/sfc_efx/base/efx_filter.c
@@ -201,6 +201,12 @@ efx_filter_init(
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		efop = &__efx_filter_ef10_ops;
+		break;
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 06/46] common/sfc_efx/base: add Medford4 support to INTR module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (4 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 05/46] common/sfc_efx/base: add Medford4 support to FILTER module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 07/46] common/sfc_efx/base: add Medford4 support to MAC module Ivan Malov
                   ` (41 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_intr.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_intr.c b/drivers/common/sfc_efx/base/efx_intr.c
index 792302f540..8fdef839db 100644
--- a/drivers/common/sfc_efx/base/efx_intr.c
+++ b/drivers/common/sfc_efx/base/efx_intr.c
@@ -158,6 +158,12 @@ efx_intr_init(
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		eiop = &__efx_intr_ef10_ops;
+		break;
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(B_FALSE);
 		rc = ENOTSUP;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 07/46] common/sfc_efx/base: add Medford4 support to MAC module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (5 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 06/46] common/sfc_efx/base: add Medford4 support to INTR module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 08/46] common/sfc_efx/base: add Medford4 support to PHY module Ivan Malov
                   ` (40 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h | 1 +
 drivers/common/sfc_efx/base/efx_mac.c  | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 9d1f361c5d..89b7e0292e 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -79,6 +79,7 @@ typedef enum efx_mac_type_e {
 	EFX_MAC_MEDFORD,
 	EFX_MAC_MEDFORD2,
 	EFX_MAC_RIVERHEAD,
+	EFX_MAC_MEDFORD4,
 	EFX_MAC_NTYPES
 } efx_mac_type_t;
 
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index 13cac5a751..a2cbf02b46 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -953,6 +953,13 @@ efx_mac_select(
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		emop = &__efx_mac_ef10_ops;
+		type = EFX_MAC_MEDFORD4;
+		break;
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		rc = EINVAL;
 		goto fail1;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 08/46] common/sfc_efx/base: add Medford4 support to PHY module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (6 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 07/46] common/sfc_efx/base: add Medford4 support to MAC module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 09/46] common/sfc_efx/base: add Medford4 support to TUNNEL module Ivan Malov
                   ` (39 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_phy.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index d55becae18..3d792f20b8 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -114,6 +114,12 @@ efx_phy_probe(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		epop = &__efx_phy_ef10_ops;
+	break;
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		rc = ENOTSUP;
 		goto fail1;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 09/46] common/sfc_efx/base: add Medford4 support to TUNNEL module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (7 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 08/46] common/sfc_efx/base: add Medford4 support to PHY module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 10/46] common/sfc_efx/base: add Medford4 support to MCDI module Ivan Malov
                   ` (38 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_tunnel.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index d63f9176e4..75968a0b4f 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -47,7 +47,7 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4
 static	__checkReturn	boolean_t
 ef10_udp_encap_supported(
 	__in		efx_nic_t *enp);
@@ -59,7 +59,7 @@ ef10_tunnel_reconfigure(
 static			void
 ef10_tunnel_fini(
 	__in		efx_nic_t *enp);
-#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4 */
 
 #if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
@@ -68,12 +68,12 @@ static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
 };
 #endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
 
-#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
 	ef10_tunnel_fini,		/* eto_fini */
 };
-#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4 */
 
 #if EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_rhead_ops = {
@@ -254,6 +254,12 @@ efx_tunnel_init(
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		etop = &__efx_tunnel_ef10_ops;
+		break;
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
@@ -637,7 +643,7 @@ efx_tunnel_reconfigure(
 	return (rc);
 }
 
-#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4
 static	__checkReturn		boolean_t
 ef10_udp_encap_supported(
 	__in		efx_nic_t *enp)
@@ -724,6 +730,6 @@ ef10_tunnel_fini(
 		    &resetting);
 	}
 }
-#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4 */
 
 #endif /* EFSYS_OPT_TUNNEL */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 10/46] common/sfc_efx/base: add Medford4 support to MCDI module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (8 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 09/46] common/sfc_efx/base: add Medford4 support to TUNNEL module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 11/46] common/sfc_efx/base: add Medford4 support to Rx module Ivan Malov
                   ` (37 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index acf7f02246..0bd56dd84d 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -119,6 +119,12 @@ efx_mcdi_init(
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		emcop = &__efx_mcdi_ef10_ops;
+		break;
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 11/46] common/sfc_efx/base: add Medford4 support to Rx module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (9 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 10/46] common/sfc_efx/base: add Medford4 support to MCDI module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 12/46] common/sfc_efx/base: add Medford4 support to Tx module Ivan Malov
                   ` (36 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Use common EF10 method table for that.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_rx.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index dce9ada55d..86dfc89ba4 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -261,6 +261,12 @@ efx_rx_init(
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		erxop = &__efx_rx_ef10_ops;
+		break;
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 12/46] common/sfc_efx/base: add Medford4 support to Tx module
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (10 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 11/46] common/sfc_efx/base: add Medford4 support to Rx module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 13/46] drivers: enable support for AMD Solarflare X4 adapter family Ivan Malov
                   ` (35 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Define and use Medford4 specific method table.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/base/efx_tx.c | 33 ++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index 6f61f937a1..d1021dea82 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -233,6 +233,33 @@ static const efx_tx_ops_t	__efx_tx_rhead_ops = {
 #endif /* EFSYS_OPT_RIVERHEAD */
 
 
+#if EFSYS_OPT_MEDFORD4
+static const efx_tx_ops_t	__efx_tx_medford4_ops = {
+	ef10_tx_init,				/* etxo_init */
+	ef10_tx_fini,				/* etxo_fini */
+	ef10_tx_qcreate,			/* etxo_qcreate */
+	ef10_tx_qdestroy,			/* etxo_qdestroy */
+	ef10_tx_qpost,				/* etxo_qpost */
+	ef10_tx_qpush,				/* etxo_qpush */
+	ef10_tx_qpace,				/* etxo_qpace */
+	ef10_tx_qflush,				/* etxo_qflush */
+	ef10_tx_qenable,			/* etxo_qenable */
+	NULL,					/* etxo_qpio_enable */
+	NULL,					/* etxo_qpio_disable */
+	NULL,					/* etxo_qpio_write */
+	NULL,					/* etxo_qpio_post */
+	ef10_tx_qdesc_post,			/* etxo_qdesc_post */
+	ef10_tx_qdesc_dma_create,		/* etxo_qdesc_dma_create */
+	NULL,					/* etxo_qdesc_tso_create */
+	ef10_tx_qdesc_tso2_create,		/* etxo_qdesc_tso2_create */
+	ef10_tx_qdesc_vlantci_create,		/* etxo_qdesc_vlantci_create */
+	ef10_tx_qdesc_checksum_create,		/* etxo_qdesc_checksum_create */
+#if EFSYS_OPT_QSTATS
+	ef10_tx_qstats_update,			/* etxo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	__checkReturn	efx_rc_t
 efx_tx_init(
 	__in		efx_nic_t *enp)
@@ -284,6 +311,12 @@ efx_tx_init(
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+	case EFX_FAMILY_MEDFORD4:
+		etxop = &__efx_tx_medford4_ops;
+		break;
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 13/46] drivers: enable support for AMD Solarflare X4 adapter family
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (11 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 12/46] common/sfc_efx/base: add Medford4 support to Tx module Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 14/46] common/sfc_efx/base: update X4 BAR layout and PCI IDs Ivan Malov
                   ` (34 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Enable support for Medford4 (X4) adapters X4522 and X4542.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
---
 drivers/common/sfc_efx/efsys.h | 4 ++--
 drivers/net/sfc/sfc_ethdev.c   | 3 +++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index e63cbdbe8f..ea68d3bd1a 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -125,8 +125,8 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_MEDFORD2 1
 /* Enable Riverhead support */
 #define EFSYS_OPT_RIVERHEAD 1
-/* Disable Medford4 support (not supported yet) */
-#define EFSYS_OPT_MEDFORD4 0
+/* Enable Medford4 support */
+#define EFSYS_OPT_MEDFORD4 1
 
 #ifdef RTE_DEBUG_COMMON_SFC_EFX
 #define EFSYS_OPT_CHECK_REG 1
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 82fbdbae9c..3e57c902df 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -2829,6 +2829,7 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 	case EFX_FAMILY_HUNTINGTON:
 	case EFX_FAMILY_MEDFORD:
 	case EFX_FAMILY_MEDFORD2:
+	case EFX_FAMILY_MEDFORD4:
 		avail_caps |= SFC_DP_HW_FW_CAP_EF10;
 		avail_caps |= SFC_DP_HW_FW_CAP_RX_EFX;
 		avail_caps |= SFC_DP_HW_FW_CAP_TX_EFX;
@@ -3301,6 +3302,8 @@ static const struct rte_pci_id pci_id_sfc_efx_map[] = {
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD_VF) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD2) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD2_VF) },
+	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD4) },
+	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD4_VF) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_XILINX, EFX_PCI_DEVID_RIVERHEAD) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_XILINX, EFX_PCI_DEVID_RIVERHEAD_VF) },
 	{ .vendor_id = 0 /* sentinel */ }
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 14/46] common/sfc_efx/base: update X4 BAR layout and PCI IDs
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (12 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 13/46] drivers: enable support for AMD Solarflare X4 adapter family Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 15/46] net/sfc: add Medford4 with only full feature datapath engine Ivan Malov
                   ` (33 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Andy Moreton <andy.moreton@amd.com>

The BAR layout on X4 has changed to put MSI-X (and CXL) in BAR0/1,
and moved the main memory BAR to be BAR2/3. Update definitions to
match the updated hardware and cmodel.

Also add PCI IDs used for functions which only have the full feature
(X2 style) datapath engines, and do not support the low latency
datapath engine.

Signed-off-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Ivan Malov <ivan.malov@arknetworks.am>
---
 drivers/common/sfc_efx/base/efx.h     | 12 +++++++++---
 drivers/common/sfc_efx/base/efx_nic.c |  2 ++
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 442dfa0830..a9ed3f423f 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -173,9 +173,15 @@ efx_family_probe_bar(
 #define	EFX_PCI_DEVID_RIVERHEAD			0x0100
 #define	EFX_PCI_DEVID_RIVERHEAD_VF		0x1100
 
+/*
+ * Medford4 has low latency (LL) and full feature (FF) datapath engines.
+ * Some Medford4 functions have FF and LL datapath, others only have FF.
+ */
 #define	EFX_PCI_DEVID_MEDFORD4_PF_UNINIT	0x0C13
-#define	EFX_PCI_DEVID_MEDFORD4			0x0C03
-#define	EFX_PCI_DEVID_MEDFORD4_VF		0x1C03
+#define	EFX_PCI_DEVID_MEDFORD4			0x0C03	/* X4 PF, FF+LL */
+#define	EFX_PCI_DEVID_MEDFORD4_VF		0x1C03	/* X4 VF, FF+LL */
+#define	EFX_PCI_DEVID_MEDFORD4_NO_LL		0x2C03	/* X4 PF, FF only */
+#define	EFX_PCI_DEVID_MEDFORD4_NO_LL_VF		0x3C03	/* X4 VF, FF only */
 
 #define	EFX_MEM_BAR_SIENA			2
 
@@ -190,7 +196,7 @@ efx_family_probe_bar(
 /* FIXME Fix it when memory bar is fixed in FPGA image. It must be 0. */
 #define	EFX_MEM_BAR_RIVERHEAD			2
 
-#define	EFX_MEM_BAR_MEDFORD4			0
+#define	EFX_MEM_BAR_MEDFORD4			2
 
 /* Error codes */
 
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 5bcc0a04ff..1ec684da40 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -87,6 +87,8 @@ efx_family(
 			 */
 		case EFX_PCI_DEVID_MEDFORD4:
 		case EFX_PCI_DEVID_MEDFORD4_VF:
+		case EFX_PCI_DEVID_MEDFORD4_NO_LL:
+		case EFX_PCI_DEVID_MEDFORD4_NO_LL_VF:
 			*efp = EFX_FAMILY_MEDFORD4;
 			*membarp = EFX_MEM_BAR_MEDFORD4;
 			return (0);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 15/46] net/sfc: add Medford4 with only full feature datapath engine
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (13 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 14/46] common/sfc_efx/base: update X4 BAR layout and PCI IDs Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 16/46] common/sfc_efx/base: add port mode for 8 port hardware Ivan Malov
                   ` (32 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Andy Moreton <andy.moreton@amd.com>

Add PCI IDs for Medford4 functions that only have the full feature
datapath engine (no support for low latency datapath engine).

Signed-off-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Ivan Malov <ivan.malov@arknetworks.am>
---
 drivers/net/sfc/sfc_ethdev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 3e57c902df..05194918f9 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -3304,6 +3304,8 @@ static const struct rte_pci_id pci_id_sfc_efx_map[] = {
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD2_VF) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD4) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD4_VF) },
+	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD4_NO_LL) },
+	{ RTE_PCI_DEVICE(EFX_PCI_VENID_SFC, EFX_PCI_DEVID_MEDFORD4_NO_LL_VF) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_XILINX, EFX_PCI_DEVID_RIVERHEAD) },
 	{ RTE_PCI_DEVICE(EFX_PCI_VENID_XILINX, EFX_PCI_DEVID_RIVERHEAD_VF) },
 	{ .vendor_id = 0 /* sentinel */ }
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 16/46] common/sfc_efx/base: add port mode for 8 port hardware
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (14 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 15/46] net/sfc: add Medford4 with only full feature datapath engine Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 17/46] common/sfc_efx/base: add new X4 port mode Ivan Malov
                   ` (31 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

From: Andy Moreton <andy.moreton@amd.com>

Add support for 8 port mode and adjust the bus bandwidth
computation and external port mapping table.

Signed-off-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Ivan Malov <ivan.malov@arknetworks.am>
---
 drivers/common/sfc_efx/base/ef10_nic.c        | 20 +++++++++++++++++++
 drivers/common/sfc_efx/base/ef10_tlv_layout.h |  9 ++++++---
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 77c97217ee..0e00ff64d4 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -176,6 +176,9 @@ ef10_nic_get_port_mode_bandwidth(
 	case TLV_PORT_MODE_2x1_2x1:			/* mode 5 */
 		bandwidth = (2 * single_lane) + (2 * single_lane);
 		break;
+	case TLV_PORT_MODE_4x1_4x1:			/* mode 26 */
+		bandwidth = (4 * single_lane) + (4 * single_lane);
+		break;
 	case TLV_PORT_MODE_1x2_1x2:			/* mode 12 */
 		bandwidth = dual_lane + dual_lane;
 		break;
@@ -1952,6 +1955,23 @@ static struct ef10_external_port_map_s {
 		(1U << TLV_PORT_MODE_4x1_NA),			/* mode 4 */
 		{ 0, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
+	/*
+	 * Modes that on Medford4 allocate up to 4 adjacent port numbers
+	 * to cage 1 and 4 port numbers to cage 2.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 1
+	 *	port 2 -> cage 1
+	 *	port 3 -> cage 1
+	 *	port 4 -> cage 2
+	 *	port 5 -> cage 2
+	 *	port 6 -> cage 2
+	 *	port 7 -> cage 2
+	 */
+	{
+		EFX_FAMILY_MEDFORD4,
+		(1U << TLV_PORT_MODE_4x1_4x1),			/* mode 26 */
+		{ 0, 4, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
 	/* FIXME: review Medford4 port modes */
 };
 
diff --git a/drivers/common/sfc_efx/base/ef10_tlv_layout.h b/drivers/common/sfc_efx/base/ef10_tlv_layout.h
index 9ac50f1df6..712a1c7d26 100644
--- a/drivers/common/sfc_efx/base/ef10_tlv_layout.h
+++ b/drivers/common/sfc_efx/base/ef10_tlv_layout.h
@@ -7,7 +7,7 @@
 /*
  * This is NOT the original source file. Do NOT edit it.
  * To update the tlv layout, please edit the copy in
- * the sfregistry repo and then, in that repo,
+ * the smartnic_registry repo and then, in that repo,
  * "make tlv_headers" or "make export" to
  * regenerate and export all types of headers.
  */
@@ -635,7 +635,10 @@ struct tlv_global_port_mode {
 #define TLV_PORT_MODE_1x1_NA_LL                  (23) /* Single 10G/25G on mdi0, low-latency PCS */
 #define TLV_PORT_MODE_1x1_1x1_LL                 (24) /* Single 10G/25G on mdi0, single 10G/25G on mdi1, low-latency PCS */
 #define TLV_PORT_MODE_BUG63720_DO_NOT_USE        (9) /* bug63720: Do not use */
-#define TLV_PORT_MODE_MAX TLV_PORT_MODE_1x1_1x1_LL
+
+/* X4 */
+
+#define TLV_PORT_MODE_4x1_4x1                    (25) /* Quad 10G/25G on mdi0, quad 10G/25G on mdi1 */
 
 /* Deprecated Medford aliases - DO NOT USE IN NEW CODE */
 #define TLV_PORT_MODE_10G_10G_10G_10G_Q          (5)
@@ -643,7 +646,7 @@ struct tlv_global_port_mode {
 #define TLV_PORT_MODE_10G_10G_10G_10G_Q2         (8)
 #define TLV_PORT_MODE_10G_10G_10G_10G_Q1_Q2      (9)
 
-#define TLV_PORT_MODE_MAX TLV_PORT_MODE_1x1_1x1_LL
+#define TLV_PORT_MODE_MAX TLV_PORT_MODE_4x1_4x1
 };
 
 /* Type of the v-switch created implicitly by the firmware */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 17/46] common/sfc_efx/base: add new X4 port mode
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (15 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 16/46] common/sfc_efx/base: add port mode for 8 port hardware Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 18/46] common/sfc_efx/base: extend list of supported X4 port modes Ivan Malov
                   ` (30 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov,
	Richard Houldsworth

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Add handling for the port mode in the Medford4 driver logic,
enabling support for two single network ports.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Richard Houldsworth <richard.houldsworth@amd.com>
Reviewed-by: Ivan Malov <ivan.malov@arknetworks.am>
---
 .mailmap                               |  2 +-
 drivers/common/sfc_efx/base/ef10_nic.c | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/.mailmap b/.mailmap
index afebbb32e6..1fbad1e1ae 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1295,7 +1295,7 @@ Ricardo Salveti <ricardo.salveti@linaro.org>
 Richael Zhuang <richael.zhuang@arm.com>
 Richard Donkin <richard.donkin@corigine.com>
 Richard Eklycke <richard.eklycke@ericsson.com>
-Richard Houldsworth <rhouldsw@xilinx.com> <rhouldsworth@solarflare.com>
+Richard Houldsworth <richard.houldsworth@amd.com> <rhouldsw@xilinx.com> <rhouldsworth@solarflare.com>
 Richard Walsh <richard.walsh@intel.com>
 Rich Lane <rich.lane@bigswitch.com>
 Ricky Li <ricky.li@intel.com>
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 0e00ff64d4..e28978e4cc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1972,6 +1972,16 @@ static struct ef10_external_port_map_s {
 		(1U << TLV_PORT_MODE_4x1_4x1),			/* mode 26 */
 		{ 0, 4, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
+	/*
+	 * Modes that on Medford4 allocate each port number to a separate cage.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 2
+	 */
+	{
+		EFX_FAMILY_MEDFORD4,
+		(1U << TLV_PORT_MODE_1x4_1x4),			/* mode 3 */
+		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
 	/* FIXME: review Medford4 port modes */
 };
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 18/46] common/sfc_efx/base: extend list of supported X4 port modes
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (16 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 17/46] common/sfc_efx/base: add new X4 port mode Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 19/46] common/sfc_efx/base: update MCDI headers Ivan Malov
                   ` (29 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov,
	Richard Houldsworth

From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>

Add X4 port mode that allocates two 10G/25G/50G ports
to separate cages.

Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Richard Houldsworth <richard.houldsworth@amd.com>
Reviewed-by: Ivan Malov <ivan.malov@arknetworks.am>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index e28978e4cc..e1e8de5396 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1979,6 +1979,7 @@ static struct ef10_external_port_map_s {
 	 */
 	{
 		EFX_FAMILY_MEDFORD4,
+		(1U << TLV_PORT_MODE_1x1_1x1) |			/* mode 2 */
 		(1U << TLV_PORT_MODE_1x4_1x4),			/* mode 3 */
 		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 19/46] common/sfc_efx/base: update MCDI headers
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (17 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 18/46] common/sfc_efx/base: extend list of supported X4 port modes Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 20/46] common/sfc_efx/base: provide a stub for basic netport attach Ivan Malov
                   ` (28 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Pick up new X4 network port MCDI defines.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 .mailmap                                    |    1 +
 drivers/common/sfc_efx/base/efx_regs_mcdi.h | 5868 ++++++++++++++++++-
 2 files changed, 5816 insertions(+), 53 deletions(-)

diff --git a/.mailmap b/.mailmap
index 1fbad1e1ae..f46390b2d0 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1208,6 +1208,7 @@ Phil Yang <phil.yang@arm.com>
 Philip Prindeville <philipp@redfish-solutions.com>
 Pier Damouny <pdamouny@nvidia.com>
 Pierre Pfister <ppfister@cisco.com>
+Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
 Piotr Azarewicz <piotr.azarewicz@intel.com> <piotrx.t.azarewicz@intel.com>
 Piotr Bartosiewicz <piotr.bartosiewicz@atendesoftware.pl>
 Piotr Bronowski <piotrx.bronowski@intel.com>
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi.h b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
index 41751344b4..a981d0be5e 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
@@ -408,6 +408,12 @@
  */
 #define	MC_CMD_ERR_PIOBUFS_PRESENT 0x101b
 
+/* PORT_DIRECTION enum: Traffic direction for the port configuration APIs. */
+/* enum: Receive */
+#define	PORT_DIRECTION_RX 0x0
+/* enum: Transmit */
+#define	PORT_DIRECTION_TX 0x1
+
 /* MC_CMD_RESOURCE_SPECIFIER enum */
 /* enum: Any */
 #define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
@@ -445,6 +451,14 @@
  * an on-NIC ARM module is expected to be connected.
  */
 #define	PCIE_INTERFACE_NIC_EMBEDDED 0x1
+/* enum: The PCIe logical interface 0. It is an alias for HOST_PRIMARY. */
+#define	PCIE_INTERFACE_PCIE_HOST_INTF_0 0x0
+/* enum: The PCIe logical interface 1. */
+#define	PCIE_INTERFACE_PCIE_HOST_INTF_1 0x2
+/* enum: The PCIe logical interface 2. */
+#define	PCIE_INTERFACE_PCIE_HOST_INTF_2 0x3
+/* enum: The PCIe logical interface 3. */
+#define	PCIE_INTERFACE_PCIE_HOST_INTF_3 0x4
 /* enum: For MCDI commands issued over a PCIe interface, this value is
  * translated into the interface over which the command was issued. Not
  * meaningful for other MCDI transports.
@@ -682,6 +696,53 @@
  */
 #define	MAE_COUNTER_ID_NULL 0xffffffff
 
+/* PR_METADATA_ITEM_CATEGORY enum: Meta-data item category */
+/* enum: A XCLBIN meta-data section */
+#define	PR_METADATA_ITEM_CATEGORY_SECTION 0x0
+/* enum: The active XCLBIN's UUID (axlf_header::uuid) */
+#define	PR_METADATA_ITEM_CATEGORY_UUID 0x1
+/* enum: The active XCLBIN's timestamp (axlf_header::m_timeStamp) */
+#define	PR_METADATA_ITEM_CATEGORY_TIMESTAMP 0x2
+/* enum: The active XCLBIN's signature (the last axlf::m_signature_length bytes
+ * of the XCLBIN data)
+ */
+#define	PR_METADATA_ITEM_CATEGORY_SIGNATURE 0x3
+
+/* PR_METADATA_ITEM_SUBCATEGORY enum: Meta-data item sub-category. For the
+ * SECTION category the subcategory matches AXLF section type identifiers (enum
+ * axlf_section_kind) and each subcategory contains an array of items as the
+ * AXLF container format supports multiple sections of the same type. Other
+ * categories (UUID, TIMESTAMP and SIGNATURE) do not currently use
+ * subcategories and must be 0 (NONE).
+ */
+#define	PR_METADATA_ITEM_SUBCATEGORY_NONE 0x0 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_BITSTREAM 0x0 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_CLEARING_BITSTREAM 0x1 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_EMBEDDED_METADATA 0x2 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_FIRMWARE 0x3 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_DEBUG_DATA 0x4 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_SCHED_FIRMWARE 0x5 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_MEM_TOPOLOGY 0x6 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_CONNECTIVITY 0x7 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_IP_LAYOUT 0x8 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_DEBUG_IP_LAYOUT 0x9 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_DESIGN_CHECK_POINT 0xa /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_CLOCK_FREQ_TOPOLOGY 0xb /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_MCS 0xc /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_BMC 0xd /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_BUILD_METADATA 0xe /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_KEYVALUE_METADATA 0xf /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_USER_METADATA 0x10 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_DNA_CERTIFICATE 0x11 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_PDI 0x12 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_BITSTREAM_PARTIAL_PDI 0x13 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_PARTITION_METADATA 0x14 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_EMULATION_DATA 0x15 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_SYSTEM_METADATA 0x16 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_SOFT_KERNEL 0x17 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_ASK_FLASH 0x18 /* enum */
+#define	PR_METADATA_ITEM_SUBCATEGORY_AIE_METADATA 0x19 /* enum */
+
 /* TABLE_ID enum: Unique IDs for tables. The 32-bit ID values have been
  * structured with bits [31:24] reserved (0), [23:16] indicating which major
  * block the tables belongs to (0=VNIC TX, none currently; 1=MAE; 2=VNIC RX),
@@ -1241,10 +1302,7 @@
 #define	TABLE_FIELD_ID_CRC_REFOUT 0x3f4
 /* enum: If set, invert every bit of the output value. */
 #define	TABLE_FIELD_ID_CRC_INVOUT 0x3f5
-/* enum: The CRC polynomial to use for checksumming, in normal form. See
- * https://en.wikipedia.org/wiki/Cyclic_redundancy_check#Specification for a
- * description of normal form.
- */
+/* enum: The CRC polynomial to use for checksumming, in normal form. */
 #define	TABLE_FIELD_ID_CRC_POLY 0x3f6
 /* enum: Operation for the checksum engine to perform - see DPU_CSUM_OP enum.
  */
@@ -1335,6 +1393,24 @@
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_WIDTH 8
+#define	MCDI_EVENT_PORT_LINKCHANGE_PORT_HANDLE_OFST 0
+#define	MCDI_EVENT_PORT_LINKCHANGE_PORT_HANDLE_LBN 0
+#define	MCDI_EVENT_PORT_LINKCHANGE_PORT_HANDLE_WIDTH 24
+#define	MCDI_EVENT_PORT_LINKCHANGE_SEQ_NUM_OFST 0
+#define	MCDI_EVENT_PORT_LINKCHANGE_SEQ_NUM_LBN 24
+#define	MCDI_EVENT_PORT_LINKCHANGE_SEQ_NUM_WIDTH 7
+#define	MCDI_EVENT_PORT_LINKCHANGE_LINK_UP_OFST 0
+#define	MCDI_EVENT_PORT_LINKCHANGE_LINK_UP_LBN 31
+#define	MCDI_EVENT_PORT_LINKCHANGE_LINK_UP_WIDTH 1
+#define	MCDI_EVENT_PORT_MODULECHANGE_PORT_HANDLE_OFST 0
+#define	MCDI_EVENT_PORT_MODULECHANGE_PORT_HANDLE_LBN 0
+#define	MCDI_EVENT_PORT_MODULECHANGE_PORT_HANDLE_WIDTH 24
+#define	MCDI_EVENT_PORT_MODULECHANGE_SEQ_NUM_OFST 0
+#define	MCDI_EVENT_PORT_MODULECHANGE_SEQ_NUM_LBN 24
+#define	MCDI_EVENT_PORT_MODULECHANGE_SEQ_NUM_WIDTH 7
+#define	MCDI_EVENT_PORT_MODULECHANGE_MDI_CONNECTED_OFST 0
+#define	MCDI_EVENT_PORT_MODULECHANGE_MDI_CONNECTED_LBN 31
+#define	MCDI_EVENT_PORT_MODULECHANGE_MDI_CONNECTED_WIDTH 1
 #define	MCDI_EVENT_SENSOREVT_MONITOR_OFST 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_LBN 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_WIDTH 8
@@ -1709,6 +1785,25 @@
  * VI ID.
  */
 #define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_QUEUE_START 0x28
+/* enum: Notification of a change in link state and/or link speed of a network
+ * port link. This event applies to a network port identified by a handle,
+ * PORT_HANDLE, which is discovered by the driver using the MC_CMD_ENUM_PORTS
+ * command.
+ */
+#define	MCDI_EVENT_CODE_PORT_LINKCHANGE 0x29
+/* enum: Notification of a change in the state of an MDI (external connector)
+ * of a network port. This typically corresponds to module plug/unplug for
+ * modular interfaces (e.g., SFP/QSFP and similar) or cable connect/disconnect.
+ * This event applies to a network port identified by a handle, PORT_HANDLE,
+ * which is discovered by the driver using the MC_CMD_ENUM_PORTS command.
+ */
+#define	MCDI_EVENT_CODE_PORT_MODULECHANGE 0x2a
+/* enum: Notification that the port enumeration journal has changed since it
+ * was last read and updates can be read using the MC_CMD_ENUM_PORTS command.
+ * The firmware may moderate the events so that an event is not sent for every
+ * change to the journal.
+ */
+#define	MCDI_EVENT_CODE_ENUM_PORTS_CHANGE 0x2b
 /* enum: Artificial event generated by host and posted via MC for test
  * purposes.
  */
@@ -1721,6 +1816,14 @@
 #define	MCDI_EVENT_LINKCHANGE_DATA_LEN 4
 #define	MCDI_EVENT_LINKCHANGE_DATA_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_DATA_WIDTH 32
+#define	MCDI_EVENT_PORT_LINKCHANGE_DATA_OFST 0
+#define	MCDI_EVENT_PORT_LINKCHANGE_DATA_LEN 4
+#define	MCDI_EVENT_PORT_LINKCHANGE_DATA_LBN 0
+#define	MCDI_EVENT_PORT_LINKCHANGE_DATA_WIDTH 32
+#define	MCDI_EVENT_PORT_MODULECHANGE_DATA_OFST 0
+#define	MCDI_EVENT_PORT_MODULECHANGE_DATA_LEN 4
+#define	MCDI_EVENT_PORT_MODULECHANGE_DATA_LBN 0
+#define	MCDI_EVENT_PORT_MODULECHANGE_DATA_WIDTH 32
 #define	MCDI_EVENT_SENSOREVT_DATA_OFST 0
 #define	MCDI_EVENT_SENSOREVT_DATA_LEN 4
 #define	MCDI_EVENT_SENSOREVT_DATA_LBN 0
@@ -3302,8 +3405,11 @@
  * subscribers.
  */
 #define	MC_CMD_PTP_OP_SET_SYNC_STATUS 0x1b
-/* enum: Above this for future use. */
-#define	MC_CMD_PTP_OP_MAX 0x1c
+/* enum: X4 and later adapters should use this instead of
+ * PTP_OP_TIME_EVENT_SUBSCRIBE. Subscribe to receive periodic time events
+ * indicating the current NIC time
+ */
+#define	MC_CMD_PTP_OP_TIME_EVENT_SUBSCRIBE_V2 0x1c
 
 /* MC_CMD_PTP_IN_ENABLE msgrequest */
 #define	MC_CMD_PTP_IN_ENABLE_LEN 16
@@ -3744,6 +3850,22 @@
 #define	MC_CMD_PTP_IN_TIME_EVENT_UNSUBSCRIBE_QUEUE_OFST 12
 #define	MC_CMD_PTP_IN_TIME_EVENT_UNSUBSCRIBE_QUEUE_LEN 4
 
+/* MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2 msgrequest */
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_LEN 16
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_CMD_LEN 4 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_LEN 4 */
+/* Event queue ID */
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_QUEUE_ID_OFST 8
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_QUEUE_ID_LEN 4
+/* Space for flags. */
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_FLAGS_OFST 12
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_FLAGS_LEN 4
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_REPORT_SYNC_STATUS_OFST 12
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_REPORT_SYNC_STATUS_LBN 31
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_V2_REPORT_SYNC_STATUS_WIDTH 1
+
 /* MC_CMD_PTP_IN_MANFTEST_PPS msgrequest */
 #define	MC_CMD_PTP_IN_MANFTEST_PPS_LEN 12
 /*            MC_CMD_PTP_IN_CMD_OFST 0 */
@@ -6262,13 +6384,837 @@
 #define	FEC_TYPE_TYPE_LEN 4
 /* enum: No FEC */
 #define	MC_CMD_FEC_NONE 0x0
-/* enum: Clause 74 BASE-R FEC (a.k.a Firecode) */
+/* enum: IEEE 802.3, Clause 74 BASE-R FEC (a.k.a Firecode) */
 #define	MC_CMD_FEC_BASER 0x1
-/* enum: Clause 91/Clause 108 Reed-Solomon FEC */
+/* enum: IEEE 802.3, Clause 91/Clause 108 Reed-Solomon FEC */
 #define	MC_CMD_FEC_RS 0x2
+/* enum: IEEE 802.3, Clause 161, interleaved RS-FEC sublayer for 100GBASE-R
+ * PHYs
+ */
+#define	MC_CMD_FEC_IEEE_RS_INT 0x3
+/* enum: Ethernet Consortium, Low Latency RS-FEC. RS(272, 258). Replaces FEC
+ * specified in Clause 119 for 100/200G PHY. Replaces FEC specified in Clause
+ * 134 for 50G PHY.
+ */
+#define	MC_CMD_FEC_ETCS_RS_LL 0x4
+/* enum: FEC mode selected automatically */
+#define	MC_CMD_FEC_AUTO 0x5
 #define	FEC_TYPE_TYPE_LBN 0
 #define	FEC_TYPE_TYPE_WIDTH 32
 
+/* MC_CMD_ETH_TECH structuredef: Ethernet technology as defined by IEEE802.3,
+ * Ethernet Technology Consortium, proprietary technologies. The driver must
+ * not use technologies labelled NONE and AUTO.
+ */
+#define	MC_CMD_ETH_TECH_LEN 16
+/* The enums in this field can be used either as bitwise indices into a tech
+ * mask (e.g. see MC_CMD_ETH_AN_FIELDS/TECH_MASK for example) or as regular
+ * enums (e.g. see MC_CMD_LINK_CTRL_IN/ADVERTISED_TECH_ABILITIES_MASK). This
+ * structure must be updated to add new technologies when projects that need
+ * them arise. An incomplete list of possible expansion in the future include:
+ * 100GBASE_KP4, 800GBASE_CR8, 800GBASE_KR8, 800GBASE_DR8, 800GBASE_SR8
+ * 800GBASE_VR8
+ */
+#define	MC_CMD_ETH_TECH_TECH_OFST 0
+#define	MC_CMD_ETH_TECH_TECH_LEN 16
+/* enum: 1000BASE-KX - 1000BASE-X PCS/PMA over an electrical backplane PMD. See
+ * IEEE 802.3 Clause 70
+ */
+#define	MC_CMD_ETH_TECH_1000BASEKX 0x0
+/* enum: 10GBASE-R - PCS/PMA over an electrical backplane PMD. Refer to IEEE
+ * 802.3 Clause 72
+ */
+#define	MC_CMD_ETH_TECH_10GBASE_KR 0x1
+/* enum: 40GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 84.
+ */
+#define	MC_CMD_ETH_TECH_40GBASE_KR4 0x2
+/* enum: 40GBASE-R PCS/PMA over 4 lane shielded copper balanced cable PMD. See
+ * IEEE 802.3 Clause 85
+ */
+#define	MC_CMD_ETH_TECH_40GBASE_CR4 0x3
+/* enum: 40GBASE-R PCS/PMA over 4 lane multimode fiber PMD as specified in
+ * Clause 86
+ */
+#define	MC_CMD_ETH_TECH_40GBASE_SR4 0x4
+/* enum: 40GBASE-R PCS/PMA over 4 WDM lane single mode fiber PMD with long
+ * reach. See IEEE 802.3 Clause 87
+ */
+#define	MC_CMD_ETH_TECH_40GBASE_LR4 0x5
+/* enum: 25GBASE-R PCS/PMA over shielded balanced copper cable PMD. See IEEE
+ * 802.3 Clause 110
+ */
+#define	MC_CMD_ETH_TECH_25GBASE_CR 0x6
+/* enum: 25GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 111
+ */
+#define	MC_CMD_ETH_TECH_25GBASE_KR 0x7
+/* enum: 25GBASE-R PCS/PMA over multimode fiber PMD. Refer to IEEE 802.3 Clause
+ * 112
+ */
+#define	MC_CMD_ETH_TECH_25GBASE_SR 0x8
+/* enum: An Ethernet Physical layer operating at 50 Gb/s on twin-axial copper
+ * cable. Refer to Ethernet Technology Consortium 25/50G Ethernet Spec.
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_CR2 0x9
+/* enum: An Ethernet Physical layer operating at 50 Gb/s on copper backplane.
+ * Refer to Ethernet Technology Consortium 25/50G Ethernet Spec.
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_KR2 0xa
+/* enum: 100GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 93
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_KR4 0xb
+/* enum: 100GBASE-R PCS/PMA over 4 lane multimode fiber PMD. See IEEE 802.3
+ * Clause 95
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_SR4 0xc
+/* enum: 100GBASE-R PCS/PMA over 4 lane shielded copper balanced cable PMD. See
+ * IEEE 802.3 Clause 92
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_CR4 0xd
+/* enum: 100GBASE-R PCS/PMA over 4 WDM lane single mode fiber PMD, with
+ * long/extended reach,. See IEEE 802.3 Clause 88
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_LR4_ER4 0xe
+/* enum: An Ethernet Physical layer operating at 50 Gb/s on short reach fiber.
+ * Refer to Ethernet Technology Consortium 25/50G Ethernet Spec.
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_SR2 0xf
+/* enum: 1000BASEX PCS/PMA. See IEEE 802.3 Clause 36 over undefined PMD, duplex
+ * mode unknown
+ */
+#define	MC_CMD_ETH_TECH_1000BASEX 0x10
+/* enum: Non-standardised. 10G direct attach */
+#define	MC_CMD_ETH_TECH_10GBASE_CR 0x11
+/* enum: 10GBASE-SR fiber over 850nm optics. See IEEE 802.3 Clause 52 */
+#define	MC_CMD_ETH_TECH_10GBASE_SR 0x12
+/* enum: 10GBASE-LR fiber over 1310nm optics. See IEEE 802.3 Clause 52 */
+#define	MC_CMD_ETH_TECH_10GBASE_LR 0x13
+/* enum: 10GBASE-LRM fiber over 1310 nm optics. See IEEE 802.3 Clause 68 */
+#define	MC_CMD_ETH_TECH_10GBASE_LRM 0x14
+/* enum: 10GBASE-ER fiber over 1550nm optics. See IEEE 802.3 Clause 52 */
+#define	MC_CMD_ETH_TECH_10GBASE_ER 0x15
+/* enum: 50GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 137
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_KR 0x16
+/* enum: 50GBASE-SR PCS/PMA over multimode fiber PMD as specified in Clause 138
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_SR 0x17
+/* enum: 50GBASE-CR PCS/PMA over shielded copper balanced cable PMD. See IEEE
+ * 802.3 Clause 136
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_CR 0x18
+/* enum: 50GBASE-R PCS/PMA over single mode fiber PMD as specified in Clause
+ * 139.
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_LR_ER_FR 0x19
+/* enum: 100 Gb/s PHY using 100GBASE-R encoding over single-mode fiber with
+ * reach up to at least 500 m (see IEEE 802.3 Clause 140)
+ */
+#define	MC_CMD_ETH_TECH_50GBASE_DR 0x1a
+/* enum: 100GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 137
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_KR2 0x1b
+/* enum: 100GBASE-R PCS/PMA over 2 lane multimode fiber PMD. See IEEE 802.3
+ * Clause 138
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_SR2 0x1c
+/* enum: 100GBASE-R PCS/PMA over 2 lane shielded copper balanced cable PMD. See
+ * IEEE 802.3 Clause 136
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_CR2 0x1d
+/* enum: Unknown source */
+#define	MC_CMD_ETH_TECH_100GBASE_LR2_ER2_FR2 0x1e
+/* enum: Unknown source */
+#define	MC_CMD_ETH_TECH_100GBASE_DR2 0x1f
+/* enum: 200GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 137
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_KR4 0x20
+/* enum: 200GBASE-R PCS/PMA over 4 lane multimode fiber PMD. See IEEE 802.3
+ * Clause 138
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_SR4 0x21
+/* enum: 200GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD as specified
+ * in Clause 122
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_LR4_ER4_FR4 0x22
+/* enum: 200GBASE-R PCS/PMA over 4-lane single-mode fiber PMD. See IEEE 802.3
+ * Clause 121
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_DR4 0x23
+/* enum: 200GBASE-R PCS/PMA over 4 lane shielded copper balanced cable PMD as
+ * specified in Clause 136
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_CR4 0x24
+/* enum: Ethernet Technology Consortium 400G AN Spec. 400GBASE-KR8 PMD uses
+ * 802.3 Clause 137, but the number PMD lanes is 8.
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_KR8 0x25
+/* enum: 400GBASE-R PCS/PMA over 8-lane multimode fiber PMD. See IEEE 802.3
+ * Clause 138
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_SR8 0x26
+/* enum: 400GBASE-R PCS/PMA over 8 WDM lane single-mode fiber PMD. See IEEE
+ * 802.3 Clause 122
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_LR8_ER8_FR8 0x27
+/* enum: Unknown source */
+#define	MC_CMD_ETH_TECH_400GBASE_DR8 0x28
+/* enum: Ethernet Technology Consortium 400G AN Spec. 400GBASE-CR8 PMD uses
+ * IEEE 802.3 Clause 136, but the number PMD lanes is 8.
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_CR8 0x29
+/* enum: 100GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3ck
+ * Clause 163.
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_KR 0x2a
+/* enum: IEEE 802.3ck. 100G PHY with PMD as specified in Clause 167 over short
+ * reach fiber
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_SR 0x2b
+/* enum: 100G PMD together with single-mode fiber medium. See IEEE 802.3 Clause
+ * 140
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_LR_ER_FR 0x2c
+/* enum: 100GBASE-R PCS/PMA over shielded balanced copper cable PMD. See IEEE
+ * 802.3 in Clause 162 IEEE 802.3ck.
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_CR 0x2d
+/* enum: 100G PMD together with single-mode fiber medium. See IEEE 802.3 Clause
+ * 140
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_DR 0x2e
+/* enum: 200GBASE-R PCS/PMA over an electrical backplane PMD as specified in
+ * Clause 163 IEEE 802.3ck
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_KR2 0x2f
+/* enum: 200G PHY with PMD as specified in Clause 167 over short reach fiber
+ * IEEE 802.3ck
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_SR2 0x30
+/* enum: Unknown source */
+#define	MC_CMD_ETH_TECH_200GBASE_LR2_ER2_FR2 0x31
+/* enum: Unknown source */
+#define	MC_CMD_ETH_TECH_200GBASE_DR2 0x32
+/* enum: 200GBASE-R PCS/PMA over 2 lane shielded balanced copper cable PMD as
+ * specified in Clause 162 IEEE 802.3ck.
+ */
+#define	MC_CMD_ETH_TECH_200GBASE_CR2 0x33
+/* enum: 400GBASE-R PCS/PMA over an electrical backplane PMD. See IEEE 802.3
+ * Clause 163 IEEE 802.3ck.
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_KR4 0x34
+/* enum: 400G PHY with PMD over short reach fiber. See Clause 167 of IEEE
+ * 802.3ck.
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_SR4 0x35
+/* enum: 400GBASE-R PCS/PMA over 4 WDM lane single-mode fiber PMD. See IEEE
+ * 802.3 Clause 151
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_LR4_ER4_FR4 0x36
+/* enum: 400GBASE-R PCS/PMA over 4-lane single-mode fiber PMD as specified in
+ * Clause 124
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_DR4 0x37
+/* enum: 400GBASE-R PCS/PMA over 4 lane shielded balanced copper cable PMD as
+ * specified in Clause 162 of IEEE 802.3ck.
+ */
+#define	MC_CMD_ETH_TECH_400GBASE_CR4 0x38
+/* enum: Automatic tech mode. The driver must not use this. */
+#define	MC_CMD_ETH_TECH_AUTO 0x39
+/* enum: See IEEE 802.3cc-2017 Clause 114 */
+#define	MC_CMD_ETH_TECH_25GBASE_LR_ER 0x3a
+/* enum: Up to 7 m over twinaxial copper cable assembly (10 lanes, 10 Gbit/s
+ * each) See IEEE 802.3ba-2010 Clause 85
+ */
+#define	MC_CMD_ETH_TECH_100GBASE_CR10 0x3b
+/* enum: Invalid tech mode. The driver must not use this. */
+#define	MC_CMD_ETH_TECH_NONE 0x7f
+#define	MC_CMD_ETH_TECH_TECH_LBN 0
+#define	MC_CMD_ETH_TECH_TECH_WIDTH 128
+
+/* MC_CMD_LINK_STATUS_FLAGS structuredef */
+#define	MC_CMD_LINK_STATUS_FLAGS_LEN 8
+/* Flags used to report the current configuration/state of the link. */
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_OFST 0
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_LEN 8
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_LO_OFST 0
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_LO_LEN 4
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_LO_LBN 0
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_LO_WIDTH 32
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_HI_OFST 4
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_HI_LEN 4
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_HI_LBN 32
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_HI_WIDTH 32
+/* enum property: bitshift */
+/* enum: Whether we have overall link up */
+#define	MC_CMD_LINK_STATUS_FLAGS_LINK_UP 0x0
+/* enum: If set, the PHY has no external RX link synchronisation */
+#define	MC_CMD_LINK_STATUS_FLAGS_NO_PHY_LINK 0x1
+/* enum: If set, PMD/MDI is not connected (e.g. cable disconnected, module cage
+ * empty)
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_MDI_DISCONNECTED 0x2
+/* enum: Set on error while decoding module data (e.g. module EEPROM does not
+ * contain valid values, has checksum errors, etc.)
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_BAD 0x3
+/* enum: Set when module unsupported (e.g. unsupported link rate or link
+ * technology)
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_UNSUPPORTED 0x4
+/* enum: Set on error while communicating with the module (e.g. I2C errors
+ * while reading EEPROM)
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_COMMS_FAULT 0x5
+/* enum: Set on module overcurrent/overvoltage condition */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_POWER_FAULT 0x6
+/* enum: Set on module overtemperature condition */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_THERMAL_FAULT 0x7
+/* enum: If set, the module is indicating Loss of Signal */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMD_LOS 0x8
+/* enum: If set, PMA is indicating loss of CDR lock (clock sync) */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMA_NO_CDR_LOCK 0x9
+/* enum: If set, PMA is indicating loss of analog signal */
+#define	MC_CMD_LINK_STATUS_FLAGS_PMA_LOS 0xa
+/* enum: If set, PCS is indicating loss of block lock */
+#define	MC_CMD_LINK_STATUS_FLAGS_PCS_NO_BLOCK_LOCK 0xb
+/* enum: If set, PCS is indicating loss of alignment marker lock on one or more
+ * lanes
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_PCS_NO_AM_LOCK 0xc
+/* enum: If set, PCS is indicating loss of overall alignment lock */
+#define	MC_CMD_LINK_STATUS_FLAGS_PCS_NO_ALIGN_LOCK 0xd
+/* enum: If set, PCS is indicating high bit error rate condition. */
+#define	MC_CMD_LINK_STATUS_FLAGS_PCS_HI_BER 0xe
+/* enum: If set, FEC is indicating loss of FEC lock */
+#define	MC_CMD_LINK_STATUS_FLAGS_FEC_NO_LOCK 0xf
+/* enum: If set, indicates that the number of symbol errors in a 8192-codeword
+ * window has exceeded the threshold K (417).
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_FEC_HI_SER 0x10
+/* enum: If set, the receiver has detected the local FEC has degraded. */
+#define	MC_CMD_LINK_STATUS_FLAGS_FEC_LOCAL_DEGRADED 0x11
+/* enum: If set, the receiver has detected the remote FEC has degraded. */
+#define	MC_CMD_LINK_STATUS_FLAGS_FEC_RM_DEGRADED 0x12
+/* enum: If set, the number of symbol errors is over an internal threshold. */
+#define	MC_CMD_LINK_STATUS_FLAGS_FEC_DEGRADED_SER 0x13
+/* enum: If set, autonegotiation has detected an auto-negotiation capable link
+ * partner
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_AN_ABLE 0x14
+/* enum: If set, autonegotiation base page exchange has failed */
+#define	MC_CMD_LINK_STATUS_FLAGS_AN_BP_FAILED 0x15
+/* enum: If set, autonegotiation next page exchange has failed */
+#define	MC_CMD_LINK_STATUS_FLAGS_AN_NP_FAILED 0x16
+/* enum: If set, autonegotiation has failed to negotiate a common set of
+ * capabilities
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_AN_NO_HCD 0x17
+/* enum: If set, local end link training has failed to establish link training
+ * frame lock on one or more lanes
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_LT_NO_LOCAL_FRAME_LOCK 0x18
+/* enum: If set, remote end link training has failed to establish link training
+ * frame lock on one or more lanes
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_LT_NO_RM_FRAME_LOCK 0x19
+/* enum: If set, remote end has failed to assert Receiver Ready (link training
+ * success) within the designated timeout
+ */
+#define	MC_CMD_LINK_STATUS_FLAGS_LT_NO_RX_READY 0x1a
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_LBN 0
+#define	MC_CMD_LINK_STATUS_FLAGS_STATUS_FLAGS_WIDTH 64
+
+/* MC_CMD_PAUSE_MODE structuredef */
+#define	MC_CMD_PAUSE_MODE_LEN 1
+#define	MC_CMD_PAUSE_MODE_TYPE_OFST 0
+#define	MC_CMD_PAUSE_MODE_TYPE_LEN 1
+/* enum: See IEEE 802.3 Clause 73.6.6 */
+#define	MC_CMD_PAUSE_MODE_AN_PAUSE 0x0
+/* enum: See IEEE 802.3 Clause 73.6.6 */
+#define	MC_CMD_PAUSE_MODE_AN_ASYM_DIR 0x1
+#define	MC_CMD_PAUSE_MODE_TYPE_LBN 0
+#define	MC_CMD_PAUSE_MODE_TYPE_WIDTH 8
+
+/* MC_CMD_ETH_AN_FIELDS structuredef: Fields used for IEEE 802.3 Clause 73
+ * Auto-Negotiation. Warning - This is fixed size and cannot be extended. This
+ * structure is used to define autonegotiable abilities (advertised, link
+ * partner and supported abilities).
+ */
+#define	MC_CMD_ETH_AN_FIELDS_LEN 25
+/* Mask of Ethernet technologies. The bit indices in this mask are taken from
+ * the TECH field in the MC_CMD_ETH_TECH structure.
+ */
+#define	MC_CMD_ETH_AN_FIELDS_TECH_MASK_OFST 0
+#define	MC_CMD_ETH_AN_FIELDS_TECH_MASK_LEN 16
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+#define	MC_CMD_ETH_AN_FIELDS_TECH_MASK_LBN 0
+#define	MC_CMD_ETH_AN_FIELDS_TECH_MASK_WIDTH 128
+/* Mask of supported FEC modes */
+#define	MC_CMD_ETH_AN_FIELDS_FEC_MASK_OFST 16
+#define	MC_CMD_ETH_AN_FIELDS_FEC_MASK_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+#define	MC_CMD_ETH_AN_FIELDS_FEC_MASK_LBN 128
+#define	MC_CMD_ETH_AN_FIELDS_FEC_MASK_WIDTH 32
+/* Mask of requested FEC modes */
+#define	MC_CMD_ETH_AN_FIELDS_FEC_REQ_OFST 20
+#define	MC_CMD_ETH_AN_FIELDS_FEC_REQ_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+#define	MC_CMD_ETH_AN_FIELDS_FEC_REQ_LBN 160
+#define	MC_CMD_ETH_AN_FIELDS_FEC_REQ_WIDTH 32
+/* Bitmask of negotiated pause modes */
+#define	MC_CMD_ETH_AN_FIELDS_PAUSE_MASK_OFST 24
+#define	MC_CMD_ETH_AN_FIELDS_PAUSE_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_PAUSE_MODE/TYPE */
+#define	MC_CMD_ETH_AN_FIELDS_PAUSE_MASK_LBN 192
+#define	MC_CMD_ETH_AN_FIELDS_PAUSE_MASK_WIDTH 8
+
+/* MC_CMD_LOOPBACK_V2 structuredef: Loopback modes for use with the new
+ * MC_CMD_LINK_CTRL and MC_CMD_LINK_STATE. These loopback modes are not
+ * supported in other getlink/setlink commands.
+ */
+#define	MC_CMD_LOOPBACK_V2_LEN 4
+#define	MC_CMD_LOOPBACK_V2_MODE_OFST 0
+#define	MC_CMD_LOOPBACK_V2_MODE_LEN 4
+/* enum: No loopback */
+#define	MC_CMD_LOOPBACK_V2_NONE 0x0
+/* enum: Let firmware choose a supported loopback mode */
+#define	MC_CMD_LOOPBACK_V2_AUTO 0x1
+/* enum: Loopback after the MAC */
+#define	MC_CMD_LOOPBACK_V2_POST_MAC 0x2
+/* enum: Loopback after the PCS */
+#define	MC_CMD_LOOPBACK_V2_POST_PCS 0x3
+/* enum: Loopback after the PMA */
+#define	MC_CMD_LOOPBACK_V2_POST_PMA 0x4
+/* enum: Loopback after the MDI Wireside */
+#define	MC_CMD_LOOPBACK_V2_POST_MDI_WS 0x5
+/* enum: Loopback after the PMA Wireside */
+#define	MC_CMD_LOOPBACK_V2_POST_PMA_WS 0x6
+/* enum: Loopback after the PCS Wireside */
+#define	MC_CMD_LOOPBACK_V2_POST_PCS_WS 0x7
+/* enum: Loopback after the MAC Wireside */
+#define	MC_CMD_LOOPBACK_V2_POST_MAC_WS 0x8
+/* enum: Loopback after the MAC FIFOs (before the MAC) */
+#define	MC_CMD_LOOPBACK_V2_PRE_MAC 0x9
+#define	MC_CMD_LOOPBACK_V2_MODE_LBN 0
+#define	MC_CMD_LOOPBACK_V2_MODE_WIDTH 32
+
+/* MC_CMD_FCNTL structuredef */
+#define	MC_CMD_FCNTL_LEN 4
+#define	MC_CMD_FCNTL_MASK_OFST 0
+#define	MC_CMD_FCNTL_MASK_LEN 4
+/* enum: Flow control is off. */
+#define	MC_CMD_FCNTL_OFF 0x0
+/* enum: Respond to flow control. */
+#define	MC_CMD_FCNTL_RESPOND 0x1
+/* enum: Respond to and Issue flow control. */
+#define	MC_CMD_FCNTL_BIDIR 0x2
+/* enum: Auto negotiate flow control. */
+#define	MC_CMD_FCNTL_AUTO 0x3
+/* enum: Priority flow control. This is only supported on KSB. */
+#define	MC_CMD_FCNTL_QBB 0x4
+/* enum: Issue flow control. */
+#define	MC_CMD_FCNTL_GENERATE 0x5
+#define	MC_CMD_FCNTL_MASK_LBN 0
+#define	MC_CMD_FCNTL_MASK_WIDTH 32
+
+/* MC_CMD_LINK_FLAGS structuredef */
+#define	MC_CMD_LINK_FLAGS_LEN 4
+/* The enums defined in this field are used as indices into the
+ * MC_CMD_LINK_FLAGS bitmask.
+ */
+#define	MC_CMD_LINK_FLAGS_MASK_OFST 0
+#define	MC_CMD_LINK_FLAGS_MASK_LEN 4
+/* enum property: bitshift */
+/* enum: Enable auto-negotiation. If AN is enabled, link technology and FEC
+ * mode are determined by advertised capabilities and requested FEC modes,
+ * combined with link partner capabilities. If AN is disabled, link technology
+ * is forced to LINK_TECHNOLOGY and FEC mode is forced to FEC_MODE. Not valid
+ * if loopback is enabled
+ */
+#define	MC_CMD_LINK_FLAGS_AUTONEG_EN 0x0
+/* enum: Enable parallel detect. In addition to AN, try to sense partner forced
+ * speed/FEC mode (when partner AN disabled). Only valid if AN is enabled.
+ */
+#define	MC_CMD_LINK_FLAGS_PARALLEL_DETECT_EN 0x1
+/* enum: Force link down, in electrical idle. */
+#define	MC_CMD_LINK_FLAGS_LINK_DISABLE 0x2
+/* enum: Ignore the sequence number and always apply. */
+#define	MC_CMD_LINK_FLAGS_IGNORE_MODULE_SEQ 0x3
+#define	MC_CMD_LINK_FLAGS_MASK_LBN 0
+#define	MC_CMD_LINK_FLAGS_MASK_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_LINK_CTRL
+ * Write the unified MAC/PHY link configuration. Locks required: None. Return
+ * code: 0, EINVAL, ETIME, EAGAIN
+ */
+#define	MC_CMD_LINK_CTRL 0x6b
+#define	MC_CMD_LINK_CTRL_MSGSET 0x6b
+#undef	MC_CMD_0x6b_PRIVILEGE_CTG
+
+#define	MC_CMD_0x6b_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_LINK_CTRL_IN msgrequest */
+#define	MC_CMD_LINK_CTRL_IN_LEN 40
+/* Handle to the port to set link state for. */
+#define	MC_CMD_LINK_CTRL_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_LINK_CTRL_IN_PORT_HANDLE_LEN 4
+/* Control flags */
+#define	MC_CMD_LINK_CTRL_IN_CONTROL_FLAGS_OFST 4
+#define	MC_CMD_LINK_CTRL_IN_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_FLAGS/MASK */
+/* Reserved for future expansion, and included to provide padding for alignment
+ * purposes.
+ */
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_OFST 8
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_LEN 8
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_LO_OFST 8
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_LO_LEN 4
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_LO_LBN 64
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_LO_WIDTH 32
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_HI_OFST 12
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_HI_LEN 4
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_HI_LBN 96
+#define	MC_CMD_LINK_CTRL_IN_RESERVED_HI_WIDTH 32
+/* Technology abilities to advertise during auto-negotiation */
+#define	MC_CMD_LINK_CTRL_IN_ADVERTISED_TECH_ABILITIES_MASK_OFST 16
+#define	MC_CMD_LINK_CTRL_IN_ADVERTISED_TECH_ABILITIES_MASK_LEN 16
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+/* Pause abilities to advertise during auto-negotiation. Valid when auto-
+ * negotation is enabled and MC_CMD_SET_MAC_IN/FCTL is set to
+ * MC_CMD_FCNTL_AUTO. If auto-negotiation is disabled the driver must
+ * explicitly configure pause mode with MC_CMD_SET_MAC.
+ */
+#define	MC_CMD_LINK_CTRL_IN_ADVERTISED_PAUSE_ABILITIES_MASK_OFST 32
+#define	MC_CMD_LINK_CTRL_IN_ADVERTISED_PAUSE_ABILITIES_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_PAUSE_MODE/TYPE */
+/* When auto-negotiation is enabled, this is the FEC mode to request. Note that
+ * a weaker FEC mode may get negotiated, depending on what the link partner
+ * supports. The driver should subsequently use MC_CMD_GET_LINK to check the
+ * actual negotiated FEC mode. When auto-negotiation is disabled, this is the
+ * forced FEC mode.
+ */
+#define	MC_CMD_LINK_CTRL_IN_FEC_MODE_OFST 33
+#define	MC_CMD_LINK_CTRL_IN_FEC_MODE_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+/* This is only to be used when auto-negotiation is disabled (forced speed or
+ * loopback mode). If the specified value does not align with the values
+ * defined in the enum MC_CMD_ETH_TECH/TECH, it is considered invalid.
+ */
+#define	MC_CMD_LINK_CTRL_IN_LINK_TECHNOLOGY_OFST 36
+#define	MC_CMD_LINK_CTRL_IN_LINK_TECHNOLOGY_LEN 2
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+/* The sequence number of the last MODULECHANGE event. If this doesn't match,
+ * fail with EAGAIN.
+ */
+#define	MC_CMD_LINK_CTRL_IN_MODULE_SEQ_OFST 38
+#define	MC_CMD_LINK_CTRL_IN_MODULE_SEQ_LEN 1
+/* Loopback Mode. Only valid when auto-negotiation is disabled. */
+#define	MC_CMD_LINK_CTRL_IN_LOOPBACK_OFST 39
+#define	MC_CMD_LINK_CTRL_IN_LOOPBACK_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+
+/* MC_CMD_LINK_CTRL_OUT msgresponse */
+#define	MC_CMD_LINK_CTRL_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_LINK_STATE
+ */
+#define	MC_CMD_LINK_STATE 0x6c
+#define	MC_CMD_LINK_STATE_MSGSET 0x6c
+#undef	MC_CMD_0x6c_PRIVILEGE_CTG
+
+#define	MC_CMD_0x6c_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_LINK_STATE_IN msgrequest */
+#define	MC_CMD_LINK_STATE_IN_LEN 4
+/* Handle to the port to get link state for. */
+#define	MC_CMD_LINK_STATE_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_LINK_STATE_IN_PORT_HANDLE_LEN 4
+
+/* MC_CMD_LINK_STATE_OUT msgresponse */
+#define	MC_CMD_LINK_STATE_OUT_LEN 114
+/* Flags used to report the current configuration/state of the link. */
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_OFST 0
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_LEN 8
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_LO_OFST 0
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_LO_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_LO_LBN 0
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_LO_WIDTH 32
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_HI_OFST 4
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_HI_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_HI_LBN 32
+#define	MC_CMD_LINK_STATE_OUT_STATUS_FLAGS_HI_WIDTH 32
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_STATUS_FLAGS/STATUS_FLAGS */
+/* Configured technology. If the specified value does not align with the values
+ * defined in the enum MC_CMD_ETH_TECH/TECH, it is considered invalid.
+ */
+#define	MC_CMD_LINK_STATE_OUT_LINK_TECHNOLOGY_OFST 8
+#define	MC_CMD_LINK_STATE_OUT_LINK_TECHNOLOGY_LEN 2
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+/* Configured FEC mode */
+#define	MC_CMD_LINK_STATE_OUT_FEC_MODE_OFST 10
+#define	MC_CMD_LINK_STATE_OUT_FEC_MODE_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+/* Bitmask of auto-negotiated pause modes */
+#define	MC_CMD_LINK_STATE_OUT_PAUSE_MASK_OFST 11
+#define	MC_CMD_LINK_STATE_OUT_PAUSE_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_PAUSE_MODE/TYPE */
+/* Configured loopback mode */
+#define	MC_CMD_LINK_STATE_OUT_LOOPBACK_OFST 12
+#define	MC_CMD_LINK_STATE_OUT_LOOPBACK_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+/* Abilities requested by the driver to advertise during auto-negotiation */
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_OFST 16
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_LEN 32
+/* See structuredef: MC_CMD_ETH_AN_FIELDS */
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_TECH_MASK_OFST 16
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_TECH_MASK_LEN 16
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_FEC_MASK_OFST 32
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_FEC_MASK_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_FEC_REQ_OFST 36
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_FEC_REQ_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_PAUSE_MASK_OFST 40
+#define	MC_CMD_LINK_STATE_OUT_ADVERTISED_ABILITIES_PAUSE_MASK_LEN 1
+/* Abilities advertised by the link partner during auto-negotiation */
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_OFST 48
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_LEN 32
+/* See structuredef: MC_CMD_ETH_AN_FIELDS */
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_TECH_MASK_OFST 48
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_TECH_MASK_LEN 16
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_FEC_MASK_OFST 64
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_FEC_MASK_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_FEC_REQ_OFST 68
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_FEC_REQ_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_PAUSE_MASK_OFST 72
+#define	MC_CMD_LINK_STATE_OUT_LINK_PARTNER_ABILITIES_PAUSE_MASK_LEN 1
+/* Abilities supported by the local device (including cable abilities) For
+ * fixed local device capbilities see MC_CMD_GET_LOCAL_DEVICE_INFO
+ */
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_OFST 80
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_LEN 28
+/* See structuredef: MC_CMD_ETH_AN_FIELDS */
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_TECH_MASK_OFST 80
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_TECH_MASK_LEN 16
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_FEC_MASK_OFST 96
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_FEC_MASK_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_FEC_REQ_OFST 100
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_FEC_REQ_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_PAUSE_MASK_OFST 104
+#define	MC_CMD_LINK_STATE_OUT_SUPPORTED_ABILITIES_PAUSE_MASK_LEN 1
+/* Control flags */
+#define	MC_CMD_LINK_STATE_OUT_CONTROL_FLAGS_OFST 108
+#define	MC_CMD_LINK_STATE_OUT_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_FLAGS/MASK */
+/* Sequence number to synchronize link change events */
+#define	MC_CMD_LINK_STATE_OUT_PORT_LINKCHANGE_SEQ_NUM_OFST 112
+#define	MC_CMD_LINK_STATE_OUT_PORT_LINKCHANGE_SEQ_NUM_LEN 1
+/* Sequence number to synchronize module change events */
+#define	MC_CMD_LINK_STATE_OUT_PORT_MODULECHANGE_SEQ_NUM_OFST 113
+#define	MC_CMD_LINK_STATE_OUT_PORT_MODULECHANGE_SEQ_NUM_LEN 1
+
+/* MC_CMD_LINK_STATE_OUT_V2 msgresponse: Updated LINK_STATE_OUT with
+ * LOCAL_AN_SUPPORT
+ */
+#define	MC_CMD_LINK_STATE_OUT_V2_LEN 120
+/* Flags used to report the current configuration/state of the link. */
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_OFST 0
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_LEN 8
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_LO_OFST 0
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_LO_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_LO_LBN 0
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_LO_WIDTH 32
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_HI_OFST 4
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_HI_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_HI_LBN 32
+#define	MC_CMD_LINK_STATE_OUT_V2_STATUS_FLAGS_HI_WIDTH 32
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_STATUS_FLAGS/STATUS_FLAGS */
+/* Configured technology. If the specified value does not align with the values
+ * defined in the enum MC_CMD_ETH_TECH/TECH, it is considered invalid.
+ */
+#define	MC_CMD_LINK_STATE_OUT_V2_LINK_TECHNOLOGY_OFST 8
+#define	MC_CMD_LINK_STATE_OUT_V2_LINK_TECHNOLOGY_LEN 2
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+/* Configured FEC mode */
+#define	MC_CMD_LINK_STATE_OUT_V2_FEC_MODE_OFST 10
+#define	MC_CMD_LINK_STATE_OUT_V2_FEC_MODE_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+/* Bitmask of auto-negotiated pause modes */
+#define	MC_CMD_LINK_STATE_OUT_V2_PAUSE_MASK_OFST 11
+#define	MC_CMD_LINK_STATE_OUT_V2_PAUSE_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_PAUSE_MODE/TYPE */
+/* Configured loopback mode */
+#define	MC_CMD_LINK_STATE_OUT_V2_LOOPBACK_OFST 12
+#define	MC_CMD_LINK_STATE_OUT_V2_LOOPBACK_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+/* Abilities requested by the driver to advertise during auto-negotiation */
+#define	MC_CMD_LINK_STATE_OUT_V2_ADVERTISED_ABILITIES_OFST 16
+#define	MC_CMD_LINK_STATE_OUT_V2_ADVERTISED_ABILITIES_LEN 32
+/* Abilities advertised by the link partner during auto-negotiation */
+#define	MC_CMD_LINK_STATE_OUT_V2_LINK_PARTNER_ABILITIES_OFST 48
+#define	MC_CMD_LINK_STATE_OUT_V2_LINK_PARTNER_ABILITIES_LEN 32
+/* Abilities supported by the local device (including cable abilities) For
+ * fixed local device capbilities see MC_CMD_GET_LOCAL_DEVICE_INFO
+ */
+#define	MC_CMD_LINK_STATE_OUT_V2_SUPPORTED_ABILITIES_OFST 80
+#define	MC_CMD_LINK_STATE_OUT_V2_SUPPORTED_ABILITIES_LEN 28
+/* Control flags */
+#define	MC_CMD_LINK_STATE_OUT_V2_CONTROL_FLAGS_OFST 108
+#define	MC_CMD_LINK_STATE_OUT_V2_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_FLAGS/MASK */
+/* Sequence number to synchronize link change events */
+#define	MC_CMD_LINK_STATE_OUT_V2_PORT_LINKCHANGE_SEQ_NUM_OFST 112
+#define	MC_CMD_LINK_STATE_OUT_V2_PORT_LINKCHANGE_SEQ_NUM_LEN 1
+/* Sequence number to synchronize module change events */
+#define	MC_CMD_LINK_STATE_OUT_V2_PORT_MODULECHANGE_SEQ_NUM_OFST 113
+#define	MC_CMD_LINK_STATE_OUT_V2_PORT_MODULECHANGE_SEQ_NUM_LEN 1
+/* Reports the auto-negotiation supported by the local device. This depends on
+ * the port and module properties.
+ */
+#define	MC_CMD_LINK_STATE_OUT_V2_LOCAL_AN_SUPPORT_OFST 116
+#define	MC_CMD_LINK_STATE_OUT_V2_LOCAL_AN_SUPPORT_LEN 4
+/*            Enum values, see field(s): */
+/*               AN_TYPE/TYPE */
+
+/* MC_CMD_LINK_STATE_OUT_V3 msgresponse: Updated LINK_STATE_OUT_V2 for explicit
+ * reporting of the link speed and duplex mode.
+ */
+#define	MC_CMD_LINK_STATE_OUT_V3_LEN 128
+/* Flags used to report the current configuration/state of the link. */
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_OFST 0
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_LEN 8
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_LO_OFST 0
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_LO_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_LO_LBN 0
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_LO_WIDTH 32
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_HI_OFST 4
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_HI_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_HI_LBN 32
+#define	MC_CMD_LINK_STATE_OUT_V3_STATUS_FLAGS_HI_WIDTH 32
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_STATUS_FLAGS/STATUS_FLAGS */
+/* Configured technology. If the specified value does not align with the values
+ * defined in the enum MC_CMD_ETH_TECH/TECH, it is considered invalid.
+ */
+#define	MC_CMD_LINK_STATE_OUT_V3_LINK_TECHNOLOGY_OFST 8
+#define	MC_CMD_LINK_STATE_OUT_V3_LINK_TECHNOLOGY_LEN 2
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+/* Configured FEC mode */
+#define	MC_CMD_LINK_STATE_OUT_V3_FEC_MODE_OFST 10
+#define	MC_CMD_LINK_STATE_OUT_V3_FEC_MODE_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+/* Bitmask of auto-negotiated pause modes */
+#define	MC_CMD_LINK_STATE_OUT_V3_PAUSE_MASK_OFST 11
+#define	MC_CMD_LINK_STATE_OUT_V3_PAUSE_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_PAUSE_MODE/TYPE */
+/* Configured loopback mode */
+#define	MC_CMD_LINK_STATE_OUT_V3_LOOPBACK_OFST 12
+#define	MC_CMD_LINK_STATE_OUT_V3_LOOPBACK_LEN 1
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+/* Abilities requested by the driver to advertise during auto-negotiation */
+#define	MC_CMD_LINK_STATE_OUT_V3_ADVERTISED_ABILITIES_OFST 16
+#define	MC_CMD_LINK_STATE_OUT_V3_ADVERTISED_ABILITIES_LEN 32
+/* Abilities advertised by the link partner during auto-negotiation */
+#define	MC_CMD_LINK_STATE_OUT_V3_LINK_PARTNER_ABILITIES_OFST 48
+#define	MC_CMD_LINK_STATE_OUT_V3_LINK_PARTNER_ABILITIES_LEN 32
+/* Abilities supported by the local device (including cable abilities) For
+ * fixed local device capbilities see MC_CMD_GET_LOCAL_DEVICE_INFO
+ */
+#define	MC_CMD_LINK_STATE_OUT_V3_SUPPORTED_ABILITIES_OFST 80
+#define	MC_CMD_LINK_STATE_OUT_V3_SUPPORTED_ABILITIES_LEN 28
+/* Control flags */
+#define	MC_CMD_LINK_STATE_OUT_V3_CONTROL_FLAGS_OFST 108
+#define	MC_CMD_LINK_STATE_OUT_V3_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_FLAGS/MASK */
+/* Sequence number to synchronize link change events */
+#define	MC_CMD_LINK_STATE_OUT_V3_PORT_LINKCHANGE_SEQ_NUM_OFST 112
+#define	MC_CMD_LINK_STATE_OUT_V3_PORT_LINKCHANGE_SEQ_NUM_LEN 1
+/* Sequence number to synchronize module change events */
+#define	MC_CMD_LINK_STATE_OUT_V3_PORT_MODULECHANGE_SEQ_NUM_OFST 113
+#define	MC_CMD_LINK_STATE_OUT_V3_PORT_MODULECHANGE_SEQ_NUM_LEN 1
+/* Reports the auto-negotiation supported by the local device. This depends on
+ * the port and module properties.
+ */
+#define	MC_CMD_LINK_STATE_OUT_V3_LOCAL_AN_SUPPORT_OFST 116
+#define	MC_CMD_LINK_STATE_OUT_V3_LOCAL_AN_SUPPORT_LEN 4
+/*            Enum values, see field(s): */
+/*               AN_TYPE/TYPE */
+/* Autonegotiated speed in mbit/s. The link may still be down even if this
+ * reads non-zero. LINK_SPEED field is intended to be used by drivers without
+ * the most up-to-date MCDI definitions, unable to deduce the link speed from
+ * the reported LINK_TECHNOLOGY field.
+ */
+#define	MC_CMD_LINK_STATE_OUT_V3_LINK_SPEED_OFST 120
+#define	MC_CMD_LINK_STATE_OUT_V3_LINK_SPEED_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_V3_FLAGS_OFST 124
+#define	MC_CMD_LINK_STATE_OUT_V3_FLAGS_LEN 4
+#define	MC_CMD_LINK_STATE_OUT_V3_FULL_DUPLEX_OFST 124
+#define	MC_CMD_LINK_STATE_OUT_V3_FULL_DUPLEX_LBN 0
+#define	MC_CMD_LINK_STATE_OUT_V3_FULL_DUPLEX_WIDTH 1
+
 
 /***********************************/
 /* MC_CMD_GET_LINK
@@ -6383,6 +7329,7 @@
 /* This returns the negotiated flow control value. */
 #define	MC_CMD_GET_LINK_OUT_FCNTL_OFST 20
 #define	MC_CMD_GET_LINK_OUT_FCNTL_LEN 4
+/* enum property: value */
 /*            Enum values, see field(s): */
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_OFST 24
@@ -6451,6 +7398,7 @@
 /* This returns the negotiated flow control value. */
 #define	MC_CMD_GET_LINK_OUT_V2_FCNTL_OFST 20
 #define	MC_CMD_GET_LINK_OUT_V2_FCNTL_LEN 4
+/* enum property: value */
 /*            Enum values, see field(s): */
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_OFST 24
@@ -6764,17 +7712,17 @@
 #define	MC_CMD_SET_MAC_IN_FCNTL_OFST 20
 #define	MC_CMD_SET_MAC_IN_FCNTL_LEN 4
 /* enum: Flow control is off. */
-#define	MC_CMD_FCNTL_OFF 0x0
+/*               MC_CMD_FCNTL_OFF 0x0 */
 /* enum: Respond to flow control. */
-#define	MC_CMD_FCNTL_RESPOND 0x1
+/*               MC_CMD_FCNTL_RESPOND 0x1 */
 /* enum: Respond to and Issue flow control. */
-#define	MC_CMD_FCNTL_BIDIR 0x2
-/* enum: Auto neg flow control. */
-#define	MC_CMD_FCNTL_AUTO 0x3
-/* enum: Priority flow control (eftest builds only). */
-#define	MC_CMD_FCNTL_QBB 0x4
+/*               MC_CMD_FCNTL_BIDIR 0x2 */
+/* enum: Auto negotiate flow control. */
+/*               MC_CMD_FCNTL_AUTO 0x3 */
+/* enum: Priority flow control. This is only supported on KSB. */
+/*               MC_CMD_FCNTL_QBB 0x4 */
 /* enum: Issue flow control. */
-#define	MC_CMD_FCNTL_GENERATE 0x5
+/*               MC_CMD_FCNTL_GENERATE 0x5 */
 #define	MC_CMD_SET_MAC_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAGS_LEN 4
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_OFST 24
@@ -6816,9 +7764,9 @@
 /*               MC_CMD_FCNTL_RESPOND 0x1 */
 /* enum: Respond to and Issue flow control. */
 /*               MC_CMD_FCNTL_BIDIR 0x2 */
-/* enum: Auto neg flow control. */
+/* enum: Auto negotiate flow control. */
 /*               MC_CMD_FCNTL_AUTO 0x3 */
-/* enum: Priority flow control (eftest builds only). */
+/* enum: Priority flow control. This is only supported on KSB. */
 /*               MC_CMD_FCNTL_QBB 0x4 */
 /* enum: Issue flow control. */
 /*               MC_CMD_FCNTL_GENERATE 0x5 */
@@ -6885,9 +7833,9 @@
 /*               MC_CMD_FCNTL_RESPOND 0x1 */
 /* enum: Respond to and Issue flow control. */
 /*               MC_CMD_FCNTL_BIDIR 0x2 */
-/* enum: Auto neg flow control. */
+/* enum: Auto negotiate flow control. */
 /*               MC_CMD_FCNTL_AUTO 0x3 */
-/* enum: Priority flow control (eftest builds only). */
+/* enum: Priority flow control. This is only supported on KSB. */
 /*               MC_CMD_FCNTL_QBB 0x4 */
 /* enum: Issue flow control. */
 /*               MC_CMD_FCNTL_GENERATE 0x5 */
@@ -7542,6 +8490,36 @@
 /*            Other enum values, see field(s): */
 /*               MC_CMD_MAC_STATS_V3_OUT_NO_DMA/STATISTICS */
 
+/* MC_CMD_MAC_STATS_V5_OUT_DMA msgresponse */
+#define	MC_CMD_MAC_STATS_V5_OUT_DMA_LEN 0
+
+/* MC_CMD_MAC_STATS_V5_OUT_NO_DMA msgresponse */
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_LEN (((MC_CMD_MAC_NSTATS_V5*64))>>3)
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_OFST 0
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_LEN 8
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_LO_OFST 0
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_LO_LEN 4
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_LO_LBN 0
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_LO_WIDTH 32
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_HI_OFST 4
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_HI_LEN 4
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_HI_LBN 32
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_HI_WIDTH 32
+#define	MC_CMD_MAC_STATS_V5_OUT_NO_DMA_STATISTICS_NUM MC_CMD_MAC_NSTATS_V5
+/* enum property: index */
+/* enum: Start of V5 stats buffer space */
+#define	MC_CMD_MAC_V5_DMABUF_START 0x7c
+/* enum: Link toggle counter: Number of times the link has toggled between
+ * up/down and down/up
+ */
+#define	MC_CMD_MAC_LINK_TOGGLES 0x7c
+/* enum: This includes the space at offset 125 which is the final
+ * GENERATION_END in a MAC_STATS_V5 response and otherwise unused.
+ */
+#define	MC_CMD_MAC_NSTATS_V5 0x7e
+/*            Other enum values, see field(s): */
+/*               MC_CMD_MAC_STATS_V4_OUT_NO_DMA/STATISTICS */
+
 
 /***********************************/
 /* MC_CMD_SRIOV
@@ -9410,6 +10388,28 @@
 /* MC_CMD_GET_RESOURCE_LIMITS_IN msgrequest */
 #define	MC_CMD_GET_RESOURCE_LIMITS_IN_LEN 0
 
+/* MC_CMD_GET_RESOURCE_LIMITS_IN_V2 msgrequest */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_LEN 8
+/* What type of allocation to count. */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_REQUEST_TYPE_OFST 0
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_REQUEST_TYPE_LEN 4
+/* enum: Command returns the number of each resource that the function has
+ * currently allocated.
+ */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_ALLOCATED 0x0
+/* enum: Command returns the maximum number of each resource that it could be
+ * possible for the function to allocate (ie assuming that other functions have
+ * nothing allocated beyond their minimum reservations (if any).
+ */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_MAX_POSSIBLE 0x1
+/* What type of resource to count. */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_RESOURCE_TYPE_OFST 4
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_RESOURCE_TYPE_LEN 4
+/* enum: Count full-featured (X2-style) queues */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_FULL_FEATURED_QUEUE 0x0
+/* enum: Count low-latency (X3-style) queues */
+#define	MC_CMD_GET_RESOURCE_LIMITS_IN_V2_LOW_LATENCY_QUEUE 0x1
+
 /* MC_CMD_GET_RESOURCE_LIMITS_OUT msgresponse */
 #define	MC_CMD_GET_RESOURCE_LIMITS_OUT_LEN 16
 #define	MC_CMD_GET_RESOURCE_LIMITS_OUT_BUFTBL_OFST 0
@@ -10515,7 +11515,7 @@
 /* MC_CMD_DYNAMIC_SENSORS_GET_DESCRIPTIONS
  * Get descriptions for a set of sensors, specified as an array of sensor
  * handles as returned by MC_CMD_DYNAMIC_SENSORS_LIST. Any handles which do not
- * correspond to a sensor currently managed by the MC will be dropped from
+ * correspond to a sensor currently managed by the MC will be dropped from from
  * the response. This may happen when a sensor table update is in progress, and
  * effectively means the set of usable sensors is the intersection between the
  * sets of sensors known to the driver and the MC. On Riverhead this command is
@@ -10562,7 +11562,7 @@
  * broken sensor, then the state of the response's MC_CMD_DYNAMIC_SENSORS_VALUE
  * entry will be set to BROKEN, and any value provided should be treated as
  * erroneous. Any handles which do not correspond to a sensor currently managed
- * by the MC will be dropped from the response. This may happen when a
+ * by the MC will be dropped from from the response. This may happen when a
  * sensor table update is in progress, and effectively means the set of usable
  * sensors is the intersection between the sets of sensors known to the driver
  * and the MC. On Riverhead this command is implemented as a wrapper for
@@ -10641,6 +11641,2644 @@
 /* MC_CMD_EVENT_CTRL_OUT msgrequest */
 #define	MC_CMD_EVENT_CTRL_OUT_LEN 0
 
+/* HNIC_FIFO_SIZE_PARAMS structuredef: HNIC FIFO size parameters */
+#define	HNIC_FIFO_SIZE_PARAMS_LEN 12
+/* FIFO handle */
+#define	HNIC_FIFO_SIZE_PARAMS_FIFO_HANDLE_OFST 0
+#define	HNIC_FIFO_SIZE_PARAMS_FIFO_HANDLE_LEN 4
+#define	HNIC_FIFO_SIZE_PARAMS_FIFO_HANDLE_LBN 0
+#define	HNIC_FIFO_SIZE_PARAMS_FIFO_HANDLE_WIDTH 32
+#define	HNIC_FIFO_SIZE_PARAMS_FLAGS_OFST 4
+#define	HNIC_FIFO_SIZE_PARAMS_FLAGS_LEN 4
+#define	HNIC_FIFO_SIZE_PARAMS_ENABLED_OFST 4
+#define	HNIC_FIFO_SIZE_PARAMS_ENABLED_LBN 0
+#define	HNIC_FIFO_SIZE_PARAMS_ENABLED_WIDTH 1
+#define	HNIC_FIFO_SIZE_PARAMS_FLAGS_LBN 32
+#define	HNIC_FIFO_SIZE_PARAMS_FLAGS_WIDTH 32
+/* Bytes allocated to this FIFO */
+#define	HNIC_FIFO_SIZE_PARAMS_ALLOC_SIZE_OFST 8
+#define	HNIC_FIFO_SIZE_PARAMS_ALLOC_SIZE_LEN 4
+#define	HNIC_FIFO_SIZE_PARAMS_ALLOC_SIZE_LBN 64
+#define	HNIC_FIFO_SIZE_PARAMS_ALLOC_SIZE_WIDTH 32
+
+/* HNIC_FIFO_DELAY_PARAMS structuredef: HNIC FIFO delay parameters */
+#define	HNIC_FIFO_DELAY_PARAMS_LEN 16
+/* FIFO handle */
+#define	HNIC_FIFO_DELAY_PARAMS_FIFO_HANDLE_OFST 0
+#define	HNIC_FIFO_DELAY_PARAMS_FIFO_HANDLE_LEN 4
+#define	HNIC_FIFO_DELAY_PARAMS_FIFO_HANDLE_LBN 0
+#define	HNIC_FIFO_DELAY_PARAMS_FIFO_HANDLE_WIDTH 32
+#define	HNIC_FIFO_DELAY_PARAMS_FLAGS_OFST 4
+#define	HNIC_FIFO_DELAY_PARAMS_FLAGS_LEN 4
+#define	HNIC_FIFO_DELAY_PARAMS_OVERRIDE_OFST 4
+#define	HNIC_FIFO_DELAY_PARAMS_OVERRIDE_LBN 0
+#define	HNIC_FIFO_DELAY_PARAMS_OVERRIDE_WIDTH 1
+#define	HNIC_FIFO_DELAY_PARAMS_FLAGS_LBN 32
+#define	HNIC_FIFO_DELAY_PARAMS_FLAGS_WIDTH 32
+/* XOFF threshold Only applies if the OVERRIDE flag is set. Represented in
+ * bytes
+ */
+#define	HNIC_FIFO_DELAY_PARAMS_XOFF_THRESHOLD_OFST 8
+#define	HNIC_FIFO_DELAY_PARAMS_XOFF_THRESHOLD_LEN 4
+#define	HNIC_FIFO_DELAY_PARAMS_XOFF_THRESHOLD_LBN 64
+#define	HNIC_FIFO_DELAY_PARAMS_XOFF_THRESHOLD_WIDTH 32
+/* XON threshold Only applies if the OVERRIDE flag is set. Represented in bytes
+ */
+#define	HNIC_FIFO_DELAY_PARAMS_XON_THRESHOLD_OFST 12
+#define	HNIC_FIFO_DELAY_PARAMS_XON_THRESHOLD_LEN 4
+#define	HNIC_FIFO_DELAY_PARAMS_XON_THRESHOLD_LBN 96
+#define	HNIC_FIFO_DELAY_PARAMS_XON_THRESHOLD_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_GET_HNIC_PORT_CONFIG
+ * Query the static HNIC port configuration for a physical port. Returns ENODEV
+ * if the target does not correspond to a physical port, or EPERM if the caller
+ * does not have permission to administer it. This command is deprecated. Use
+ * MC_CMD_FETCH_HNIC_PORT_CONFIG instead.
+ */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG 0x1d6
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_MSGSET 0x1d6
+#undef	MC_CMD_0x1d6_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1d6_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_HNIC_PORT_CONFIG_IN msgrequest */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_LEN 12
+/* Target port to query. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies the
+ * port by MAE port and link end, but this must correspond to a physical port
+ * to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_DIRECTION_OFST 8
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_GET_HNIC_PORT_CONFIG_OUT msgresponse */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_LENMIN 12
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_LENMAX 252
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_LEN(num) (12+4*(num))
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_NUM(len) (((len)-12)/4)
+/* Total size of buffer region assigned to this port, in bytes. */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_REGION_SIZE_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_REGION_SIZE_LEN 4
+/* Allocation granularity, in bytes. All partitioning of the buffer region must
+ * be in multiples of this value.
+ */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_ALLOC_GRANULARITY_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_ALLOC_GRANULARITY_LEN 4
+/* The number of independent FIFOs assigned to this port. */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_NUM_FIFOS_OFST 8
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_NUM_FIFOS_LEN 4
+/* Array of FIFO handles, NUM_FIFOS items long. */
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_OFST 12
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_MINNUM 0
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_MAXNUM 60
+#define	MC_CMD_GET_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_MAXNUM_MCDI2 252
+
+
+/***********************************/
+/* MC_CMD_GET_HNIC_PORT_FIFO_SIZING
+ * Returns the current state of the FIFO sizing configuration for all of the
+ * FIFOs assigned to a physical port. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it. This command is deprecated. Use
+ * MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING instead.
+ */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING 0x1d7
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_MSGSET 0x1d7
+#undef	MC_CMD_0x1d7_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1d7_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN msgrequest */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_LEN 12
+/* Target port to query. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies the
+ * port by MAE port and link end, but this must correspond to a physical port
+ * to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_OFST 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT msgresponse */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_LENMIN 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_LENMAX 248
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_LENMAX_MCDI2 1016
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_LEN(num) (8+12*(num))
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_NUM(len) (((len)-8)/12)
+/* Total size of buffer region assigned to this port, in bytes. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_REGION_SIZE_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_REGION_SIZE_LEN 4
+/* The number of independent FIFOs assigned to this port. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_NUM_FIFOS_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_SIZE_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_OFST 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_LEN 12
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_MINNUM 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_MAXNUM 20
+#define	MC_CMD_GET_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_MAXNUM_MCDI2 84
+
+
+/***********************************/
+/* MC_CMD_SET_HNIC_PORT_FIFO_SIZING
+ * Sets the FIFO sizing configuration for a physical port. This is disruptive
+ * to port operation and will cause the link to drop while the port is
+ * reconfigured. Returns ENODEV if the target does not correspond to a physical
+ * port, or EPERM if the caller does not have permission to administer it, or
+ * EINVAL if the sizing parameters are invalid. This command is deprecated. Use
+ * MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING instead.
+ */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING 0x1d8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_MSGSET 0x1d8
+#undef	MC_CMD_0x1d8_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1d8_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN msgrequest */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_LENMIN 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_LENMAX 244
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_LENMAX_MCDI2 1012
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_LEN(num) (16+12*(num))
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_NUM(len) (((len)-16)/12)
+/* Target port to configure. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies
+ * the port by MAE port and link end, but this must correspond to a physical
+ * port to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LEN 8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_LBN 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_OFST 8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* The number of FIFOs being configured. FIFOs assigned to the port but not
+ * included in the list are assumed to retain their current size configuration.
+ */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_NUM_FIFOS_OFST 12
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_SIZE_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_OFST 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_LEN 12
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_MINNUM 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_MAXNUM 19
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_MAXNUM_MCDI2 83
+
+/* MC_CMD_SET_HNIC_PORT_FIFO_SIZING_OUT msgresponse */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_SIZING_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_HNIC_PORT_PRIO_MAPPING
+ * Returns the current state of the 802.1Q priority to FIFO mapping
+ * configuration for a physical port. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it.. This command is deprecated. Use
+ * MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING instead.
+ */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING 0x1d9
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_MSGSET 0x1d9
+#undef	MC_CMD_0x1d9_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1d9_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN msgrequest */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_LEN 12
+/* Target port to query. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies the
+ * port by MAE port and link end, but this must correspond to a physical port
+ * to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_OFST 8
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_OUT msgresponse */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_OUT_LEN 32
+/* FIFO handle for each Priority Code Point(PCP), in order from 0 to 7. */
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_OUT_FIFO_HANDLE_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_OUT_FIFO_HANDLE_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_PRIO_MAPPING_OUT_FIFO_HANDLE_NUM 8
+
+
+/***********************************/
+/* MC_CMD_SET_HNIC_PORT_PRIO_MAPPING
+ * Sets the PCP priority to FIFO mapping configuration for a physical port.
+ * Returns ENODEV if the target does not correspond to a physical port, or
+ * EPERM if the caller does not have permission to administer it, or EINVAL if
+ * any of the FIFO handles are invalid in some way. This command is deprecated.
+ * Use MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING instead.
+ */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING 0x1da
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_MSGSET 0x1da
+#undef	MC_CMD_0x1da_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1da_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN msgrequest */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_LEN 44
+/* Target port to configure. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies
+ * the port by MAE port and link end, but this must correspond to a physical
+ * port to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LEN 8
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_LBN 32
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_OFST 8
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* FIFO handle for each PCP value, in order from 0 to 7. */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_FIFO_HANDLE_OFST 12
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_FIFO_HANDLE_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_IN_FIFO_HANDLE_NUM 8
+
+/* MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_OUT msgresponse */
+#define	MC_CMD_SET_HNIC_PORT_PRIO_MAPPING_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS
+ * Returns the current state of the FIFO delay parameters configuration for all
+ * of the FIFOs assigned to a physical port. Returns ENODEV if the target does
+ * not correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it. This command is deprecated. Use
+ * MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS instead.
+ */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS 0x1db
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_MSGSET 0x1db
+#undef	MC_CMD_0x1db_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1db_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN msgrequest */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LEN 12
+/* Target port to query. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies the
+ * port by MAE port and link end, but this must correspond to a physical port
+ * to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_OFST 8
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT msgresponse */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LENMIN 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LENMAX 244
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LENMAX_MCDI2 1012
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LEN(num) (4+16*(num))
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_NUM(len) (((len)-4)/16)
+/* The number of independent FIFOs assigned to this port. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_NUM_FIFOS_OFST 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_DELAY_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_OFST 4
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_LEN 16
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_MINNUM 0
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_MAXNUM 15
+#define	MC_CMD_GET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_MAXNUM_MCDI2 63
+
+
+/***********************************/
+/* MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS
+ * Sets the FIFO delay parameters configuration for a physical port. This is
+ * not disruptive to port operation. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it, or EINVAL if the sizing parameters are invalid.
+ * This command is deprecated. Use MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS
+ * instead
+ */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS 0x1dc
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_MSGSET 0x1dc
+#undef	MC_CMD_0x1dc_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1dc_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN msgrequest */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LENMIN 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LENMAX 240
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LENMAX_MCDI2 1008
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LEN(num) (16+16*(num))
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_NUM(len) (((len)-16)/16)
+/* Target port to configure. Uses MAE_LINK_ENDPOINT_SELECTOR which identifies
+ * the port by MAE port and link end, but this must correspond to a physical
+ * port to be valid. See the structure definition for more details.
+ */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LEN 8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LO_WIDTH 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_LBN 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_HI_WIDTH 32
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_TARGET_FLAT_HI_WIDTH 32
+/* Traffic direction to query. */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_OFST 8
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* The number of FIFOs being configured. FIFOs assigned to the port but not
+ * included in the list are assumed to retain their current delay
+ * configuration.
+ */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_NUM_FIFOS_OFST 12
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_DELAY_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_OFST 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_LEN 16
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_MINNUM 0
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_MAXNUM 14
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_MAXNUM_MCDI2 62
+
+/* MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT msgresponse */
+#define	MC_CMD_SET_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LEN 0
+
+/* MC_CMD_MAC_FLAGS structuredef */
+#define	MC_CMD_MAC_FLAGS_LEN 4
+/* The enums defined in this field are used as indices into the
+ * MC_CMD_MAC_FLAGS bitmask.
+ */
+#define	MC_CMD_MAC_FLAGS_MASK_OFST 0
+#define	MC_CMD_MAC_FLAGS_MASK_LEN 4
+/* enum property: bitshift */
+/* enum: Include the FCS in the packet data delivered to the host. Ignored if
+ * RX_INCLUDE_FCS not set in capabilities.
+ */
+#define	MC_CMD_MAC_FLAGS_FLAG_INCLUDE_FCS 0x0
+#define	MC_CMD_MAC_FLAGS_MASK_LBN 0
+#define	MC_CMD_MAC_FLAGS_MASK_WIDTH 32
+
+/* MC_CMD_TRANSMISSION_MODE structuredef */
+#define	MC_CMD_TRANSMISSION_MODE_LEN 4
+#define	MC_CMD_TRANSMISSION_MODE_MASK_OFST 0
+#define	MC_CMD_TRANSMISSION_MODE_MASK_LEN 4
+/* enum property: value */
+#define	MC_CMD_TRANSMISSION_MODE_PROMSC_MODE 0x0 /* enum */
+#define	MC_CMD_TRANSMISSION_MODE_UNCST_MODE 0x1 /* enum */
+#define	MC_CMD_TRANSMISSION_MODE_BRDCST_MODE 0x2 /* enum */
+#define	MC_CMD_TRANSMISSION_MODE_MASK_LBN 0
+#define	MC_CMD_TRANSMISSION_MODE_MASK_WIDTH 32
+
+/* MC_CMD_MAC_CONFIG_OPTIONS structuredef */
+#define	MC_CMD_MAC_CONFIG_OPTIONS_LEN 4
+#define	MC_CMD_MAC_CONFIG_OPTIONS_MASK_OFST 0
+#define	MC_CMD_MAC_CONFIG_OPTIONS_MASK_LEN 4
+/* enum property: bitmask */
+/* enum: Configure the MAC address. */
+#define	MC_CMD_MAC_CONFIG_OPTIONS_CFG_ADDR 0x0
+/* enum: Configure the maximum frame length. */
+#define	MC_CMD_MAC_CONFIG_OPTIONS_CFG_MAX_FRAME_LEN 0x1
+/* enum: Configure flow control. */
+#define	MC_CMD_MAC_CONFIG_OPTIONS_CFG_FCNTL 0x2
+/* enum: Configure the transmission mode. */
+#define	MC_CMD_MAC_CONFIG_OPTIONS_CFG_TRANSMISSION_MODE 0x3
+/* enum: Configure FCS. */
+#define	MC_CMD_MAC_CONFIG_OPTIONS_CFG_INCLUDE_FCS 0x4
+#define	MC_CMD_MAC_CONFIG_OPTIONS_MASK_LBN 0
+#define	MC_CMD_MAC_CONFIG_OPTIONS_MASK_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_MAC_CTRL
+ * Set MAC configuration. Return code: 0, EINVAL, ENOTSUP
+ */
+#define	MC_CMD_MAC_CTRL 0x1df
+#define	MC_CMD_MAC_CTRL_MSGSET 0x1df
+#undef	MC_CMD_0x1df_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1df_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_MAC_CTRL_IN msgrequest */
+#define	MC_CMD_MAC_CTRL_IN_LEN 32
+/* Handle for selected network port. */
+#define	MC_CMD_MAC_CTRL_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_MAC_CTRL_IN_PORT_HANDLE_LEN 4
+/* Select which parameters to configure. A parameter will only be modified if
+ * the corresponding control flag is set.
+ */
+#define	MC_CMD_MAC_CTRL_IN_CONTROL_FLAGS_OFST 4
+#define	MC_CMD_MAC_CTRL_IN_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_MAC_CONFIG_OPTIONS/MASK */
+/* MAC address of the device. */
+#define	MC_CMD_MAC_CTRL_IN_ADDR_OFST 8
+#define	MC_CMD_MAC_CTRL_IN_ADDR_LEN 8
+#define	MC_CMD_MAC_CTRL_IN_ADDR_LO_OFST 8
+#define	MC_CMD_MAC_CTRL_IN_ADDR_LO_LEN 4
+#define	MC_CMD_MAC_CTRL_IN_ADDR_LO_LBN 64
+#define	MC_CMD_MAC_CTRL_IN_ADDR_LO_WIDTH 32
+#define	MC_CMD_MAC_CTRL_IN_ADDR_HI_OFST 12
+#define	MC_CMD_MAC_CTRL_IN_ADDR_HI_LEN 4
+#define	MC_CMD_MAC_CTRL_IN_ADDR_HI_LBN 96
+#define	MC_CMD_MAC_CTRL_IN_ADDR_HI_WIDTH 32
+/* Includes the ethernet header, optional VLAN tags, payload and FCS. */
+#define	MC_CMD_MAC_CTRL_IN_MAX_FRAME_LEN_OFST 16
+#define	MC_CMD_MAC_CTRL_IN_MAX_FRAME_LEN_LEN 4
+/* Settings for flow control. */
+#define	MC_CMD_MAC_CTRL_IN_FCNTL_OFST 20
+#define	MC_CMD_MAC_CTRL_IN_FCNTL_LEN 4
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_FCNTL/MASK */
+/* Configure the MAC to transmit in one of promiscuous, unicast or broadcast
+ * mode.
+ */
+#define	MC_CMD_MAC_CTRL_IN_TRANSMISSION_MODE_OFST 24
+#define	MC_CMD_MAC_CTRL_IN_TRANSMISSION_MODE_LEN 4
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_TRANSMISSION_MODE/MASK */
+/* Flags to control and expand the configuration of the MAC. */
+#define	MC_CMD_MAC_CTRL_IN_FLAGS_OFST 28
+#define	MC_CMD_MAC_CTRL_IN_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_MAC_FLAGS/MASK */
+
+/* MC_CMD_MAC_CTRL_IN_V2 msgrequest: Updated MAC_CTRL with QBB mask */
+#define	MC_CMD_MAC_CTRL_IN_V2_LEN 33
+/* Handle for selected network port. */
+#define	MC_CMD_MAC_CTRL_IN_V2_PORT_HANDLE_OFST 0
+#define	MC_CMD_MAC_CTRL_IN_V2_PORT_HANDLE_LEN 4
+/* Select which parameters to configure. A parameter will only be modified if
+ * the corresponding control flag is set.
+ */
+#define	MC_CMD_MAC_CTRL_IN_V2_CONTROL_FLAGS_OFST 4
+#define	MC_CMD_MAC_CTRL_IN_V2_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_MAC_CONFIG_OPTIONS/MASK */
+/* MAC address of the device. */
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_OFST 8
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_LEN 8
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_LO_OFST 8
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_LO_LEN 4
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_LO_LBN 64
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_LO_WIDTH 32
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_HI_OFST 12
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_HI_LEN 4
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_HI_LBN 96
+#define	MC_CMD_MAC_CTRL_IN_V2_ADDR_HI_WIDTH 32
+/* Includes the ethernet header, optional VLAN tags, payload and FCS. */
+#define	MC_CMD_MAC_CTRL_IN_V2_MAX_FRAME_LEN_OFST 16
+#define	MC_CMD_MAC_CTRL_IN_V2_MAX_FRAME_LEN_LEN 4
+/* Settings for flow control. */
+#define	MC_CMD_MAC_CTRL_IN_V2_FCNTL_OFST 20
+#define	MC_CMD_MAC_CTRL_IN_V2_FCNTL_LEN 4
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_FCNTL/MASK */
+/* Configure the MAC to transmit in one of promiscuous, unicast or broadcast
+ * mode.
+ */
+#define	MC_CMD_MAC_CTRL_IN_V2_TRANSMISSION_MODE_OFST 24
+#define	MC_CMD_MAC_CTRL_IN_V2_TRANSMISSION_MODE_LEN 4
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_TRANSMISSION_MODE/MASK */
+/* Flags to control and expand the configuration of the MAC. */
+#define	MC_CMD_MAC_CTRL_IN_V2_FLAGS_OFST 28
+#define	MC_CMD_MAC_CTRL_IN_V2_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_MAC_FLAGS/MASK */
+/* Priority-based flow control mask (QBB). PRIO7 corresponds to the highest
+ * priority, and PRIO0 to the lowest. This field is only used when CFG_FCNTL is
+ * set and FCNTL is QBB
+ */
+#define	MC_CMD_MAC_CTRL_IN_V2_PRIO_FCNTL_MASK_OFST 32
+#define	MC_CMD_MAC_CTRL_IN_V2_PRIO_FCNTL_MASK_LEN 1
+/* enum property: bitmask */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO0 0x0 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO1 0x1 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO2 0x2 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO3 0x3 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO4 0x4 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO5 0x5 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO6 0x6 /* enum */
+#define	MC_CMD_MAC_CTRL_IN_V2_QBB_PRIO7 0x7 /* enum */
+
+/* MC_CMD_MAC_CTRL_OUT msgresponse */
+#define	MC_CMD_MAC_CTRL_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_MAC_STATE
+ * Read the MAC state. Return code: 0, ETIME.
+ */
+#define	MC_CMD_MAC_STATE 0x1e0
+#define	MC_CMD_MAC_STATE_MSGSET 0x1e0
+#undef	MC_CMD_0x1e0_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e0_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_MAC_STATE_IN msgrequest */
+#define	MC_CMD_MAC_STATE_IN_LEN 4
+/* Handle for selected network port. */
+#define	MC_CMD_MAC_STATE_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_MAC_STATE_IN_PORT_HANDLE_LEN 4
+
+/* MC_CMD_MAC_STATE_OUT msgresponse */
+#define	MC_CMD_MAC_STATE_OUT_LEN 32
+/* The configured maximum frame length of the MAC. */
+#define	MC_CMD_MAC_STATE_OUT_MAX_FRAME_LEN_OFST 0
+#define	MC_CMD_MAC_STATE_OUT_MAX_FRAME_LEN_LEN 4
+/* This returns the negotiated flow control value. */
+#define	MC_CMD_MAC_STATE_OUT_FCNTL_OFST 4
+#define	MC_CMD_MAC_STATE_OUT_FCNTL_LEN 4
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_FCNTL/MASK */
+/* MAC address of the device. */
+#define	MC_CMD_MAC_STATE_OUT_ADDR_OFST 8
+#define	MC_CMD_MAC_STATE_OUT_ADDR_LEN 8
+#define	MC_CMD_MAC_STATE_OUT_ADDR_LO_OFST 8
+#define	MC_CMD_MAC_STATE_OUT_ADDR_LO_LEN 4
+#define	MC_CMD_MAC_STATE_OUT_ADDR_LO_LBN 64
+#define	MC_CMD_MAC_STATE_OUT_ADDR_LO_WIDTH 32
+#define	MC_CMD_MAC_STATE_OUT_ADDR_HI_OFST 12
+#define	MC_CMD_MAC_STATE_OUT_ADDR_HI_LEN 4
+#define	MC_CMD_MAC_STATE_OUT_ADDR_HI_LBN 96
+#define	MC_CMD_MAC_STATE_OUT_ADDR_HI_WIDTH 32
+/* Flags indicating MAC faults. */
+#define	MC_CMD_MAC_STATE_OUT_MAC_FAULT_FLAGS_OFST 16
+#define	MC_CMD_MAC_STATE_OUT_MAC_FAULT_FLAGS_LEN 4
+/* enum property: bitshift */
+/* enum: Indicates a local MAC fault. */
+#define	MC_CMD_MAC_STATE_OUT_LOCAL 0x0
+/* enum: Indicates a remote MAC fault. */
+#define	MC_CMD_MAC_STATE_OUT_REMOTE 0x1
+/* enum: Indicates a pending reconfiguration of the MAC. */
+#define	MC_CMD_MAC_STATE_OUT_PENDING_RECONFIG 0x2
+/* The flags that were used to configure the MAC. This is a copy of the FLAGS
+ * field in the MC_CMD_MAC_CTRL_IN command.
+ */
+#define	MC_CMD_MAC_STATE_OUT_FLAGS_OFST 20
+#define	MC_CMD_MAC_STATE_OUT_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_MAC_FLAGS/MASK */
+/* The transmission mode that was used to configure the MAC. This is a copy of
+ * the TRANSMISSION_MODE field in the MC_CMD_MAC_CTRL_IN command.
+ */
+#define	MC_CMD_MAC_STATE_OUT_TRANSMISSION_MODE_OFST 24
+#define	MC_CMD_MAC_STATE_OUT_TRANSMISSION_MODE_LEN 4
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_TRANSMISSION_MODE/MASK */
+/* The control flags that were used to configure the MAC. This is a copy of the
+ * CONTROL field in the MC_CMD_MAC_CTRL_IN command.
+ */
+#define	MC_CMD_MAC_STATE_OUT_CONTROL_FLAGS_OFST 28
+#define	MC_CMD_MAC_STATE_OUT_CONTROL_FLAGS_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_MAC_CONFIG_OPTIONS/MASK */
+
+
+/***********************************/
+/* MC_CMD_GET_MPORT_HANDLE
+ * Obtain a handle to an mport identified by the provided target. Return code:
+ * 0, ENOENT
+ */
+#define	MC_CMD_GET_MPORT_HANDLE 0x1e1
+#define	MC_CMD_GET_MPORT_HANDLE_MSGSET 0x1e1
+#undef	MC_CMD_0x1e1_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e1_PRIVILEGE_CTG SRIOV_CTG_MAE
+
+/* MC_CMD_GET_MPORT_HANDLE_IN msgrequest */
+#define	MC_CMD_GET_MPORT_HANDLE_IN_LEN 4
+/* Virtual port to get handle for. This uses the MAE_LINK_ENDPOINT_SELECTOR
+ * which identifies a real or virtual network port by MAE port and link end.
+ */
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_LEN 4
+/* See structuredef: MAE_LINK_ENDPOINT_SELECTOR */
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_LEN 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FLAT_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FLAT_LEN 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_TYPE_OFST 3
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_TYPE_LEN 1
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_MPORT_ID_LEN 3
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_LBN 20
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_INTF_ID_WIDTH 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_LBN 16
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_MH_PF_ID_WIDTH 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_OFST 2
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_PF_ID_LEN 1
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_MPORT_SELECTOR_FUNC_VF_ID_LEN 2
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_LINK_END_OFST 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_LINK_END_LEN 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_LEN 8
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_LO_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_LO_LEN 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_LO_LBN 0
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_LO_WIDTH 32
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_HI_OFST 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_HI_LEN 4
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_HI_LBN 32
+#define	MC_CMD_GET_MPORT_HANDLE_IN_TARGET_FLAT_HI_WIDTH 32
+
+/* MC_CMD_GET_MPORT_HANDLE_OUT msgresponse */
+#define	MC_CMD_GET_MPORT_HANDLE_OUT_LEN 4
+/* Handle for selected mport. */
+#define	MC_CMD_GET_MPORT_HANDLE_OUT_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_MPORT_HANDLE_OUT_PORT_HANDLE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_GET_ASSIGNED_PORT_HANDLE
+ * Obtain a handle that can be operated on to configure and query the status of
+ * the link. ENOENT is returned when no port is assigned to the client. Return
+ * code: 0, ENOENT
+ */
+#define	MC_CMD_GET_ASSIGNED_PORT_HANDLE 0x1e2
+#define	MC_CMD_GET_ASSIGNED_PORT_HANDLE_MSGSET 0x1e2
+#undef	MC_CMD_0x1e2_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_ASSIGNED_PORT_HANDLE_IN msgrequest */
+#define	MC_CMD_GET_ASSIGNED_PORT_HANDLE_IN_LEN 0
+
+/* MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT msgresponse */
+#define	MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT_LEN 4
+/* Handle for assigned port. */
+#define	MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT_PORT_HANDLE_LEN 4
+
+/* MC_CMD_STAT_ID structuredef */
+#define	MC_CMD_STAT_ID_LEN 4
+#define	MC_CMD_STAT_ID_SOURCE_ID_OFST 0
+#define	MC_CMD_STAT_ID_SOURCE_ID_LEN 2
+/* enum property: index */
+/* enum: Internal markers (generation start and end markers) */
+#define	MC_CMD_STAT_ID_MARKER 0x1
+/* enum: Network port MAC statistics. */
+#define	MC_CMD_STAT_ID_MAC 0x2
+/* enum: Network port PHY statistics. */
+#define	MC_CMD_STAT_ID_PHY 0x3
+#define	MC_CMD_STAT_ID_SOURCE_ID_LBN 0
+#define	MC_CMD_STAT_ID_SOURCE_ID_WIDTH 16
+#define	MC_CMD_STAT_ID_MARKER_STAT_ID_OFST 2
+#define	MC_CMD_STAT_ID_MARKER_STAT_ID_LEN 2
+/* enum property: index */
+/* enum: This value is used to mark the start of a generation of statistics for
+ * DMA synchronization. It is incremented whenever a new set of statistics is
+ * transferred. Always the first entry in the DMA buffer.
+ */
+#define	MC_CMD_STAT_ID_GENERATION_START 0x1
+/* enum: This value is used to mark the end of a generation of statistics for
+ * DMA synchronizaion. Always the last entry in the DMA buffer and set to the
+ * same value as GENERATION_START. The host driver must compare the
+ * GENERATION_START and GENERATION_END values to verify that the DMA buffer is
+ * consistent upon copying the the DMA buffer. If they do not match, it means
+ * that new DMA transfer has started while the host driver was copying the DMA
+ * buffer. In this case, the host driver must repeat the copy operation.
+ */
+#define	MC_CMD_STAT_ID_GENERATION_END 0x2
+#define	MC_CMD_STAT_ID_MARKER_STAT_ID_LBN 16
+#define	MC_CMD_STAT_ID_MARKER_STAT_ID_WIDTH 16
+#define	MC_CMD_STAT_ID_MAC_STAT_ID_OFST 2
+#define	MC_CMD_STAT_ID_MAC_STAT_ID_LEN 2
+/* enum property: index */
+/* enum: Total number of packets transmitted (includes pause frames). */
+#define	MC_CMD_STAT_ID_TX_PKTS 0x1
+/* enum: Pause frames transmitted. */
+#define	MC_CMD_STAT_ID_TX_PAUSE_PKTS 0x2
+/* enum: Control frames transmitted. */
+#define	MC_CMD_STAT_ID_TX_CONTROL_PKTS 0x3
+/* enum: Unicast packets transmitted (includes pause frames). */
+#define	MC_CMD_STAT_ID_TX_UNICAST_PKTS 0x4
+/* enum: Multicast packets transmitted (includes pause frames). */
+#define	MC_CMD_STAT_ID_TX_MULTICAST_PKTS 0x5
+/* enum: Broadcast packets transmitted (includes pause frames). */
+#define	MC_CMD_STAT_ID_TX_BROADCAST_PKTS 0x6
+/* enum: Bytes transmitted (includes pause frames). */
+#define	MC_CMD_STAT_ID_TX_BYTES 0x7
+/* enum: Bytes transmitted with bad CRC. */
+#define	MC_CMD_STAT_ID_TX_BAD_BYTES 0x8
+/* enum: Bytes transmitted with good CRC. */
+#define	MC_CMD_STAT_ID_TX_GOOD_BYTES 0x9
+/* enum: Packets transmitted with length less than 64 bytes. */
+#define	MC_CMD_STAT_ID_TX_LT64_PKTS 0xa
+/* enum: Packets transmitted with length equal to 64 bytes. */
+#define	MC_CMD_STAT_ID_TX_64_PKTS 0xb
+/* enum: Packets transmitted with length between 65 and 127 bytes. */
+#define	MC_CMD_STAT_ID_TX_65_TO_127_PKTS 0xc
+/* enum: Packets transmitted with length between 128 and 255 bytes. */
+#define	MC_CMD_STAT_ID_TX_128_TO_255_PKTS 0xd
+/* enum: Packets transmitted with length between 256 and 511 bytes. */
+#define	MC_CMD_STAT_ID_TX_256_TO_511_PKTS 0xe
+/* enum: Packets transmitted with length between 512 and 1023 bytes. */
+#define	MC_CMD_STAT_ID_TX_512_TO_1023_PKTS 0xf
+/* enum: Packets transmitted with length between 1024 and 1518 bytes. */
+#define	MC_CMD_STAT_ID_TX_1024_TO_15XX_PKTS 0x10
+/* enum: Packets transmitted with length between 1519 and 9216 bytes. */
+#define	MC_CMD_STAT_ID_TX_15XX_TO_JUMBO_PKTS 0x11
+/* enum: Packets transmitted with length greater than 9216 bytes. */
+#define	MC_CMD_STAT_ID_TX_GTJUMBO_PKTS 0x12
+/* enum: Packets transmitted with bad FCS. */
+#define	MC_CMD_STAT_ID_TX_BAD_FCS_PKTS 0x13
+/* enum: Packets transmitted with good FCS. */
+#define	MC_CMD_STAT_ID_TX_GOOD_FCS_PKTS 0x14
+/* enum: Packets received. */
+#define	MC_CMD_STAT_ID_RX_PKTS 0x15
+/* enum: Pause frames received. */
+#define	MC_CMD_STAT_ID_RX_PAUSE_PKTS 0x16
+/* enum: Total number of good packets received. */
+#define	MC_CMD_STAT_ID_RX_GOOD_PKTS 0x17
+/* enum: Total number of BAD packets received. */
+#define	MC_CMD_STAT_ID_RX_BAD_PKTS 0x18
+/* enum: Total number of control frames received. */
+#define	MC_CMD_STAT_ID_RX_CONTROL_PKTS 0x19
+/* enum: Total number of unicast packets received. */
+#define	MC_CMD_STAT_ID_RX_UNICAST_PKTS 0x1a
+/* enum: Total number of multicast packets received. */
+#define	MC_CMD_STAT_ID_RX_MULTICAST_PKTS 0x1b
+/* enum: Total number of broadcast packets received. */
+#define	MC_CMD_STAT_ID_RX_BROADCAST_PKTS 0x1c
+/* enum: Total number of bytes received. */
+#define	MC_CMD_STAT_ID_RX_BYTES 0x1d
+/* enum: Total number of bytes received with bad CRC. */
+#define	MC_CMD_STAT_ID_RX_BAD_BYTES 0x1e
+/* enum: Total number of bytes received with GOOD CRC. */
+#define	MC_CMD_STAT_ID_RX_GOOD_BYTES 0x1f
+/* enum: Packets received with length equal to 64 bytes. */
+#define	MC_CMD_STAT_ID_RX_64_PKTS 0x20
+/* enum: Packets received with length between 65 and 127 bytes. */
+#define	MC_CMD_STAT_ID_RX_65_TO_127_PKTS 0x21
+/* enum: Packets received with length between 128 and 255 bytes. */
+#define	MC_CMD_STAT_ID_RX_128_TO_255_PKTS 0x22
+/* enum: Packets received with length between 256 and 511 bytes. */
+#define	MC_CMD_STAT_ID_RX_256_TO_511_PKTS 0x23
+/* enum: Packets received with length between 512 and 1023 bytes. */
+#define	MC_CMD_STAT_ID_RX_512_TO_1023_PKTS 0x24
+/* enum: Packets received with length between 1024 and 1518 bytes. */
+#define	MC_CMD_STAT_ID_RX_1024_TO_15XX_PKTS 0x25
+/* enum: Packets received with length between 1519 and 9216 bytes. */
+#define	MC_CMD_STAT_ID_RX_15XX_TO_JUMBO_PKTS 0x26
+/* enum: Packets received with length greater than 9216 bytes. */
+#define	MC_CMD_STAT_ID_RX_GTJUMBO_PKTS 0x27
+/* enum: Packets received with length less than 64 bytes. */
+#define	MC_CMD_STAT_ID_RX_UNDERSIZE_PKTS 0x28
+/* enum: Packets received with bad FCS. */
+#define	MC_CMD_STAT_ID_RX_BAD_FCS_PKTS 0x29
+/* enum: Packets received with GOOD FCS. */
+#define	MC_CMD_STAT_ID_RX_GOOD_FCS_PKTS 0x2a
+/* enum: Packets received with overflow. */
+#define	MC_CMD_STAT_ID_RX_OVERFLOW_PKTS 0x2b
+/* enum: Packets received with symbol error. */
+#define	MC_CMD_STAT_ID_RX_SYMBOL_ERROR_PKTS 0x2c
+/* enum: Packets received with alignment error. */
+#define	MC_CMD_STAT_ID_RX_ALIGN_ERROR_PKTS 0x2d
+/* enum: Packets received with length error. */
+#define	MC_CMD_STAT_ID_RX_LENGTH_ERROR_PKTS 0x2e
+/* enum: Packets received with internal error. */
+#define	MC_CMD_STAT_ID_RX_INTERNAL_ERROR_PKTS 0x2f
+/* enum: Packets received with jabber. These packets are larger than the
+ * allowed maximum receive unit (MRU). This indicates that a packet either has
+ * a bad CRC or has an RX error.
+ */
+#define	MC_CMD_STAT_ID_RX_JABBER_PKTS 0x30
+/* enum: Packets dropped due to having no descriptor. This is a datapath stat
+ */
+#define	MC_CMD_STAT_ID_RX_NODESC_DROPS 0x31
+/* enum: Packets received with lanes 0 and 1 character error. */
+#define	MC_CMD_STAT_ID_RX_LANES01_CHAR_ERR 0x32
+/* enum: Packets received with lanes 2 and 3 character error. */
+#define	MC_CMD_STAT_ID_RX_LANES23_CHAR_ERR 0x33
+/* enum: Packets received with lanes 0 and 1 disparity error. */
+#define	MC_CMD_STAT_ID_RX_LANES01_DISP_ERR 0x34
+/* enum: Packets received with lanes 2 and 3 disparity error. */
+#define	MC_CMD_STAT_ID_RX_LANES23_DISP_ERR 0x35
+/* enum: Packets received with match fault. */
+#define	MC_CMD_STAT_ID_RX_MATCH_FAULT 0x36
+#define	MC_CMD_STAT_ID_MAC_STAT_ID_LBN 16
+#define	MC_CMD_STAT_ID_MAC_STAT_ID_WIDTH 16
+/* Include FEC stats. */
+#define	MC_CMD_STAT_ID_PHY_STAT_ID_OFST 2
+#define	MC_CMD_STAT_ID_PHY_STAT_ID_LEN 2
+/* enum property: index */
+/* enum: Number of uncorrected FEC codewords on link (RS-FEC only from Medford2
+ * onwards)
+ */
+#define	MC_CMD_STAT_ID_FEC_UNCORRECTED_ERRORS 0x1
+/* enum: Number of corrected FEC codewords on link (RS-FEC only from Medford2
+ * onwards)
+ */
+#define	MC_CMD_STAT_ID_FEC_CORRECTED_ERRORS 0x2
+/* enum: Number of corrected 10-bit symbol errors, lane 0 (RS-FEC only) */
+#define	MC_CMD_STAT_ID_FEC_CORRECTED_SYMBOLS_LANE0 0x3
+/* enum: Number of corrected 10-bit symbol errors, lane 1 (RS-FEC only) */
+#define	MC_CMD_STAT_ID_FEC_CORRECTED_SYMBOLS_LANE1 0x4
+/* enum: Number of corrected 10-bit symbol errors, lane 2 (RS-FEC only) */
+#define	MC_CMD_STAT_ID_FEC_CORRECTED_SYMBOLS_LANE2 0x5
+/* enum: Number of corrected 10-bit symbol errors, lane 3 (RS-FEC only) */
+#define	MC_CMD_STAT_ID_FEC_CORRECTED_SYMBOLS_LANE3 0x6
+#define	MC_CMD_STAT_ID_PHY_STAT_ID_LBN 16
+#define	MC_CMD_STAT_ID_PHY_STAT_ID_WIDTH 16
+
+/* MC_CMD_STAT_DESC structuredef: Structure describing the layout and size of
+ * the stats DMA buffer descriptor.
+ */
+#define	MC_CMD_STAT_DESC_LEN 8
+/* Unique identifier of the statistic. Formatted as MC_CMD_STAT_ID */
+#define	MC_CMD_STAT_DESC_STAT_ID_OFST 0
+#define	MC_CMD_STAT_DESC_STAT_ID_LEN 4
+#define	MC_CMD_STAT_DESC_STAT_ID_LBN 0
+#define	MC_CMD_STAT_DESC_STAT_ID_WIDTH 32
+/* See structuredef: MC_CMD_STAT_ID */
+#define	MC_CMD_STAT_DESC_STAT_ID_SOURCE_ID_OFST 0
+#define	MC_CMD_STAT_DESC_STAT_ID_SOURCE_ID_LEN 2
+#define	MC_CMD_STAT_DESC_STAT_ID_SOURCE_ID_LBN 0
+#define	MC_CMD_STAT_DESC_STAT_ID_SOURCE_ID_WIDTH 16
+#define	MC_CMD_STAT_DESC_STAT_ID_MARKER_STAT_ID_OFST 2
+#define	MC_CMD_STAT_DESC_STAT_ID_MARKER_STAT_ID_LEN 2
+#define	MC_CMD_STAT_DESC_STAT_ID_MARKER_STAT_ID_LBN 16
+#define	MC_CMD_STAT_DESC_STAT_ID_MARKER_STAT_ID_WIDTH 16
+#define	MC_CMD_STAT_DESC_STAT_ID_MAC_STAT_ID_OFST 2
+#define	MC_CMD_STAT_DESC_STAT_ID_MAC_STAT_ID_LEN 2
+#define	MC_CMD_STAT_DESC_STAT_ID_MAC_STAT_ID_LBN 16
+#define	MC_CMD_STAT_DESC_STAT_ID_MAC_STAT_ID_WIDTH 16
+#define	MC_CMD_STAT_DESC_STAT_ID_PHY_STAT_ID_OFST 2
+#define	MC_CMD_STAT_DESC_STAT_ID_PHY_STAT_ID_LEN 2
+#define	MC_CMD_STAT_DESC_STAT_ID_PHY_STAT_ID_LBN 16
+#define	MC_CMD_STAT_DESC_STAT_ID_PHY_STAT_ID_WIDTH 16
+/* Index of the statistic in the DMA buffer. */
+#define	MC_CMD_STAT_DESC_STAT_INDEX_OFST 4
+#define	MC_CMD_STAT_DESC_STAT_INDEX_LEN 2
+#define	MC_CMD_STAT_DESC_STAT_INDEX_LBN 32
+#define	MC_CMD_STAT_DESC_STAT_INDEX_WIDTH 16
+/* Reserved for future extension (e.g. flags field) - currently always 0. */
+#define	MC_CMD_STAT_DESC_RESERVED_OFST 6
+#define	MC_CMD_STAT_DESC_RESERVED_LEN 2
+#define	MC_CMD_STAT_DESC_RESERVED_LBN 48
+#define	MC_CMD_STAT_DESC_RESERVED_WIDTH 16
+
+
+/***********************************/
+/* MC_CMD_MAC_STATISTICS_DESCRIPTOR
+ * Get a list of descriptors that describe the layout and size of the stats
+ * buffer required for retrieving statistics for a given port. Each entry in
+ * the list is formatted as MC_CMD_STAT_DESC and provides the ID of each stat
+ * and its location and size in the buffer. It also gives the overall minimum
+ * size of the DMA buffer required when DMA mode is used. Note that the first
+ * and last entries in the list are reserved for the generation start
+ * (MC_CMD_MARKER_STAT_GENERATION_START) and end
+ * (MC_CMD_MARKER_STAT_GENERATION_END) markers respectively, to be used for DMA
+ * synchronisation as described in the documentation for the relevant enum
+ * entries. The entries are present in the buffer even if DMA mode is not used.
+ * Provisions are made (but currently unused) for extending the size of the
+ * descriptors, extending the size of the list beyond the maximum MCDI response
+ * size, as well as the dynamic runtime updates of the list. Returns: 0 on
+ * success, ENOENT on non-existent port handle
+ */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR 0x1e3
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_MSGSET 0x1e3
+#undef	MC_CMD_0x1e3_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN msgrequest */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN 8
+/* Handle of port to get MAC statitstics descriptors for. */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_PORT_HANDLE_LEN 4
+/* Offset of the first entry to return, for cases where not all entries fit in
+ * the MCDI response. Should be set to 0 on initial request, and on subsequent
+ * requests updated by the number of entries already returned, as long as the
+ * MORE_ENTRIES flag is set.
+ */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_OFFSET_OFST 4
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_OFFSET_LEN 4
+
+/* MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT msgresponse */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMIN 28
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX 252
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LEN(num) (20+8*(num))
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_NUM(len) (((len)-20)/8)
+/* Generation number of the stats buffer. This is incremented each time the
+ * buffer is updated, and is used to verify the consistency of the buffer
+ * contents. Reserved for future extension (dynamic list updates). Currently
+ * always set to 0.
+ */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_GENERATION_OFST 0
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_GENERATION_LEN 4
+/* Minimum size of the DMA buffer required to retrieve all statistics for the
+ * port. This is the sum of the sizes of all the statistics, plus the size of
+ * the generation markers. Minimum buffer size in bytes required to fit all
+ * statistics. Drivers will typically round up this value to the granularity of
+ * the host DMA allocation units.
+ */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_DMA_BUFFER_SIZE_OFST 4
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_DMA_BUFFER_SIZE_LEN 4
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_FLAGS_OFST 8
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_FLAGS_LEN 4
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_MORE_ENTRIES_OFST 8
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_MORE_ENTRIES_LBN 0
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_MORE_ENTRIES_WIDTH 1
+/* Size of the individual descriptor entry in the list. Determines the entry
+ * stride in the list. Currently always set to size of MC_CMD_STAT_DESC, larger
+ * values can be used in the future for extending the descriptor, by appending
+ * new data to the end of the existing structure.
+ */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_SIZE_OFST 12
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_SIZE_LEN 4
+/* Number of entries returned in the descriptor list. */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_COUNT_OFST 16
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_COUNT_LEN 4
+/* List of descriptors. Each entry is formatted as MC_CMD_STAT_DESC and
+ * provides the ID of each stat and its location and size in the buffer. The
+ * first and last entries are reserved for the generation start and end markers
+ * respectively.
+ */
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_OFST 20
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_LEN 8
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_LO_OFST 20
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_LO_LEN 4
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_LO_LBN 160
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_LO_WIDTH 32
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_HI_OFST 24
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_HI_LEN 4
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_HI_LBN 192
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_HI_WIDTH 32
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_MINNUM 1
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_MAXNUM 29
+#define	MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_MAXNUM_MCDI2 125
+
+
+/***********************************/
+/* MC_CMD_MAC_STATISTICS
+ * Get generic MAC statistics. This call retrieves unified statistics managed
+ * by the MC. The MC will populate and provide all supported statistics in the
+ * format as returned by MC_CMD_MAC_STATISTICS_DESCRIPTOR. Refer to the
+ * aforementioned command for the format and contents of the stats DMA buffer.
+ * To ensure consistent and accurate results, it is essential for the driver to
+ * initialize the DMA buffer with zeros when DMA mode is used. Returns: 0 on
+ * success, ETIME if the DMA buffer is not ready, ENOENT on non-existent port
+ * handle, and EINVAL on invalid parameters (DMA buffer too small)
+ */
+#define	MC_CMD_MAC_STATISTICS 0x1e4
+#define	MC_CMD_MAC_STATISTICS_MSGSET 0x1e4
+#undef	MC_CMD_0x1e4_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_MAC_STATISTICS_IN msgrequest */
+#define	MC_CMD_MAC_STATISTICS_IN_LEN 20
+/* Handle of port to get MAC statistics for. */
+#define	MC_CMD_MAC_STATISTICS_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_MAC_STATISTICS_IN_PORT_HANDLE_LEN 4
+/* Contains options for querying the MAC statistics. */
+#define	MC_CMD_MAC_STATISTICS_IN_CMD_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_CMD_LEN 4
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_LBN 0
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_WIDTH 1
+#define	MC_CMD_MAC_STATISTICS_IN_CLEAR_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_CLEAR_LBN 1
+#define	MC_CMD_MAC_STATISTICS_IN_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_CHANGE_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_CHANGE_LBN 2
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_ENABLE_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_ENABLE_LBN 3
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_NOEVENT_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_NOEVENT_LBN 4
+#define	MC_CMD_MAC_STATISTICS_IN_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_MAC_STATISTICS_IN_PERIOD_MS_OFST 4
+#define	MC_CMD_MAC_STATISTICS_IN_PERIOD_MS_LBN 16
+#define	MC_CMD_MAC_STATISTICS_IN_PERIOD_MS_WIDTH 16
+/* This is the address of the DMA buffer to use for transfer of the statistics.
+ * Only valid if the DMA flag is set to 1.
+ */
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_OFST 8
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_LEN 8
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_LO_OFST 8
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_LO_LEN 4
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_LO_LBN 64
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_LO_WIDTH 32
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_HI_OFST 12
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_HI_LEN 4
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_HI_LBN 96
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_ADDR_HI_WIDTH 32
+/* This is the length of the DMA buffer to use for the transfer of the
+ * statistics. The buffer should be at least DMA_BUFFER_SIZE long, as returned
+ * by MC_CMD_MAC_STATISTICS_DESCRIPTOR. If the supplied buffer is too small,
+ * the command will fail with EINVAL. Only valid if the DMA flag is set to 1.
+ */
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_LEN_OFST 16
+#define	MC_CMD_MAC_STATISTICS_IN_DMA_LEN_LEN 4
+
+/* MC_CMD_MAC_STATISTICS_OUT msgresponse */
+#define	MC_CMD_MAC_STATISTICS_OUT_LENMIN 5
+#define	MC_CMD_MAC_STATISTICS_OUT_LENMAX 252
+#define	MC_CMD_MAC_STATISTICS_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_MAC_STATISTICS_OUT_LEN(num) (4+1*(num))
+#define	MC_CMD_MAC_STATISTICS_OUT_DATA_NUM(len) (((len)-4)/1)
+/* length of the data in bytes */
+#define	MC_CMD_MAC_STATISTICS_OUT_DATALEN_OFST 0
+#define	MC_CMD_MAC_STATISTICS_OUT_DATALEN_LEN 4
+#define	MC_CMD_MAC_STATISTICS_OUT_DATA_OFST 4
+#define	MC_CMD_MAC_STATISTICS_OUT_DATA_LEN 1
+#define	MC_CMD_MAC_STATISTICS_OUT_DATA_MINNUM 1
+#define	MC_CMD_MAC_STATISTICS_OUT_DATA_MAXNUM 248
+#define	MC_CMD_MAC_STATISTICS_OUT_DATA_MAXNUM_MCDI2 1016
+
+/* NET_PORT_HANDLE_DESC structuredef: Network port descriptor containing a port
+ * handle and attributes used, for example, in MC_CMD_ENUM_PORTS.
+ */
+#define	NET_PORT_HANDLE_DESC_LEN 53
+/* The handle to identify the port */
+#define	NET_PORT_HANDLE_DESC_PORT_HANDLE_OFST 0
+#define	NET_PORT_HANDLE_DESC_PORT_HANDLE_LEN 4
+#define	NET_PORT_HANDLE_DESC_PORT_HANDLE_LBN 0
+#define	NET_PORT_HANDLE_DESC_PORT_HANDLE_WIDTH 32
+/* Includes the type of port e.g. physical, virtual or MAE MPORT and other
+ * properties relevant to the port.
+ */
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_OFST 4
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_LEN 8
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_LO_OFST 4
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_LO_LEN 4
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_LO_LBN 32
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_LO_WIDTH 32
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_HI_OFST 8
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_HI_LEN 4
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_HI_LBN 64
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_HI_WIDTH 32
+#define	NET_PORT_HANDLE_DESC_PORT_TYPE_OFST 4
+#define	NET_PORT_HANDLE_DESC_PORT_TYPE_LBN 0
+#define	NET_PORT_HANDLE_DESC_PORT_TYPE_WIDTH 3
+#define	NET_PORT_HANDLE_DESC_PHYSICAL 0x0 /* enum */
+#define	NET_PORT_HANDLE_DESC_VIRTUAL 0x1 /* enum */
+#define	NET_PORT_HANDLE_DESC_MPORT 0x2 /* enum */
+#define	NET_PORT_HANDLE_DESC_IS_ZOMBIE_OFST 4
+#define	NET_PORT_HANDLE_DESC_IS_ZOMBIE_LBN 8
+#define	NET_PORT_HANDLE_DESC_IS_ZOMBIE_WIDTH 1
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_LBN 32
+#define	NET_PORT_HANDLE_DESC_PORT_PROPERTIES_WIDTH 64
+/* The dynamic change that led to the port enumeration */
+#define	NET_PORT_HANDLE_DESC_ENTRY_SRC_OFST 12
+#define	NET_PORT_HANDLE_DESC_ENTRY_SRC_LEN 1
+/* enum: Indicates that the ENTRY_SRC field has not been initialized. */
+#define	NET_PORT_HANDLE_DESC_UNKNOWN 0x0
+/* enum: The port was enumerated at start of day. */
+#define	NET_PORT_HANDLE_DESC_PRESENT 0x1
+/* enum: The port was dynamically added. */
+#define	NET_PORT_HANDLE_DESC_ADDED 0x2
+/* enum: The port was dynamically deleted. */
+#define	NET_PORT_HANDLE_DESC_DELETED 0x3
+#define	NET_PORT_HANDLE_DESC_ENTRY_SRC_LBN 96
+#define	NET_PORT_HANDLE_DESC_ENTRY_SRC_WIDTH 8
+/* This is an opaque 40 byte label exposed to users as a unique identifier of
+ * the port. It is represented as a zero-terminated ASCII string and assigned
+ * by the port administrator which is typically either the firmware for a
+ * physical port or the host software responsible for creating the virtual
+ * port. The label is conveyed to the driver after assignment, which, unlike
+ * the port administrator, does not need to know how to interpret the label.
+ */
+#define	NET_PORT_HANDLE_DESC_PORT_LABEL_OFST 13
+#define	NET_PORT_HANDLE_DESC_PORT_LABEL_LEN 40
+#define	NET_PORT_HANDLE_DESC_PORT_LABEL_LBN 104
+#define	NET_PORT_HANDLE_DESC_PORT_LABEL_WIDTH 320
+
+
+/***********************************/
+/* MC_CMD_ENUM_PORTS
+ * This command returns handles for all ports present in the system. The PCIe
+ * function type of each port (either physical or virtual) is also reported.
+ * After a start-of-day port enumeration, firmware keeps track of all available
+ * ports upon creation or deletion and updates the ports if there is a change.
+ * This command is cleared after a control interface reset (e.g. FLR,
+ * ENTITY_RESET), in which case it must be called again to reenumerate the
+ * ports. The command is also clear-on-read and repeated calls will drain the
+ * buffer.
+ */
+#define	MC_CMD_ENUM_PORTS 0x1e5
+#define	MC_CMD_ENUM_PORTS_MSGSET 0x1e5
+#undef	MC_CMD_0x1e5_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e5_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_ENUM_PORTS_IN msgrequest */
+#define	MC_CMD_ENUM_PORTS_IN_LEN 0
+
+/* MC_CMD_ENUM_PORTS_OUT msgresponse */
+#define	MC_CMD_ENUM_PORTS_OUT_LENMIN 12
+#define	MC_CMD_ENUM_PORTS_OUT_LENMAX 252
+#define	MC_CMD_ENUM_PORTS_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_ENUM_PORTS_OUT_LEN(num) (12+1*(num))
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_NUM(len) (((len)-12)/1)
+/* Any unused flags are reserved and must be ignored. */
+#define	MC_CMD_ENUM_PORTS_OUT_FLAGS_OFST 0
+#define	MC_CMD_ENUM_PORTS_OUT_FLAGS_LEN 4
+#define	MC_CMD_ENUM_PORTS_OUT_MORE_OFST 0
+#define	MC_CMD_ENUM_PORTS_OUT_MORE_LBN 0
+#define	MC_CMD_ENUM_PORTS_OUT_MORE_WIDTH 1
+/* The number of NET_PORT_HANDLE_DESC structures in PORT_HANDLES. */
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_COUNT_OFST 4
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_COUNT_LEN 4
+#define	MC_CMD_ENUM_PORTS_OUT_SIZEOF_NET_PORT_HANDLE_DESC_OFST 8
+#define	MC_CMD_ENUM_PORTS_OUT_SIZEOF_NET_PORT_HANDLE_DESC_LEN 4
+/* Array of NET_PORT_HANDLE_DESC structures. Callers must use must use the
+ * SIZEOF_NET_PORT_HANDLE_DESC field field as the array stride between entries.
+ * This may also allow for tail padding for alignment. Fields beyond
+ * SIZEOF_NET_PORT_HANDLE_DESC are not present.
+ */
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_OFST 12
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_LEN 1
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_MINNUM 0
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_MAXNUM 240
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_MAXNUM_MCDI2 1008
+/* See structuredef: NET_PORT_HANDLE_DESC */
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_HANDLE_OFST 12
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_HANDLE_LEN 4
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_OFST 16
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_LEN 8
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_LO_OFST 16
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_LO_LEN 4
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_LO_LBN 128
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_LO_WIDTH 32
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_HI_OFST 20
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_HI_LEN 4
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_HI_LBN 160
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_PROPERTIES_HI_WIDTH 32
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_TYPE_LBN 128
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_TYPE_WIDTH 3
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_IS_ZOMBIE_LBN 136
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_IS_ZOMBIE_WIDTH 1
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_ENTRY_SRC_OFST 24
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_ENTRY_SRC_LEN 1
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_LABEL_OFST 25
+#define	MC_CMD_ENUM_PORTS_OUT_PORT_HANDLES_PORT_LABEL_LEN 40
+
+
+/***********************************/
+/* MC_CMD_GET_TRANSCEIVER_PROPERTIES
+ * Read properties of the transceiver associated with the port. Can be either
+ * for a fixed onboard transceiver or an inserted module. The returned data is
+ * interpreted from the transceiver hardware and may be fixed up by the
+ * firmware. Use MC_CMD_GET_MODULE_DATA to get raw undecoded data.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES 0x1e6
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_MSGSET 0x1e6
+#undef	MC_CMD_0x1e6_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e6_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_GET_TRANSCEIVER_PROPERTIES_IN msgrequest */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_IN_LEN 4
+/* Handle to port to get transceiver properties from. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_IN_PORT_HANDLE_LEN 4
+
+/* MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT msgresponse */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_LEN 89
+/* Supported technology abilities. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_TECH_ABILITIES_MASK_OFST 0
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_TECH_ABILITIES_MASK_LEN 16
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_ETH_TECH/TECH */
+/* Reserved for future expansion to accommodate future Ethernet technology
+ * expansion.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_RESERVED_OFST 16
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_RESERVED_LEN 16
+/* Preferred FEC modes. This is a function of the cable type and length. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_PREFERRED_FEC_MASK_OFST 32
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_PREFERRED_FEC_MASK_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               FEC_TYPE/TYPE */
+/* SFF-8042 code reported by the module. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_CODE_OFST 36
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_CODE_LEN 2
+/* Medium. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_MEDIUM_OFST 38
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_MEDIUM_LEN 1
+/* enum property: value */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_UNKNOWN 0x0 /* enum */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_COPPER 0x1 /* enum */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_OPTICAL 0x2 /* enum */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_BACKPLANE 0x3 /* enum */
+/* Identifies the tech */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_MEDIA_SUBTYPE_OFST 39
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_MEDIA_SUBTYPE_LEN 1
+/* enum property: value */
+/*               MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_UNKNOWN 0x0 */
+/* enum: Ethernet over twisted-pair copper cables for distances up to 100
+ * meters.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_BASET 0x1
+/* enum: Ethernet over twin-axial, balanced copper cable. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_CR 0x2
+/* enum: Ethernet over backplane for connections on the same board. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_KX 0x3
+/* enum: Ethernet over a single backplane lane for connections between
+ * different boards.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_KR 0x4
+/* enum: Ethernet over copper backplane. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_KP 0x5
+/* enum: Ethernet over fiber optic. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_BASEX 0x6
+/* enum: Short range ethernet over multimode fiber optic (See IEEE 802.3 Clause
+ * 49 and 52).
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_SR 0x7
+/* enum: Long range, extended range or far reach ethernet used with single mode
+ * fiber optics.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_LR_ER_FR 0x8
+/* enum: Long reach multimode ethernet over multimode optical fiber. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_LRM 0x9
+/* enum: Very short reach PAM4 ethernet over multimode optical fiber (see IEEE
+ * 802.3db).
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VR 0xa
+/* enum: BASE-R encoding and PAM4 over single-mode fiber with reach up to at
+ * least 500 meters (803.2 Clause 121 and 124)
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_DR 0xb
+/* String of the vendor name as intepreted by NMC firmware. NMC firmware
+ * applies workarounds for known buggy transceivers. The vendor name is
+ * presented as 16 bytes of ASCII characters padded with spaces. It can also be
+ * represented as 16 bytes of zeros if the field is unspecified for the
+ * connected module. See SFF-8472/CMIS specifications for details.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VENDOR_NAME_OFST 40
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VENDOR_NAME_LEN 1
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VENDOR_NAME_NUM 16
+/* The vendor part number as intepreted by NMC firmware. The field is presented
+ * as 16 bytes of ASCII chars padded with spaces. It can also be 16 bytes of
+ * zeros if the field is unspecified for the connected module.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VENDOR_PN_OFST 56
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VENDOR_PN_LEN 1
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_VENDOR_PN_NUM 16
+/* Serial number of the module presented as 16 bytes of ASCII characters padded
+ * with spaces. It can also be 16 bytes of zeros if the field is unspecified
+ * for the connected module. See SFF-8472/CMIS specifications for details.
+ */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_SERIAL_NUMBER_OFST 72
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_SERIAL_NUMBER_LEN 1
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_SERIAL_NUMBER_NUM 16
+/* This reports the number of module changes detected by the NMC firmware. */
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_PORT_MODULECHANGE_SEQ_NUM_OFST 88
+#define	MC_CMD_GET_TRANSCEIVER_PROPERTIES_OUT_PORT_MODULECHANGE_SEQ_NUM_LEN 1
+
+
+/***********************************/
+/* MC_CMD_GET_FIXED_PORT_PROPERTIES
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES 0x1e7
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_MSGSET 0x1e7
+#undef	MC_CMD_0x1e7_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e7_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_GET_FIXED_PORT_PROPERTIES_IN msgrequest: In this context, the port
+ * consists of the MAC and the PHY, and excludes any modules inserted into the
+ * cage. This information is fixed for a given board but not for a given ASIC.
+ * This command reports properties for the port as it is currently configured,
+ * and not its hardware capabilities, which can be better than the current
+ * configuration.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_IN_LEN 4
+/* Handle to the port to from which to retreive properties */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_IN_PORT_HANDLE_LEN 4
+
+/* MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT msgresponse */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_LEN 36
+/* Supported capabilities of the port in its current configuration. */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_OFST 0
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_LEN 25
+/* See structuredef: MC_CMD_ETH_AN_FIELDS */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_TECH_MASK_OFST 0
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_TECH_MASK_LEN 16
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_FEC_MASK_OFST 16
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_FEC_MASK_LEN 4
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_FEC_REQ_OFST 20
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_FEC_REQ_LEN 4
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_PAUSE_MASK_OFST 24
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_PAUSE_MASK_LEN 1
+/* Number of lanes supported by the port in its current configuration. */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_NUM_LANES_OFST 25
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_NUM_LANES_LEN 1
+/* Bitmask of supported loopback modes. Where the response to this command
+ * includes the LOOPBACK_MODES_MASK_V2 field, that field should be used in
+ * preference to ensure that all available loopback modes are seen.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_LOOPBACK_MODES_MASK_OFST 26
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_LOOPBACK_MODES_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+/* This field serves as a cage index that uniquely identifies the cage to which
+ * the module is connected. This is useful when splitter cables that have
+ * multiple ports on a single cage are used.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_MDI_INDEX_OFST 27
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_MDI_INDEX_LEN 1
+/* This bitmask is used to specify the lanes within the cage identified by
+ * MDI_INDEX that are allocated to the port.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_MDI_LANE_MASK_OFST 28
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_MDI_LANE_MASK_LEN 1
+/* Maximum frame length supported by the port in its current configuration. */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_MAX_FRAME_LEN_OFST 32
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_MAX_FRAME_LEN_LEN 4
+
+/* MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2 msgresponse */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LEN 48
+/* Supported capabilities of the port in its current configuration. */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_ABILITIES_OFST 0
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_ABILITIES_LEN 25
+/* Number of lanes supported by the port in its current configuration. */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_NUM_LANES_OFST 25
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_NUM_LANES_LEN 1
+/* Bitmask of supported loopback modes. Where the response to this command
+ * includes the LOOPBACK_MODES_MASK_V2 field, that field should be used in
+ * preference to ensure that all available loopback modes are seen.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_OFST 26
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_LEN 1
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+/* This field serves as a cage index that uniquely identifies the cage to which
+ * the module is connected. This is useful when splitter cables that have
+ * multiple ports on a single cage are used.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_MDI_INDEX_OFST 27
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_MDI_INDEX_LEN 1
+/* This bitmask is used to specify the lanes within the cage identified by
+ * MDI_INDEX that are allocated to the port.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_MDI_LANE_MASK_OFST 28
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_MDI_LANE_MASK_LEN 1
+/* Maximum frame length supported by the port in its current configuration. */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_MAX_FRAME_LEN_OFST 32
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_MAX_FRAME_LEN_LEN 4
+/* Bitmask of supported loopback modes. This field replaces the
+ * LOOPBACK_MODES_MASK field which is defined under version 1 of this command.
+ */
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_OFST 40
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_LEN 8
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_LO_OFST 40
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_LO_LEN 4
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_LO_LBN 320
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_LO_WIDTH 32
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_HI_OFST 44
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_HI_LEN 4
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_HI_LBN 352
+#define	MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2_HI_WIDTH 32
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LOOPBACK_V2/MODE */
+
+
+/***********************************/
+/* MC_CMD_GET_MODULE_DATA
+ * Read media-specific data from the PHY (e.g. SFP/SFP+ module ID information
+ * for SFP+ PHYs). This command returns raw data from the module's EEPROM and
+ * it is not interpreted by the MC. Use MC_CMD_GET_TRANSCEIVER_PROPERTIES to
+ * get interpreted data. Return code: 0, ENOENT
+ */
+#define	MC_CMD_GET_MODULE_DATA 0x1e8
+#define	MC_CMD_GET_MODULE_DATA_MSGSET 0x1e8
+#undef	MC_CMD_0x1e8_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e8_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_GET_MODULE_DATA_IN msgrequest */
+#define	MC_CMD_GET_MODULE_DATA_IN_LEN 16
+/* Handle to identify the port from which to request module properties. */
+#define	MC_CMD_GET_MODULE_DATA_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_MODULE_DATA_IN_PORT_HANDLE_LEN 4
+/* 7 bit I2C address of the device. DEPRECATED: This field is replaced by
+ * MODULE_ADDR in V2. Use V2 of this command for proper alignment and easier
+ * access.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_DEVADDR_LBN 32
+#define	MC_CMD_GET_MODULE_DATA_IN_DEVADDR_WIDTH 7
+/* 0 if the page does not support banked access, non-zero otherwise. Non-zero
+ * BANK is valid if OFFSET is in the range 80h - ffh, i.e. in the Upper Memory
+ * region.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_BANK_OFST 6
+#define	MC_CMD_GET_MODULE_DATA_IN_BANK_LEN 2
+/* 0 if paged access is not supported, non-zero otherwise. Non-zero PAGE is
+ * valid if OFFSET is in the range 80h - ffh.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_PAGE_OFST 8
+#define	MC_CMD_GET_MODULE_DATA_IN_PAGE_LEN 2
+/* Offset in the range 00h - 7fh to access lower memory. Offset in the range
+ * 80h - ffh to access upper memory
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_OFFSET_OFST 10
+#define	MC_CMD_GET_MODULE_DATA_IN_OFFSET_LEN 1
+#define	MC_CMD_GET_MODULE_DATA_IN_LENGTH_OFST 12
+#define	MC_CMD_GET_MODULE_DATA_IN_LENGTH_LEN 4
+
+/* MC_CMD_GET_MODULE_DATA_IN_V2 msgrequest: Updated MC_CMD_GET_MODULE_DATA with
+ * 8-bit wide ADDRESSING field. This new field provides a correctly aligned
+ * container for the 7-bit DEVADDR field from V1, now renamed MODULE_ADDR, to
+ * ensure proper alignment.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_LEN 16
+/* Handle to identify the port from which to request module properties. */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_PORT_HANDLE_LEN 4
+/* 7 bit I2C address of the device. DEPRECATED: This field is replaced by
+ * MODULE_ADDR in V2. Use V2 of this command for proper alignment and easier
+ * access.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_DEVADDR_LBN 32
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_DEVADDR_WIDTH 7
+/* 0 if the page does not support banked access, non-zero otherwise. Non-zero
+ * BANK is valid if OFFSET is in the range 80h - ffh, i.e. in the Upper Memory
+ * region.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_BANK_OFST 6
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_BANK_LEN 2
+/* 0 if paged access is not supported, non-zero otherwise. Non-zero PAGE is
+ * valid if OFFSET is in the range 80h - ffh.
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_PAGE_OFST 8
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_PAGE_LEN 2
+/* Offset in the range 00h - 7fh to access lower memory. Offset in the range
+ * 80h - ffh to access upper memory
+ */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_OFFSET_OFST 10
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_OFFSET_LEN 1
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_LENGTH_OFST 12
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_LENGTH_LEN 4
+/* Container for 7 bit I2C addresses. */
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_ADDRESSING_OFST 4
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_ADDRESSING_LEN 1
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_MODULE_ADDR_OFST 4
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_MODULE_ADDR_LBN 0
+#define	MC_CMD_GET_MODULE_DATA_IN_V2_MODULE_ADDR_WIDTH 7
+
+/* MC_CMD_GET_MODULE_DATA_OUT msgresponse */
+#define	MC_CMD_GET_MODULE_DATA_OUT_LENMIN 5
+#define	MC_CMD_GET_MODULE_DATA_OUT_LENMAX 252
+#define	MC_CMD_GET_MODULE_DATA_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_MODULE_DATA_OUT_LEN(num) (4+1*(num))
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATA_NUM(len) (((len)-4)/1)
+/* length of the data in bytes */
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATALEN_OFST 0
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATALEN_LEN 4
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATA_OFST 4
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATA_LEN 1
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATA_MINNUM 1
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATA_MAXNUM 248
+#define	MC_CMD_GET_MODULE_DATA_OUT_DATA_MAXNUM_MCDI2 1016
+
+/* EVENT_MASK structuredef */
+#define	EVENT_MASK_LEN 4
+#define	EVENT_MASK_TYPE_OFST 0
+#define	EVENT_MASK_TYPE_LEN 4
+/* enum: PORT_LINKCHANGE event is enabled */
+#define	EVENT_MASK_PORT_LINKCHANGE 0x0
+/* enum: PORT_MODULECHANGE event is enabled */
+#define	EVENT_MASK_PORT_MODULECHANGE 0x1
+#define	EVENT_MASK_TYPE_LBN 0
+#define	EVENT_MASK_TYPE_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_SET_NETPORT_EVENTS_MASK
+ */
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK 0x1e9
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_MSGSET 0x1e9
+#undef	MC_CMD_0x1e9_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1e9_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_SET_NETPORT_EVENTS_MASK_IN msgrequest: Enable or disable delivery of
+ * specified network port events for a given port identified by PORT_HANDLE. At
+ * start of day, or after any control interface reset (FLR, ENTITY_RESET,
+ * etc.), all event delivery is disabled for all ports associated with the
+ * control interface.
+ */
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_IN_LEN 8
+/* Handle to port to set event delivery mask. */
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_IN_PORT_HANDLE_LEN 4
+/* Bitmask of events to enable. Event delivery is enabled when corresponding
+ * bit is 1, disabled when 0.
+ */
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_IN_EVENT_MASK_OFST 4
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_IN_EVENT_MASK_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               EVENT_MASK/TYPE */
+
+/* MC_CMD_SET_NETPORT_EVENTS_MASK_OUT msgresponse */
+#define	MC_CMD_SET_NETPORT_EVENTS_MASK_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_NETPORT_EVENTS_MASK
+ */
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK 0x1ea
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_MSGSET 0x1ea
+#undef	MC_CMD_0x1ea_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ea_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_GET_NETPORT_EVENTS_MASK_IN msgrequest: Get event delivery mask a
+ * given port identified by PORT_HANDLE.
+ */
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_IN_LEN 4
+/* Handle to port to get event deliver mask for. */
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_IN_PORT_HANDLE_LEN 4
+
+/* MC_CMD_GET_NETPORT_EVENTS_MASK_OUT msgresponse */
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_OUT_LEN 4
+/* Bitmask of events enabled. Event delivery is enabled when corresponding bit
+ * is 1, disabled when 0.
+ */
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_OUT_EVENT_MASK_OFST 0
+#define	MC_CMD_GET_NETPORT_EVENTS_MASK_OUT_EVENT_MASK_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               EVENT_MASK/TYPE */
+
+
+/***********************************/
+/* MC_CMD_GET_SUPPORTED_NETPORT_EVENTS
+ */
+#define	MC_CMD_GET_SUPPORTED_NETPORT_EVENTS 0x1eb
+#define	MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_MSGSET 0x1eb
+#undef	MC_CMD_0x1eb_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1eb_PRIVILEGE_CTG SRIOV_CTG_LINK
+
+/* MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_IN msgrequest: Get network port events
+ * supported by the platform. Information returned is fixed for a given NIC
+ * platform.
+ */
+#define	MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_IN_LEN 0
+
+/* MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_OUT msgresponse */
+#define	MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_OUT_LEN 4
+/* Bitmask of events enabled. Event delivery is enabled when corresponding bit
+ * is 1, disabled when 0.
+ */
+#define	MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_OUT_EVENT_MASK_OFST 0
+#define	MC_CMD_GET_SUPPORTED_NETPORT_EVENTS_OUT_EVENT_MASK_LEN 4
+/* enum property: bitshift */
+/*            Enum values, see field(s): */
+/*               EVENT_MASK/TYPE */
+
+/* LINK_CHANGE_LOG structuredef */
+#define	LINK_CHANGE_LOG_LEN 16
+/* Bitmask of flags that describe the state of the link. */
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_OFST 0
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_LEN 8
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_LO_OFST 0
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_LO_LEN 4
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_LO_LBN 0
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_LO_WIDTH 32
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_HI_OFST 4
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_HI_LEN 4
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_HI_LBN 32
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_HI_WIDTH 32
+/* enum property: value */
+/*            Enum values, see field(s): */
+/*               MC_CMD_LINK_STATUS_FLAGS/STATUS_FLAGS */
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_LBN 0
+#define	LINK_CHANGE_LOG_STATUS_FLAGS_WIDTH 64
+/* This is the time elapsed in milliseconds since the last event occurred. */
+#define	LINK_CHANGE_LOG_TIME_STAMP_OFST 8
+#define	LINK_CHANGE_LOG_TIME_STAMP_LEN 4
+#define	LINK_CHANGE_LOG_TIME_STAMP_LBN 64
+#define	LINK_CHANGE_LOG_TIME_STAMP_WIDTH 32
+/* Speed of the link. 0 if the link is down. */
+#define	LINK_CHANGE_LOG_LINK_SPEED_OFST 12
+#define	LINK_CHANGE_LOG_LINK_SPEED_LEN 4
+#define	LINK_CHANGE_LOG_LINK_SPEED_LBN 96
+#define	LINK_CHANGE_LOG_LINK_SPEED_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_LINK_LOG
+ * This command retrieves the history log of link state changes and reports the
+ * timestamp, reason for link state change and new link state. This command is
+ * clear-on-read.
+ */
+#define	MC_CMD_LINK_LOG 0x1ec
+#define	MC_CMD_LINK_LOG_MSGSET 0x1ec
+#undef	MC_CMD_0x1ec_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ec_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_LINK_LOG_IN msgrequest */
+#define	MC_CMD_LINK_LOG_IN_LEN 4
+/* A handle to identify the port on which to query the link log. */
+#define	MC_CMD_LINK_LOG_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_LINK_LOG_IN_PORT_HANDLE_LEN 4
+
+/* MC_CMD_LINK_LOG_OUT msgresponse */
+#define	MC_CMD_LINK_LOG_OUT_LENMIN 8
+#define	MC_CMD_LINK_LOG_OUT_LENMAX 248
+#define	MC_CMD_LINK_LOG_OUT_LENMAX_MCDI2 1016
+#define	MC_CMD_LINK_LOG_OUT_LEN(num) (8+16*(num))
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_NUM(len) (((len)-8)/16)
+/* Number of valid transitions of type LINK_CHANGE_LOG structures in the
+ * LINK_LOG_ARRAY
+ */
+#define	MC_CMD_LINK_LOG_OUT_NUM_LOG_ENTRIES_OFST 0
+#define	MC_CMD_LINK_LOG_OUT_NUM_LOG_ENTRIES_LEN 4
+#define	MC_CMD_LINK_LOG_OUT_MORE_OFST 0
+#define	MC_CMD_LINK_LOG_OUT_MORE_LBN 0
+#define	MC_CMD_LINK_LOG_OUT_MORE_WIDTH 1
+/* Contains additional flags or control information related to the log
+ * response. The specific bits, e.g. MORE_ENTRIES, are described below.
+ */
+#define	MC_CMD_LINK_LOG_OUT_FLAGS_OFST 4
+#define	MC_CMD_LINK_LOG_OUT_FLAGS_LEN 4
+#define	MC_CMD_LINK_LOG_OUT_MORE_ENTRIES_OFST 4
+#define	MC_CMD_LINK_LOG_OUT_MORE_ENTRIES_LBN 0
+#define	MC_CMD_LINK_LOG_OUT_MORE_ENTRIES_WIDTH 1
+/* Array of LINK_CHANGE_LOG structures */
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_OFST 8
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_LEN 16
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_MINNUM 0
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_MAXNUM 15
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_MAXNUM_MCDI2 63
+/* See structuredef: LINK_CHANGE_LOG */
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_OFST 8
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_LEN 8
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_LO_OFST 8
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_LO_LEN 4
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_LO_LBN 64
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_LO_WIDTH 32
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_HI_OFST 12
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_HI_LEN 4
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_HI_LBN 96
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_STATUS_FLAGS_HI_WIDTH 32
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_TIME_STAMP_OFST 16
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_TIME_STAMP_LEN 4
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_LINK_SPEED_OFST 20
+#define	MC_CMD_LINK_LOG_OUT_LINK_LOG_ARRAY_LINK_SPEED_LEN 4
+
+
+/***********************************/
+/* MC_CMD_CSR_INST_READ32
+ * Read 32bit words from an MCPU indirect memory map specified by its
+ * MAP_INDEX.
+ */
+#define	MC_CMD_CSR_INST_READ32 0x1ee
+#define	MC_CMD_CSR_INST_READ32_MSGSET 0x1ee
+#undef	MC_CMD_0x1ee_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ee_PRIVILEGE_CTG SRIOV_CTG_INSECURE
+
+/* MC_CMD_CSR_INST_READ32_IN msgrequest */
+#define	MC_CMD_CSR_INST_READ32_IN_LEN 24
+/* Address */
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_OFST 0
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_LEN 8
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_LO_OFST 0
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_LO_LEN 4
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_LO_LBN 0
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_LO_WIDTH 32
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_HI_OFST 4
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_HI_LEN 4
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_HI_LBN 32
+#define	MC_CMD_CSR_INST_READ32_IN_ADDR_HI_WIDTH 32
+/* Step value between register addresses */
+#define	MC_CMD_CSR_INST_READ32_IN_STEP_OFST 8
+#define	MC_CMD_CSR_INST_READ32_IN_STEP_LEN 4
+/* Map index of indirect memory map */
+#define	MC_CMD_CSR_INST_READ32_IN_MAP_INDEX_OFST 12
+#define	MC_CMD_CSR_INST_READ32_IN_MAP_INDEX_LEN 4
+/* Number of words to read */
+#define	MC_CMD_CSR_INST_READ32_IN_NUM_WORDS_OFST 20
+#define	MC_CMD_CSR_INST_READ32_IN_NUM_WORDS_LEN 4
+
+/* MC_CMD_CSR_INST_READ32_OUT msgresponse */
+#define	MC_CMD_CSR_INST_READ32_OUT_LENMIN 4
+#define	MC_CMD_CSR_INST_READ32_OUT_LENMAX 252
+#define	MC_CMD_CSR_INST_READ32_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_CSR_INST_READ32_OUT_LEN(num) (4+4*(num))
+#define	MC_CMD_CSR_INST_READ32_OUT_BUFFER_NUM(len) (((len)-4)/4)
+/* Status response from register reads by firmware */
+#define	MC_CMD_CSR_INST_READ32_OUT_STATUS_OFST 0
+#define	MC_CMD_CSR_INST_READ32_OUT_STATUS_LEN 4
+/* Read data */
+#define	MC_CMD_CSR_INST_READ32_OUT_BUFFER_OFST 4
+#define	MC_CMD_CSR_INST_READ32_OUT_BUFFER_LEN 4
+#define	MC_CMD_CSR_INST_READ32_OUT_BUFFER_MINNUM 0
+#define	MC_CMD_CSR_INST_READ32_OUT_BUFFER_MAXNUM 62
+#define	MC_CMD_CSR_INST_READ32_OUT_BUFFER_MAXNUM_MCDI2 254
+
+
+/***********************************/
+/* MC_CMD_CSR_INST_WRITE32
+ * Write 32bit dwords to an MCPU indirect memory map specified by its
+ * MAP_INDEX.
+ */
+#define	MC_CMD_CSR_INST_WRITE32 0x1ef
+#define	MC_CMD_CSR_INST_WRITE32_MSGSET 0x1ef
+#undef	MC_CMD_0x1ef_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ef_PRIVILEGE_CTG SRIOV_CTG_INSECURE
+
+/* MC_CMD_CSR_INST_WRITE32_IN msgrequest */
+#define	MC_CMD_CSR_INST_WRITE32_IN_LENMIN 24
+#define	MC_CMD_CSR_INST_WRITE32_IN_LENMAX 252
+#define	MC_CMD_CSR_INST_WRITE32_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_CSR_INST_WRITE32_IN_LEN(num) (20+4*(num))
+#define	MC_CMD_CSR_INST_WRITE32_IN_BUFFER_NUM(len) (((len)-20)/4)
+/* Address */
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_OFST 0
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_LEN 8
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_LO_OFST 0
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_LO_LEN 4
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_LO_LBN 0
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_LO_WIDTH 32
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_HI_OFST 4
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_HI_LEN 4
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_HI_LBN 32
+#define	MC_CMD_CSR_INST_WRITE32_IN_ADDR_HI_WIDTH 32
+/* Step value between register addresses */
+#define	MC_CMD_CSR_INST_WRITE32_IN_STEP_OFST 8
+#define	MC_CMD_CSR_INST_WRITE32_IN_STEP_LEN 4
+/* Map index of indirect memory map */
+#define	MC_CMD_CSR_INST_WRITE32_IN_MAP_INDEX_OFST 12
+#define	MC_CMD_CSR_INST_WRITE32_IN_MAP_INDEX_LEN 4
+/* Write data */
+#define	MC_CMD_CSR_INST_WRITE32_IN_BUFFER_OFST 20
+#define	MC_CMD_CSR_INST_WRITE32_IN_BUFFER_LEN 4
+#define	MC_CMD_CSR_INST_WRITE32_IN_BUFFER_MINNUM 1
+#define	MC_CMD_CSR_INST_WRITE32_IN_BUFFER_MAXNUM 58
+#define	MC_CMD_CSR_INST_WRITE32_IN_BUFFER_MAXNUM_MCDI2 250
+
+/* MC_CMD_CSR_INST_WRITE32_OUT msgresponse */
+#define	MC_CMD_CSR_INST_WRITE32_OUT_LEN 4
+/* Status response from register writes by firmware */
+#define	MC_CMD_CSR_INST_WRITE32_OUT_STATUS_OFST 0
+#define	MC_CMD_CSR_INST_WRITE32_OUT_STATUS_LEN 4
+
+
+/***********************************/
+/* MC_CMD_FETCH_HNIC_PORT_CONFIG
+ * Query the static HNIC port configuration for a physical port. Returns ENODEV
+ * if the target does not correspond to a physical port, or EPERM if the caller
+ * does not have permission to administer it.
+ */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG 0x1f0
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_MSGSET 0x1f0
+#undef	MC_CMD_0x1f0_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f0_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_FETCH_HNIC_PORT_CONFIG_IN msgrequest */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_IN_LEN 8
+/* Port handle to the target network port. */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_IN_DIRECTION_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT msgresponse */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_LENMIN 12
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_LENMAX 252
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_LEN(num) (12+4*(num))
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_NUM(len) (((len)-12)/4)
+/* Total size of buffer region assigned to this port, in bytes. */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_REGION_SIZE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_REGION_SIZE_LEN 4
+/* Allocation granularity, in bytes. All partitioning of the buffer region must
+ * be in multiples of this value.
+ */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_ALLOC_GRANULARITY_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_ALLOC_GRANULARITY_LEN 4
+/* The number of independent FIFOs assigned to this port. */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_NUM_FIFOS_OFST 8
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_NUM_FIFOS_LEN 4
+/* Array of FIFO handles, NUM_FIFOS items long. */
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_OFST 12
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_LEN 4
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_MINNUM 0
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_MAXNUM 60
+#define	MC_CMD_FETCH_HNIC_PORT_CONFIG_OUT_FIFO_HANDLE_MAXNUM_MCDI2 252
+
+
+/***********************************/
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING
+ * Returns the current state of the FIFO sizing configuration for all of the
+ * FIFOs assigned to a physical port. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it.
+ */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING 0x1f1
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_MSGSET 0x1f1
+#undef	MC_CMD_0x1f1_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f1_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_IN msgrequest */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_IN_LEN 8
+/* Port handle to the target network port. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT msgresponse */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_LENMIN 8
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_LENMAX 248
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_LENMAX_MCDI2 1016
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_LEN(num) (8+12*(num))
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_NUM(len) (((len)-8)/12)
+/* Total size of buffer region assigned to this port, in bytes. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_REGION_SIZE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_REGION_SIZE_LEN 4
+/* The number of independent FIFOs assigned to this port. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_NUM_FIFOS_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_SIZE_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_OFST 8
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_LEN 12
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_MINNUM 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_MAXNUM 20
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_SIZING_OUT_FIFO_SIZE_PARAMS_MAXNUM_MCDI2 84
+
+
+/***********************************/
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING
+ * Sets the FIFO sizing configuration for a physical port. This is disruptive
+ * to port operation and will cause the link to drop while the port is
+ * reconfigured. Returns ENODEV if the target does not correspond to a physical
+ * port, or EPERM if the caller does not have permission to administer it, or
+ * EINVAL if the sizing parameters are invalid.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING 0x1f2
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_MSGSET 0x1f2
+#undef	MC_CMD_0x1f2_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN msgrequest */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_LENMIN 12
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_LENMAX 252
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_LEN(num) (12+12*(num))
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_NUM(len) (((len)-12)/12)
+/* Port handle to the target network port. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_OFST 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* The number of FIFOs being configured. FIFOs assigned to the port but not
+ * included in the list are assumed to retain their current size configuration.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_NUM_FIFOS_OFST 8
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_SIZE_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_OFST 12
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_LEN 12
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_MINNUM 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_MAXNUM 20
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_IN_FIFO_SIZE_PARAMS_MAXNUM_MCDI2 84
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_OUT msgresponse */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_SIZING_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING
+ * Returns the current state of the 802.1Q priority to FIFO mapping
+ * configuration for a physical port. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it.
+ */
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING 0x1f3
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_MSGSET 0x1f3
+#undef	MC_CMD_0x1f3_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_IN msgrequest */
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_IN_LEN 8
+/* Port handle to the target network port. */
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_OUT msgresponse */
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_OUT_LEN 32
+/* FIFO handle for each Priority Code Point(PCP), in order from 0 to 7. */
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_OUT_FIFO_HANDLE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_OUT_FIFO_HANDLE_LEN 4
+#define	MC_CMD_FETCH_HNIC_PORT_PRIO_MAPPING_OUT_FIFO_HANDLE_NUM 8
+
+
+/***********************************/
+/* MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING
+ * Sets the PCP priority to FIFO mapping configuration for a physical port.
+ * Returns ENODEV if the target does not correspond to a physical port, or
+ * EPERM if the caller does not have permission to administer it, or EINVAL if
+ * any of the FIFO handles are invalid in some way.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING 0x1f4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_MSGSET 0x1f4
+#undef	MC_CMD_0x1f4_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN msgrequest */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_LEN 40
+/* Port handle to the target network port. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_OFST 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* FIFO handle for each PCP value, in order from 0 to 7. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_FIFO_HANDLE_OFST 8
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_FIFO_HANDLE_LEN 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_IN_FIFO_HANDLE_NUM 8
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_OUT msgresponse */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_PRIO_MAPPING_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS
+ * Returns the current state of the FIFO delay parameters configuration for all
+ * of the FIFOs assigned to a physical port. Returns ENODEV if the target does
+ * not correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it.
+ */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS 0x1f5
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_MSGSET 0x1f5
+#undef	MC_CMD_0x1f5_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_IN msgrequest */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LEN 8
+/* Port handle to the target network port. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT msgresponse */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LENMIN 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LENMAX 244
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LENMAX_MCDI2 1012
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LEN(num) (4+16*(num))
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_NUM(len) (((len)-4)/16)
+/* The number of independent FIFOs assigned to this port. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_NUM_FIFOS_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_DELAY_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_LEN 16
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_MINNUM 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_MAXNUM 15
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_FIFO_DELAY_PARAMS_MAXNUM_MCDI2 63
+
+
+/***********************************/
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS
+ * Sets the FIFO delay parameters configuration for a physical port. This is
+ * not disruptive to port operation. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it, or EINVAL if the sizing parameters are invalid.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS 0x1f6
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_MSGSET 0x1f6
+#undef	MC_CMD_0x1f6_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f6_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN msgrequest */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LENMIN 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LENMAX 240
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LENMAX_MCDI2 1008
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_LEN(num) (16+16*(num))
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_NUM(len) (((len)-16)/16)
+/* Port handle to the target network port. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_OFST 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* The number of FIFOs being configured. FIFOs assigned to the port but not
+ * included in the list are assumed to retain their current delay
+ * configuration.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_NUM_FIFOS_OFST 8
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_DELAY_PARAMS structures, NUM_FIFOS items long. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_OFST 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_LEN 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_MINNUM 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_MAXNUM 14
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_IN_FIFO_DELAY_PARAMS_MAXNUM_MCDI2 62
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_OUT msgresponse */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DELAY_PARAMS_OUT_LEN 0
+
+/* HNIC_FIFO_DRAIN structuredef: HNIC FIFO drain parameters */
+#define	HNIC_FIFO_DRAIN_LEN 8
+/* Handle to identify the fifo to be drained. The FIFO_HANDLE should be treated
+ * as an opaque value.
+ */
+#define	HNIC_FIFO_DRAIN_FIFO_HANDLE_OFST 0
+#define	HNIC_FIFO_DRAIN_FIFO_HANDLE_LEN 4
+#define	HNIC_FIFO_DRAIN_FIFO_HANDLE_LBN 0
+#define	HNIC_FIFO_DRAIN_FIFO_HANDLE_WIDTH 32
+#define	HNIC_FIFO_DRAIN_FLAGS_OFST 4
+#define	HNIC_FIFO_DRAIN_FLAGS_LEN 4
+#define	HNIC_FIFO_DRAIN_DRAIN_EN_OFST 4
+#define	HNIC_FIFO_DRAIN_DRAIN_EN_LBN 0
+#define	HNIC_FIFO_DRAIN_DRAIN_EN_WIDTH 1
+#define	HNIC_FIFO_DRAIN_FLAGS_LBN 32
+#define	HNIC_FIFO_DRAIN_FLAGS_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN
+ * This command configures an HNIC TX FIFO to be flushed for a physical port.
+ * This is not disruptive to port operation. Returns ENODEV if the target does
+ * not correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it. or ENOTSUP if the requested direction is RX.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN 0x1f7
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_MSGSET 0x1f7
+#undef	MC_CMD_0x1f7_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f7_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN msgrequest */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_LENMIN 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_LENMAX 240
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_LENMAX_MCDI2 1008
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_LEN(num) (16+16*(num))
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_FIFO_DRAIN_NUM(len) (((len)-16)/16)
+/* Port handle to the target network port. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to query. Flushing fifos is only allowed in the TX
+ * direction.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_DIRECTION_OFST 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* The number of FIFOs being configured for flushing. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_NUM_FIFOS_OFST 8
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_DRAIN structures, NUM_FIFOS items long. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_FIFO_DRAIN_OFST 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_FIFO_DRAIN_LEN 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_FIFO_DRAIN_MINNUM 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_FIFO_DRAIN_MAXNUM 14
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_IN_FIFO_DRAIN_MAXNUM_MCDI2 62
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_OUT msgresponse */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_DRAIN_OUT_LEN 0
+
+/* HNIC_FIFO_WEIGHT structuredef: HNIC FIFO weights used in the scheduler's
+ * round robin algorithm.
+ */
+#define	HNIC_FIFO_WEIGHT_LEN 8
+/* FIFO handle */
+#define	HNIC_FIFO_WEIGHT_FIFO_HANDLE_OFST 0
+#define	HNIC_FIFO_WEIGHT_FIFO_HANDLE_LEN 4
+#define	HNIC_FIFO_WEIGHT_FIFO_HANDLE_LBN 0
+#define	HNIC_FIFO_WEIGHT_FIFO_HANDLE_WIDTH 32
+/* Weight value expressed in units of 0.001 (i.e. value 1000 corresponds to a
+ * weight=1). Allowed values for this field are [1000-4000]
+ */
+#define	HNIC_FIFO_WEIGHT_WEIGHT_OFST 4
+#define	HNIC_FIFO_WEIGHT_WEIGHT_LEN 4
+#define	HNIC_FIFO_WEIGHT_WEIGHT_LBN 32
+#define	HNIC_FIFO_WEIGHT_WEIGHT_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS
+ * Retrieves the FIFO weights for the scheduler's round robin algorithm.
+ * Returns ENODEV if the target does not correspond to a physical port, or
+ * EPERM if the caller does not have permission to administer it.
+ */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS 0x1f8
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_MSGSET 0x1f8
+#undef	MC_CMD_0x1f8_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f8_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_IN msgrequest */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_IN_LEN 8
+/* Port handle to the target network port. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to operate on. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_IN_DIRECTION_OFST 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+
+/* MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT msgresponse */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_LENMIN 16
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_LENMAX 248
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_LENMAX_MCDI2 1016
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_LEN(num) (8+8*(num))
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_NUM(len) (((len)-8)/8)
+/* Total number of configured FIFOs. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_NUM_FIFOS_OFST 0
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_WEIGHT structures, NUM_FIFOS items long. */
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_OFST 8
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_LEN 8
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_LO_OFST 8
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_LO_LEN 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_LO_LBN 64
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_LO_WIDTH 32
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_HI_OFST 12
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_HI_LEN 4
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_HI_LBN 96
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_HI_WIDTH 32
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_MINNUM 1
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_MAXNUM 30
+#define	MC_CMD_FETCH_HNIC_PORT_FIFO_WEIGHTS_OUT_FIFO_WEIGHTS_MAXNUM_MCDI2 126
+
+
+/***********************************/
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS
+ * Configures the FIFO weights for the scheduler's round robin algorithm. This
+ * is not disruptive to port operation. Returns ENODEV if the target does not
+ * correspond to a physical port, or EPERM if the caller does not have
+ * permission to administer it or EINVAL if provided argument are not valid.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS 0x1f9
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_MSGSET 0x1f9
+#undef	MC_CMD_0x1f9_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1f9_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN msgrequest */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_LENMIN 24
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_LENMAX 248
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_LENMAX_MCDI2 1016
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_LEN(num) (16+8*(num))
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_NUM(len) (((len)-16)/8)
+/* Port handle to the target network port. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_PORT_HANDLE_LEN 4
+/* Traffic direction to operate on. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_DIRECTION_OFST 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_DIRECTION_LEN 4
+/*            Enum values, see field(s): */
+/*               PORT_DIRECTION */
+/* The number of FIFOs being configured. At least one FIFO needs to be
+ * specified.
+ */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_NUM_FIFOS_OFST 8
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_NUM_FIFOS_LEN 4
+/* Array of HNIC_FIFO_WEIGHT structures, NUM_FIFOS items long. */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_OFST 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_LEN 8
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_LO_OFST 16
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_LO_LEN 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_LO_LBN 128
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_LO_WIDTH 32
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_HI_OFST 20
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_HI_LEN 4
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_HI_LBN 160
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_HI_WIDTH 32
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_MINNUM 1
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_MAXNUM 29
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_IN_FIFO_WEIGHTS_MAXNUM_MCDI2 125
+
+/* MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_OUT msgresponse */
+#define	MC_CMD_CONFIGURE_HNIC_PORT_FIFO_WEIGHTS_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_NETPORT_STATISTICS
+ * Get generic MAC statistics. This call retrieves unified statistics managed
+ * by the MC. The MC will populate and provide all supported statistics in the
+ * format as returned by MC_CMD_MAC_STATISTICS_DESCRIPTOR. Refer to the
+ * aforementioned command for the format and contents of the stats DMA buffer.
+ * To ensure consistent and accurate results, it is essential for the driver to
+ * initialize the DMA buffer with zeros when DMA mode is used. Returns: 0 on
+ * success, ETIME if the DMA buffer is not ready, ENOENT on non-existent port
+ * handle, and EINVAL on invalid parameters (DMA buffer too small)
+ */
+#define	MC_CMD_GET_NETPORT_STATISTICS 0x1fa
+#define	MC_CMD_GET_NETPORT_STATISTICS_MSGSET 0x1fa
+#undef	MC_CMD_0x1fa_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1fa_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_NETPORT_STATISTICS_IN msgrequest */
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_LEN 20
+/* Handle of port to get MAC statistics for. */
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PORT_HANDLE_OFST 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PORT_HANDLE_LEN 4
+/* Contains options for querying the MAC statistics. */
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_CMD_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_CMD_LEN 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_LBN 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_WIDTH 1
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_CLEAR_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_CLEAR_LBN 1
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_CLEAR_WIDTH 1
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_CHANGE_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_CHANGE_LBN 2
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_ENABLE_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_ENABLE_LBN 3
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_NOEVENT_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_NOEVENT_LBN 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIOD_MS_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIOD_MS_LBN 15
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_PERIOD_MS_WIDTH 17
+/* Specifies the physical address of the DMA buffer to use for statistics
+ * transfer. This field must contain a valid address under either of these
+ * conditions: 1. DMA flag is set (immediate DMA requested) 2. Both
+ * PERIODIC_CHANGE and PERIODIC_ENABLE are set (periodic DMA configured)
+ */
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_OFST 8
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_LEN 8
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_LO_OFST 8
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_LO_LEN 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_LO_LBN 64
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_LO_WIDTH 32
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_HI_OFST 12
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_HI_LEN 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_HI_LBN 96
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_ADDR_HI_WIDTH 32
+/* Specifies the length of the DMA buffer in bytes for statistics transfer. The
+ * buffer size must be at least DMA_BUFFER_SIZE bytes (as returned by
+ * MC_CMD_MAC_STATISTICS_DESCRIPTOR). Providing an insufficient buffer size
+ * will result in an EINVAL error. This field must contain a valid length under
+ * either of these conditions: 1. DMA flag is set (immediate DMA requested) 2.
+ * Both PERIODIC_CHANGE and PERIODIC_ENABLE are set (periodic DMA configured)
+ */
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_LEN_OFST 16
+#define	MC_CMD_GET_NETPORT_STATISTICS_IN_DMA_LEN_LEN 4
+
+/* MC_CMD_GET_NETPORT_STATISTICS_OUT msgresponse */
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_LENMIN 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_LENMAX 248
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_LENMAX_MCDI2 1016
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_LEN(num) (0+8*(num))
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_NUM(len) (((len)-0)/8)
+/* Statistics buffer. Zero-length if DMA mode is used. The statistics buffer is
+ * an array of 8-byte counter values, containing the generation start marker,
+ * stats counters, and generation end marker. The index of each counter in the
+ * array is reported by the MAC_STATISTICS_DESCRIPTOR command. The same layout
+ * is used for the DMA buffer for DMA mode stats.
+ */
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_OFST 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_LEN 8
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_LO_OFST 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_LO_LEN 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_LO_LBN 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_LO_WIDTH 32
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_HI_OFST 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_HI_LEN 4
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_HI_LBN 32
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_HI_WIDTH 32
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_MINNUM 0
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_MAXNUM 31
+#define	MC_CMD_GET_NETPORT_STATISTICS_OUT_STATS_MAXNUM_MCDI2 127
+
 /* EVB_PORT_ID structuredef */
 #define	EVB_PORT_ID_LEN 4
 #define	EVB_PORT_ID_PORT_ID_OFST 0
@@ -11820,6 +15458,9 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SUPPRESS_RX_EVENTS_OFST 16
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SUPPRESS_RX_EVENTS_LBN 21
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SUPPRESS_RX_EVENTS_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_RXQ_EXT_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_RXQ_EXT_IN_OWNER_ID_LEN 4
@@ -11926,6 +15567,9 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SUPPRESS_RX_EVENTS_OFST 16
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SUPPRESS_RX_EVENTS_LBN 21
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SUPPRESS_RX_EVENTS_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_RXQ_V3_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_RXQ_V3_IN_OWNER_ID_LEN 4
@@ -12061,6 +15705,9 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SUPPRESS_RX_EVENTS_OFST 16
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SUPPRESS_RX_EVENTS_LBN 21
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SUPPRESS_RX_EVENTS_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_RXQ_V4_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_RXQ_V4_IN_OWNER_ID_LEN 4
@@ -12209,6 +15856,9 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SUPPRESS_RX_EVENTS_OFST 16
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SUPPRESS_RX_EVENTS_LBN 21
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SUPPRESS_RX_EVENTS_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_RXQ_V5_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_RXQ_V5_IN_OWNER_ID_LEN 4
@@ -13828,6 +17478,10 @@
 #define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES 0x5
 /* enum: read the supported encapsulation types for the VNIC */
 #define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_VNIC_ENCAP_TYPES 0x6
+/* enum: read the supported RX filter matches for low-latency queues (as
+ * allocated by MC_CMD_ALLOC_LL_QUEUES)
+ */
+#define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_LL_RX_MATCHES 0x7
 
 /* MC_CMD_GET_PARSER_DISP_INFO_OUT msgresponse */
 #define	MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMIN 8
@@ -14554,7 +18208,7 @@
 
 /* MC_CMD_GET_VI_TLP_PROCESSING_IN msgrequest */
 #define	MC_CMD_GET_VI_TLP_PROCESSING_IN_LEN 4
-/* VI number to get information for. */
+/* Queue handle, encodes queue type and VI number to get information for. */
 #define	MC_CMD_GET_VI_TLP_PROCESSING_IN_INSTANCE_OFST 0
 #define	MC_CMD_GET_VI_TLP_PROCESSING_IN_INSTANCE_LEN 4
 
@@ -14569,6 +18223,12 @@
 /* Use Relaxed ordering model for TLPs on this VI. */
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_RELAXED_ORDERING_LBN 16
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_RELAXED_ORDERING_WIDTH 1
+/* Use Relaxed ordering model for packet data transfer TLPs on this VI (alias
+ * of RELAXED_ORDERING for hardware that also understands the
+ * RELAXED_ORDERING_SYNC_DATA field and allows them to be used independently).
+ */
+#define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_RELAXED_ORDERING_PACKET_DATA_LBN 16
+#define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_RELAXED_ORDERING_PACKET_DATA_WIDTH 1
 /* Use ID based ordering for TLPs on this VI. */
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_ID_BASED_ORDERING_LBN 17
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_ID_BASED_ORDERING_WIDTH 1
@@ -14578,15 +18238,56 @@
 /* Enable TPH for TLPs on this VI. */
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_TPH_ON_LBN 19
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_TPH_ON_WIDTH 1
+/* Use Relaxed ordering model for synchronization data transfer TLPs on this
+ * VI, used for relaxed ordering of metadata transfers on LL.
+ */
+#define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_RELAXED_ORDERING_SYNC_DATA_LBN 20
+#define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_RELAXED_ORDERING_SYNC_DATA_WIDTH 1
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_DATA_OFST 0
 #define	MC_CMD_GET_VI_TLP_PROCESSING_OUT_DATA_LEN 4
 
+/* MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT msgresponse: This message has the same
+ * layout as GET_VI_TLP_PROCESSING_OUT, but with corrected field ordering to
+ * simplify use in drivers
+ */
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_LEN 4
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_DATA_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_DATA_LEN 4
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_TAG1_RX_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_TAG1_RX_LBN 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_TAG1_RX_WIDTH 8
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_TAG2_EV_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_TAG2_EV_LBN 8
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_TAG2_EV_WIDTH 8
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_LBN 16
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_WIDTH 1
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_PACKET_DATA_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_PACKET_DATA_LBN 16
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_PACKET_DATA_WIDTH 1
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_ID_BASED_ORDERING_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_ID_BASED_ORDERING_LBN 17
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_ID_BASED_ORDERING_WIDTH 1
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_NO_SNOOP_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_NO_SNOOP_LBN 18
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_NO_SNOOP_WIDTH 1
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_ON_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_ON_LBN 19
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_TPH_ON_WIDTH 1
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_SYNC_DATA_OFST 0
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_SYNC_DATA_LBN 20
+#define	MC_CMD_GET_VI_TLP_PROCESSING_V2_OUT_RELAXED_ORDERING_SYNC_DATA_WIDTH 1
+
 
 /***********************************/
 /* MC_CMD_SET_VI_TLP_PROCESSING
  * Set TLP steering and ordering information for a VI. The caller must have the
  * GRP_FUNC_DMA privilege and must be the currently-assigned user of this VI or
- * an ancestor of the current user (see MC_CMD_SET_VI_USER).
+ * an ancestor of the current user (see MC_CMD_SET_VI_USER). Note that LL
+ * queues require this to be called after allocation but before initialisation
+ * of the queue. TLP options of a queue are fixed after queue is initialised,
+ * with the values set to current global value or they can be overriden using
+ * this command. At LL queue allocation, all overrides are cleared.
  */
 #define	MC_CMD_SET_VI_TLP_PROCESSING 0xb1
 #define	MC_CMD_SET_VI_TLP_PROCESSING_MSGSET 0xb1
@@ -14596,7 +18297,7 @@
 
 /* MC_CMD_SET_VI_TLP_PROCESSING_IN msgrequest */
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_LEN 8
-/* VI number to set information for. */
+/* Queue handle, encodes queue type and VI number to set information for. */
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_INSTANCE_OFST 0
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_INSTANCE_LEN 4
 /* Transaction processing steering hint 1 for use with the Rx Queue. */
@@ -14608,6 +18309,12 @@
 /* Use Relaxed ordering model for TLPs on this VI. */
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_RELAXED_ORDERING_LBN 48
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_RELAXED_ORDERING_WIDTH 1
+/* Use Relaxed ordering model for packet data transfer TLPs on this VI (alias
+ * of RELAXED_ORDERING for hardware that also understands the
+ * RELAXED_ORDERING_SYNC_DATA field and allows them to be used independently).
+ */
+#define	MC_CMD_SET_VI_TLP_PROCESSING_IN_RELAXED_ORDERING_PACKET_DATA_LBN 48
+#define	MC_CMD_SET_VI_TLP_PROCESSING_IN_RELAXED_ORDERING_PACKET_DATA_WIDTH 1
 /* Use ID based ordering for TLPs on this VI. */
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_ID_BASED_ORDERING_LBN 49
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_ID_BASED_ORDERING_WIDTH 1
@@ -14617,9 +18324,49 @@
 /* Enable TPH for TLPs on this VI. */
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_TPH_ON_LBN 51
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_TPH_ON_WIDTH 1
+/* Use Relaxed ordering model for synchronization data transfer TLPs on this
+ * VI, used for relaxed ordering of metadata transfers on LL.
+ */
+#define	MC_CMD_SET_VI_TLP_PROCESSING_IN_RELAXED_ORDERING_SYNC_DATA_LBN 52
+#define	MC_CMD_SET_VI_TLP_PROCESSING_IN_RELAXED_ORDERING_SYNC_DATA_WIDTH 1
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_DATA_OFST 4
 #define	MC_CMD_SET_VI_TLP_PROCESSING_IN_DATA_LEN 4
 
+/* MC_CMD_SET_VI_TLP_PROCESSING_V2_IN msgrequest: This message has the same
+ * layout as SET_VI_TLP_PROCESSING_OUT, but with corrected field ordering to
+ * simplify use in drivers.
+ */
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_LEN 8
+/* Queue handle, encodes queue type and VI number to set information for. */
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_INSTANCE_OFST 0
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_INSTANCE_LEN 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_DATA_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_DATA_LEN 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_TAG1_RX_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_TAG1_RX_LBN 0
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_TAG1_RX_WIDTH 8
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_TAG2_EV_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_TAG2_EV_LBN 8
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_TAG2_EV_WIDTH 8
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_LBN 16
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_WIDTH 1
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_PACKET_DATA_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_PACKET_DATA_LBN 16
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_PACKET_DATA_WIDTH 1
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_ID_BASED_ORDERING_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_ID_BASED_ORDERING_LBN 17
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_ID_BASED_ORDERING_WIDTH 1
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_NO_SNOOP_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_NO_SNOOP_LBN 18
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_NO_SNOOP_WIDTH 1
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_ON_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_ON_LBN 19
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_TPH_ON_WIDTH 1
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_SYNC_DATA_OFST 4
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_SYNC_DATA_LBN 20
+#define	MC_CMD_SET_VI_TLP_PROCESSING_V2_IN_RELAXED_ORDERING_SYNC_DATA_WIDTH 1
+
 /* MC_CMD_SET_VI_TLP_PROCESSING_OUT msgresponse */
 #define	MC_CMD_SET_VI_TLP_PROCESSING_OUT_LEN 0
 
@@ -14640,12 +18387,16 @@
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_LEN 4
 /* enum: MISC. */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_MISC 0x0
-/* enum: IDO. */
+/* enum: ID-based Ordering (IDO). */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_IDO 0x1
-/* enum: RO. */
+/* enum: Relaxed Ordering (RO), excluding LL queues. */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_RO 0x2
-/* enum: TPH Type. */
+/* enum: TLP Processing Hint (TPH) Type (excluding LL queues). */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_TPH_TYPE 0x3
+/* enum: Relaxed Ordering (RO) of LL queues. */
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_LL_RO 0x4
+/* enum: TPH Type of LL queues. */
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_IN_TLP_GLOBAL_CATEGORY_LL_TPH_TYPE 0x5
 
 /* MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT msgresponse */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_LEN 8
@@ -14659,9 +18410,6 @@
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_WIDTH 1
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_OFST 4
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_LBN 1
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_WIDTH 31
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_WIDTH 1
@@ -14674,9 +18422,6 @@
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_WIDTH 1
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_OFST 4
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_LBN 4
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_WIDTH 28
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_WIDTH 1
@@ -14686,9 +18431,6 @@
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_WIDTH 1
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_OFST 4
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_LBN 3
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_WIDTH 29
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
@@ -14704,9 +18446,18 @@
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_WIDTH 2
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_OFST 4
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_LBN 9
-#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_WIDTH 23
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_RXDMA_EN_OFST 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_RXDMA_EN_LBN 0
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_PACKET_RXDMA_EN_OFST 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_PACKET_RXDMA_EN_LBN 0
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_PACKET_RXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_META_RXDMA_EN_OFST 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_META_RXDMA_EN_LBN 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_RO_META_RXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_TPH_TYPE_RX_OFST 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_TPH_TYPE_RX_LBN 0
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_LL_TPH_TYPE_RX_WIDTH 2
 
 
 /***********************************/
@@ -14767,9 +18518,18 @@
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_WIDTH 2
-#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_OFST 4
-#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_LBN 10
-#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_WIDTH 22
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_RXDMA_EN_OFST 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_RXDMA_EN_LBN 0
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_PACKET_RXDMA_EN_OFST 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_PACKET_RXDMA_EN_LBN 0
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_PACKET_RXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_META_RXDMA_EN_OFST 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_META_RXDMA_EN_LBN 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_RO_META_RXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_TPH_TYPE_RX_OFST 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_TPH_TYPE_RX_LBN 0
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_LL_TPH_TYPE_RX_WIDTH 2
 
 /* MC_CMD_SET_TLP_PROCESSING_GLOBALS_OUT msgresponse */
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_OUT_LEN 0
@@ -15557,7 +19317,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V2_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V2_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -15967,7 +19730,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V3_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V3_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -16402,7 +20168,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V4_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V4_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -16845,7 +20614,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V5_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V5_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -17293,7 +21065,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V6_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V6_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -17752,7 +21527,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -17872,6 +21650,12 @@
 #define	MC_CMD_GET_CAPABILITIES_V7_OUT_CLIENT_CMD_VF_PROXY_OFST 148
 #define	MC_CMD_GET_CAPABILITIES_V7_OUT_CLIENT_CMD_VF_PROXY_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V7_OUT_CLIENT_CMD_VF_PROXY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CXL_CONFIG_ENABLE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CXL_CONFIG_ENABLE_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CXL_CONFIG_ENABLE_WIDTH 1
 
 /* MC_CMD_GET_CAPABILITIES_V8_OUT msgresponse */
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_LEN 160
@@ -18262,7 +22046,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -18382,6 +22169,12 @@
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_CLIENT_CMD_VF_PROXY_OFST 148
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_CLIENT_CMD_VF_PROXY_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V8_OUT_CLIENT_CMD_VF_PROXY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CXL_CONFIG_ENABLE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CXL_CONFIG_ENABLE_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CXL_CONFIG_ENABLE_WIDTH 1
 /* These bits are reserved for communicating test-specific capabilities to
  * host-side test software. All production drivers should treat this field as
  * opaque.
@@ -18786,7 +22579,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -18906,6 +22702,12 @@
 #define	MC_CMD_GET_CAPABILITIES_V9_OUT_CLIENT_CMD_VF_PROXY_OFST 148
 #define	MC_CMD_GET_CAPABILITIES_V9_OUT_CLIENT_CMD_VF_PROXY_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V9_OUT_CLIENT_CMD_VF_PROXY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CXL_CONFIG_ENABLE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CXL_CONFIG_ENABLE_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CXL_CONFIG_ENABLE_WIDTH 1
 /* These bits are reserved for communicating test-specific capabilities to
  * host-side test software. All production drivers should treat this field as
  * opaque.
@@ -19345,7 +23147,10 @@
 /*               MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff */
 /* enum: PF does not exist. */
 /*               MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe */
-/* Number of VIs available for each external port */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_OFST 58
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_LEN 2
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_NUM 4
@@ -19465,6 +23270,12 @@
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_CLIENT_CMD_VF_PROXY_OFST 148
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_CLIENT_CMD_VF_PROXY_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_CLIENT_CMD_VF_PROXY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CXL_CONFIG_ENABLE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CXL_CONFIG_ENABLE_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CXL_CONFIG_ENABLE_WIDTH 1
 /* These bits are reserved for communicating test-specific capabilities to
  * host-side test software. All production drivers should treat this field as
  * opaque.
@@ -19529,6 +23340,1182 @@
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_OFST 188
 #define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_LEN 4
 
+/* MC_CMD_GET_CAPABILITIES_V11_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_LEN 196
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V11_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V11_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ENCAPSULATED_MCDI_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ENCAPSULATED_MCDI_SUPPORTED_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_ENCAPSULATED_MCDI_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EXTERNAL_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EXTERNAL_MAE_SUPPORTED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_EXTERNAL_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_ABORT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_ABORT_SUPPORTED_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_NVRAM_UPDATE_ABORT_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_ACTION_SET_ALLOC_V2_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_ACTION_SET_ALLOC_V2_SUPPORTED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_ACTION_SET_ALLOC_V2_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_STEER_ON_OUTER_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_STEER_ON_OUTER_SUPPORTED_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_STEER_ON_OUTER_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_ACTION_SET_ALLOC_V3_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_ACTION_SET_ALLOC_V3_SUPPORTED_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_MAE_ACTION_SET_ALLOC_V3_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DYNAMIC_MPORT_JOURNAL_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DYNAMIC_MPORT_JOURNAL_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_DYNAMIC_MPORT_JOURNAL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CLIENT_CMD_VF_PROXY_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CLIENT_CMD_VF_PROXY_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CLIENT_CMD_VF_PROXY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CXL_CONFIG_ENABLE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CXL_CONFIG_ENABLE_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_CXL_CONFIG_ENABLE_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_LO_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_LO_LBN 1216
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_LO_WIDTH 32
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_HI_OFST 156
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_HI_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_HI_LBN 1248
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_TEST_RESERVED_HI_WIDTH 32
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+/* A bitmap of the queue sizes the device can provide, where bit N being set
+ * indicates that 2**N is a valid size. The device may be limited in the number
+ * of different queue sizes that can exist simultaneously, so a bit being set
+ * here does not guarantee that an attempt to create a queue of that size will
+ * succeed.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SUPPORTED_QUEUE_SIZES_OFST 184
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_SUPPORTED_QUEUE_SIZES_LEN 4
+/* A bitmap of queue sizes that are always available, in the same format as
+ * SUPPORTED_QUEUE_SIZES. Attempting to create a queue with one of these sizes
+ * will never fail due to unavailability of the requested size.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_GUARANTEED_QUEUE_SIZES_OFST 188
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_GUARANTEED_QUEUE_SIZES_LEN 4
+/* Number of available indirect memory maps. */
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INDIRECT_MAP_INDEX_COUNT_OFST 192
+#define	MC_CMD_GET_CAPABILITIES_V11_OUT_INDIRECT_MAP_INDEX_COUNT_LEN 4
+
+/* MC_CMD_GET_CAPABILITIES_V12_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_LEN 204
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V12_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V12_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for external ports 0-3. For devices with more than
+ * four ports, the remainder are in NUM_VIS_PER_PORT2 in
+ * GET_CAPABILITIES_V12_OUT.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ENCAPSULATED_MCDI_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ENCAPSULATED_MCDI_SUPPORTED_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_ENCAPSULATED_MCDI_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EXTERNAL_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EXTERNAL_MAE_SUPPORTED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_EXTERNAL_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_ABORT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_ABORT_SUPPORTED_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NVRAM_UPDATE_ABORT_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_ACTION_SET_ALLOC_V2_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_ACTION_SET_ALLOC_V2_SUPPORTED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_ACTION_SET_ALLOC_V2_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_STEER_ON_OUTER_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_STEER_ON_OUTER_SUPPORTED_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_STEER_ON_OUTER_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_ACTION_SET_ALLOC_V3_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_ACTION_SET_ALLOC_V3_SUPPORTED_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_MAE_ACTION_SET_ALLOC_V3_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DYNAMIC_MPORT_JOURNAL_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DYNAMIC_MPORT_JOURNAL_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_DYNAMIC_MPORT_JOURNAL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CLIENT_CMD_VF_PROXY_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CLIENT_CMD_VF_PROXY_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CLIENT_CMD_VF_PROXY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_LL_RX_EVENT_SUPPRESSION_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CXL_CONFIG_ENABLE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CXL_CONFIG_ENABLE_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_CXL_CONFIG_ENABLE_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_LO_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_LO_LBN 1216
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_LO_WIDTH 32
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_HI_OFST 156
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_HI_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_HI_LBN 1248
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_TEST_RESERVED_HI_WIDTH 32
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+/* A bitmap of the queue sizes the device can provide, where bit N being set
+ * indicates that 2**N is a valid size. The device may be limited in the number
+ * of different queue sizes that can exist simultaneously, so a bit being set
+ * here does not guarantee that an attempt to create a queue of that size will
+ * succeed.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SUPPORTED_QUEUE_SIZES_OFST 184
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_SUPPORTED_QUEUE_SIZES_LEN 4
+/* A bitmap of queue sizes that are always available, in the same format as
+ * SUPPORTED_QUEUE_SIZES. Attempting to create a queue with one of these sizes
+ * will never fail due to unavailability of the requested size.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_GUARANTEED_QUEUE_SIZES_OFST 188
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_GUARANTEED_QUEUE_SIZES_LEN 4
+/* Number of available indirect memory maps. */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INDIRECT_MAP_INDEX_COUNT_OFST 192
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_INDIRECT_MAP_INDEX_COUNT_LEN 4
+/* Number of VIs available for external ports 4-7. Information for ports 0-3 is
+ * in NUM_VIS_PER_PORT in GET_CAPABILITIES_V2_OUT.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VIS_PER_PORT2_OFST 196
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VIS_PER_PORT2_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V12_OUT_NUM_VIS_PER_PORT2_NUM 4
+
 
 /***********************************/
 /* MC_CMD_V2_EXTN
@@ -30722,7 +35709,8 @@
  * INTF=CALLER, PF=PF_NULL, VF=... to refer to a VF child of the calling PF or
  * a sibling VF of the calling VF. - INTF=CALLER, PF=..., VF=VF_NULL to refer
  * to a PF on the calling interface - INTF=CALLER, PF=..., VF=... to refer to a
- * VF on the calling interface - INTF=..., PF=..., VF=VF_NULL to refer to a PF
+ * VF on the calling interface - INTF=..., PF=PF_NULL, VF=VF_NULL to refer to
+ * the named interface itself - INTF=..., PF=..., VF=VF_NULL to refer to a PF
  * on a named interface - INTF=..., PF=..., VF=... to refer to a VF on a named
  * interface where ... refers to a small integer for the VF/PF fields, and to
  * values from the PCIE_INTERFACE enum for for the INTF field. It's only
@@ -33920,6 +38908,633 @@
 #define	MC_CMD_MAE_MPORT_READ_JOURNAL_OUT_MPORT_DESC_DATA_MAXNUM 240
 #define	MC_CMD_MAE_MPORT_READ_JOURNAL_OUT_MPORT_DESC_DATA_MAXNUM_MCDI2 1008
 
+
+/***********************************/
+/* MC_CMD_PR_OPEN
+ * Open a session to manage a programmable region. Session handles can be
+ * explicitly closed with MC_CMD_PR_CLOSE, or implicitly via
+ * MC_CMD_ENTITY_RESET or a PCIe Function Level Reset. Although this command is
+ * available to all callers that are a member of the GENERAL privilege group,
+ * an additional privilege check may be performed against the target region.
+ * Returns ENODEV if the region doesn't exist; EPERM if the caller has
+ * insufficient privilege to open the region; EBUSY is the region is currently
+ * busy; ENOSPC if the caller has too many open programmable region sessions.
+ */
+#define	MC_CMD_PR_OPEN 0x1a2
+#define	MC_CMD_PR_OPEN_MSGSET 0x1a2
+#undef	MC_CMD_0x1a2_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_OPEN_IN msgrequest */
+#define	MC_CMD_PR_OPEN_IN_LEN 4
+/* The programmable region to open. */
+#define	MC_CMD_PR_OPEN_IN_REGION_ID_OFST 0
+#define	MC_CMD_PR_OPEN_IN_REGION_ID_LEN 4
+
+/* MC_CMD_PR_OPEN_OUT msgresponse */
+#define	MC_CMD_PR_OPEN_OUT_LEN 4
+/* Session handle for operations on the contents of the programmable region.
+ * Handles should be considered opaque, although a value of 0xFFFFFFFF is
+ * guaranteed never to be a valid handle.
+ */
+#define	MC_CMD_PR_OPEN_OUT_HANDLE_OFST 0
+#define	MC_CMD_PR_OPEN_OUT_HANDLE_LEN 4
+/* enum: Invalid programmable region session handle */
+#define	MC_CMD_PR_OPEN_OUT_HANDLE_NULL 0xffffffff
+
+
+/***********************************/
+/* MC_CMD_PR_CLOSE
+ * Close a session created with MC_CMD_PR_OPEN. Returns ENOENT if the session
+ * handle doesn't exist.
+ */
+#define	MC_CMD_PR_CLOSE 0x1a3
+#define	MC_CMD_PR_CLOSE_MSGSET 0x1a3
+#undef	MC_CMD_0x1a3_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_CLOSE_IN msgrequest */
+#define	MC_CMD_PR_CLOSE_IN_LEN 4
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_CLOSE_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_CLOSE_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_CLOSE_OUT msgresponse */
+#define	MC_CMD_PR_CLOSE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PR_TRANSFER_BEGIN
+ * Starts transfer of a XCLBIN to the target region associated with a session,
+ * setting the target region's data transfer offset to 0. Although this command
+ * is available to all callers that are a member of the GENERAL privilege group
+ * an extra privilege check may be performed against the target region in
+ * addition to the check performed by MC_CMD_PR_OPEN. Returns ENOENT if the
+ * session handle doesn't exist; EPERM if the caller has insufficient privilege
+ * to update the target region; EBUSY if the target region is currently busy;
+ * ESTALE if the target region has been updated since the session was opened.
+ * The caller should close this handle and open a new session to retry its
+ * transfer; EINVAL if length is too small, e.g. smaller than the AXLF/XCLBIN2
+ * header; ENOMEM if length too large, e.g. larger than the resources available
+ * to buffer the transfer.
+ */
+#define	MC_CMD_PR_TRANSFER_BEGIN 0x1a4
+#define	MC_CMD_PR_TRANSFER_BEGIN_MSGSET 0x1a4
+#undef	MC_CMD_0x1a4_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_TRANSFER_BEGIN_IN msgrequest */
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LEN 16
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_HANDLE_LEN 4
+/* Reserved, must be zero. */
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_RESERVED_OFST 4
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_RESERVED_LEN 4
+/* The length (in bytes) of the XCLBIN data to be transferred. */
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_OFST 8
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_LEN 8
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_LO_OFST 8
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_LO_LEN 4
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_LO_LBN 64
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_LO_WIDTH 32
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_HI_OFST 12
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_HI_LEN 4
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_HI_LBN 96
+#define	MC_CMD_PR_TRANSFER_BEGIN_IN_LENGTH_HI_WIDTH 32
+
+/* MC_CMD_PR_TRANSFER_BEGIN_OUT msgresponse */
+#define	MC_CMD_PR_TRANSFER_BEGIN_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PR_TRANSFER_WRITE
+ * Transfer a chunk of a XCLBIN data to the target region of a session,
+ * advancing the current data transfer offset. Chunks are transferred in a
+ * streaming like way and it is the responsibility of the caller to ensure all
+ * chunks are transferred in order and with no duplicates. Requires a transfer
+ * to have been started with MC_CMD_PR_TRANSFER_BEGIN. Returns ENOENT if the
+ * session handle doesn't exist; EACCESS if the session does not have an in-
+ * progress transfer; ESTALE if session's transfer has been cancelled, e.g.
+ * another session has started a transfer; ERANGE if the chunk exceeds the
+ * total transfer length specified in MC_CMD_PR_TRANSFER_BEGIN_IN.
+ */
+#define	MC_CMD_PR_TRANSFER_WRITE 0x1a5
+#define	MC_CMD_PR_TRANSFER_WRITE_MSGSET 0x1a5
+#undef	MC_CMD_0x1a5_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_TRANSFER_WRITE_IN msgrequest */
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_LENMIN 5
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_LENMAX 252
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_LEN(num) (4+1*(num))
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_DATA_NUM(len) (((len)-4)/1)
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_HANDLE_LEN 4
+/* Chunk of data to write */
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_DATA_OFST 4
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_DATA_LEN 1
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_DATA_MINNUM 1
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_DATA_MAXNUM 248
+#define	MC_CMD_PR_TRANSFER_WRITE_IN_DATA_MAXNUM_MCDI2 1016
+
+/* MC_CMD_PR_TRANSFER_WRITE_OUT msgresponse */
+#define	MC_CMD_PR_TRANSFER_WRITE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PR_TRANSFER_END
+ * End the transfer of a XCLBIN to the target region of a session. A success
+ * result indicates the firmware started the update process. If the XCLBIN data
+ * is accepted, and programming has started, all other sessions for the same
+ * target region will be marked stale. The caller can use MC_CMD_PR_STATUS_GET
+ * to determine the overall result of the update. Requires a transfer to have
+ * been started with MC_CMD_PR_TRANSFER_BEGIN. Returns ENOENT if the session
+ * handle doesn't exist; EACCESS if the session does not have an in-progress
+ * transfer; ESTALE if session's transfer has been cancelled, e.g. another
+ * session has started a transfer.
+ */
+#define	MC_CMD_PR_TRANSFER_END 0x1a6
+#define	MC_CMD_PR_TRANSFER_END_MSGSET 0x1a6
+#undef	MC_CMD_0x1a6_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a6_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_TRANSFER_END_IN msgrequest */
+#define	MC_CMD_PR_TRANSFER_END_IN_LEN 4
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_TRANSFER_END_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_TRANSFER_END_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_TRANSFER_END_OUT msgresponse */
+#define	MC_CMD_PR_TRANSFER_END_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PR_STATUS_GET
+ * Query the current update status of the target region of a session. Returns
+ * ENOENT if the session handle doesn't exist; ESTALE if the target region has
+ * been updated by another session since the session was opened.
+ */
+#define	MC_CMD_PR_STATUS_GET 0x1a7
+#define	MC_CMD_PR_STATUS_GET_MSGSET 0x1a7
+#undef	MC_CMD_0x1a7_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a7_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_STATUS_GET_IN msgrequest */
+#define	MC_CMD_PR_STATUS_GET_IN_LEN 4
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_STATUS_GET_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_STATUS_GET_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_STATUS_GET_OUT msgresponse */
+#define	MC_CMD_PR_STATUS_GET_OUT_LENMIN 9
+#define	MC_CMD_PR_STATUS_GET_OUT_LENMAX 252
+#define	MC_CMD_PR_STATUS_GET_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_PR_STATUS_GET_OUT_LEN(num) (8+1*(num))
+#define	MC_CMD_PR_STATUS_GET_OUT_DESCRIPTION_NUM(len) (((len)-8)/1)
+/* The state of the last update attempt triggered by MC_CMD_PR_TRANSFER_END or
+ * last action triggered by MC_CMD_PR_CONTROL.
+ */
+#define	MC_CMD_PR_STATUS_GET_OUT_STATUS_OFST 0
+#define	MC_CMD_PR_STATUS_GET_OUT_STATUS_LEN 4
+/* enum: Update in progress */
+#define	MC_CMD_PR_STATUS_GET_OUT_STATUS_PENDING 0x0
+/* enum: Update successful, or no update attempted since device boot */
+#define	MC_CMD_PR_STATUS_GET_OUT_STATUS_SUCCESS 0x1
+/* enum: Update failed */
+#define	MC_CMD_PR_STATUS_GET_OUT_STATUS_ERROR 0x2
+/* Code providing more information about the state of the update process. */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_OFST 4
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_LEN 4
+/* enum: Operation successful */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_SUCCESS 0x0
+/* enum: xclbin package was not built for this platform */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_XCLBIN_UUID_MISMATCH 0x1
+/* enum: Provided xclbin package contains no bitstream */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_XCLBIN_NO_BITSTREAM 0x2
+/* enum: Provided xclbin package contains clock error */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_XCLBIN_CLK_ERROR 0x3
+/* enum: Load attempt unexpectedly rejected - bitstream may be corrupt */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_BITSTREAM_ERROR 0x4
+/* enum: Clock programming failed */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_CLK_PROG_FAIL 0x5
+/* enum: Shell DDR failed to calibrate */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_DDR_CAL_FAIL 0x6
+/* enum: ICAP was unavailable before programming */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_ICAP_BUSY 0x7
+/* enum: ICAP failed to terminate programming */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_ICAP_FAIL 0x8
+/* enum: Clock scaling operation failed */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_CLK_SCALE_FAIL 0x9
+/* enum: Clock measurement operation failed */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_CLK_MON_FAIL 0xa
+/* enum: Firewall tripped */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_FIREWALL_TRIPPED 0xb
+/* enum: XCLBIN package parse error */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_XCLBIN_PARSER_FAIL 0xc
+/* enum: Extension metadata load error */
+#define	MC_CMD_PR_STATUS_GET_OUT_RESULT_METADATA_LOAD_ERROR 0xd
+/* Result description (NUL-terminated ASCII string) */
+#define	MC_CMD_PR_STATUS_GET_OUT_DESCRIPTION_OFST 8
+#define	MC_CMD_PR_STATUS_GET_OUT_DESCRIPTION_LEN 1
+#define	MC_CMD_PR_STATUS_GET_OUT_DESCRIPTION_MINNUM 1
+#define	MC_CMD_PR_STATUS_GET_OUT_DESCRIPTION_MAXNUM 244
+#define	MC_CMD_PR_STATUS_GET_OUT_DESCRIPTION_MAXNUM_MCDI2 1012
+
+
+/***********************************/
+/* MC_CMD_PR_CONTROL
+ * Control operations on programmable regions.
+ */
+#define	MC_CMD_PR_CONTROL 0x1ed
+#define	MC_CMD_PR_CONTROL_MSGSET 0x1ed
+#undef	MC_CMD_0x1ed_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ed_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_CONTROL_IN msgrequest */
+#define	MC_CMD_PR_CONTROL_IN_LEN 8
+/* Sub-command code */
+#define	MC_CMD_PR_CONTROL_IN_OP_OFST 0
+#define	MC_CMD_PR_CONTROL_IN_OP_LEN 4
+/* enum: Initiates the process of quiescing the logic within a programmable
+ * region in preparation for an update via an out-of-band mechanism. Returns
+ * ENOENT if the session handle doesn't exist; ESTALE if the target region has
+ * been updated by another session since the session was opened; EPERM if the
+ * caller has insufficient privilege to update the target region; EBUSY if the
+ * target region is currently busy and cannot be quieced (including if the
+ * region is being reinitialised); EALREADY if the target region is being
+ * quiesced or has already been quiesced. The progress of the quiesceing
+ * process can be checked with MC_CMD_PR_STATUS_GET. If MC_CMD_PR_STATUS_GET
+ * indicates that an error occurred during quiesceing them the programmable
+ * region is in an undefined state and the system must be reset. Once
+ * MC_CMD_PR_STATUS_GET indicates that the process has completed, a new image
+ * can be downloaded by the appropriate out-out-band mechanism.
+ */
+#define	MC_CMD_PR_CONTROL_IN_OP_QUIESCE 0x0
+/* enum: Reinitialise logic within a programmable region after an update via an
+ * out-of-band mechanism. Returns ENOENT if the session handle doesn't exist;
+ * ESTALE if the target region has been updated by another session since the
+ * session was opened; EPERM if the caller has insufficient privilege to update
+ * the target region; EBUSY if the target region is currently being quiesced;
+ * EALREADY if the target region is currently being initialised or has already
+ * been initialised. The progress of the unquiesceing process can be checked
+ * with MC_CMD_PR_STATUS_GET. If MC_CMD_PR_STATUS_GET indicates that an error
+ * occurred during unquiesceing then the programmable region is still in a
+ * quiesced state. A new image can be downloaded via the appropriate out-of-
+ * band mechanism. Once MC_CMD_PR_STATUS_GET indicates that the process has
+ * completed, the logic within the programmable region is available for use.
+ */
+#define	MC_CMD_PR_CONTROL_IN_OP_UNQUIESCE 0x1
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_CONTROL_IN_HANDLE_OFST 4
+#define	MC_CMD_PR_CONTROL_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_CONTROL_OP_QUIESCE_IN msgrequest */
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_LEN 8
+/* Sub-command code */
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_OP_OFST 0
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_OP_LEN 4
+/* enum: Initiates the process of quiescing the logic within a programmable
+ * region in preparation for an update via an out-of-band mechanism. Returns
+ * ENOENT if the session handle doesn't exist; ESTALE if the target region has
+ * been updated by another session since the session was opened; EPERM if the
+ * caller has insufficient privilege to update the target region; EBUSY if the
+ * target region is currently busy and cannot be quieced (including if the
+ * region is being reinitialised); EALREADY if the target region is being
+ * quiesced or has already been quiesced. The progress of the quiesceing
+ * process can be checked with MC_CMD_PR_STATUS_GET. If MC_CMD_PR_STATUS_GET
+ * indicates that an error occurred during quiesceing them the programmable
+ * region is in an undefined state and the system must be reset. Once
+ * MC_CMD_PR_STATUS_GET indicates that the process has completed, a new image
+ * can be downloaded by the appropriate out-out-band mechanism.
+ */
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_OP_QUIESCE 0x0
+/* enum: Reinitialise logic within a programmable region after an update via an
+ * out-of-band mechanism. Returns ENOENT if the session handle doesn't exist;
+ * ESTALE if the target region has been updated by another session since the
+ * session was opened; EPERM if the caller has insufficient privilege to update
+ * the target region; EBUSY if the target region is currently being quiesced;
+ * EALREADY if the target region is currently being initialised or has already
+ * been initialised. The progress of the unquiesceing process can be checked
+ * with MC_CMD_PR_STATUS_GET. If MC_CMD_PR_STATUS_GET indicates that an error
+ * occurred during unquiesceing then the programmable region is still in a
+ * quiesced state. A new image can be downloaded via the appropriate out-of-
+ * band mechanism. Once MC_CMD_PR_STATUS_GET indicates that the process has
+ * completed, the logic within the programmable region is available for use.
+ */
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_OP_UNQUIESCE 0x1
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_HANDLE_OFST 4
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_CONTROL_OP_QUIESCE_OUT msgresponse */
+#define	MC_CMD_PR_CONTROL_OP_QUIESCE_OUT_LEN 0
+
+/* MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN msgrequest */
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_LEN 8
+/* Sub-command code */
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_OP_OFST 0
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_OP_LEN 4
+/* enum: Initiates the process of quiescing the logic within a programmable
+ * region in preparation for an update via an out-of-band mechanism. Returns
+ * ENOENT if the session handle doesn't exist; ESTALE if the target region has
+ * been updated by another session since the session was opened; EPERM if the
+ * caller has insufficient privilege to update the target region; EBUSY if the
+ * target region is currently busy and cannot be quieced (including if the
+ * region is being reinitialised); EALREADY if the target region is being
+ * quiesced or has already been quiesced. The progress of the quiesceing
+ * process can be checked with MC_CMD_PR_STATUS_GET. If MC_CMD_PR_STATUS_GET
+ * indicates that an error occurred during quiesceing them the programmable
+ * region is in an undefined state and the system must be reset. Once
+ * MC_CMD_PR_STATUS_GET indicates that the process has completed, a new image
+ * can be downloaded by the appropriate out-out-band mechanism.
+ */
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_OP_QUIESCE 0x0
+/* enum: Reinitialise logic within a programmable region after an update via an
+ * out-of-band mechanism. Returns ENOENT if the session handle doesn't exist;
+ * ESTALE if the target region has been updated by another session since the
+ * session was opened; EPERM if the caller has insufficient privilege to update
+ * the target region; EBUSY if the target region is currently being quiesced;
+ * EALREADY if the target region is currently being initialised or has already
+ * been initialised. The progress of the unquiesceing process can be checked
+ * with MC_CMD_PR_STATUS_GET. If MC_CMD_PR_STATUS_GET indicates that an error
+ * occurred during unquiesceing then the programmable region is still in a
+ * quiesced state. A new image can be downloaded via the appropriate out-of-
+ * band mechanism. Once MC_CMD_PR_STATUS_GET indicates that the process has
+ * completed, the logic within the programmable region is available for use.
+ */
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_OP_UNQUIESCE 0x1
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_HANDLE_OFST 4
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_CONTROL_OP_UNQUIESCE_OUT msgresponse */
+#define	MC_CMD_PR_CONTROL_OP_UNQUIESCE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PR_METADATA_INFO
+ * Query information (length and name) about the meta-data describing the
+ * active contents of the target region of a session. Returns ENOENT if the
+ * session handle doesn't exist; ESTALE if the target region has been updated
+ * by another session since the session was opened; ENODEV if the meta-data
+ * item doesn't exist.
+ */
+#define	MC_CMD_PR_METADATA_INFO 0x1a8
+#define	MC_CMD_PR_METADATA_INFO_MSGSET 0x1a8
+#undef	MC_CMD_0x1a8_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a8_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_METADATA_INFO_IN msgrequest */
+#define	MC_CMD_PR_METADATA_INFO_IN_LEN 16
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_METADATA_INFO_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_METADATA_INFO_IN_HANDLE_LEN 4
+/* Item category */
+#define	MC_CMD_PR_METADATA_INFO_IN_CATEGORY_OFST 4
+#define	MC_CMD_PR_METADATA_INFO_IN_CATEGORY_LEN 4
+/*            Enum values, see field(s): */
+/*               PR_METADATA_ITEM_CATEGORY */
+/* Item sub-category */
+#define	MC_CMD_PR_METADATA_INFO_IN_SUBCATEGORY_OFST 8
+#define	MC_CMD_PR_METADATA_INFO_IN_SUBCATEGORY_LEN 4
+/*            Enum values, see field(s): */
+/*               PR_METADATA_ITEM_SUBCATEGORY */
+/* Item index */
+#define	MC_CMD_PR_METADATA_INFO_IN_INDEX_OFST 12
+#define	MC_CMD_PR_METADATA_INFO_IN_INDEX_LEN 4
+
+/* MC_CMD_PR_METADATA_INFO_OUT msgresponse */
+#define	MC_CMD_PR_METADATA_INFO_OUT_LEN 136
+/* Length (in bytes) of the meta-data item */
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_OFST 0
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_LEN 8
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_LO_OFST 0
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_LO_LEN 4
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_LO_LBN 0
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_LO_WIDTH 32
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_HI_OFST 4
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_HI_LEN 4
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_HI_LBN 32
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_LENGTH_HI_WIDTH 32
+/* Meta-data item name (NUL-terminated ASCII string). For the SECTION category
+ * the name is AXLF section name (axlf_section_header::m_sectionName). The
+ * items of the categories (UUID, TIMESTAMP and SIGNATURE) are unnamed items
+ * and return an empty string (NAME[0] == '\0').
+ */
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_NAME_OFST 8
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_NAME_LEN 1
+#define	MC_CMD_PR_METADATA_INFO_OUT_ITEM_NAME_NUM 128
+
+
+/***********************************/
+/* MC_CMD_PR_METADATA_READ
+ * Read a chunk of the meta-data describing the active contents of the target
+ * region of a session. Returns ENOENT if the session handle doesn't exist;
+ * ESTALE if the target region has been updated by another session since the
+ * session was opened; ENODEV if the meta-data item doesn't exist; ERANGE if
+ * the offset is outside the valid range for the meta-data item, e.g. offset >=
+ * item_length.
+ */
+#define	MC_CMD_PR_METADATA_READ 0x1a9
+#define	MC_CMD_PR_METADATA_READ_MSGSET 0x1a9
+#undef	MC_CMD_0x1a9_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a9_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_METADATA_READ_IN msgrequest */
+#define	MC_CMD_PR_METADATA_READ_IN_LEN 26
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_METADATA_READ_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_METADATA_READ_IN_HANDLE_LEN 4
+/* Item category */
+#define	MC_CMD_PR_METADATA_READ_IN_CATEGORY_OFST 4
+#define	MC_CMD_PR_METADATA_READ_IN_CATEGORY_LEN 4
+/*            Enum values, see field(s): */
+/*               PR_METADATA_ITEM_CATEGORY */
+/* Item sub-category */
+#define	MC_CMD_PR_METADATA_READ_IN_SUBCATEGORY_OFST 8
+#define	MC_CMD_PR_METADATA_READ_IN_SUBCATEGORY_LEN 4
+/*            Enum values, see field(s): */
+/*               PR_METADATA_ITEM_SUBCATEGORY */
+/* Item index */
+#define	MC_CMD_PR_METADATA_READ_IN_INDEX_OFST 12
+#define	MC_CMD_PR_METADATA_READ_IN_INDEX_LEN 4
+/* Byte offset within meta-data chunk */
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_OFST 16
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_LEN 8
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_LO_OFST 16
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_LO_LEN 4
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_LO_LBN 128
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_LO_WIDTH 32
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_HI_OFST 20
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_HI_LEN 4
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_HI_LBN 160
+#define	MC_CMD_PR_METADATA_READ_IN_OFFSET_HI_WIDTH 32
+/* Maximum length (in bytes) to read */
+#define	MC_CMD_PR_METADATA_READ_IN_MAX_LENGTH_OFST 24
+#define	MC_CMD_PR_METADATA_READ_IN_MAX_LENGTH_LEN 2
+
+/* MC_CMD_PR_METADATA_READ_OUT msgresponse */
+#define	MC_CMD_PR_METADATA_READ_OUT_LENMIN 1
+#define	MC_CMD_PR_METADATA_READ_OUT_LENMAX 252
+#define	MC_CMD_PR_METADATA_READ_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_PR_METADATA_READ_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_PR_METADATA_READ_OUT_DATA_NUM(len) (((len)-0)/1)
+/* Chunk of meta-data */
+#define	MC_CMD_PR_METADATA_READ_OUT_DATA_OFST 0
+#define	MC_CMD_PR_METADATA_READ_OUT_DATA_LEN 1
+#define	MC_CMD_PR_METADATA_READ_OUT_DATA_MINNUM 1
+#define	MC_CMD_PR_METADATA_READ_OUT_DATA_MAXNUM 252
+#define	MC_CMD_PR_METADATA_READ_OUT_DATA_MAXNUM_MCDI2 1020
+
+/* PR_FREQ_INFO structuredef: Information about a single programmable region
+ * clock
+ */
+#define	PR_FREQ_INFO_LEN 140
+/* Clock frequency (in Hz) */
+#define	PR_FREQ_INFO_FREQ_HZ_OFST 0
+#define	PR_FREQ_INFO_FREQ_HZ_LEN 8
+#define	PR_FREQ_INFO_FREQ_HZ_LO_OFST 0
+#define	PR_FREQ_INFO_FREQ_HZ_LO_LEN 4
+#define	PR_FREQ_INFO_FREQ_HZ_LO_LBN 0
+#define	PR_FREQ_INFO_FREQ_HZ_LO_WIDTH 32
+#define	PR_FREQ_INFO_FREQ_HZ_HI_OFST 4
+#define	PR_FREQ_INFO_FREQ_HZ_HI_LEN 4
+#define	PR_FREQ_INFO_FREQ_HZ_HI_LBN 32
+#define	PR_FREQ_INFO_FREQ_HZ_HI_WIDTH 32
+#define	PR_FREQ_INFO_FREQ_HZ_LBN 0
+#define	PR_FREQ_INFO_FREQ_HZ_WIDTH 64
+/* Clock type, a programmable region may have multiple clocks of the same type.
+ * (matches enum CLOCK_TYPE)
+ */
+#define	PR_FREQ_INFO_TYPE_OFST 8
+#define	PR_FREQ_INFO_TYPE_LEN 2
+/* enum: Unused/reserved. */
+#define	PR_FREQ_INFO_CLOCK_TYPE_UNUSED 0x0
+/* enum: Data clock. */
+#define	PR_FREQ_INFO_CLOCK_TYPE_DATA 0x1
+/* enum: Kernel clock. */
+#define	PR_FREQ_INFO_CLOCK_TYPE_KERNEL 0x2
+/* enum: System clock. */
+#define	PR_FREQ_INFO_CLOCK_TYPE_SYSTEM 0x3
+#define	PR_FREQ_INFO_TYPE_LBN 64
+#define	PR_FREQ_INFO_TYPE_WIDTH 16
+/* Assorted flags */
+#define	PR_FREQ_INFO_FLAGS_OFST 10
+#define	PR_FREQ_INFO_FLAGS_LEN 2
+#define	PR_FREQ_INFO_SETTABLE_OFST 10
+#define	PR_FREQ_INFO_SETTABLE_LBN 0
+#define	PR_FREQ_INFO_SETTABLE_WIDTH 1
+#define	PR_FREQ_INFO_FLAGS_LBN 80
+#define	PR_FREQ_INFO_FLAGS_WIDTH 16
+/* Clock name (NUL-terminated ASCII string) */
+#define	PR_FREQ_INFO_NAME_OFST 12
+#define	PR_FREQ_INFO_NAME_LEN 1
+#define	PR_FREQ_INFO_NAME_NUM 128
+#define	PR_FREQ_INFO_NAME_LBN 96
+#define	PR_FREQ_INFO_NAME_WIDTH 8
+
+
+/***********************************/
+/* MC_CMD_PR_FREQ_GET
+ * Query the current clock frequencies of the target region of a session. If
+ * the target region is 'empty' then an empty response should be returned.
+ * Returns ENOENT if the session handle doesn't exist; ESTALE if the target
+ * region has been updated by another session since the session was opened.
+ */
+#define	MC_CMD_PR_FREQ_GET 0x1aa
+#define	MC_CMD_PR_FREQ_GET_MSGSET 0x1aa
+#undef	MC_CMD_0x1aa_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1aa_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_FREQ_GET_IN msgrequest */
+#define	MC_CMD_PR_FREQ_GET_IN_LEN 4
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_FREQ_GET_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_FREQ_GET_IN_HANDLE_LEN 4
+
+/* MC_CMD_PR_FREQ_GET_OUT msgresponse */
+#define	MC_CMD_PR_FREQ_GET_OUT_LENMIN 0
+#define	MC_CMD_PR_FREQ_GET_OUT_LENMAX 140
+#define	MC_CMD_PR_FREQ_GET_OUT_LENMAX_MCDI2 980
+#define	MC_CMD_PR_FREQ_GET_OUT_LEN(num) (0+140*(num))
+#define	MC_CMD_PR_FREQ_GET_OUT_INFOS_NUM(len) (((len)-0)/140)
+/* An array of PR_FREQ_INFO structures. */
+#define	MC_CMD_PR_FREQ_GET_OUT_INFOS_OFST 0
+#define	MC_CMD_PR_FREQ_GET_OUT_INFOS_LEN 140
+
+
+/***********************************/
+/* MC_CMD_PR_FREQ_SET
+ * Set the desired clock frequencies of the target region of a session. The
+ * FREQ_HZ array must contain the same number of entries as the output to
+ * MC_CMD_PR_FREQ_GET. Callers should expect that the resulting frequencies may
+ * not precisely match the input and can use MC_CMD_PR_FREQ_GET to determine
+ * the actual frequencies selected. The algorithm for selecting the resulting
+ * clock settings is a firmware implementation detail based on the capabilities
+ * of the device and the target region. It is expected that the firmware will
+ * not exceed the desired frequency for any clock; will successfully apply a
+ * frequency value obtained from MC_CMD_PR_FREQ_GET without further adjustment;
+ * and if an error is returned no changes will have been applied to any of the
+ * clocks. Although this command is available to all callers that are a member
+ * of the GENERAL privilege group an extra privilege check may be performed
+ * against the target region in addition to tbe check performed by
+ * MC_CMD_PR_OPEN. Returns ENOENT if the session handle doesn't exist; ESTALE
+ * if the target region has been updated by another session since the session
+ * was opened; EINVAL if the target region is 'empty' or the wrong number of
+ * desired clock frequencies was specified in the input; ERANGE if one or more
+ * desired clock frequencies were not achievable.
+ */
+#define	MC_CMD_PR_FREQ_SET 0x1ab
+#define	MC_CMD_PR_FREQ_SET_MSGSET 0x1ab
+#undef	MC_CMD_0x1ab_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ab_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_PR_FREQ_SET_IN msgrequest */
+#define	MC_CMD_PR_FREQ_SET_IN_LENMIN 16
+#define	MC_CMD_PR_FREQ_SET_IN_LENMAX 248
+#define	MC_CMD_PR_FREQ_SET_IN_LENMAX_MCDI2 1016
+#define	MC_CMD_PR_FREQ_SET_IN_LEN(num) (8+8*(num))
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_NUM(len) (((len)-8)/8)
+/* Session handle from MC_CMD_PR_OPEN_OUT */
+#define	MC_CMD_PR_FREQ_SET_IN_HANDLE_OFST 0
+#define	MC_CMD_PR_FREQ_SET_IN_HANDLE_LEN 4
+/* Reserved, must be zero. */
+#define	MC_CMD_PR_FREQ_SET_IN_RESERVED_OFST 4
+#define	MC_CMD_PR_FREQ_SET_IN_RESERVED_LEN 4
+/* Desired frequency for each clock */
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_OFST 8
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_LEN 8
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_LO_OFST 8
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_LO_LEN 4
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_LO_LBN 64
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_LO_WIDTH 32
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_HI_OFST 12
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_HI_LEN 4
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_HI_LBN 96
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_HI_WIDTH 32
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_MINNUM 1
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_MAXNUM 30
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_MAXNUM_MCDI2 126
+/* enum: Leave the clock frequency unchanged. */
+#define	MC_CMD_PR_FREQ_SET_IN_FREQ_HZ_DONT_CHANGE 0x0
+
+/* MC_CMD_PR_FREQ_SET_OUT msgresponse */
+#define	MC_CMD_PR_FREQ_SET_OUT_LEN 0
+
 /* TABLE_FIELD_DESCR structuredef: An individual table field descriptor. This
  * describes the location and properties of one N-bit field within a wider
  * M-bit key/mask/response value.
@@ -34323,4 +39938,151 @@
 /* MC_CMD_TABLE_DELETE_OUT msgresponse */
 #define	MC_CMD_TABLE_DELETE_OUT_LEN 0
 
+/* MC_CMD_QUEUE_HANDLE structuredef: On X4, to distinguish between full-
+ * featured (X2-style) VIs and low-latency (X3-style) queues, we use the top
+ * bits of the queue handle to specify the queue type in all MCDI calls which
+ * refer to VIs/queues. These bits should be masked off when indexing into a
+ * queue in the BAR.
+ */
+#define	MC_CMD_QUEUE_HANDLE_LEN 4
+/* Combined queue number and type. This is the ID returned by and passed into
+ * MCDI calls that use queues.
+ */
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_HANDLE_OFST 0
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_HANDLE_LEN 4
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_NUM_OFST 0
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_NUM_LBN 0
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_NUM_WIDTH 24
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_OFST 0
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_LBN 24
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_WIDTH 8
+/* enum: Indicates that the queue instance is a full-featured VI */
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_FF_VI 0x0
+/* enum: Indicates that the queue instance is a LL TXQ */
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_LL_TXQ 0x1
+/* enum: Indicates that the queue instance is a LL RXQ */
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_LL_RXQ 0x2
+/* enum: Indicates that the queue instance is a LL EVQ */
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_TYPE_LL_EVQ 0x3
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_HANDLE_LBN 0
+#define	MC_CMD_QUEUE_HANDLE_QUEUE_HANDLE_WIDTH 32
+
+/* QUEUE_HANDLE structuredef: This definition is deprecated, use
+ * MC_CMD_QUEUE_HANDLE above.
+ */
+#define	QUEUE_HANDLE_LEN 4
+/* Combined queue number and type. This is the ID returned by and passed into
+ * MCDI calls that use queues.
+ */
+#define	QUEUE_HANDLE_QUEUE_HANDLE_OFST 0
+#define	QUEUE_HANDLE_QUEUE_HANDLE_LEN 4
+#define	QUEUE_HANDLE_QUEUE_NUM_OFST 0
+#define	QUEUE_HANDLE_QUEUE_NUM_LBN 0
+#define	QUEUE_HANDLE_QUEUE_NUM_WIDTH 24
+#define	QUEUE_HANDLE_QUEUE_TYPE_OFST 0
+#define	QUEUE_HANDLE_QUEUE_TYPE_LBN 24
+#define	QUEUE_HANDLE_QUEUE_TYPE_WIDTH 8
+/* enum: Indicates that the queue instance is a full-featured VI */
+#define	QUEUE_HANDLE_QUEUE_TYPE_FF_VI 0x0
+/* enum: Indicates that the queue instance is a LL TXQ */
+#define	QUEUE_HANDLE_QUEUE_TYPE_LL_TXQ 0x1
+/* enum: Indicates that the queue instance is a LL RXQ */
+#define	QUEUE_HANDLE_QUEUE_TYPE_LL_RXQ 0x2
+/* enum: Indicates that the queue instance is a LL EVQ */
+#define	QUEUE_HANDLE_QUEUE_TYPE_LL_EVQ 0x3
+#define	QUEUE_HANDLE_QUEUE_HANDLE_LBN 0
+#define	QUEUE_HANDLE_QUEUE_HANDLE_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_ALLOC_LL_QUEUES
+ * Allocate low latency (X3-style) queues for current PCI function. Can be
+ * called more than once if desired to allocate more queues.
+ */
+#define	MC_CMD_ALLOC_LL_QUEUES 0x1dd
+#define	MC_CMD_ALLOC_LL_QUEUES_MSGSET 0x1dd
+#undef	MC_CMD_0x1dd_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1dd_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_ALLOC_LL_QUEUES_IN msgrequest */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_LEN 24
+/* The minimum number of TXQs that is acceptable */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MIN_TXQ_COUNT_OFST 0
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MIN_TXQ_COUNT_LEN 4
+/* The maximum number of TXQs that would be useful */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MAX_TXQ_COUNT_OFST 4
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MAX_TXQ_COUNT_LEN 4
+/* The minimum number of RXQs that is acceptable */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MIN_RXQ_COUNT_OFST 8
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MIN_RXQ_COUNT_LEN 4
+/* The maximum number of RXQs that would be useful */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MAX_RXQ_COUNT_OFST 12
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MAX_RXQ_COUNT_LEN 4
+/* The minimum number of EVQs that is acceptable */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MIN_EVQ_COUNT_OFST 16
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MIN_EVQ_COUNT_LEN 4
+/* The maximum number of EVQs that would be useful */
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MAX_EVQ_COUNT_OFST 20
+#define	MC_CMD_ALLOC_LL_QUEUES_IN_MAX_EVQ_COUNT_LEN 4
+
+/* MC_CMD_ALLOC_LL_QUEUES_OUT msgresponse */
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_LENMIN 16
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_LENMAX 252
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_LEN(num) (12+4*(num))
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_QUEUES_NUM(len) (((len)-12)/4)
+/* The number of TXQs allocated in this request */
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_TXQ_COUNT_OFST 0
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_TXQ_COUNT_LEN 4
+/* The number of RXQs allocated in this request */
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_RXQ_COUNT_OFST 4
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_RXQ_COUNT_LEN 4
+/* The number of EVQs allocated in this request */
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_EVQ_COUNT_OFST 8
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_EVQ_COUNT_LEN 4
+/* A list of allocated queues, returned as MC_CMD_QUEUE_HANDLEs, not
+ * necessarily contiguous. TXQs are first in the list, followed by RXQs then
+ * EVQs. The type of each queue is indicated by the top bits (see the
+ * QUEUE_TYPE enum)
+ */
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_QUEUES_OFST 12
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_QUEUES_LEN 4
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_QUEUES_MINNUM 1
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_QUEUES_MAXNUM 60
+#define	MC_CMD_ALLOC_LL_QUEUES_OUT_QUEUES_MAXNUM_MCDI2 252
+
+
+/***********************************/
+/* MC_CMD_FREE_LL_QUEUES
+ * Free low latency (X3-style) queues for current PCI function.
+ */
+#define	MC_CMD_FREE_LL_QUEUES 0x1de
+#define	MC_CMD_FREE_LL_QUEUES_MSGSET 0x1de
+#undef	MC_CMD_0x1de_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1de_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_FREE_LL_QUEUES_IN msgrequest */
+#define	MC_CMD_FREE_LL_QUEUES_IN_LENMIN 8
+#define	MC_CMD_FREE_LL_QUEUES_IN_LENMAX 252
+#define	MC_CMD_FREE_LL_QUEUES_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_FREE_LL_QUEUES_IN_LEN(num) (4+4*(num))
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUES_NUM(len) (((len)-4)/4)
+/* The number of queues to free. */
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUE_COUNT_OFST 0
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUE_COUNT_LEN 4
+/* A list of queues to free, as a list of MC_CMD_QUEUE_HANDLEs. They must have
+ * all been previously allocated by MC_CMD_ALLOC_LL_QUEUES. The type of each
+ * queue should be indicated by the top bits.
+ */
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUES_OFST 4
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUES_LEN 4
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUES_MINNUM 1
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUES_MAXNUM 62
+#define	MC_CMD_FREE_LL_QUEUES_IN_QUEUES_MAXNUM_MCDI2 254
+
+/* MC_CMD_FREE_LL_QUEUES_OUT msgresponse */
+#define	MC_CMD_FREE_LL_QUEUES_OUT_LEN 0
+
 #endif /* _SIENA_MC_DRIVER_PCOL_H */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 20/46] common/sfc_efx/base: provide a stub for basic netport attach
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (18 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 19/46] common/sfc_efx/base: update MCDI headers Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 21/46] common/sfc_efx/base: provide defaults on netport attach path Ivan Malov
                   ` (27 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

New NICs (for instance, Medford4) offer new netport MCDI for
managing physical ports, which will supersede the legacy one.
Scope out the new interface initialisation on NIC probe path.
That will be augmented with the actual code by later patches.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 30 ++++++++++++++++++------
 drivers/common/sfc_efx/base/efx_impl.h  | 15 ++++++++++++
 drivers/common/sfc_efx/base/efx_np.c    | 31 +++++++++++++++++++++++++
 drivers/common/sfc_efx/base/meson.build |  1 +
 4 files changed, 70 insertions(+), 7 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/efx_np.c

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index e1e8de5396..eb1b68b17e 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2221,6 +2221,9 @@ efx_mcdi_nic_board_cfg(
 
 	encp->enc_board_type = board_type;
 
+	if (efx_np_supported(enp) != B_FALSE)
+		goto skip_phy_props;
+
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
 		goto fail8;
@@ -2246,6 +2249,7 @@ efx_mcdi_nic_board_cfg(
 	epp->ep_default_adv_cap_mask = els.epls.epls_adv_cap_mask;
 	epp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;
 
+skip_phy_props:
 	/* Check capabilities of running datapath firmware */
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail10;
@@ -2499,6 +2503,10 @@ ef10_nic_probe(
 	if ((rc = ef10_nic_board_cfg(enp)) != 0)
 		goto fail4;
 
+	rc = efx_np_attach(enp);
+	if (rc != 0)
+		goto fail5;
+
 	/*
 	 * Set default driver config limits (based on board config).
 	 *
@@ -2516,36 +2524,41 @@ ef10_nic_probe(
 #if EFSYS_OPT_MAC_STATS
 	/* Wipe the MAC statistics */
 	if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
-		goto fail5;
+		goto fail6;
 #endif
 
 #if EFSYS_OPT_LOOPBACK
-	if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
-		goto fail6;
+	if (efx_np_supported(enp) == B_FALSE) {
+		rc = efx_mcdi_get_loopback_modes(enp);
+		if (rc != 0)
+			goto fail7;
+	}
 #endif
 
 #if EFSYS_OPT_MON_STATS
 	if ((rc = mcdi_mon_cfg_build(enp)) != 0) {
 		/* Unprivileged functions do not have access to sensors */
 		if (rc != EACCES)
-			goto fail7;
+			goto fail8;
 	}
 #endif
 
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
+fail8:
+	EFSYS_PROBE(fail8);
+#endif
+#if EFSYS_OPT_LOOPBACK
 fail7:
 	EFSYS_PROBE(fail7);
 #endif
-#if EFSYS_OPT_LOOPBACK
+#if EFSYS_OPT_MAC_STATS
 fail6:
 	EFSYS_PROBE(fail6);
 #endif
-#if EFSYS_OPT_MAC_STATS
 fail5:
 	EFSYS_PROBE(fail5);
-#endif
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
@@ -3005,6 +3018,9 @@ ef10_nic_unprobe(
 #if EFSYS_OPT_MON_STATS
 	mcdi_mon_cfg_free(enp);
 #endif /* EFSYS_OPT_MON_STATS */
+
+	efx_np_detach(enp);
+
 	(void) efx_mcdi_drv_attach(enp, B_FALSE);
 }
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 89b7e0292e..9ad973ded7 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1880,6 +1880,21 @@ struct efx_virtio_vq_s {
 
 #endif /* EFSYS_OPT_VIRTIO */
 
+LIBEFX_INTERNAL
+extern			boolean_t
+efx_np_supported(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_np_attach(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern		void
+efx_np_detach(
+	__in	efx_nic_t *enp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
new file mode 100644
index 0000000000..432185f311
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2025 Advanced Micro Devices, Inc.
+ */
+#include "efx.h"
+#include "efx_impl.h"
+
+			boolean_t
+efx_np_supported(
+	__in		efx_nic_t *enp)
+{
+	return (enp->en_family >= EFX_FAMILY_MEDFORD4) ? B_TRUE : B_FALSE;
+}
+
+	__checkReturn	efx_rc_t
+efx_np_attach(
+	__in		efx_nic_t *enp)
+{
+	if (efx_np_supported(enp) == B_FALSE)
+		return (0);
+
+	return (0);
+}
+
+		void
+efx_np_detach(
+	__in	efx_nic_t *enp)
+{
+	if (efx_np_supported(enp) == B_FALSE)
+		return;
+}
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index c8deb4555e..02d5b2fbb9 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -20,6 +20,7 @@ sources = [
         'efx_mcdi.c',
         'efx_mon.c',
         'efx_nic.c',
+        'efx_np.c',
         'efx_nvram.c',
         'efx_pci.c',
         'efx_phy.c',
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 21/46] common/sfc_efx/base: provide defaults on netport attach path
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (19 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 20/46] common/sfc_efx/base: provide a stub for basic netport attach Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 22/46] common/sfc_efx/base: obtain assigned netport handle from NIC Ivan Malov
                   ` (26 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Fill in some port information, including legacy Siena fields.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_np.c | 44 ++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 432185f311..3200bc0a90 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -12,13 +12,57 @@ efx_np_supported(
 	return (enp->en_family >= EFX_FAMILY_MEDFORD4) ? B_TRUE : B_FALSE;
 }
 
+static				void
+efx_np_assign_legacy_props(
+	__in			efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+
+	memset(encp->enc_phy_revision, 0, sizeof (encp->enc_phy_revision));
+	encp->enc_phy_type = 0;
+
+#if EFSYS_OPT_NAMES
+	memset(encp->enc_phy_name, 0, sizeof (encp->enc_phy_name));
+#endif /* EFSYS_OPT_NAMES */
+
+#if EFSYS_OPT_PHY_STATS
+	encp->enc_mcdi_phy_stat_mask = 0;
+#endif /* EFSYS_OPT_PHY_STATS */
+
+#if EFSYS_OPT_PHY_FLAGS
+	encp->enc_phy_flags_mask = 0;
+#endif /* EFSYS_OPT_PHY_FLAGS */
+
+#if EFSYS_OPT_BIST
+	encp->enc_bist_mask = 0;
+#endif /* EFSYS_OPT_BIST */
+
+	encp->enc_mcdi_mdio_channel = 0;
+	encp->enc_port = 0;
+}
+
 	__checkReturn	efx_rc_t
 efx_np_attach(
 	__in		efx_nic_t *enp)
 {
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_port_t *epp = &(enp->en_port);
+
 	if (efx_np_supported(enp) == B_FALSE)
 		return (0);
 
+	/*
+	 * Some EFX properties are mostly leftover from Siena era
+	 * and we prefer to initialise those to harmless defaults.
+	 */
+	efx_np_assign_legacy_props(enp);
+
+#if EFSYS_OPT_PHY_LED_CONTROL
+	encp->enc_led_mask = 1U << EFX_PHY_LED_DEFAULT;
+#endif /* EFSYS_OPT_PHY_LED_CONTROL */
+
+	epp->ep_fixed_port_type = EFX_PHY_MEDIA_INVALID;
+	epp->ep_module_type = EFX_PHY_MEDIA_INVALID;
 	return (0);
 }
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 22/46] common/sfc_efx/base: obtain assigned netport handle from NIC
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (20 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 21/46] common/sfc_efx/base: provide defaults on netport attach path Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 23/46] common/sfc_efx/base: allow for const in MCDI struct accessor Ivan Malov
                   ` (25 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Get an 'assigned' netport handle for the current MCDI entity.
This handle will be used when sending other netport commands.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h |  4 +++
 drivers/common/sfc_efx/base/efx_np.c   | 50 ++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 9ad973ded7..4952f45121 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -335,6 +335,8 @@ typedef struct efx_virtio_ops_s {
 } efx_virtio_ops_t;
 #endif /* EFSYS_OPT_VIRTIO */
 
+typedef uint32_t efx_np_handle_t;
+
 typedef struct efx_port_s {
 	efx_mac_type_t		ep_mac_type;
 	uint32_t		ep_phy_type;
@@ -378,6 +380,8 @@ typedef struct efx_port_s {
 #endif
 	const efx_mac_ops_t	*ep_emop;
 	const efx_phy_ops_t	*ep_epop;
+
+	efx_np_handle_t		ep_np_handle;
 } efx_port_t;
 
 typedef struct efx_mon_ops_s {
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 3200bc0a90..ec6a432623 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -41,12 +41,53 @@ efx_np_assign_legacy_props(
 	encp->enc_port = 0;
 }
 
+static	__checkReturn		efx_rc_t
+efx_np_get_assigned_handle(
+	__in			efx_nic_t *enp,
+	__out			efx_np_handle_t *nphp)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_GET_ASSIGNED_PORT_HANDLE_IN_LEN,
+	    MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT_LEN);
+	efx_mcdi_req_t req;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT_LEN;
+	req.emr_in_length = MC_CMD_GET_ASSIGNED_PORT_HANDLE_IN_LEN;
+	req.emr_cmd = MC_CMD_GET_ASSIGNED_PORT_HANDLE;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_GET_ASSIGNED_PORT_HANDLE_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	*nphp = MCDI_OUT_DWORD(req, GET_ASSIGNED_PORT_HANDLE_OUT_PORT_HANDLE);
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
 	__checkReturn	efx_rc_t
 efx_np_attach(
 	__in		efx_nic_t *enp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_port_t *epp = &(enp->en_port);
+	efx_rc_t rc;
 
 	if (efx_np_supported(enp) == B_FALSE)
 		return (0);
@@ -63,7 +104,16 @@ efx_np_attach(
 
 	epp->ep_fixed_port_type = EFX_PHY_MEDIA_INVALID;
 	epp->ep_module_type = EFX_PHY_MEDIA_INVALID;
+
+	rc = efx_np_get_assigned_handle(enp, &epp->ep_np_handle);
+	if (rc != 0)
+		goto fail1;
+
 	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
 }
 
 		void
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 23/46] common/sfc_efx/base: allow for const in MCDI struct accessor
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (21 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 22/46] common/sfc_efx/base: obtain assigned netport handle from NIC Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 24/46] common/sfc_efx/base: get netport fixed capabilities on probe Ivan Malov
                   ` (24 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

The existing code is fine, however, future patches will need
to use this macro on buffers that are passed by callers with
const qualifier. With 'cast-qual' enabled, this macro causes
compile warnings in such cases. Rework it to allow for const.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h
index f13bf43da6..4e82717015 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_mcdi.h
@@ -536,7 +536,7 @@ efx_mcdi_set_nic_addr_regions(
 		EFX_DWORD_1) << 32)
 
 #define MCDI_STRUCT_MEMBER(_buf, _type, _ofst)				\
-	((_type *)((char *)_buf + _ofst ## _OFST))	\
+	((_type *)((char *)(uintptr_t)(_buf) + _ofst ## _OFST))
 
 #define MCDI_STRUCT_BYTE(_buf, _ofst)					\
 	EFX_BYTE_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_byte_t, _ofst),	\
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 24/46] common/sfc_efx/base: get netport fixed capabilities on probe
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (22 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 23/46] common/sfc_efx/base: allow for const in MCDI struct accessor Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 25/46] common/sfc_efx/base: decode netport link state on probe path Ivan Malov
                   ` (23 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

These make the basic subset of PHY capabilities known to EFX

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx.h    |  21 ++-
 drivers/common/sfc_efx/base/efx_np.c | 209 +++++++++++++++++++++++++++
 2 files changed, 224 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index a9ed3f423f..2c6af5f6b5 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1212,6 +1212,11 @@ typedef enum efx_phy_cap_type_e {
 	EFX_PHY_CAP_RS_FEC_REQUESTED,
 	EFX_PHY_CAP_25G_BASER_FEC,
 	EFX_PHY_CAP_25G_BASER_FEC_REQUESTED,
+	EFX_PHY_CAP_200000FDX,
+	EFX_PHY_CAP_IEEE_RS_INT_FEC,
+	EFX_PHY_CAP_IEEE_RS_INT_FEC_REQUESTED,
+	EFX_PHY_CAP_ETCS_RS_LL_FEC,
+	EFX_PHY_CAP_ETCS_RS_LL_FEC_REQUESTED,
 	EFX_PHY_CAP_NTYPES
 } efx_phy_cap_type_t;
 
@@ -4009,12 +4014,16 @@ typedef enum efx_phy_fec_type_e {
 
 #define EFX_PHY_CAP_FEC_BIT(_fec_bit) (1U << EFX_PHY_CAP_##_fec_bit)
 #define EFX_PHY_CAP_FEC_MASK \
-	(EFX_PHY_CAP_FEC_BIT(BASER_FEC) |		\
-	 EFX_PHY_CAP_FEC_BIT(25G_BASER_FEC) |		\
-	 EFX_PHY_CAP_FEC_BIT(BASER_FEC_REQUESTED) |	\
-	 EFX_PHY_CAP_FEC_BIT(25G_BASER_FEC_REQUESTED) |	\
-	 EFX_PHY_CAP_FEC_BIT(RS_FEC) |			\
-	 EFX_PHY_CAP_FEC_BIT(RS_FEC_REQUESTED))
+	(EFX_PHY_CAP_FEC_BIT(BASER_FEC) |			\
+	 EFX_PHY_CAP_FEC_BIT(25G_BASER_FEC) |			\
+	 EFX_PHY_CAP_FEC_BIT(BASER_FEC_REQUESTED) |		\
+	 EFX_PHY_CAP_FEC_BIT(25G_BASER_FEC_REQUESTED) |		\
+	 EFX_PHY_CAP_FEC_BIT(RS_FEC) |				\
+	 EFX_PHY_CAP_FEC_BIT(RS_FEC_REQUESTED) |		\
+	 EFX_PHY_CAP_FEC_BIT(IEEE_RS_INT_FEC) |			\
+	 EFX_PHY_CAP_FEC_BIT(IEEE_RS_INT_FEC_REQUESTED) |	\
+	 EFX_PHY_CAP_FEC_BIT(ETCS_RS_LL_FEC) |			\
+	 EFX_PHY_CAP_FEC_BIT(ETCS_RS_LL_FEC_REQUESTED))
 
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index ec6a432623..6a36abf5c9 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -76,6 +76,203 @@ efx_np_get_assigned_handle(
 fail2:
 	EFSYS_PROBE(fail2);
 
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+struct efx_np_cap_map {
+	uint16_t	encm_hw;
+	uint16_t	encm_sw;
+};
+
+static const struct efx_np_cap_map efx_np_cap_map_tech[] = {
+	/* 1G */
+	{ MC_CMD_ETH_TECH_1000BASEKX, EFX_PHY_CAP_1000FDX },
+	{ MC_CMD_ETH_TECH_1000BASEX, EFX_PHY_CAP_1000FDX },
+
+	/* 10G */
+	{ MC_CMD_ETH_TECH_10GBASE_KR, EFX_PHY_CAP_10000FDX },
+	{ MC_CMD_ETH_TECH_10GBASE_CR, EFX_PHY_CAP_10000FDX },
+	{ MC_CMD_ETH_TECH_10GBASE_SR, EFX_PHY_CAP_10000FDX },
+	{ MC_CMD_ETH_TECH_10GBASE_LR, EFX_PHY_CAP_10000FDX },
+	{ MC_CMD_ETH_TECH_10GBASE_LRM, EFX_PHY_CAP_10000FDX },
+	{ MC_CMD_ETH_TECH_10GBASE_ER, EFX_PHY_CAP_10000FDX },
+
+	/* 25GBASE */
+	{ MC_CMD_ETH_TECH_25GBASE_CR, EFX_PHY_CAP_25000FDX },
+	{ MC_CMD_ETH_TECH_25GBASE_KR, EFX_PHY_CAP_25000FDX },
+	{ MC_CMD_ETH_TECH_25GBASE_SR, EFX_PHY_CAP_25000FDX },
+	{ MC_CMD_ETH_TECH_25GBASE_LR_ER, EFX_PHY_CAP_25000FDX },
+
+	/* 40G */
+	{ MC_CMD_ETH_TECH_40GBASE_KR4, EFX_PHY_CAP_40000FDX },
+	{ MC_CMD_ETH_TECH_40GBASE_CR4, EFX_PHY_CAP_40000FDX },
+	{ MC_CMD_ETH_TECH_40GBASE_SR4, EFX_PHY_CAP_40000FDX },
+	{ MC_CMD_ETH_TECH_40GBASE_LR4, EFX_PHY_CAP_40000FDX },
+
+	/* 50G */
+	{ MC_CMD_ETH_TECH_50GBASE_CR2, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_KR2, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_SR2, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_KR, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_SR, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_CR, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_LR_ER_FR, EFX_PHY_CAP_50000FDX },
+	{ MC_CMD_ETH_TECH_50GBASE_DR, EFX_PHY_CAP_50000FDX },
+
+	/* 100G */
+	{ MC_CMD_ETH_TECH_100GBASE_KR4, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_SR4, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_CR4, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_LR4_ER4, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_KR2, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_SR2, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_CR2, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_LR2_ER2_FR2, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_DR2, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_KR, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_SR, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_LR_ER_FR, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_CR, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_DR, EFX_PHY_CAP_100000FDX },
+	{ MC_CMD_ETH_TECH_100GBASE_CR10, EFX_PHY_CAP_100000FDX },
+
+	/* 200G */
+	{ MC_CMD_ETH_TECH_200GBASE_KR4, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_SR4, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_LR4_ER4_FR4, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_DR4, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_CR4, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_KR2, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_SR2, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_LR2_ER2_FR2, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_DR2, EFX_PHY_CAP_200000FDX },
+	{ MC_CMD_ETH_TECH_200GBASE_CR2, EFX_PHY_CAP_200000FDX },
+};
+
+static const struct efx_np_cap_map efx_np_cap_map_fec[] = {
+	{ MC_CMD_FEC_BASER, EFX_PHY_CAP_BASER_FEC },
+	{ MC_CMD_FEC_RS, EFX_PHY_CAP_RS_FEC },
+	{ MC_CMD_FEC_IEEE_RS_INT, EFX_PHY_CAP_IEEE_RS_INT_FEC },
+	{ MC_CMD_FEC_ETCS_RS_LL, EFX_PHY_CAP_ETCS_RS_LL_FEC },
+};
+
+static const struct efx_np_cap_map efx_np_cap_map_fec_req[] = {
+	{ MC_CMD_FEC_BASER, EFX_PHY_CAP_BASER_FEC_REQUESTED },
+	{ MC_CMD_FEC_RS, EFX_PHY_CAP_RS_FEC_REQUESTED },
+	{ MC_CMD_FEC_IEEE_RS_INT, EFX_PHY_CAP_IEEE_RS_INT_FEC_REQUESTED },
+	{ MC_CMD_FEC_ETCS_RS_LL, EFX_PHY_CAP_ETCS_RS_LL_FEC_REQUESTED },
+};
+
+static const struct efx_np_cap_map efx_np_cap_map_pause[] = {
+	{ MC_CMD_PAUSE_MODE_AN_ASYM_DIR, EFX_PHY_CAP_ASYM },
+	{ MC_CMD_PAUSE_MODE_AN_PAUSE, EFX_PHY_CAP_PAUSE },
+};
+
+#define	CAP_BYTE(_map)	((_map)->encm_hw / CHAR_BIT)
+
+#define	CAP_VLD(_map, _data_nbytes)	(CAP_BYTE(_map) < (_data_nbytes))
+
+#define	CAP_FLAG(_map)	(1U << ((_map)->encm_hw % CHAR_BIT))
+
+#define	CAP_SUP(_map, _data)						\
+	(((_data)[CAP_BYTE(_map)] & CAP_FLAG(_map)) == CAP_FLAG(_map))
+
+#define	FOREACH_SUP_CAP(_map, _map_nentries, _data, _data_nbytes)	\
+	for (unsigned int _i = 0; _i < (_map_nentries); ++_i, ++(_map))	\
+		if (CAP_VLD(_map, _data_nbytes) && CAP_SUP(_map, _data))
+
+static					void
+efx_np_cap_mask_hw_to_sw(
+	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
+	__in				unsigned int hw_sw_map_nentries,
+	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
+	__in				size_t hw_cap_data_nbytes,
+	__out				uint32_t *sw_cap_maskp)
+{
+	FOREACH_SUP_CAP(hw_sw_map, hw_sw_map_nentries,
+	    hw_cap_data, hw_cap_data_nbytes) {
+		*sw_cap_maskp |= 1U << hw_sw_map->encm_sw;
+	}
+}
+
+/*
+ * Convert the given fraction of raw HW netport capability data (identified by
+ * the given section name of the MCDI response) to the EFX mask representation,
+ * in accordance with the specified collection of HW-to-SW capability mappings.
+ */
+#define	EFX_NP_CAP_MASK_HW_TO_SW(					\
+	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data, _sw_maskp)	\
+	efx_np_cap_mask_hw_to_sw((_hw_sw_cap_map),			\
+	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
+	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
+		    MC_CMD_##_hw_cap_section),				\
+	    MC_CMD_##_hw_cap_section##_LEN, (_sw_maskp))
+
+static				void
+efx_np_cap_hw_data_to_sw_mask(
+	__in			const uint8_t *hw_data,
+	__out			uint32_t *sw_maskp)
+{
+	EFX_NP_CAP_MASK_HW_TO_SW(efx_np_cap_map_tech, ETH_AN_FIELDS_TECH_MASK,
+	    hw_data, sw_maskp);
+
+	EFX_NP_CAP_MASK_HW_TO_SW(efx_np_cap_map_fec, ETH_AN_FIELDS_FEC_MASK,
+	    hw_data, sw_maskp);
+
+	EFX_NP_CAP_MASK_HW_TO_SW(efx_np_cap_map_fec_req, ETH_AN_FIELDS_FEC_REQ,
+	    hw_data, sw_maskp);
+
+	EFX_NP_CAP_MASK_HW_TO_SW(efx_np_cap_map_pause, ETH_AN_FIELDS_PAUSE_MASK,
+	    hw_data, sw_maskp);
+}
+
+static	__checkReturn		efx_rc_t
+efx_np_get_fixed_port_props(
+	__in			efx_nic_t *enp,
+	__in			efx_np_handle_t nph,
+	__out_opt		uint32_t *sup_cap_maskp)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_GET_FIXED_PORT_PROPERTIES_IN_LEN,
+	    MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LEN);
+	const uint8_t *cap_data;
+	efx_mcdi_req_t req;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LEN;
+	req.emr_in_length = MC_CMD_GET_FIXED_PORT_PROPERTIES_IN_LEN;
+	req.emr_cmd = MC_CMD_GET_FIXED_PORT_PROPERTIES;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, GET_FIXED_PORT_PROPERTIES_IN_PORT_HANDLE, nph);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used <
+	    MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_V2_LEN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	cap_data = MCDI_OUT2(req, const uint8_t,
+		    GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES);
+
+	if (sup_cap_maskp != NULL)
+		efx_np_cap_hw_data_to_sw_mask(cap_data, sup_cap_maskp);
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
@@ -109,8 +306,20 @@ efx_np_attach(
 	if (rc != 0)
 		goto fail1;
 
+	/*
+	 * FIXME: This may need revisiting for VFs, which
+	 * don't necessarily have access to these details.
+	 */
+	rc = efx_np_get_fixed_port_props(enp, epp->ep_np_handle,
+		    &epp->ep_phy_cap_mask);
+	if (rc != 0)
+		goto fail2;
+
 	return (0);
 
+fail2:
+	EFSYS_PROBE(fail2);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 25/46] common/sfc_efx/base: decode netport link state on probe path
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (23 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 24/46] common/sfc_efx/base: get netport fixed capabilities on probe Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 26/46] common/sfc_efx/base: fill in loopback modes on netport probe Ivan Malov
                   ` (22 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Retrieved properties form the advertised PHY capability mask.
The new code also helps to check support for autonegotiation.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h | 12 +++++
 drivers/common/sfc_efx/base/efx_np.c   | 67 ++++++++++++++++++++++++++
 2 files changed, 79 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 4952f45121..a3e60fd19b 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1899,6 +1899,18 @@ extern		void
 efx_np_detach(
 	__in	efx_nic_t *enp);
 
+typedef struct efx_np_link_state_s {
+	uint32_t		enls_adv_cap_mask;
+	boolean_t		enls_an_supported;
+} efx_np_link_state_t;
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_np_link_state(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__out		efx_np_link_state_t *lsp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 6a36abf5c9..4d69e620d9 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -273,6 +273,61 @@ efx_np_get_fixed_port_props(
 fail2:
 	EFSYS_PROBE(fail2);
 
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_np_link_state(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__out		efx_np_link_state_t *lsp)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_LINK_STATE_IN_LEN,
+	    MC_CMD_LINK_STATE_OUT_V3_LEN);
+	efx_mcdi_req_t req;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_LINK_STATE_OUT_V3_LEN;
+	req.emr_in_length = MC_CMD_LINK_STATE_IN_LEN;
+	req.emr_cmd = MC_CMD_LINK_STATE;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, LINK_STATE_IN_PORT_HANDLE, nph);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_LINK_STATE_OUT_V3_LEN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	memset(lsp, 0, sizeof (*lsp));
+
+	if (MCDI_OUT_DWORD(req, LINK_STATE_OUT_V2_LOCAL_AN_SUPPORT) !=
+	    MC_CMD_AN_NONE)
+		lsp->enls_an_supported = B_TRUE;
+
+	if (lsp->enls_an_supported != B_FALSE)
+		lsp->enls_adv_cap_mask |= 1U << EFX_PHY_CAP_AN;
+
+	efx_np_cap_hw_data_to_sw_mask(
+	    MCDI_OUT2(req, const uint8_t, LINK_STATE_OUT_ADVERTISED_ABILITIES),
+	    &lsp->enls_adv_cap_mask);
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
@@ -284,6 +339,7 @@ efx_np_attach(
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_port_t *epp = &(enp->en_port);
+	efx_np_link_state_t ls;
 	efx_rc_t rc;
 
 	if (efx_np_supported(enp) == B_FALSE)
@@ -315,8 +371,19 @@ efx_np_attach(
 	if (rc != 0)
 		goto fail2;
 
+	rc = efx_np_link_state(enp, epp->ep_np_handle, &ls);
+	if (rc != 0)
+		goto fail3;
+
+	if (ls.enls_an_supported != B_FALSE)
+		epp->ep_phy_cap_mask |= 1U << EFX_PHY_CAP_AN;
+
+	epp->ep_adv_cap_mask = ls.enls_adv_cap_mask;
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
+
 fail2:
 	EFSYS_PROBE(fail2);
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 26/46] common/sfc_efx/base: fill in loopback modes on netport probe
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (24 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 25/46] common/sfc_efx/base: decode netport link state on probe path Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 27/46] common/sfc_efx/base: introduce Medford4 stub for PHY methods Ivan Malov
                   ` (21 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Indicate support for some of the loopback modes known to EFX.
Such have been technology-dependent, but, on netport capable
NICs, they are backed by new generic modes, that are tied to
the stages in the processing chain where loopback can happen.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx.h      |   1 +
 drivers/common/sfc_efx/base/efx_impl.h |   2 +
 drivers/common/sfc_efx/base/efx_np.c   | 159 ++++++++++++++++++++++++-
 3 files changed, 160 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2c6af5f6b5..7ffa1f4cbd 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -655,6 +655,7 @@ typedef enum efx_link_mode_e {
 	EFX_LINK_25000FDX,
 	EFX_LINK_50000FDX,
 	EFX_LINK_100000FDX,
+	EFX_LINK_200000FDX,
 	EFX_LINK_NMODES
 } efx_link_mode_t;
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index a3e60fd19b..3a9c6fe3fd 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -382,6 +382,8 @@ typedef struct efx_port_s {
 	const efx_phy_ops_t	*ep_epop;
 
 	efx_np_handle_t		ep_np_handle;
+	efx_qword_t		ep_np_loopback_cap_mask;
+	uint8_t			ep_np_cap_data_raw[MC_CMD_ETH_AN_FIELDS_LEN];
 } efx_port_t;
 
 typedef struct efx_mon_ops_s {
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 4d69e620d9..2e4cdcf863 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -232,7 +232,9 @@ static	__checkReturn		efx_rc_t
 efx_np_get_fixed_port_props(
 	__in			efx_nic_t *enp,
 	__in			efx_np_handle_t nph,
-	__out_opt		uint32_t *sup_cap_maskp)
+	__out_opt		uint8_t *sup_cap_rawp,
+	__out_opt		uint32_t *sup_cap_maskp,
+	__out_opt		efx_qword_t *loopback_cap_maskp)
 {
 	EFX_MCDI_DECLARE_BUF(payload,
 	    MC_CMD_GET_FIXED_PORT_PROPERTIES_IN_LEN,
@@ -268,6 +270,18 @@ efx_np_get_fixed_port_props(
 	if (sup_cap_maskp != NULL)
 		efx_np_cap_hw_data_to_sw_mask(cap_data, sup_cap_maskp);
 
+	if (sup_cap_rawp != NULL) {
+		memcpy(sup_cap_rawp,
+		    MCDI_OUT2(req, const uint8_t,
+			    GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES),
+		    MC_CMD_GET_FIXED_PORT_PROPERTIES_OUT_ABILITIES_LEN);
+	}
+
+	if (loopback_cap_maskp != NULL) {
+		*loopback_cap_maskp = *MCDI_OUT2(req, efx_qword_t,
+		    GET_FIXED_PORT_PROPERTIES_OUT_V2_LOOPBACK_MODES_MASK_V2);
+	}
+
 	return (0);
 
 fail2:
@@ -333,6 +347,141 @@ efx_np_link_state(
 	return (rc);
 }
 
+#if EFSYS_OPT_LOOPBACK
+static	__checkReturn		efx_rc_t
+efx_np_sw_link_mode_to_cap(
+	__in			efx_link_mode_t link_mode,
+	__out			uint16_t *capp)
+{
+	switch (link_mode) {
+	case EFX_LINK_1000FDX:
+		*capp = EFX_PHY_CAP_1000FDX;
+		break;
+	case EFX_LINK_10000FDX:
+		*capp = EFX_PHY_CAP_10000FDX;
+		break;
+	case EFX_LINK_40000FDX:
+		*capp = EFX_PHY_CAP_40000FDX;
+		break;
+	case EFX_LINK_25000FDX:
+		*capp = EFX_PHY_CAP_25000FDX;
+		break;
+	case EFX_LINK_50000FDX:
+		*capp = EFX_PHY_CAP_50000FDX;
+		break;
+	case EFX_LINK_100000FDX:
+		*capp = EFX_PHY_CAP_100000FDX;
+		break;
+	case EFX_LINK_200000FDX:
+		*capp = EFX_PHY_CAP_200000FDX;
+		break;
+	default:
+		return (EINVAL);
+	}
+
+	return (0);
+}
+
+static					void
+efx_np_cap_enum_sw_to_hw(
+	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
+	__in				unsigned int hw_sw_map_nentries,
+	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
+	__in				size_t hw_cap_data_nbytes,
+	__in				uint16_t enum_sw,
+	__out				boolean_t *supportedp,
+	__out_opt			uint16_t *enum_hwp)
+{
+	FOREACH_SUP_CAP(hw_sw_map, hw_sw_map_nentries,
+	    hw_cap_data, hw_cap_data_nbytes) {
+		if (hw_sw_map->encm_sw != enum_sw)
+			continue;
+
+		if (enum_hwp != NULL)
+			*enum_hwp = hw_sw_map->encm_hw;
+
+		*supportedp = B_TRUE;
+		return;
+	}
+
+	*supportedp = B_FALSE;
+}
+
+/*
+ * Convert the given EFX PHY capability enum value to the HW counterpart,
+ * provided that the capability is supported by the HW, where the latter
+ * is detected from the given fraction of raw HW netport capability data.
+ *
+ * As the mapping of a capability from EFX to HW can be one to many, use
+ * the first supported HW capability bit, in accordance with the HW data.
+ */
+#define	EFX_NP_CAP_ENUM_SW_TO_HW(						\
+	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data,		\
+	    _enum_sw, _supportedp, _enum_hwp)				\
+	efx_np_cap_enum_sw_to_hw((_hw_sw_cap_map),			\
+	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
+	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
+		    MC_CMD_##_hw_cap_section),				\
+	    MC_CMD_##_hw_cap_section##_LEN, (_enum_sw),			\
+	    (_supportedp), (_enum_hwp))
+
+static				void
+efx_np_assign_loopback_props(
+	__in			efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_port_t *epp = &(enp->en_port);
+	efx_qword_t lbm_off;
+	efx_qword_t lbm_sup;
+	unsigned int i;
+
+	EFX_ZERO_QWORD(lbm_off);
+	EFX_SET_QWORD_BIT(lbm_off, EFX_LOOPBACK_OFF);
+
+	/*
+	 * Netport MCDI capable NICs support loopback modes which are
+	 * generalisations of the existing modes that specify roughly
+	 * where in the processing chain the loopback occurs, without
+	 * the need to refer to the specific technology. Provide some
+	 * to users under the guise of older technology-specific ones.
+	 *
+	 * FIXME: correct this if need be and augment with more modes.
+	 */
+	EFX_ZERO_QWORD(lbm_sup);
+	EFX_SET_QWORD_BIT(lbm_sup, EFX_LOOPBACK_OFF);
+
+	if (EFX_TEST_QWORD_BIT(epp->ep_np_loopback_cap_mask,
+			    MC_CMD_LOOPBACK_V2_AUTO))
+		EFX_SET_QWORD_BIT(lbm_sup, EFX_LOOPBACK_DATA);
+
+	if (EFX_TEST_QWORD_BIT(epp->ep_np_loopback_cap_mask,
+			    MC_CMD_LOOPBACK_V2_POST_PCS))
+		EFX_SET_QWORD_BIT(lbm_sup, EFX_LOOPBACK_PCS);
+
+	for (i = 0; i < EFX_ARRAY_SIZE(encp->enc_loopback_types); ++i) {
+		boolean_t supported = B_FALSE;
+		uint16_t cap_enum_sw;
+		efx_rc_t rc;
+
+		rc = efx_np_sw_link_mode_to_cap(i, &cap_enum_sw);
+		if (rc != 0) {
+			/* No support for this link mode => no loopbacks. */
+			encp->enc_loopback_types[i] = lbm_off;
+			continue;
+		}
+
+		EFX_NP_CAP_ENUM_SW_TO_HW(efx_np_cap_map_tech,
+		    ETH_AN_FIELDS_TECH_MASK, epp->ep_np_cap_data_raw,
+		    cap_enum_sw, &supported, NULL);
+
+		if (supported != B_FALSE)
+			encp->enc_loopback_types[i] = lbm_sup;
+		else
+			encp->enc_loopback_types[i] = lbm_off;
+	}
+}
+#endif /* EFSYS_OPT_LOOPBACK */
+
 	__checkReturn	efx_rc_t
 efx_np_attach(
 	__in		efx_nic_t *enp)
@@ -367,7 +516,8 @@ efx_np_attach(
 	 * don't necessarily have access to these details.
 	 */
 	rc = efx_np_get_fixed_port_props(enp, epp->ep_np_handle,
-		    &epp->ep_phy_cap_mask);
+		    epp->ep_np_cap_data_raw, &epp->ep_phy_cap_mask,
+		    &epp->ep_np_loopback_cap_mask);
 	if (rc != 0)
 		goto fail2;
 
@@ -379,6 +529,11 @@ efx_np_attach(
 		epp->ep_phy_cap_mask |= 1U << EFX_PHY_CAP_AN;
 
 	epp->ep_adv_cap_mask = ls.enls_adv_cap_mask;
+
+#if EFSYS_OPT_LOOPBACK
+	efx_np_assign_loopback_props(enp);
+#endif /* EFSYS_OPT_LOOPBACK */
+
 	return (0);
 
 fail3:
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 27/46] common/sfc_efx/base: introduce Medford4 stub for PHY methods
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (25 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 26/46] common/sfc_efx/base: fill in loopback modes on netport probe Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 28/46] common/sfc_efx/base: refactor EF10 link mode decoding helper Ivan Malov
                   ` (20 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Provide only a couple of no-op methods for now. Next patches
will augment the file with more, based on newer netport MCDI.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h      |  4 +++
 drivers/common/sfc_efx/base/efx_phy.c       | 22 +++++++++++++++-
 drivers/common/sfc_efx/base/medford4_impl.h | 29 +++++++++++++++++++++
 drivers/common/sfc_efx/base/medford4_phy.c  | 28 ++++++++++++++++++++
 drivers/common/sfc_efx/base/meson.build     |  1 +
 5 files changed, 83 insertions(+), 1 deletion(-)
 create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
 create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 3a9c6fe3fd..16b7f7640d 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -45,6 +45,10 @@
 #include "rhead_impl.h"
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+#include "medford4_impl.h"
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index 3d792f20b8..537865767a 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -68,6 +68,26 @@ static const efx_phy_ops_t	__efx_phy_rhead_ops = {
 };
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+static const efx_phy_ops_t	__efx_phy_medford4_ops = {
+	medford4_phy_power,		/* epo_power */
+	NULL,				/* epo_reset */
+	ef10_phy_reconfigure,		/* epo_reconfigure */
+	medford4_phy_verify,		/* epo_verify */
+	ef10_phy_oui_get,		/* epo_oui_get */
+	ef10_phy_link_state_get,	/* epo_link_state_get */
+#if EFSYS_OPT_PHY_STATS
+	ef10_phy_stats_update,		/* epo_stats_update */
+#endif	/* EFSYS_OPT_PHY_STATS */
+#if EFSYS_OPT_BIST
+	ef10_bist_enable_offline,	/* epo_bist_enable_offline */
+	ef10_bist_start,		/* epo_bist_start */
+	ef10_bist_poll,			/* epo_bist_poll */
+	ef10_bist_stop,			/* epo_bist_stop */
+#endif	/* EFSYS_OPT_BIST */
+};
+#endif	/* EFSYS_OPT_MEDFORD4 */
+
 	__checkReturn	efx_rc_t
 efx_phy_probe(
 	__in		efx_nic_t *enp)
@@ -116,7 +136,7 @@ efx_phy_probe(
 
 #if EFSYS_OPT_MEDFORD4
 	case EFX_FAMILY_MEDFORD4:
-		epop = &__efx_phy_ef10_ops;
+		epop = &__efx_phy_medford4_ops;
 	break;
 #endif	/* EFSYS_OPT_MEDFORD4 */
 
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
new file mode 100644
index 0000000000..ec8b3cec86
--- /dev/null
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2025 Advanced Micro Devices, Inc.
+ */
+#ifndef	_SYS_MEDFORD4_IMPL_H
+#define	_SYS_MEDFORD4_IMPL_H
+
+#include "efx.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_phy_power(
+	__in		efx_nic_t *enp,
+	__in		boolean_t power);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_phy_verify(
+	__in		efx_nic_t *enp);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _SYS_MEDFORD4_IMPL_H */
diff --git a/drivers/common/sfc_efx/base/medford4_phy.c b/drivers/common/sfc_efx/base/medford4_phy.c
new file mode 100644
index 0000000000..3e6080b4de
--- /dev/null
+++ b/drivers/common/sfc_efx/base/medford4_phy.c
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2025 Advanced Micro Devices, Inc.
+ */
+#include "efx.h"
+#include "efx_impl.h"
+#include "medford4_impl.h"
+
+#if EFSYS_OPT_MEDFORD4
+	__checkReturn	efx_rc_t
+medford4_phy_power(
+	__in		efx_nic_t *enp,
+	__in		boolean_t power)
+{
+	if (power)
+		enp->en_reset_flags |= EFX_RESET_PHY;
+
+	return (0);
+}
+
+	__checkReturn	efx_rc_t
+medford4_phy_verify(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	return (0);
+}
+#endif	/* EFSYS_OPT_MEDFORD4 */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 02d5b2fbb9..937e3820a0 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -57,6 +57,7 @@ sources = [
         'hunt_nic.c',
         'medford_nic.c',
         'medford2_nic.c',
+        'medford4_phy.c',
         'rhead_ev.c',
         'rhead_intr.c',
         'rhead_nic.c',
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 28/46] common/sfc_efx/base: refactor EF10 link mode decoding helper
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (26 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 27/46] common/sfc_efx/base: introduce Medford4 stub for PHY methods Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 13:59 ` [PATCH 29/46] common/sfc_efx/base: provide PHY link get method on Medford4 Ivan Malov
                   ` (19 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Future patches will use this change for netport MCDI support.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h | 13 +++++++++++
 drivers/common/sfc_efx/base/ef10_phy.c  | 31 ++++++++++++++++++-------
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index 3476f274ce..b872ec626c 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -801,6 +801,19 @@ ef10_phy_stats_update(
 
 #endif	/* EFSYS_OPT_PHY_STATS */
 
+LIBEFX_INTERNAL
+extern				void
+mcdi_phy_decode_link_mode(
+	__in			efx_nic_t *enp,
+	__in			boolean_t fd,
+	__in			boolean_t up,
+	__in			unsigned int speed,
+	__in			unsigned int fcntl,
+	__in			uint32_t fec,
+	__out			efx_link_mode_t *link_modep,
+	__out			unsigned int *fcntlp,
+	__out			efx_phy_fec_type_t *fecp);
+
 #if EFSYS_OPT_BIST
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index 49babdecd5..d458199c7a 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -92,10 +92,21 @@ mcdi_phy_decode_cap(
 	*maskp = mask;
 }
 
-static			void
+static				void
+mcdi_phy_decode_link_up_duplex(
+	__in			uint32_t link_flags,
+	__out			boolean_t *fdp,
+	__out			boolean_t *upp)
+{
+	*fdp = !!(link_flags & (1U << MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN));
+	*upp = !!(link_flags & (1U << MC_CMD_GET_LINK_OUT_LINK_UP_LBN));
+}
+
+			void
 mcdi_phy_decode_link_mode(
 	__in		efx_nic_t *enp,
-	__in		uint32_t link_flags,
+	__in		boolean_t fd,
+	__in		boolean_t up,
 	__in		unsigned int speed,
 	__in		unsigned int fcntl,
 	__in		uint32_t fec,
@@ -103,11 +114,6 @@ mcdi_phy_decode_link_mode(
 	__out		unsigned int *fcntlp,
 	__out		efx_phy_fec_type_t *fecp)
 {
-	boolean_t fd = !!(link_flags &
-		    (1 << MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN));
-	boolean_t up = !!(link_flags &
-		    (1 << MC_CMD_GET_LINK_OUT_LINK_UP_LBN));
-
 	_NOTE(ARGUNUSED(enp))
 
 	if (!up)
@@ -179,6 +185,8 @@ ef10_phy_link_ev(
 	unsigned int ev_fcntl;
 	unsigned int ev_speed;
 	uint32_t lp_cap_mask;
+	boolean_t fd;
+	boolean_t up;
 
 	if (ev_is_v2) {
 		link_flags = (1 << MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN);
@@ -226,7 +234,8 @@ ef10_phy_link_ev(
 		break;
 	}
 
-	mcdi_phy_decode_link_mode(enp, link_flags, speed, ev_fcntl,
+	mcdi_phy_decode_link_up_duplex(link_flags, &fd, &up);
+	mcdi_phy_decode_link_mode(enp, fd, up, speed, ev_fcntl,
 				    MC_CMD_FEC_NONE, &link_mode,
 				    &fcntl, &fec);
 	mcdi_phy_decode_cap(ev_lp_cap, &lp_cap_mask);
@@ -281,6 +290,8 @@ ef10_phy_get_link(
 	uint32_t fec;
 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_LINK_IN_LEN,
 		MC_CMD_GET_LINK_OUT_V2_LEN);
+	boolean_t fd;
+	boolean_t up;
 	efx_rc_t rc;
 
 	req.emr_cmd = MC_CMD_GET_LINK;
@@ -311,7 +322,9 @@ ef10_phy_get_link(
 	else
 		fec = MCDI_OUT_DWORD(req, GET_LINK_OUT_V2_FEC_TYPE);
 
-	mcdi_phy_decode_link_mode(enp, MCDI_OUT_DWORD(req, GET_LINK_OUT_FLAGS),
+	mcdi_phy_decode_link_up_duplex(MCDI_OUT_DWORD(req, GET_LINK_OUT_FLAGS),
+				    &fd, &up);
+	mcdi_phy_decode_link_mode(enp, fd, up,
 			    MCDI_OUT_DWORD(req, GET_LINK_OUT_LINK_SPEED),
 			    MCDI_OUT_DWORD(req, GET_LINK_OUT_FCNTL),
 			    fec, &elsp->epls.epls_link_mode,
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 29/46] common/sfc_efx/base: provide PHY link get method on Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (27 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 28/46] common/sfc_efx/base: refactor EF10 link mode decoding helper Ivan Malov
@ 2025-04-16 13:59 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 30/46] common/sfc_efx/base: implement PHY link control for Medford4 Ivan Malov
                   ` (18 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 13:59 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

To do so, make use of new netport MCDI supported by Medford4.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_phy.c      |  8 ++
 drivers/common/sfc_efx/base/efx.h           |  4 +-
 drivers/common/sfc_efx/base/efx_impl.h      | 19 ++++
 drivers/common/sfc_efx/base/efx_np.c        | 98 ++++++++++++++++++++-
 drivers/common/sfc_efx/base/efx_phy.c       |  2 +-
 drivers/common/sfc_efx/base/medford4_impl.h | 12 +++
 drivers/common/sfc_efx/base/medford4_phy.c  | 62 +++++++++++++
 7 files changed, 202 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index d458199c7a..8c3de273b4 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -118,6 +118,8 @@ mcdi_phy_decode_link_mode(
 
 	if (!up)
 		*link_modep = EFX_LINK_DOWN;
+	else if (speed == 200000 && fd)
+		*link_modep = EFX_LINK_200000FDX;
 	else if (speed == 100000 && fd)
 		*link_modep = EFX_LINK_100000FDX;
 	else if (speed == 50000 && fd)
@@ -160,6 +162,12 @@ mcdi_phy_decode_link_mode(
 	case MC_CMD_FEC_RS:
 		*fecp = EFX_PHY_FEC_RS;
 		break;
+	case MC_CMD_FEC_IEEE_RS_INT:
+		*fecp = EFX_PHY_FEC_IEEE_RS_INT;
+		break;
+	case MC_CMD_FEC_ETCS_RS_LL:
+		*fecp = EFX_PHY_FEC_ETCS_RS_LL;
+		break;
 	default:
 		EFSYS_PROBE1(mc_pcol_error, int, fec);
 		*fecp = EFX_PHY_FEC_NONE;
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 7ffa1f4cbd..6ca108cffe 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -4010,7 +4010,9 @@ efx_nic_set_fw_subvariant(
 typedef enum efx_phy_fec_type_e {
 	EFX_PHY_FEC_NONE = 0,
 	EFX_PHY_FEC_BASER,
-	EFX_PHY_FEC_RS
+	EFX_PHY_FEC_RS,
+	EFX_PHY_FEC_IEEE_RS_INT,
+	EFX_PHY_FEC_ETCS_RS_LL,
 } efx_phy_fec_type_t;
 
 #define EFX_PHY_CAP_FEC_BIT(_fec_bit) (1U << EFX_PHY_CAP_##_fec_bit)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 16b7f7640d..63ff112194 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1907,7 +1907,14 @@ efx_np_detach(
 
 typedef struct efx_np_link_state_s {
 	uint32_t		enls_adv_cap_mask;
+	uint32_t		enls_lp_cap_mask;
+	efx_loopback_type_t	enls_loopback;
+	uint32_t		enls_speed;
+	uint8_t			enls_fec;
+
 	boolean_t		enls_an_supported;
+	boolean_t		enls_fd;
+	boolean_t		enls_up;
 } efx_np_link_state_t;
 
 LIBEFX_INTERNAL
@@ -1917,6 +1924,18 @@ efx_np_link_state(
 	__in		efx_np_handle_t nph,
 	__out		efx_np_link_state_t *lsp);
 
+typedef struct efx_np_mac_state_s {
+	uint32_t	enms_fcntl;
+	boolean_t	enms_up;
+} efx_np_mac_state_t;
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_np_mac_state(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__out		efx_np_mac_state_t *msp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 2e4cdcf863..1b67fd16aa 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -301,7 +301,9 @@ efx_np_link_state(
 	EFX_MCDI_DECLARE_BUF(payload,
 	    MC_CMD_LINK_STATE_IN_LEN,
 	    MC_CMD_LINK_STATE_OUT_V3_LEN);
+	uint32_t status_flags;
 	efx_mcdi_req_t req;
+	uint32_t v3_flags;
 	efx_rc_t rc;
 
 	req.emr_out_length = MC_CMD_LINK_STATE_OUT_V3_LEN;
@@ -324,12 +326,44 @@ efx_np_link_state(
 		goto fail2;
 	}
 
+	status_flags = MCDI_OUT_DWORD(req, LINK_STATE_OUT_STATUS_FLAGS_LO);
+	v3_flags = MCDI_OUT_DWORD(req, LINK_STATE_OUT_V3_FLAGS);
 	memset(lsp, 0, sizeof (*lsp));
 
-	if (MCDI_OUT_DWORD(req, LINK_STATE_OUT_V2_LOCAL_AN_SUPPORT) !=
+	if (status_flags & (1U << MC_CMD_LINK_STATUS_FLAGS_AN_ABLE) &&
+	    MCDI_OUT_DWORD(req, LINK_STATE_OUT_V2_LOCAL_AN_SUPPORT) !=
 	    MC_CMD_AN_NONE)
 		lsp->enls_an_supported = B_TRUE;
 
+	if (v3_flags & (1U << MC_CMD_LINK_STATE_OUT_V3_FULL_DUPLEX_LBN))
+		lsp->enls_fd = B_TRUE;
+
+	if (status_flags & (1U << MC_CMD_LINK_STATUS_FLAGS_LINK_UP))
+		lsp->enls_up = B_TRUE;
+
+	lsp->enls_speed = MCDI_OUT_DWORD(req, LINK_STATE_OUT_V3_LINK_SPEED);
+	lsp->enls_fec = MCDI_OUT_BYTE(req, LINK_STATE_OUT_FEC_MODE);
+
+#if EFSYS_OPT_LOOPBACK
+	/* FIXME: correct this if need be and augment with more modes. */
+	switch (MCDI_OUT_BYTE(req, LINK_STATE_OUT_LOOPBACK)) {
+	case MC_CMD_LOOPBACK_V2_NONE:
+		lsp->enls_loopback = EFX_LOOPBACK_OFF;
+		break;
+	case MC_CMD_LOOPBACK_V2_AUTO:
+		lsp->enls_loopback = EFX_LOOPBACK_DATA;
+		break;
+	case MC_CMD_LOOPBACK_V2_POST_PCS:
+		lsp->enls_loopback = EFX_LOOPBACK_PCS;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail3;
+	}
+#else /* ! EFSYS_OPT_LOOPBACK */
+	_NOTE(ARGUNUSED(lbp))
+#endif /* EFSYS_OPT_LOOPBACK */
+
 	if (lsp->enls_an_supported != B_FALSE)
 		lsp->enls_adv_cap_mask |= 1U << EFX_PHY_CAP_AN;
 
@@ -337,8 +371,21 @@ efx_np_link_state(
 	    MCDI_OUT2(req, const uint8_t, LINK_STATE_OUT_ADVERTISED_ABILITIES),
 	    &lsp->enls_adv_cap_mask);
 
+	if (lsp->enls_an_supported != B_FALSE)
+		lsp->enls_lp_cap_mask |= 1U << EFX_PHY_CAP_AN;
+
+	efx_np_cap_hw_data_to_sw_mask(
+	    MCDI_OUT2(req, const uint8_t,
+		    LINK_STATE_OUT_LINK_PARTNER_ABILITIES),
+	    &lsp->enls_lp_cap_mask);
+
 	return (0);
 
+#if EFSYS_OPT_LOOPBACK
+fail3:
+	EFSYS_PROBE(fail3);
+#endif /* EFSYS_OPT_LOOPBACK */
+
 fail2:
 	EFSYS_PROBE(fail2);
 
@@ -554,3 +601,52 @@ efx_np_detach(
 	if (efx_np_supported(enp) == B_FALSE)
 		return;
 }
+
+	__checkReturn	efx_rc_t
+efx_np_mac_state(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__out		efx_np_mac_state_t *msp)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_MAC_STATE_IN_LEN,
+	    MC_CMD_MAC_STATE_OUT_LEN);
+	efx_mcdi_req_t req;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_MAC_STATE_OUT_LEN;
+	req.emr_in_length = MC_CMD_MAC_STATE_IN_LEN;
+	req.emr_cmd = MC_CMD_MAC_STATE;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, MAC_STATE_IN_PORT_HANDLE, nph);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_MAC_STATE_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	memset(msp, 0, sizeof (*msp));
+
+	if (MCDI_OUT_DWORD(req, MAC_STATE_OUT_MAC_FAULT_FLAGS) == 0)
+		msp->enms_up = B_TRUE;
+
+	msp->enms_fcntl = MCDI_OUT_DWORD(req, MAC_STATE_OUT_FCNTL);
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index 537865767a..0f748e32a4 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -75,7 +75,7 @@ static const efx_phy_ops_t	__efx_phy_medford4_ops = {
 	ef10_phy_reconfigure,		/* epo_reconfigure */
 	medford4_phy_verify,		/* epo_verify */
 	ef10_phy_oui_get,		/* epo_oui_get */
-	ef10_phy_link_state_get,	/* epo_link_state_get */
+	medford4_phy_link_state_get,	/* epo_link_state_get */
 #if EFSYS_OPT_PHY_STATS
 	ef10_phy_stats_update,		/* epo_stats_update */
 #endif	/* EFSYS_OPT_PHY_STATS */
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index ec8b3cec86..f24c9d1e6c 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -22,6 +22,18 @@ extern	__checkReturn	efx_rc_t
 medford4_phy_verify(
 	__in		efx_nic_t *enp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_phy_get_link(
+	__in		efx_nic_t *enp,
+	__out		ef10_link_state_t *elsp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_phy_link_state_get(
+	__in			efx_nic_t *enp,
+	__out			efx_phy_link_state_t *eplsp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/medford4_phy.c b/drivers/common/sfc_efx/base/medford4_phy.c
index 3e6080b4de..6a61645384 100644
--- a/drivers/common/sfc_efx/base/medford4_phy.c
+++ b/drivers/common/sfc_efx/base/medford4_phy.c
@@ -25,4 +25,66 @@ medford4_phy_verify(
 	_NOTE(ARGUNUSED(enp))
 	return (0);
 }
+
+	__checkReturn	efx_rc_t
+medford4_phy_get_link(
+	__in		efx_nic_t *enp,
+	__out		ef10_link_state_t *elsp)
+{
+	efx_np_handle_t nph = enp->en_port.ep_np_handle;
+	efx_np_link_state_t ls;
+	efx_np_mac_state_t ms;
+	uint32_t fcntl;
+	efx_rc_t rc;
+
+	rc = efx_np_link_state(enp, nph, &ls);
+	if (rc != 0)
+		goto fail1;
+
+	elsp->epls.epls_adv_cap_mask = ls.enls_adv_cap_mask;
+	elsp->epls.epls_lp_cap_mask = ls.enls_lp_cap_mask;
+	elsp->els_loopback = ls.enls_loopback;
+
+	rc = efx_np_mac_state(enp, nph, &ms);
+	if (rc != 0)
+		goto fail2;
+
+	elsp->els_mac_up = ms.enms_up;
+
+	mcdi_phy_decode_link_mode(enp, ls.enls_fd, ls.enls_up, ls.enls_speed,
+			    ms.enms_fcntl, ls.enls_fec,
+			    &elsp->epls.epls_link_mode,
+			    &elsp->epls.epls_fcntl,
+			    &elsp->epls.epls_fec);
+
+	elsp->epls.epls_ld_cap_mask = 0;
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn		efx_rc_t
+medford4_phy_link_state_get(
+	__in			efx_nic_t *enp,
+	__out			efx_phy_link_state_t *eplsp)
+{
+	ef10_link_state_t els;
+	efx_rc_t rc;
+
+	rc = medford4_phy_get_link(enp, &els);
+	if (rc != 0)
+		goto fail1;
+
+	*eplsp = els.epls;
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
 #endif	/* EFSYS_OPT_MEDFORD4 */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 30/46] common/sfc_efx/base: implement PHY link control for Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (28 preceding siblings ...)
  2025-04-16 13:59 ` [PATCH 29/46] common/sfc_efx/base: provide PHY link get method on Medford4 Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-17  7:31   ` Andrew Rybchenko
  2025-04-16 14:00 ` [PATCH 31/46] common/sfc_efx/base: introduce Medford4 stub for MAC methods Ivan Malov
                   ` (17 subsequent siblings)
  47 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Use new MCDI to select loopback, speed, flow control and FEC.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h     |   6 +
 drivers/common/sfc_efx/base/ef10_phy.c      |   2 +-
 drivers/common/sfc_efx/base/efx_impl.h      |  11 +
 drivers/common/sfc_efx/base/efx_np.c        | 277 ++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_phy.c       |   2 +-
 drivers/common/sfc_efx/base/medford4_impl.h |   5 +
 drivers/common/sfc_efx/base/medford4_phy.c  |  65 +++++
 7 files changed, 366 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index b872ec626c..df4fd77833 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -814,6 +814,12 @@ mcdi_phy_decode_link_mode(
 	__out			unsigned int *fcntlp,
 	__out			efx_phy_fec_type_t *fecp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_phy_set_led(
+	__in		efx_nic_t *enp,
+	__in		efx_phy_led_mode_t phy_led_mode);
+
 #if EFSYS_OPT_BIST
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index 8c3de273b4..114543e156 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -473,7 +473,7 @@ efx_mcdi_phy_set_link(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_phy_set_led(
 	__in		efx_nic_t *enp,
 	__in		efx_phy_led_mode_t phy_led_mode)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 63ff112194..15cf62506e 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1936,6 +1936,17 @@ efx_np_mac_state(
 	__in		efx_np_handle_t nph,
 	__out		efx_np_mac_state_t *msp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_np_link_ctrl(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		const uint8_t *cap_mask_sup_raw,
+	__in		efx_link_mode_t loopback_link_mode,
+	__in		efx_loopback_type_t loopback_mode,
+	__in		uint32_t cap_mask_sw,
+	__in		boolean_t fcntl_an);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 1b67fd16aa..03d49b9c78 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -650,3 +650,280 @@ efx_np_mac_state(
 
 	return (rc);
 }
+
+static					void
+efx_np_cap_mask_sw_to_hw(
+	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
+	__in				unsigned int hw_sw_map_nentries,
+	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
+	__in				size_t hw_cap_data_nbytes,
+	__in				uint32_t mask_sw,
+	__out				uint8_t *mask_hwp)
+{
+	FOREACH_SUP_CAP(hw_sw_map, hw_sw_map_nentries,
+	    hw_cap_data, hw_cap_data_nbytes) {
+		uint32_t flag_sw = 1U << hw_sw_map->encm_sw;
+
+		if ((mask_sw & flag_sw) != flag_sw)
+			continue;
+
+		mask_hwp[CAP_BYTE(hw_sw_map)] |= CAP_FLAG(hw_sw_map);
+		mask_sw &= ~(flag_sw);
+	}
+}
+
+/*
+ * Convert the given EFX PHY capability mask to the HW representation.
+ *
+ * The mapping of a capability from EFX to HW can be one to many. Use
+ * the given fraction of raw HW netport capability data to choose the
+ * first supported HW capability bit encountered for a particular EFX
+ * one and proceed with handling the next EFX bit, if any, afterwards.
+ *
+ * Do not check the input mask for leftover bits (unknown to EFX), as
+ * inputs should have been validated by efx_phy_adv_cap_set() already.
+ */
+#define	EFX_NP_CAP_MASK_SW_TO_HW(					\
+	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data,		\
+	    _mask_sw, _mask_hwp)					\
+	efx_np_cap_mask_sw_to_hw((_hw_sw_cap_map),			\
+	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
+	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
+		    MC_CMD_##_hw_cap_section),				\
+	    MC_CMD_##_hw_cap_section##_LEN,				\
+	    (_mask_sw), (_mask_hwp))
+
+static					void
+efx_np_cap_sw_mask_to_hw_enum(
+	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
+	__in				unsigned int hw_sw_map_nentries,
+	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
+	__in				size_t hw_cap_data_nbytes,
+	__in				uint32_t mask_sw,
+	__out				boolean_t *supportedp,
+	__out_opt			uint16_t *enum_hwp)
+{
+	unsigned int sw_nflags_req = 0;
+	unsigned int sw_nflags_sup = 0;
+	uint32_t sw_check_mask = 0;
+	unsigned int i;
+
+	for (i = 0; i < hw_sw_map_nentries; ++i) {
+		uint32_t flag_sw = 1U << hw_sw_map->encm_sw;
+		unsigned int byte_idx = CAP_BYTE(hw_sw_map);
+		uint8_t flag_hw = CAP_FLAG(hw_sw_map);
+
+		if (byte_idx >= hw_cap_data_nbytes) {
+			++(hw_sw_map);
+			continue;
+		}
+
+		if ((mask_sw & flag_sw) == flag_sw) {
+			if ((sw_check_mask & flag_sw) == 0)
+				++(sw_nflags_req);
+
+			sw_check_mask |= flag_sw;
+
+			if ((hw_cap_data[byte_idx] & flag_hw) == flag_hw) {
+				mask_sw &= ~(flag_sw);
+
+				if (enum_hwp != NULL)
+					*enum_hwp = hw_sw_map->encm_hw;
+			}
+		}
+
+		++(hw_sw_map);
+	}
+
+	/*
+	 * FIXME: in the absence of autonegotiation capability, drivers
+	 * may still pass multiple capability bits of the same category.
+	 * That is supposed to work on EF10; do not enforce below check.
+	 */
+#if 0
+	if (sw_nflags_req != 1) {
+		/*
+		 * The mask must contain exactly one relevant
+		 * flag which represents some specific choice.
+		 */
+		*supportedp = B_FALSE;
+		return;
+	}
+#endif
+
+	if (sw_check_mask != 0 && (mask_sw & sw_check_mask) == sw_check_mask) {
+		/* Failed to select the enum by at least one capability bit. */
+		*supportedp = B_FALSE;
+		return;
+	}
+
+	*supportedp = B_TRUE;
+}
+
+/*
+ * Convert (conceivably) the only EFX capability bit of the given mask to
+ * the HW enum value, provided that the capability is supported by the HW,
+ * where the latter follows from the given fraction of HW capability data.
+ */
+#define	EFX_NP_CAP_SW_MASK_TO_HW_ENUM(					\
+	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data,		\
+	    _mask_sw, _supportedp, _enum_hwp)				\
+	efx_np_cap_sw_mask_to_hw_enum((_hw_sw_cap_map),			\
+	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
+	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
+		    MC_CMD_##_hw_cap_section),				\
+	    MC_CMD_##_hw_cap_section##_LEN, (_mask_sw),			\
+	    (_supportedp), (_enum_hwp))
+
+	__checkReturn	efx_rc_t
+efx_np_link_ctrl(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		const uint8_t *cap_data_raw,
+	__in		efx_link_mode_t loopback_link_mode,
+	__in		efx_loopback_type_t loopback_mode,
+	__in		uint32_t cap_mask_sw,
+	__in		boolean_t fcntl_an)
+{
+	uint32_t flags = 1U << MC_CMD_LINK_FLAGS_IGNORE_MODULE_SEQ;
+	uint8_t loopback = MC_CMD_LOOPBACK_V2_NONE;
+	uint16_t link_tech = MC_CMD_ETH_TECH_NONE;
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_LINK_CTRL_IN_LEN,
+	    MC_CMD_LINK_CTRL_OUT_LEN);
+	uint8_t *cap_mask_hw_pausep;
+	uint8_t *cap_mask_hw_techp;
+	uint16_t cap_enum_hw;
+	boolean_t supported;
+	efx_mcdi_req_t req;
+	boolean_t phy_an;
+	efx_rc_t rc;
+	uint8_t fec;
+
+	req.emr_out_length = MC_CMD_LINK_CTRL_OUT_LEN;
+	req.emr_in_length = MC_CMD_LINK_CTRL_IN_LEN;
+	req.emr_cmd = MC_CMD_LINK_CTRL;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, LINK_CTRL_IN_PORT_HANDLE, nph);
+
+	cap_mask_hw_pausep = MCDI_IN2(req, uint8_t,
+	    LINK_CTRL_IN_ADVERTISED_PAUSE_ABILITIES_MASK);
+
+	cap_mask_hw_techp = MCDI_IN2(req, uint8_t,
+	    LINK_CTRL_IN_ADVERTISED_TECH_ABILITIES_MASK);
+
+	/* FIXME: correct this if need be and augment with more modes. */
+	if (loopback_mode != EFX_LOOPBACK_OFF) {
+#if EFSYS_OPT_LOOPBACK
+		uint16_t cap_enum_sw;
+
+		switch (loopback_mode) {
+		case EFX_LOOPBACK_DATA:
+			loopback = MC_CMD_LOOPBACK_V2_AUTO;
+			break;
+		case EFX_LOOPBACK_PCS:
+			loopback = MC_CMD_LOOPBACK_V2_POST_PCS;
+			break;
+		default:
+			rc = ENOTSUP;
+			goto fail1;
+		}
+
+		rc = efx_np_sw_link_mode_to_cap(loopback_link_mode,
+					    &cap_enum_sw);
+		if (rc != 0)
+			goto fail2;
+
+		EFX_NP_CAP_ENUM_SW_TO_HW(efx_np_cap_map_tech,
+		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_enum_sw,
+		    &supported, &link_tech);
+
+		if (supported == B_FALSE) {
+			rc = ENOTSUP;
+			goto fail3;
+		}
+#else /* ! EFSYS_OPT_LOOPBACK */
+		rc = ENOTSUP;
+		goto fail1;
+#endif /* EFSYS_OPT_LOOPBACK */
+	} else if (cap_mask_sw & (1U << EFX_PHY_CAP_AN)) {
+		EFX_NP_CAP_MASK_SW_TO_HW(efx_np_cap_map_tech,
+		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_mask_sw,
+		    cap_mask_hw_techp);
+
+		if (fcntl_an != B_FALSE) {
+			EFX_NP_CAP_MASK_SW_TO_HW(efx_np_cap_map_pause,
+			    ETH_AN_FIELDS_PAUSE_MASK, cap_data_raw, cap_mask_sw,
+			    cap_mask_hw_pausep);
+		}
+
+		flags |= 1U << MC_CMD_LINK_FLAGS_AUTONEG_EN;
+		link_tech = MC_CMD_ETH_TECH_AUTO;
+	} else {
+		EFX_NP_CAP_SW_MASK_TO_HW_ENUM(efx_np_cap_map_tech,
+		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_mask_sw,
+		    &supported, &link_tech);
+
+		if (supported == B_FALSE) {
+			rc = ENOTSUP;
+			goto fail4;
+		}
+	}
+
+	/* The software mask may have no requested FEC bits. Default is NONE. */
+	cap_enum_hw = MC_CMD_FEC_NONE;
+
+	/*
+	 * Compared to older EF10 interface, in netport MCDI, FEC mode is a
+	 * single enum choice. For compatibility, do not enforce only single
+	 * requested FEC bit in the original mask.
+	 *
+	 * No requested FEC bits in the original mask gives supported=TRUE.
+	 */
+	EFX_NP_CAP_SW_MASK_TO_HW_ENUM(efx_np_cap_map_fec_req,
+	    ETH_AN_FIELDS_FEC_REQ, cap_data_raw, cap_mask_sw,
+	    &supported, &cap_enum_hw);
+
+	if ((cap_mask_sw & EFX_PHY_CAP_FEC_MASK) != 0 && supported == B_FALSE) {
+		rc = ENOTSUP;
+		goto fail5;
+	}
+
+	EFSYS_ASSERT(cap_enum_hw <= UINT8_MAX);
+	fec = cap_enum_hw;
+
+	MCDI_IN_SET_WORD(req, LINK_CTRL_IN_LINK_TECHNOLOGY, link_tech);
+	MCDI_IN_SET_DWORD(req, LINK_CTRL_IN_CONTROL_FLAGS, flags);
+	MCDI_IN_SET_BYTE(req, LINK_CTRL_IN_LOOPBACK, loopback);
+	MCDI_IN_SET_BYTE(req, LINK_CTRL_IN_FEC_MODE, fec);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail6;
+	}
+
+	return (0);
+
+fail6:
+	EFSYS_PROBE(fail6);
+
+fail5:
+	EFSYS_PROBE(fail5);
+
+fail4:
+	EFSYS_PROBE(fail4);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index 0f748e32a4..e3b9d20d59 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -72,7 +72,7 @@ static const efx_phy_ops_t	__efx_phy_rhead_ops = {
 static const efx_phy_ops_t	__efx_phy_medford4_ops = {
 	medford4_phy_power,		/* epo_power */
 	NULL,				/* epo_reset */
-	ef10_phy_reconfigure,		/* epo_reconfigure */
+	medford4_phy_reconfigure,	/* epo_reconfigure */
 	medford4_phy_verify,		/* epo_verify */
 	ef10_phy_oui_get,		/* epo_oui_get */
 	medford4_phy_link_state_get,	/* epo_link_state_get */
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index f24c9d1e6c..795fd45bd4 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -34,6 +34,11 @@ medford4_phy_link_state_get(
 	__in			efx_nic_t *enp,
 	__out			efx_phy_link_state_t *eplsp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_phy_reconfigure(
+	__in			efx_nic_t *enp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/medford4_phy.c b/drivers/common/sfc_efx/base/medford4_phy.c
index 6a61645384..cc4e77587b 100644
--- a/drivers/common/sfc_efx/base/medford4_phy.c
+++ b/drivers/common/sfc_efx/base/medford4_phy.c
@@ -83,6 +83,71 @@ medford4_phy_link_state_get(
 	*eplsp = els.epls;
 	return (0);
 
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn		efx_rc_t
+medford4_phy_reconfigure(
+	__in			efx_nic_t *enp)
+{
+	efx_link_mode_t loopback_link_mode;
+	efx_port_t *epp = &(enp->en_port);
+	efx_loopback_type_t loopback;
+	efx_phy_led_mode_t led;
+	boolean_t supported;
+	efx_rc_t rc;
+
+	rc = efx_mcdi_link_control_supported(enp, &supported);
+	if (rc != 0)
+		goto fail1;
+
+	if (supported == B_FALSE)
+		goto exit;
+
+#if EFSYS_OPT_LOOPBACK
+	loopback_link_mode = epp->ep_loopback_link_mode;
+	loopback = epp->ep_loopback_type;
+#else /* ! EFSYS_OPT_LOOPBACK */
+	loopback_link_mode = EFX_LINK_UNKNOWN;
+	loopback = EFX_LOOPBACK_OFF;
+#endif /* EFSYS_OPT_LOOPBACK */
+
+	rc = efx_np_link_ctrl(enp, epp->ep_np_handle, epp->ep_np_cap_data_raw,
+		    loopback_link_mode, loopback, epp->ep_adv_cap_mask,
+		    epp->ep_fcntl_autoneg);
+	if (rc != 0)
+		goto fail2;
+
+#if EFSYS_OPT_PHY_LED_CONTROL
+	led = epp->ep_phy_led_mode;
+#else /* ! EFSYS_OPT_PHY_LED_CONTROL */
+	led = EFX_PHY_LED_DEFAULT;
+#endif /* EFSYS_OPT_PHY_LED_CONTROL */
+
+	rc = efx_mcdi_phy_set_led(enp, led);
+	if (rc != 0) {
+		/*
+		 * If LED control is not supported by firmware, we can
+		 * silently ignore default mode set failure
+		 * (see FWRIVERHD-198).
+		 */
+		if (rc == EOPNOTSUPP && led == EFX_PHY_LED_DEFAULT)
+			goto exit;
+
+		goto fail3;
+	}
+
+exit:
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 31/46] common/sfc_efx/base: introduce Medford4 stub for MAC methods
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (29 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 30/46] common/sfc_efx/base: implement PHY link control for Medford4 Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 32/46] common/sfc_efx/base: add MAC reconfigure method for Medford4 Ivan Malov
                   ` (16 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Provide only a small subset of methods for now. Next patches
will augment the file with more, based on newer netport MCDI.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_mac.c       | 32 +++++++++++-
 drivers/common/sfc_efx/base/medford4_impl.h | 12 +++++
 drivers/common/sfc_efx/base/medford4_mac.c  | 54 +++++++++++++++++++++
 drivers/common/sfc_efx/base/meson.build     |  1 +
 4 files changed, 98 insertions(+), 1 deletion(-)
 create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c

diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index a2cbf02b46..dde0e5ab87 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -89,6 +89,31 @@ static const efx_mac_ops_t	__efx_mac_rhead_ops = {
 };
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
+#if EFSYS_OPT_MEDFORD4
+static const efx_mac_ops_t	__efx_mac_medford4_ops = {
+	medford4_mac_poll,			/* emo_poll */
+	medford4_mac_up,			/* emo_up */
+	ef10_mac_addr_set,			/* emo_addr_set */
+	ef10_mac_pdu_set,			/* emo_pdu_set */
+	ef10_mac_pdu_get,			/* emo_pdu_get */
+	ef10_mac_reconfigure,			/* emo_reconfigure */
+	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
+	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
+	ef10_mac_filter_default_rxq_clear,
+					/* emo_filter_default_rxq_clear */
+#if EFSYS_OPT_LOOPBACK
+	ef10_mac_loopback_set,			/* emo_loopback_set */
+#endif	/* EFSYS_OPT_LOOPBACK */
+#if EFSYS_OPT_MAC_STATS
+	ef10_mac_stats_get_mask,		/* emo_stats_get_mask */
+	efx_mcdi_mac_stats_clear,		/* emo_stats_clear */
+	efx_mcdi_mac_stats_upload,		/* emo_stats_upload */
+	efx_mcdi_mac_stats_periodic,		/* emo_stats_periodic */
+	ef10_mac_stats_update			/* emo_stats_update */
+#endif	/* EFSYS_OPT_MAC_STATS */
+};
+#endif /* EFSYS_OPT_MEDFORD4 */
+
 	__checkReturn			efx_rc_t
 efx_mac_pdu_set(
 	__in				efx_nic_t *enp,
@@ -271,6 +296,11 @@ efx_mac_drain(
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT);
 	EFSYS_ASSERT(emop != NULL);
 
+	if (efx_np_supported(enp) != B_FALSE) {
+		/* Only pre-Medford4 boards have supported MAC drain control. */
+		return (0);
+	}
+
 	if (epp->ep_mac_drain == enabled)
 		return (0);
 
@@ -955,7 +985,7 @@ efx_mac_select(
 
 #if EFSYS_OPT_MEDFORD4
 	case EFX_FAMILY_MEDFORD4:
-		emop = &__efx_mac_ef10_ops;
+		emop = &__efx_mac_medford4_ops;
 		type = EFX_MAC_MEDFORD4;
 		break;
 #endif /* EFSYS_OPT_MEDFORD4 */
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index 795fd45bd4..6aa065c730 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -39,6 +39,18 @@ extern	__checkReturn		efx_rc_t
 medford4_phy_reconfigure(
 	__in			efx_nic_t *enp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_mac_poll(
+	__in		efx_nic_t *enp,
+	__out		efx_link_mode_t *link_modep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_mac_up(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *mac_upp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/medford4_mac.c b/drivers/common/sfc_efx/base/medford4_mac.c
new file mode 100644
index 0000000000..57ddbecfaa
--- /dev/null
+++ b/drivers/common/sfc_efx/base/medford4_mac.c
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2025 Advanced Micro Devices, Inc.
+ */
+#include "efx.h"
+#include "efx_impl.h"
+#include "medford4_impl.h"
+
+#if EFSYS_OPT_MEDFORD4
+	__checkReturn	efx_rc_t
+medford4_mac_poll(
+	__in		efx_nic_t *enp,
+	__out		efx_link_mode_t *link_modep)
+{
+	efx_port_t *epp = &(enp->en_port);
+	ef10_link_state_t els;
+	efx_rc_t rc;
+
+	rc = medford4_phy_get_link(enp, &els);
+	if (rc != 0)
+		goto fail1;
+
+	epp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;
+	epp->ep_fcntl = els.epls.epls_fcntl;
+
+	*link_modep = els.epls.epls_link_mode;
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	*link_modep = EFX_LINK_UNKNOWN;
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+medford4_mac_up(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *mac_upp)
+{
+	ef10_link_state_t els;
+	efx_rc_t rc;
+
+	rc = medford4_phy_get_link(enp, &els);
+	if (rc != 0)
+		goto fail1;
+
+	*mac_upp = els.els_mac_up;
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+#endif /* EFSYS_OPT_MEDFORD4 */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 937e3820a0..f18011e186 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -57,6 +57,7 @@ sources = [
         'hunt_nic.c',
         'medford_nic.c',
         'medford2_nic.c',
+        'medford4_mac.c',
         'medford4_phy.c',
         'rhead_ev.c',
         'rhead_intr.c',
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 32/46] common/sfc_efx/base: add MAC reconfigure method for Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (30 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 31/46] common/sfc_efx/base: introduce Medford4 stub for MAC methods Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-17  7:34   ` Andrew Rybchenko
  2025-04-16 14:00 ` [PATCH 33/46] common/sfc_efx/base: fill in software LUT for MAC statistics Ivan Malov
                   ` (15 subsequent siblings)
  47 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

That leverages MAC control functionality of new netport MCDI.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h      | 13 ++++
 drivers/common/sfc_efx/base/efx_mac.c       |  2 +-
 drivers/common/sfc_efx/base/efx_np.c        | 73 +++++++++++++++++++++
 drivers/common/sfc_efx/base/medford4_impl.h |  5 ++
 drivers/common/sfc_efx/base/medford4_mac.c  | 32 +++++++++
 5 files changed, 124 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 15cf62506e..ac1cd5292b 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1947,6 +1947,19 @@ efx_np_link_ctrl(
 	__in		uint32_t cap_mask_sw,
 	__in		boolean_t fcntl_an);
 
+typedef struct efx_np_mac_ctrl_s {
+	boolean_t	enmc_fcntl_autoneg;
+	boolean_t	enmc_include_fcs;
+	uint32_t	enmc_fcntl;
+} efx_np_mac_ctrl_t;
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_np_mac_ctrl(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		const efx_np_mac_ctrl_t *mc);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index dde0e5ab87..3c29db0016 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -96,7 +96,7 @@ static const efx_mac_ops_t	__efx_mac_medford4_ops = {
 	ef10_mac_addr_set,			/* emo_addr_set */
 	ef10_mac_pdu_set,			/* emo_pdu_set */
 	ef10_mac_pdu_get,			/* emo_pdu_get */
-	ef10_mac_reconfigure,			/* emo_reconfigure */
+	medford4_mac_reconfigure,		/* emo_reconfigure */
 	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
 	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
 	ef10_mac_filter_default_rxq_clear,
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 03d49b9c78..826ee93f0f 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -923,6 +923,79 @@ efx_np_link_ctrl(
 fail2:
 	EFSYS_PROBE(fail2);
 
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_np_mac_ctrl(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		const efx_np_mac_ctrl_t *mc)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_MAC_CTRL_IN_LEN,
+	    MC_CMD_MAC_CTRL_OUT_LEN);
+	efx_mcdi_req_t req;
+	uint32_t flags = 0;
+	uint32_t cfg = 0;
+	uint32_t fcntl;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_MAC_CTRL_OUT_LEN;
+	req.emr_in_length = MC_CMD_MAC_CTRL_IN_LEN;
+	req.emr_cmd = MC_CMD_MAC_CTRL;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_PORT_HANDLE, nph);
+
+	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_INCLUDE_FCS;
+	if (mc->enmc_include_fcs != B_FALSE)
+		flags |= 1U << MC_CMD_MAC_FLAGS_FLAG_INCLUDE_FCS;
+
+	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_FLAGS, flags);
+
+	if (mc->enmc_fcntl_autoneg != B_FALSE) {
+		fcntl = MC_CMD_FCNTL_AUTO;
+	} else {
+		switch (mc->enmc_fcntl) {
+		case 0:
+			fcntl = MC_CMD_FCNTL_OFF;
+			break;
+		case EFX_FCNTL_RESPOND:
+			fcntl = MC_CMD_FCNTL_RESPOND;
+			break;
+		case EFX_FCNTL_GENERATE:
+			fcntl = MC_CMD_FCNTL_GENERATE;
+			break;
+		case EFX_FCNTL_RESPOND | EFX_FCNTL_GENERATE:
+			fcntl = MC_CMD_FCNTL_BIDIR;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail1;
+		}
+	}
+
+	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_FCNTL;
+	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_FCNTL, fcntl);
+
+	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_V2_CONTROL_FLAGS, cfg);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail2;
+	}
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index 6aa065c730..8b232c516a 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -51,6 +51,11 @@ medford4_mac_up(
 	__in		efx_nic_t *enp,
 	__out		boolean_t *mac_upp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_mac_reconfigure(
+	__in			efx_nic_t *enp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/medford4_mac.c b/drivers/common/sfc_efx/base/medford4_mac.c
index 57ddbecfaa..c037c29b92 100644
--- a/drivers/common/sfc_efx/base/medford4_mac.c
+++ b/drivers/common/sfc_efx/base/medford4_mac.c
@@ -47,6 +47,38 @@ medford4_mac_up(
 	*mac_upp = els.els_mac_up;
 	return (0);
 
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn		efx_rc_t
+medford4_mac_reconfigure(
+	__in			efx_nic_t *enp)
+{
+	efx_port_t *epp = &(enp->en_port);
+	efx_np_mac_ctrl_t mc = {0};
+	efx_rc_t rc;
+
+	mc.enmc_fcntl_autoneg = epp->ep_fcntl_autoneg;
+	mc.enmc_include_fcs = epp->ep_include_fcs;
+	mc.enmc_fcntl = epp->ep_fcntl;
+
+	rc = efx_np_mac_ctrl(enp, epp->ep_np_handle, &mc);
+	if (rc != 0)
+		goto fail1;
+
+	/*
+	 * Apply the filters for the MAC configuration. If the NIC isn't ready
+	 * to accept filters, this may return success without setting anything.
+	 */
+	rc = efx_filter_reconfigure(enp, epp->ep_mac_addr,
+				    epp->ep_all_unicst, epp->ep_mulcst,
+				    epp->ep_all_mulcst, epp->ep_brdcst,
+				    epp->ep_mulcst_addr_list,
+				    epp->ep_mulcst_addr_count);
+	return (0);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 33/46] common/sfc_efx/base: fill in software LUT for MAC statistics
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (31 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 32/46] common/sfc_efx/base: add MAC reconfigure method for Medford4 Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 34/46] common/sfc_efx/base: fill in MAC statistics mask on Medford4 Ivan Malov
                   ` (14 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

To support MAC statistics, it is required to fill in a table
which will be used by EFX to get DMA field IDs (offsets into
the DMA buffer where MC FW uploads the data) by software IDs.

Fill in the lookup table by parsing HW statistic descriptors.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h |   8 +
 drivers/common/sfc_efx/base/efx_np.c   | 291 +++++++++++++++++++++++++
 2 files changed, 299 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index ac1cd5292b..aafb2bf998 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -341,6 +341,12 @@ typedef struct efx_virtio_ops_s {
 
 typedef uint32_t efx_np_handle_t;
 
+typedef struct efx_np_stat_s {
+	uint32_t	ens_hw_id;
+	uint16_t	ens_dma_fld;
+	boolean_t	ens_valid;
+} efx_np_stat_t;
+
 typedef struct efx_port_s {
 	efx_mac_type_t		ep_mac_type;
 	uint32_t		ep_phy_type;
@@ -388,6 +394,8 @@ typedef struct efx_port_s {
 	efx_np_handle_t		ep_np_handle;
 	efx_qword_t		ep_np_loopback_cap_mask;
 	uint8_t			ep_np_cap_data_raw[MC_CMD_ETH_AN_FIELDS_LEN];
+	/* Lookup table providing DMA buffer field IDs by EFX statistic IDs. */
+	efx_np_stat_t		ep_np_mac_stat_lut[EFX_MAC_NSTATS];
 } efx_port_t;
 
 typedef struct efx_mon_ops_s {
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 826ee93f0f..d4ee17ffb4 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -529,6 +529,286 @@ efx_np_assign_loopback_props(
 }
 #endif /* EFSYS_OPT_LOOPBACK */
 
+#if EFSYS_OPT_MAC_STATS
+/* HW statistic IDs, as per MC_CMD_MAC_STATISTICS_DESCRIPTOR format. */
+#define	EFX_NP_HW_STAT_ID(_src, _idx)					\
+	(((MC_CMD_STAT_ID_##_src) << MC_CMD_STAT_ID_SOURCE_ID_LBN) |	\
+	    ((uint32_t)(MC_CMD_STAT_ID_##_idx) <<			\
+		    MC_CMD_STAT_ID_MAC_STAT_ID_LBN))
+
+/*
+ * Mapping between EFX statistic IDs (array indices) and their HW counterparts.
+ *
+ * This is used in conjunction with HW statistic descriptors bearing DMA field
+ * IDs (offsets into the DMA buffer) to provide a SW lookup table for readings.
+ *
+ * From the HW perspective, statistics come from MAC and PHY, hence two macros.
+ */
+static const efx_np_stat_t efx_np_mac_stat_map[] = {
+#define	EFX_NP_STAT_MAC(_hw, _sw)				\
+	[EFX_MAC_##_sw] = {					\
+		.ens_hw_id = EFX_NP_HW_STAT_ID(MAC, _hw),	\
+		.ens_valid = B_TRUE,				\
+	}
+
+	EFX_NP_STAT_MAC(TX_PKTS, TX_PKTS),
+	EFX_NP_STAT_MAC(TX_PAUSE_PKTS, TX_PAUSE_PKTS),
+	/* TODO: TX_CONTROL_PKTS */
+	EFX_NP_STAT_MAC(TX_UNICAST_PKTS, TX_UNICST_PKTS),
+	EFX_NP_STAT_MAC(TX_MULTICAST_PKTS, TX_MULTICST_PKTS),
+	EFX_NP_STAT_MAC(TX_BROADCAST_PKTS, TX_BRDCST_PKTS),
+	EFX_NP_STAT_MAC(TX_BYTES, TX_OCTETS),
+	/* FIXME: TX_64_PKTS; TODO: TX_BAD_BYTES, TX_GOOD_BYTES, TX_LT64_PKTS */
+	EFX_NP_STAT_MAC(TX_64_PKTS, TX_LE_64_PKTS),
+	EFX_NP_STAT_MAC(TX_65_TO_127_PKTS, TX_65_TO_127_PKTS),
+	EFX_NP_STAT_MAC(TX_128_TO_255_PKTS, TX_128_TO_255_PKTS),
+	EFX_NP_STAT_MAC(TX_256_TO_511_PKTS, TX_256_TO_511_PKTS),
+	EFX_NP_STAT_MAC(TX_512_TO_1023_PKTS, TX_512_TO_1023_PKTS),
+	EFX_NP_STAT_MAC(TX_1024_TO_15XX_PKTS, TX_1024_TO_15XX_PKTS),
+	/* FIXME: TX_15XX_TO_JUMBO_PKTS; TODO: TX_GTJUMBO_PKTS */
+	EFX_NP_STAT_MAC(TX_15XX_TO_JUMBO_PKTS, TX_GE_15XX_PKTS),
+	/* TODO: TX_BAD_FCS_PKTS, TX_GOOD_FCS_PKTS */
+	EFX_NP_STAT_MAC(RX_PKTS, RX_PKTS),
+	EFX_NP_STAT_MAC(RX_PAUSE_PKTS, RX_PAUSE_PKTS),
+	/* TODO: RX_GOOD_PKTS, RX_BAD_PKTS, RX_CONTROL_PKTS */
+	EFX_NP_STAT_MAC(RX_UNICAST_PKTS, RX_UNICST_PKTS),
+	EFX_NP_STAT_MAC(RX_MULTICAST_PKTS, RX_MULTICST_PKTS),
+	EFX_NP_STAT_MAC(RX_BROADCAST_PKTS, RX_BRDCST_PKTS),
+	EFX_NP_STAT_MAC(RX_BYTES, RX_OCTETS),
+	/* TODO: RX_BAD_BYTES, RX_GOOD_BYTES */
+	/* FIXME: RX_64_PKTS; TODO: RX_UNDERSIZE_PKTS */
+	EFX_NP_STAT_MAC(RX_64_PKTS, RX_LE_64_PKTS),
+	EFX_NP_STAT_MAC(RX_65_TO_127_PKTS, RX_65_TO_127_PKTS),
+	EFX_NP_STAT_MAC(RX_128_TO_255_PKTS, RX_128_TO_255_PKTS),
+	EFX_NP_STAT_MAC(RX_256_TO_511_PKTS, RX_256_TO_511_PKTS),
+	EFX_NP_STAT_MAC(RX_512_TO_1023_PKTS, RX_512_TO_1023_PKTS),
+	EFX_NP_STAT_MAC(RX_1024_TO_15XX_PKTS, RX_1024_TO_15XX_PKTS),
+	/* FIXME: RX_15XX_TO_JUMBO_PKTS; TODO: RX_GTJUMBO_PKTS */
+	EFX_NP_STAT_MAC(RX_15XX_TO_JUMBO_PKTS, RX_GE_15XX_PKTS),
+	EFX_NP_STAT_MAC(RX_BAD_FCS_PKTS, RX_FCS_ERRORS),
+	/* TODO: RX_GOOD_FCS_PKTS, RX_OVERFLOW_PKTS */
+	EFX_NP_STAT_MAC(RX_SYMBOL_ERROR_PKTS, RX_SYMBOL_ERRORS),
+	EFX_NP_STAT_MAC(RX_ALIGN_ERROR_PKTS, RX_ALIGN_ERRORS),
+	/* TODO: RX_LENGTH_ERROR_PKTS */
+	EFX_NP_STAT_MAC(RX_INTERNAL_ERROR_PKTS, RX_INTERNAL_ERRORS),
+	EFX_NP_STAT_MAC(RX_JABBER_PKTS, RX_JABBER_PKTS),
+	EFX_NP_STAT_MAC(RX_NODESC_DROPS, RX_NODESC_DROP_CNT),
+	/* TODO: RX_LANES01_CHAR_ERR, RX_LANES23_CHAR_ERR */
+	/* TODO: RX_LANES01_DISP_ERR, RX_LANES23_DISP_ERR */
+	EFX_NP_STAT_MAC(RX_MATCH_FAULT, RX_MATCH_FAULT),
+
+#undef EFX_NP_STAT_MAC
+
+#define	EFX_NP_STAT_PHY(_hw, _sw)				\
+	[EFX_MAC_##_sw] = {					\
+		.ens_hw_id = EFX_NP_HW_STAT_ID(PHY, _hw),	\
+		.ens_valid = B_TRUE,				\
+	}
+
+	EFX_NP_STAT_PHY(FEC_UNCORRECTED_ERRORS, FEC_UNCORRECTED_ERRORS),
+	EFX_NP_STAT_PHY(FEC_CORRECTED_ERRORS, FEC_CORRECTED_ERRORS),
+	EFX_NP_STAT_PHY(FEC_CORRECTED_SYMBOLS_LANE0,
+	    FEC_CORRECTED_SYMBOLS_LANE0),
+	EFX_NP_STAT_PHY(FEC_CORRECTED_SYMBOLS_LANE1,
+	    FEC_CORRECTED_SYMBOLS_LANE1),
+	EFX_NP_STAT_PHY(FEC_CORRECTED_SYMBOLS_LANE2,
+	    FEC_CORRECTED_SYMBOLS_LANE2),
+	EFX_NP_STAT_PHY(FEC_CORRECTED_SYMBOLS_LANE3,
+	    FEC_CORRECTED_SYMBOLS_LANE3),
+
+#undef EFX_NP_STAT_PHY
+};
+#undef EFX_NP_HW_STAT_ID
+
+/* See efx_np_stats_describe() below. */
+static					void
+efx_np_stat_describe(
+	__in				uint8_t *hw_entry_buf,
+	__in				unsigned int lut_nentries,
+	__out_ecount_opt(lut_nentries)	efx_np_stat_t *lut)
+{
+	const efx_np_stat_t *map;
+	efx_mac_stat_t sw_id;
+	uint32_t hw_id;
+
+	hw_id = MCDI_STRUCT_DWORD(hw_entry_buf, MC_CMD_STAT_DESC_STAT_ID);
+
+	for (sw_id = 0; sw_id < EFX_ARRAY_SIZE(efx_np_mac_stat_map); ++sw_id) {
+		map = &efx_np_mac_stat_map[sw_id];
+
+		if (map->ens_valid != B_FALSE && map->ens_hw_id == hw_id)
+			goto found;
+	}
+
+	/* The statistic is unknown to EFX. */
+	return;
+
+found:
+	if (sw_id >= lut_nentries) {
+		/*
+		 * Static mapping size and the size of lookup
+		 * table are out-of-sync. Should never happen.
+		 */
+		return;
+	}
+
+	lut[sw_id].ens_dma_fld =
+	    MCDI_STRUCT_WORD(hw_entry_buf, MC_CMD_STAT_DESC_STAT_INDEX);
+	lut[sw_id].ens_valid = B_TRUE;
+	lut[sw_id].ens_hw_id = hw_id;
+}
+
+/*
+ * Get a fraction of statistic descriptors from the running FW, starting from
+ * the given HW ID offset, and fill DMA buffer field IDs in the corresponding
+ * entries of the software lookup table that will be used to get the readings.
+ */
+static	__checkReturn			efx_rc_t
+efx_np_stats_describe(
+	__in				efx_nic_t *enp,
+	__in				efx_np_handle_t nph,
+	__in				uint32_t req_ofst,
+	__in				unsigned int lut_nentries,
+	__out_ecount_opt(lut_nentries)	efx_np_stat_t *lut,
+	__out_opt			uint32_t *nprocessedp,
+	__out_opt			uint32_t *nstats_maxp)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN,
+	    MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2);
+	efx_port_t *epp = &(enp->en_port);
+	uint32_t nprocessed;
+	efx_mcdi_req_t req;
+	uint8_t *entries;
+	uint32_t stride;
+	unsigned int i;
+	size_t out_sz;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2;
+	req.emr_in_length = MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN;
+	req.emr_cmd = MC_CMD_MAC_STATISTICS_DESCRIPTOR;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, MAC_STATISTICS_DESCRIPTOR_IN_PORT_HANDLE, nph);
+	MCDI_IN_SET_DWORD(req, MAC_STATISTICS_DESCRIPTOR_IN_OFFSET, req_ofst);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	out_sz = req.emr_out_length_used;
+	if (out_sz < MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	if (nstats_maxp != NULL) {
+		*nstats_maxp = MCDI_OUT_DWORD(req,
+		    MAC_STATISTICS_DESCRIPTOR_OUT_DMA_BUFFER_SIZE) /
+		    sizeof (efx_qword_t);
+	}
+
+	if (lut_nentries == 0 || lut == NULL || nprocessedp == NULL)
+		return (0);
+
+	stride = MCDI_OUT_DWORD(req, MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_SIZE);
+	nprocessed = MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_NUM(out_sz);
+	if (nprocessed == 0) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	entries = MCDI_OUT2(req, uint8_t,
+	    MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES);
+
+	for (i = 0; i < nprocessed; ++i)
+		efx_np_stat_describe(entries + i * stride, lut_nentries, lut);
+
+	*nprocessedp = nprocessed;
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+efx_np_stats_assign(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_port_t *epp = &(enp->en_port);
+	unsigned int lut_nentries;
+	uint32_t nprocessed = 0;
+	efx_mac_stat_t sw_id;
+	efx_rc_t rc;
+
+	memset(epp->ep_np_mac_stat_lut, 0, sizeof (epp->ep_np_mac_stat_lut));
+	lut_nentries = EFX_ARRAY_SIZE(epp->ep_np_mac_stat_lut);
+
+	/*
+	 * First get encp->enc_mac_stats_nstats from the firmware.
+	 *
+	 * Do not limit encp->enc_mac_stats_nstats by the size of
+	 * epp->ep_np_mac_stat_lut, because the former is used to
+	 * allocate DMA buffer by client drivers, which must have
+	 * its size match expectations of the running MC firmware.
+	 */
+	rc = efx_np_stats_describe(enp, epp->ep_np_handle, 0, 0, NULL,
+			    NULL, &encp->enc_mac_stats_nstats);
+	if (rc != 0)
+		goto fail1;
+
+	/* Then process the actual descriptor data. */
+	while (nprocessed < encp->enc_mac_stats_nstats) {
+		uint32_t batch;
+
+		rc = efx_np_stats_describe(enp, epp->ep_np_handle, nprocessed,
+		    lut_nentries, epp->ep_np_mac_stat_lut, &batch, NULL);
+		if (rc != 0)
+			goto fail2;
+
+		nprocessed += batch;
+
+		if (batch == 0) {
+			/* Failed to supply all descriptors. */
+			rc = EMSGSIZE;
+			goto fail3;
+		}
+	}
+
+	sw_id = EFX_MAC_FEC_UNCORRECTED_ERRORS;
+	if (epp->ep_np_mac_stat_lut[sw_id].ens_valid == B_FALSE)
+		encp->enc_fec_counters = B_FALSE;
+	else
+		encp->enc_fec_counters = B_TRUE;
+
+	encp->enc_hlb_counters = B_FALSE;
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+#endif /* EFSYS_OPT_MAC_STATS */
+
 	__checkReturn	efx_rc_t
 efx_np_attach(
 	__in		efx_nic_t *enp)
@@ -581,8 +861,19 @@ efx_np_attach(
 	efx_np_assign_loopback_props(enp);
 #endif /* EFSYS_OPT_LOOPBACK */
 
+#if EFSYS_OPT_MAC_STATS
+	rc = efx_np_stats_assign(enp);
+	if (rc != 0)
+		goto fail4;
+#endif /* EFSYS_OPT_MAC_STATS */
+
 	return (0);
 
+#if EFSYS_OPT_MAC_STATS
+fail4:
+	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_MAC_STATS */
+
 fail3:
 	EFSYS_PROBE(fail3);
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 34/46] common/sfc_efx/base: fill in MAC statistics mask on Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (32 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 33/46] common/sfc_efx/base: fill in software LUT for MAC statistics Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 35/46] common/sfc_efx/base: support MAC statistics on Medford4 NICs Ivan Malov
                   ` (13 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Let client drivers know which MAC statistics can be accessed.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_mac.c       |  2 +-
 drivers/common/sfc_efx/base/medford4_impl.h |  9 ++++++
 drivers/common/sfc_efx/base/medford4_mac.c  | 31 +++++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index 3c29db0016..6abe2046e8 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -105,7 +105,7 @@ static const efx_mac_ops_t	__efx_mac_medford4_ops = {
 	ef10_mac_loopback_set,			/* emo_loopback_set */
 #endif	/* EFSYS_OPT_LOOPBACK */
 #if EFSYS_OPT_MAC_STATS
-	ef10_mac_stats_get_mask,		/* emo_stats_get_mask */
+	medford4_mac_stats_get_mask,		/* emo_stats_get_mask */
 	efx_mcdi_mac_stats_clear,		/* emo_stats_clear */
 	efx_mcdi_mac_stats_upload,		/* emo_stats_upload */
 	efx_mcdi_mac_stats_periodic,		/* emo_stats_periodic */
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index 8b232c516a..2fbf1495d1 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -56,6 +56,15 @@ extern	__checkReturn		efx_rc_t
 medford4_mac_reconfigure(
 	__in			efx_nic_t *enp);
 
+#if EFSYS_OPT_MAC_STATS
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_mac_stats_get_mask(
+	__in			efx_nic_t *enp,
+	__inout_bcount(sz)	uint32_t *maskp,
+	__in			size_t sz);
+#endif /* EFSYS_OPT_MAC_STATS */
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/medford4_mac.c b/drivers/common/sfc_efx/base/medford4_mac.c
index c037c29b92..b8a5aade16 100644
--- a/drivers/common/sfc_efx/base/medford4_mac.c
+++ b/drivers/common/sfc_efx/base/medford4_mac.c
@@ -83,4 +83,35 @@ medford4_mac_reconfigure(
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
 }
+
+#if EFSYS_OPT_MAC_STATS
+	__checkReturn		efx_rc_t
+medford4_mac_stats_get_mask(
+	__in			efx_nic_t *enp,
+	__inout_bcount(sz)	uint32_t *maskp,
+	__in			size_t sz)
+{
+	efx_port_t *epp = &(enp->en_port);
+	unsigned int i;
+	efx_rc_t rc;
+
+	for (i = 0; i < EFX_ARRAY_SIZE(epp->ep_np_mac_stat_lut); ++i) {
+		const struct efx_mac_stats_range rng[] = { { i, i } };
+
+		if (epp->ep_np_mac_stat_lut[i].ens_valid == B_FALSE)
+			continue;
+
+		rc = efx_mac_stats_mask_add_ranges(maskp, sz, rng, 1);
+		if (rc != 0)
+			goto fail1;
+	}
+
+	/* TODO: care about VADAPTOR statistics */
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+#endif /* EFSYS_OPT_MAC_STATS */
 #endif /* EFSYS_OPT_MEDFORD4 */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 35/46] common/sfc_efx/base: support MAC statistics on Medford4 NICs
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (33 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 34/46] common/sfc_efx/base: fill in MAC statistics mask on Medford4 Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-17  7:43   ` Andrew Rybchenko
  2025-04-16 14:00 ` [PATCH 36/46] common/sfc_efx/base: implement MAC PDU controls for Medford4 Ivan Malov
                   ` (12 subsequent siblings)
  47 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Supply Medford4-specific methods to clear, upload and update
MAC statistics, as well as the method to toggle periodic DMA
updates. All of these leverage the same netport MCDI command.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c      |   4 +-
 drivers/common/sfc_efx/base/efx_impl.h      |  11 ++
 drivers/common/sfc_efx/base/efx_mac.c       |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c      |  12 +-
 drivers/common/sfc_efx/base/efx_np.c        |  89 +++++++++++++
 drivers/common/sfc_efx/base/medford4_impl.h |  27 ++++
 drivers/common/sfc_efx/base/medford4_mac.c  | 138 ++++++++++++++++++++
 7 files changed, 282 insertions(+), 7 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index eb1b68b17e..31fcb361f2 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2523,7 +2523,9 @@ ef10_nic_probe(
 
 #if EFSYS_OPT_MAC_STATS
 	/* Wipe the MAC statistics */
-	if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
+
+	rc = efx_mcdi_mac_stats_clear(enp);
+	if (rc != 0)
 		goto fail6;
 #endif
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index aafb2bf998..7dbad601ff 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1968,6 +1968,17 @@ efx_np_mac_ctrl(
 	__in		efx_np_handle_t nph,
 	__in		const efx_np_mac_ctrl_t *mc);
 
+#if EFSYS_OPT_MAC_STATS
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_np_mac_stats(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		efx_stats_action_t action,
+	__in_opt	const efsys_mem_t *esmp,
+	__in		uint16_t period_ms);
+#endif /* EFSYS_OPT_MAC_STATS */
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index 6abe2046e8..f002cb838e 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -106,10 +106,10 @@ static const efx_mac_ops_t	__efx_mac_medford4_ops = {
 #endif	/* EFSYS_OPT_LOOPBACK */
 #if EFSYS_OPT_MAC_STATS
 	medford4_mac_stats_get_mask,		/* emo_stats_get_mask */
-	efx_mcdi_mac_stats_clear,		/* emo_stats_clear */
-	efx_mcdi_mac_stats_upload,		/* emo_stats_upload */
-	efx_mcdi_mac_stats_periodic,		/* emo_stats_periodic */
-	ef10_mac_stats_update			/* emo_stats_update */
+	medford4_mac_stats_clear,		/* emo_stats_clear */
+	medford4_mac_stats_upload,		/* emo_stats_upload */
+	medford4_mac_stats_periodic,		/* emo_stats_periodic */
+	medford4_mac_stats_update		/* emo_stats_update */
 #endif	/* EFSYS_OPT_MAC_STATS */
 };
 #endif /* EFSYS_OPT_MEDFORD4 */
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 0bd56dd84d..20051c7da9 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2244,10 +2244,18 @@ efx_mcdi_mac_stats(
 efx_mcdi_mac_stats_clear(
 	__in		efx_nic_t *enp)
 {
+	efx_port_t *epp = &(enp->en_port);
 	efx_rc_t rc;
 
-	if ((rc = efx_mcdi_mac_stats(enp, enp->en_vport_id, NULL,
-			EFX_STATS_CLEAR, 0)) != 0)
+	if (efx_np_supported(enp) != B_FALSE) {
+		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
+			    EFX_STATS_CLEAR, NULL, 0);
+	} else {
+		rc = efx_mcdi_mac_stats(enp, enp->en_vport_id, NULL,
+				EFX_STATS_CLEAR, 0);
+	}
+
+	if (rc != 0)
 		goto fail1;
 
 	return (0);
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index d4ee17ffb4..df836f09a6 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -1291,3 +1291,92 @@ efx_np_mac_ctrl(
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
 }
+
+#if EFSYS_OPT_MAC_STATS
+	__checkReturn	efx_rc_t
+efx_np_mac_stats(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		efx_stats_action_t action,
+	__in_opt	const efsys_mem_t *esmp,
+	__in		uint16_t period_ms)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_GET_NETPORT_STATISTICS_IN_LEN,
+	    MC_CMD_GET_NETPORT_STATISTICS_OUT_LENMIN);
+	int enable = (action == EFX_STATS_ENABLE_NOEVENTS);
+	int events = (action == EFX_STATS_ENABLE_EVENTS);
+	int disable = (action == EFX_STATS_DISABLE);
+	int upload = (action == EFX_STATS_UPLOAD);
+	int clear = (action == EFX_STATS_CLEAR);
+	efx_mcdi_req_t req;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_GET_NETPORT_STATISTICS_OUT_LENMIN;
+	req.emr_in_length = MC_CMD_GET_NETPORT_STATISTICS_IN_LEN;
+	req.emr_cmd = MC_CMD_GET_NETPORT_STATISTICS;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	MCDI_IN_SET_DWORD(req, GET_NETPORT_STATISTICS_IN_PORT_HANDLE, nph);
+
+	MCDI_IN_POPULATE_DWORD_6(req, GET_NETPORT_STATISTICS_IN_CMD,
+	    GET_NETPORT_STATISTICS_IN_DMA, upload,
+	    GET_NETPORT_STATISTICS_IN_CLEAR, clear,
+	    GET_NETPORT_STATISTICS_IN_PERIODIC_CHANGE,
+		    enable | events | disable,
+	    GET_NETPORT_STATISTICS_IN_PERIODIC_ENABLE, enable | events,
+	    GET_NETPORT_STATISTICS_IN_PERIODIC_NOEVENT, !events,
+	    GET_NETPORT_STATISTICS_IN_PERIOD_MS,
+		    (enable | events) ? period_ms : 0);
+
+	if (enable || events || upload) {
+		const efx_nic_cfg_t *encp = &enp->en_nic_cfg;
+		uint32_t sz;
+
+		/* Periodic stats or stats upload require a DMA buffer */
+		if (esmp == NULL) {
+			rc = EINVAL;
+			goto fail1;
+		}
+
+		/* TODO: validate encp->enc_mac_stats_nstats */
+		sz = encp->enc_mac_stats_nstats * sizeof (efx_qword_t);
+
+		if (EFSYS_MEM_SIZE(esmp) < sz) {
+			/* DMA buffer too small */
+			rc = ENOSPC;
+			goto fail2;
+		}
+
+		MCDI_IN_SET_DWORD(req, GET_NETPORT_STATISTICS_IN_DMA_ADDR_LO,
+		    EFSYS_MEM_ADDR(esmp) & 0xffffffff);
+		MCDI_IN_SET_DWORD(req, GET_NETPORT_STATISTICS_IN_DMA_ADDR_HI,
+		    EFSYS_MEM_ADDR(esmp) >> 32);
+		MCDI_IN_SET_DWORD(req, GET_NETPORT_STATISTICS_IN_DMA_LEN, sz);
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		/* EF10: Expect ENOENT if no DMA queues are initialised */
+		if ((req.emr_rc != ENOENT) ||
+		    (enp->en_rx_qcount + enp->en_tx_qcount != 0)) {
+			rc = req.emr_rc;
+			goto fail3;
+		}
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+#endif /* EFSYS_OPT_MAC_STATS */
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index 2fbf1495d1..cc45431a81 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -63,6 +63,33 @@ medford4_mac_stats_get_mask(
 	__in			efx_nic_t *enp,
 	__inout_bcount(sz)	uint32_t *maskp,
 	__in			size_t sz);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_mac_stats_clear(
+	__in			efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_mac_stats_upload(
+	__in			efx_nic_t *enp,
+	__in			efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+medford4_mac_stats_periodic(
+	__in			efx_nic_t *enp,
+	__in			efsys_mem_t *esmp,
+	__in			uint16_t period_ms,
+	__in			boolean_t events);
+
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+medford4_mac_stats_update(
+	__in				efx_nic_t *enp,
+	__in				efsys_mem_t *esmp,
+	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stats,
+	__inout_opt			uint32_t *generationp);
 #endif /* EFSYS_OPT_MAC_STATS */
 
 #ifdef	__cplusplus
diff --git a/drivers/common/sfc_efx/base/medford4_mac.c b/drivers/common/sfc_efx/base/medford4_mac.c
index b8a5aade16..bc55604017 100644
--- a/drivers/common/sfc_efx/base/medford4_mac.c
+++ b/drivers/common/sfc_efx/base/medford4_mac.c
@@ -113,5 +113,143 @@ medford4_mac_stats_get_mask(
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
 }
+
+	__checkReturn		efx_rc_t
+medford4_mac_stats_clear(
+	__in			efx_nic_t *enp)
+{
+	efx_port_t *epp = &(enp->en_port);
+	efx_rc_t rc;
+
+	rc = efx_np_mac_stats(enp, epp->ep_np_handle, EFX_STATS_CLEAR, NULL, 0);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn		efx_rc_t
+medford4_mac_stats_upload(
+	__in			efx_nic_t *enp,
+	__in			efsys_mem_t *esmp)
+{
+	efx_port_t *epp = &(enp->en_port);
+	efx_rc_t rc;
+
+	rc = efx_np_mac_stats(enp,
+		    epp->ep_np_handle, EFX_STATS_UPLOAD, esmp, 0);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn		efx_rc_t
+medford4_mac_stats_periodic(
+	__in			efx_nic_t *enp,
+	__in			efsys_mem_t *esmp,
+	__in			uint16_t period_ms,
+	__in			boolean_t events)
+{
+	efx_port_t *epp = &(enp->en_port);
+	efx_rc_t rc;
+
+	if (period_ms == 0) {
+		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
+			    EFX_STATS_DISABLE, NULL, 0);
+	} else if (events != B_FALSE) {
+		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
+			    EFX_STATS_ENABLE_EVENTS, esmp, period_ms);
+	} else {
+		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
+			    EFX_STATS_ENABLE_NOEVENTS, esmp, period_ms);
+	}
+
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+#define	MEDFORD4_MAC_STAT_READ(_esmp, _field, _eqp)			\
+	EFSYS_MEM_READQ((_esmp), (_field) * sizeof (efx_qword_t), _eqp)
+
+	__checkReturn			efx_rc_t
+medford4_mac_stats_update(
+	__in				efx_nic_t *enp,
+	__in				efsys_mem_t *esmp,
+	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stats,
+	__inout_opt			uint32_t *generationp)
+{
+	const efx_nic_cfg_t *encp = &enp->en_nic_cfg;
+	efx_port_t *epp = &(enp->en_port);
+	efx_qword_t generation_start;
+	efx_qword_t generation_end;
+	unsigned int i;
+	efx_rc_t rc;
+
+	/* TODO: validate encp->enc_mac_stats_nstats */
+	if (EFSYS_MEM_SIZE(esmp) <
+	    (encp->enc_mac_stats_nstats * sizeof (efx_qword_t))) {
+		/* DMA buffer too small */
+		rc = ENOSPC;
+		goto fail1;
+	}
+
+	/* Read END first so we don't race with the MC */
+	EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFSYS_MEM_SIZE(esmp));
+	MEDFORD4_MAC_STAT_READ(esmp, (encp->enc_mac_stats_nstats - 1),
+	    &generation_end);
+	EFSYS_MEM_READ_BARRIER();
+
+	for (i = 0; i < EFX_ARRAY_SIZE(epp->ep_np_mac_stat_lut); ++i) {
+		efx_qword_t value;
+
+		if (epp->ep_np_mac_stat_lut[i].ens_valid == B_FALSE)
+			continue;
+
+		MEDFORD4_MAC_STAT_READ(esmp,
+		    epp->ep_np_mac_stat_lut[i].ens_dma_fld, &value);
+
+		EFSYS_STAT_SET_QWORD(&(stats[i]), &value);
+	}
+
+	/* TODO: care about VADAPTOR statistics */
+
+	/* Read START generation counter */
+	EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFSYS_MEM_SIZE(esmp));
+	EFSYS_MEM_READ_BARRIER();
+
+	/* FIXME: we never parse marker descriptors; assume start is 0 offset */
+	MEDFORD4_MAC_STAT_READ(esmp, 0, &generation_start);
+
+	/* Check that we didn't read the stats in the middle of a DMA */
+	if (memcmp(&generation_start, &generation_end,
+		    sizeof (generation_start)) != 0)
+		return (EAGAIN);
+
+	if (generationp != NULL)
+		*generationp = EFX_QWORD_FIELD(generation_start, EFX_DWORD_0);
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+#undef MEDFORD4_MAC_STAT_READ
 #endif /* EFSYS_OPT_MAC_STATS */
 #endif /* EFSYS_OPT_MEDFORD4 */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 36/46] common/sfc_efx/base: implement MAC PDU controls for Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (34 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 35/46] common/sfc_efx/base: support MAC statistics on Medford4 NICs Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 37/46] common/sfc_efx/base: correct MAC PDU calculation on Medford4 Ivan Malov
                   ` (11 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Leverage new netport MCDI to implement support for such APIs.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_impl.h      |  4 ++
 drivers/common/sfc_efx/base/efx_mac.c       |  4 +-
 drivers/common/sfc_efx/base/efx_np.c        | 17 ++++++++
 drivers/common/sfc_efx/base/medford4_impl.h | 11 ++++++
 drivers/common/sfc_efx/base/medford4_mac.c  | 44 +++++++++++++++++++++
 5 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7dbad601ff..43964ccdba 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1934,6 +1934,7 @@ efx_np_link_state(
 
 typedef struct efx_np_mac_state_s {
 	uint32_t	enms_fcntl;
+	uint32_t	enms_pdu;
 	boolean_t	enms_up;
 } efx_np_mac_state_t;
 
@@ -1956,9 +1957,12 @@ efx_np_link_ctrl(
 	__in		boolean_t fcntl_an);
 
 typedef struct efx_np_mac_ctrl_s {
+	boolean_t	enmc_set_pdu_only;
+
 	boolean_t	enmc_fcntl_autoneg;
 	boolean_t	enmc_include_fcs;
 	uint32_t	enmc_fcntl;
+	uint32_t	enmc_pdu;
 } efx_np_mac_ctrl_t;
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index f002cb838e..8712d7c5ef 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -94,8 +94,8 @@ static const efx_mac_ops_t	__efx_mac_medford4_ops = {
 	medford4_mac_poll,			/* emo_poll */
 	medford4_mac_up,			/* emo_up */
 	ef10_mac_addr_set,			/* emo_addr_set */
-	ef10_mac_pdu_set,			/* emo_pdu_set */
-	ef10_mac_pdu_get,			/* emo_pdu_get */
+	medford4_mac_pdu_set,			/* emo_pdu_set */
+	medford4_mac_pdu_get,			/* emo_pdu_get */
 	medford4_mac_reconfigure,		/* emo_reconfigure */
 	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
 	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index df836f09a6..88e13f0df9 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -816,6 +816,7 @@ efx_np_attach(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_port_t *epp = &(enp->en_port);
 	efx_np_link_state_t ls;
+	efx_np_mac_state_t ms;
 	efx_rc_t rc;
 
 	if (efx_np_supported(enp) == B_FALSE)
@@ -867,8 +868,16 @@ efx_np_attach(
 		goto fail4;
 #endif /* EFSYS_OPT_MAC_STATS */
 
+	rc = efx_np_mac_state(enp, epp->ep_np_handle, &ms);
+	if (rc != 0)
+		goto fail5;
+
+	epp->ep_mac_pdu = ms.enms_pdu;
 	return (0);
 
+fail5:
+	EFSYS_PROBE(fail5);
+
 #if EFSYS_OPT_MAC_STATS
 fail4:
 	EFSYS_PROBE(fail4);
@@ -930,6 +939,7 @@ efx_np_mac_state(
 	if (MCDI_OUT_DWORD(req, MAC_STATE_OUT_MAC_FAULT_FLAGS) == 0)
 		msp->enms_up = B_TRUE;
 
+	msp->enms_pdu = MCDI_OUT_DWORD(req, MAC_STATE_OUT_MAX_FRAME_LEN);
 	msp->enms_fcntl = MCDI_OUT_DWORD(req, MAC_STATE_OUT_FCNTL);
 	return (0);
 
@@ -1242,6 +1252,12 @@ efx_np_mac_ctrl(
 
 	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_PORT_HANDLE, nph);
 
+	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_MAX_FRAME_LEN, mc->enmc_pdu);
+	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_MAX_FRAME_LEN;
+
+	if (mc->enmc_set_pdu_only != B_FALSE)
+		goto skip_full_reconfigure;
+
 	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_INCLUDE_FCS;
 	if (mc->enmc_include_fcs != B_FALSE)
 		flags |= 1U << MC_CMD_MAC_FLAGS_FLAG_INCLUDE_FCS;
@@ -1273,6 +1289,7 @@ efx_np_mac_ctrl(
 	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_FCNTL;
 	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_FCNTL, fcntl);
 
+skip_full_reconfigure:
 	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_V2_CONTROL_FLAGS, cfg);
 
 	efx_mcdi_execute(enp, &req);
diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
index cc45431a81..b9be5e4e82 100644
--- a/drivers/common/sfc_efx/base/medford4_impl.h
+++ b/drivers/common/sfc_efx/base/medford4_impl.h
@@ -51,6 +51,17 @@ medford4_mac_up(
 	__in		efx_nic_t *enp,
 	__out		boolean_t *mac_upp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_mac_pdu_set(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+medford4_mac_pdu_get(
+	__in		efx_nic_t *enp,
+	__out		size_t *pdup);
+
 LIBEFX_INTERNAL
 extern	__checkReturn		efx_rc_t
 medford4_mac_reconfigure(
diff --git a/drivers/common/sfc_efx/base/medford4_mac.c b/drivers/common/sfc_efx/base/medford4_mac.c
index bc55604017..1390752e1e 100644
--- a/drivers/common/sfc_efx/base/medford4_mac.c
+++ b/drivers/common/sfc_efx/base/medford4_mac.c
@@ -47,6 +47,49 @@ medford4_mac_up(
 	*mac_upp = els.els_mac_up;
 	return (0);
 
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+medford4_mac_pdu_set(
+	__in		efx_nic_t *enp)
+{
+	efx_port_t *epp = &(enp->en_port);
+	efx_np_mac_ctrl_t mc = {0};
+	efx_rc_t rc;
+
+	mc.enmc_set_pdu_only = B_TRUE;
+	mc.enmc_pdu = epp->ep_mac_pdu;
+
+	rc = efx_np_mac_ctrl(enp, epp->ep_np_handle, &mc);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+medford4_mac_pdu_get(
+	__in		efx_nic_t *enp,
+	__out		size_t *pdup)
+{
+	efx_port_t *epp = &(enp->en_port);
+	efx_np_mac_state_t ms;
+	efx_rc_t rc;
+
+	rc = efx_np_mac_state(enp, epp->ep_np_handle, &ms);
+	if (rc != 0)
+		goto fail1;
+
+	*pdup = ms.enms_pdu;
+	return (0);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 	return (rc);
@@ -63,6 +106,7 @@ medford4_mac_reconfigure(
 	mc.enmc_fcntl_autoneg = epp->ep_fcntl_autoneg;
 	mc.enmc_include_fcs = epp->ep_include_fcs;
 	mc.enmc_fcntl = epp->ep_fcntl;
+	mc.enmc_pdu = epp->ep_mac_pdu;
 
 	rc = efx_np_mac_ctrl(enp, epp->ep_np_handle, &mc);
 	if (rc != 0)
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 37/46] common/sfc_efx/base: correct MAC PDU calculation on Medford4
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (35 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 36/46] common/sfc_efx/base: implement MAC PDU controls for Medford4 Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 38/46] net/sfc: make use of generic EFX MAC PDU calculation helpers Ivan Malov
                   ` (10 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

For managing MAC PDU (max. frame size), client drivers apply
EFX macros to switch between PDU and SDU forms. These macros
include a workaround for a bug that dates back to Siena NICs.

Starting with Medford4, the bug is no longer there and it is
wrong to use the macros, so provide users with a replacement.
The new APIs will either include the said workaround or omit
it, depending on whether support for netport MCDI is present.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx.h         | 25 +++++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_mac.c     | 19 +++++++++++++++--
 drivers/common/sfc_efx/base/efx_nic.c     |  3 +++
 drivers/common/sfc_efx/sfc_base_symbols.c |  1 +
 4 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 6ca108cffe..73dc38f84e 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -668,24 +668,45 @@ typedef enum efx_link_mode_e {
 
 #define	EFX_MAC_SDU_MAX	9202
 
+/*
+ * NOTE: the PDU macros implement an obsolete workaround that is needed for
+ * MC_CMD_SET_MAC; do not use the PDU macros for the netport MCDI commands,
+ * which do not use the workaround.
+ */
+
 #define	EFX_MAC_PDU_ADJUSTMENT					\
 	(/* EtherII */ 14					\
 	    + /* VLAN */ 4					\
 	    + /* CRC */ 4					\
 	    + /* bug16011 */ 16)				\
 
+/* NOTE: this macro is deprecated; use efx_mac_pdu_from_sdu(). */
 #define	EFX_MAC_PDU(_sdu)					\
 	EFX_P2ROUNDUP(size_t, (_sdu) + EFX_MAC_PDU_ADJUSTMENT, 8)
 
 /*
  * Due to the EFX_P2ROUNDUP in EFX_MAC_PDU(), EFX_MAC_SDU_FROM_PDU() may give
  * the SDU rounded up slightly.
+ *
+ * NOTE: do not use this macro in new code as it is
+ * incorrect for the netport MCDI commands.
  */
 #define	EFX_MAC_SDU_FROM_PDU(_pdu)	((_pdu) - EFX_MAC_PDU_ADJUSTMENT)
 
 #define	EFX_MAC_PDU_MIN	60
+
+/* NOTE: this macro is deprecated; use encp->enc_mac_pdu_max. */
 #define	EFX_MAC_PDU_MAX	EFX_MAC_PDU(EFX_MAC_SDU_MAX)
 
+/*
+ * For use with efx_mac_pdu_set(), convert the given SDU value to its PDU form.
+ */
+LIBEFX_API
+extern			size_t
+efx_mac_pdu_from_sdu(
+	__in		efx_nic_t *enp,
+	__in		size_t sdu);
+
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_mac_pdu_get(
@@ -1729,6 +1750,10 @@ typedef struct efx_nic_cfg_s {
 	efx_nic_dma_mapping_t	enc_dma_mapping;
 	/* Physical ports shared by PFs */
 	efx_port_usage_t	enc_port_usage;
+	/* Minimum MAC PDU value to use with efx_mac_pdu_set() */
+	uint32_t		enc_mac_pdu_min;
+	/* Maximum MAC PDU value to use with efx_mac_pdu_set() */
+	uint32_t		enc_mac_pdu_max;
 } efx_nic_cfg_t;
 
 #define	EFX_PCI_VF_INVALID 0xffff
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index 8712d7c5ef..606164bcf9 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -114,6 +114,20 @@ static const efx_mac_ops_t	__efx_mac_medford4_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD4 */
 
+			size_t
+efx_mac_pdu_from_sdu(
+	__in		efx_nic_t *enp,
+	__in		size_t sdu)
+{
+	if (efx_np_supported(enp) != B_FALSE) {
+		/* PDU size for netport MCDI capable adaptors. */
+		return sdu + 14 /* ETH */ + 4 /* VLAN */ + 4 /* FCS */;
+	} else {
+		/* PDU size for legacy MC_CMD_SET_MAC command. */
+		return EFX_MAC_PDU(sdu);
+	}
+}
+
 	__checkReturn			efx_rc_t
 efx_mac_pdu_set(
 	__in				efx_nic_t *enp,
@@ -121,6 +135,7 @@ efx_mac_pdu_set(
 {
 	efx_port_t *epp = &(enp->en_port);
 	const efx_mac_ops_t *emop = epp->ep_emop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	uint32_t old_pdu;
 	efx_rc_t rc;
 
@@ -128,12 +143,12 @@ efx_mac_pdu_set(
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT);
 	EFSYS_ASSERT(emop != NULL);
 
-	if (pdu < EFX_MAC_PDU_MIN) {
+	if (pdu < encp->enc_mac_pdu_min) {
 		rc = EINVAL;
 		goto fail1;
 	}
 
-	if (pdu > EFX_MAC_PDU_MAX) {
+	if (pdu > encp->enc_mac_pdu_max) {
 		rc = EINVAL;
 		goto fail2;
 	}
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 1ec684da40..1c25270792 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -491,6 +491,9 @@ efx_nic_probe(
 
 	encp->enc_features = enp->en_features;
 
+	encp->enc_mac_pdu_max = efx_mac_pdu_from_sdu(enp, EFX_MAC_SDU_MAX);
+	encp->enc_mac_pdu_min = EFX_MAC_PDU_MIN;
+
 	if ((rc = efx_phy_probe(enp)) != 0)
 		goto fail2;
 
diff --git a/drivers/common/sfc_efx/sfc_base_symbols.c b/drivers/common/sfc_efx/sfc_base_symbols.c
index ae6605632d..0e74034031 100644
--- a/drivers/common/sfc_efx/sfc_base_symbols.c
+++ b/drivers/common/sfc_efx/sfc_base_symbols.c
@@ -59,6 +59,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(efx_intr_trigger)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_intr_status_line)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_intr_status_message)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_intr_fatal)
+RTE_EXPORT_INTERNAL_SYMBOL(efx_mac_pdu_from_sdu)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_mac_pdu_set)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_mac_pdu_get)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_mac_addr_set)
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 38/46] net/sfc: make use of generic EFX MAC PDU calculation helpers
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (36 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 37/46] common/sfc_efx/base: correct MAC PDU calculation on Medford4 Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 39/46] common/sfc_efx/base: ignore legacy link events on new boards Ivan Malov
                   ` (9 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

To make sure that MAC PDU values do not come with legacy bug
workaround baked in when running on newer Medford4 NICs, use
generic replacement APIs from EFX in place of MAC PDU macros.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/net/sfc/sfc_dp_tx.h   |  3 +++
 drivers/net/sfc/sfc_ef10_tx.c | 13 ++++++++-----
 drivers/net/sfc/sfc_ethdev.c  | 17 ++++++++++-------
 drivers/net/sfc/sfc_port.c    |  2 +-
 drivers/net/sfc/sfc_repr.c    |  7 ++++++-
 drivers/net/sfc/sfc_repr.h    |  1 +
 drivers/net/sfc/sfc_tx.c      |  2 ++
 7 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/drivers/net/sfc/sfc_dp_tx.h b/drivers/net/sfc/sfc_dp_tx.h
index aad3b06595..0baf8c7dd6 100644
--- a/drivers/net/sfc/sfc_dp_tx.h
+++ b/drivers/net/sfc/sfc_dp_tx.h
@@ -84,6 +84,9 @@ struct sfc_dp_tx_qcreate_info {
 
 	/** NIC's DMA mapping information */
 	const struct sfc_nic_dma_info	*nic_dma_info;
+
+	/** Maximum MAC PDU (frame size) */
+	unsigned int		max_pdu;
 };
 
 /**
diff --git a/drivers/net/sfc/sfc_ef10_tx.c b/drivers/net/sfc/sfc_ef10_tx.c
index 116229382b..5543dc495f 100644
--- a/drivers/net/sfc/sfc_ef10_tx.c
+++ b/drivers/net/sfc/sfc_ef10_tx.c
@@ -65,6 +65,7 @@ struct sfc_ef10_txq {
 	unsigned int			max_fill_level;
 	unsigned int			free_thresh;
 	unsigned int			evq_read_ptr;
+	unsigned int			max_pdu;
 	struct sfc_ef10_tx_sw_desc	*sw_ring;
 	efx_qword_t			*txq_hw_ring;
 	volatile void			*doorbell;
@@ -252,7 +253,7 @@ sfc_ef10_tx_qpush(struct sfc_ef10_txq *txq, unsigned int added,
 }
 
 static unsigned int
-sfc_ef10_tx_pkt_descs_max(const struct rte_mbuf *m)
+sfc_ef10_tx_pkt_descs_max(const struct rte_mbuf *m, unsigned int max_pdu)
 {
 	unsigned int extra_descs_per_seg;
 	unsigned int extra_descs_per_pkt;
@@ -290,8 +291,7 @@ sfc_ef10_tx_pkt_descs_max(const struct rte_mbuf *m)
 	 * maximum PDU size.
 	 */
 	extra_descs_per_pkt =
-		(RTE_MIN((unsigned int)EFX_MAC_PDU_MAX,
-			 SFC_MBUF_PKT_LEN_MAX) - 1) /
+		(RTE_MIN(max_pdu, SFC_MBUF_PKT_LEN_MAX) - 1) /
 		SFC_EF10_TX_DMA_DESC_LEN_MAX;
 
 	return m->nb_segs + RTE_MIN(m->nb_segs * extra_descs_per_seg,
@@ -672,7 +672,8 @@ sfc_ef10_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 			goto dma_desc_space_update;
 		}
 
-		if (sfc_ef10_tx_pkt_descs_max(m_seg) > dma_desc_space) {
+		if (sfc_ef10_tx_pkt_descs_max(m_seg, txq->max_pdu) >
+		    dma_desc_space) {
 			if (reap_done)
 				break;
 
@@ -686,7 +687,8 @@ sfc_ef10_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 			reap_done = true;
 			dma_desc_space = txq->max_fill_level -
 				(added - txq->completed);
-			if (sfc_ef10_tx_pkt_descs_max(m_seg) > dma_desc_space)
+			if (sfc_ef10_tx_pkt_descs_max(m_seg, txq->max_pdu) >
+			    dma_desc_space)
 				break;
 		}
 
@@ -986,6 +988,7 @@ sfc_ef10_tx_qcreate(uint16_t port_id, uint16_t queue_id,
 			(info->hw_index << info->vi_window_shift);
 	txq->evq_hw_ring = info->evq_hw_ring;
 	txq->tso_tcp_header_offset_limit = info->tso_tcp_header_offset_limit;
+	txq->max_pdu = info->max_pdu;
 
 	sfc_ef10_tx_info(&txq->dp.dpq, "TxQ doorbell is %p", txq->doorbell);
 
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 05194918f9..bd0061f557 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -90,6 +90,7 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	struct sfc_rss *rss = &sas->rss;
 	struct sfc_mae *mae = &sa->mae;
 
@@ -98,7 +99,7 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->min_mtu = RTE_ETHER_MIN_MTU;
 	dev_info->max_mtu = EFX_MAC_SDU_MAX;
 
-	dev_info->max_rx_pktlen = EFX_MAC_PDU_MAX;
+	dev_info->max_rx_pktlen = encp->enc_mac_pdu_max;
 
 	dev_info->max_vfs = sa->sriov.num_vfs;
 
@@ -1112,23 +1113,24 @@ static int
 sfc_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
 	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
-	size_t pdu = EFX_MAC_PDU(mtu);
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
+	size_t pdu = efx_mac_pdu_from_sdu(sa->nic, mtu);
 	size_t old_pdu;
 	int rc;
 
 	sfc_log_init(sa, "mtu=%u", mtu);
 
 	rc = EINVAL;
-	if (pdu < EFX_MAC_PDU_MIN) {
+	if (pdu < encp->enc_mac_pdu_min) {
 		sfc_err(sa, "too small MTU %u (PDU size %u less than min %u)",
 			(unsigned int)mtu, (unsigned int)pdu,
-			EFX_MAC_PDU_MIN);
+			encp->enc_mac_pdu_min);
 		goto fail_inval;
 	}
-	if (pdu > EFX_MAC_PDU_MAX) {
+	if (pdu > encp->enc_mac_pdu_max) {
 		sfc_err(sa, "too big MTU %u (PDU size %u greater than max %u)",
 			(unsigned int)mtu, (unsigned int)pdu,
-			(unsigned int)EFX_MAC_PDU_MAX);
+			encp->enc_mac_pdu_max);
 		goto fail_inval;
 	}
 
@@ -3378,6 +3380,7 @@ sfc_eth_dev_create_repr(struct sfc_adapter *sa,
 			uint16_t repr_port,
 			enum rte_eth_representor_type type)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	struct sfc_repr_entity_info entity;
 	efx_mport_sel_t mport_sel;
 	int rc;
@@ -3414,7 +3417,7 @@ sfc_eth_dev_create_repr(struct sfc_adapter *sa,
 	entity.vf = repr_port;
 
 	rc = sfc_repr_create(sa->eth_dev, &entity, sa->mae.switch_domain_id,
-			     &mport_sel);
+			     encp->enc_mac_pdu_max, &mport_sel);
 	if (rc != 0) {
 		sfc_err(sa,
 			"failed to create representor for controller %u port %u repr_port %u: %s",
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index e5bb6d8620..5e80003ca1 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -391,7 +391,7 @@ sfc_port_configure(struct sfc_adapter *sa)
 
 	sfc_log_init(sa, "entry");
 
-	port->pdu = EFX_MAC_PDU(dev_data->mtu);
+	port->pdu = efx_mac_pdu_from_sdu(sa->nic, dev_data->mtu);
 
 	if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC)
 		port->include_fcs = true;
diff --git a/drivers/net/sfc/sfc_repr.c b/drivers/net/sfc/sfc_repr.c
index 2c1421b959..18e76fa7da 100644
--- a/drivers/net/sfc/sfc_repr.c
+++ b/drivers/net/sfc/sfc_repr.c
@@ -32,6 +32,7 @@ struct sfc_repr_shared {
 	uint16_t		repr_id;
 	uint16_t		switch_domain_id;
 	uint16_t		switch_port_id;
+	unsigned int		max_pdu;
 };
 
 struct sfc_repr_queue_stats {
@@ -514,7 +515,7 @@ sfc_repr_dev_infos_get(struct rte_eth_dev *dev,
 
 	dev_info->device = dev->device;
 
-	dev_info->max_rx_pktlen = EFX_MAC_PDU_MAX;
+	dev_info->max_rx_pktlen = srs->max_pdu;
 	dev_info->max_rx_queues = SFC_REPR_RXQ_MAX;
 	dev_info->max_tx_queues = SFC_REPR_TXQ_MAX;
 	dev_info->default_rxconf.rx_drop_en = 1;
@@ -920,6 +921,7 @@ struct sfc_repr_init_data {
 	efx_pcie_interface_t	intf;
 	uint16_t		pf;
 	uint16_t		vf;
+	unsigned int		max_pdu;
 };
 
 static int
@@ -1012,6 +1014,7 @@ sfc_repr_eth_dev_init(struct rte_eth_dev *dev, void *init_params)
 	srs->pf_port_id = repr_data->pf_port_id;
 	srs->repr_id = srs->switch_port_id;
 	srs->switch_domain_id = repr_data->switch_domain_id;
+	srs->max_pdu = repr_data->max_pdu;
 
 	dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
 	dev->data->representor_id = srs->repr_id;
@@ -1062,6 +1065,7 @@ int
 sfc_repr_create(struct rte_eth_dev *parent,
 		struct sfc_repr_entity_info *entity,
 		uint16_t switch_domain_id,
+		unsigned int max_pdu,
 		const efx_mport_sel_t *mport_sel)
 {
 	struct sfc_repr_init_data repr_data;
@@ -1108,6 +1112,7 @@ sfc_repr_create(struct rte_eth_dev *parent,
 		repr_data.intf = entity->intf;
 		repr_data.pf = entity->pf;
 		repr_data.vf = entity->vf;
+		repr_data.max_pdu = max_pdu;
 
 		ret = rte_eth_dev_create(parent->device, name,
 					 sizeof(struct sfc_repr_shared),
diff --git a/drivers/net/sfc/sfc_repr.h b/drivers/net/sfc/sfc_repr.h
index 2093973761..01f5947a84 100644
--- a/drivers/net/sfc/sfc_repr.h
+++ b/drivers/net/sfc/sfc_repr.h
@@ -36,6 +36,7 @@ struct sfc_repr_entity_info {
 int sfc_repr_create(struct rte_eth_dev *parent,
 		    struct sfc_repr_entity_info *entity,
 		    uint16_t switch_domain_id,
+		    unsigned int max_pdu,
 		    const efx_mport_sel_t *mport_sel);
 
 #ifdef __cplusplus
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index f376f24f7b..ebc0a8235b 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -228,6 +228,8 @@ sfc_tx_qinit(struct sfc_adapter *sa, sfc_sw_index_t sw_index,
 
 	info.nic_dma_info = &sas->nic_dma_info;
 
+	info.max_pdu = encp->enc_mac_pdu_max;
+
 	rc = sa->priv.dp_tx->qcreate(sa->eth_dev->data->port_id, sw_index,
 				     &RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
 				     socket_id, &info, &txq_info->dp);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 39/46] common/sfc_efx/base: ignore legacy link events on new boards
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (37 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 38/46] net/sfc: make use of generic EFX MAC PDU calculation helpers Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 40/46] common/sfc_efx/base: add link event processing " Ivan Malov
                   ` (8 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

New adaptors (for instance, Medford4) come with netport MCDI
and also support new link change events, however, older ones
can also be generated. For consistency, ignore legacy events.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 011ef49de7..82a2284f2b 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -907,6 +907,16 @@ ef10_ev_mcdi(
 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */
 
 	case MCDI_EVENT_CODE_LINKCHANGE_V2:
+		if (efx_np_supported(enp) != B_FALSE) {
+			/*
+			 * Netport MCDI capable NICs support new link change
+			 * events, but legacy LINKCHANGE_V2 events may still
+			 * show up should the firmware support them. For the
+			 * sake of consistency, ignore LINKCHANGE_V2 events.
+			 */
+			break;
+		}
+
 		ev_is_v2 = B_TRUE;
 		/* Fallthrough */
 	case MCDI_EVENT_CODE_LINKCHANGE: {
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 40/46] common/sfc_efx/base: add link event processing on new boards
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (38 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 39/46] common/sfc_efx/base: ignore legacy link events on new boards Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 41/46] net/sfc: query link status on link change events on new NICs Ivan Malov
                   ` (7 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Link change events on netport MCDI capable NICs do not carry
any specifics of the new link state. Such need to be queried
separately. Add processing of the events, with an indication
to the client driver telling it to collect the status itself.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c | 29 +++++++++++++++++++++++++++
 drivers/common/sfc_efx/base/efx.h     |  6 ++++++
 drivers/common/sfc_efx/base/efx_nic.c |  5 +++++
 3 files changed, 40 insertions(+)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 82a2284f2b..a97c1bf43e 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -866,6 +866,7 @@ ef10_ev_mcdi(
 	__in_opt	void *arg)
 {
 	efx_nic_t *enp = eep->ee_enp;
+	efx_port_t *epp = &(enp->en_port);
 	unsigned int code;
 	boolean_t should_abort = B_FALSE;
 	boolean_t ev_is_v2 = B_FALSE;
@@ -906,6 +907,34 @@ ef10_ev_mcdi(
 		break;
 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */
 
+	case MCDI_EVENT_CODE_PORT_LINKCHANGE:
+		/*
+		 * These events are generated on netport MCDI capable
+		 * boards. They supersede legacy LINKCHANGE_V2 events.
+		 */
+		if (MCDI_EV_FIELD(eqp, PORT_LINKCHANGE_PORT_HANDLE) ==
+		    epp->ep_np_handle) {
+			efx_link_mode_t mode;
+
+			if (MCDI_EV_FIELD(eqp, PORT_LINKCHANGE_LINK_UP) == 1)
+				mode = EFX_LINK_UNKNOWN;
+			else
+				mode = EFX_LINK_DOWN;
+
+			/*
+			 * The event does not contain full link state details.
+			 *
+			 * Either notify the client driver with a dummy link
+			 * mode value (UNKNOWN), just to say the link is up,
+			 * or, in case the link is not up, pass DOWN value.
+			 *
+			 * The client driver will need to poll for link state
+			 * in order to get full details like speed and duplex.
+			 */
+			should_abort = eecp->eec_link_change(arg, mode);
+		}
+		break;
+
 	case MCDI_EVENT_CODE_LINKCHANGE_V2:
 		if (efx_np_supported(enp) != B_FALSE) {
 			/*
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 73dc38f84e..7b43a89551 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1754,6 +1754,12 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_mac_pdu_min;
 	/* Maximum MAC PDU value to use with efx_mac_pdu_set() */
 	uint32_t		enc_mac_pdu_max;
+	/*
+	 * When true, the link mode value passed from eec_link_change() is
+	 * either UNKNOWN (merely saying the link is up) or DOWN. In order
+	 * to have exact speed/duplex, efx_port_poll() needs to be invoked.
+	 */
+	boolean_t		enc_link_ev_need_poll;
 } efx_nic_cfg_t;
 
 #define	EFX_PCI_VF_INVALID 0xffff
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 1c25270792..ab2bb1c160 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -494,6 +494,11 @@ efx_nic_probe(
 	encp->enc_mac_pdu_max = efx_mac_pdu_from_sdu(enp, EFX_MAC_SDU_MAX);
 	encp->enc_mac_pdu_min = EFX_MAC_PDU_MIN;
 
+	if (efx_np_supported(enp) == B_FALSE)
+		encp->enc_link_ev_need_poll = B_FALSE;
+	else
+		encp->enc_link_ev_need_poll = B_TRUE;
+
 	if ((rc = efx_phy_probe(enp)) != 0)
 		goto fail2;
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 41/46] net/sfc: query link status on link change events on new NICs
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (39 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 40/46] common/sfc_efx/base: add link event processing " Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 42/46] common/sfc_efx/base: subscribe to netport link change events Ivan Malov
                   ` (6 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Link events signaled on new adaptors (Medford4 and later) do
not carry any specifics, so query the link status separately.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/net/sfc/sfc.h        |  2 ++
 drivers/net/sfc/sfc_ethdev.c |  2 ++
 drivers/net/sfc/sfc_ev.c     | 51 +++++++++++++++++++++++++++++++++++-
 3 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 2432a2307e..819ce52529 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -309,6 +309,8 @@ struct sfc_adapter {
 	uint32_t			rxd_wait_timeout_ns;
 
 	bool				switchdev;
+
+	bool				link_ev_need_poll;
 };
 
 static inline struct sfc_adapter_shared *
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index bd0061f557..05933b1d39 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -3252,6 +3252,8 @@ sfc_eth_dev_init(struct rte_eth_dev *dev, void *init_params)
 	if (rc != 0)
 		goto fail_nic_dma_attach;
 
+	sa->link_ev_need_poll = encp->enc_link_ev_need_poll;
+
 	sfc_adapter_unlock(sa);
 
 	sfc_log_init(sa, "done");
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index c0d58c9554..1d1ee0671f 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -467,9 +467,58 @@ sfc_ev_link_change(void *arg, efx_link_mode_t link_mode)
 {
 	struct sfc_evq *evq = arg;
 	struct sfc_adapter *sa = evq->sa;
-	struct rte_eth_link new_link;
+	struct rte_eth_link new_link = {0};
 
+	if (sa->link_ev_need_poll) {
+		efx_link_mode_t new_mode;
+		bool poll_done = false;
+
+		/*
+		 * The event provides only the general status. When the link is
+		 * up, poll the port to get the speed, but it is not compulsory.
+		 */
+		if (link_mode != EFX_LINK_DOWN) {
+			int ret = 0;
+
+			if (sfc_adapter_trylock(sa)) {
+				/* Never poll when the adaptor is going down. */
+				if (sa->state == SFC_ETHDEV_STARTED) {
+					ret = efx_port_poll(sa->nic, &new_mode);
+					poll_done = true;
+				}
+
+				sfc_adapter_unlock(sa);
+			}
+
+			if (ret != 0) {
+				sfc_warn(sa, "port poll failed on link event");
+				poll_done = false;
+			}
+		}
+
+		if (poll_done) {
+			link_mode = new_mode;
+			goto decode_comprehensive;
+		}
+
+		new_link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
+		new_link.link_autoneg = RTE_ETH_LINK_AUTONEG;
+
+		if (link_mode == EFX_LINK_DOWN) {
+			new_link.link_speed  = RTE_ETH_SPEED_NUM_NONE;
+			new_link.link_status = RTE_ETH_LINK_DOWN;
+		} else {
+			new_link.link_speed  = RTE_ETH_SPEED_NUM_UNKNOWN;
+			new_link.link_status = RTE_ETH_LINK_UP;
+		}
+
+		goto set;
+	}
+
+decode_comprehensive:
 	sfc_port_link_mode_to_info(link_mode, &new_link);
+
+set:
 	if (rte_eth_linkstatus_set(sa->eth_dev, &new_link) == 0)
 		evq->sa->port.lsc_seq++;
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 42/46] common/sfc_efx/base: subscribe to netport link change events
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (40 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 41/46] net/sfc: query link status on link change events on new NICs Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 43/46] net/sfc: offer support for 200G link ability on new adaptors Ivan Malov
                   ` (5 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Subscribe to the new link events on netport MCDI attach path.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/efx_np.c | 56 ++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 88e13f0df9..73b022ac21 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -809,6 +809,48 @@ efx_np_stats_assign(
 }
 #endif /* EFSYS_OPT_MAC_STATS */
 
+static	__checkReturn	efx_rc_t
+efx_np_set_event_mask(
+	__in		efx_nic_t *enp,
+	__in		efx_np_handle_t nph,
+	__in		boolean_t want_linkchange_events)
+{
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_SET_NETPORT_EVENTS_MASK_IN_LEN,
+	    MC_CMD_SET_NETPORT_EVENTS_MASK_OUT_LEN);
+	efx_mcdi_req_t req;
+	efx_dword_t dword;
+	efx_rc_t rc;
+
+	req.emr_out_length = MC_CMD_SET_NETPORT_EVENTS_MASK_OUT_LEN;
+	req.emr_in_length = MC_CMD_SET_NETPORT_EVENTS_MASK_IN_LEN;
+	req.emr_cmd = MC_CMD_SET_NETPORT_EVENTS_MASK;
+	req.emr_out_buf = payload;
+	req.emr_in_buf = payload;
+
+	EFX_ZERO_DWORD(dword);
+
+	if (want_linkchange_events != B_FALSE)
+		EFX_SET_DWORD_BIT(dword, EVENT_MASK_PORT_LINKCHANGE);
+
+	MCDI_IN_SET_DWORD(req, SET_NETPORT_EVENTS_MASK_IN_PORT_HANDLE, nph);
+	MCDI_IN_SET_DWORD(req, SET_NETPORT_EVENTS_MASK_IN_EVENT_MASK,
+	    dword.ed_u32[0]);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
 	__checkReturn	efx_rc_t
 efx_np_attach(
 	__in		efx_nic_t *enp)
@@ -873,8 +915,17 @@ efx_np_attach(
 		goto fail5;
 
 	epp->ep_mac_pdu = ms.enms_pdu;
+
+	/* Subscribe to link change events. */
+	rc = efx_np_set_event_mask(enp, epp->ep_np_handle, B_TRUE);
+	if (rc != 0)
+		goto fail6;
+
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
+
 fail5:
 	EFSYS_PROBE(fail5);
 
@@ -898,8 +949,13 @@ efx_np_attach(
 efx_np_detach(
 	__in	efx_nic_t *enp)
 {
+	efx_port_t *epp = &(enp->en_port);
+
 	if (efx_np_supported(enp) == B_FALSE)
 		return;
+
+	/* Unsubscribe from link change events. */
+	(void) efx_np_set_event_mask(enp, epp->ep_np_handle, B_FALSE);
 }
 
 	__checkReturn	efx_rc_t
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 43/46] net/sfc: offer support for 200G link ability on new adaptors
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (41 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 42/46] common/sfc_efx/base: subscribe to netport link change events Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 44/46] common/sfc_efx/base: support controls for netport lane count Ivan Malov
                   ` (4 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

New adaptors (for instance, Medford4) can support 200G speed.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/net/sfc/sfc.c        |  5 ++++-
 drivers/net/sfc/sfc_ethdev.c | 15 +++++++++++++++
 drivers/net/sfc/sfc_port.c   |  6 ++++++
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 938c967430..69747e49ae 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -126,7 +126,8 @@ sfc_phy_cap_from_link_speeds(uint32_t speeds)
 				(1 << EFX_PHY_CAP_25000FDX) |
 				(1 << EFX_PHY_CAP_40000FDX) |
 				(1 << EFX_PHY_CAP_50000FDX) |
-				(1 << EFX_PHY_CAP_100000FDX);
+				(1 << EFX_PHY_CAP_100000FDX) |
+				(1 << EFX_PHY_CAP_200000FDX);
 	}
 	if (speeds & RTE_ETH_LINK_SPEED_1G)
 		phy_caps |= (1 << EFX_PHY_CAP_1000FDX);
@@ -140,6 +141,8 @@ sfc_phy_cap_from_link_speeds(uint32_t speeds)
 		phy_caps |= (1 << EFX_PHY_CAP_50000FDX);
 	if (speeds & RTE_ETH_LINK_SPEED_100G)
 		phy_caps |= (1 << EFX_PHY_CAP_100000FDX);
+	if (speeds & RTE_ETH_LINK_SPEED_200G)
+		phy_caps |= (1 << EFX_PHY_CAP_200000FDX);
 
 	return phy_caps;
 }
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 05933b1d39..80eb39e58d 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -117,6 +117,8 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		dev_info->speed_capa |= RTE_ETH_LINK_SPEED_50G;
 	if (sa->port.phy_adv_cap_mask & (1u << EFX_PHY_CAP_100000FDX))
 		dev_info->speed_capa |= RTE_ETH_LINK_SPEED_100G;
+	if (sa->port.phy_adv_cap_mask & (1u << EFX_PHY_CAP_200000FDX))
+		dev_info->speed_capa |= RTE_ETH_LINK_SPEED_200G;
 
 	dev_info->max_rx_queues = sa->rxq_max;
 	dev_info->max_tx_queues = sa->txq_max;
@@ -2442,6 +2444,19 @@ sfc_fec_get_capa_speed_to_fec(uint32_t supported_caps,
 		}
 		num++;
 	}
+	if (supported_caps & (1u << EFX_PHY_CAP_200000FDX)) {
+		if (speed_fec_capa != NULL) {
+			speed_fec_capa[num].speed = RTE_ETH_SPEED_NUM_200G;
+			speed_fec_capa[num].capa =
+				RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) |
+				RTE_ETH_FEC_MODE_CAPA_MASK(AUTO);
+			if (rs) {
+				speed_fec_capa[num].capa |=
+					RTE_ETH_FEC_MODE_CAPA_MASK(RS);
+			}
+		}
+		num++;
+	}
 
 	return num;
 }
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index 5e80003ca1..0a31a394d5 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -144,6 +144,8 @@ sfc_port_init_dev_link(struct sfc_adapter *sa)
 static efx_link_mode_t
 sfc_port_phy_caps_to_max_link_speed(uint32_t phy_caps)
 {
+	if (phy_caps & (1u << EFX_PHY_CAP_200000FDX))
+		return EFX_LINK_200000FDX;
 	if (phy_caps & (1u << EFX_PHY_CAP_100000FDX))
 		return EFX_LINK_100000FDX;
 	if (phy_caps & (1u << EFX_PHY_CAP_50000FDX))
@@ -649,6 +651,10 @@ sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
 		link_info->link_speed  = RTE_ETH_SPEED_NUM_100G;
 		link_info->link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
 		break;
+	case EFX_LINK_200000FDX:
+		link_info->link_speed  = RTE_ETH_SPEED_NUM_200G;
+		link_info->link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
+		break;
 	default:
 		SFC_ASSERT(B_FALSE);
 		/* FALLTHROUGH */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 44/46] common/sfc_efx/base: support controls for netport lane count
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (42 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 43/46] net/sfc: offer support for 200G link ability on new adaptors Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-17  7:57   ` Andrew Rybchenko
  2025-04-16 14:00 ` [PATCH 45/46] net/sfc: add support for control of physical port " Ivan Malov
                   ` (3 subsequent siblings)
  47 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On netport MCDI capable adaptors, link modes exported by libefx can be
backed by different technologies with different lane counts. Allow the
client drivers to get and set the lane count and query possible values.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/common/sfc_efx/base/ef10_phy.c     |   2 +
 drivers/common/sfc_efx/base/efx.h          |  29 ++++
 drivers/common/sfc_efx/base/efx_impl.h     |   4 +
 drivers/common/sfc_efx/base/efx_np.c       | 192 +++++++++++++++++++--
 drivers/common/sfc_efx/base/efx_phy.c      |  62 ++++++-
 drivers/common/sfc_efx/base/efx_port.c     |   1 +
 drivers/common/sfc_efx/base/medford4_phy.c |   5 +-
 drivers/common/sfc_efx/sfc_base_symbols.c  |   1 +
 8 files changed, 280 insertions(+), 16 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index 114543e156..aaad105735 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -338,6 +338,8 @@ ef10_phy_get_link(
 			    fec, &elsp->epls.epls_link_mode,
 			    &elsp->epls.epls_fcntl, &elsp->epls.epls_fec);
 
+	elsp->epls.epls_lane_count = EFX_PHY_LANE_COUNT_DEFAULT;
+
 	if (req.emr_out_length_used < MC_CMD_GET_LINK_OUT_V2_LEN) {
 		elsp->epls.epls_ld_cap_mask = 0;
 	} else {
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 7b43a89551..8958f1b170 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1266,6 +1266,28 @@ efx_phy_lp_cap_get(
 	__in		efx_nic_t *enp,
 	__out		uint32_t *maskp);
 
+typedef enum efx_phy_lane_count_e {
+	EFX_PHY_LANE_COUNT_DEFAULT = 0,
+	EFX_PHY_LANE_COUNT_1 = 1,
+	EFX_PHY_LANE_COUNT_2 = 2,
+	EFX_PHY_LANE_COUNT_4 = 4,
+	EFX_PHY_LANE_COUNT_10 = 10,
+	EFX_PHY_LANE_COUNT_NTYPES,
+} efx_phy_lane_count_t;
+
+/*
+ * Instruct the port to use the specified lane count. For this to work, the
+ * active subset of advertised link modes must include at least one mode that
+ * supports this value. This API works only on netport MCDI capable adaptors.
+ *
+ * To query the current lane count, use efx_phy_link_state_get().
+ */
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_phy_lane_count_set(
+	__in		efx_nic_t *enp,
+	__in		efx_phy_lane_count_t lane_count);
+
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_phy_oui_get(
@@ -1760,6 +1782,12 @@ typedef struct efx_nic_cfg_s {
 	 * to have exact speed/duplex, efx_port_poll() needs to be invoked.
 	 */
 	boolean_t		enc_link_ev_need_poll;
+	/*
+	 * An array of masks to tell which link mode supports which lane counts.
+	 * For bit definitions, see 'efx_phy_lane_count_t'. It is only filled in
+	 * on netport MCDI capable adaptors.
+	 */
+	efx_dword_t		enc_phy_lane_counts[EFX_LINK_NMODES];
 } efx_nic_cfg_t;
 
 #define	EFX_PCI_VF_INVALID 0xffff
@@ -4072,6 +4100,7 @@ typedef struct efx_phy_link_state_s {
 	unsigned int		epls_fcntl;
 	efx_phy_fec_type_t	epls_fec;
 	efx_link_mode_t		epls_link_mode;
+	efx_phy_lane_count_t	epls_lane_count;
 } efx_phy_link_state_t;
 
 LIBEFX_API
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 43964ccdba..69268546d2 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -396,6 +396,8 @@ typedef struct efx_port_s {
 	uint8_t			ep_np_cap_data_raw[MC_CMD_ETH_AN_FIELDS_LEN];
 	/* Lookup table providing DMA buffer field IDs by EFX statistic IDs. */
 	efx_np_stat_t		ep_np_mac_stat_lut[EFX_MAC_NSTATS];
+	/* Client-requested lane count for the physical link. */
+	efx_phy_lane_count_t	ep_np_lane_count_req;
 } efx_port_t;
 
 typedef struct efx_mon_ops_s {
@@ -1916,6 +1918,7 @@ efx_np_detach(
 typedef struct efx_np_link_state_s {
 	uint32_t		enls_adv_cap_mask;
 	uint32_t		enls_lp_cap_mask;
+	efx_phy_lane_count_t	enls_lane_count;
 	efx_loopback_type_t	enls_loopback;
 	uint32_t		enls_speed;
 	uint8_t			enls_fec;
@@ -1953,6 +1956,7 @@ efx_np_link_ctrl(
 	__in		const uint8_t *cap_mask_sup_raw,
 	__in		efx_link_mode_t loopback_link_mode,
 	__in		efx_loopback_type_t loopback_mode,
+	__in		efx_phy_lane_count_t lane_count,
 	__in		uint32_t cap_mask_sw,
 	__in		boolean_t fcntl_an);
 
diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 73b022ac21..35ae07a9a0 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -86,6 +86,7 @@ struct efx_np_cap_map {
 	uint16_t	encm_sw;
 };
 
+/* NOTE: keep this in sync with 'efx_np_tech_to_lane_count'. */
 static const struct efx_np_cap_map efx_np_cap_map_tech[] = {
 	/* 1G */
 	{ MC_CMD_ETH_TECH_1000BASEKX, EFX_PHY_CAP_1000FDX },
@@ -292,6 +293,71 @@ efx_np_get_fixed_port_props(
 	return (rc);
 }
 
+static efx_phy_lane_count_t efx_np_tech_to_lane_count[] = {
+	/* 1G */
+	[MC_CMD_ETH_TECH_1000BASEKX] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_1000BASEX] = EFX_PHY_LANE_COUNT_1,
+
+	/* 10G */
+	[MC_CMD_ETH_TECH_10GBASE_KR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_10GBASE_CR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_10GBASE_SR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_10GBASE_LR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_10GBASE_LRM] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_10GBASE_ER] = EFX_PHY_LANE_COUNT_1,
+
+	/* 25GBASE */
+	[MC_CMD_ETH_TECH_25GBASE_CR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_25GBASE_KR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_25GBASE_SR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_25GBASE_LR_ER] = EFX_PHY_LANE_COUNT_1,
+
+	/* 40G */
+	[MC_CMD_ETH_TECH_40GBASE_KR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_40GBASE_CR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_40GBASE_SR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_40GBASE_LR4] = EFX_PHY_LANE_COUNT_4,
+
+	/* 50G */
+	[MC_CMD_ETH_TECH_50GBASE_CR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_50GBASE_KR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_50GBASE_SR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_50GBASE_KR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_50GBASE_SR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_50GBASE_CR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_50GBASE_LR_ER_FR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_50GBASE_DR] = EFX_PHY_LANE_COUNT_1,
+
+	/* 100G */
+	[MC_CMD_ETH_TECH_100GBASE_KR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_100GBASE_SR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_100GBASE_CR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_100GBASE_LR4_ER4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_100GBASE_KR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_100GBASE_SR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_100GBASE_CR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_100GBASE_LR2_ER2_FR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_100GBASE_DR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_100GBASE_KR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_100GBASE_SR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_100GBASE_LR_ER_FR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_100GBASE_CR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_100GBASE_DR] = EFX_PHY_LANE_COUNT_1,
+	[MC_CMD_ETH_TECH_100GBASE_CR10] = EFX_PHY_LANE_COUNT_10,
+
+	/* 200G */
+	[MC_CMD_ETH_TECH_200GBASE_KR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_200GBASE_SR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_200GBASE_LR4_ER4_FR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_200GBASE_DR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_200GBASE_CR4] = EFX_PHY_LANE_COUNT_4,
+	[MC_CMD_ETH_TECH_200GBASE_KR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_200GBASE_SR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_200GBASE_LR2_ER2_FR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_200GBASE_DR2] = EFX_PHY_LANE_COUNT_2,
+	[MC_CMD_ETH_TECH_200GBASE_CR2] = EFX_PHY_LANE_COUNT_2,
+};
+
 	__checkReturn	efx_rc_t
 efx_np_link_state(
 	__in		efx_nic_t *enp,
@@ -304,6 +370,7 @@ efx_np_link_state(
 	uint32_t status_flags;
 	efx_mcdi_req_t req;
 	uint32_t v3_flags;
+	uint16_t tech;
 	efx_rc_t rc;
 
 	req.emr_out_length = MC_CMD_LINK_STATE_OUT_V3_LEN;
@@ -379,6 +446,13 @@ efx_np_link_state(
 		    LINK_STATE_OUT_LINK_PARTNER_ABILITIES),
 	    &lsp->enls_lp_cap_mask);
 
+	tech = MCDI_OUT_WORD(req, LINK_STATE_OUT_LINK_TECHNOLOGY);
+
+	if (tech < EFX_ARRAY_SIZE(efx_np_tech_to_lane_count))
+		lsp->enls_lane_count = efx_np_tech_to_lane_count[tech];
+	else
+		lsp->enls_lane_count = EFX_PHY_LANE_COUNT_DEFAULT;
+
 	return (0);
 
 #if EFSYS_OPT_LOOPBACK
@@ -529,6 +603,53 @@ efx_np_assign_loopback_props(
 }
 #endif /* EFSYS_OPT_LOOPBACK */
 
+static				void
+efx_np_assign_lane_counts(
+	__in			efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_port_t *epp = &(enp->en_port);
+	unsigned int i;
+
+	for (i = 0; i < EFX_ARRAY_SIZE(encp->enc_phy_lane_counts); ++i) {
+		const struct efx_np_cap_map *map = efx_np_cap_map_tech;
+		uint16_t cap_enum_sw;
+		efx_dword_t dword;
+		efx_rc_t rc;
+
+		EFX_ZERO_DWORD(dword);
+
+		rc = efx_np_sw_link_mode_to_cap(i, &cap_enum_sw);
+		if (rc != 0) {
+			/* No support for this link mode => no lane counts. */
+			encp->enc_phy_lane_counts[i] = dword;
+			continue;
+		}
+
+		FOREACH_SUP_CAP(map,
+		    EFX_ARRAY_SIZE(efx_np_cap_map_tech),
+		    MCDI_STRUCT_MEMBER(epp->ep_np_cap_data_raw, const uint8_t,
+			    MC_CMD_ETH_AN_FIELDS_TECH_MASK),
+		    MC_CMD_ETH_AN_FIELDS_TECH_MASK_LEN) {
+			efx_phy_lane_count_t lane_count;
+
+			if (map->encm_sw != cap_enum_sw)
+				continue;
+
+			if (map->encm_hw >=
+			    EFX_ARRAY_SIZE(efx_np_tech_to_lane_count))
+				continue;
+
+			lane_count = efx_np_tech_to_lane_count[map->encm_hw];
+
+			if (lane_count != EFX_PHY_LANE_COUNT_DEFAULT)
+				EFX_SET_DWORD_BIT(dword, lane_count);
+		}
+
+		encp->enc_phy_lane_counts[i] = dword;
+	}
+}
+
 #if EFSYS_OPT_MAC_STATS
 /* HW statistic IDs, as per MC_CMD_MAC_STATISTICS_DESCRIPTOR format. */
 #define	EFX_NP_HW_STAT_ID(_src, _idx)					\
@@ -904,6 +1025,8 @@ efx_np_attach(
 	efx_np_assign_loopback_props(enp);
 #endif /* EFSYS_OPT_LOOPBACK */
 
+	efx_np_assign_lane_counts(enp);
+
 #if EFSYS_OPT_MAC_STATS
 	rc = efx_np_stats_assign(enp);
 	if (rc != 0)
@@ -1008,6 +1131,13 @@ efx_np_mac_state(
 	return (rc);
 }
 
+/* Filter callback for capability lookups. Return 'B_FALSE' to skip the enum. */
+typedef			boolean_t
+(efx_np_cap_filter_cb)(
+	__in		uint16_t enum_hw,
+	__in		void *arg);
+
+
 static					void
 efx_np_cap_mask_sw_to_hw(
 	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
@@ -1015,6 +1145,8 @@ efx_np_cap_mask_sw_to_hw(
 	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
 	__in				size_t hw_cap_data_nbytes,
 	__in				uint32_t mask_sw,
+	__in_opt			efx_np_cap_filter_cb *filter_cb,
+	__in_opt			void *filter_arg,
 	__out				uint8_t *mask_hwp)
 {
 	FOREACH_SUP_CAP(hw_sw_map, hw_sw_map_nentries,
@@ -1024,6 +1156,10 @@ efx_np_cap_mask_sw_to_hw(
 		if ((mask_sw & flag_sw) != flag_sw)
 			continue;
 
+		if (filter_cb != NULL &&
+		    filter_cb(hw_sw_map->encm_hw, filter_arg) == B_FALSE)
+			continue;
+
 		mask_hwp[CAP_BYTE(hw_sw_map)] |= CAP_FLAG(hw_sw_map);
 		mask_sw &= ~(flag_sw);
 	}
@@ -1039,16 +1175,18 @@ efx_np_cap_mask_sw_to_hw(
  *
  * Do not check the input mask for leftover bits (unknown to EFX), as
  * inputs should have been validated by efx_phy_adv_cap_set() already.
+ *
+ * It is possible to use a callback to filter out certain mappings.
  */
 #define	EFX_NP_CAP_MASK_SW_TO_HW(					\
 	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data,		\
-	    _mask_sw, _mask_hwp)					\
+	    _mask_sw, _filter_cb, _filter_arg, _mask_hwp)		\
 	efx_np_cap_mask_sw_to_hw((_hw_sw_cap_map),			\
 	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
 	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
 		    MC_CMD_##_hw_cap_section),				\
-	    MC_CMD_##_hw_cap_section##_LEN,				\
-	    (_mask_sw), (_mask_hwp))
+	    MC_CMD_##_hw_cap_section##_LEN, (_mask_sw),			\
+	    (_filter_cb), (_filter_arg), (_mask_hwp))
 
 static					void
 efx_np_cap_sw_mask_to_hw_enum(
@@ -1057,6 +1195,8 @@ efx_np_cap_sw_mask_to_hw_enum(
 	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
 	__in				size_t hw_cap_data_nbytes,
 	__in				uint32_t mask_sw,
+	__in_opt			efx_np_cap_filter_cb *filter_cb,
+	__in_opt			void *filter_arg,
 	__out				boolean_t *supportedp,
 	__out_opt			uint16_t *enum_hwp)
 {
@@ -1082,10 +1222,14 @@ efx_np_cap_sw_mask_to_hw_enum(
 			sw_check_mask |= flag_sw;
 
 			if ((hw_cap_data[byte_idx] & flag_hw) == flag_hw) {
-				mask_sw &= ~(flag_sw);
-
-				if (enum_hwp != NULL)
-					*enum_hwp = hw_sw_map->encm_hw;
+				if (filter_cb == NULL ||
+				    filter_cb(hw_sw_map->encm_hw, filter_arg) !=
+				    B_FALSE) {
+					mask_sw &= ~(flag_sw);
+
+					if (enum_hwp != NULL)
+						*enum_hwp = hw_sw_map->encm_hw;
+				}
 			}
 		}
 
@@ -1121,17 +1265,39 @@ efx_np_cap_sw_mask_to_hw_enum(
  * Convert (conceivably) the only EFX capability bit of the given mask to
  * the HW enum value, provided that the capability is supported by the HW,
  * where the latter follows from the given fraction of HW capability data.
+ *
+ * It is possible to use a callback to filter out certain mappings.
  */
 #define	EFX_NP_CAP_SW_MASK_TO_HW_ENUM(					\
 	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data,		\
-	    _mask_sw, _supportedp, _enum_hwp)				\
+	    _mask_sw, _filter_cb, _filter_arg, _supportedp, _enum_hwp)	\
 	efx_np_cap_sw_mask_to_hw_enum((_hw_sw_cap_map),			\
 	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
 	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
 		    MC_CMD_##_hw_cap_section),				\
 	    MC_CMD_##_hw_cap_section##_LEN, (_mask_sw),			\
+	    (_filter_cb), (_filter_arg),				\
 	    (_supportedp), (_enum_hwp))
 
+static					boolean_t
+efx_np_filter_tech_by_lane_count_cb(
+	__in				uint16_t enum_hw,
+	__in				void *arg)
+{
+	efx_phy_lane_count_t lane_count = *((efx_phy_lane_count_t *)arg);
+
+	if (lane_count == EFX_PHY_LANE_COUNT_DEFAULT)
+		return B_TRUE;
+
+	if (enum_hw >= EFX_ARRAY_SIZE(efx_np_tech_to_lane_count))
+		return B_FALSE;
+
+	if (efx_np_tech_to_lane_count[enum_hw] != lane_count)
+		return B_FALSE;
+
+	return B_TRUE;
+}
+
 	__checkReturn	efx_rc_t
 efx_np_link_ctrl(
 	__in		efx_nic_t *enp,
@@ -1139,6 +1305,7 @@ efx_np_link_ctrl(
 	__in		const uint8_t *cap_data_raw,
 	__in		efx_link_mode_t loopback_link_mode,
 	__in		efx_loopback_type_t loopback_mode,
+	__in		efx_phy_lane_count_t lane_count,
 	__in		uint32_t cap_mask_sw,
 	__in		boolean_t fcntl_an)
 {
@@ -1190,8 +1357,9 @@ efx_np_link_ctrl(
 
 		rc = efx_np_sw_link_mode_to_cap(loopback_link_mode,
 					    &cap_enum_sw);
-		if (rc != 0)
+		if (rc != 0) {
 			goto fail2;
+		}
 
 		EFX_NP_CAP_ENUM_SW_TO_HW(efx_np_cap_map_tech,
 		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_enum_sw,
@@ -1208,12 +1376,13 @@ efx_np_link_ctrl(
 	} else if (cap_mask_sw & (1U << EFX_PHY_CAP_AN)) {
 		EFX_NP_CAP_MASK_SW_TO_HW(efx_np_cap_map_tech,
 		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_mask_sw,
+		    efx_np_filter_tech_by_lane_count_cb, &lane_count,
 		    cap_mask_hw_techp);
 
 		if (fcntl_an != B_FALSE) {
 			EFX_NP_CAP_MASK_SW_TO_HW(efx_np_cap_map_pause,
 			    ETH_AN_FIELDS_PAUSE_MASK, cap_data_raw, cap_mask_sw,
-			    cap_mask_hw_pausep);
+			    NULL, NULL, cap_mask_hw_pausep);
 		}
 
 		flags |= 1U << MC_CMD_LINK_FLAGS_AUTONEG_EN;
@@ -1221,6 +1390,7 @@ efx_np_link_ctrl(
 	} else {
 		EFX_NP_CAP_SW_MASK_TO_HW_ENUM(efx_np_cap_map_tech,
 		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_mask_sw,
+		    efx_np_filter_tech_by_lane_count_cb, &lane_count,
 		    &supported, &link_tech);
 
 		if (supported == B_FALSE) {
@@ -1241,7 +1411,7 @@ efx_np_link_ctrl(
 	 */
 	EFX_NP_CAP_SW_MASK_TO_HW_ENUM(efx_np_cap_map_fec_req,
 	    ETH_AN_FIELDS_FEC_REQ, cap_data_raw, cap_mask_sw,
-	    &supported, &cap_enum_hw);
+	    NULL, NULL, &supported, &cap_enum_hw);
 
 	if ((cap_mask_sw & EFX_PHY_CAP_FEC_MASK) != 0 && supported == B_FALSE) {
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index e3b9d20d59..1f99c72e62 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -262,6 +262,12 @@ efx_phy_adv_cap_set(
 		goto fail1;
 	}
 
+	if (efx_np_supported(enp) == B_FALSE &&
+	    epp->ep_np_lane_count_req != EFX_PHY_LANE_COUNT_DEFAULT) {
+		rc = ENOTSUP;
+		goto fail2;
+	}
+
 	if (epp->ep_adv_cap_mask == mask)
 		goto done;
 
@@ -269,13 +275,13 @@ efx_phy_adv_cap_set(
 	epp->ep_adv_cap_mask = mask;
 
 	if ((rc = epop->epo_reconfigure(enp)) != 0)
-		goto fail2;
+		goto fail3;
 
 done:
 	return (0);
 
-fail2:
-	EFSYS_PROBE(fail2);
+fail3:
+	EFSYS_PROBE(fail3);
 
 	epp->ep_adv_cap_mask = old_mask;
 	/* Reconfigure for robustness */
@@ -287,6 +293,9 @@ efx_phy_adv_cap_set(
 		EFSYS_ASSERT(0);
 	}
 
+fail2:
+	EFSYS_PROBE(fail2);
+
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
@@ -306,6 +315,53 @@ efx_phy_lp_cap_get(
 	*maskp = epp->ep_lp_cap_mask;
 }
 
+	__checkReturn	efx_rc_t
+efx_phy_lane_count_set(
+	__in		efx_nic_t *enp,
+	__in		efx_phy_lane_count_t lane_count)
+{
+	efx_port_t *epp = &(enp->en_port);
+	const efx_phy_ops_t *epop = epp->ep_epop;
+	efx_phy_lane_count_t lane_count_prev = epp->ep_np_lane_count_req;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
+	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
+
+	if (lane_count == lane_count_prev)
+		return 0;
+
+	if (efx_np_supported(enp) == B_FALSE) {
+		rc = ENOTSUP;
+		goto fail1;
+	}
+
+	if (lane_count >= EFX_PHY_LANE_COUNT_NTYPES) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	epp->ep_np_lane_count_req = lane_count;
+
+	rc = epop->epo_reconfigure(enp);
+	if (rc != 0) {
+		epp->ep_np_lane_count_req = lane_count_prev;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
 	__checkReturn	efx_rc_t
 efx_phy_oui_get(
 	__in		efx_nic_t *enp,
diff --git a/drivers/common/sfc_efx/base/efx_port.c b/drivers/common/sfc_efx/base/efx_port.c
index 389efb2fe9..7e514e92dd 100644
--- a/drivers/common/sfc_efx/base/efx_port.c
+++ b/drivers/common/sfc_efx/base/efx_port.c
@@ -26,6 +26,7 @@ efx_port_init(
 
 	enp->en_mod_flags |= EFX_MOD_PORT;
 
+	epp->ep_np_lane_count_req = EFX_PHY_LANE_COUNT_DEFAULT;
 	epp->ep_mac_type = EFX_MAC_INVALID;
 	epp->ep_link_mode = EFX_LINK_UNKNOWN;
 	epp->ep_mac_drain = B_TRUE;
diff --git a/drivers/common/sfc_efx/base/medford4_phy.c b/drivers/common/sfc_efx/base/medford4_phy.c
index cc4e77587b..9ba6dfbc10 100644
--- a/drivers/common/sfc_efx/base/medford4_phy.c
+++ b/drivers/common/sfc_efx/base/medford4_phy.c
@@ -43,6 +43,7 @@ medford4_phy_get_link(
 
 	elsp->epls.epls_adv_cap_mask = ls.enls_adv_cap_mask;
 	elsp->epls.epls_lp_cap_mask = ls.enls_lp_cap_mask;
+	elsp->epls.epls_lane_count = ls.enls_lane_count;
 	elsp->els_loopback = ls.enls_loopback;
 
 	rc = efx_np_mac_state(enp, nph, &ms);
@@ -115,8 +116,8 @@ medford4_phy_reconfigure(
 #endif /* EFSYS_OPT_LOOPBACK */
 
 	rc = efx_np_link_ctrl(enp, epp->ep_np_handle, epp->ep_np_cap_data_raw,
-		    loopback_link_mode, loopback, epp->ep_adv_cap_mask,
-		    epp->ep_fcntl_autoneg);
+		    loopback_link_mode, loopback, epp->ep_np_lane_count_req,
+		    epp->ep_adv_cap_mask, epp->ep_fcntl_autoneg);
 	if (rc != 0)
 		goto fail2;
 
diff --git a/drivers/common/sfc_efx/sfc_base_symbols.c b/drivers/common/sfc_efx/sfc_base_symbols.c
index 0e74034031..bbb6f39924 100644
--- a/drivers/common/sfc_efx/sfc_base_symbols.c
+++ b/drivers/common/sfc_efx/sfc_base_symbols.c
@@ -195,6 +195,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(efx_nic_dma_map)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_verify)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_adv_cap_get)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_adv_cap_set)
+RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_lane_count_set)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_lp_cap_get)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_oui_get)
 RTE_EXPORT_INTERNAL_SYMBOL(efx_phy_media_type_get)
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 45/46] net/sfc: add support for control of physical port lane count
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (43 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 44/46] common/sfc_efx/base: support controls for netport lane count Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 14:00 ` [PATCH 46/46] doc: advertise support for AMD Solarflare X45xx adapters Ivan Malov
                   ` (2 subsequent siblings)
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

Since 24.11, DPDK has supported APIs to control lane count of the
physical link. Provide driver-level support for that on adaptors that
are netport MCDI capabale (Medford4, for instance).

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
---
 drivers/net/sfc/sfc.h        |   2 +
 drivers/net/sfc/sfc_ethdev.c | 147 +++++++++++++++++++++++++++++++++++
 drivers/net/sfc/sfc_port.c   |  19 +++++
 3 files changed, 168 insertions(+)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 819ce52529..af32ccfaa3 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -67,6 +67,8 @@ struct sfc_dp_rx;
 struct sfc_port {
 	unsigned int			lsc_seq;
 
+	efx_phy_lane_count_t		phy_lane_count_active;
+	efx_phy_lane_count_t		phy_lane_count_req;
 	uint32_t			phy_adv_cap_mask;
 	uint32_t			phy_adv_cap;
 	uint32_t			fec_cfg;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 80eb39e58d..b38fc79d62 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -291,6 +291,150 @@ sfc_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
 	return ret;
 }
 
+static int
+sfc_dev_speed_lanes_get(struct rte_eth_dev *dev, uint32_t *lane_countp)
+{
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
+	struct sfc_port *port;
+	int rc = 0;
+
+	if (lane_countp == NULL)
+		return -EINVAL;
+
+	sfc_adapter_lock(sa);
+	port = &sa->port;
+
+	if (sa->state != SFC_ETHDEV_STARTED) {
+		/* The API wants 'active' lanes, so it is safe to indicate 0. */
+		*lane_countp = 0;
+		goto unlock;
+	}
+
+	if (port->phy_lane_count_active == EFX_PHY_LANE_COUNT_DEFAULT) {
+		rc = ENOTSUP;
+		goto unlock;
+	}
+
+	*lane_countp = port->phy_lane_count_active;
+
+unlock:
+	sfc_adapter_unlock(sa);
+	return -rc;
+}
+
+static int
+sfc_dev_speed_lanes_set(struct rte_eth_dev *dev, uint32_t lane_count)
+{
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
+	int rc = 0;
+
+	sfc_adapter_lock(sa);
+
+	if (sa->state == SFC_ETHDEV_STARTED) {
+		rc = EBUSY;
+		goto unlock;
+	}
+
+	if (lane_count == 0) {
+		rc = EINVAL;
+		goto unlock;
+	}
+
+	sa->port.phy_lane_count_req = lane_count;
+
+unlock:
+	sfc_adapter_unlock(sa);
+	return -rc;
+}
+
+static int
+sfc_dev_speed_lane_cap_handle(const efx_nic_cfg_t *encp,
+			      efx_link_mode_t link_mode,
+			      unsigned int *nb_caps_to_fillp,
+			      struct rte_eth_speed_lanes_capa **capp)
+{
+	uint32_t lane_counts = encp->enc_phy_lane_counts[link_mode].ed_u32[0];
+	struct rte_eth_speed_lanes_capa *cap = *capp;
+	uint32_t speed;
+
+	if (lane_counts == 0) {
+		/*
+		 * The mask of supported lane counts for this link mode is
+		 * empty. Do not waste output entries for such link modes.
+		 */
+		return 0;
+	}
+
+	switch (link_mode) {
+	case EFX_LINK_1000FDX:
+		speed = RTE_ETH_SPEED_NUM_1G;
+		break;
+	case EFX_LINK_10000FDX:
+		speed = RTE_ETH_SPEED_NUM_10G;
+		break;
+	case EFX_LINK_25000FDX:
+		speed = RTE_ETH_SPEED_NUM_25G;
+		break;
+	case EFX_LINK_40000FDX:
+		speed = RTE_ETH_SPEED_NUM_40G;
+		break;
+	case EFX_LINK_50000FDX:
+		speed = RTE_ETH_SPEED_NUM_50G;
+		break;
+	case EFX_LINK_100000FDX:
+		speed = RTE_ETH_SPEED_NUM_100G;
+		break;
+	case EFX_LINK_200000FDX:
+		speed = RTE_ETH_SPEED_NUM_200G;
+		break;
+	default:
+		/* No lane counts for this link mode. */
+		return 0;
+	}
+
+	if (*nb_caps_to_fillp == 0) {
+		if (cap == NULL) {
+			/* Dry run. Indicate that an entry is available. */
+			return 1;
+		}
+
+		/* We have run out of space in the user output buffer. */
+		return 0;
+	}
+
+	cap->capa = lane_counts;
+	cap->speed = speed;
+
+	--(*nb_caps_to_fillp);
+	++(*capp);
+	return 1;
+}
+
+static int
+sfc_dev_speed_lanes_get_capa(struct rte_eth_dev *dev,
+			     struct rte_eth_speed_lanes_capa *caps,
+			     unsigned int nb_caps)
+{
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
+	efx_link_mode_t i;
+	int ret = 0;
+
+	sfc_adapter_lock(sa);
+
+	if (sa->state < SFC_ETHDEV_INITIALIZED) {
+		ret = -ENODATA;
+		goto unlock;
+	}
+
+	for (i = 0; i < EFX_LINK_NMODES; ++i)
+		ret += sfc_dev_speed_lane_cap_handle(encp, i, &nb_caps, &caps);
+
+unlock:
+	sfc_adapter_unlock(sa);
+	return ret;
+}
+
 static int
 sfc_dev_stop(struct rte_eth_dev *dev)
 {
@@ -2759,6 +2903,9 @@ static const struct eth_dev_ops sfc_eth_dev_ops = {
 	.allmulticast_enable		= sfc_dev_allmulti_enable,
 	.allmulticast_disable		= sfc_dev_allmulti_disable,
 	.link_update			= sfc_dev_link_update,
+	.speed_lanes_get		= sfc_dev_speed_lanes_get,
+	.speed_lanes_set		= sfc_dev_speed_lanes_set,
+	.speed_lanes_get_capa		= sfc_dev_speed_lanes_get_capa,
 	.stats_get			= sfc_stats_get,
 	.stats_reset			= sfc_stats_reset,
 	.xstats_get			= sfc_xstats_get,
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index 0a31a394d5..e5a7b8358d 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -187,6 +187,7 @@ sfc_port_fill_mac_stats_info(struct sfc_adapter *sa)
 int
 sfc_port_start(struct sfc_adapter *sa)
 {
+	efx_phy_link_state_t link_state = {0};
 	struct sfc_port *port = &sa->port;
 	int rc;
 	uint32_t phy_adv_cap;
@@ -243,6 +244,20 @@ sfc_port_start(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_phy_adv_cap_set;
 
+	sfc_log_init(sa, "set phy lane count -- %s",
+		     (port->phy_lane_count_req == EFX_PHY_LANE_COUNT_DEFAULT) ?
+		     "let EFX pick default value" : "use custom value");
+	rc = efx_phy_lane_count_set(sa->nic, port->phy_lane_count_req);
+	if (rc != 0)
+		goto fail_phy_lane_count_set;
+
+	sfc_log_init(sa, "get phy lane count");
+	rc = efx_phy_link_state_get(sa->nic, &link_state);
+	if (rc != 0)
+		goto fail_phy_lane_count_get;
+
+	port->phy_lane_count_active = link_state.epls_lane_count;
+
 	sfc_log_init(sa, "set MAC PDU %u", (unsigned int)port->pdu);
 	rc = efx_mac_pdu_set(sa->nic, port->pdu);
 	if (rc != 0)
@@ -350,6 +365,8 @@ sfc_port_start(struct sfc_adapter *sa)
 fail_mac_filter_set:
 fail_mac_addr_set:
 fail_mac_pdu_set:
+fail_phy_lane_count_get:
+fail_phy_lane_count_set:
 fail_phy_adv_cap_set:
 fail_mac_fcntl_set:
 fail_mac_vlan_strip_set:
@@ -427,6 +444,8 @@ sfc_port_attach(struct sfc_adapter *sa)
 
 	sfc_log_init(sa, "entry");
 
+	port->phy_lane_count_req = EFX_PHY_LANE_COUNT_DEFAULT;
+
 	efx_phy_adv_cap_get(sa->nic, EFX_PHY_CAP_PERM, &port->phy_adv_cap_mask);
 
 	/* Enable flow control by default */
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* [PATCH 46/46] doc: advertise support for AMD Solarflare X45xx adapters
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (44 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 45/46] net/sfc: add support for control of physical port " Ivan Malov
@ 2025-04-16 14:00 ` Ivan Malov
  2025-04-16 15:14 ` [PATCH 00/46] Support AMD Solarflare X45xx adaptors Stephen Hemminger
  2025-04-17  8:09 ` Andrew Rybchenko
  47 siblings, 0 replies; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 14:00 UTC (permalink / raw)
  To: dev
  Cc: Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

The two NICs, X4522 and X4542, are based on EF10 architecture.

Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
---
 doc/guides/nics/sfc_efx.rst            | 9 ++++++++-
 doc/guides/rel_notes/release_25_07.rst | 4 ++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst
index eafb88191a..4bd9f8c441 100644
--- a/doc/guides/nics/sfc_efx.rst
+++ b/doc/guides/nics/sfc_efx.rst
@@ -10,7 +10,8 @@ Solarflare libefx-based Poll Mode Driver
 
 The SFC EFX PMD (**librte_net_sfc_efx**) provides poll mode driver support
 for **Solarflare SFN7xxx and SFN8xxx** family of 10/40 Gbps adapters,
-**Solarflare XtremeScale X2xxx** family of 10/25/40/50/100 Gbps adapters and
+**Solarflare XtremeScale X2xxx** family of 10/25/40/50/100 Gbps adapters,
+**Solarflare X45xx** family of 10/25/40/50/100 Gbps adapters and
 **Alveo SN1000 SmartNICs** family of 10/25/40/50/100 Gbps adapters.
 SFC EFX PMD has support for the latest Linux and FreeBSD operating systems.
 
@@ -21,6 +22,12 @@ More information can be found at `Solarflare Communications website
 Supported NICs
 --------------
 
+- AMD Solarflare Adapters:
+
+   - AMD Solarflare X4522 Dual Port SFP56 Adapter
+
+   - AMD Solarflare X4542 Dual Port QSFP56 Adapter
+
 - Xilinx Adapters:
 
    - Alveo SN1022 SmartNIC
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index b8b56510f8..467536fe05 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -60,6 +60,10 @@ New Features
   Added a new network PMD which supports Mucse 10 Gigabit Ethernet NICs.
   See the :doc:`../nics/rnp` for more details.
 
+* **Updated Solarflare network PMD.**
+
+  Added support for AMD Solarflare X45xx adapters.
+
 
 Removed Items
 -------------
-- 
2.39.5


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 00/46] Support AMD Solarflare X45xx adaptors
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (45 preceding siblings ...)
  2025-04-16 14:00 ` [PATCH 46/46] doc: advertise support for AMD Solarflare X45xx adapters Ivan Malov
@ 2025-04-16 15:14 ` Stephen Hemminger
  2025-04-16 15:38   ` Ivan Malov
  2025-04-17  8:09 ` Andrew Rybchenko
  47 siblings, 1 reply; 61+ messages in thread
From: Stephen Hemminger @ 2025-04-16 15:14 UTC (permalink / raw)
  To: Ivan Malov
  Cc: dev, Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On Wed, 16 Apr 2025 17:59:30 +0400
Ivan Malov <ivan.malov@arknetworks.am> wrote:

> New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
> Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
> supports multiple network engine types. This series provides support
> only for the Medford2-alike, 'full-feature' (FF) network engine. This
> shall not be confused with the concept of 'datapath FW variants': the
> FF network engine supports both 'full-feature' and 'ultra-low-latency'
> datapath FW variants, with corresponding Medford2-alike feature sets.
> 
> The first part of the series provides general support for the adaptors,
> whilst the second one adds support for the new management controller
> interface for configuration of network port features (netport MCDI).
> 
> For now, only support for physical functions (PFs) is concerned. There
> is a small number of TODO and FIXME markings in the code. Those are
> normal at this development stage and will be removed by future patches
> when VF support has fleshed out.
> 
> 
> Andy Moreton (3):
>   common/sfc_efx/base: update X4 BAR layout and PCI IDs
>   net/sfc: add Medford4 with only full feature datapath engine
>   common/sfc_efx/base: add port mode for 8 port hardware
> 
> Denis Pryazhennikov (15):
>   common/sfc_efx/base: add Medford4 PCI IDs to common code
>   common/sfc_efx/base: add efsys option for Medford4
>   common/sfc_efx/base: add Medford4 support to NIC module
>   common/sfc_efx/base: add Medford4 support to EV module
>   common/sfc_efx/base: add Medford4 support to FILTER module
>   common/sfc_efx/base: add Medford4 support to INTR module
>   common/sfc_efx/base: add Medford4 support to MAC module
>   common/sfc_efx/base: add Medford4 support to PHY module
>   common/sfc_efx/base: add Medford4 support to TUNNEL module
>   common/sfc_efx/base: add Medford4 support to MCDI module
>   common/sfc_efx/base: add Medford4 support to Rx module
>   common/sfc_efx/base: add Medford4 support to Tx module
>   drivers: enable support for AMD Solarflare X4 adapter family
>   common/sfc_efx/base: add new X4 port mode
>   common/sfc_efx/base: extend list of supported X4 port modes
> 
> Ivan Malov (28):
>   common/sfc_efx/base: update MCDI headers
>   common/sfc_efx/base: provide a stub for basic netport attach
>   common/sfc_efx/base: provide defaults on netport attach path
>   common/sfc_efx/base: obtain assigned netport handle from NIC
>   common/sfc_efx/base: allow for const in MCDI struct accessor
>   common/sfc_efx/base: get netport fixed capabilities on probe
>   common/sfc_efx/base: decode netport link state on probe path
>   common/sfc_efx/base: fill in loopback modes on netport probe
>   common/sfc_efx/base: introduce Medford4 stub for PHY methods
>   common/sfc_efx/base: refactor EF10 link mode decoding helper
>   common/sfc_efx/base: provide PHY link get method on Medford4
>   common/sfc_efx/base: implement PHY link control for Medford4
>   common/sfc_efx/base: introduce Medford4 stub for MAC methods
>   common/sfc_efx/base: add MAC reconfigure method for Medford4
>   common/sfc_efx/base: fill in software LUT for MAC statistics
>   common/sfc_efx/base: fill in MAC statistics mask on Medford4
>   common/sfc_efx/base: support MAC statistics on Medford4 NICs
>   common/sfc_efx/base: implement MAC PDU controls for Medford4
>   common/sfc_efx/base: correct MAC PDU calculation on Medford4
>   net/sfc: make use of generic EFX MAC PDU calculation helpers
>   common/sfc_efx/base: ignore legacy link events on new boards
>   common/sfc_efx/base: add link event processing on new boards
>   net/sfc: query link status on link change events on new NICs
>   common/sfc_efx/base: subscribe to netport link change events
>   net/sfc: offer support for 200G link ability on new adaptors
>   common/sfc_efx/base: support controls for netport lane count
>   net/sfc: add support for control of physical port lane count
>   doc: advertise support for AMD Solarflare X45xx adapters
> 
>  .mailmap                                      |    3 +-
>  doc/guides/nics/sfc_efx.rst                   |    9 +-
>  doc/guides/rel_notes/release_25_07.rst        |    4 +
>  drivers/common/sfc_efx/base/ef10_ev.c         |   39 +
>  drivers/common/sfc_efx/base/ef10_impl.h       |   19 +
>  drivers/common/sfc_efx/base/ef10_nic.c        |   98 +-
>  drivers/common/sfc_efx/base/ef10_phy.c        |   43 +-
>  drivers/common/sfc_efx/base/ef10_tlv_layout.h |    9 +-
>  drivers/common/sfc_efx/base/efx.h             |   98 +-
>  drivers/common/sfc_efx/base/efx_check.h       |   24 +-
>  drivers/common/sfc_efx/base/efx_ev.c          |    6 +
>  drivers/common/sfc_efx/base/efx_filter.c      |    6 +
>  drivers/common/sfc_efx/base/efx_impl.h        |  115 +-
>  drivers/common/sfc_efx/base/efx_intr.c        |    6 +
>  drivers/common/sfc_efx/base/efx_mac.c         |   56 +-
>  drivers/common/sfc_efx/base/efx_mcdi.c        |   18 +-
>  drivers/common/sfc_efx/base/efx_mcdi.h        |    2 +-
>  drivers/common/sfc_efx/base/efx_nic.c         |   60 +
>  drivers/common/sfc_efx/base/efx_np.c          | 1625 +++++
>  drivers/common/sfc_efx/base/efx_phy.c         |   88 +-
>  drivers/common/sfc_efx/base/efx_port.c        |    1 +
>  drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5868 ++++++++++++++++-
>  drivers/common/sfc_efx/base/efx_rx.c          |    6 +
>  drivers/common/sfc_efx/base/efx_tunnel.c      |   18 +-
>  drivers/common/sfc_efx/base/efx_tx.c          |   33 +
>  drivers/common/sfc_efx/base/medford4_impl.h   |  110 +
>  drivers/common/sfc_efx/base/medford4_mac.c    |  299 +
>  drivers/common/sfc_efx/base/medford4_phy.c    |  156 +
>  drivers/common/sfc_efx/base/meson.build       |    3 +
>  drivers/common/sfc_efx/efsys.h                |    2 +
>  drivers/common/sfc_efx/sfc_base_symbols.c     |    2 +
>  drivers/net/sfc/sfc.c                         |    5 +-
>  drivers/net/sfc/sfc.h                         |    4 +
>  drivers/net/sfc/sfc_dp_tx.h                   |    3 +
>  drivers/net/sfc/sfc_ef10_tx.c                 |   13 +-
>  drivers/net/sfc/sfc_ethdev.c                  |  186 +-
>  drivers/net/sfc/sfc_ev.c                      |   51 +-
>  drivers/net/sfc/sfc_port.c                    |   27 +-
>  drivers/net/sfc/sfc_repr.c                    |    7 +-
>  drivers/net/sfc/sfc_repr.h                    |    1 +
>  drivers/net/sfc/sfc_tx.c                      |    2 +
>  41 files changed, 9000 insertions(+), 125 deletions(-)
>  create mode 100644 drivers/common/sfc_efx/base/efx_np.c
>  create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
>  create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c
>  create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c
> 

Overall looks good but:
  - need to fix build on FreeBSD, you are using an errno not available there.
  - can you address some of the checkpatch warnings in the base code.

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 00/46] Support AMD Solarflare X45xx adaptors
  2025-04-16 15:14 ` [PATCH 00/46] Support AMD Solarflare X45xx adaptors Stephen Hemminger
@ 2025-04-16 15:38   ` Ivan Malov
  2025-04-16 16:31     ` Stephen Hemminger
  0 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 15:38 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dev, Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On Wed, 16 Apr 2025, Stephen Hemminger wrote:

> On Wed, 16 Apr 2025 17:59:30 +0400
> Ivan Malov <ivan.malov@arknetworks.am> wrote:
>
>> New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
>> Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
>> supports multiple network engine types. This series provides support
>> only for the Medford2-alike, 'full-feature' (FF) network engine. This
>> shall not be confused with the concept of 'datapath FW variants': the
>> FF network engine supports both 'full-feature' and 'ultra-low-latency'
>> datapath FW variants, with corresponding Medford2-alike feature sets.
>>
>> The first part of the series provides general support for the adaptors,
>> whilst the second one adds support for the new management controller
>> interface for configuration of network port features (netport MCDI).
>>
>> For now, only support for physical functions (PFs) is concerned. There
>> is a small number of TODO and FIXME markings in the code. Those are
>> normal at this development stage and will be removed by future patches
>> when VF support has fleshed out.
>>
>>
>> Andy Moreton (3):
>>   common/sfc_efx/base: update X4 BAR layout and PCI IDs
>>   net/sfc: add Medford4 with only full feature datapath engine
>>   common/sfc_efx/base: add port mode for 8 port hardware
>>
>> Denis Pryazhennikov (15):
>>   common/sfc_efx/base: add Medford4 PCI IDs to common code
>>   common/sfc_efx/base: add efsys option for Medford4
>>   common/sfc_efx/base: add Medford4 support to NIC module
>>   common/sfc_efx/base: add Medford4 support to EV module
>>   common/sfc_efx/base: add Medford4 support to FILTER module
>>   common/sfc_efx/base: add Medford4 support to INTR module
>>   common/sfc_efx/base: add Medford4 support to MAC module
>>   common/sfc_efx/base: add Medford4 support to PHY module
>>   common/sfc_efx/base: add Medford4 support to TUNNEL module
>>   common/sfc_efx/base: add Medford4 support to MCDI module
>>   common/sfc_efx/base: add Medford4 support to Rx module
>>   common/sfc_efx/base: add Medford4 support to Tx module
>>   drivers: enable support for AMD Solarflare X4 adapter family
>>   common/sfc_efx/base: add new X4 port mode
>>   common/sfc_efx/base: extend list of supported X4 port modes
>>
>> Ivan Malov (28):
>>   common/sfc_efx/base: update MCDI headers
>>   common/sfc_efx/base: provide a stub for basic netport attach
>>   common/sfc_efx/base: provide defaults on netport attach path
>>   common/sfc_efx/base: obtain assigned netport handle from NIC
>>   common/sfc_efx/base: allow for const in MCDI struct accessor
>>   common/sfc_efx/base: get netport fixed capabilities on probe
>>   common/sfc_efx/base: decode netport link state on probe path
>>   common/sfc_efx/base: fill in loopback modes on netport probe
>>   common/sfc_efx/base: introduce Medford4 stub for PHY methods
>>   common/sfc_efx/base: refactor EF10 link mode decoding helper
>>   common/sfc_efx/base: provide PHY link get method on Medford4
>>   common/sfc_efx/base: implement PHY link control for Medford4
>>   common/sfc_efx/base: introduce Medford4 stub for MAC methods
>>   common/sfc_efx/base: add MAC reconfigure method for Medford4
>>   common/sfc_efx/base: fill in software LUT for MAC statistics
>>   common/sfc_efx/base: fill in MAC statistics mask on Medford4
>>   common/sfc_efx/base: support MAC statistics on Medford4 NICs
>>   common/sfc_efx/base: implement MAC PDU controls for Medford4
>>   common/sfc_efx/base: correct MAC PDU calculation on Medford4
>>   net/sfc: make use of generic EFX MAC PDU calculation helpers
>>   common/sfc_efx/base: ignore legacy link events on new boards
>>   common/sfc_efx/base: add link event processing on new boards
>>   net/sfc: query link status on link change events on new NICs
>>   common/sfc_efx/base: subscribe to netport link change events
>>   net/sfc: offer support for 200G link ability on new adaptors
>>   common/sfc_efx/base: support controls for netport lane count
>>   net/sfc: add support for control of physical port lane count
>>   doc: advertise support for AMD Solarflare X45xx adapters
>>
>>  .mailmap                                      |    3 +-
>>  doc/guides/nics/sfc_efx.rst                   |    9 +-
>>  doc/guides/rel_notes/release_25_07.rst        |    4 +
>>  drivers/common/sfc_efx/base/ef10_ev.c         |   39 +
>>  drivers/common/sfc_efx/base/ef10_impl.h       |   19 +
>>  drivers/common/sfc_efx/base/ef10_nic.c        |   98 +-
>>  drivers/common/sfc_efx/base/ef10_phy.c        |   43 +-
>>  drivers/common/sfc_efx/base/ef10_tlv_layout.h |    9 +-
>>  drivers/common/sfc_efx/base/efx.h             |   98 +-
>>  drivers/common/sfc_efx/base/efx_check.h       |   24 +-
>>  drivers/common/sfc_efx/base/efx_ev.c          |    6 +
>>  drivers/common/sfc_efx/base/efx_filter.c      |    6 +
>>  drivers/common/sfc_efx/base/efx_impl.h        |  115 +-
>>  drivers/common/sfc_efx/base/efx_intr.c        |    6 +
>>  drivers/common/sfc_efx/base/efx_mac.c         |   56 +-
>>  drivers/common/sfc_efx/base/efx_mcdi.c        |   18 +-
>>  drivers/common/sfc_efx/base/efx_mcdi.h        |    2 +-
>>  drivers/common/sfc_efx/base/efx_nic.c         |   60 +
>>  drivers/common/sfc_efx/base/efx_np.c          | 1625 +++++
>>  drivers/common/sfc_efx/base/efx_phy.c         |   88 +-
>>  drivers/common/sfc_efx/base/efx_port.c        |    1 +
>>  drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5868 ++++++++++++++++-
>>  drivers/common/sfc_efx/base/efx_rx.c          |    6 +
>>  drivers/common/sfc_efx/base/efx_tunnel.c      |   18 +-
>>  drivers/common/sfc_efx/base/efx_tx.c          |   33 +
>>  drivers/common/sfc_efx/base/medford4_impl.h   |  110 +
>>  drivers/common/sfc_efx/base/medford4_mac.c    |  299 +
>>  drivers/common/sfc_efx/base/medford4_phy.c    |  156 +
>>  drivers/common/sfc_efx/base/meson.build       |    3 +
>>  drivers/common/sfc_efx/efsys.h                |    2 +
>>  drivers/common/sfc_efx/sfc_base_symbols.c     |    2 +
>>  drivers/net/sfc/sfc.c                         |    5 +-
>>  drivers/net/sfc/sfc.h                         |    4 +
>>  drivers/net/sfc/sfc_dp_tx.h                   |    3 +
>>  drivers/net/sfc/sfc_ef10_tx.c                 |   13 +-
>>  drivers/net/sfc/sfc_ethdev.c                  |  186 +-
>>  drivers/net/sfc/sfc_ev.c                      |   51 +-
>>  drivers/net/sfc/sfc_port.c                    |   27 +-
>>  drivers/net/sfc/sfc_repr.c                    |    7 +-
>>  drivers/net/sfc/sfc_repr.h                    |    1 +
>>  drivers/net/sfc/sfc_tx.c                      |    2 +
>>  41 files changed, 9000 insertions(+), 125 deletions(-)
>>  create mode 100644 drivers/common/sfc_efx/base/efx_np.c
>>  create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
>>  create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c
>>  create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c
>>
>
> Overall looks good but:
>  - need to fix build on FreeBSD, you are using an errno not available there.
>  - can you address some of the checkpatch warnings in the base code.
>

I can fix the errno, yes. Thanks for catching this.

As for the checkpatch warnings in the base code -- unfortunately, that part does
not follow DPDK style in general and has always triggered such warnings in DPDK.
Should I try to fix some anyway? Which, for instance?

Thank you.

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 00/46] Support AMD Solarflare X45xx adaptors
  2025-04-16 15:38   ` Ivan Malov
@ 2025-04-16 16:31     ` Stephen Hemminger
  2025-04-16 17:37       ` Ivan Malov
  0 siblings, 1 reply; 61+ messages in thread
From: Stephen Hemminger @ 2025-04-16 16:31 UTC (permalink / raw)
  To: Ivan Malov
  Cc: dev, Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On Wed, 16 Apr 2025 19:38:58 +0400 (+04)
Ivan Malov <ivan.malov@arknetworks.am> wrote:

> On Wed, 16 Apr 2025, Stephen Hemminger wrote:
> 
> > On Wed, 16 Apr 2025 17:59:30 +0400
> > Ivan Malov <ivan.malov@arknetworks.am> wrote:
> >  
> >> New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
> >> Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
> >> supports multiple network engine types. This series provides support
> >> only for the Medford2-alike, 'full-feature' (FF) network engine. This
> >> shall not be confused with the concept of 'datapath FW variants': the
> >> FF network engine supports both 'full-feature' and 'ultra-low-latency'
> >> datapath FW variants, with corresponding Medford2-alike feature sets.
> >>
> >> The first part of the series provides general support for the adaptors,
> >> whilst the second one adds support for the new management controller
> >> interface for configuration of network port features (netport MCDI).
> >>
> >> For now, only support for physical functions (PFs) is concerned. There
> >> is a small number of TODO and FIXME markings in the code. Those are
> >> normal at this development stage and will be removed by future patches
> >> when VF support has fleshed out.
> >>
> >>
> >> Andy Moreton (3):
> >>   common/sfc_efx/base: update X4 BAR layout and PCI IDs
> >>   net/sfc: add Medford4 with only full feature datapath engine
> >>   common/sfc_efx/base: add port mode for 8 port hardware
> >>
> >> Denis Pryazhennikov (15):
> >>   common/sfc_efx/base: add Medford4 PCI IDs to common code
> >>   common/sfc_efx/base: add efsys option for Medford4
> >>   common/sfc_efx/base: add Medford4 support to NIC module
> >>   common/sfc_efx/base: add Medford4 support to EV module
> >>   common/sfc_efx/base: add Medford4 support to FILTER module
> >>   common/sfc_efx/base: add Medford4 support to INTR module
> >>   common/sfc_efx/base: add Medford4 support to MAC module
> >>   common/sfc_efx/base: add Medford4 support to PHY module
> >>   common/sfc_efx/base: add Medford4 support to TUNNEL module
> >>   common/sfc_efx/base: add Medford4 support to MCDI module
> >>   common/sfc_efx/base: add Medford4 support to Rx module
> >>   common/sfc_efx/base: add Medford4 support to Tx module
> >>   drivers: enable support for AMD Solarflare X4 adapter family
> >>   common/sfc_efx/base: add new X4 port mode
> >>   common/sfc_efx/base: extend list of supported X4 port modes
> >>
> >> Ivan Malov (28):
> >>   common/sfc_efx/base: update MCDI headers
> >>   common/sfc_efx/base: provide a stub for basic netport attach
> >>   common/sfc_efx/base: provide defaults on netport attach path
> >>   common/sfc_efx/base: obtain assigned netport handle from NIC
> >>   common/sfc_efx/base: allow for const in MCDI struct accessor
> >>   common/sfc_efx/base: get netport fixed capabilities on probe
> >>   common/sfc_efx/base: decode netport link state on probe path
> >>   common/sfc_efx/base: fill in loopback modes on netport probe
> >>   common/sfc_efx/base: introduce Medford4 stub for PHY methods
> >>   common/sfc_efx/base: refactor EF10 link mode decoding helper
> >>   common/sfc_efx/base: provide PHY link get method on Medford4
> >>   common/sfc_efx/base: implement PHY link control for Medford4
> >>   common/sfc_efx/base: introduce Medford4 stub for MAC methods
> >>   common/sfc_efx/base: add MAC reconfigure method for Medford4
> >>   common/sfc_efx/base: fill in software LUT for MAC statistics
> >>   common/sfc_efx/base: fill in MAC statistics mask on Medford4
> >>   common/sfc_efx/base: support MAC statistics on Medford4 NICs
> >>   common/sfc_efx/base: implement MAC PDU controls for Medford4
> >>   common/sfc_efx/base: correct MAC PDU calculation on Medford4
> >>   net/sfc: make use of generic EFX MAC PDU calculation helpers
> >>   common/sfc_efx/base: ignore legacy link events on new boards
> >>   common/sfc_efx/base: add link event processing on new boards
> >>   net/sfc: query link status on link change events on new NICs
> >>   common/sfc_efx/base: subscribe to netport link change events
> >>   net/sfc: offer support for 200G link ability on new adaptors
> >>   common/sfc_efx/base: support controls for netport lane count
> >>   net/sfc: add support for control of physical port lane count
> >>   doc: advertise support for AMD Solarflare X45xx adapters
> >>
> >>  .mailmap                                      |    3 +-
> >>  doc/guides/nics/sfc_efx.rst                   |    9 +-
> >>  doc/guides/rel_notes/release_25_07.rst        |    4 +
> >>  drivers/common/sfc_efx/base/ef10_ev.c         |   39 +
> >>  drivers/common/sfc_efx/base/ef10_impl.h       |   19 +
> >>  drivers/common/sfc_efx/base/ef10_nic.c        |   98 +-
> >>  drivers/common/sfc_efx/base/ef10_phy.c        |   43 +-
> >>  drivers/common/sfc_efx/base/ef10_tlv_layout.h |    9 +-
> >>  drivers/common/sfc_efx/base/efx.h             |   98 +-
> >>  drivers/common/sfc_efx/base/efx_check.h       |   24 +-
> >>  drivers/common/sfc_efx/base/efx_ev.c          |    6 +
> >>  drivers/common/sfc_efx/base/efx_filter.c      |    6 +
> >>  drivers/common/sfc_efx/base/efx_impl.h        |  115 +-
> >>  drivers/common/sfc_efx/base/efx_intr.c        |    6 +
> >>  drivers/common/sfc_efx/base/efx_mac.c         |   56 +-
> >>  drivers/common/sfc_efx/base/efx_mcdi.c        |   18 +-
> >>  drivers/common/sfc_efx/base/efx_mcdi.h        |    2 +-
> >>  drivers/common/sfc_efx/base/efx_nic.c         |   60 +
> >>  drivers/common/sfc_efx/base/efx_np.c          | 1625 +++++
> >>  drivers/common/sfc_efx/base/efx_phy.c         |   88 +-
> >>  drivers/common/sfc_efx/base/efx_port.c        |    1 +
> >>  drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5868 ++++++++++++++++-
> >>  drivers/common/sfc_efx/base/efx_rx.c          |    6 +
> >>  drivers/common/sfc_efx/base/efx_tunnel.c      |   18 +-
> >>  drivers/common/sfc_efx/base/efx_tx.c          |   33 +
> >>  drivers/common/sfc_efx/base/medford4_impl.h   |  110 +
> >>  drivers/common/sfc_efx/base/medford4_mac.c    |  299 +
> >>  drivers/common/sfc_efx/base/medford4_phy.c    |  156 +
> >>  drivers/common/sfc_efx/base/meson.build       |    3 +
> >>  drivers/common/sfc_efx/efsys.h                |    2 +
> >>  drivers/common/sfc_efx/sfc_base_symbols.c     |    2 +
> >>  drivers/net/sfc/sfc.c                         |    5 +-
> >>  drivers/net/sfc/sfc.h                         |    4 +
> >>  drivers/net/sfc/sfc_dp_tx.h                   |    3 +
> >>  drivers/net/sfc/sfc_ef10_tx.c                 |   13 +-
> >>  drivers/net/sfc/sfc_ethdev.c                  |  186 +-
> >>  drivers/net/sfc/sfc_ev.c                      |   51 +-
> >>  drivers/net/sfc/sfc_port.c                    |   27 +-
> >>  drivers/net/sfc/sfc_repr.c                    |    7 +-
> >>  drivers/net/sfc/sfc_repr.h                    |    1 +
> >>  drivers/net/sfc/sfc_tx.c                      |    2 +
> >>  41 files changed, 9000 insertions(+), 125 deletions(-)
> >>  create mode 100644 drivers/common/sfc_efx/base/efx_np.c
> >>  create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
> >>  create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c
> >>  create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c
> >>  
> >
> > Overall looks good but:
> >  - need to fix build on FreeBSD, you are using an errno not available there.
> >  - can you address some of the checkpatch warnings in the base code.
> >  
> 
> I can fix the errno, yes. Thanks for catching this.
> 
> As for the checkpatch warnings in the base code -- unfortunately, that part does
> not follow DPDK style in general and has always triggered such warnings in DPDK.
> Should I try to fix some anyway? Which, for instance?

Mostly it is the use of BSD style parens on returns that clutters the warnings.
I.e
	return (0);

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 00/46] Support AMD Solarflare X45xx adaptors
  2025-04-16 16:31     ` Stephen Hemminger
@ 2025-04-16 17:37       ` Ivan Malov
  2025-04-16 21:44         ` Stephen Hemminger
  0 siblings, 1 reply; 61+ messages in thread
From: Ivan Malov @ 2025-04-16 17:37 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dev, Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On Wed, 16 Apr 2025, Stephen Hemminger wrote:

> On Wed, 16 Apr 2025 19:38:58 +0400 (+04)
> Ivan Malov <ivan.malov@arknetworks.am> wrote:
>
>> On Wed, 16 Apr 2025, Stephen Hemminger wrote:
>>
>>> On Wed, 16 Apr 2025 17:59:30 +0400
>>> Ivan Malov <ivan.malov@arknetworks.am> wrote:
>>>
>>>> New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
>>>> Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
>>>> supports multiple network engine types. This series provides support
>>>> only for the Medford2-alike, 'full-feature' (FF) network engine. This
>>>> shall not be confused with the concept of 'datapath FW variants': the
>>>> FF network engine supports both 'full-feature' and 'ultra-low-latency'
>>>> datapath FW variants, with corresponding Medford2-alike feature sets.
>>>>
>>>> The first part of the series provides general support for the adaptors,
>>>> whilst the second one adds support for the new management controller
>>>> interface for configuration of network port features (netport MCDI).
>>>>
>>>> For now, only support for physical functions (PFs) is concerned. There
>>>> is a small number of TODO and FIXME markings in the code. Those are
>>>> normal at this development stage and will be removed by future patches
>>>> when VF support has fleshed out.
>>>>
>>>>
>>>> Andy Moreton (3):
>>>>   common/sfc_efx/base: update X4 BAR layout and PCI IDs
>>>>   net/sfc: add Medford4 with only full feature datapath engine
>>>>   common/sfc_efx/base: add port mode for 8 port hardware
>>>>
>>>> Denis Pryazhennikov (15):
>>>>   common/sfc_efx/base: add Medford4 PCI IDs to common code
>>>>   common/sfc_efx/base: add efsys option for Medford4
>>>>   common/sfc_efx/base: add Medford4 support to NIC module
>>>>   common/sfc_efx/base: add Medford4 support to EV module
>>>>   common/sfc_efx/base: add Medford4 support to FILTER module
>>>>   common/sfc_efx/base: add Medford4 support to INTR module
>>>>   common/sfc_efx/base: add Medford4 support to MAC module
>>>>   common/sfc_efx/base: add Medford4 support to PHY module
>>>>   common/sfc_efx/base: add Medford4 support to TUNNEL module
>>>>   common/sfc_efx/base: add Medford4 support to MCDI module
>>>>   common/sfc_efx/base: add Medford4 support to Rx module
>>>>   common/sfc_efx/base: add Medford4 support to Tx module
>>>>   drivers: enable support for AMD Solarflare X4 adapter family
>>>>   common/sfc_efx/base: add new X4 port mode
>>>>   common/sfc_efx/base: extend list of supported X4 port modes
>>>>
>>>> Ivan Malov (28):
>>>>   common/sfc_efx/base: update MCDI headers
>>>>   common/sfc_efx/base: provide a stub for basic netport attach
>>>>   common/sfc_efx/base: provide defaults on netport attach path
>>>>   common/sfc_efx/base: obtain assigned netport handle from NIC
>>>>   common/sfc_efx/base: allow for const in MCDI struct accessor
>>>>   common/sfc_efx/base: get netport fixed capabilities on probe
>>>>   common/sfc_efx/base: decode netport link state on probe path
>>>>   common/sfc_efx/base: fill in loopback modes on netport probe
>>>>   common/sfc_efx/base: introduce Medford4 stub for PHY methods
>>>>   common/sfc_efx/base: refactor EF10 link mode decoding helper
>>>>   common/sfc_efx/base: provide PHY link get method on Medford4
>>>>   common/sfc_efx/base: implement PHY link control for Medford4
>>>>   common/sfc_efx/base: introduce Medford4 stub for MAC methods
>>>>   common/sfc_efx/base: add MAC reconfigure method for Medford4
>>>>   common/sfc_efx/base: fill in software LUT for MAC statistics
>>>>   common/sfc_efx/base: fill in MAC statistics mask on Medford4
>>>>   common/sfc_efx/base: support MAC statistics on Medford4 NICs
>>>>   common/sfc_efx/base: implement MAC PDU controls for Medford4
>>>>   common/sfc_efx/base: correct MAC PDU calculation on Medford4
>>>>   net/sfc: make use of generic EFX MAC PDU calculation helpers
>>>>   common/sfc_efx/base: ignore legacy link events on new boards
>>>>   common/sfc_efx/base: add link event processing on new boards
>>>>   net/sfc: query link status on link change events on new NICs
>>>>   common/sfc_efx/base: subscribe to netport link change events
>>>>   net/sfc: offer support for 200G link ability on new adaptors
>>>>   common/sfc_efx/base: support controls for netport lane count
>>>>   net/sfc: add support for control of physical port lane count
>>>>   doc: advertise support for AMD Solarflare X45xx adapters
>>>>
>>>>  .mailmap                                      |    3 +-
>>>>  doc/guides/nics/sfc_efx.rst                   |    9 +-
>>>>  doc/guides/rel_notes/release_25_07.rst        |    4 +
>>>>  drivers/common/sfc_efx/base/ef10_ev.c         |   39 +
>>>>  drivers/common/sfc_efx/base/ef10_impl.h       |   19 +
>>>>  drivers/common/sfc_efx/base/ef10_nic.c        |   98 +-
>>>>  drivers/common/sfc_efx/base/ef10_phy.c        |   43 +-
>>>>  drivers/common/sfc_efx/base/ef10_tlv_layout.h |    9 +-
>>>>  drivers/common/sfc_efx/base/efx.h             |   98 +-
>>>>  drivers/common/sfc_efx/base/efx_check.h       |   24 +-
>>>>  drivers/common/sfc_efx/base/efx_ev.c          |    6 +
>>>>  drivers/common/sfc_efx/base/efx_filter.c      |    6 +
>>>>  drivers/common/sfc_efx/base/efx_impl.h        |  115 +-
>>>>  drivers/common/sfc_efx/base/efx_intr.c        |    6 +
>>>>  drivers/common/sfc_efx/base/efx_mac.c         |   56 +-
>>>>  drivers/common/sfc_efx/base/efx_mcdi.c        |   18 +-
>>>>  drivers/common/sfc_efx/base/efx_mcdi.h        |    2 +-
>>>>  drivers/common/sfc_efx/base/efx_nic.c         |   60 +
>>>>  drivers/common/sfc_efx/base/efx_np.c          | 1625 +++++
>>>>  drivers/common/sfc_efx/base/efx_phy.c         |   88 +-
>>>>  drivers/common/sfc_efx/base/efx_port.c        |    1 +
>>>>  drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5868 ++++++++++++++++-
>>>>  drivers/common/sfc_efx/base/efx_rx.c          |    6 +
>>>>  drivers/common/sfc_efx/base/efx_tunnel.c      |   18 +-
>>>>  drivers/common/sfc_efx/base/efx_tx.c          |   33 +
>>>>  drivers/common/sfc_efx/base/medford4_impl.h   |  110 +
>>>>  drivers/common/sfc_efx/base/medford4_mac.c    |  299 +
>>>>  drivers/common/sfc_efx/base/medford4_phy.c    |  156 +
>>>>  drivers/common/sfc_efx/base/meson.build       |    3 +
>>>>  drivers/common/sfc_efx/efsys.h                |    2 +
>>>>  drivers/common/sfc_efx/sfc_base_symbols.c     |    2 +
>>>>  drivers/net/sfc/sfc.c                         |    5 +-
>>>>  drivers/net/sfc/sfc.h                         |    4 +
>>>>  drivers/net/sfc/sfc_dp_tx.h                   |    3 +
>>>>  drivers/net/sfc/sfc_ef10_tx.c                 |   13 +-
>>>>  drivers/net/sfc/sfc_ethdev.c                  |  186 +-
>>>>  drivers/net/sfc/sfc_ev.c                      |   51 +-
>>>>  drivers/net/sfc/sfc_port.c                    |   27 +-
>>>>  drivers/net/sfc/sfc_repr.c                    |    7 +-
>>>>  drivers/net/sfc/sfc_repr.h                    |    1 +
>>>>  drivers/net/sfc/sfc_tx.c                      |    2 +
>>>>  41 files changed, 9000 insertions(+), 125 deletions(-)
>>>>  create mode 100644 drivers/common/sfc_efx/base/efx_np.c
>>>>  create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
>>>>  create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c
>>>>  create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c
>>>>
>>>
>>> Overall looks good but:
>>>  - need to fix build on FreeBSD, you are using an errno not available there.
>>>  - can you address some of the checkpatch warnings in the base code.
>>>
>>
>> I can fix the errno, yes. Thanks for catching this.
>>
>> As for the checkpatch warnings in the base code -- unfortunately, that part does
>> not follow DPDK style in general and has always triggered such warnings in DPDK.
>> Should I try to fix some anyway? Which, for instance?
>
> Mostly it is the use of BSD style parens on returns that clutters the warnings.
> I.e
> 	return (0);

I see. Unfortunately, this, as well as space character in 'sizeof ()', follows
the base driver's own style and it has been so for a long time. May be it is
acceptable to retain it. But I do care to comply with DPDK conventions in the
SFC driver itself. So shall I fix ENODATA->ENODEV and send v2?

Thank you.

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 00/46] Support AMD Solarflare X45xx adaptors
  2025-04-16 17:37       ` Ivan Malov
@ 2025-04-16 21:44         ` Stephen Hemminger
  0 siblings, 0 replies; 61+ messages in thread
From: Stephen Hemminger @ 2025-04-16 21:44 UTC (permalink / raw)
  To: Ivan Malov
  Cc: dev, Andrew Rybchenko, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On Wed, 16 Apr 2025 21:37:09 +0400 (+04)
Ivan Malov <ivan.malov@arknetworks.am> wrote:

> On Wed, 16 Apr 2025, Stephen Hemminger wrote:
> 
> > On Wed, 16 Apr 2025 19:38:58 +0400 (+04)
> > Ivan Malov <ivan.malov@arknetworks.am> wrote:
> >  
> >> On Wed, 16 Apr 2025, Stephen Hemminger wrote:
> >>  
> >>> On Wed, 16 Apr 2025 17:59:30 +0400
> >>> Ivan Malov <ivan.malov@arknetworks.am> wrote:
> >>>  
> >>>> New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
> >>>> Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
> >>>> supports multiple network engine types. This series provides support
> >>>> only for the Medford2-alike, 'full-feature' (FF) network engine. This
> >>>> shall not be confused with the concept of 'datapath FW variants': the
> >>>> FF network engine supports both 'full-feature' and 'ultra-low-latency'
> >>>> datapath FW variants, with corresponding Medford2-alike feature sets.
> >>>>
> >>>> The first part of the series provides general support for the adaptors,
> >>>> whilst the second one adds support for the new management controller
> >>>> interface for configuration of network port features (netport MCDI).
> >>>>
> >>>> For now, only support for physical functions (PFs) is concerned. There
> >>>> is a small number of TODO and FIXME markings in the code. Those are
> >>>> normal at this development stage and will be removed by future patches
> >>>> when VF support has fleshed out.
> >>>>
> >>>>
> >>>> Andy Moreton (3):
> >>>>   common/sfc_efx/base: update X4 BAR layout and PCI IDs
> >>>>   net/sfc: add Medford4 with only full feature datapath engine
> >>>>   common/sfc_efx/base: add port mode for 8 port hardware
> >>>>
> >>>> Denis Pryazhennikov (15):
> >>>>   common/sfc_efx/base: add Medford4 PCI IDs to common code
> >>>>   common/sfc_efx/base: add efsys option for Medford4
> >>>>   common/sfc_efx/base: add Medford4 support to NIC module
> >>>>   common/sfc_efx/base: add Medford4 support to EV module
> >>>>   common/sfc_efx/base: add Medford4 support to FILTER module
> >>>>   common/sfc_efx/base: add Medford4 support to INTR module
> >>>>   common/sfc_efx/base: add Medford4 support to MAC module
> >>>>   common/sfc_efx/base: add Medford4 support to PHY module
> >>>>   common/sfc_efx/base: add Medford4 support to TUNNEL module
> >>>>   common/sfc_efx/base: add Medford4 support to MCDI module
> >>>>   common/sfc_efx/base: add Medford4 support to Rx module
> >>>>   common/sfc_efx/base: add Medford4 support to Tx module
> >>>>   drivers: enable support for AMD Solarflare X4 adapter family
> >>>>   common/sfc_efx/base: add new X4 port mode
> >>>>   common/sfc_efx/base: extend list of supported X4 port modes
> >>>>
> >>>> Ivan Malov (28):
> >>>>   common/sfc_efx/base: update MCDI headers
> >>>>   common/sfc_efx/base: provide a stub for basic netport attach
> >>>>   common/sfc_efx/base: provide defaults on netport attach path
> >>>>   common/sfc_efx/base: obtain assigned netport handle from NIC
> >>>>   common/sfc_efx/base: allow for const in MCDI struct accessor
> >>>>   common/sfc_efx/base: get netport fixed capabilities on probe
> >>>>   common/sfc_efx/base: decode netport link state on probe path
> >>>>   common/sfc_efx/base: fill in loopback modes on netport probe
> >>>>   common/sfc_efx/base: introduce Medford4 stub for PHY methods
> >>>>   common/sfc_efx/base: refactor EF10 link mode decoding helper
> >>>>   common/sfc_efx/base: provide PHY link get method on Medford4
> >>>>   common/sfc_efx/base: implement PHY link control for Medford4
> >>>>   common/sfc_efx/base: introduce Medford4 stub for MAC methods
> >>>>   common/sfc_efx/base: add MAC reconfigure method for Medford4
> >>>>   common/sfc_efx/base: fill in software LUT for MAC statistics
> >>>>   common/sfc_efx/base: fill in MAC statistics mask on Medford4
> >>>>   common/sfc_efx/base: support MAC statistics on Medford4 NICs
> >>>>   common/sfc_efx/base: implement MAC PDU controls for Medford4
> >>>>   common/sfc_efx/base: correct MAC PDU calculation on Medford4
> >>>>   net/sfc: make use of generic EFX MAC PDU calculation helpers
> >>>>   common/sfc_efx/base: ignore legacy link events on new boards
> >>>>   common/sfc_efx/base: add link event processing on new boards
> >>>>   net/sfc: query link status on link change events on new NICs
> >>>>   common/sfc_efx/base: subscribe to netport link change events
> >>>>   net/sfc: offer support for 200G link ability on new adaptors
> >>>>   common/sfc_efx/base: support controls for netport lane count
> >>>>   net/sfc: add support for control of physical port lane count
> >>>>   doc: advertise support for AMD Solarflare X45xx adapters
> >>>>
> >>>>  .mailmap                                      |    3 +-
> >>>>  doc/guides/nics/sfc_efx.rst                   |    9 +-
> >>>>  doc/guides/rel_notes/release_25_07.rst        |    4 +
> >>>>  drivers/common/sfc_efx/base/ef10_ev.c         |   39 +
> >>>>  drivers/common/sfc_efx/base/ef10_impl.h       |   19 +
> >>>>  drivers/common/sfc_efx/base/ef10_nic.c        |   98 +-
> >>>>  drivers/common/sfc_efx/base/ef10_phy.c        |   43 +-
> >>>>  drivers/common/sfc_efx/base/ef10_tlv_layout.h |    9 +-
> >>>>  drivers/common/sfc_efx/base/efx.h             |   98 +-
> >>>>  drivers/common/sfc_efx/base/efx_check.h       |   24 +-
> >>>>  drivers/common/sfc_efx/base/efx_ev.c          |    6 +
> >>>>  drivers/common/sfc_efx/base/efx_filter.c      |    6 +
> >>>>  drivers/common/sfc_efx/base/efx_impl.h        |  115 +-
> >>>>  drivers/common/sfc_efx/base/efx_intr.c        |    6 +
> >>>>  drivers/common/sfc_efx/base/efx_mac.c         |   56 +-
> >>>>  drivers/common/sfc_efx/base/efx_mcdi.c        |   18 +-
> >>>>  drivers/common/sfc_efx/base/efx_mcdi.h        |    2 +-
> >>>>  drivers/common/sfc_efx/base/efx_nic.c         |   60 +
> >>>>  drivers/common/sfc_efx/base/efx_np.c          | 1625 +++++
> >>>>  drivers/common/sfc_efx/base/efx_phy.c         |   88 +-
> >>>>  drivers/common/sfc_efx/base/efx_port.c        |    1 +
> >>>>  drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5868 ++++++++++++++++-
> >>>>  drivers/common/sfc_efx/base/efx_rx.c          |    6 +
> >>>>  drivers/common/sfc_efx/base/efx_tunnel.c      |   18 +-
> >>>>  drivers/common/sfc_efx/base/efx_tx.c          |   33 +
> >>>>  drivers/common/sfc_efx/base/medford4_impl.h   |  110 +
> >>>>  drivers/common/sfc_efx/base/medford4_mac.c    |  299 +
> >>>>  drivers/common/sfc_efx/base/medford4_phy.c    |  156 +
> >>>>  drivers/common/sfc_efx/base/meson.build       |    3 +
> >>>>  drivers/common/sfc_efx/efsys.h                |    2 +
> >>>>  drivers/common/sfc_efx/sfc_base_symbols.c     |    2 +
> >>>>  drivers/net/sfc/sfc.c                         |    5 +-
> >>>>  drivers/net/sfc/sfc.h                         |    4 +
> >>>>  drivers/net/sfc/sfc_dp_tx.h                   |    3 +
> >>>>  drivers/net/sfc/sfc_ef10_tx.c                 |   13 +-
> >>>>  drivers/net/sfc/sfc_ethdev.c                  |  186 +-
> >>>>  drivers/net/sfc/sfc_ev.c                      |   51 +-
> >>>>  drivers/net/sfc/sfc_port.c                    |   27 +-
> >>>>  drivers/net/sfc/sfc_repr.c                    |    7 +-
> >>>>  drivers/net/sfc/sfc_repr.h                    |    1 +
> >>>>  drivers/net/sfc/sfc_tx.c                      |    2 +
> >>>>  41 files changed, 9000 insertions(+), 125 deletions(-)
> >>>>  create mode 100644 drivers/common/sfc_efx/base/efx_np.c
> >>>>  create mode 100644 drivers/common/sfc_efx/base/medford4_impl.h
> >>>>  create mode 100644 drivers/common/sfc_efx/base/medford4_mac.c
> >>>>  create mode 100644 drivers/common/sfc_efx/base/medford4_phy.c
> >>>>  
> >>>
> >>> Overall looks good but:
> >>>  - need to fix build on FreeBSD, you are using an errno not available there.
> >>>  - can you address some of the checkpatch warnings in the base code.
> >>>  
> >>
> >> I can fix the errno, yes. Thanks for catching this.
> >>
> >> As for the checkpatch warnings in the base code -- unfortunately, that part does
> >> not follow DPDK style in general and has always triggered such warnings in DPDK.
> >> Should I try to fix some anyway? Which, for instance?  
> >
> > Mostly it is the use of BSD style parens on returns that clutters the warnings.
> > I.e
> > 	return (0);  
> 
> I see. Unfortunately, this, as well as space character in 'sizeof ()', follows
> the base driver's own style and it has been so for a long time. May be it is
> acceptable to retain it. But I do care to comply with DPDK conventions in the
> SFC driver itself. So shall I fix ENODATA->ENODEV and send v2?

As long as isn't too weird, base code can follow a slightly different set
of rules. Please send v2 and do a test build on FreeBSD (in a vm is fine).


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4
  2025-04-16 13:59 ` [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4 Ivan Malov
@ 2025-04-17  7:08   ` Andrew Rybchenko
  2025-04-17 15:07     ` Stephen Hemminger
  0 siblings, 1 reply; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  7:08 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 16:59, Ivan Malov wrote:
> From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
> 
> Later patches will use this to implement support for Medford4.
> 
> Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
> Reviewed-by: Andy Moreton <andy.moreton@amd.com>
> ---
>   drivers/common/sfc_efx/base/efx_check.h | 24 ++++++++++++++----------
>   drivers/common/sfc_efx/efsys.h          |  2 ++
>   2 files changed, 16 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
> index 66b38eeae0..0b9f4fb516 100644
> --- a/drivers/common/sfc_efx/base/efx_check.h
> +++ b/drivers/common/sfc_efx/base/efx_check.h

[snip]

> @@ -197,7 +198,7 @@
>   
>   #if EFSYS_OPT_IMAGE_LAYOUT
>   /* Support signed image layout handling */
> -# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
> +# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || EFSYS_OPT_MEDFORD4)
>   #  error "IMAGE_LAYOUT requires MEDFORD or MEDFORD2"

MEDRORD4 is lost here in error message

>   # endif
>   #endif /* EFSYS_OPT_IMAGE_LAYOUT */
> @@ -338,8 +339,10 @@
>   
>   #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
>   /* Support adapters with missing static config (for factory use only) */
> -# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
> -#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
> +# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || \
> +	EFSYS_OPT_MEDFORD4)
> +#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2 " \
> +	"or MEDFORD4"

Typically it is a bad idea to split error message since it complicates grep.
Please, double-check that base driver code style requires.
As far as I remember - no.

>   # endif
>   #endif /* EFSYS_OPT_ALLOW_UNCONFIGURED_NIC */
>   

[snip]


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 03/46] common/sfc_efx/base: add Medford4 support to NIC module
  2025-04-16 13:59 ` [PATCH 03/46] common/sfc_efx/base: add Medford4 support to NIC module Ivan Malov
@ 2025-04-17  7:14   ` Andrew Rybchenko
  0 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  7:14 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 16:59, Ivan Malov wrote:
> From: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
> 
> Implement NIC family discovery and minimum probe support.
> 
> Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
> Reviewed-by: Andy Moreton <andy.moreton@amd.com>

[snip]

> @@ -1922,6 +1923,36 @@ static struct ef10_external_port_map_s {
>   		(1U << TLV_PORT_MODE_1x1_1x1),			/* mode 2 */
>   		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
>   	},
> +	/*
> +	 * Modes that on Medford4 allocate 2 adjacent port numbers to cage 1
> +	 * and the rest to cage 2.
> +	 *	port 0 -> cage 1
> +	 *	port 1 -> cage 1
> +	 *	port 2 -> cage 2
> +	 *	port 3 -> cage 2
> +	 */
> +	{
> +		EFX_FAMILY_MEDFORD4,
> +		(1U << TLV_PORT_MODE_2x1_2x1) |			/* mode 5 */
> +		(1U << TLV_PORT_MODE_2x1_1x4) |			/* mode 7 */
> +		(1U << TLV_PORT_MODE_2x2_NA) |			/* mode 13 */
> +		(1U << TLV_PORT_MODE_2x1_1x2),			/* mode 18 */
> +		{ 0, 2, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
> +	},
> +	/*
> +	 * Modes that on Medford4 allocate up to 4 adjacent port numbers
> +	 * to cage 1.
> +	 *	port 0 -> cage 1
> +	 *	port 1 -> cage 1
> +	 *	port 2 -> cage 1
> +	 *	port 3 -> cage 1
> +	 */
> +	{
> +		EFX_FAMILY_MEDFORD4,
> +		(1U << TLV_PORT_MODE_4x1_NA),			/* mode 4 */
> +		{ 0, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
> +	},
> +	/* FIXME: review Medford4 port modes */

Is it still true at the moment of submission?

>   };
>   
>   static	__checkReturn	efx_rc_t
> diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
> index dabf2e0e0b..442dfa0830 100644
> --- a/drivers/common/sfc_efx/base/efx.h
> +++ b/drivers/common/sfc_efx/base/efx.h
> @@ -190,6 +190,7 @@ efx_family_probe_bar(
>   /* FIXME Fix it when memory bar is fixed in FPGA image. It must be 0. */
>   #define	EFX_MEM_BAR_RIVERHEAD			2
>   
> +#define	EFX_MEM_BAR_MEDFORD4			0

IMHO it is wrong that you add it here and fix in later patches.
It just adds noise to mailing list and git blame.
IMHO fix should be squashed and correct BAR should be specified
from the very beginning.

>   
>   /* Error codes */
>   

[snip]

> diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
> index 172488e083..5bcc0a04ff 100644
> --- a/drivers/common/sfc_efx/base/efx_nic.c
> +++ b/drivers/common/sfc_efx/base/efx_nic.c
> @@ -79,6 +79,19 @@ efx_family(
>   			return (0);
>   #endif /* EFSYS_OPT_MEDFORD2 */
>   
> +#if EFSYS_OPT_MEDFORD4
> +		case EFX_PCI_DEVID_MEDFORD4_PF_UNINIT:
> +			/*
> +			 * Hardware default for PF0 of uninitialised Medford4.
> +			 * manftest must be able to cope with this device id.
> +			 */
> +		case EFX_PCI_DEVID_MEDFORD4:
> +		case EFX_PCI_DEVID_MEDFORD4_VF:
> +			*efp = EFX_FAMILY_MEDFORD4;
> +			*membarp = EFX_MEM_BAR_MEDFORD4;
> +			return (0);
> +#endif /* EFSYS_OPT_MEDFORD4 */
> +

It is a dead code from build point of view if I stop on the patch since
EFSYS_OPT_MEDFORD4 is 0. May be it is OK, but I'd like to ensure that
you have checked it if EFSYS_OPT_MEDFORD4==1 before the patch to avoid
build fixes noise later.

Same for all similar blocks below and subsequent patches.

>   		case EFX_PCI_DEVID_FALCON:	/* Obsolete, not supported */
>   		default:
>   			break;

[snip]



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 30/46] common/sfc_efx/base: implement PHY link control for Medford4
  2025-04-16 14:00 ` [PATCH 30/46] common/sfc_efx/base: implement PHY link control for Medford4 Ivan Malov
@ 2025-04-17  7:31   ` Andrew Rybchenko
  0 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  7:31 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 17:00, Ivan Malov wrote:
> Use new MCDI to select loopback, speed, flow control and FEC.
> 
> Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
> Reviewed-by: Andy Moreton <andy.moreton@amd.com>
> Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>

[snip]

> +static					void
> +efx_np_cap_sw_mask_to_hw_enum(
> +	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
> +	__in				unsigned int hw_sw_map_nentries,
> +	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
> +	__in				size_t hw_cap_data_nbytes,
> +	__in				uint32_t mask_sw,
> +	__out				boolean_t *supportedp,
> +	__out_opt			uint16_t *enum_hwp)
> +{
> +	unsigned int sw_nflags_req = 0;
> +	unsigned int sw_nflags_sup = 0;
> +	uint32_t sw_check_mask = 0;
> +	unsigned int i;
> +
> +	for (i = 0; i < hw_sw_map_nentries; ++i) {
> +		uint32_t flag_sw = 1U << hw_sw_map->encm_sw;
> +		unsigned int byte_idx = CAP_BYTE(hw_sw_map);
> +		uint8_t flag_hw = CAP_FLAG(hw_sw_map);
> +
> +		if (byte_idx >= hw_cap_data_nbytes) {
> +			++(hw_sw_map);
> +			continue;
> +		}
> +
> +		if ((mask_sw & flag_sw) == flag_sw) {
> +			if ((sw_check_mask & flag_sw) == 0)
> +				++(sw_nflags_req);
> +
> +			sw_check_mask |= flag_sw;
> +
> +			if ((hw_cap_data[byte_idx] & flag_hw) == flag_hw) {
> +				mask_sw &= ~(flag_sw);
> +
> +				if (enum_hwp != NULL)
> +					*enum_hwp = hw_sw_map->encm_hw;
> +			}
> +		}
> +
> +		++(hw_sw_map);
> +	}
> +
> +	/*
> +	 * FIXME: in the absence of autonegotiation capability, drivers
> +	 * may still pass multiple capability bits of the same category.
> +	 * That is supposed to work on EF10; do not enforce below check.
> +	 */
> +#if 0

It looks rather strange when code with #if 0 comes.

> +	if (sw_nflags_req != 1) {
> +		/*
> +		 * The mask must contain exactly one relevant
> +		 * flag which represents some specific choice.
> +		 */
> +		*supportedp = B_FALSE;
> +		return;
> +	}
> +#endif
> +
> +	if (sw_check_mask != 0 && (mask_sw & sw_check_mask) == sw_check_mask) {
> +		/* Failed to select the enum by at least one capability bit. */
> +		*supportedp = B_FALSE;
> +		return;
> +	}
> +
> +	*supportedp = B_TRUE;
> +}

[snip]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 32/46] common/sfc_efx/base: add MAC reconfigure method for Medford4
  2025-04-16 14:00 ` [PATCH 32/46] common/sfc_efx/base: add MAC reconfigure method for Medford4 Ivan Malov
@ 2025-04-17  7:34   ` Andrew Rybchenko
  0 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  7:34 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 17:00, Ivan Malov wrote:
> That leverages MAC control functionality of new netport MCDI.
> 
> Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
> Reviewed-by: Andy Moreton <andy.moreton@amd.com>
> Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>
> ---
>   drivers/common/sfc_efx/base/efx_impl.h      | 13 ++++
>   drivers/common/sfc_efx/base/efx_mac.c       |  2 +-
>   drivers/common/sfc_efx/base/efx_np.c        | 73 +++++++++++++++++++++
>   drivers/common/sfc_efx/base/medford4_impl.h |  5 ++
>   drivers/common/sfc_efx/base/medford4_mac.c  | 32 +++++++++
>   5 files changed, 124 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
> index 15cf62506e..ac1cd5292b 100644
> --- a/drivers/common/sfc_efx/base/efx_impl.h
> +++ b/drivers/common/sfc_efx/base/efx_impl.h
> @@ -1947,6 +1947,19 @@ efx_np_link_ctrl(
>   	__in		uint32_t cap_mask_sw,
>   	__in		boolean_t fcntl_an);
>   
> +typedef struct efx_np_mac_ctrl_s {
> +	boolean_t	enmc_fcntl_autoneg;
> +	boolean_t	enmc_include_fcs;
> +	uint32_t	enmc_fcntl;
> +} efx_np_mac_ctrl_t;
> +
> +LIBEFX_INTERNAL
> +extern	__checkReturn	efx_rc_t
> +efx_np_mac_ctrl(
> +	__in		efx_nic_t *enp,
> +	__in		efx_np_handle_t nph,
> +	__in		const efx_np_mac_ctrl_t *mc);
> +
>   #ifdef	__cplusplus
>   }
>   #endif
> diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
> index dde0e5ab87..3c29db0016 100644
> --- a/drivers/common/sfc_efx/base/efx_mac.c
> +++ b/drivers/common/sfc_efx/base/efx_mac.c
> @@ -96,7 +96,7 @@ static const efx_mac_ops_t	__efx_mac_medford4_ops = {
>   	ef10_mac_addr_set,			/* emo_addr_set */
>   	ef10_mac_pdu_set,			/* emo_pdu_set */
>   	ef10_mac_pdu_get,			/* emo_pdu_get */
> -	ef10_mac_reconfigure,			/* emo_reconfigure */
> +	medford4_mac_reconfigure,		/* emo_reconfigure */
>   	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
>   	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
>   	ef10_mac_filter_default_rxq_clear,
> diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
> index 03d49b9c78..826ee93f0f 100644
> --- a/drivers/common/sfc_efx/base/efx_np.c
> +++ b/drivers/common/sfc_efx/base/efx_np.c
> @@ -923,6 +923,79 @@ efx_np_link_ctrl(
>   fail2:
>   	EFSYS_PROBE(fail2);
>   
> +fail1:
> +	EFSYS_PROBE1(fail1, efx_rc_t, rc);
> +	return (rc);
> +}
> +
> +	__checkReturn	efx_rc_t
> +efx_np_mac_ctrl(
> +	__in		efx_nic_t *enp,
> +	__in		efx_np_handle_t nph,
> +	__in		const efx_np_mac_ctrl_t *mc)
> +{
> +	EFX_MCDI_DECLARE_BUF(payload,
> +	    MC_CMD_MAC_CTRL_IN_LEN,
> +	    MC_CMD_MAC_CTRL_OUT_LEN);
> +	efx_mcdi_req_t req;
> +	uint32_t flags = 0;
> +	uint32_t cfg = 0;
> +	uint32_t fcntl;
> +	efx_rc_t rc;
> +
> +	req.emr_out_length = MC_CMD_MAC_CTRL_OUT_LEN;
> +	req.emr_in_length = MC_CMD_MAC_CTRL_IN_LEN;
> +	req.emr_cmd = MC_CMD_MAC_CTRL;
> +	req.emr_out_buf = payload;
> +	req.emr_in_buf = payload;
> +
> +	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_PORT_HANDLE, nph);
> +
> +	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_INCLUDE_FCS;
> +	if (mc->enmc_include_fcs != B_FALSE)
> +		flags |= 1U << MC_CMD_MAC_FLAGS_FLAG_INCLUDE_FCS;
> +
> +	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_FLAGS, flags);
> +
> +	if (mc->enmc_fcntl_autoneg != B_FALSE) {
> +		fcntl = MC_CMD_FCNTL_AUTO;
> +	} else {
> +		switch (mc->enmc_fcntl) {
> +		case 0:
> +			fcntl = MC_CMD_FCNTL_OFF;
> +			break;
> +		case EFX_FCNTL_RESPOND:
> +			fcntl = MC_CMD_FCNTL_RESPOND;
> +			break;
> +		case EFX_FCNTL_GENERATE:
> +			fcntl = MC_CMD_FCNTL_GENERATE;
> +			break;
> +		case EFX_FCNTL_RESPOND | EFX_FCNTL_GENERATE:
> +			fcntl = MC_CMD_FCNTL_BIDIR;
> +			break;
> +		default:
> +			rc = EINVAL;
> +			goto fail1;
> +		}
> +	}
> +
> +	cfg |= 1U << MC_CMD_MAC_CONFIG_OPTIONS_CFG_FCNTL;
> +	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_FCNTL, fcntl);
> +
> +	MCDI_IN_SET_DWORD(req, MAC_CTRL_IN_V2_CONTROL_FLAGS, cfg);
> +
> +	efx_mcdi_execute(enp, &req);
> +
> +	if (req.emr_rc != 0) {
> +		rc = req.emr_rc;
> +		goto fail2;
> +	}
> +
> +	return (0);
> +
> +fail2:
> +	EFSYS_PROBE(fail2);
> +
>   fail1:
>   	EFSYS_PROBE1(fail1, efx_rc_t, rc);
>   	return (rc);
> diff --git a/drivers/common/sfc_efx/base/medford4_impl.h b/drivers/common/sfc_efx/base/medford4_impl.h
> index 6aa065c730..8b232c516a 100644
> --- a/drivers/common/sfc_efx/base/medford4_impl.h
> +++ b/drivers/common/sfc_efx/base/medford4_impl.h
> @@ -51,6 +51,11 @@ medford4_mac_up(
>   	__in		efx_nic_t *enp,
>   	__out		boolean_t *mac_upp);
>   
> +LIBEFX_INTERNAL
> +extern	__checkReturn		efx_rc_t
> +medford4_mac_reconfigure(
> +	__in			efx_nic_t *enp);
> +
>   #ifdef	__cplusplus
>   }
>   #endif
> diff --git a/drivers/common/sfc_efx/base/medford4_mac.c b/drivers/common/sfc_efx/base/medford4_mac.c
> index 57ddbecfaa..c037c29b92 100644
> --- a/drivers/common/sfc_efx/base/medford4_mac.c
> +++ b/drivers/common/sfc_efx/base/medford4_mac.c
> @@ -47,6 +47,38 @@ medford4_mac_up(
>   	*mac_upp = els.els_mac_up;
>   	return (0);
>   
> +fail1:
> +	EFSYS_PROBE1(fail1, efx_rc_t, rc);
> +	return (rc);
> +}
> +
> +	__checkReturn		efx_rc_t
> +medford4_mac_reconfigure(
> +	__in			efx_nic_t *enp)
> +{
> +	efx_port_t *epp = &(enp->en_port);
> +	efx_np_mac_ctrl_t mc = {0};
> +	efx_rc_t rc;
> +
> +	mc.enmc_fcntl_autoneg = epp->ep_fcntl_autoneg;
> +	mc.enmc_include_fcs = epp->ep_include_fcs;
> +	mc.enmc_fcntl = epp->ep_fcntl;
> +
> +	rc = efx_np_mac_ctrl(enp, epp->ep_np_handle, &mc);
> +	if (rc != 0)
> +		goto fail1;
> +
> +	/*
> +	 * Apply the filters for the MAC configuration. If the NIC isn't ready
> +	 * to accept filters, this may return success without setting anything.
> +	 */
> +	rc = efx_filter_reconfigure(enp, epp->ep_mac_addr,
> +				    epp->ep_all_unicst, epp->ep_mulcst,
> +				    epp->ep_all_mulcst, epp->ep_brdcst,
> +				    epp->ep_mulcst_addr_list,
> +				    epp->ep_mulcst_addr_count);

I'm sorry, but above comments are insufficient for me to understand why
ignoring rc is OK and it looks like a bug.

> +	return (0);
> +
>   fail1:
>   	EFSYS_PROBE1(fail1, efx_rc_t, rc);
>   	return (rc);


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 35/46] common/sfc_efx/base: support MAC statistics on Medford4 NICs
  2025-04-16 14:00 ` [PATCH 35/46] common/sfc_efx/base: support MAC statistics on Medford4 NICs Ivan Malov
@ 2025-04-17  7:43   ` Andrew Rybchenko
  0 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  7:43 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 17:00, Ivan Malov wrote:
> Supply Medford4-specific methods to clear, upload and update
> MAC statistics, as well as the method to toggle periodic DMA
> updates. All of these leverage the same netport MCDI command.
> 
> Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
> Reviewed-by: Andy Moreton <andy.moreton@amd.com>
> Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>

[snip]

> diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
> index eb1b68b17e..31fcb361f2 100644
> --- a/drivers/common/sfc_efx/base/ef10_nic.c
> +++ b/drivers/common/sfc_efx/base/ef10_nic.c
> @@ -2523,7 +2523,9 @@ ef10_nic_probe(
>   
>   #if EFSYS_OPT_MAC_STATS
>   	/* Wipe the MAC statistics */
> -	if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
> +
> +	rc = efx_mcdi_mac_stats_clear(enp);
> +	if (rc != 0)

it looks like unrelated style change.

>   		goto fail6;
>   #endif
>   

[snip]

> diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
> index d4ee17ffb4..df836f09a6 100644
> --- a/drivers/common/sfc_efx/base/efx_np.c
> +++ b/drivers/common/sfc_efx/base/efx_np.c
> @@ -1291,3 +1291,92 @@ efx_np_mac_ctrl(
>   	EFSYS_PROBE1(fail1, efx_rc_t, rc);
>   	return (rc);
>   }
> +
> +#if EFSYS_OPT_MAC_STATS
> +	__checkReturn	efx_rc_t
> +efx_np_mac_stats(
> +	__in		efx_nic_t *enp,
> +	__in		efx_np_handle_t nph,
> +	__in		efx_stats_action_t action,
> +	__in_opt	const efsys_mem_t *esmp,
> +	__in		uint16_t period_ms)
> +{
> +	EFX_MCDI_DECLARE_BUF(payload,
> +	    MC_CMD_GET_NETPORT_STATISTICS_IN_LEN,
> +	    MC_CMD_GET_NETPORT_STATISTICS_OUT_LENMIN);
> +	int enable = (action == EFX_STATS_ENABLE_NOEVENTS);
> +	int events = (action == EFX_STATS_ENABLE_EVENTS);
> +	int disable = (action == EFX_STATS_DISABLE);
> +	int upload = (action == EFX_STATS_UPLOAD);
> +	int clear = (action == EFX_STATS_CLEAR);

IMHO boolean_t should be used for 5 above variables.

> +	efx_mcdi_req_t req;
> +	efx_rc_t rc;

[snip]

> +
> +		/* TODO: validate encp->enc_mac_stats_nstats */

TODO again. The new code is full of TODO and FIXME. It looks like it has
huge backlog. What's the problem to fix the TODO? Is the driver really
ready?

> +		sz = encp->enc_mac_stats_nstats * sizeof (efx_qword_t);
> +
[snip]

> +	__checkReturn		efx_rc_t
> +medford4_mac_stats_periodic(
> +	__in			efx_nic_t *enp,
> +	__in			efsys_mem_t *esmp,
> +	__in			uint16_t period_ms,
> +	__in			boolean_t events)
> +{
> +	efx_port_t *epp = &(enp->en_port);
> +	efx_rc_t rc;
> +
> +	if (period_ms == 0) {
> +		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
> +			    EFX_STATS_DISABLE, NULL, 0);
> +	} else if (events != B_FALSE) {
> +		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
> +			    EFX_STATS_ENABLE_EVENTS, esmp, period_ms);
> +	} else {
> +		rc = efx_np_mac_stats(enp, epp->ep_np_handle,
> +			    EFX_STATS_ENABLE_NOEVENTS, esmp, period_ms);
> +	}
> +
> +	if (rc != 0)
> +		goto fail1;
> +
> +	return (0);
> +
> +fail1:
> +	EFSYS_PROBE1(fail1, efx_rc_t, rc);
> +	return (rc);
> +}
> +
> +#define	MEDFORD4_MAC_STAT_READ(_esmp, _field, _eqp)			\
> +	EFSYS_MEM_READQ((_esmp), (_field) * sizeof (efx_qword_t), _eqp)
> +
> +	__checkReturn			efx_rc_t
> +medford4_mac_stats_update(
> +	__in				efx_nic_t *enp,
> +	__in				efsys_mem_t *esmp,
> +	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stats,
> +	__inout_opt			uint32_t *generationp)
> +{
> +	const efx_nic_cfg_t *encp = &enp->en_nic_cfg;
> +	efx_port_t *epp = &(enp->en_port);
> +	efx_qword_t generation_start;
> +	efx_qword_t generation_end;
> +	unsigned int i;
> +	efx_rc_t rc;
> +
> +	/* TODO: validate encp->enc_mac_stats_nstats */
> +	if (EFSYS_MEM_SIZE(esmp) <
> +	    (encp->enc_mac_stats_nstats * sizeof (efx_qword_t))) {
> +		/* DMA buffer too small */
> +		rc = ENOSPC;
> +		goto fail1;
> +	}
> +
> +	/* Read END first so we don't race with the MC */
> +	EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFSYS_MEM_SIZE(esmp));
> +	MEDFORD4_MAC_STAT_READ(esmp, (encp->enc_mac_stats_nstats - 1),
> +	    &generation_end);
> +	EFSYS_MEM_READ_BARRIER();
> +
> +	for (i = 0; i < EFX_ARRAY_SIZE(epp->ep_np_mac_stat_lut); ++i) {
> +		efx_qword_t value;
> +
> +		if (epp->ep_np_mac_stat_lut[i].ens_valid == B_FALSE)
> +			continue;
> +
> +		MEDFORD4_MAC_STAT_READ(esmp,
> +		    epp->ep_np_mac_stat_lut[i].ens_dma_fld, &value);
> +
> +		EFSYS_STAT_SET_QWORD(&(stats[i]), &value);
> +	}
> +
> +	/* TODO: care about VADAPTOR statistics */

TODO again

> +
> +	/* Read START generation counter */
> +	EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFSYS_MEM_SIZE(esmp));
> +	EFSYS_MEM_READ_BARRIER();
> +
> +	/* FIXME: we never parse marker descriptors; assume start is 0 offset */

FIXME again

> +	MEDFORD4_MAC_STAT_READ(esmp, 0, &generation_start);
> +
> +	/* Check that we didn't read the stats in the middle of a DMA */
> +	if (memcmp(&generation_start, &generation_end,
> +		    sizeof (generation_start)) != 0)
> +		return (EAGAIN);
> +
> +	if (generationp != NULL)
> +		*generationp = EFX_QWORD_FIELD(generation_start, EFX_DWORD_0);
> +
> +	return (0);
> +
> +fail1:
> +	EFSYS_PROBE1(fail1, efx_rc_t, rc);
> +	return (rc);
> +}
> +
> +#undef MEDFORD4_MAC_STAT_READ
>   #endif /* EFSYS_OPT_MAC_STATS */
>   #endif /* EFSYS_OPT_MEDFORD4 */


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 44/46] common/sfc_efx/base: support controls for netport lane count
  2025-04-16 14:00 ` [PATCH 44/46] common/sfc_efx/base: support controls for netport lane count Ivan Malov
@ 2025-04-17  7:57   ` Andrew Rybchenko
  0 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  7:57 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 17:00, Ivan Malov wrote:
> On netport MCDI capable adaptors, link modes exported by libefx can be
> backed by different technologies with different lane counts. Allow the
> client drivers to get and set the lane count and query possible values.
> 
> Signed-off-by: Ivan Malov <ivan.malov@arknetworks.am>
> Reviewed-by: Andy Moreton <andy.moreton@amd.com>
> Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuuren@amd.com>

[snip]

> @@ -1190,8 +1357,9 @@ efx_np_link_ctrl(
>   
>   		rc = efx_np_sw_link_mode_to_cap(loopback_link_mode,
>   					    &cap_enum_sw);
> -		if (rc != 0)
> +		if (rc != 0) {
>   			goto fail2;
> +		}

Looks like unrelated style change

>   
>   		EFX_NP_CAP_ENUM_SW_TO_HW(efx_np_cap_map_tech,
>   		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_enum_sw,


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 00/46] Support AMD Solarflare X45xx adaptors
  2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
                   ` (46 preceding siblings ...)
  2025-04-16 15:14 ` [PATCH 00/46] Support AMD Solarflare X45xx adaptors Stephen Hemminger
@ 2025-04-17  8:09 ` Andrew Rybchenko
  47 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-17  8:09 UTC (permalink / raw)
  To: Ivan Malov, dev
  Cc: Denis Pryazhennikov, Andy Moreton, Pieter Jansen Van Vuuren,
	Viacheslav Galaktionov

On 4/16/25 16:59, Ivan Malov wrote:
> New X4522 (dual port SFP56) and X4542 (dual port QSFP56) adaptors are
> Medford4 (X4) chips that are based on EF10 architecture. An X4 NIC
> supports multiple network engine types. This series provides support
> only for the Medford2-alike, 'full-feature' (FF) network engine. This
> shall not be confused with the concept of 'datapath FW variants': the
> FF network engine supports both 'full-feature' and 'ultra-low-latency'
> datapath FW variants, with corresponding Medford2-alike feature sets.
> 
> The first part of the series provides general support for the adaptors,
> whilst the second one adds support for the new management controller
> interface for configuration of network port features (netport MCDI).
> 
> For now, only support for physical functions (PFs) is concerned. There
> is a small number of TODO and FIXME markings in the code. Those are
> normal at this development stage and will be removed by future patches
> when VF support has fleshed out.

In fact number of TODO and FIXME is frightening. But it is up to you.

Other than that, there are few nits in patches.
Overall looks good.

> Andy Moreton (3):
>    common/sfc_efx/base: update X4 BAR layout and PCI IDs
>    net/sfc: add Medford4 with only full feature datapath engine
>    common/sfc_efx/base: add port mode for 8 port hardware
> 
> Denis Pryazhennikov (15):
>    common/sfc_efx/base: add Medford4 PCI IDs to common code
>    common/sfc_efx/base: add efsys option for Medford4
>    common/sfc_efx/base: add Medford4 support to NIC module
>    common/sfc_efx/base: add Medford4 support to EV module
>    common/sfc_efx/base: add Medford4 support to FILTER module
>    common/sfc_efx/base: add Medford4 support to INTR module
>    common/sfc_efx/base: add Medford4 support to MAC module
>    common/sfc_efx/base: add Medford4 support to PHY module
>    common/sfc_efx/base: add Medford4 support to TUNNEL module
>    common/sfc_efx/base: add Medford4 support to MCDI module
>    common/sfc_efx/base: add Medford4 support to Rx module
>    common/sfc_efx/base: add Medford4 support to Tx module
>    drivers: enable support for AMD Solarflare X4 adapter family
>    common/sfc_efx/base: add new X4 port mode
>    common/sfc_efx/base: extend list of supported X4 port modes
> 
> Ivan Malov (28):
>    common/sfc_efx/base: update MCDI headers

Hm, bug here. End column is not aligned :)

>    common/sfc_efx/base: provide a stub for basic netport attach
>    common/sfc_efx/base: provide defaults on netport attach path
>    common/sfc_efx/base: obtain assigned netport handle from NIC
>    common/sfc_efx/base: allow for const in MCDI struct accessor
>    common/sfc_efx/base: get netport fixed capabilities on probe
>    common/sfc_efx/base: decode netport link state on probe path
>    common/sfc_efx/base: fill in loopback modes on netport probe
>    common/sfc_efx/base: introduce Medford4 stub for PHY methods
>    common/sfc_efx/base: refactor EF10 link mode decoding helper
>    common/sfc_efx/base: provide PHY link get method on Medford4
>    common/sfc_efx/base: implement PHY link control for Medford4
>    common/sfc_efx/base: introduce Medford4 stub for MAC methods
>    common/sfc_efx/base: add MAC reconfigure method for Medford4
>    common/sfc_efx/base: fill in software LUT for MAC statistics
>    common/sfc_efx/base: fill in MAC statistics mask on Medford4
>    common/sfc_efx/base: support MAC statistics on Medford4 NICs
>    common/sfc_efx/base: implement MAC PDU controls for Medford4
>    common/sfc_efx/base: correct MAC PDU calculation on Medford4
>    net/sfc: make use of generic EFX MAC PDU calculation helpers
>    common/sfc_efx/base: ignore legacy link events on new boards
>    common/sfc_efx/base: add link event processing on new boards
>    net/sfc: query link status on link change events on new NICs
>    common/sfc_efx/base: subscribe to netport link change events
>    net/sfc: offer support for 200G link ability on new adaptors
>    common/sfc_efx/base: support controls for netport lane count
>    net/sfc: add support for control of physical port lane count
>    doc: advertise support for AMD Solarflare X45xx adapters

Same here


^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4
  2025-04-17  7:08   ` Andrew Rybchenko
@ 2025-04-17 15:07     ` Stephen Hemminger
  2025-04-18  7:25       ` Andrew Rybchenko
  0 siblings, 1 reply; 61+ messages in thread
From: Stephen Hemminger @ 2025-04-17 15:07 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: Ivan Malov, dev, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On Thu, 17 Apr 2025 10:08:20 +0300
Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> wrote:

> >   #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
> >   /* Support adapters with missing static config (for factory use only) */
> > -# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
> > -#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
> > +# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || \
> > +	EFSYS_OPT_MEDFORD4)
> > +#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2 " \
> > +	"or MEDFORD4"  
> 
> Typically it is a bad idea to split error message since it complicates grep.
> Please, double-check that base driver code style requires.
> As far as I remember - no.

Would a static_assert() logic be less complex here?

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4
  2025-04-17 15:07     ` Stephen Hemminger
@ 2025-04-18  7:25       ` Andrew Rybchenko
  0 siblings, 0 replies; 61+ messages in thread
From: Andrew Rybchenko @ 2025-04-18  7:25 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Ivan Malov, dev, Denis Pryazhennikov, Andy Moreton,
	Pieter Jansen Van Vuuren, Viacheslav Galaktionov

On 4/17/25 18:07, Stephen Hemminger wrote:
> On Thu, 17 Apr 2025 10:08:20 +0300
> Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> wrote:
> 
>>>    #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
>>>    /* Support adapters with missing static config (for factory use only) */
>>> -# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
>>> -#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
>>> +# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 || \
>>> +	EFSYS_OPT_MEDFORD4)
>>> +#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2 " \
>>> +	"or MEDFORD4"
>>
>> Typically it is a bad idea to split error message since it complicates grep.
>> Please, double-check that base driver code style requires.
>> As far as I remember - no.
> 
> Would a static_assert() logic be less complex here?

It is a base driver with its own rules and the same code was used in
many places (platforms, drivers) before. I don't know what is today.
So, I guess static_assert() is not an option here.


^ permalink raw reply	[flat|nested] 61+ messages in thread

end of thread, other threads:[~2025-04-18  7:25 UTC | newest]

Thread overview: 61+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-16 13:59 [PATCH 00/46] Support AMD Solarflare X45xx adaptors Ivan Malov
2025-04-16 13:59 ` [PATCH 01/46] common/sfc_efx/base: add Medford4 PCI IDs to common code Ivan Malov
2025-04-16 13:59 ` [PATCH 02/46] common/sfc_efx/base: add efsys option for Medford4 Ivan Malov
2025-04-17  7:08   ` Andrew Rybchenko
2025-04-17 15:07     ` Stephen Hemminger
2025-04-18  7:25       ` Andrew Rybchenko
2025-04-16 13:59 ` [PATCH 03/46] common/sfc_efx/base: add Medford4 support to NIC module Ivan Malov
2025-04-17  7:14   ` Andrew Rybchenko
2025-04-16 13:59 ` [PATCH 04/46] common/sfc_efx/base: add Medford4 support to EV module Ivan Malov
2025-04-16 13:59 ` [PATCH 05/46] common/sfc_efx/base: add Medford4 support to FILTER module Ivan Malov
2025-04-16 13:59 ` [PATCH 06/46] common/sfc_efx/base: add Medford4 support to INTR module Ivan Malov
2025-04-16 13:59 ` [PATCH 07/46] common/sfc_efx/base: add Medford4 support to MAC module Ivan Malov
2025-04-16 13:59 ` [PATCH 08/46] common/sfc_efx/base: add Medford4 support to PHY module Ivan Malov
2025-04-16 13:59 ` [PATCH 09/46] common/sfc_efx/base: add Medford4 support to TUNNEL module Ivan Malov
2025-04-16 13:59 ` [PATCH 10/46] common/sfc_efx/base: add Medford4 support to MCDI module Ivan Malov
2025-04-16 13:59 ` [PATCH 11/46] common/sfc_efx/base: add Medford4 support to Rx module Ivan Malov
2025-04-16 13:59 ` [PATCH 12/46] common/sfc_efx/base: add Medford4 support to Tx module Ivan Malov
2025-04-16 13:59 ` [PATCH 13/46] drivers: enable support for AMD Solarflare X4 adapter family Ivan Malov
2025-04-16 13:59 ` [PATCH 14/46] common/sfc_efx/base: update X4 BAR layout and PCI IDs Ivan Malov
2025-04-16 13:59 ` [PATCH 15/46] net/sfc: add Medford4 with only full feature datapath engine Ivan Malov
2025-04-16 13:59 ` [PATCH 16/46] common/sfc_efx/base: add port mode for 8 port hardware Ivan Malov
2025-04-16 13:59 ` [PATCH 17/46] common/sfc_efx/base: add new X4 port mode Ivan Malov
2025-04-16 13:59 ` [PATCH 18/46] common/sfc_efx/base: extend list of supported X4 port modes Ivan Malov
2025-04-16 13:59 ` [PATCH 19/46] common/sfc_efx/base: update MCDI headers Ivan Malov
2025-04-16 13:59 ` [PATCH 20/46] common/sfc_efx/base: provide a stub for basic netport attach Ivan Malov
2025-04-16 13:59 ` [PATCH 21/46] common/sfc_efx/base: provide defaults on netport attach path Ivan Malov
2025-04-16 13:59 ` [PATCH 22/46] common/sfc_efx/base: obtain assigned netport handle from NIC Ivan Malov
2025-04-16 13:59 ` [PATCH 23/46] common/sfc_efx/base: allow for const in MCDI struct accessor Ivan Malov
2025-04-16 13:59 ` [PATCH 24/46] common/sfc_efx/base: get netport fixed capabilities on probe Ivan Malov
2025-04-16 13:59 ` [PATCH 25/46] common/sfc_efx/base: decode netport link state on probe path Ivan Malov
2025-04-16 13:59 ` [PATCH 26/46] common/sfc_efx/base: fill in loopback modes on netport probe Ivan Malov
2025-04-16 13:59 ` [PATCH 27/46] common/sfc_efx/base: introduce Medford4 stub for PHY methods Ivan Malov
2025-04-16 13:59 ` [PATCH 28/46] common/sfc_efx/base: refactor EF10 link mode decoding helper Ivan Malov
2025-04-16 13:59 ` [PATCH 29/46] common/sfc_efx/base: provide PHY link get method on Medford4 Ivan Malov
2025-04-16 14:00 ` [PATCH 30/46] common/sfc_efx/base: implement PHY link control for Medford4 Ivan Malov
2025-04-17  7:31   ` Andrew Rybchenko
2025-04-16 14:00 ` [PATCH 31/46] common/sfc_efx/base: introduce Medford4 stub for MAC methods Ivan Malov
2025-04-16 14:00 ` [PATCH 32/46] common/sfc_efx/base: add MAC reconfigure method for Medford4 Ivan Malov
2025-04-17  7:34   ` Andrew Rybchenko
2025-04-16 14:00 ` [PATCH 33/46] common/sfc_efx/base: fill in software LUT for MAC statistics Ivan Malov
2025-04-16 14:00 ` [PATCH 34/46] common/sfc_efx/base: fill in MAC statistics mask on Medford4 Ivan Malov
2025-04-16 14:00 ` [PATCH 35/46] common/sfc_efx/base: support MAC statistics on Medford4 NICs Ivan Malov
2025-04-17  7:43   ` Andrew Rybchenko
2025-04-16 14:00 ` [PATCH 36/46] common/sfc_efx/base: implement MAC PDU controls for Medford4 Ivan Malov
2025-04-16 14:00 ` [PATCH 37/46] common/sfc_efx/base: correct MAC PDU calculation on Medford4 Ivan Malov
2025-04-16 14:00 ` [PATCH 38/46] net/sfc: make use of generic EFX MAC PDU calculation helpers Ivan Malov
2025-04-16 14:00 ` [PATCH 39/46] common/sfc_efx/base: ignore legacy link events on new boards Ivan Malov
2025-04-16 14:00 ` [PATCH 40/46] common/sfc_efx/base: add link event processing " Ivan Malov
2025-04-16 14:00 ` [PATCH 41/46] net/sfc: query link status on link change events on new NICs Ivan Malov
2025-04-16 14:00 ` [PATCH 42/46] common/sfc_efx/base: subscribe to netport link change events Ivan Malov
2025-04-16 14:00 ` [PATCH 43/46] net/sfc: offer support for 200G link ability on new adaptors Ivan Malov
2025-04-16 14:00 ` [PATCH 44/46] common/sfc_efx/base: support controls for netport lane count Ivan Malov
2025-04-17  7:57   ` Andrew Rybchenko
2025-04-16 14:00 ` [PATCH 45/46] net/sfc: add support for control of physical port " Ivan Malov
2025-04-16 14:00 ` [PATCH 46/46] doc: advertise support for AMD Solarflare X45xx adapters Ivan Malov
2025-04-16 15:14 ` [PATCH 00/46] Support AMD Solarflare X45xx adaptors Stephen Hemminger
2025-04-16 15:38   ` Ivan Malov
2025-04-16 16:31     ` Stephen Hemminger
2025-04-16 17:37       ` Ivan Malov
2025-04-16 21:44         ` Stephen Hemminger
2025-04-17  8:09 ` Andrew Rybchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).