From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 062F64242F; Fri, 20 Jan 2023 12:18:30 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 974A940150; Fri, 20 Jan 2023 12:18:30 +0100 (CET) Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) by mails.dpdk.org (Postfix) with ESMTP id 561AD400D5 for ; Thu, 19 Jan 2023 14:37:57 +0100 (CET) Received: by mail-ej1-f46.google.com with SMTP id ss4so5656388ejb.11 for ; Thu, 19 Jan 2023 05:37:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind.com; s=google; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=R+2DiVVfM0j0+v1kOR2+i5Rb86wf7CIIs24EqNabDlM=; b=VZRk+OHZzzRmXFGOu63s+OKx+/QC1LitgafifLWEK/tqj5C8lfEh1uTtI4Nq8O4PQq xGWbPASZD0EUwkUphkhJFpKPwbQK+ASyWxPgjY9N4wifJn63BQfcmZjvaXjZs0YRNBFC 9mmRQd0dZHI3ExyB9ltJ9ftyOccZm2ZdLkA7+TB5H0y14cGoCy8W4Djg/J1TzQT0oioi EdPa5pyazbRcYTx1Yb7RyVf/mSPespAWXAg1i0XbKUvxh3ZiG/oLP0P3pYC6ytyxGR17 R/B0vs4cEQLE9Ktfk9Zqasq/DBb/csonQpa4mX+2e35AV3iDonGMuTnCHXjprN3WCEiZ vl7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=R+2DiVVfM0j0+v1kOR2+i5Rb86wf7CIIs24EqNabDlM=; b=VF4/QiarF2IIr9m12aaDu9aLCoAozASh56tPUnaqp8ffJ1gUjxsQbm4J6Ty1TKpu+G 7oG/1dtCplRrrN8VUeOAJOfQRuI+rtVC0WRXoKNDwCaifFFEgVfDxVYCrAASB9pzjiD5 59U9JBeF/9VLTC/S3NDUyD3ho8qh/psryclWY3ZfYYEDUUBfSwFgRgfWH0M3dt0uguRS zkIfMd30M+30Pfttes3B9fEuaIDtYiwG6hpT8gFjFh5tjdfA7Z0DhMbZrBuM4X8oVPjr ihLzcKKl30ERBVrn6jE8tr9zmglo/okfkEVI6vdJRxirbK1okxUsn9BGVw8OahbbC1o9 nsQQ== X-Gm-Message-State: AFqh2kqfFmOPBxTHTX264/7QT3VISORyDOxLf4s2QrgixWYXUWhuLWX9 XFUYItBoMPpYWnBHi87TxAOXV0paE9Xd0eO5mZm5u7qxVvBjemVx X-Google-Smtp-Source: AMrXdXvo6z3ifJfoddUpDhgbdPgGCUOiLne9m97UVb4NNyodolBlQdDaR0r1Ji1MKdZxVl3GqGc3zzNCZQB/J+w9SJQ= X-Received: by 2002:a17:906:3a44:b0:86a:b31a:25e6 with SMTP id a4-20020a1709063a4400b0086ab31a25e6mr935902ejf.603.1674135476901; Thu, 19 Jan 2023 05:37:56 -0800 (PST) MIME-Version: 1.0 From: Edwin Brossette Date: Thu, 19 Jan 2023 14:37:45 +0100 Message-ID: Subject: net/bnxt: wrong link status when lsc_intr is used To: dev@dpdk.org Cc: ajit.khaparde@broadcom.com, somnath.kotur@broadcom.com, Didier Pallard , Olivier Matz Content-Type: multipart/alternative; boundary="00000000000068343f05f29e0aef" X-Mailman-Approved-At: Fri, 20 Jan 2023 12:18:29 +0100 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --00000000000068343f05f29e0aef Content-Type: text/plain; charset="UTF-8" Hello, I am trying to operate a Broadcom BCM57414 2x10G nic using dpdk bnxt pmd. I use DPDK 22.11. However, doing so I stumbled over a number of different issues. Mainly, using the dpdk rte_eth library, I don't seem to be able to correctly poll the link status: I expect my nic has a problem using autoneg to set the link speed/duplex, because these parameters remain unknown while autoneg is on. However, after trying to set link up, instead of showing the link state as down, I see the link being up, which is in truth not the case, as no packets can transit on the line and the switch at the other end sees it down. When searching around and trying to debug the code, I found the function bnxt_dev_info_get_op() sets my nic in interrupt mode: > eth_dev->data->dev_conf.intr_conf.lsc = 1; Which is a bit of a surprising thing to do for a function meant to get info. Thus my card ends up working in a mode I didn't configure it to, which may be the cause of my issue: later when setting the link up in function bnxt_dev_set_link_up_op(): > if (!bp->link_info->link_up) > rc = bnxt_set_hwrm_link_config(bp, true); > if (!rc) > eth_dev->data->dev_link.link_status = 1; So link_status in eth_dev gets set to 1 as long as the operation did not return any error code. This is the case when setting my card's link up (rc=0), although the link clearly can't get up, for whatever other bug is present. Now this shouldn't be much of an issue given we will update the link status at some point, mainly in rte_eth_link_get_nowait(): > if (dev->data->dev_conf.intr_conf.lsc && dev->data->dev_started) > rte_eth_linkstatus_get(dev, eth_link); > else { > if (*dev->dev_ops->link_update == NULL) > return -ENOTSUP; > (*dev->dev_ops->link_update)(dev, 0); > *eth_link = dev->data->dev_link; Here we can see in the else statement that the link status gets updated. However because the pmd auto-configured the nic in interrupt mode when calling the get_info function, we are not going through that else statement. So when reading the value of the link_status, we read 1 instead of 0. I suppose with interrupt mode enabled, the nic should be able to update this variable on its own, but it is clearly not the case in my setup: link status is never updated and incorrectly indicates the link is UP. I can suggest a testpmd reproduction setup using the --no-lsc-interrupt option. With this option, dev_conf.intr_conf.lsc should be 0. In addition, I added a log to the rte_eth library in rte_eth_dev_start() to display dev_conf.intr_conf.lsc state when starting the port: > + RTE_ETHDEV_LOG(ERR, "><><><>: dev->data->dev_conf.intr_conf=%d\n", dev->data->dev_conf.intr_conf.lsc); > diag = (*dev->dev_ops->dev_start)(dev); Running testpmd, we can see the following outpout when starting port: dpdk-testpmd --log-level=pmd.net.bnxt.driver:8 -a 0000:02:00.0 -a 0000:02:00.1 -- -i --rxq=2 --txq=2 --coremask=0x0c --total-num-mbufs=250000 --no-lsc-interrupt [...] Configuring Port 0 (socket 0) bnxt_rx_queue_setup_op(): App supplied RXQ drop_en status : 1 bnxt_rx_queue_setup_op(): RX Buf MTU 1500 bnxt_rx_queue_setup_op(): RX Buf size is 9728 bnxt_rx_queue_setup_op(): App supplied RXQ drop_en status : 1 bnxt_rx_queue_setup_op(): RX Buf MTU 1500 bnxt_rx_queue_setup_op(): RX Buf size is 9728 ><><><>: dev->data->dev_conf.intr_conf=1 bnxt_mq_rx_configure(): pools = 1 nb_q_per_grp = 2 bnxt_mq_rx_configure(): rxq[0] = 0x105fb7ac0 vnic[0] = 0x100227080 bnxt_mq_rx_configure(): rxq[1] = 0x105fb0e40 vnic[0] = 0x100227080 bnxt_setup_one_vnic(): vnic[0] = 0x100227080 vnic->fw_grp_ids = 0x105fa7e00 bnxt_hwrm_vnic_alloc(): Alloc VNIC. Start 0, End 2 bnxt_hwrm_vnic_alloc(): VNIC ID 2 bnxt_setup_one_vnic(): rxq[0]->vnic=0x100227080 vnic->fw_grp_ids=0x105fa7e00 bnxt_setup_one_vnic(): rxq[1]->vnic=0x100227080 vnic->fw_grp_ids=0x105fa7e00 bnxt_setup_one_vnic(): vnic->rx_queue_cnt = 2 bnxt_hwrm_port_phy_qcfg(): Link Speed:0,Auto:4:64:140,Support:140,Force:0 bnxt_hwrm_port_phy_qcfg(): Link Signal:0,PAM::Auto:0,Support:0,Force:0 bnxt_hwrm_port_phy_qcfg(): Link Speed:0,Auto:4:64:140,Support:140,Force:0 bnxt_hwrm_port_phy_qcfg(): Link Signal:0,PAM::Auto:0,Support:0,Force:0 bnxt_ulp_port_init(): Skip ulp init for port: 0, TF is not enabled bnxt_receive_function(): Using SSE vector mode receive for port 0 bnxt_transmit_function(): Using SSE vector mode transmit for port 0 Port 0: 00:0A:F7:B6:E3:D0 Configuring Port 1 (socket 0) bnxt_rx_queue_setup_op(): App supplied RXQ drop_en status : 1 bnxt_rx_queue_setup_op(): RX Buf MTU 1500 bnxt_rx_queue_setup_op(): RX Buf size is 9728 bnxt_rx_queue_setup_op(): App supplied RXQ drop_en status : 1 bnxt_rx_queue_setup_op(): RX Buf MTU 1500 bnxt_rx_queue_setup_op(): RX Buf size is 9728 ><><><>: dev->data->dev_conf.intr_conf=1 bnxt_mq_rx_configure(): pools = 1 nb_q_per_grp = 2 bnxt_mq_rx_configure(): rxq[0] = 0x106200280 vnic[0] = 0x100200080 bnxt_mq_rx_configure(): rxq[1] = 0x105f10e40 vnic[0] = 0x100200080 bnxt_setup_one_vnic(): vnic[0] = 0x100200080 vnic->fw_grp_ids = 0x105f07e00 bnxt_hwrm_vnic_alloc(): Alloc VNIC. Start 0, End 2 bnxt_hwrm_vnic_alloc(): VNIC ID 3 bnxt_setup_one_vnic(): rxq[0]->vnic=0x100200080 vnic->fw_grp_ids=0x105f07e00 bnxt_setup_one_vnic(): rxq[1]->vnic=0x100200080 vnic->fw_grp_ids=0x105f07e00 bnxt_setup_one_vnic(): vnic->rx_queue_cnt = 2 bnxt_hwrm_port_phy_qcfg(): Link Speed:0,Auto:4:64:140,Support:140,Force:0 bnxt_hwrm_port_phy_qcfg(): Link Signal:0,PAM::Auto:0,Support:0,Force:0 bnxt_hwrm_port_phy_qcfg(): Link Speed:0,Auto:4:64:140,Support:140,Force:0 bnxt_hwrm_port_phy_qcfg(): Link Signal:0,PAM::Auto:0,Support:0,Force:0 bnxt_ulp_port_init(): Skip ulp init for port: 1, TF is not enabled bnxt_receive_function(): Using SSE vector mode receive for port 1 bnxt_transmit_function(): Using SSE vector mode transmit for port 1 Port 1: 00:0A:F7:B6:E3:D1 Here, we can see that lsc interrupts are enabled even though we specified not to enable them. Then given autoneg does not work on my nic, I can try setting the link up and showing port info: testpmd> set link-up port 0 bnxt_print_link_info(): Port 0 Link Up - speed 0 Mbps - half-duplex testpmd> show port info 0 ********************* Infos for port 0 ********************* MAC address: 00:0A:F7:B6:E3:D0 Device name: 0000:02:00.0 Driver name: net_bnxt Firmware-version: 223.0.161.0 Devargs: Connect to socket: 0 memory allocation on the socket: 0 Link status: up Link speed: None Link duplex: half-duplex Autoneg status: Off MTU: 1500 Promiscuous mode: enabled Allmulticast mode: disabled Maximum number of MAC addresses: 128 Maximum number of MAC addresses of hash filtering: 0 VLAN offload: strip off, filter off, extend off, qinq strip off Hash key size in bytes: 40 Redirection table size: 128 Supported RSS offload flow types: ipv4 ipv4-tcp ipv4-udp ipv6 ipv6-tcp ipv6-udp user-defined-50 user-defined-51 Minimum size of RX buffer: 1 Maximum configurable length of RX packet: 9600 Maximum configurable size of LRO aggregated packet: 0 Maximum number of VMDq pools: 64 Current number of RX queues: 2 Max possible RX queues: 117 Max possible number of RXDs per queue: 8192 Min possible number of RXDs per queue: 16 RXDs number alignment: 1 Current number of TX queues: 2 Max possible TX queues: 117 Max possible number of TXDs per queue: 4096 Min possible number of TXDs per queue: 16 TXDs number alignment: 1 Max segment number per packet: 65535 Max segment number per MTU/TSO: 65535 Device capabilities: 0x3( RUNTIME_RX_QUEUE_SETUP RUNTIME_TX_QUEUE_SETUP ) Switch name: 0000:02:00.0 Switch domain Id: 0 Switch Port Id: 32768 Device error handling mode: proactive This shows link status is seen as up, even although link speed is None. I was wondering if patching the code to move this line which sets lsc interrupt on somewhere else might be reasonable, or if this could cause further trouble. Maybe having a parameter to trigger it ON/OFF might be a good addition. May I have your opinion on this matter? Sincerely, Edwin Brossette --00000000000068343f05f29e0aef Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,

