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 042F49AC2 for ; Mon, 20 Jun 2016 08:24:41 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP; 19 Jun 2016 23:24:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.26,496,1459839600"; d="scan'208";a="991161210" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga001.fm.intel.com with ESMTP; 19 Jun 2016 23:24:40 -0700 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id u5K6ObGf002581; Mon, 20 Jun 2016 14:24:37 +0800 Received: from shecgisg004.sh.intel.com (localhost [127.0.0.1]) by shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id u5K6OY7J006881; Mon, 20 Jun 2016 14:24:36 +0800 Received: (from wenzhuol@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id u5K6OY7i006877; Mon, 20 Jun 2016 14:24:34 +0800 From: Wenzhuo Lu To: dev@dpdk.org Cc: konstantin.ananyev@intel.com, bruce.richardson@intel.com, jing.d.chen@intel.com, cunming.liang@intel.com, jingjing.wu@intel.com, helin.zhang@intel.com, thomas.monjalon@6wind.com, Wenzhuo Lu Date: Mon, 20 Jun 2016 14:24:27 +0800 Message-Id: <1466403870-6840-2-git-send-email-wenzhuo.lu@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1466403870-6840-1-git-send-email-wenzhuo.lu@intel.com> References: <1465191653-28408-1-git-send-email-wenzhuo.lu@intel.com> <1466403870-6840-1-git-send-email-wenzhuo.lu@intel.com> Subject: [dpdk-dev] [PATCH v6 1/4] lib/librte_ether: support device reset 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: Mon, 20 Jun 2016 06:24:42 -0000 Add an API to reset the device. It's for VF device in this scenario, kernel PF + DPDK VF. When the PF port down->up, APP should call this API to reset VF port. Most likely, APP should call it in its management thread and guarantee the thread safe. It means APP should stop the rx/tx and the device, then reset the device, then recover the device and rx/tx. Signed-off-by: Wenzhuo Lu --- doc/guides/nics/overview.rst | 1 + lib/librte_ether/rte_ethdev.c | 17 +++++++++++++++++ lib/librte_ether/rte_ethdev.h | 24 ++++++++++++++++++++++++ lib/librte_ether/rte_ether_version.map | 7 +++++++ 4 files changed, 49 insertions(+) diff --git a/doc/guides/nics/overview.rst b/doc/guides/nics/overview.rst index 0bd8fae..c8a4985 100644 --- a/doc/guides/nics/overview.rst +++ b/doc/guides/nics/overview.rst @@ -89,6 +89,7 @@ Most of these differences are summarized below. Speed capabilities Link status Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Link status event Y Y Y Y Y Y Y Y Y Y Y Y Y + Link reset Y Y Y Y Y Queue status event Y Rx interrupt Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Queue start/stop Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index e148028..6c0449b 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -3346,3 +3346,20 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id, -ENOTSUP); return (*dev->dev_ops->l2_tunnel_offload_set)(dev, l2_tunnel, mask, en); } + +int +rte_eth_dev_reset(uint8_t port_id) +{ + struct rte_eth_dev *dev; + int diag; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + + dev = &rte_eth_devices[port_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_reset, -ENOTSUP); + + diag = (*dev->dev_ops->dev_reset)(dev); + + return diag; +} diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 2757510..5b3ba12 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1318,6 +1318,9 @@ typedef int (*eth_l2_tunnel_offload_set_t) uint8_t en); /**< @internal enable/disable the l2 tunnel offload functions */ +typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev); +/**< @internal Function used to reset a configured Ethernet device. */ + #ifdef RTE_NIC_BYPASS enum { @@ -1508,6 +1511,8 @@ struct eth_dev_ops { eth_l2_tunnel_eth_type_conf_t l2_tunnel_eth_type_conf; /** Enable/disable l2 tunnel offload functions */ eth_l2_tunnel_offload_set_t l2_tunnel_offload_set; + /** Reset device. */ + eth_dev_reset_t dev_reset; }; /** @@ -4253,6 +4258,25 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id, uint32_t mask, uint8_t en); +/** + * Reset an ethernet device when it's not working. One scenario is, after PF + * port is down and up, the related VF port should be reset. + * The API will stop the port, clear the rx/tx queues, re-setup the rx/tx + * queues, restart the port. + * Before calling this API, APP should stop the rx/tx. When tx is being stopped, + * APP can drop the packets and release the buffer instead of sending them. + * + * @param port_id + * The port identifier of the Ethernet device. + * + * @return + * - (0) if successful. + * - (-ENODEV) if port identifier is invalid. + * - (-ENOTSUP) if hardware doesn't support this function. + */ +int +rte_eth_dev_reset(uint8_t port_id); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 214ecc7..c34207e 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -132,3 +132,10 @@ DPDK_16.04 { rte_eth_tx_buffer_set_err_callback; } DPDK_2.2; + +DPDK_16.07 { + global: + + rte_eth_dev_reset; + +} DPDK_16.04; -- 1.9.3