Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Feb 2020 15:56:29 -0500
From:      Adam Peace <adam.e.peace@gmail.com>
To:        Konstantin Belousov <kib@freebsd.org>
Cc:        freebsd-net@freebsd.org, freebsd-drivers@mellanox.com
Subject:   Re: mlx5en - PTYS reg - eth_proto_oper bit 19 not defined
Message-ID:  <CAPHgngOa%2BhqNYRZ2arf0m50g8K0CdhrJX1JNEep9G=w6syGuvQ@mail.gmail.com>
In-Reply-To: <20200207214616.GT4808@kib.kiev.ua>
References:  <CAPHgngNSdM=8YbonH0TX%2Bby3kOjhhCeg4WAsOybWZhx2Sx%2BEgQ@mail.gmail.com> <20200207214616.GT4808@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
Thank you for the information. After searching, I found the 50GBase-KR4
link mode is described in this patent:
https://patents.google.com/patent/US8891561. I have applied the below patch
to my local kernel and the driver appears to be loading and operating
properly (without much testing yet). Is there anything else required beyond
this?

I was unsure of the methodology for defining a value for a new media type.
Others seem to have been added sequentially and assigned the next available
integer. Is there another method for doing this that I overlooked?

Also, how were you able to tell me that the PTYS register eth_proto_oper
value of 0x80000 corresponds to 50GBase-KR4? Is there a mapping of these
values maintained somewhere?

Thanks again for your help.

>From 4fa642e98b13628660e3612f0f75e42b042c499b Mon Sep 17 00:00:00 2001
From: Adam Peace <>
Date: Mon, 10 Feb 2020 15:17:15 -0500
Subject: [PATCH] Support 50GBase-KR4 media type in mlx5en driver

---
 sys/dev/mlx5/mlx5_en/mlx5_en_main.c | 4 ++++
 sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c | 2 ++
 sys/dev/mlx5/port.h                 | 1 +
 sys/net/ieee8023ad_lacp.c           | 1 +
 sys/net/if_media.h                  | 3 +++
 5 files changed, 11 insertions(+)

diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
index 504f6c01591..f6803bc52da 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -169,6 +169,10 @@ static const struct media
mlx5e_mode_table[MLX5E_LINK_SPEEDS_NUMBER][MLX5E_LINK_
                .subtype = IFM_50G_KR2,
                .baudrate = IF_Gbps(50ULL),
        },
+       [MLX5E_50GBASE_KR4][MLX5E_KR4] = {
+               .subtype = IFM_50G_KR4,
+               .baudrate = IF_Gbps(50ULL),
+       },
 };

 static const struct media
