Commit ff924657 authored by Sylwia Wnuczko's avatar Sylwia Wnuczko Committed by Jeff Kirsher

i40e: Fix for persistent lldp support

This patch fixes function to read NVM module data and uses it to
read current LLDP agent configuration from NVM API version 1.8.
Signed-off-by: default avatarSylwia Wnuczko <sylwia.wnuczko@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 503a6463
...@@ -889,7 +889,9 @@ i40e_status i40e_init_dcb(struct i40e_hw *hw, bool enable_mib_change) ...@@ -889,7 +889,9 @@ i40e_status i40e_init_dcb(struct i40e_hw *hw, bool enable_mib_change)
ret = i40e_read_nvm_module_data(hw, ret = i40e_read_nvm_module_data(hw,
I40E_SR_EMP_SR_SETTINGS_PTR, I40E_SR_EMP_SR_SETTINGS_PTR,
offset, 1, offset,
I40E_LLDP_CURRENT_STATUS_OFFSET,
I40E_LLDP_CURRENT_STATUS_SIZE,
&lldp_cfg.adminstatus); &lldp_cfg.adminstatus);
} else { } else {
ret = i40e_read_lldp_cfg(hw, &lldp_cfg); ret = i40e_read_lldp_cfg(hw, &lldp_cfg);
......
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
#define I40E_CEE_MAX_FEAT_TYPE 3 #define I40E_CEE_MAX_FEAT_TYPE 3
#define I40E_LLDP_CURRENT_STATUS_XL710_OFFSET 0x2B #define I40E_LLDP_CURRENT_STATUS_XL710_OFFSET 0x2B
#define I40E_LLDP_CURRENT_STATUS_X722_OFFSET 0x31 #define I40E_LLDP_CURRENT_STATUS_X722_OFFSET 0x31
#define I40E_LLDP_CURRENT_STATUS_OFFSET 1
#define I40E_LLDP_CURRENT_STATUS_SIZE 1
/* Defines for LLDP TLV header */ /* Defines for LLDP TLV header */
#define I40E_LLDP_TLV_LEN_SHIFT 0 #define I40E_LLDP_TLV_LEN_SHIFT 0
#define I40E_LLDP_TLV_LEN_MASK (0x01FF << I40E_LLDP_TLV_LEN_SHIFT) #define I40E_LLDP_TLV_LEN_MASK (0x01FF << I40E_LLDP_TLV_LEN_SHIFT)
......
...@@ -323,20 +323,24 @@ i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset, ...@@ -323,20 +323,24 @@ i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset,
/** /**
* i40e_read_nvm_module_data - Reads NVM Buffer to specified memory location * i40e_read_nvm_module_data - Reads NVM Buffer to specified memory location
* @hw: pointer to the HW structure * @hw: Pointer to the HW structure
* @module_ptr: Pointer to module in words with respect to NVM beginning * @module_ptr: Pointer to module in words with respect to NVM beginning
* @offset: offset in words from module start * @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 * @words_data_size: Words to read from NVM
* @data_ptr: Pointer to memory location where resulting buffer will be stored * @data_ptr: Pointer to memory location where resulting buffer will be stored
**/ **/
i40e_status i40e_read_nvm_module_data(struct i40e_hw *hw, enum i40e_status_code i40e_read_nvm_module_data(struct i40e_hw *hw,
u8 module_ptr, u16 offset, u8 module_ptr,
u16 words_data_size, u16 module_offset,
u16 *data_ptr) u16 data_offset,
u16 words_data_size,
u16 *data_ptr)
{ {
i40e_status status; i40e_status status;
u16 specific_ptr = 0;
u16 ptr_value = 0; u16 ptr_value = 0;
u32 flat_offset; u32 offset = 0;
if (module_ptr != 0) { if (module_ptr != 0) {
status = i40e_read_nvm_word(hw, module_ptr, &ptr_value); status = i40e_read_nvm_word(hw, module_ptr, &ptr_value);
...@@ -352,36 +356,35 @@ i40e_status i40e_read_nvm_module_data(struct i40e_hw *hw, ...@@ -352,36 +356,35 @@ i40e_status i40e_read_nvm_module_data(struct i40e_hw *hw,
/* Pointer not initialized */ /* Pointer not initialized */
if (ptr_value == I40E_NVM_INVALID_PTR_VAL || if (ptr_value == I40E_NVM_INVALID_PTR_VAL ||
ptr_value == I40E_NVM_INVALID_VAL) ptr_value == I40E_NVM_INVALID_VAL) {
i40e_debug(hw, I40E_DEBUG_ALL, "Pointer not initialized.\n");
return I40E_ERR_BAD_PTR; return I40E_ERR_BAD_PTR;
}
/* Check whether the module is in SR mapped area or outside */ /* Check whether the module is in SR mapped area or outside */
if (ptr_value & I40E_PTR_TYPE) { if (ptr_value & I40E_PTR_TYPE) {
/* Pointer points outside of the Shared RAM mapped area */ /* Pointer points outside of the Shared RAM mapped area */
ptr_value &= ~I40E_PTR_TYPE; i40e_debug(hw, I40E_DEBUG_ALL,
"Reading nvm data failed. Pointer points outside of the Shared RAM mapped area.\n");
/* PtrValue in 4kB units, need to convert to words */ return I40E_ERR_PARAM;
ptr_value /= 2;
flat_offset = ((u32)ptr_value * 0x1000) + (u32)offset;
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
if (!status) {
status = i40e_aq_read_nvm(hw, 0, 2 * flat_offset,
2 * words_data_size,
data_ptr, true, NULL);
i40e_release_nvm(hw);
if (status) {
i40e_debug(hw, I40E_DEBUG_ALL,
"Reading nvm aq failed.Error code: %d.\n",
status);
return I40E_ERR_NVM;
}
} else {
return I40E_ERR_NVM;
}
} else { } else {
/* Read from the Shadow RAM */ /* Read from the Shadow RAM */
status = i40e_read_nvm_buffer(hw, ptr_value + offset,
&words_data_size, data_ptr); status = i40e_read_nvm_word(hw, ptr_value + module_offset,
&specific_ptr);
if (status) {
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) { if (status) {
i40e_debug(hw, I40E_DEBUG_ALL, i40e_debug(hw, I40E_DEBUG_ALL,
"Reading nvm buffer failed.Error code: %d.\n", "Reading nvm buffer failed.Error code: %d.\n",
......
...@@ -315,10 +315,12 @@ i40e_status i40e_acquire_nvm(struct i40e_hw *hw, ...@@ -315,10 +315,12 @@ i40e_status i40e_acquire_nvm(struct i40e_hw *hw,
void i40e_release_nvm(struct i40e_hw *hw); void i40e_release_nvm(struct i40e_hw *hw);
i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset, i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset,
u16 *data); u16 *data);
i40e_status i40e_read_nvm_module_data(struct i40e_hw *hw, enum i40e_status_code i40e_read_nvm_module_data(struct i40e_hw *hw,
u8 module_ptr, u16 offset, u8 module_ptr,
u16 words_data_size, u16 module_offset,
u16 *data_ptr); u16 data_offset,
u16 words_data_size,
u16 *data_ptr);
i40e_status i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset, i40e_status i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset,
u16 *words, u16 *data); u16 *words, u16 *data);
i40e_status i40e_update_nvm_checksum(struct i40e_hw *hw); i40e_status i40e_update_nvm_checksum(struct i40e_hw *hw);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment