From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 387A7567C for ; Wed, 23 Dec 2015 06:33:08 +0100 (CET) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 22 Dec 2015 21:33:07 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,467,1444719600"; d="scan'208";a="18010918" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga004.fm.intel.com with ESMTP; 22 Dec 2015 21:33:06 -0800 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id tBN5X46i011237; Wed, 23 Dec 2015 13:33:04 +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 tBN5X03N008217; Wed, 23 Dec 2015 13:33:02 +0800 Received: (from hzhan75@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id tBN5X0UI008213; Wed, 23 Dec 2015 13:33:00 +0800 From: Helin Zhang To: dev@dpdk.org Date: Wed, 23 Dec 2015 13:32:59 +0800 Message-Id: <1450848779-8183-1-git-send-email-helin.zhang@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dpdk-dev] [PATCH] i40e: fix the issue of port initialization failure 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 Dec 2015 05:33:08 -0000 Workaround for the issue of cannot processing adminq commands during initialization, when 2x40G or 4x10G is receiving packets in highest throughput. Register 0x002698a8 and 0x002698ac should be cleared at first, and restored with the default values at the end. No more details, as they are not exposed registers. Signed-off-by: Helin Zhang --- drivers/net/i40e/i40e_ethdev.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index bf6220d..149a31e 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -712,6 +712,41 @@ i40e_add_tx_flow_control_drop_filter(struct i40e_pf *pf) " frames from VSIs."); } +/* Workaround for the issue of cannot processing adminq commands during + * initialization, when 2x40G or 4x10G is receiving packets in highest + * throughput. Register 0x002698a8 and 0x002698ac should be cleared at + * first, and restored with the default values at the end. No more details, + * as they are not exposed registers. + */ +static void +i40e_clear_fdena(struct i40e_hw *hw) +{ + uint32_t fdena0, fdena1; + + fdena0 = I40E_READ_REG(hw, 0x002698a8); + fdena1 = I40E_READ_REG(hw, 0x002698ac); + PMD_INIT_LOG(DEBUG, "[0x002698a8]: 0x%08x, [0x002698ac]: 0x%08x", + fdena0, fdena1); + + I40E_WRITE_REG(hw, 0x002698a8, 0x0); + I40E_WRITE_REG(hw, 0x002698ac, 0x0); + I40E_WRITE_FLUSH(hw); +} + +/* Workaround for the issue of cannot processing adminq commands during + * initialization, when 2x40G or 4x10G is receiving packets in highest + * throughput. Register 0x002698a8 and 0x002698ac should be cleared at + * first, and restored with the default values at the end. No more details, + * as they are not exposed registers. + */ +static void +i40e_restore_fdena(struct i40e_hw *hw) +{ + I40E_WRITE_REG(hw, 0x002698a8, 0xfc000000); + I40E_WRITE_REG(hw, 0x002698ac, 0x80007fdf); + I40E_WRITE_FLUSH(hw); +} + static int eth_i40e_dev_init(struct rte_eth_dev *dev) { @@ -774,6 +809,8 @@ eth_i40e_dev_init(struct rte_eth_dev *dev) return ret; } + i40e_clear_fdena(hw); + /* Initialize the shared code (base driver) */ ret = i40e_init_shared_code(hw); if (ret) { @@ -934,6 +971,8 @@ eth_i40e_dev_init(struct rte_eth_dev *dev) pf->flags &= ~I40E_FLAG_DCB; } + i40e_restore_fdena(hw); + return 0; err_mac_alloc: -- 1.9.3