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 9865341B89; Tue, 31 Jan 2023 06:08:49 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3709A40EF0; Tue, 31 Jan 2023 06:08:49 +0100 (CET) Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) by mails.dpdk.org (Postfix) with ESMTP id 11B4440DFB for ; Tue, 31 Jan 2023 06:08:48 +0100 (CET) Received: by mail-ed1-f42.google.com with SMTP id q19so3319335edd.2 for ; Mon, 30 Jan 2023 21:08:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=J+B7mTd2rB65f0uTrkgN+SJ8SPSGtlJs39zMNahAoi4=; b=K/64GfxPW9ZhHTYyMzNvsq4VPWShkiqhKyAbfUxje+avVBjPdqisF39gI20bMhO3q8 204x6BuRkj0l8i1qVQh18SGtiQZaJWjYfKMEUZv+VQFXFma+4vmv8ayxje6kAVPW1TC3 pXWxOnUVVLEMy1mx6andj452k7QDMgzf6QB5Q= 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:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=J+B7mTd2rB65f0uTrkgN+SJ8SPSGtlJs39zMNahAoi4=; b=mGTiR3fdtVnWXyAyy2W9hWDYEVgpetl2ksJsPAh5rO0JqKGxW63bSrGLaMdiwvYwG5 Pg8wpg8cE5aLptr1Lr+ttwY9ylk93ndpSglUlfb46XkNi+997B8m0Nihhi6SO1tLLVXx g7rNHs16XfTkzNPhUDDJ0RYduSTuFVj2f9O+sNvW6CXWjkXXFUw0VsDzguD3DmoNFdHO bSFNGIhU/FKMKTRFxKWHf99yjJ05rSzI92mtGYvy4J4G1C6LZ8TegDbXyfbBTXeKgbHa FGjVhxvnZ8ZrhUJWnHndC4qoaWZTacSgkavc8wom/oFxIpREpEN/CwLvxazwOBZ3Cgcj tNVw== X-Gm-Message-State: AO0yUKWrWQ6ivj69Jg+dLTlF8WRQm/By800WXuh86RaPvsGFoM37Y9QY 5rJP2xiK6P/Agekkh5+PDK/WmthFSEUhGxh36iN55A== X-Google-Smtp-Source: AK7set8XpBm3/fPw9CuKxi7Ax0rMMcbWgVwnIh8UQhcLyGn9uVGEhky3ihHtHOwjXTAkVgs+w8hFtlSTBdyeYkTjdL0= X-Received: by 2002:a05:6402:1bd9:b0:4a2:223c:b96b with SMTP id ch25-20020a0564021bd900b004a2223cb96bmr3292828edb.49.1675141727451; Mon, 30 Jan 2023 21:08:47 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Somnath Kotur Date: Tue, 31 Jan 2023 10:38:34 +0530 Message-ID: Subject: Re: net/bnxt: wrong link status when lsc_intr is used To: Edwin Brossette Cc: dev@dpdk.org, ajit.khaparde@broadcom.com, Didier Pallard , Olivier Matz Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="000000000000a3a0ad05f388531b" 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 --000000000000a3a0ad05f388531b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Jan 19, 2023 at 7:07 PM Edwin Brossette wrote: > > Hello, > Hi Edwin, Thanks for reaching out, here's my attempt at answering your questions > 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, u= sing the dpdk rte_eth library, I don't seem to be able to correctly poll th= e 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 packet= s 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 =3D 1; This was added long back in the driver code by this commit (as you can see 6+ yrs old :)) , so I believe at the time the intent was to get this link notification asynchronous and 'lsc' I believe was for link state change? Please suggest an alternative place to do this or you may even post the patch yourself to help do this the right way commit 7bc8e9a227ccbc649c2d230f0ee92ee58b1cb955 Author: Ajit Khaparde Date: Tue Oct 11 16:47:50 2016 -0500 net/bnxt: support async link notification > > Which is a bit of a surprising thing to do for a function meant to get in= fo. > Thus my card ends up working in a mode I didn't configure it to, which ma= y 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 =3D bnxt_set_hwrm_link_config(bp, true); > > if (!rc) > > 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 = return any error code. This is the case when setting my card's link up (rc= =3D0), although the link clearly can't get up, for whatever other bug is pr= esent. 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 =3D=3D NULL) > > return -ENOTSUP; > > (*dev->dev_ops->link_update)(dev, 0); > > *eth_link =3D 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 call= ing 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 suppo= se with interrupt mode enabled, the nic should be able to update this varia= ble 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. > So what happens if/when you get rid of that lsc setting line in dev_info_get_op() and actually enabled the 'else' part of the above code snippet ? Was it helping your link to come up with proper values? What is your link status on the other side ? (I believe you said switch port, but have you tried with another card connected back-back ?) Also I'm assuming it comes up fine with the regular kernel driver ? What does that show ? > I can suggest a testpmd reproduction setup using the --no-lsc-interrupt o= ption. 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_c= onf.intr_conf.lsc state when starting the port: > > > + RTE_ETHDEV_LOG(ERR, "><><><>: dev->data->dev_conf.intr_c= onf=3D%d\n", dev->data->dev_conf.intr_conf.lsc); > > diag =3D (*dev->dev_ops->dev_start)(dev); > > Running testpmd, we can see the following outpout when starting port: > > dpdk-testpmd --log-level=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=3D250= 000 --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=3D1 > bnxt_mq_rx_configure(): pools =3D 1 nb_q_per_grp =3D 2 > bnxt_mq_rx_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 0x105= fa7e00 > 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->fw_grp_ids=3D0x10= 5fa7e00 > bnxt_setup_one_vnic(): rxq[1]->vnic=3D0x100227080 vnic->fw_grp_ids=3D0x10= 5fa7e00 > bnxt_setup_one_vnic(): vnic->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::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=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 0x105= f07e00 > 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=3D0x10= 5f07e00 > bnxt_setup_one_vnic(): rxq[1]->vnic=3D0x100200080 vnic->fw_grp_ids=3D0x10= 5f07e00 > bnxt_setup_one_vnic(): vnic->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::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 int= errupt on somewhere else might be reasonable, or if this could cause furthe= r trouble. Maybe having a parameter to trigger it ON/OFF might be a good ad= dition. > May I have your opinion on this matter? > > Sincerely, > Edwin Brossette --000000000000a3a0ad05f388531b Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature 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 nSGLsSobByQoGh1GyLfFTXI7QOGn/6qvrJ7x9Oem5V7miUTD0wGAIozD7MCVoluf5Psa4Q2a5AFV gROLty059Ex4oK55Op/0e3Aa/a8hZD/tPBT3WE70owdiCwIDAQABo4IB2zCCAdcwDgYDVR0PAQH/ BAQDAgWgMIGjBggrBgEFBQcBAQSBljCBkzBOBggrBgEFBQcwAoZCaHR0cDovL3NlY3VyZS5nbG9i YWxzaWduLmNvbS9jYWNlcnQvZ3NnY2NyM3BlcnNvbmFsc2lnbjJjYTIwMjAuY3J0MEEGCCsGAQUF BzABhjVodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9nc2djY3IzcGVyc29uYWxzaWduMmNhMjAy MDBNBgNVHSAERjBEMEIGCisGAQQBoDIBKAowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xv YmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADBJBgNVHR8EQjBAMD6gPKA6hjhodHRw Oi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjNwZXJzb25hbHNpZ24yY2EyMDIwLmNybDAlBgNV HREEHjAcgRpzb21uYXRoLmtvdHVyQGJyb2FkY29tLmNvbTATBgNVHSUEDDAKBggrBgEFBQcDBDAf BgNVHSMEGDAWgBSWM9HmWBdbNHWKgVZk1b5I3qGPzzAdBgNVHQ4EFgQUabMpSsFcjDNUWMvGf76o yB7jBJUwDQYJKoZIhvcNAQELBQADggEBAJBDQpQ1TqY57vpQbwtXYP0N01q8J3tfNA/K2vOiNOpv IufqZ5WKdKEtmT21nujCeuaCQ6SmpWqCUJVkLd+u/sHR62vCo8j2fb1pTkA7jeuCAuT9YMPRE86M sUphsGDq2ylriQ7y5kvl728hZ0Oakm3xUCnZ9DYS/32sFGSZyrCGZipTBnjK4n5uLQ0yekSLACiD R0zi4nzkbhwXqDbDaB+Duk52ec/Vj4xuc2uWu9rTmJNVjdk0qu9vh48xcd/BzrlmwY0crGTijAC/ r4x2/y9OfG0FyVmakU0qwDnZX982aa66tXnKNgae2k20WCDVMM5FPTrbMsQyz6Hrv3bg6qgxggJt MIICaQIBATBrMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYD VQQDEyhHbG9iYWxTaWduIEdDQyBSMyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwAgx6wAr6NdQY0sTG G7cwDQYJYIZIAWUDBAIBBQCggdQwLwYJKoZIhvcNAQkEMSIEIA8VrxAJolgTHEcbMxq6ly9cr7vc iy6Ex30ZgaQHYyylMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIz MDEzMTA1MDg0N1owaQYJKoZIhvcNAQkPMVwwWjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsG CWCGSAFlAwQBAjAKBggqhkiG9w0DBzALBgkqhkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFl AwQCATANBgkqhkiG9w0BAQEFAASCAQAs0GAWCNTubs7p5IlHL/Fz+USl0Mg0Yn2M5Jjr54VGVONM 5434bO4VURoKQVDAtjYYJjXUsRJ8/wPilgV9W0LlsrNI7gMqUGS/wMCOGLpr3ylndjhB2iWXVpum mGWuRtweKHiR0J0IY18yBBTWgR4T4tEWn+MTGPNLmJzhedSn/n37pOKuSkRk+EePOh5O7U+iBiSF 7uukGyuM1TAWqyRxTG/w+soMWikzlG4v+k3MMilEf02s1Vm0rO5kO2MloV8Mgfu2MCqf5WFvFqhw rN3JbVPCNW5omgrSYcCO9XoEVXwAtZE5UndKsV+gGzWc1JDqEs3LZ/KWmlQaPFMMc25s --000000000000a3a0ad05f388531b--