Commit ae136708 authored by Harshitha Ramamurthy's avatar Harshitha Ramamurthy Committed by Jeff Kirsher
Browse files

i40e: Error handling for link event



There exists an intermittent bug which causes the 'Link Detected'
field reported by the 'ethtool <iface>' command to be 'Yes' when
in fact, there is no link. This patch fixes the problem by
enabling temporary link polling when i40e_get_link_status returns
an error. This causes the driver to remember that an admin queue
command failed and polls, until the function returns with a success.

Change-Id: I64c69b008db4017b8729f3fc27b8f65c8fe2eaa0
Signed-off-by: default avatarHarshitha Ramamurthy <harshitha.ramamurthy@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 5cb25901
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ struct i40e_pf {
#define I40E_FLAG_HAVE_CRT_RETIMER		BIT_ULL(52)
#define I40E_FLAG_PTP_L4_CAPABLE		BIT_ULL(53)
#define I40E_FLAG_WOL_MC_MAGIC_PKT_WAKE		BIT_ULL(54)
#define I40E_FLAG_TEMP_LINK_POLLING		BIT_ULL(55)

	/* tracks features that get auto disabled by errors */
	u64 auto_disable_flags;
+12 −2
Original line number Diff line number Diff line
@@ -6353,7 +6353,16 @@ static void i40e_link_event(struct i40e_pf *pf)
	old_link = (pf->hw.phy.link_info_old.link_info & I40E_AQ_LINK_UP);

	status = i40e_get_link_status(&pf->hw, &new_link);
	if (status) {

	/* On success, disable temp link polling */
	if (status == I40E_SUCCESS) {
		if (pf->flags & I40E_FLAG_TEMP_LINK_POLLING)
			pf->flags &= ~I40E_FLAG_TEMP_LINK_POLLING;
	} else {
		/* Enable link polling temporarily until i40e_get_link_status
		 * returns I40E_SUCCESS
		 */
		pf->flags |= I40E_FLAG_TEMP_LINK_POLLING;
		dev_dbg(&pf->pdev->dev, "couldn't get link state, status: %d\n",
			status);
		return;
@@ -6405,7 +6414,8 @@ static void i40e_watchdog_subtask(struct i40e_pf *pf)
		return;
	pf->service_timer_previous = jiffies;

	if (pf->flags & I40E_FLAG_LINK_POLLING_ENABLED)
	if ((pf->flags & I40E_FLAG_LINK_POLLING_ENABLED) ||
	    (pf->flags & I40E_FLAG_TEMP_LINK_POLLING))
		i40e_link_event(pf);

	/* Update the stats for active netdevs so the network stack