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

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
......@@ -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");
......
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