Commit b5aae90b authored by Jedrzej Jagielski's avatar Jedrzej Jagielski Committed by Tony Nguyen
Browse files

ixgbe: add FW API version check



Add E610 specific function checking whether the FW API version
is compatible with the driver expectations.

The major API version should be less than or equal to the expected
API version. If not the driver won't be fully operational.

Check the minor version, and if it is more than two versions lesser
or greater than the expected version, print a message indicating
that the NVM or driver should be updated respectively.

Reviewed-by: default avatarMateusz Polchlopek <mateusz.polchlopek@intel.com>
Co-developed-by: default avatarPiotr Kwapulinski <piotr.kwapulinski@intel.com>
Signed-off-by: default avatarPiotr Kwapulinski <piotr.kwapulinski@intel.com>
Signed-off-by: default avatarJedrzej Jagielski <jedrzej.jagielski@intel.com>
Tested-by: default avatarBharath R <bharath.r@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent c9e563ca
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -471,6 +471,8 @@ static int ixgbe_devlink_reload_empr_finish(struct devlink *devlink,

	*actions_performed = BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE);

	adapter->flags2 &= ~IXGBE_FLAG2_API_MISMATCH;

	return 0;
}

+1 −0
Original line number Diff line number Diff line
@@ -671,6 +671,7 @@ struct ixgbe_adapter {
#define IXGBE_FLAG2_PHY_FW_LOAD_FAILED		BIT(20)
#define IXGBE_FLAG2_NO_MEDIA			BIT(21)
#define IXGBE_FLAG2_MOD_POWER_UNSUPPORTED	BIT(22)
#define IXGBE_FLAG2_API_MISMATCH		BIT(23)

	/* Tx fast path data */
	int num_tx_queues;
+1 −0
Original line number Diff line number Diff line
@@ -3873,6 +3873,7 @@ static const struct ixgbe_mac_operations mac_ops_e610 = {
	.led_off			= ixgbe_led_off_generic,
	.init_led_link_act		= ixgbe_init_led_link_act_generic,
	.reset_hw			= ixgbe_reset_hw_e610,
	.get_fw_ver                     = ixgbe_aci_get_fw_ver,
	.get_media_type			= ixgbe_get_media_type_e610,
	.setup_link			= ixgbe_setup_link_e610,
	.get_link_capabilities		= ixgbe_get_link_capabilities_e610,
+34 −0
Original line number Diff line number Diff line
@@ -8365,6 +8365,34 @@ static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)
	rtnl_unlock();
}

static int ixgbe_check_fw_api_mismatch(struct ixgbe_adapter *adapter)
{
	struct ixgbe_hw *hw = &adapter->hw;

	if (hw->mac.type != ixgbe_mac_e610)
		return 0;

	if (hw->mac.ops.get_fw_ver && hw->mac.ops.get_fw_ver(hw))
		return 0;

	if (hw->api_maj_ver > IXGBE_FW_API_VER_MAJOR) {
		e_dev_err("The driver for the device stopped because the NVM image is newer than expected. You must install the most recent version of the network driver.\n");

		adapter->flags2 |= IXGBE_FLAG2_API_MISMATCH;
		return -EOPNOTSUPP;
	} else if (hw->api_maj_ver == IXGBE_FW_API_VER_MAJOR &&
		   hw->api_min_ver > IXGBE_FW_API_VER_MINOR + IXGBE_FW_API_VER_DIFF_ALLOWED) {
		e_dev_info("The driver for the device detected a newer version of the NVM image than expected. Please install the most recent version of the network driver.\n");
		adapter->flags2 |= IXGBE_FLAG2_API_MISMATCH;
	} else if (hw->api_maj_ver < IXGBE_FW_API_VER_MAJOR ||
		   hw->api_min_ver < IXGBE_FW_API_VER_MINOR - IXGBE_FW_API_VER_DIFF_ALLOWED) {
		e_dev_info("The driver for the device detected an older version of the NVM image than expected. Please update the NVM image.\n");
		adapter->flags2 |= IXGBE_FLAG2_API_MISMATCH;
	}

	return 0;
}

/**
 * ixgbe_check_fw_error - Check firmware for errors
 * @adapter: the adapter private structure
@@ -8375,6 +8403,7 @@ static bool ixgbe_check_fw_error(struct ixgbe_adapter *adapter)
{
	struct ixgbe_hw *hw = &adapter->hw;
	u32 fwsm;
	int err;

	/* read fwsm.ext_err_ind register and log errors */
	fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM(hw));
@@ -8389,6 +8418,11 @@ static bool ixgbe_check_fw_error(struct ixgbe_adapter *adapter)
		e_dev_err("Firmware recovery mode detected. Limiting functionality. Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
		return true;
	}
	if (!(adapter->flags2 & IXGBE_FLAG2_API_MISMATCH)) {
		err = ixgbe_check_fw_api_mismatch(adapter);
		if (err)
			return true;
	}

	return false;
}
+1 −0
Original line number Diff line number Diff line
@@ -3456,6 +3456,7 @@ struct ixgbe_mac_operations {
	int (*start_hw)(struct ixgbe_hw *);
	int (*clear_hw_cntrs)(struct ixgbe_hw *);
	enum ixgbe_media_type (*get_media_type)(struct ixgbe_hw *);
	int (*get_fw_ver)(struct ixgbe_hw *hw);
	int (*get_mac_addr)(struct ixgbe_hw *, u8 *);
	int (*get_san_mac_addr)(struct ixgbe_hw *, u8 *);
	int (*get_device_caps)(struct ixgbe_hw *, u16 *);
Loading