Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0988fc49 authored by Sylwia Wnuczko's avatar Sylwia Wnuczko Committed by Greg Kroah-Hartman
Browse files

i40e: Fix for persistent lldp support



[ Upstream commit ff9246571a2e79944d6d4d22de4f717081beb5d3 ]

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>
Stable-dep-of: d0d362ffa33d ("i40e: Fix VF VLAN offloading when port VLAN is configured")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 09475d64
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -889,7 +889,9 @@ i40e_status i40e_init_dcb(struct i40e_hw *hw, bool enable_mib_change)

		ret = i40e_read_nvm_module_data(hw,
						I40E_SR_EMP_SR_SETTINGS_PTR,
						offset, 1,
						offset,
						I40E_LLDP_CURRENT_STATUS_OFFSET,
						I40E_LLDP_CURRENT_STATUS_SIZE,
						&lldp_cfg.adminstatus);
	} else {
		ret = i40e_read_lldp_cfg(hw, &lldp_cfg);
+3 −0
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@
#define I40E_CEE_MAX_FEAT_TYPE		3
#define I40E_LLDP_CURRENT_STATUS_XL710_OFFSET	0x2B
#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 */
#define I40E_LLDP_TLV_LEN_SHIFT		0
#define I40E_LLDP_TLV_LEN_MASK		(0x01FF << I40E_LLDP_TLV_LEN_SHIFT)
+32 −29
Original line number Diff line number Diff line
@@ -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
 * @hw: pointer to the HW structure
 * @hw: Pointer to the HW structure
 * @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
 * @data_ptr: Pointer to memory location where resulting buffer will be stored
 **/
i40e_status i40e_read_nvm_module_data(struct i40e_hw *hw,
				      u8 module_ptr, u16 offset,
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)
{
	i40e_status status;
	u16 specific_ptr = 0;
	u16 ptr_value = 0;
	u32 flat_offset;
	u32 offset = 0;

	if (module_ptr != 0) {
		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,

	/* Pointer not initialized */
	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;
	}

	/* 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 */
		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 */
		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);
		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_debug(hw, I40E_DEBUG_ALL,
					   "Reading nvm aq failed.Error code: %d.\n",
				   "Reading nvm word failed.Error code: %d.\n",
				   status);
			return I40E_ERR_NVM;
		}
		} else {
			return I40E_ERR_NVM;
		}
	} else {
		/* Read from the Shadow RAM */
		status = i40e_read_nvm_buffer(hw, ptr_value + offset,
					      &words_data_size, data_ptr);

		offset = ptr_value + module_offset + specific_ptr +
			data_offset;

		status = i40e_read_nvm_buffer(hw, offset, &words_data_size,
					      data_ptr);
		if (status) {
			i40e_debug(hw, I40E_DEBUG_ALL,
				   "Reading nvm buffer failed.Error code: %d.\n",
+6 −4
Original line number Diff line number Diff line
@@ -315,8 +315,10 @@ i40e_status i40e_acquire_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,
					 u16 *data);
i40e_status i40e_read_nvm_module_data(struct i40e_hw *hw,
				      u8 module_ptr, u16 offset,
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);
i40e_status i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset,