From patchwork Fri Mar 30 05:39:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yanglong Wu X-Patchwork-Id: 36765 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D72B55F1C; Fri, 30 Mar 2018 07:44:17 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id D14125B12 for ; Fri, 30 Mar 2018 07:44:09 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Mar 2018 22:44:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,380,1517904000"; d="scan'208";a="28193360" Received: from wuyanglong.sh.intel.com ([10.67.110.174]) by fmsmga007.fm.intel.com with ESMTP; 29 Mar 2018 22:44:08 -0700 From: Yanglong Wu To: dev@dpdk.org Cc: qi.z.zhang@intel.com, wei.dai@intel.com, beilei.xing@intel.com, Yanglong Wu Date: Fri, 30 Mar 2018 13:39:57 +0800 Message-Id: <20180330053957.160367-3-yanglong.wu@intel.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180330053957.160367-1-yanglong.wu@intel.com> References: <20180328020432.169643-1-yanglong.wu@intel.com> <20180330053957.160367-1-yanglong.wu@intel.com> Subject: [dpdk-dev] [PATCH v3 2/2] net/i40e: convert to new Tx offloads API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Ethdev Tx offloads API has changed since: commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") This commit support the new Tx offloads API. Signed-off-by: Yanglong Wu --- v2: Adding offload requests checking and reworking patch according to review comments --- v3: fix error --- --- drivers/net/i40e/i40e_ethdev.c | 1 + drivers/net/i40e/i40e_ethdev_vf.c | 1 + drivers/net/i40e/i40e_rxtx.c | 24 ++++++++++++++++++++++++ drivers/net/i40e/i40e_rxtx.h | 1 + 4 files changed, 27 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 06f11dd23..5f520d2bc 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -3231,6 +3231,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) DEV_RX_OFFLOAD_VLAN_EXTEND | DEV_RX_OFFLOAD_VLAN_FILTER; + dev_info->tx_queue_offload_capa = 0; dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | DEV_TX_OFFLOAD_QINQ_INSERT | diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c index cb338def9..d04cd28ae 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -2185,6 +2185,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) DEV_RX_OFFLOAD_CRC_STRIP | DEV_RX_OFFLOAD_SCATTER; + dev_info->tx_queue_offload_capa = 0; dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | DEV_TX_OFFLOAD_QINQ_INSERT | diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c index 4fdef69c1..b72b81350 100644 --- a/drivers/net/i40e/i40e_rxtx.c +++ b/drivers/net/i40e/i40e_rxtx.c @@ -1998,6 +1998,20 @@ i40e_dev_tx_descriptor_status(void *tx_queue, uint16_t offset) return RTE_ETH_TX_DESC_FULL; } +static int +i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested) +{ + struct rte_eth_dev_info dev_info; + uint64_t mandatory = dev->data->dev_conf.txmode.offloads; + uint64_t supported; /* All per port offloads */ + + dev->dev_ops->dev_infos_get(dev, &dev_info); + supported = dev_info.tx_offload_capa ^ dev_info.tx_queue_offload_capa; + if ((requested & dev_info.tx_offload_capa) != requested) + return 0; /* requested range check */ + return !((mandatory ^ requested) & supported); +} + int i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, @@ -2015,6 +2029,16 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_rs_thresh, tx_free_thresh; uint16_t reg_idx, i, base, bsf, tc_mapping; int q_offset; + struct rte_eth_dev_info dev_info; + + if (!i40e_check_tx_queue_offloads(dev, tx_conf->offloads)) { + dev->dev_ops->dev_infos_get(dev, &dev_info); + PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64 + " don't match port offloads 0x%" PRIx64 + " or supported offloads 0x%" PRIx64, + (void *)dev, tx_conf->offloads, + dev->data->dev_conf.txmode.offloads, + dev_info.tx_offload_capa); } if (hw->mac.type == I40E_MAC_VF || hw->mac.type == I40E_MAC_X722_VF) { vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h index cb5f8c714..10feec4a2 100644 --- a/drivers/net/i40e/i40e_rxtx.h +++ b/drivers/net/i40e/i40e_rxtx.h @@ -149,6 +149,7 @@ struct i40e_tx_queue { bool q_set; /**< indicate if tx queue has been configured */ bool tx_deferred_start; /**< don't start this queue in dev start */ uint8_t dcb_tc; /**< Traffic class of tx queue */ + uint64_t offloads; /**< Tx offload flags of DEV_RX_OFFLOAD_* */ }; /** Offload features */