Commit 0758e7cb authored by Mitch A Williams's avatar Mitch A Williams Committed by Jeff Kirsher

i40evf: kick a stalled admin queue

On some versions of the firmware, the VF admin send queue may become
stalled. In this case, the easiest solution is to just place another
descriptor on the queue; the firmware will then process both requests.

The early init code already accounts for this, but the runtime code does
not. In the watchdog task, check for the stall condition, and if it's
found, send our API version to the PF. When the PF replies, just ignore
the reply.

Change-ID: I380d78185a4f284d649c44d263e648afc9b4d50c
Signed-off-by: default avatarMitch Williams <mitch.a.williams@intel.com>
Acked-by: default avatarShannon Nelson <shannon.nelson@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 7235448c
...@@ -1336,8 +1336,13 @@ static void i40evf_watchdog_task(struct work_struct *work) ...@@ -1336,8 +1336,13 @@ static void i40evf_watchdog_task(struct work_struct *work)
/* Process admin queue tasks. After init, everything gets done /* Process admin queue tasks. After init, everything gets done
* here so we don't race on the admin queue. * here so we don't race on the admin queue.
*/ */
if (adapter->aq_pending) if (adapter->aq_pending) {
if (!i40evf_asq_done(hw)) {
dev_dbg(&adapter->pdev->dev, "Admin queue timeout\n");
i40evf_send_api_ver(adapter);
}
goto watchdog_done; goto watchdog_done;
}
if (adapter->aq_required & I40EVF_FLAG_AQ_MAP_VECTORS) { if (adapter->aq_required & I40EVF_FLAG_AQ_MAP_VECTORS) {
i40evf_map_queues(adapter); i40evf_map_queues(adapter);
......
...@@ -720,6 +720,9 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, ...@@ -720,6 +720,9 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
__func__, v_retval, v_opcode); __func__, v_retval, v_opcode);
} }
switch (v_opcode) { switch (v_opcode) {
case I40E_VIRTCHNL_OP_VERSION:
/* no action, but also not an error */
break;
case I40E_VIRTCHNL_OP_GET_STATS: { case I40E_VIRTCHNL_OP_GET_STATS: {
struct i40e_eth_stats *stats = struct i40e_eth_stats *stats =
(struct i40e_eth_stats *)msg; (struct i40e_eth_stats *)msg;
......
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