i40e/i40evf: ARQ copy desc data even for failed commands
authorKamil Krawczyk <kamil.krawczyk@intel.com>
Wed, 9 Jul 2014 07:46:15 +0000 (07:46 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 24 Jul 2014 11:37:18 +0000 (04:37 -0700)
Copy desc and buffer data even for ARQ events which return error status.
Previously, a check for NVM related AQ commands which is done later in this
function would not recognize that such a command was received and would
not clear nvm_busy flag. This would block access to NVM until a driver reset.
This will fix that.

Change-ID: If69ad74e165b56081c0686b97402511d2e2880c0
Signed-off-by: Kamil Krawczyk <kamil.krawczyk@intel.com>
Tested-by: Jim Young <jamesx.m.young@intel.com>
Tested-by: Sibai Li <sibai.li@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_adminq.c
drivers/net/ethernet/intel/i40evf/i40e_adminq.c

index 1e21fbb1359c4ac52d161df678d98574d4548ac1..c6d767c63f1b1a5407274fb0e889f51022d2b504 100644 (file)
@@ -979,15 +979,15 @@ i40e_status i40e_clean_arq_element(struct i40e_hw *hw,
                           I40E_DEBUG_AQ_MESSAGE,
                           "AQRX: Event received with error 0x%X.\n",
                           hw->aq.arq_last_status);
-       } else {
-               e->desc = *desc;
-               datalen = le16_to_cpu(desc->datalen);
-               e->msg_size = min(datalen, e->msg_size);
-               if (e->msg_buf != NULL && (e->msg_size != 0))
-                       memcpy(e->msg_buf, hw->aq.arq.r.arq_bi[desc_idx].va,
-                              e->msg_size);
        }
 
+       e->desc = *desc;
+       datalen = le16_to_cpu(desc->datalen);
+       e->msg_size = min(datalen, e->msg_size);
+       if (e->msg_buf != NULL && (e->msg_size != 0))
+               memcpy(e->msg_buf, hw->aq.arq.r.arq_bi[desc_idx].va,
+                      e->msg_size);
+
        i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQRX: desc and buffer:\n");
        i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, e->msg_buf);
 
index ee3a934043bbf1ec967305f56c01bc3e28cc339c..3291d2cb2897a172170686cd8109a2cc41b1a08f 100644 (file)
@@ -927,15 +927,15 @@ i40e_status i40evf_clean_arq_element(struct i40e_hw *hw,
                           I40E_DEBUG_AQ_MESSAGE,
                           "AQRX: Event received with error 0x%X.\n",
                           hw->aq.arq_last_status);
-       } else {
-               e->desc = *desc;
-               datalen = le16_to_cpu(desc->datalen);
-               e->msg_size = min(datalen, e->msg_size);
-               if (e->msg_buf != NULL && (e->msg_size != 0))
-                       memcpy(e->msg_buf, hw->aq.arq.r.arq_bi[desc_idx].va,
-                              e->msg_size);
        }
 
+       e->desc = *desc;
+       datalen = le16_to_cpu(desc->datalen);
+       e->msg_size = min(datalen, e->msg_size);
+       if (e->msg_buf != NULL && (e->msg_size != 0))
+               memcpy(e->msg_buf, hw->aq.arq.r.arq_bi[desc_idx].va,
+                      e->msg_size);
+
        if (i40e_is_nvm_update_op(&e->desc))
                hw->aq.nvm_busy = false;