I am trying to operate a Broadcom BCM57414 2= x10G nic using dpdk bnxt pmd. I use DPDK 22.11.
However, doing so I stumbled over a number of different issues. Mainly, using=20 the dpdk rte_eth library, I don't seem to be able to correctly poll the= =20 link status: I expect my nic has a problem using autoneg to set the link speed/duplex, because these parameters remain unknown while autoneg is=20 on. However, after trying to set link up, instead of showing the link=20 state as down, I see the link being up, which is in truth not the case,=20 as no packets can transit on the line and the switch at the other end sees it down.

When searching around and trying to debug the code, I foun= d the function bnxt_dev_info_get_op() sets my nic in interrupt mode:
> eth_dev->data->dev_conf.intr_conf.lsc =3D 1;

Which is a= bit of a surprising thing to do for a function meant to get info.
Thus my card ends up working in a mode I didn't configure it to, which may= =20 be the cause of my issue: later when setting the link up in function=20 bnxt_dev_set_link_up_op():

>=C2=A0 if (!bp->li= nk_info->link_up)
>=C2=A0=C2=A0=C2=A0=C2=A0 rc =3D bnxt_set_hwrm= _link_config(bp, true);
> =C2=A0if (!rc)
> =C2=A0=C2=A0=C2= =A0 eth_dev->data->dev_link.link_status =3D 1;

