From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 84E761025 for ; Wed, 23 Apr 2014 17:39:51 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP; 23 Apr 2014 08:35:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,912,1389772800"; d="scan'208";a="518037161" Received: from irsmsx104.ger.corp.intel.com ([163.33.3.159]) by fmsmga001.fm.intel.com with ESMTP; 23 Apr 2014 08:39:52 -0700 Received: from irsmsx108.ger.corp.intel.com (163.33.3.3) by IRSMSX104.ger.corp.intel.com (163.33.3.159) with Microsoft SMTP Server (TLS) id 14.3.123.3; Wed, 23 Apr 2014 16:39:51 +0100 Received: from irsmsx105.ger.corp.intel.com ([169.254.7.70]) by IRSMSX108.ger.corp.intel.com ([169.254.11.221]) with mapi id 14.03.0123.003; Wed, 23 Apr 2014 16:39:51 +0100 From: "Ananyev, Konstantin" To: "dev@dpdk.org" Thread-Topic: [PATCH] ixgbevf jumbo frame issue with DPDK VF] fix for jumbo frame issue with DPDK VF Thread-Index: Ac9e/6GxqwhPUJ61R76tBpfPeno1tw== Date: Wed, 23 Apr 2014 15:39:51 +0000 Message-ID: <2601191342CEEE43887BDE71AB9772580EFA06D2@IRSMSX105.ger.corp.intel.com> Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.182] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH] ixgbevf jumbo frame issue with DPDK VF] fix for jumbo frame issue with DPDK VF 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: , X-List-Received-Date: Wed, 23 Apr 2014 15:39:52 -0000 When latest Linux ixgbe PF is used, and DPDK VF is used in DPDK application= , jumbo frames are not received. Also - if Linux ixgbe PF has MTU set to 1500 (default), then normal sized p= ackets can be received by DPDK VF. However, if Linux PF has MTU > 1500, then DPDK VF receives no packets (norm= al or jumbo). With ixgbe_mbox_api_10 ixgbe simply didn't allow set VF MTU > 1514 for 8259= 9. With ixgbe_mbox_ajpi_11 it does, though now, if PF uses jumbo frames, it si= mply disables RX for all VFs. So to work with PF ithat using jumbo frames, at startup each VF has to: 1. negotiate with PF mbox_api_11. 2. Send to PF SET_LPE message with desired MTU. Note, that if PF already uses MTU bigger then asked by the VF, then PF woul= dn't take any action. Signed-off-by: Konstantin Ananyev --- lib/librte_pmd_e1000/igb_rxtx.c | 7 ++++- lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 47 ++++++++++++++++++++++++-------= --- lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 4 +++ 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/lib/librte_pmd_e1000/igb_rxtx.c b/lib/librte_pmd_e1000/igb_rxt= x.c index 4608595..1ebe2f5 100644 --- a/lib/librte_pmd_e1000/igb_rxtx.c +++ b/lib/librte_pmd_e1000/igb_rxtx.c @@ -2077,6 +2077,11 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev) =20 hw =3D E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); =20 + /* setup MTU */ + e1000_rlpml_set_vf(hw, + (uint16_t)(dev->data->dev_conf.rxmode.max_rx_pkt_len + + VLAN_TAG_SIZE)); + /* Configure and enable each RX queue. */ rctl_bsize =3D 0; dev->rx_pkt_burst =3D eth_igb_recv_pkts; @@ -2149,7 +2154,7 @@ eth_igbvf_= rx_init(struct rte_eth_dev *dev) rxdctl &=3D 0xFFF00000; rxdctl |=3D (rxq->pthresh & 0x1F); rxdctl |=3D ((rxq->hthresh & 0x1F) << 8); - if (hw->mac.type =3D=3D e1000_82576) { + if (hw->mac.type =3D=3D e1000_vfadapt) { /*=20 * Workaround of 82576 VF Erratum * force set WTHRESH to 1 diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixg= be_ethdev.c index a5a7f9a..6dd52d7 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c @@ -808,19 +808,30 @@ eth_ixgbe_dev_init(__attribute__((unused)) struct eth= _driver *eth_drv, return 0; } =20 -static void ixgbevf_get_queue_num(struct ixgbe_hw *hw) + +/* + * Negotiate mailbox API version with the PF. + * After reset API version is always set to the basic one (ixgbe_mbox_api_= 10). + * Then we try to negotiate starting with the most recent one. + * If all negotiation attempts fail, then we will proceed with + * the default one (ixgbe_mbox_api_10). + */ +static void +ixgbevf_negotiate_api(struct ixgbe_hw *hw) { - /* Traffic classes are not supported by now */ - unsigned int tcs, tc; + int32_t i; =20 - /* - * Must let PF know we are at mailbox API version 1.1. - * Otherwise PF won't answer properly. - * In case that PF fails to provide Rx/Tx queue number, - * max_tx_queues and max_rx_queues remain to be 1. - */ - if (!ixgbevf_negotiate_api_version(hw, ixgbe_mbox_api_11)) - ixgbevf_get_queues(hw, &tcs, &tc); + /* start with highest supported, proceed down */ + static const enum ixgbe_pfvf_api_rev sup_ver[] =3D { + ixgbe_mbox_api_11, + ixgbe_mbox_api_10, + }; + + for (i =3D 0; + i !=3D RTE_DIM(sup_ver) && + ixgbevf_negotiate_api_version(hw, sup_ver[i]) !=3D 0; + i++) + ; } =20 /* @@ -830,9 +841,11 @@ static int eth_ixgbevf_dev_init(__attribute__((unused)) struct eth_driver *eth_drv, struct rte_eth_dev *eth_dev) { - struct rte_pci_device *pci_dev; - struct ixgbe_hw *hw =3D IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_privat= e); int diag; + uint32_t tc, tcs; + struct rte_pci_device *pci_dev; + struct ixgbe_hw *hw =3D + IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private); struct ixgbe_vfta * shadow_vfta =3D IXGBE_DEV_PRIVATE_TO_VFTA(eth_dev->data->dev_private); struct ixgbe_hwstrip *hwstrip =3D @@ -891,8 +904,11 @@ eth_ixgbevf_dev_init(__attribute__((unused)) struct et= h_driver *eth_drv, return (diag); } =20 + /* negotiate mailbox API version to use with the PF. */ + ixgbevf_negotiate_api(hw); + /* Get Rx/Tx queue count via mailbox, which is ready after reset_hw */ - ixgbevf_get_queue_num(hw); + ixgbevf_get_queues(hw, &tcs, &tc); =20 /* Allocate memory for storing MAC addresses */ eth_dev->data->mac_addrs =3D rte_zmalloc("ixgbevf", ETHER_ADDR_LEN * @@ -= 2518,6 +2534,9 @@ ixgbevf_dev_start(struct rte_eth_dev *dev) =20 hw->mac.ops.reset_hw(hw); =20 + /* negotiate mailbox API version to use with the PF. */ + ixgbevf_negotiate_api(hw); + ixgbevf_dev_tx_init(dev); =20 /* This can fail when allocating mbufs for descriptor rings */ diff --git= a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c index 55414b9..7930dbd 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c @@ -3594,6 +3594,10 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); hw =3D IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); =20 + /* setup MTU */ + ixgbevf_rlpml_set_vf(hw, + (uint16_t)dev->data->dev_conf.rxmode.max_rx_pkt_len); + /* Setup RX queues */ dev->rx_pkt_burst =3D ixgbe_recv_pkts; for (i =3D 0; i < dev->data->nb_rx_queues; i++) { -- 1.7.7