Commit 836ce5ed authored by Avinash Dayanand's avatar Avinash Dayanand Committed by Jeff Kirsher

i40evf: Fix link up issue when queues are disabled

One of the previous patch fixes the link up issue by ignoring it if
i40evf is not in __I40EVF_RUNNING state. However this doesn't fix the
race condition when queues are disabled esp for ADq on VF. Hence check
if all queues are enabled before starting all queues.
Signed-off-by: default avatarAvinash Dayanand <avinash.dayanand@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 1d631583
...@@ -240,6 +240,7 @@ struct i40evf_adapter { ...@@ -240,6 +240,7 @@ struct i40evf_adapter {
#define I40EVF_FLAG_ALLMULTI_ON BIT(14) #define I40EVF_FLAG_ALLMULTI_ON BIT(14)
#define I40EVF_FLAG_LEGACY_RX BIT(15) #define I40EVF_FLAG_LEGACY_RX BIT(15)
#define I40EVF_FLAG_REINIT_ITR_NEEDED BIT(16) #define I40EVF_FLAG_REINIT_ITR_NEEDED BIT(16)
#define I40EVF_FLAG_QUEUES_DISABLED BIT(17)
/* duplicates for common code */ /* duplicates for common code */
#define I40E_FLAG_DCB_ENABLED 0 #define I40E_FLAG_DCB_ENABLED 0
#define I40E_FLAG_RX_CSUM_ENABLED I40EVF_FLAG_RX_CSUM_ENABLED #define I40E_FLAG_RX_CSUM_ENABLED I40EVF_FLAG_RX_CSUM_ENABLED
......
...@@ -1913,6 +1913,7 @@ static void i40evf_reset_task(struct work_struct *work) ...@@ -1913,6 +1913,7 @@ static void i40evf_reset_task(struct work_struct *work)
i40evf_free_all_rx_resources(adapter); i40evf_free_all_rx_resources(adapter);
i40evf_free_all_tx_resources(adapter); i40evf_free_all_tx_resources(adapter);
adapter->flags |= I40EVF_FLAG_QUEUES_DISABLED;
/* kill and reinit the admin queue */ /* kill and reinit the admin queue */
i40evf_shutdown_adminq(hw); i40evf_shutdown_adminq(hw);
adapter->current_op = VIRTCHNL_OP_UNKNOWN; adapter->current_op = VIRTCHNL_OP_UNKNOWN;
......
...@@ -1017,14 +1017,25 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, ...@@ -1017,14 +1017,25 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
if (adapter->link_up == link_up) if (adapter->link_up == link_up)
break; break;
/* If we get link up message and start queues before if (link_up) {
* our queues are configured it will trigger a TX hang. /* If we get link up message and start queues
* In that case, just ignore the link status message, * before our queues are configured it will
* we'll get another one after we enable queues and * trigger a TX hang. In that case, just ignore
* actually prepared to send traffic. * the link status message,we'll get another one
*/ * after we enable queues and actually prepared
if (link_up && adapter->state != __I40EVF_RUNNING) * to send traffic.
break; */
if (adapter->state != __I40EVF_RUNNING)
break;
/* For ADq enabled VF, we reconfigure VSIs and
* re-allocate queues. Hence wait till all
* queues are enabled.
*/
if (adapter->flags &
I40EVF_FLAG_QUEUES_DISABLED)
break;
}
adapter->link_up = link_up; adapter->link_up = link_up;
if (link_up) { if (link_up) {
...@@ -1108,6 +1119,7 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, ...@@ -1108,6 +1119,7 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
case VIRTCHNL_OP_ENABLE_QUEUES: case VIRTCHNL_OP_ENABLE_QUEUES:
/* enable transmits */ /* enable transmits */
i40evf_irq_enable(adapter, true); i40evf_irq_enable(adapter, true);
adapter->flags &= ~I40EVF_FLAG_QUEUES_DISABLED;
break; break;
case VIRTCHNL_OP_DISABLE_QUEUES: case VIRTCHNL_OP_DISABLE_QUEUES:
i40evf_free_all_tx_resources(adapter); i40evf_free_all_tx_resources(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment