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

Commit e0346f9f authored by Alan Brady's avatar Alan Brady Committed by Jeff Kirsher
Browse files

i40evf: ignore link up if not running



If we receive the link status message from PF with link up before queues
are actually enabled, it will trigger a TX hang.  This fixes the issue
by ignoring a link up message if the VF state is not yet in RUNNING
state.

Signed-off-by: default avatarAlan Brady <alan.brady@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 557450c3
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -1001,15 +1001,27 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
	if (v_opcode == VIRTCHNL_OP_EVENT) {
		struct virtchnl_pf_event *vpe =
			(struct virtchnl_pf_event *)msg;
		bool link_up = vpe->event_data.link_event.link_status;
		switch (vpe->event) {
		case VIRTCHNL_EVENT_LINK_CHANGE:
			adapter->link_speed =
				vpe->event_data.link_event.link_speed;
			if (adapter->link_up !=
			    vpe->event_data.link_event.link_status) {
				adapter->link_up =
					vpe->event_data.link_event.link_status;
				if (adapter->link_up) {

			/* we've already got the right link status, bail */
			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;

			adapter->link_up = link_up;
			if (link_up) {
				netif_tx_start_all_queues(netdev);
				netif_carrier_on(netdev);
			} else {
@@ -1017,7 +1029,6 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
				netif_carrier_off(netdev);
			}
			i40evf_print_link_message(adapter);
			}
			break;
		case VIRTCHNL_EVENT_RESET_IMPENDING:
			dev_info(&adapter->pdev->dev, "PF reset warning received\n");