Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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
+1 −0
Original line number Original line Diff line number Diff line
@@ -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;
+20 −8
Original line number Original line Diff line number Diff line
@@ -1017,15 +1017,26 @@ 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
				 * to send traffic.
				 */
				 */
			if (link_up && adapter->state != __I40EVF_RUNNING)
				if (adapter->state != __I40EVF_RUNNING)
					break;
					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) {
				netif_tx_start_all_queues(netdev);
				netif_tx_start_all_queues(netdev);
@@ -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);