Commit 491c5dc9 authored by Yael Chemla's avatar Yael Chemla Committed by Jakub Kicinski
Browse files

net: ethtool: Add support for 1600Gbps speed

Add support for 1600Gbps link modes based on 200Gbps per lane [1].
This includes the adopted IEEE 802.3dj copper and optical PMDs that use
200G/lane signaling [2].

Add the following PMD types:
- KR8 (backplane)
- CR8 (copper cable)
- DR8 (SMF 500m)
- DR8-2 (SMF 2km)

These modes are defined in the 802.3dj specifications.
References:
[1] https://www.ieee802.org/3/dj/public/23_03/opsasnick_3dj_01a_2303.pdf
[2] https://www.ieee802.org/3/dj/projdoc/objectives_P802d3dj_240314.pdf



Signed-off-by: default avatarYael Chemla <ychemla@nvidia.com>
Reviewed-by: default avatarShahar Shitrit <shshitrit@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Reviewed-by: default avatarMaxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/1763585297-1243980-2-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 8b4e023d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ enum {
	LINK_CAPA_200000FD,
	LINK_CAPA_400000FD,
	LINK_CAPA_800000FD,
	LINK_CAPA_1600000FD,

	__LINK_CAPA_MAX,
};
+3 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
 */
const char *phy_speed_to_str(int speed)
{
	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 121,
	BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 125,
		"Enum ethtool_link_mode_bit_indices and phylib are out of sync. "
		"If a speed or mode has been added please update phy_speed_to_str "
		"and the PHY settings array.\n");
@@ -55,6 +55,8 @@ const char *phy_speed_to_str(int speed)
		return "400Gbps";
	case SPEED_800000:
		return "800Gbps";
	case SPEED_1600000:
		return "1600Gbps";
	case SPEED_UNKNOWN:
		return "Unknown";
	default:
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ static struct link_capabilities link_caps[__LINK_CAPA_MAX] __ro_after_init = {
	{ SPEED_200000, DUPLEX_FULL, {0} }, /* LINK_CAPA_200000FD */
	{ SPEED_400000, DUPLEX_FULL, {0} }, /* LINK_CAPA_400000FD */
	{ SPEED_800000, DUPLEX_FULL, {0} }, /* LINK_CAPA_800000FD */
	{ SPEED_1600000, DUPLEX_FULL, {0} }, /* LINK_CAPA_1600000FD */
};

static int speed_duplex_to_capa(int speed, unsigned int duplex)
@@ -52,6 +53,7 @@ static int speed_duplex_to_capa(int speed, unsigned int duplex)
	case SPEED_200000: return LINK_CAPA_200000FD;
	case SPEED_400000: return LINK_CAPA_400000FD;
	case SPEED_800000: return LINK_CAPA_800000FD;
	case SPEED_1600000: return LINK_CAPA_1600000FD;
	}

	return -EINVAL;
+5 −0
Original line number Diff line number Diff line
@@ -2077,6 +2077,10 @@ enum ethtool_link_mode_bit_indices {
	ETHTOOL_LINK_MODE_800000baseDR4_2_Full_BIT	 = 118,
	ETHTOOL_LINK_MODE_800000baseSR4_Full_BIT	 = 119,
	ETHTOOL_LINK_MODE_800000baseVR4_Full_BIT	 = 120,
	ETHTOOL_LINK_MODE_1600000baseCR8_Full_BIT	 = 121,
	ETHTOOL_LINK_MODE_1600000baseKR8_Full_BIT	 = 122,
	ETHTOOL_LINK_MODE_1600000baseDR8_Full_BIT	 = 123,
	ETHTOOL_LINK_MODE_1600000baseDR8_2_Full_BIT	 = 124,

	/* must be last entry */
	__ETHTOOL_LINK_MODE_MASK_NBITS
@@ -2190,6 +2194,7 @@ enum ethtool_link_mode_bit_indices {
#define SPEED_200000		200000
#define SPEED_400000		400000
#define SPEED_800000		800000
#define SPEED_1600000		1600000

#define SPEED_UNKNOWN		-1

+8 −0
Original line number Diff line number Diff line
@@ -233,6 +233,10 @@ const char link_mode_names[][ETH_GSTRING_LEN] = {
	__DEFINE_LINK_MODE_NAME(800000, DR4_2, Full),
	__DEFINE_LINK_MODE_NAME(800000, SR4, Full),
	__DEFINE_LINK_MODE_NAME(800000, VR4, Full),
	__DEFINE_LINK_MODE_NAME(1600000, CR8, Full),
	__DEFINE_LINK_MODE_NAME(1600000, KR8, Full),
	__DEFINE_LINK_MODE_NAME(1600000, DR8, Full),
	__DEFINE_LINK_MODE_NAME(1600000, DR8_2, Full),
};
static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);

@@ -422,6 +426,10 @@ const struct link_mode_info link_mode_params[] = {
	__DEFINE_LINK_MODE_PARAMS(800000, DR4_2, Full),
	__DEFINE_LINK_MODE_PARAMS(800000, SR4, Full),
	__DEFINE_LINK_MODE_PARAMS(800000, VR4, Full),
	__DEFINE_LINK_MODE_PARAMS(1600000, CR8, Full),
	__DEFINE_LINK_MODE_PARAMS(1600000, KR8, Full),
	__DEFINE_LINK_MODE_PARAMS(1600000, DR8, Full),
	__DEFINE_LINK_MODE_PARAMS(1600000, DR8_2, Full),
};
static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
EXPORT_SYMBOL_GPL(link_mode_params);