Commit f8a6dd59 authored by Neel Patel's avatar Neel Patel Committed by David S. Miller

enic: Check firmware capability before issuing firmware commands

Check if firmware supports a particular command by first checking capability
using devcmd CMD_CAPABILITY.
Signed-off-by: default avatarNeel Patel <neepatel@cisco.com>
Signed-off-by: default avatarChristian Benvenuti <benve@cisco.com>
Signed-off-by: default avatarRoopa Prabhu <roprabhu@cisco.com>
Signed-off-by: default avatarNishank Trivedi <nistrive@cisco.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 63da93d9
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#define DRV_NAME "enic" #define DRV_NAME "enic"
#define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver" #define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver"
#define DRV_VERSION "2.1.1.32" #define DRV_VERSION "2.1.1.33"
#define DRV_COPYRIGHT "Copyright 2008-2011 Cisco Systems, Inc" #define DRV_COPYRIGHT "Copyright 2008-2011 Cisco Systems, Inc"
#define ENIC_BARS_MAX 6 #define ENIC_BARS_MAX 6
......
...@@ -439,12 +439,13 @@ int vnic_dev_fw_info(struct vnic_dev *vdev, ...@@ -439,12 +439,13 @@ int vnic_dev_fw_info(struct vnic_dev *vdev,
a1 = sizeof(struct vnic_devcmd_fw_info); a1 = sizeof(struct vnic_devcmd_fw_info);
/* only get fw_info once and cache it */ /* only get fw_info once and cache it */
err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO, &a0, &a1, wait); if (vnic_dev_capable(vdev, CMD_MCPU_FW_INFO))
if (err == ERR_ECMDUNKNOWN) { err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO,
&a0, &a1, wait);
else
err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO_OLD, err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO_OLD,
&a0, &a1, wait); &a0, &a1, wait);
} }
}
*fw_info = vdev->fw_info; *fw_info = vdev->fw_info;
...@@ -504,13 +505,11 @@ int vnic_dev_enable_wait(struct vnic_dev *vdev) ...@@ -504,13 +505,11 @@ int vnic_dev_enable_wait(struct vnic_dev *vdev)
{ {
u64 a0 = 0, a1 = 0; u64 a0 = 0, a1 = 0;
int wait = 1000; int wait = 1000;
int err;
err = vnic_dev_cmd(vdev, CMD_ENABLE_WAIT, &a0, &a1, wait); if (vnic_dev_capable(vdev, CMD_ENABLE_WAIT))
if (err == ERR_ECMDUNKNOWN) return vnic_dev_cmd(vdev, CMD_ENABLE_WAIT, &a0, &a1, wait);
else
return vnic_dev_cmd(vdev, CMD_ENABLE, &a0, &a1, wait); return vnic_dev_cmd(vdev, CMD_ENABLE, &a0, &a1, wait);
return err;
} }
int vnic_dev_disable(struct vnic_dev *vdev) int vnic_dev_disable(struct vnic_dev *vdev)
...@@ -574,16 +573,15 @@ int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg) ...@@ -574,16 +573,15 @@ int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg)
int wait = 1000; int wait = 1000;
int err; int err;
err = vnic_dev_cmd(vdev, CMD_HANG_RESET, &a0, &a1, wait); if (vnic_dev_capable(vdev, CMD_HANG_RESET)) {
if (err == ERR_ECMDUNKNOWN) { return vnic_dev_cmd(vdev, CMD_HANG_RESET,
&a0, &a1, wait);
} else {
err = vnic_dev_soft_reset(vdev, arg); err = vnic_dev_soft_reset(vdev, arg);
if (err) if (err)
return err; return err;
return vnic_dev_init(vdev, 0); return vnic_dev_init(vdev, 0);
} }
return err;
} }
int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done) int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done)
...@@ -594,11 +592,13 @@ int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done) ...@@ -594,11 +592,13 @@ int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done)
*done = 0; *done = 0;
err = vnic_dev_cmd(vdev, CMD_HANG_RESET_STATUS, &a0, &a1, wait); if (vnic_dev_capable(vdev, CMD_HANG_RESET_STATUS)) {
if (err) { err = vnic_dev_cmd(vdev, CMD_HANG_RESET_STATUS,
if (err == ERR_ECMDUNKNOWN) &a0, &a1, wait);
return vnic_dev_soft_reset_done(vdev, done); if (err)
return err; return err;
} else {
return vnic_dev_soft_reset_done(vdev, done);
} }
*done = (a0 == 0); *done = (a0 == 0);
...@@ -691,13 +691,12 @@ int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev, ...@@ -691,13 +691,12 @@ int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev,
{ {
u64 a0 = ig_vlan_rewrite_mode, a1 = 0; u64 a0 = ig_vlan_rewrite_mode, a1 = 0;
int wait = 1000; int wait = 1000;
int err;
err = vnic_dev_cmd(vdev, CMD_IG_VLAN_REWRITE_MODE, &a0, &a1, wait); if (vnic_dev_capable(vdev, CMD_IG_VLAN_REWRITE_MODE))
if (err == ERR_ECMDUNKNOWN) return vnic_dev_cmd(vdev, CMD_IG_VLAN_REWRITE_MODE,
&a0, &a1, wait);
else
return 0; return 0;
return err;
} }
static int vnic_dev_notify_setcmd(struct vnic_dev *vdev, static int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
...@@ -835,7 +834,10 @@ int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev) ...@@ -835,7 +834,10 @@ int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev)
memset(vdev->args, 0, sizeof(vdev->args)); memset(vdev->args, 0, sizeof(vdev->args));
if (vnic_dev_capable(vdev, CMD_INTR_COAL_CONVERT))
err = _vnic_dev_cmd(vdev, CMD_INTR_COAL_CONVERT, wait); err = _vnic_dev_cmd(vdev, CMD_INTR_COAL_CONVERT, wait);
else
err = ERR_ECMDUNKNOWN;
/* Use defaults when firmware doesn't support the devcmd at all or /* Use defaults when firmware doesn't support the devcmd at all or
* supports it for only specific hardware * supports it for only specific hardware
...@@ -848,9 +850,11 @@ int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev) ...@@ -848,9 +850,11 @@ int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev)
return 0; return 0;
} }
if (!err) {
vdev->intr_coal_timer_info.mul = (u32) vdev->args[0]; vdev->intr_coal_timer_info.mul = (u32) vdev->args[0];
vdev->intr_coal_timer_info.div = (u32) vdev->args[1]; vdev->intr_coal_timer_info.div = (u32) vdev->args[1];
vdev->intr_coal_timer_info.max_usec = (u32) vdev->args[2]; vdev->intr_coal_timer_info.max_usec = (u32) vdev->args[2];
}
return err; return err;
} }
......
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