git: f6a3934d63fd - stable/13 - ixgbe: Add support for 1Gbit DAC links

From: Kevin Bowling <kbowling_at_FreeBSD.org>
Date: Thu, 21 Nov 2024 05:53:54 UTC
The branch stable/13 has been updated by kbowling:

URL: https://cgit.FreeBSD.org/src/commit/?id=f6a3934d63fd1439f363d5a733a0fa71525c6e7d

commit f6a3934d63fd1439f363d5a733a0fa71525c6e7d
Author:     Kevin Bowling <kbowling@FreeBSD.org>
AuthorDate: 2024-11-14 06:33:28 +0000
Commit:     Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2024-11-21 05:53:37 +0000

    ixgbe: Add support for 1Gbit DAC links
    
    This is a relatively well known trick for the X520 (82599), can be
    useful for testing and lab settings.  It's not an official standard or
    particularly common but ubiquitous Broadcom switch ASICs deal with it.
    
    We'll call it 1000Base-KX because it's SerDes on the passive cable and
    I don't think it's worth adding another media type for this.
    
    Reviewed by:    emaste
    Sponsored by:   BBOX.io
    Differential Revision:  https://reviews.freebsd.org/D47352
    
    (cherry picked from commit 48ddd1b9f88753c6875566fbb67bc622453e4993)
---
 sys/dev/ixgbe/if_ix.c       |  7 ++++++-
 sys/dev/ixgbe/ixgbe_82599.c | 11 +++++++++++
 sys/dev/ixgbe/ixgbe_phy.c   |  3 ++-
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c
index 23e378ba70c6..8ddb0315f254 100644
--- a/sys/dev/ixgbe/if_ix.c
+++ b/sys/dev/ixgbe/if_ix.c
@@ -1316,9 +1316,11 @@ ixgbe_add_media_types(if_ctx_t ctx)
 	}
 
 	if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
-	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
+	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA) {
 		ifmedia_add(sc->media, IFM_ETHER | IFM_10G_TWINAX, 0,
 		    NULL);
+		ifmedia_add(sc->media, IFM_ETHER | IFM_1000_KX, 0, NULL);
+	}
 
 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
 		ifmedia_add(sc->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
@@ -2310,6 +2312,9 @@ ixgbe_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr)
 		case IXGBE_LINK_SPEED_10GB_FULL:
 			ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
 			break;
+		case IXGBE_LINK_SPEED_1GB_FULL:
+			ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
+			break;
 		}
 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
 		switch (sc->link_speed) {
diff --git a/sys/dev/ixgbe/ixgbe_82599.c b/sys/dev/ixgbe/ixgbe_82599.c
index 1ecab83a4e92..b2b40371648b 100644
--- a/sys/dev/ixgbe/ixgbe_82599.c
+++ b/sys/dev/ixgbe/ixgbe_82599.c
@@ -441,6 +441,17 @@ s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
 		goto out;
 	}
 
+	if (hw->phy.sfp_type == ixgbe_sfp_type_da_cu_core0 ||
+	    hw->phy.sfp_type == ixgbe_sfp_type_da_cu_core1) {
+		*speed = IXGBE_LINK_SPEED_10GB_FULL;
+		*autoneg = true;
+
+		if (hw->phy.multispeed_fiber)
+			*speed |= IXGBE_LINK_SPEED_1GB_FULL;
+
+		goto out;
+	}
+
 	/*
 	 * Determine link capabilities based on the stored value of AUTOC,
 	 * which represents EEPROM defaults.  If AUTOC value has not
diff --git a/sys/dev/ixgbe/ixgbe_phy.c b/sys/dev/ixgbe/ixgbe_phy.c
index da7d16a514d0..218a9dac3b78 100644
--- a/sys/dev/ixgbe/ixgbe_phy.c
+++ b/sys/dev/ixgbe/ixgbe_phy.c
@@ -1436,7 +1436,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
 		if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
 		   (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
 		   ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
-		   (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
+		   (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)) ||
+		   (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE))
 			hw->phy.multispeed_fiber = true;
 
 		/* Determine PHY vendor */