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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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
+31 −27
Original line number Original line Diff line number Diff line
@@ -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)
{
{
	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)
	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)


	*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,
{
{
	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)


	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)
		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;
}
}