Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ixl/i40e_nvm.c
/****************************************************************************** | /****************************************************************************** | ||||
Copyright (c) 2013-2017, Intel Corporation | Copyright (c) 2013-2019, Intel Corporation | ||||
All rights reserved. | All rights reserved. | ||||
Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | ||||
modification, are permitted provided that the following conditions are met: | modification, are permitted provided that the following conditions are met: | ||||
1. Redistributions of source code must retain the above copyright notice, | 1. Redistributions of source code must retain the above copyright notice, | ||||
this list of conditions and the following disclaimer. | this list of conditions and the following disclaimer. | ||||
2. Redistributions in binary form must reproduce the above copyright | 2. Redistributions in binary form must reproduce the above copyright | ||||
notice, this list of conditions and the following disclaimer in the | notice, this list of conditions and the following disclaimer in the | ||||
▲ Show 20 Lines • Show All 807 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 |