Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ixl/i40e_nvm.c
Show First 20 Lines • Show All 361 Lines • ▼ Show 20 Lines | enum i40e_status_code i40e_read_nvm_word(struct i40e_hw *hw, u16 offset, | ||||
ret_code = __i40e_read_nvm_word(hw, offset, data); | ret_code = __i40e_read_nvm_word(hw, offset, data); | ||||
if (hw->flags & I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK) | if (hw->flags & I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK) | ||||
i40e_release_nvm(hw); | i40e_release_nvm(hw); | ||||
return ret_code; | return ret_code; | ||||
} | } | ||||
/** | /** | ||||
* i40e_read_nvm_module_data - Reads NVM Buffer to specified memory location | |||||
* @hw: Pointer to the HW structure | |||||
* @module_ptr: Pointer to module in words with respect to NVM beginning | |||||
* @module_offset: Offset in words from module start | |||||
* @data_offset: Offset in words from reading data area start | |||||
* @words_data_size: Words to read from NVM | |||||
* @data_ptr: Pointer to memory location where resulting buffer will be stored | |||||
**/ | |||||
enum i40e_status_code | |||||
i40e_read_nvm_module_data(struct i40e_hw *hw, u8 module_ptr, u16 module_offset, | |||||
u16 data_offset, u16 words_data_size, u16 *data_ptr) | |||||
{ | |||||
enum i40e_status_code status; | |||||
u16 specific_ptr = 0; | |||||
u16 ptr_value = 0; | |||||
u16 offset = 0; | |||||
if (module_ptr != 0) { | |||||
status = i40e_read_nvm_word(hw, module_ptr, &ptr_value); | |||||
if (status != I40E_SUCCESS) { | |||||
i40e_debug(hw, I40E_DEBUG_ALL, | |||||
"Reading nvm word failed.Error code: %d.\n", | |||||
status); | |||||
return I40E_ERR_NVM; | |||||
} | |||||
} | |||||
#define I40E_NVM_INVALID_PTR_VAL 0x7FFF | |||||
#define I40E_NVM_INVALID_VAL 0xFFFF | |||||
/* Pointer not initialized */ | |||||
if (ptr_value == I40E_NVM_INVALID_PTR_VAL || | |||||
ptr_value == I40E_NVM_INVALID_VAL) { | |||||
i40e_debug(hw, I40E_DEBUG_ALL, "Pointer not initialized.\n"); | |||||
return I40E_ERR_BAD_PTR; | |||||
} | |||||
/* Check whether the module is in SR mapped area or outside */ | |||||
if (ptr_value & I40E_PTR_TYPE) { | |||||
/* Pointer points outside of the Shared RAM mapped area */ | |||||
i40e_debug(hw, I40E_DEBUG_ALL, | |||||
"Reading nvm data failed. Pointer points outside of the Shared RAM mapped area.\n"); | |||||
return I40E_ERR_PARAM; | |||||
} else { | |||||
/* Read from the Shadow RAM */ | |||||
status = i40e_read_nvm_word(hw, ptr_value + module_offset, | |||||
&specific_ptr); | |||||
if (status != I40E_SUCCESS) { | |||||
i40e_debug(hw, I40E_DEBUG_ALL, | |||||
"Reading nvm word failed.Error code: %d.\n", | |||||
status); | |||||
return I40E_ERR_NVM; | |||||
} | |||||
offset = ptr_value + module_offset + specific_ptr + | |||||
data_offset; | |||||
status = i40e_read_nvm_buffer(hw, offset, &words_data_size, | |||||
data_ptr); | |||||
if (status != I40E_SUCCESS) { | |||||
i40e_debug(hw, I40E_DEBUG_ALL, | |||||
"Reading nvm buffer failed.Error code: %d.\n", | |||||
status); | |||||
} | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* i40e_read_nvm_buffer_srctl - Reads Shadow RAM buffer via SRCTL register | * i40e_read_nvm_buffer_srctl - Reads Shadow RAM buffer via SRCTL register | ||||
* @hw: pointer to the HW structure | * @hw: pointer to the HW structure | ||||
* @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF). | * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF). | ||||
* @words: (in) number of words to read; (out) number of words actually read | * @words: (in) number of words to read; (out) number of words actually read | ||||
* @data: words read from the Shadow RAM | * @data: words read from the Shadow RAM | ||||
* | * | ||||
* Reads 16 bit words (data buffer) from the SR using the i40e_read_nvm_srrd() | * Reads 16 bit words (data buffer) from the SR using the i40e_read_nvm_srrd() | ||||
* method. The buffer read is preceded by the NVM ownership take | * method. The buffer read is preceded by the NVM ownership take | ||||
▲ Show 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) { | ||||
if (!ret_code) { | if (!ret_code) { | ||||
ret_code = i40e_read_nvm_buffer_aq(hw, offset, words, | ret_code = i40e_read_nvm_buffer_aq(hw, offset, words, | ||||
data); | data); | ||||
i40e_release_nvm(hw); | i40e_release_nvm(hw); | ||||
} | } | ||||
} else { | } else { | ||||
ret_code = i40e_read_nvm_buffer_srctl(hw, offset, words, data); | ret_code = i40e_read_nvm_buffer_srctl(hw, offset, words, data); | ||||
} | } | ||||
return ret_code; | return ret_code; | ||||
} | } | ||||
/** | /** | ||||
* i40e_write_nvm_aq - Writes Shadow RAM. | * i40e_write_nvm_aq - Writes Shadow RAM. | ||||
* @hw: pointer to the HW structure. | * @hw: pointer to the HW structure. | ||||
* @module_pointer: module pointer location in words from the NVM beginning | * @module_pointer: module pointer location in words from the NVM beginning | ||||
* @offset: offset in words from module start | * @offset: offset in words from module start | ||||
* @words: number of words to write | * @words: number of words to write | ||||
* @data: buffer with words to write to the Shadow RAM | * @data: buffer with words to write to the Shadow RAM | ||||
* @last_command: tells the AdminQ that this is the last command | * @last_command: tells the AdminQ that this is the last command | ||||
▲ Show 20 Lines • Show All 302 Lines • ▼ Show 20 Lines | static const char *i40e_nvm_update_state_str[] = { | ||||
"I40E_NVMUPD_WRITE_SA", | "I40E_NVMUPD_WRITE_SA", | ||||
"I40E_NVMUPD_CSUM_CON", | "I40E_NVMUPD_CSUM_CON", | ||||
"I40E_NVMUPD_CSUM_SA", | "I40E_NVMUPD_CSUM_SA", | ||||
"I40E_NVMUPD_CSUM_LCB", | "I40E_NVMUPD_CSUM_LCB", | ||||
"I40E_NVMUPD_STATUS", | "I40E_NVMUPD_STATUS", | ||||
"I40E_NVMUPD_EXEC_AQ", | "I40E_NVMUPD_EXEC_AQ", | ||||
"I40E_NVMUPD_GET_AQ_RESULT", | "I40E_NVMUPD_GET_AQ_RESULT", | ||||
"I40E_NVMUPD_GET_AQ_EVENT", | "I40E_NVMUPD_GET_AQ_EVENT", | ||||
"I40E_NVMUPD_GET_FEATURES", | |||||
}; | }; | ||||
/** | /** | ||||
* i40e_nvmupd_command - Process an NVM update command | * i40e_nvmupd_command - Process an NVM update command | ||||
* @hw: pointer to hardware structure | * @hw: pointer to hardware structure | ||||
* @cmd: pointer to nvm update command | * @cmd: pointer to nvm update command | ||||
* @bytes: pointer to the data buffer | * @bytes: pointer to the data buffer | ||||
* @perrno: pointer to return error code | * @perrno: pointer to return error code | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | if (upd_cmd == I40E_NVMUPD_STATUS) { | ||||
/* Clear error status on read */ | /* Clear error status on read */ | ||||
if (hw->nvmupd_state == I40E_NVMUPD_STATE_ERROR) | if (hw->nvmupd_state == I40E_NVMUPD_STATE_ERROR) | ||||
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT; | hw->nvmupd_state = I40E_NVMUPD_STATE_INIT; | ||||
return I40E_SUCCESS; | return I40E_SUCCESS; | ||||
} | } | ||||
/* | |||||
* A supported features request returns immediately | |||||
* rather than going into state machine | |||||
*/ | |||||
if (upd_cmd == I40E_NVMUPD_FEATURES) { | |||||
if (cmd->data_size < hw->nvmupd_features.size) { | |||||
*perrno = -EFAULT; | |||||
return I40E_ERR_BUF_TOO_SHORT; | |||||
} | |||||
/* | |||||
* If buffer is bigger than i40e_nvmupd_features structure, | |||||
* make sure the trailing bytes are set to 0x0. | |||||
*/ | |||||
if (cmd->data_size > hw->nvmupd_features.size) | |||||
i40e_memset(bytes + hw->nvmupd_features.size, 0x0, | |||||
cmd->data_size - hw->nvmupd_features.size, | |||||
I40E_NONDMA_MEM); | |||||
i40e_memcpy(bytes, &hw->nvmupd_features, | |||||
hw->nvmupd_features.size, I40E_NONDMA_MEM); | |||||
return I40E_SUCCESS; | |||||
} | |||||
/* Clear status even it is not read and log */ | /* Clear status even it is not read and log */ | ||||
if (hw->nvmupd_state == I40E_NVMUPD_STATE_ERROR) { | if (hw->nvmupd_state == I40E_NVMUPD_STATE_ERROR) { | ||||
i40e_debug(hw, I40E_DEBUG_NVM, | i40e_debug(hw, I40E_DEBUG_NVM, | ||||
"Clearing I40E_NVMUPD_STATE_ERROR state without reading\n"); | "Clearing I40E_NVMUPD_STATE_ERROR state without reading\n"); | ||||
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT; | hw->nvmupd_state = I40E_NVMUPD_STATE_INIT; | ||||
} | } | ||||
/* Acquire lock to prevent race condition where adminq_task | /* Acquire lock to prevent race condition where adminq_task | ||||
▲ Show 20 Lines • Show All 450 Lines • ▼ Show 20 Lines | case I40E_NVM_SNT: | ||||
break; | break; | ||||
case I40E_NVM_LCB: | case I40E_NVM_LCB: | ||||
upd_cmd = I40E_NVMUPD_READ_LCB; | upd_cmd = I40E_NVMUPD_READ_LCB; | ||||
break; | break; | ||||
case I40E_NVM_SA: | case I40E_NVM_SA: | ||||
upd_cmd = I40E_NVMUPD_READ_SA; | upd_cmd = I40E_NVMUPD_READ_SA; | ||||
break; | break; | ||||
case I40E_NVM_EXEC: | case I40E_NVM_EXEC: | ||||
if (module == 0xf) | switch (module) { | ||||
upd_cmd = I40E_NVMUPD_STATUS; | case I40E_NVM_EXEC_GET_AQ_RESULT: | ||||
else if (module == 0) | |||||
upd_cmd = I40E_NVMUPD_GET_AQ_RESULT; | upd_cmd = I40E_NVMUPD_GET_AQ_RESULT; | ||||
break; | |||||
case I40E_NVM_EXEC_FEATURES: | |||||
upd_cmd = I40E_NVMUPD_FEATURES; | |||||
break; | |||||
case I40E_NVM_EXEC_STATUS: | |||||
upd_cmd = I40E_NVMUPD_STATUS; | |||||
break; | |||||
default: | |||||
*perrno = -EFAULT; | |||||
return I40E_NVMUPD_INVALID; | |||||
} | |||||
break; | break; | ||||
case I40E_NVM_AQE: | case I40E_NVM_AQE: | ||||
upd_cmd = I40E_NVMUPD_GET_AQ_EVENT; | upd_cmd = I40E_NVMUPD_GET_AQ_EVENT; | ||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
case I40E_NVM_WRITE: | case I40E_NVM_WRITE: | ||||
▲ Show 20 Lines • Show All 346 Lines • Show Last 20 Lines |