mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 17:17:54 +07:00
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: Avinash Dayanand <avinash.dayanand@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
1d631583ae
commit
836ce5ed72
@ -240,6 +240,7 @@ struct i40evf_adapter {
|
||||
#define I40EVF_FLAG_ALLMULTI_ON BIT(14)
|
||||
#define I40EVF_FLAG_LEGACY_RX BIT(15)
|
||||
#define I40EVF_FLAG_REINIT_ITR_NEEDED BIT(16)
|
||||
#define I40EVF_FLAG_QUEUES_DISABLED BIT(17)
|
||||
/* duplicates for common code */
|
||||
#define I40E_FLAG_DCB_ENABLED 0
|
||||
#define I40E_FLAG_RX_CSUM_ENABLED I40EVF_FLAG_RX_CSUM_ENABLED
|
||||
|
@ -1913,6 +1913,7 @@ static void i40evf_reset_task(struct work_struct *work)
|
||||
i40evf_free_all_rx_resources(adapter);
|
||||
i40evf_free_all_tx_resources(adapter);
|
||||
|
||||
adapter->flags |= I40EVF_FLAG_QUEUES_DISABLED;
|
||||
/* kill and reinit the admin queue */
|
||||
i40evf_shutdown_adminq(hw);
|
||||
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
|
||||
|
@ -1017,14 +1017,25 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
|
||||
if (adapter->link_up == link_up)
|
||||
break;
|
||||
|
||||
/* If we get link up message and start queues before
|
||||
* our queues are configured it will trigger a TX hang.
|
||||
* In that case, just ignore the link status message,
|
||||
* we'll get another one after we enable queues and
|
||||
* actually prepared to send traffic.
|
||||
*/
|
||||
if (link_up && adapter->state != __I40EVF_RUNNING)
|
||||
break;
|
||||
if (link_up) {
|
||||
/* If we get link up message and start queues
|
||||
* before our queues are configured it will
|
||||
* trigger a TX hang. In that case, just ignore
|
||||
* the link status message,we'll get another one
|
||||
* after we enable queues and actually prepared
|
||||
* to send traffic.
|
||||
*/
|
||||
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;
|
||||
if (link_up) {
|
||||
@ -1108,6 +1119,7 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
|
||||
case VIRTCHNL_OP_ENABLE_QUEUES:
|
||||
/* enable transmits */
|
||||
i40evf_irq_enable(adapter, true);
|
||||
adapter->flags &= ~I40EVF_FLAG_QUEUES_DISABLED;
|
||||
break;
|
||||
case VIRTCHNL_OP_DISABLE_QUEUES:
|
||||
i40evf_free_all_tx_resources(adapter);
|
||||
|
Loading…
Reference in New Issue
Block a user