From: Qi Zhang <qi.z.zhang@intel.com>
To: beilei.xing@intel.com
Cc: dev@dpdk.org, jingjing.wu@intel.com, Qi Zhang <qi.z.zhang@intel.com>
Subject: [dpdk-dev] [PATCH v3 05/24] net/i40e/base: retry AQC to overcome IRCRead hangs
Date: Tue, 9 Jan 2018 15:30:03 -0500 [thread overview]
Message-ID: <1515529822-10732-6-git-send-email-qi.z.zhang@intel.com> (raw)
In-Reply-To: <1515529822-10732-1-git-send-email-qi.z.zhang@intel.com>
When the I2C is busy, the PHY reads are delayed. The firmware will
return EGAIN in these cases with an expectation that the SW will trigger
the reads again. This patch retries the operation for a maximum period
of 500ms
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
drivers/net/i40e/base/i40e_common.c | 42 +++++++++++++++++++++++++------------
drivers/net/i40e/base/i40e_type.h | 3 +++
2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/drivers/net/i40e/base/i40e_common.c b/drivers/net/i40e/base/i40e_common.c
index 900d379ca..1dc5c62cb 100644
--- a/drivers/net/i40e/base/i40e_common.c
+++ b/drivers/net/i40e/base/i40e_common.c
@@ -1675,31 +1675,47 @@ enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
{
struct i40e_aq_desc desc;
enum i40e_status_code status;
+ u16 max_delay = I40E_MAX_PHY_TIMEOUT, total_delay = 0;
u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
if (!abilities)
return I40E_ERR_PARAM;
- i40e_fill_default_direct_cmd_desc(&desc,
- i40e_aqc_opc_get_phy_abilities);
+ do {
+ i40e_fill_default_direct_cmd_desc(&desc,
+ i40e_aqc_opc_get_phy_abilities);
- desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
- if (abilities_size > I40E_AQ_LARGE_BUF)
- desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
+ desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
+ if (abilities_size > I40E_AQ_LARGE_BUF)
+ desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
- if (qualified_modules)
- desc.params.external.param0 |=
+ if (qualified_modules)
+ desc.params.external.param0 |=
CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
- if (report_init)
- desc.params.external.param0 |=
+ if (report_init)
+ desc.params.external.param0 |=
CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
- status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
- cmd_details);
+ status = i40e_asq_send_command(hw, &desc, abilities,
+ abilities_size, cmd_details);
- if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
- status = I40E_ERR_UNKNOWN_PHY;
+ if (status != I40E_SUCCESS)
+ break;
+
+ if (hw->aq.asq_last_status == I40E_AQ_RC_EIO) {
+ status = I40E_ERR_UNKNOWN_PHY;
+ break;
+ } else if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN) {
+ i40e_msec_delay(1);
+ total_delay++;
+ status = I40E_ERR_TIMEOUT;
+ }
+ } while ((hw->aq.asq_last_status != I40E_AQ_RC_OK) &&
+ (total_delay < max_delay));
+
+ if (status != I40E_SUCCESS)
+ return status;
if (report_init) {
if (hw->mac.type == I40E_MAC_XL710 &&
diff --git a/drivers/net/i40e/base/i40e_type.h b/drivers/net/i40e/base/i40e_type.h
index d049509a2..438e70678 100644
--- a/drivers/net/i40e/base/i40e_type.h
+++ b/drivers/net/i40e/base/i40e_type.h
@@ -77,6 +77,9 @@ POSSIBILITY OF SUCH DAMAGE.
/* Max default timeout in ms, */
#define I40E_MAX_NVM_TIMEOUT 18000
+/* Max timeout in ms for the phy to respond */
+#define I40E_MAX_PHY_TIMEOUT 500
+
/* Check whether address is multicast. */
#define I40E_IS_MULTICAST(address) (bool)(((u8 *)(address))[0] & ((u8)0x01))
--
2.14.1
next prev parent reply other threads:[~2018-01-10 3:39 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-09 20:29 [dpdk-dev] [PATCH v3 00/24] net/i40e: update base code Qi Zhang
2018-01-09 20:29 ` [dpdk-dev] [PATCH v3 01/24] net/i40e/base: add new PHY type Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 02/24] net/i40e/base: add capability macros Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 03/24] net/i40e/base: add (Q)SFP module memory access definitions Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 04/24] net/i40e/base: release spinlock before function returns Qi Zhang
2018-01-09 20:30 ` Qi Zhang [this message]
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 06/24] net/i40e/base: add byte swaps in PHY register access Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 07/24] net/i40e/base: add macro for 25G device Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 08/24] net/i40e/base: code refactoring for LED blink Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 09/24] net/i40e/base: add link speed convert function Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 10/24] net/i40e/base: add AQ command for DCB parameters Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 11/24] net/i40e/base: fix NVM lock Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 12/24] net/i40e/base: code clean Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 13/24] net/i40e/base: add NVM update preservation flags Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 14/24] net/i40e/base: enable AQ event get in NVM update Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 15/24] net/i40e/base: fix link LED blink Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 16/24] net/i40e/base: add defines for flat NVM Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 17/24] net/i40e: enhanced loopback AQ command Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 18/24] net/i40e/base: add rearrange process " Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 19/24] net/i40e/base: add AQ critical error type Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 20/24] net/i40e/base: fix compile issue for GCC 6.3 Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 21/24] net/i40e/base: fix reading LLDP configuration Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 22/24] net/i40e/base: fix unaligned data issue Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 23/24] net/i40e: rename a field Qi Zhang
2018-01-09 20:30 ` [dpdk-dev] [PATCH v3 24/24] net/i40e/base: update README file Qi Zhang
2018-01-10 5:37 ` [dpdk-dev] [PATCH v3 00/24] net/i40e: update base code Xing, Beilei
2018-01-10 9:29 ` Zhang, Helin
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=1515529822-10732-6-git-send-email-qi.z.zhang@intel.com \
--to=qi.z.zhang@intel.com \
--cc=beilei.xing@intel.com \
--cc=dev@dpdk.org \
--cc=jingjing.wu@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).