From patchwork Sat Mar 26 01:25:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Marc Sune X-Patchwork-Id: 11751 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 4D9A15954; Sat, 26 Mar 2016 02:25:34 +0100 (CET) Received: from mail-lb0-f195.google.com (mail-lb0-f195.google.com [209.85.217.195]) by dpdk.org (Postfix) with ESMTP id 60DB358DF for ; Sat, 26 Mar 2016 02:25:32 +0100 (CET) Received: by mail-lb0-f195.google.com with SMTP id bc4so6017257lbc.0 for ; Fri, 25 Mar 2016 18:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=JmR/870KaIlHAuiGPMrUii3y1D9NtWYKbTV4dRv6neg=; b=nvWFrC0ELaQEp4zC/Mp9d9We7yURAGmXiQyOlKDoAG1AToj74agZuCUdwmZdRtmNAu FHmjwHZi2F1HBnj76tflY5k8EpN3RnujcDgSLDuOcG5m/SWLSKopNgdhks0wdI4v2U2k KuXgBt9ksR+2563dBY2QPW5MM9zk19ihjGvGqYDIO6m4Ont0S4EL92vs7npYXhBGbz+a kFuAQrEzXbkfiBKYmlR5WSoqBZfdO4tkqOf8+P4ABKJXMKdPk2LUJ2CTwBXpv48/pnxZ F8Ife8EXwqgwdzsUV1nHBwL0oqWjKNDpDQWFl+qNfmbAZhDWNeZD+en1hWevnW9kVp5l sFNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=JmR/870KaIlHAuiGPMrUii3y1D9NtWYKbTV4dRv6neg=; b=YqCT8ECPYi2K7WeLnFk6cU4h/ecjAELhUjq5qlRfwiABuZ4fGpLQoOJ8Px23wGYn61 4R8vFjVOzg5Wu3oL44BUQMSBrmFpzT1U6bqhnevSJ+M9EYkeRmx+iPpEr1LvhBA6lpe8 Z8doapErYJ6kS+VXTpo5NvYhJ5hcF9KRXA+CqlL6dvcrXFzLH8wv8bhEi/7hCGgrIFFu eNuN8bheImIlfjGt/E4AHIX7Ry4LC6MSSE9gNAVZOmbGrojgrZxAbLB31biDX/XkCYf7 ScpeyM2RdnPU2IqgfM13D+vG+v6jhiDPF0xepm4HzNsmTJe8ld1O0CX5Z0K06W2b/pKr eczw== X-Gm-Message-State: AD7BkJL+b65m8tMXQHYphvCrPJHvwlBs/1lryxPZ90WWPaagozTjNd7N27sBrjIJwxKFe7PrkB9V8gyG181h+g== X-Received: by 10.112.201.67 with SMTP id jy3mr6543047lbc.25.1458955532000; Fri, 25 Mar 2016 18:25:32 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.155.196 with HTTP; Fri, 25 Mar 2016 18:25:12 -0700 (PDT) In-Reply-To: References: <1457992546-32230-1-git-send-email-thomas.monjalon@6wind.com> <82F45D86ADE5454A95A89742C8D1410E032113DB@shsmsx102.ccr.corp.intel.com> <3250488.B81B9g3x6N@xps13> From: Marc Date: Sat, 26 Mar 2016 02:25:12 +0100 X-Google-Sender-Auth: EeBjvb1H7M1z2VD7M1sr9XGTTZc Message-ID: To: "Zhang, Helin" Cc: Thomas Monjalon , "Xu, Qian Q" , "Xing, Beilei" , "dev@dpdk.org" , "Ananyev, Konstantin" , "Lu, Wenzhuo" , "Richardson, Bruce" , "Glynn, Michael J" X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: Re: [dpdk-dev] [PATCH v11 0/8] ethdev: 100G and link speed API refactoring X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 25 March 2016 at 22:30, Marc wrote: > > > On 25 March 2016 at 21:41, Marc wrote: > >> >> On 25 March 2016 at 16:07, Zhang, Helin wrote: >> >>> Hi Thomas >>> >>> Beilei is investigating that, she will give her findings soon later, and >>> possibly a fix after validating that. >>> Thanks! >>> >>> >> I will try to reproduce this on my side too with the latest v12. I could >> not try latest patchsets, but i40 (XL710) and igb (82540EM) were working on >> my side for previous versions. Which exact NICs were used to test the >> patchset for igb? >> > > I am able to reproduce it straight away by applying v12. The problem is > testpmd and in general existing applications have the default value of 0 as > link_speeds for autoneg. > > From v9 to v10 patchset the values ETH_LINK_SPEED_AUTONEG and > ETH_LINK_SPEED_FIXED were flipped. Reverting this makes it work: > > marc@Beluga:~/personal/dpdk/tools$ git diff > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h > index ef2502a..fb247a7 100644 > --- a/lib/librte_ether/rte_ethdev.h > +++ b/lib/librte_ether/rte_ethdev.h > @@ -244,8 +244,8 @@ struct rte_eth_stats { > /** > * Device supported speeds bitmap flags > */ > -#define ETH_LINK_SPEED_FIXED (0 << 0) /**< Disable autoneg (fixed > speed) */ > -#define ETH_LINK_SPEED_AUTONEG (1 << 0) /**< Autonegotiate (all > speeds) */ > +#define ETH_LINK_SPEED_AUTONEG (0 << 0) /**< Autonegotiate (all > speeds) */ > +#define ETH_LINK_SPEED_FIXED (1 << 0) /**< Disable autoneg (fixed > speed) */ > #define ETH_LINK_SPEED_10M_HD (1 << 1) /**< 10 Mbps half-duplex */ > #define ETH_LINK_SPEED_10M (1 << 2) /**< 10 Mbps full-duplex */ > #define ETH_LINK_SPEED_100M_HD (1 << 3) /**< 100 Mbps half-duplex */ > > I think having autoneg == 0 is better. Do you agree Thomas? > > With this change my current NIC (I218-LM) is able to initialize: > > Option: 27 > > Enter hex bitmask of cores to execute testpmd app on > Example: to execute app on cores 0 to 7, enter 0xff > bitmask: 0x3 > Launching app > EAL: Detected lcore 0 as core 0 on socket 0 > EAL: Detected lcore 1 as core 0 on socket 0 > EAL: Detected lcore 2 as core 1 on socket 0 > EAL: Detected lcore 3 as core 1 on socket 0 > EAL: Support maximum 128 logical core(s) by configuration. > EAL: Detected 4 lcore(s) > EAL: Probing VFIO support... > EAL: Module /sys/module/vfio_pci not found! error 2 (No such file or > directory) > EAL: VFIO modules not loaded, skipping VFIO support... > EAL: Setting up physically contiguous memory... > EAL: Ask a virtual area of 0x26800000 bytes > EAL: Virtual area found at 0x7f33ef800000 (size = 0x26800000) > EAL: Ask a virtual area of 0x6e00000 bytes > EAL: Virtual area found at 0x7f33e8800000 (size = 0x6e00000) > EAL: Ask a virtual area of 0x800000 bytes > EAL: Virtual area found at 0x7f33e7e00000 (size = 0x800000) > EAL: Ask a virtual area of 0x4400000 bytes > EAL: Virtual area found at 0x7f33e3800000 (size = 0x4400000) > EAL: Ask a virtual area of 0xe00000 bytes > EAL: Virtual area found at 0x7f33e2800000 (size = 0xe00000) > EAL: Ask a virtual area of 0x600000 bytes > EAL: Virtual area found at 0x7f33e2000000 (size = 0x600000) > EAL: Ask a virtual area of 0x200000 bytes > EAL: Virtual area found at 0x7f33e1c00000 (size = 0x200000) > EAL: Ask a virtual area of 0x43600000 bytes > EAL: Virtual area found at 0x7f339e400000 (size = 0x43600000) > EAL: Ask a virtual area of 0x8e00000 bytes > EAL: Virtual area found at 0x7f3395400000 (size = 0x8e00000) > EAL: Ask a virtual area of 0x200000 bytes > EAL: Virtual area found at 0x7f3395000000 (size = 0x200000) > EAL: Ask a virtual area of 0x200000 bytes > EAL: Virtual area found at 0x7f3394c00000 (size = 0x200000) > EAL: Requesting 1024 pages of size 2MB from socket 0 > EAL: TSC frequency is ~2593996 KHz > EAL: Master lcore 0 is ready (tid=180078c0;cpuset=[0]) > EAL: lcore 1 is ready (tid=94bff700;cpuset=[1]) > EAL: PCI device 0000:00:19.0 on NUMA socket -1 > EAL: probe driver: 8086:15a2 rte_em_pmd > EAL: PCI memory mapped at 0x7f3416000000 > EAL: PCI memory mapped at 0x7f3416020000 > PMD: eth_em_dev_init(): port_id 0 vendorID=0x8086 deviceID=0x15a2 > Interactive-mode selected > Configuring Port 0 (socket 0) > PMD: eth_em_tx_queue_setup(): sw_ring=0x7f33e210efc0 > hw_ring=0x7f33e21110c0 dma_addr=0x745110c0 > PMD: eth_em_rx_queue_setup(): sw_ring=0x7f33e20fea80 > hw_ring=0x7f33e20fef80 dma_addr=0x744fef80 > PMD: eth_em_start(): << > > I am troubleshooting link status reporting, which seems not correct with > l2fwd. I will also double check that fixed speed and autoneg with subset of > speeds work. > Fixed and tested (with I218-LM only) for autoneg (all speeds and subset), fixed speed and link reporting: * (unrelated) I found what appears to be a bug in the e1000 base driver, not reporting changes on link negociation when it is triggered by the peer (randomly). The behaviour is the same as current master HEAD, so I will report it separately. * (unrelated) l2fwd, also in current HEAD, shows a misleading trace "Port down" at startup, when actually the port is not yet started (or ready). * From v9 to v10 patchset the values ETH_LINK_SPEED_AUTONEG and ETH_LINK_SPEED_FIXED were flipped. Reverting this makes it work. * Setting link to fixed speed was not working after flipping back values _AUTONEG and _FIXED, since conditions were modified from v9 -> v10 accordingly. Also link reading autoneg flag was incorrect after that. Fixed for all drivers => NEEDS TESTING, specially for Intel NICs ixgbe and i40e. * Found two existing bugs in the patchset for e1000 (igb and em), both fixed: - Link reading was always reporting Full duplex. - Setting a fixed speed was incorrectly accepting more than 1 speed in the bitmap. Attached the set of changes over v12 that will be merged in patch #6 of the series in v13, for easier reviewing. Marc marc@Beluga:~/personal/dpdk$ git diff 328addc166c7217134858fc65febebbd8ddffe7d > v12_fixes.patch marc@Beluga:~/personal/dpdk$ cat v12_fixes.patch speed) */ #define ETH_LINK_SPEED_10M_HD (1 << 1) /**< 10 Mbps half-duplex */ #define ETH_LINK_SPEED_10M (1 << 2) /**< 10 Mbps full-duplex */ #define ETH_LINK_SPEED_100M_HD (1 << 3) /**< 100 Mbps half-duplex */ > > @Thomas: once I've fixed this shall I submit v13 or should we wait for > more feedback from the rest of untested NICs? This patchset needs to be > tested by all drivers, at least. > > marc > > >> Marc >> >> >>> Regards, >>> Helin >>> >>> > -----Original Message----- >>> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com] >>> > Sent: Friday, March 25, 2016 5:36 PM >>> > To: Xu, Qian Q >>> > Cc: dev@dpdk.org; Marc ; Ananyev, Konstantin >>> > ; Lu, Wenzhuo ; >>> > Zhang, Helin ; Richardson, Bruce >>> > ; Glynn, Michael J < >>> michael.j.glynn@intel.com> >>> > Subject: Re: [dpdk-dev] [PATCH v11 0/8] ethdev: 100G and link speed API >>> > refactoring >>> > >>> > Is there someone investigating the issue? >>> > I think it should be simple to fix for someone mastering these Intel >>> drivers. >>> > >>> > 2016-03-25 01:02, Xu, Qian Q: >>> > > Marc >>> > > #Test1 is just a simple test. Just launch testpmd with these nic >>> port. >>> > > ./testpmd –c 0x3 –n 4 -- -i >>> > > >>> > > Thanks >>> > > Qian >>> > > >>> > > From: marc.sune@gmail.com [mailto:marc.sune@gmail.com] On Behalf Of >>> > > Marc >>> > > Sent: Thursday, March 24, 2016 3:48 PM >>> > > To: Xu, Qian Q >>> > > Cc: Thomas Monjalon; Ananyev, Konstantin; Lu, Wenzhuo; Zhang, Helin; >>> > > Richardson, Bruce; dev@dpdk.org >>> > > Subject: Re: [dpdk-dev] [PATCH v11 0/8] ethdev: 100G and link speed >>> > > API refactoring >>> > > >>> > > >>> > > >>> > > On 24 March 2016 at 07:21, Xu, Qian Q >>> > > wrote: >>> > > Marc >>> > > I didn’t quite get your points, I observed that after applying this >>> patchset, all >>> > intel nic can’t be started, maybe something wrong happened when you >>> check >>> > the duplex/autoneg value for different NICs. If we want to merge the >>> patchset in >>> > RC2, we need fix them. Maybe not an easy job in several days. >>> > > >>> > > Is this test#1 one of the tests contained in the DPDK repository or >>> is it an >>> > internal test? >>> > > >>> > > Marc >>> > > >>> > > >>> > > >>> > > Thanks >>> > > Qian >>> > > >>> > > From: marc.sune@gmail.com >>> > > [mailto:marc.sune@gmail.com] On Behalf >>> Of >>> > > Marc >>> > > Sent: Thursday, March 24, 2016 4:54 AM >>> > > To: Xu, Qian Q >>> > > Cc: Thomas Monjalon; Ananyev, Konstantin; Lu, Wenzhuo; Zhang, Helin; >>> > > Richardson, Bruce; dev@dpdk.org >>> > > >>> > > Subject: Re: [dpdk-dev] [PATCH v11 0/8] ethdev: 100G and link speed >>> > > API refactoring >>> > > >>> > > Qian, >>> > > >>> > > On 23 March 2016 at 02:18, Xu, Qian Q >>> > > wrote: >>> > > We have tested with intel nic and found port can't be started for all >>> > nics:ixgbe/i40e/igb/bonding, see attached mail for more details. >>> Please check >>> > and fix it. >>> > > >>> > > >>> > > Thanks >>> > > Qian >>> > > >>> > > -----Original Message----- >>> > > From: dev [mailto:dev-bounces@dpdk.org] >>> > > On Behalf Of Thomas Monjalon >>> > > Sent: Wednesday, March 23, 2016 3:59 AM >>> > > To: Ananyev, Konstantin; Lu, Wenzhuo; Zhang, Helin >>> > > Cc: marcdevel@gmail.com; Richardson, >>> > > Bruce; dev@dpdk.org >>> > > Subject: Re: [dpdk-dev] [PATCH v11 0/8] ethdev: 100G and link speed >>> > > API refactoring >>> > > >>> > > 2016-03-17 19:08, Thomas Monjalon: >>> > > > There are still too few tests and reviews, especially for >>> > > > autonegotiation with Intel devices (patch #6). >>> > > > I would not be surprised to see some bugs in this rework. >>> > > >>> > > Any feedback about autoneg in e1000/ixgbe/i40e? >>> > > Has it been tested before its integration in RC2? >>> > > >>> > > > The capabilities must be adapted per device. It can be improved in >>> a >>> > > > separate patch. >>> > > > >>> > > > It will be integrated in 16.04-rc2. >>> > > > Please test and review shortly, thanks! >>> > > >>> > > >>> > > ---------- Forwarded message ---------- >>> > > From: "Xu, Qian Q" > >>> > > To: "Cao, Waterman" >>> > > >, "Glynn, >>> > > Michael J" >>> > > > >>> > > Cc: "Richardson, Bruce" >>> > > >, >>> "Zhu, >>> > > Heqing" >, >>> > > "O'Driscoll, Tim" >>> > > >, >>> "Mcnamara, >>> > > John" >, >>> "Xu, >>> > > HuilongX" >, >>> "Fu, >>> > > JingguoX" >, >>> "Xu, >>> > > Qian Q" >, "Zhang, >>> > > Helin" > >>> > > Date: Tue, 22 Mar 2016 06:41:37 +0000 >>> > > Subject: RE: DPDK link speed with Intel devices Hi, all We have >>> worked >>> > > out the basic test cases for the patchset. >>> > > 1. Test the link speed on major Intel NICs to see if the speed is >>> right. >>> > > 2. Test the auto-negoation on major Intel NICs to ensure it's >>> working. >>> > > Nic covered: ixgbe, igb, i40e, fm10k, bonding(SW), virtio(SW) >>> > > >>> > > When we run the Test#1 for all major NICs. We found that all these >>> NIC port(igb, >>> > ixgbe, i40e, fm10k) can't be started. Pls check, if the patch is >>> applied, all INTEL >>> > port can't be start, terrible things! >>> > > >>> > > Interactive-mode selected >>> > > Configuring Port 0 (socket 0) >>> > > PMD: ixgbe_dev_tx_queue_setup(): sw_ring=0x7f13e99e3440 >>> > > hw_ring=0x7f13e99e5480 dma_addr=0x8299e5480 >>> > > PMD: ixgbe_set_tx_function(): Using simple tx code path >>> > > PMD: ixgbe_set_tx_function(): Vector tx enabled. >>> > > PMD: ixgbe_dev_rx_queue_setup(): sw_ring=0x7f13ffcb8080 >>> > > sw_sc_ring=0x7f13ffcbaac0 hw_ring=0x7f13e99d3380 dma_addr=0x8299d3380 >>> > > PMD: ixgbe_dev_start(): Invalid link_speeds for port 0; >>> > > autonegotiation disabled Fail to start port 0 Configuring Port 1 >>> > > (socket 0) >>> > > PMD: i40e_set_tx_function_flag(): Vector tx can be enabled on this >>> txq. >>> > > PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are >>> > satisfied. Rx Burst Bulk Alloc function will be used on port=1, >>> queue=0. >>> > > PMD: i40e_dev_start(): Invalid link_speeds for port 1; >>> autonegotiation >>> > > disabled >>> > > >>> > > >>> > > Just to double-check; is the test#1 adapted to the _new_ API that >>> ethdev has >>> > to set link speeds? For the output it seems autoneg is disabled => >>> fixed speed, >>> > hence the new bitmaps have to be used. >>> > > >>> > > (I am not claiming patchset is bug free; there might be issues still) >>> > > >>> > > Regards >>> > > marc >>> > > >>> > > Fail to start port 1 >>> > > Please stop the ports first >>> > > Done >>> > > >>> > > Thanks >>> > > Qian >>> > > >>> > > >>> > > -----Original Message----- >>> > > From: Cao, Waterman >>> > > Sent: Tuesday, March 22, 2016 11:06 AM >>> > > To: Glynn, Michael J >>> > > Cc: Richardson, Bruce; Zhu, Heqing; O'Driscoll, Tim; Mcnamara, John; >>> > > Xu, Qian Q; Cao, Waterman >>> > > Subject: RE: DPDK link speed with Intel devices >>> > > >>> > > Hi Mike, >>> > > >>> > > We just knew this patch set last week. >>> > > Since this patch set is required to test with a lot of NIC, >>> we need >>> > more document from Dev about this patch. >>> > > Currently, Qian is working on with Wenzhuo on it now. >>> > > >>> > > Waterman >>> > > >>> > > >>> > > -----Original Message----- >>> > > From: Glynn, Michael J >>> > > Sent: Tuesday, March 22, 2016 1:31 AM >>> > > To: Cao, Waterman >>> > > > >>> > > Cc: Richardson, Bruce >>> > > >; >>> Zhu, >>> > > Heqing >; >>> > > O'Driscoll, Tim >>> > > >; Mcnamara, >>> > > John > >>> > > Subject: FW: DPDK link speed with Intel devices >>> > > Importance: High >>> > > >>> > > Hi Waterman, all >>> > > >>> > > See below - are you aware? And if so where are we with >>> testing/resolution? >>> > > >>> > > Regards >>> > > Mike >>> > > >>> > > >>> > > >>> > > -----Original Message----- >>> > > From: Thomas Monjalon >>> > > >>> > [mailto:thomas.monjalon@6wind.com] >>> > > Sent: Monday, March 21, 2016 2:19 PM >>> > > To: O'Driscoll, Tim >>> > > >; Glynn, >>> > > Michael J >>> > > >; Zhu, >>> > > Heqing > >>> > > Cc: vincent.jardin@6wind.com >>> > > Subject: DPDK link speed with Intel devices >>> > > >>> > > Hi, >>> > > >>> > > We are still waiting for test feedbacks for this important patchset: >>> > > ethdev: 100G and link speed API refactoring It is possible >>> that it >>> > breaks the autonegotiation in e1000/ixgbe/i40e. >>> > > >>> > > Thanks for taking care. >>> > > >>> > > >>> > >>> >>> >> > diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c index af84175..071b44f 100644 --- a/drivers/net/bnx2x/bnx2x_ethdev.c +++ b/drivers/net/bnx2x/bnx2x_ethdev.c @@ -45,8 +45,8 @@ bnx2x_link_update(struct rte_eth_dev *dev) dev->data->dev_link.link_duplex = ETH_LINK_HALF_DUPLEX; break; } - dev->data->dev_link.link_autoneg = (dev->data->dev_conf.link_speeds & - ETH_LINK_SPEED_AUTONEG); + dev->data->dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); dev->data->dev_link.link_status = sc->link_vars.link_up; } diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c index 3e26ab0..9fb59a2 100644 --- a/drivers/net/e1000/em_ethdev.c +++ b/drivers/net/e1000/em_ethdev.c @@ -620,14 +620,14 @@ eth_em_start(struct rte_eth_dev *dev) hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX; } else { num_speeds = 0; - autoneg = (*speeds & ETH_LINK_SPEED_AUTONEG); + autoneg = (*speeds & ETH_LINK_SPEED_FIXED) == 0; /* Reset */ hw->phy.autoneg_advertised = 0; if (*speeds & ~(ETH_LINK_SPEED_10M_HD | ETH_LINK_SPEED_10M | ETH_LINK_SPEED_100M_HD | ETH_LINK_SPEED_100M | - ETH_LINK_SPEED_1G)) { + ETH_LINK_SPEED_1G | ETH_LINK_SPEED_FIXED)) { num_speeds = -1; goto error_invalid_config; } @@ -651,7 +651,7 @@ eth_em_start(struct rte_eth_dev *dev) hw->phy.autoneg_advertised |= ADVERTISE_1000_FULL; num_speeds++; } - if (num_speeds == 0 || (!autoneg && (num_speeds > 2))) + if (num_speeds == 0 || (!autoneg && (num_speeds > 1))) goto error_invalid_config; } @@ -1100,14 +1100,18 @@ eth_em_link_update(struct rte_eth_dev *dev, int wait_to_complete) if (link_check && (link.link_status == ETH_LINK_DOWN)) { uint16_t duplex, speed; hw->mac.ops.get_link_up_info(hw, &speed, &duplex); - link.link_duplex = duplex ? ETH_LINK_FULL_DUPLEX : + link.link_duplex = (duplex == FULL_DUPLEX) ? + ETH_LINK_FULL_DUPLEX : ETH_LINK_HALF_DUPLEX; link.link_speed = speed; link.link_status = ETH_LINK_UP; + link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); } else if (!link_check && (link.link_status == ETH_LINK_UP)) { link.link_speed = 0; link.link_duplex = ETH_LINK_HALF_DUPLEX; link.link_status = ETH_LINK_DOWN; + link.link_autoneg = ETH_LINK_SPEED_FIXED; } rte_em_dev_atomic_write_link_status(dev, &link); diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index ced864c..e0053fe 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -1241,14 +1241,14 @@ eth_igb_start(struct rte_eth_dev *dev) hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX; } else { num_speeds = 0; - autoneg = (*speeds & ETH_LINK_SPEED_AUTONEG); + autoneg = (*speeds & ETH_LINK_SPEED_FIXED) == 0; /* Reset */ hw->phy.autoneg_advertised = 0; if (*speeds & ~(ETH_LINK_SPEED_10M_HD | ETH_LINK_SPEED_10M | ETH_LINK_SPEED_100M_HD | ETH_LINK_SPEED_100M | - ETH_LINK_SPEED_1G)) { + ETH_LINK_SPEED_1G | ETH_LINK_SPEED_FIXED)) { num_speeds = -1; goto error_invalid_config; } @@ -1272,7 +1272,7 @@ eth_igb_start(struct rte_eth_dev *dev) hw->phy.autoneg_advertised |= ADVERTISE_1000_FULL; num_speeds++; } - if (num_speeds == 0 || (!autoneg && (num_speeds > 2))) + if (num_speeds == 0 || (!autoneg && (num_speeds > 1))) goto error_invalid_config; } @@ -2063,12 +2063,13 @@ eth_igb_link_update(struct rte_eth_dev *dev, int wait_to_complete) if (link_check) { uint16_t duplex, speed; hw->mac.ops.get_link_up_info(hw, &speed, &duplex); - link.link_duplex = duplex ? ETH_LINK_FULL_DUPLEX : + link.link_duplex = (duplex == FULL_DUPLEX) ? + ETH_LINK_FULL_DUPLEX : ETH_LINK_HALF_DUPLEX; link.link_speed = speed; link.link_status = ETH_LINK_UP; - link.link_autoneg = (dev->data->dev_conf.link_speeds & - ETH_LINK_SPEED_AUTONEG); + link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); } else if (!link_check) { link.link_speed = 0; link.link_duplex = ETH_LINK_HALF_DUPLEX; diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 87bc767..c9ef417 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -1422,7 +1422,7 @@ i40e_apply_link_speed(struct rte_eth_dev *dev) speed = i40e_parse_link_speeds(conf->link_speeds); abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK; - if (conf->link_speeds & ETH_LINK_SPEED_AUTONEG) + if (!(conf->link_speeds & ETH_LINK_SPEED_FIXED)) abilities |= I40E_AQ_PHY_AN_ENABLED; else abilities |= I40E_AQ_PHY_LINK_ENABLED; @@ -1442,7 +1442,7 @@ i40e_dev_start(struct rte_eth_dev *dev) hw->adapter_stopped = 0; - if (!(dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_AUTONEG)) { + if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) { PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; autonegotiation disabled", dev->data->port_id); return -EINVAL; @@ -1806,8 +1806,8 @@ i40e_dev_link_update(struct rte_eth_dev *dev, break; } - link.link_autoneg = (dev->data->dev_conf.link_speeds & - ETH_LINK_SPEED_AUTONEG); + link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); out: rte_i40e_dev_atomic_write_link_status(dev, &link); diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index ff23d7d..6cc2da0 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -2098,9 +2098,12 @@ ixgbe_dev_start(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); - /* IXGBE devices don't support half duplex */ - if (!(dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_AUTONEG)) { - PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; autonegotiation disabled", + /* IXGBE devices don't support: + * - half duplex (checked afterwards for valid speeds) + * - fixed speed: TODO implement + */ + if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) { + PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; fix speed not supported", dev->data->port_id); return -EINVAL; } diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 43ac763..81528c9 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -4721,8 +4721,8 @@ mlx4_link_update_unlocked(struct rte_eth_dev *dev, int wait_to_complete) dev_link.link_speed = link_speed; dev_link.link_duplex = ((edata.duplex == DUPLEX_HALF) ? ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX); - dev_link.link_autoneg = (dev->data->dev_conf.link_speeds & - ETH_LINK_SPEED_AUTONEG); + dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { /* Link status changed. */ dev->data->dev_link = dev_link; diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 477939f..36b369e 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -630,6 +630,8 @@ mlx5_link_update_unlocked(struct rte_eth_dev *dev, int wait_to_complete) dev_link.link_speed = link_speed; dev_link.link_duplex = ((edata.duplex == DUPLEX_HALF) ? ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX); + dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { /* Link status changed. */ dev->data->dev_link = dev_link; diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index ef2502a..fb247a7 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -244,8 +244,8 @@ struct rte_eth_stats { /** * Device supported speeds bitmap flags */ -#define ETH_LINK_SPEED_FIXED (0 << 0) /**< Disable autoneg (fixed speed) */ -#define ETH_LINK_SPEED_AUTONEG (1 << 0) /**< Autonegotiate (all speeds) */ +#define ETH_LINK_SPEED_AUTONEG (0 << 0) /**< Autonegotiate (all speeds) */ +#define ETH_LINK_SPEED_FIXED (1 << 0) /**< Disable autoneg (fixed