mlx5e_ext_mode_table[MLX5E_EXT_LINK_SPEEDS_NUMBER][MLX5E_LINK_MODES_NUMBER]
= {
diff --git a/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
b/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
index eec585eeeb7..38191c1fb77 100644
--- a/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
+++ b/sys/dev/mlx5/mlx5_ib/mlx5_ib_main.c
@@ -166,6 +166,8 @@ static struct net_device *mlx5_ib_get_netdev(struct
ib_device *device,
 static int translate_eth_proto_oper(u32 eth_proto_oper, u8 *active_speed,
                                    u8 *active_width)
 {
+        /* TODO: Add a case for MLX5E_50GBASE_KR4 where appropriate
+         */
        switch (eth_proto_oper) {
        case MLX5E_PROT_MASK(MLX5E_1000BASE_CX_SGMII):
        case MLX5E_PROT_MASK(MLX5E_1000BASE_KX):
diff --git a/sys/dev/mlx5/port.h b/sys/dev/mlx5/port.h
index 043c7038830..d46ae130349 100644
--- a/sys/dev/mlx5/port.h
+++ b/sys/dev/mlx5/port.h
@@ -95,6 +95,7 @@ enum mlx5e_link_speed {
        MLX5E_40GBASE_SR4        = 15,
        MLX5E_40GBASE_LR4_ER4    = 16,
        MLX5E_50GBASE_SR2        = 18,
+       MLX5E_50GBASE_KR4        = 19,
        MLX5E_100GBASE_CR4       = 20,
        MLX5E_100GBASE_SR4       = 21,
        MLX5E_100GBASE_KR4       = 22,
diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c
index 7358b7cfa5e..c5e4125d1d8 100644
--- a/sys/net/ieee8023ad_lacp.c
+++ b/sys/net/ieee8023ad_lacp.c
@@ -1194,6 +1194,7 @@ lacp_compose_key(struct lacp_port *lp)
                case IFM_50G_PCIE:
                case IFM_50G_CR2:
                case IFM_50G_KR2:
+               case IFM_50G_KR4:
                case IFM_50G_SR2:
                case IFM_50G_LR2:
                case IFM_50G_LAUI2_AC:
diff --git a/sys/net/if_media.h b/sys/net/if_media.h
index 8192a6790a0..dad2555e6bd 100644
--- a/sys/net/if_media.h
+++ b/sys/net/if_media.h
@@ -258,6 +258,7 @@ uint64_t    ifmedia_baudrate(int);
 #define        IFM_400G_DR4    IFM_X(115)      /* 400GBase-DR4 */
 #define        IFM_400G_AUI8_AC IFM_X(116)     /* 400G-AUI8 active
copper/optical */
 #define        IFM_400G_AUI8   IFM_X(117)      /* 400G-AUI8 */
+#define        IFM_50G_KR4     IFM_X(118)      /* 50GBase-KR4 */

 /*
  * Please update ieee8023ad_lacp.c:lacp_compose_key()
@@ -484,6 +485,7 @@ struct ifmedia_description {
        { IFM_25G_SR,   "25GBase-SR" },                                 \
        { IFM_50G_CR2,  "50GBase-CR2" },                                \
        { IFM_50G_KR2,  "50GBase-KR2" },                                \
+       { IFM_50G_KR4,  "50GBase-KR4" },                                \
        { IFM_25G_LR,   "25GBase-LR" },                                 \
        { IFM_10G_AOC,  "10GBase-AOC" },                                \
        { IFM_25G_ACC,  "25GBase-ACC" },                                \
@@ -827,6 +829,7 @@ struct ifmedia_baudrate {
        { IFM_ETHER | IFM_25G_SR,       IF_Gbps(25ULL) },               \
        { IFM_ETHER | IFM_50G_CR2,      IF_Gbps(50ULL) },               \
        { IFM_ETHER | IFM_50G_KR2,      IF_Gbps(50ULL) },               \
+       { IFM_ETHER | IFM_50G_KR4,      IF_Gbps(50ULL) },               \
        { IFM_ETHER | IFM_25G_LR,       IF_Gbps(25ULL) },               \
        { IFM_ETHER | IFM_10G_AOC,      IF_Gbps(10ULL) },               \
        { IFM_ETHER | IFM_25G_ACC,      IF_Gbps(25ULL) },               \
--
2.22.0

On Fri, Feb 7, 2020 at 4:46 PM Konstantin Belousov <kib@freebsd.org> wrote:

> On Fri, Feb 07, 2020 at 02:15:53PM -0500, Adam Peace wrote:
> > Hello,
> >
> > I'm using the mlx5en driver that's in the FreeBSD 11.3 tree for a
> Mellanox
> > ConnectX-4 ethernet card on an Azure VM.
> >
> > The problem that I'm seeing is that the value being retrieved from the
> PTYS
> > register for eth_proto_oper is 0x80000, which is bit 19 of the field,
> but a
> > value for bit 19 is not defined in the mlx5e_link_speed enum. This causes
> It is 50GBase-KR4 whatever this means.
>
> > the driver to not find an entry in the mlx5e_mode_table and the
> > media.subtype and media.baudrate are not set. This does not stop the
> > mlx5en.ko module from loading, but network connectivity is affected.
> >
> > It seems that this enum is phased out in the upstream Linux driver, but
> > it's not clear to me how the replacement method works. Is this a known
> > issue? It seems that FreeBSD 12.1 and master still use the method that's
> > used in 11.3. Does anyone have any insight on this?
>
> The problem seems to be that net/if_media.h does not pre-define this mode.
> It is somewhat larger patch than just adding the entry in the table in the
> driver.
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPHgngOa%2BhqNYRZ2arf0m50g8K0CdhrJX1JNEep9G=w6syGuvQ>