DPDK patches and discussions
 help / color / mirror / Atom feed
From: Qi Zhang <qi.z.zhang@intel.com>
To: jing.d.chen@intel.com
Cc: helin.zhang@intel.com, dev@dpdk.org, Qi Zhang <qi.z.zhang@intel.com>
Subject: [dpdk-dev] [PATCH 13/17] net/fm10k/base: don't stop reset
Date: Thu,  2 Mar 2017 22:17:23 -0500	[thread overview]
Message-ID: <20170303031727.461-14-qi.z.zhang@intel.com> (raw)
In-Reply-To: <20170303031727.461-1-qi.z.zhang@intel.com>

Don't report FM10K_ERR_REQUESTS_PENDING when we fail to disable queues
within the timeout. This can occur due to a hardware Tx hang, or when
the switch ethernet fabric is resetting while we are transmitting
traffic. It can sometimes take up to 500ms before the Tx DMA engine
gives up. Instead, just skip the DMA engine check and perform
a data-path reset anyways. Add a statistic counter to keep track of the
number of resets occurring while we have pending DMA on the rings.

In order to prevent having to assign err = FM10K_SUCCESS, re-order the
last few items of the reset_hw_pf function so that we don't perform
"return err" at the end.

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
 drivers/net/fm10k/base/fm10k_pf.c   | 19 +++++++++----------
 drivers/net/fm10k/base/fm10k_type.h |  1 +
 drivers/net/fm10k/base/fm10k_vf.c   | 12 +++++++-----
 3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/net/fm10k/base/fm10k_pf.c b/drivers/net/fm10k/base/fm10k_pf.c
index bbc483d..bce2913 100644
--- a/drivers/net/fm10k/base/fm10k_pf.c
+++ b/drivers/net/fm10k/base/fm10k_pf.c
@@ -66,21 +66,21 @@ STATIC s32 fm10k_reset_hw_pf(struct fm10k_hw *hw)
 
 	/* shut down all rings */
 	err = fm10k_disable_queues_generic(hw, FM10K_MAX_QUEUES);
-	if (err)
+	if (err == FM10K_ERR_REQUESTS_PENDING) {
+		hw->mac.reset_while_pending++;
+		goto force_reset;
+	} else if (err) {
 		return err;
+	}
 
 	/* Verify that DMA is no longer active */
 	reg = FM10K_READ_REG(hw, FM10K_DMA_CTRL);
 	if (reg & (FM10K_DMA_CTRL_TX_ACTIVE | FM10K_DMA_CTRL_RX_ACTIVE))
 		return FM10K_ERR_DMA_PENDING;
 
-	/* verify the switch is ready for reset */
-	reg = FM10K_READ_REG(hw, FM10K_DMA_CTRL2);
-	if (!(reg & FM10K_DMA_CTRL2_SWITCH_READY))
-		goto out;
-
+force_reset:
 	/* Inititate data path reset */
-	reg |= FM10K_DMA_CTRL_DATAPATH_RESET;
+	reg = FM10K_DMA_CTRL_DATAPATH_RESET;
 	FM10K_WRITE_REG(hw, FM10K_DMA_CTRL, reg);
 
 	/* Flush write and allow 100us for reset to complete */
@@ -90,10 +90,9 @@ STATIC s32 fm10k_reset_hw_pf(struct fm10k_hw *hw)
 	/* Verify we made it out of reset */
 	reg = FM10K_READ_REG(hw, FM10K_IP);
 	if (!(reg & FM10K_IP_NOTINRESET))
-		err = FM10K_ERR_RESET_FAILED;
+		return FM10K_ERR_RESET_FAILED;
 
-out:
-	return err;
+	return FM10K_SUCCESS;
 }
 
 /**
diff --git a/drivers/net/fm10k/base/fm10k_type.h b/drivers/net/fm10k/base/fm10k_type.h
index b74cebf..d43e40c 100644
--- a/drivers/net/fm10k/base/fm10k_type.h
+++ b/drivers/net/fm10k/base/fm10k_type.h
@@ -654,6 +654,7 @@ struct fm10k_mac_info {
 	bool tx_ready;
 	u32 dglort_map;
 	u8 itr_scale;
+	u64 reset_while_pending;
 };
 
 struct fm10k_swapi_table_info {
diff --git a/drivers/net/fm10k/base/fm10k_vf.c b/drivers/net/fm10k/base/fm10k_vf.c
index dd3d318..71bacd0 100644
--- a/drivers/net/fm10k/base/fm10k_vf.c
+++ b/drivers/net/fm10k/base/fm10k_vf.c
@@ -49,7 +49,7 @@ STATIC s32 fm10k_stop_hw_vf(struct fm10k_hw *hw)
 
 	/* we need to disable the queues before taking further steps */
 	err = fm10k_stop_hw_generic(hw);
-	if (err)
+	if (err && err != FM10K_ERR_REQUESTS_PENDING)
 		return err;
 
 	/* If permanent address is set then we need to restore it */
@@ -82,7 +82,7 @@ STATIC s32 fm10k_stop_hw_vf(struct fm10k_hw *hw)
 		FM10K_WRITE_REG(hw, FM10K_TDLEN(i), tdlen);
 	}
 
-	return FM10K_SUCCESS;
+	return err;
 }
 
 /**
@@ -100,7 +100,9 @@ STATIC s32 fm10k_reset_hw_vf(struct fm10k_hw *hw)
 
 	/* shut down queues we own and reset DMA configuration */
 	err = fm10k_stop_hw_vf(hw);
-	if (err)
+	if (err == FM10K_ERR_REQUESTS_PENDING)
+		hw->mac.reset_while_pending++;
+	else if (err)
 		return err;
 
 	/* Inititate VF reset */
@@ -113,9 +115,9 @@ STATIC s32 fm10k_reset_hw_vf(struct fm10k_hw *hw)
 	/* Clear reset bit and verify it was cleared */
 	FM10K_WRITE_REG(hw, FM10K_VFCTRL, 0);
 	if (FM10K_READ_REG(hw, FM10K_VFCTRL) & FM10K_VFCTRL_RST)
-		err = FM10K_ERR_RESET_FAILED;
+		return FM10K_ERR_RESET_FAILED;
 
-	return err;
+	return FM10K_SUCCESS;
 }
 
 /**
-- 
2.9.3

  parent reply	other threads:[~2017-03-03  2:26 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-03  3:17 [dpdk-dev] [PATCH 00/17] net/fm10k: update base code Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 01/17] net/fm10k/base: add a flag to indicate VF trust mode Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 02/17] net/fm10k/base: reset multicaset mode when deleting lport Qi Zhang
2017-03-05 11:41   ` Ferruh Yigit
2017-03-03  3:17 ` [dpdk-dev] [PATCH 03/17] net/fm10k/base: expose macros needed by DPDK Qi Zhang
2017-03-05 11:41   ` Ferruh Yigit
2017-03-03  3:17 ` [dpdk-dev] [PATCH 04/17] net/fm10k/base: add error code Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 05/17] net/fm10k/base: clean up the logic Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 06/17] net/fm10k/base: add new item to lport msg attr Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 07/17] net/fm10k/base: use 8 bit notation instead of 10bit notation Qi Zhang
2017-03-05 11:42   ` Ferruh Yigit
2017-03-03  3:17 ` [dpdk-dev] [PATCH 08/17] net/fm10k/base: use different name for override bit Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 09/17] net/fm10k/base: update comment regarding reserved bits check Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 10/17] net/fm10k/base: improve VF's multi-bit VLAN update requests Qi Zhang
2017-03-05 11:42   ` Ferruh Yigit
2017-03-03  3:17 ` [dpdk-dev] [PATCH 11/17] net/fm10k/base: enable lport map request Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 12/17] net/fm10k/base: add macros for global interrupt Qi Zhang
2017-03-03  3:17 ` Qi Zhang [this message]
2017-03-03  3:17 ` [dpdk-dev] [PATCH 14/17] net/fm10k/base: add macro for geneve tunnel offload Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 15/17] net/fm10k/base: improve re-map queues handle Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 16/17] net/fm10k/base: replace macros Qi Zhang
2017-03-03  3:17 ` [dpdk-dev] [PATCH 17/17] net/fm10k/base: equest reset when mbx->state changes Qi Zhang
2017-03-05 11:42   ` Ferruh Yigit
2017-03-05 11:41 ` [dpdk-dev] [PATCH 00/17] net/fm10k: update base code Ferruh Yigit
2017-03-08  6:18 ` [dpdk-dev] [PATCH v2 00/18] " Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 01/18] net/fm10k/base: add a flag to indicate VF trust mode Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 02/18] net/fm10k/base: reset multicast mode when deleting lport Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 03/18] net/fm10k/base: expose macros needed by DPDK Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 04/18] net/fm10k/base: add error code Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 05/18] net/fm10k/base: clean up the logic Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 06/18] net/fm10k/base: add new item to lport msg attr Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 07/18] net/fm10k/base: update comment Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 08/18] net/fm10k/base: use different name for override bit Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 09/18] net/fm10k/base: update comment regarding reserved bits check Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 10/18] net/fm10k/base: improve VF's multi-bit VLAN update requests Qi Zhang
2017-03-08  6:18   ` [dpdk-dev] [PATCH v2 11/18] net/fm10k/base: enable lport map request Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 12/18] net/fm10k/base: add macros for global interrupt Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 13/18] net/fm10k/base: don't stop reset Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 14/18] net/fm10k/base: add macro for geneve tunnel offload Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 15/18] net/fm10k/base: improve re-map queues handle Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 16/18] net/fm10k/base: replace macros Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 17/18] net/fm10k/base: request reset when mbx->state changes Qi Zhang
2017-03-08  6:19   ` [dpdk-dev] [PATCH v2 18/18] net/fm10k/base: add base driver information Qi Zhang
2017-03-09 11:13   ` [dpdk-dev] [PATCH v2 00/18] net/fm10k: update base code Ferruh Yigit
2017-03-10  3:11     ` Zhang, Qi Z

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170303031727.461-14-qi.z.zhang@intel.com \
    --to=qi.z.zhang@intel.com \
    --cc=dev@dpdk.org \
    --cc=helin.zhang@intel.com \
    --cc=jing.d.chen@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).