net/ixgbe/base: add driver version to firmware
Send the driver version string to firmware through the host interface command on x550 devices. Signed-off-by: Wei Dai <wei.dai@intel.com>
This commit is contained in:
parent
2f8c0a2335
commit
74b9878181
@ -1147,12 +1147,15 @@ s32 ixgbe_setup_fc(struct ixgbe_hw *hw)
|
||||
* @min: driver minor number to be sent to firmware
|
||||
* @build: driver build number to be sent to firmware
|
||||
* @ver: driver version number to be sent to firmware
|
||||
* @len: length of driver_ver string
|
||||
* @driver_ver: driver string
|
||||
**/
|
||||
s32 ixgbe_set_fw_drv_ver(struct ixgbe_hw *hw, u8 maj, u8 min, u8 build,
|
||||
u8 ver)
|
||||
u8 ver, u16 len, char *driver_ver)
|
||||
{
|
||||
return ixgbe_call_func(hw, hw->mac.ops.set_fw_drv_ver, (hw, maj, min,
|
||||
build, ver), IXGBE_NOT_IMPLEMENTED);
|
||||
build, ver, len, driver_ver),
|
||||
IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
|
||||
|
@ -133,7 +133,7 @@ s32 ixgbe_set_vlvf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
|
||||
s32 ixgbe_fc_enable(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_setup_fc(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_set_fw_drv_ver(struct ixgbe_hw *hw, u8 maj, u8 min, u8 build,
|
||||
u8 ver);
|
||||
u8 ver, u16 len, char *driver_ver);
|
||||
s32 ixgbe_get_thermal_sensor_data(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_init_thermal_sensor_thresh(struct ixgbe_hw *hw);
|
||||
void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr);
|
||||
|
@ -4596,13 +4596,15 @@ s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
|
||||
* semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
|
||||
**/
|
||||
s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
|
||||
u8 build, u8 sub)
|
||||
u8 build, u8 sub, u16 len,
|
||||
const char *driver_ver)
|
||||
{
|
||||
struct ixgbe_hic_drv_info fw_cmd;
|
||||
int i;
|
||||
s32 ret_val = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_fw_drv_ver_generic");
|
||||
UNREFERENCED_2PARAMETER(len, driver_ver);
|
||||
|
||||
fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO;
|
||||
fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN;
|
||||
|
@ -155,7 +155,7 @@ void ixgbe_set_rxpba_generic(struct ixgbe_hw *hw, int num_pb, u32 headroom,
|
||||
int strategy);
|
||||
void ixgbe_enable_relaxed_ordering_gen2(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
|
||||
u8 build, u8 ver);
|
||||
u8 build, u8 ver, u16 len, const char *str);
|
||||
u8 ixgbe_calculate_checksum(u8 *buffer, u32 length);
|
||||
s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
|
||||
u32 length, u32 timeout, bool return_data);
|
||||
|
@ -3037,6 +3037,7 @@ enum ixgbe_fdir_pballoc_type {
|
||||
#define FW_CEM_UNUSED_VER 0x0
|
||||
#define FW_CEM_MAX_RETRIES 3
|
||||
#define FW_CEM_RESP_STATUS_SUCCESS 0x1
|
||||
#define FW_CEM_DRIVER_VERSION_SIZE 39 /* +9 would send 48 bytes to fw */
|
||||
#define FW_READ_SHADOW_RAM_CMD 0x31
|
||||
#define FW_READ_SHADOW_RAM_LEN 0x6
|
||||
#define FW_WRITE_SHADOW_RAM_CMD 0x33
|
||||
@ -3111,6 +3112,16 @@ struct ixgbe_hic_drv_info {
|
||||
u16 pad2; /* end spacing to ensure length is mult. of dword2 */
|
||||
};
|
||||
|
||||
struct ixgbe_hic_drv_info2 {
|
||||
struct ixgbe_hic_hdr hdr;
|
||||
u8 port_num;
|
||||
u8 ver_sub;
|
||||
u8 ver_build;
|
||||
u8 ver_min;
|
||||
u8 ver_maj;
|
||||
char driver_string[FW_CEM_DRIVER_VERSION_SIZE];
|
||||
};
|
||||
|
||||
/* These need to be dword aligned */
|
||||
struct ixgbe_hic_read_shadow_ram {
|
||||
union ixgbe_hic_hdr2 hdr;
|
||||
@ -3907,7 +3918,8 @@ struct ixgbe_mac_operations {
|
||||
void (*fc_autoneg)(struct ixgbe_hw *);
|
||||
|
||||
/* Manageability interface */
|
||||
s32 (*set_fw_drv_ver)(struct ixgbe_hw *, u8, u8, u8, u8);
|
||||
s32 (*set_fw_drv_ver)(struct ixgbe_hw *, u8, u8, u8, u8, u16,
|
||||
const char *);
|
||||
s32 (*get_thermal_sensor_data)(struct ixgbe_hw *);
|
||||
s32 (*init_thermal_sensor_thresh)(struct ixgbe_hw *hw);
|
||||
void (*get_rtrup2tc)(struct ixgbe_hw *hw, u8 *map);
|
||||
|
@ -83,6 +83,8 @@ s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw)
|
||||
mac->ops.mdd_event = ixgbe_mdd_event_X550;
|
||||
mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550;
|
||||
mac->ops.disable_rx = ixgbe_disable_rx_x550;
|
||||
/* Manageability interface */
|
||||
mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_x550;
|
||||
switch (hw->device_id) {
|
||||
case IXGBE_DEV_ID_X550EM_X_10G_T:
|
||||
case IXGBE_DEV_ID_X550EM_A_10G_T:
|
||||
@ -4757,3 +4759,64 @@ s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
|
||||
|
||||
return IXGBE_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_set_fw_drv_ver_x550 - Sends driver version to firmware
|
||||
* @hw: pointer to the HW structure
|
||||
* @maj: driver version major number
|
||||
* @min: driver version minor number
|
||||
* @build: driver version build number
|
||||
* @sub: driver version sub build number
|
||||
* @len: length of driver_ver string
|
||||
* @driver_ver: driver string
|
||||
*
|
||||
* Sends driver version number to firmware through the manageability
|
||||
* block. On success return IXGBE_SUCCESS
|
||||
* else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
|
||||
* semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
|
||||
**/
|
||||
s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
|
||||
u8 build, u8 sub, u16 len, const char *driver_ver)
|
||||
{
|
||||
struct ixgbe_hic_drv_info2 fw_cmd;
|
||||
s32 ret_val = IXGBE_SUCCESS;
|
||||
int i;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_fw_drv_ver_x550");
|
||||
|
||||
if ((len == 0) || (driver_ver == NULL) ||
|
||||
(len > sizeof(fw_cmd.driver_string)))
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
|
||||
fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO;
|
||||
fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN + len;
|
||||
fw_cmd.hdr.cmd_or_resp.cmd_resv = FW_CEM_CMD_RESERVED;
|
||||
fw_cmd.port_num = (u8)hw->bus.func;
|
||||
fw_cmd.ver_maj = maj;
|
||||
fw_cmd.ver_min = min;
|
||||
fw_cmd.ver_build = build;
|
||||
fw_cmd.ver_sub = sub;
|
||||
fw_cmd.hdr.checksum = 0;
|
||||
memcpy(fw_cmd.driver_string, driver_ver, len);
|
||||
fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
|
||||
(FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
|
||||
|
||||
for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
|
||||
ret_val = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
|
||||
sizeof(fw_cmd),
|
||||
IXGBE_HI_COMMAND_TIMEOUT,
|
||||
true);
|
||||
if (ret_val != IXGBE_SUCCESS)
|
||||
continue;
|
||||
|
||||
if (fw_cmd.hdr.cmd_or_resp.ret_status ==
|
||||
FW_CEM_RESP_STATUS_SUCCESS)
|
||||
ret_val = IXGBE_SUCCESS;
|
||||
else
|
||||
ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
@ -67,6 +67,8 @@ s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
u32 device_type, u32 data);
|
||||
s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
u32 device_type, u32 *data);
|
||||
s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
|
||||
u8 build, u8 ver, u16 len, const char *str);
|
||||
s32 ixgbe_get_phy_token(struct ixgbe_hw *);
|
||||
s32 ixgbe_put_phy_token(struct ixgbe_hw *);
|
||||
s32 ixgbe_write_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
|
Loading…
Reference in New Issue
Block a user