i40evf: return more useful error information
authorMitch Williams <mitch.a.williams@intel.com>
Thu, 5 Jun 2014 00:09:17 +0000 (00:09 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 26 Jun 2014 11:44:58 +0000 (04:44 -0700)
When verifying the API version (which is the first time the driver
communicates with the firmware and thus the PF driver), there are many
ways in which a failure can occur. There may be an error from the
firmware, there may be unresponsive firmware, there may be an error from
the PF driver, etc, etc.

Make this function return more useful information, instead of just -EIO.
Propagate FW errors back to the caller, and log a message if the PF
sends an invalid reply.

Change-ID: I3e9135a2b80f7acdb855f62f12b2b2668c9a8951
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c

index 2dc0bac..0ed2ad7 100644 (file)
@@ -80,8 +80,9 @@ int i40evf_send_api_ver(struct i40evf_adapter *adapter)
  * @adapter: adapter structure
  *
  * Compare API versions with the PF. Must be called after admin queue is
- * initialized. Returns 0 if API versions match, -EIO if
- * they do not, or I40E_ERR_ADMIN_QUEUE_NO_WORK if the admin queue is empty.
+ * initialized. Returns 0 if API versions match, -EIO if they do not,
+ * I40E_ERR_ADMIN_QUEUE_NO_WORK if the admin queue is empty, and any errors
+ * from the firmware are propagated.
  **/
 int i40evf_verify_api_ver(struct i40evf_adapter *adapter)
 {
@@ -102,13 +103,13 @@ int i40evf_verify_api_ver(struct i40evf_adapter *adapter)
                goto out_alloc;
 
        err = (i40e_status)le32_to_cpu(event.desc.cookie_low);
-       if (err) {
-               err = -EIO;
+       if (err)
                goto out_alloc;
-       }
 
        if ((enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high) !=
            I40E_VIRTCHNL_OP_VERSION) {
+               dev_info(&adapter->pdev->dev, "Invalid reply type %d from PF\n",
+                        le32_to_cpu(event.desc.cookie_high));
                err = -EIO;
                goto out_alloc;
        }