ixgbe: Add timeout parameter to ixgbe_host_interface_command
Since on X550 we use host interface commands to read,write and erase some commands require more time to complete. So this adds a timeout parameter to ixgbe_host_interface_command as wells as a return_data parameter allowing us to return with any data. Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
0f9b232b17
commit
b48e4aa3e5
|
@ -3446,23 +3446,34 @@ static u8 ixgbe_calculate_checksum(u8 *buffer, u32 length)
|
|||
* @buffer: contains the command to write and where the return status will
|
||||
* be placed
|
||||
* @length: length of buffer, must be multiple of 4 bytes
|
||||
* @timeout: time in ms to wait for command completion
|
||||
* @return_data: read and return data from the buffer (true) or not (false)
|
||||
* Needed because FW structures are big endian and decoding of
|
||||
* these fields can be 8 bit or 16 bit based on command. Decoding
|
||||
* is not easily understood without making a table of commands.
|
||||
* So we will leave this up to the caller to read back the data
|
||||
* in these cases.
|
||||
*
|
||||
* Communicates with the manageability block. On success return 0
|
||||
* else return IXGBE_ERR_HOST_INTERFACE_COMMAND.
|
||||
**/
|
||||
static s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
|
||||
u32 length)
|
||||
u32 length, u32 timeout,
|
||||
bool return_data)
|
||||
{
|
||||
u32 hicr, i, bi;
|
||||
u32 hicr, i, bi, fwsts;
|
||||
u32 hdr_size = sizeof(struct ixgbe_hic_hdr);
|
||||
u8 buf_len, dword_len;
|
||||
u16 buf_len, dword_len;
|
||||
|
||||
if (length == 0 || length & 0x3 ||
|
||||
length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
|
||||
hw_dbg(hw, "Buffer length failure.\n");
|
||||
if (length == 0 || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
|
||||
hw_dbg(hw, "Buffer length failure buffersize-%d.\n", length);
|
||||
return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
||||
}
|
||||
|
||||
/* Set bit 9 of FWSTS clearing FW reset indication */
|
||||
fwsts = IXGBE_READ_REG(hw, IXGBE_FWSTS);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FWSTS, fwsts | IXGBE_FWSTS_FWRI);
|
||||
|
||||
/* Check that the host interface is enabled. */
|
||||
hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
|
||||
if ((hicr & IXGBE_HICR_EN) == 0) {
|
||||
|
@ -3470,7 +3481,12 @@ static s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
|
|||
return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
||||
}
|
||||
|
||||
/* Calculate length in DWORDs */
|
||||
/* Calculate length in DWORDs. We must be DWORD aligned */
|
||||
if ((length % (sizeof(u32))) != 0) {
|
||||
hw_dbg(hw, "Buffer length failure, not aligned to dword");
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
dword_len = length >> 2;
|
||||
|
||||
/*
|
||||
|
@ -3484,7 +3500,7 @@ static s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
|
|||
/* Setting this bit tells the ARC that a new command is pending. */
|
||||
IXGBE_WRITE_REG(hw, IXGBE_HICR, hicr | IXGBE_HICR_C);
|
||||
|
||||
for (i = 0; i < IXGBE_HI_COMMAND_TIMEOUT; i++) {
|
||||
for (i = 0; i < timeout; i++) {
|
||||
hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
|
||||
if (!(hicr & IXGBE_HICR_C))
|
||||
break;
|
||||
|
@ -3492,12 +3508,15 @@ static s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
|
|||
}
|
||||
|
||||
/* Check command successful completion. */
|
||||
if (i == IXGBE_HI_COMMAND_TIMEOUT ||
|
||||
if ((timeout != 0 && i == timeout) ||
|
||||
(!(IXGBE_READ_REG(hw, IXGBE_HICR) & IXGBE_HICR_SV))) {
|
||||
hw_dbg(hw, "Command has failed with no status valid.\n");
|
||||
return IXGBE_ERR_HOST_INTERFACE_COMMAND;
|
||||
}
|
||||
|
||||
if (!return_data)
|
||||
return 0;
|
||||
|
||||
/* Calculate length in DWORDs */
|
||||
dword_len = hdr_size >> 2;
|
||||
|
||||
|
@ -3568,7 +3587,9 @@ s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
|
|||
|
||||
for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
|
||||
ret_val = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
|
||||
sizeof(fw_cmd));
|
||||
sizeof(fw_cmd),
|
||||
IXGBE_HI_COMMAND_TIMEOUT,
|
||||
true);
|
||||
if (ret_val != 0)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -2314,9 +2314,12 @@ enum ixgbe_fdir_pballoc_type {
|
|||
#define IXGBE_FDIR_DROP_QUEUE 127
|
||||
|
||||
/* Manageablility Host Interface defines */
|
||||
#define IXGBE_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */
|
||||
#define IXGBE_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */
|
||||
#define IXGBE_HI_COMMAND_TIMEOUT 500 /* Process HI command limit */
|
||||
#define IXGBE_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */
|
||||
#define IXGBE_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */
|
||||
#define IXGBE_HI_COMMAND_TIMEOUT 500 /* Process HI command limit */
|
||||
#define IXGBE_HI_FLASH_ERASE_TIMEOUT 1000 /* Process Erase command limit */
|
||||
#define IXGBE_HI_FLASH_UPDATE_TIMEOUT 5000 /* Process Update command limit */
|
||||
#define IXGBE_HI_FLASH_APPLY_TIMEOUT 0 /* Process Apply command limit */
|
||||
|
||||
/* CEM Support */
|
||||
#define FW_CEM_HDR_LEN 0x4
|
||||
|
|
Loading…
Reference in a new issue