So link_status in eth_dev gets set to 1 as long as the operation did not=20 return any error code. This is the case when setting my card's link up= =20 (rc=3D0), although the link clearly can't get up, for whatever other bu= g=20 is present. Now this shouldn't be much of an issue given we will update= =20 the link status at some point, mainly in rte_eth_link_get_nowait():

= > =C2=A0if (dev->data->dev_conf.intr_conf.lsc && dev->= data->dev_started)
> =C2=A0=C2=A0=C2=A0 rte_eth_linkstatus_get(de= v, eth_link);
> =C2=A0else {
> =C2=A0=C2=A0=C2=A0 if (*dev-&g= t;dev_ops->link_update =3D=3D NULL)
> =C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 return -ENOTSUP;
> =C2=A0=C2=A0=C2=A0 (*dev->dev_= ops->link_update)(dev, 0);
> =C2=A0=C2=A0=C2=A0=C2=A0 *eth_link = =3D dev->data->dev_link;

Here we can see in the else statement that the link status gets updated.=20 However because the pmd auto-configured the nic in interrupt mode when=20 calling the get_info function, we are not going through that else=20 statement. So when reading the value of the link_status, we read 1=20 instead of 0. I suppose with interrupt mode enabled, the nic should be=20 able to update this variable on its own, but it is clearly not the case=20 in my setup: link status is never updated and incorrectly indicates the=20 link is UP.

I can suggest a testpmd reproduction setup using the=20 --no-lsc-interrupt option. With this option, dev_conf.intr_conf.lsc=20 should be 0. In addition, I added a log to the rte_eth library in=20 rte_eth_dev_start() to display dev_conf.intr_conf.lsc state when=20 starting the port:

> + RTE_ETHDEV_LOG(ERR, "><><= ;><><!!<devstart>: dev->data->dev_conf.intr_conf=3D= %d\n", dev->data->dev_conf.intr_conf.lsc);
> =C2=A0 diag = =3D (*dev->dev_ops->dev_start)(dev);

Running testpmd, we can s= ee the following outpout when starting port:

dpdk-testpmd --log-leve= l=3Dpmd.net.bnxt.driver:8 -a 0000:02:00.0 -a 0000:02:00.1 -- -i --rxq=3D2 -= -txq=3D2 --coremask=3D0x0c --total-num-mbufs=3D250000 --no-lsc-interrupt[...]
Configuring Port 0 (socket 0)
bnxt_rx_queue_setup_op(): App su= pplied RXQ drop_en status : 1
bnxt_rx_queue_setup_op(): RX Buf MTU 1500<= br>bnxt_rx_queue_setup_op(): RX Buf size is 9728
bnxt_rx_queue_setup_op(= ): App supplied RXQ drop_en status : 1
bnxt_rx_queue_setup_op(): RX Buf = MTU 1500
bnxt_rx_queue_setup_op(): RX Buf size is 9728
><>&l= t;><><!!<devstart>: dev->data->dev_conf.intr_conf= =3D1
bnxt_mq_rx_configure(): pools =3D 1 nb_q_per_grp =3D 2
bnxt_mq_r= x_configure(): rxq[0] =3D 0x105fb7ac0 vnic[0] =3D 0x100227080
bnxt_mq_rx= _configure(): rxq[1] =3D 0x105fb0e40 vnic[0] =3D 0x100227080
bnxt_setup_= one_vnic(): vnic[0] =3D 0x100227080 vnic->fw_grp_ids =3D 0x105fa7e00
= bnxt_hwrm_vnic_alloc(): Alloc VNIC. Start 0, End 2
bnxt_hwrm_vnic_alloc(= ): VNIC ID 2
bnxt_setup_one_vnic(): rxq[0]->vnic=3D0x100227080 vnic-&= gt;fw_grp_ids=3D0x105fa7e00
bnxt_setup_one_vnic(): rxq[1]->vnic=3D0x1= 00227080 vnic->fw_grp_ids=3D0x105fa7e00
bnxt_setup_one_vnic(): vnic-&= gt;rx_queue_cnt =3D 2
bnxt_hwrm_port_phy_qcfg(): Link Speed:0,Auto:4:64:= 140,Support:140,Force:0
bnxt_hwrm_port_phy_qcfg(): Link Signal:0,PAM::Au= to:0,Support:0,Force:0
bnxt_hwrm_port_phy_qcfg(): Link Speed:0,Auto:4:64= :140,Support:140,Force:0
bnxt_hwrm_port_phy_qcfg(): Link Signal:0,PAM::A= uto:0,Support:0,Force:0
bnxt_ulp_port_init(): Skip ulp init for port: 0,= TF is not enabled
bnxt_receive_function(): Using SSE vector mode receiv= e for port 0
bnxt_transmit_function(): Using SSE vector mode transmit fo= r port 0
Port 0: 00:0A:F7:B6:E3:D0
Configuring Port 1 (socket 0)
b= nxt_rx_queue_setup_op(): App supplied RXQ drop_en status : 1
bnxt_rx_que= ue_setup_op(): RX Buf MTU 1500
bnxt_rx_queue_setup_op(): RX Buf size is = 9728
bnxt_rx_queue_setup_op(): App supplied RXQ drop_en status : 1
bn= xt_rx_queue_setup_op(): RX Buf MTU 1500
bnxt_rx_queue_setup_op(): RX Buf= size is 9728
><><><><!!<devstart>: dev-&g= t;data->dev_conf.intr_conf=3D1
bnxt_mq_rx_configure(): pools =3D 1 nb= _q_per_grp =3D 2
bnxt_mq_rx_configure(): rxq[0] =3D 0x106200280 vnic[0] = =3D 0x100200080
bnxt_mq_rx_configure(): rxq[1] =3D 0x105f10e40 vnic[0] = =3D 0x100200080
bnxt_setup_one_vnic(): vnic[0] =3D 0x100200080 vnic->= fw_grp_ids =3D 0x105f07e00
bnxt_hwrm_vnic_alloc(): Alloc VNIC. Start 0, = End 2
bnxt_hwrm_vnic_alloc(): VNIC ID 3
bnxt_setup_one_vnic(): rxq[0]= ->vnic=3D0x100200080 vnic->fw_grp_ids=3D0x105f07e00
bnxt_setup_one= _vnic(): rxq[1]->vnic=3D0x100200080 vnic->fw_grp_ids=3D0x105f07e00bnxt_setup_one_vnic(): vnic->rx_queue_cnt =3D 2
bnxt_hwrm_port_phy_q= cfg(): Link Speed:0,Auto:4:64:140,Support:140,Force:0
bnxt_hwrm_port_phy= _qcfg(): Link Signal:0,PAM::Auto:0,Support:0,Force:0
bnxt_hwrm_port_phy_= qcfg(): Link Speed:0,Auto:4:64:140,Support:140,Force:0
bnxt_hwrm_port_ph= y_qcfg(): Link Signal:0,PAM::Auto:0,Support:0,Force:0
bnxt_ulp_port_init= (): Skip ulp init for port: 1, TF is not enabled
bnxt_receive_function()= : Using SSE vector mode receive for port 1
bnxt_transmit_function(): Usi= ng SSE vector mode transmit for port 1
Port 1: 00:0A:F7:B6:E3:D1

= Here, we can see that lsc interrupts are enabled even though we specified not to enable them. Then given autoneg does not work on my nic, I can try=20 setting the link up and showing port info:

testpmd> set link-up p= ort 0
bnxt_print_link_info(): Port 0 Link Up - speed 0 Mbps - half-duple= x

testpmd> show port info 0

********************* Infos fo= r port 0 =C2=A0*********************
MAC address: 00:0A:F7:B6:E3:D0
D= evice name: 0000:02:00.0
Driver name: net_bnxt
Firmware-version: 223.= 0.161.0
Devargs:
Connect to socket: 0
memory allocation on the so= cket: 0
Link status: up
Link speed: None
Link duplex: half-duplex<= br>Autoneg status: Off
MTU: 1500
Promiscuous mode: enabled
Allmult= icast mode: disabled
Maximum number of MAC addresses: 128
Maximum num= ber of MAC addresses of hash filtering: 0
VLAN offload:
=C2=A0 strip= off, filter off, extend off, qinq strip off
Hash key size in bytes: 40<= br>Redirection table size: 128
Supported RSS offload flow types:
=C2= =A0 ipv4 =C2=A0ipv4-tcp =C2=A0ipv4-udp =C2=A0ipv6 =C2=A0ipv6-tcp =C2=A0ipv6= -udp
=C2=A0 user-defined-50 =C2=A0user-defined-51
Minimum size of RX = buffer: 1
Maximum configurable length of RX packet: 9600
Maximum conf= igurable size of LRO aggregated packet: 0
Maximum number of VMDq pools: = 64
Current number of RX queues: 2
Max possible RX queues: 117
Max = possible number of RXDs per queue: 8192
Min possible number of RXDs per = queue: 16
RXDs number alignment: 1
Current number of TX queues: 2
= Max possible TX queues: 117
Max possible number of TXDs per queue: 4096<= br>Min possible number of TXDs per queue: 16
TXDs number alignment: 1Max segment number per packet: 65535
Max segment number per MTU/TSO: 65= 535
Device capabilities: 0x3( RUNTIME_RX_QUEUE_SETUP RUNTIME_TX_QUEUE_SE= TUP )
Switch name: 0000:02:00.0
Switch domain Id: 0
Switch Port Id= : 32768
Device error handling mode: proactive

This shows link sta= tus is seen as up, even although link speed is None.

I was wondering if patching the code to move this line which sets lsc=20 interrupt on somewhere else might be reasonable, or if this could cause fur= ther trouble. Maybe having a parameter to trigger it ON/OFF might be a good addition.
May I have your opinion on this matter?

Sincerely= ,
Edwin Brossette
--00000000000068343f05f29e0aef--