OSDN Git Service

i40e: Fix for persistent lldp support
authorSylwia Wnuczko <sylwia.wnuczko@intel.com>
Fri, 20 Sep 2019 09:17:15 +0000 (02:17 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 25 Oct 2019 20:38:19 +0000 (13:38 -0700)
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: Sylwia Wnuczko <sylwia.wnuczko@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_dcb.c
drivers/net/ethernet/intel/i40e/i40e_dcb.h
drivers/net/ethernet/intel/i40e/i40e_nvm.c
drivers/net/ethernet/intel/i40e/i40e_prototype.h

index 200a1cb..9de503c 100644 (file)
@@ -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);
index 2a80c5d..ba86ad8 100644 (file)
@@ -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)
index e4d8d20..7164f4a 100644 (file)
@@ -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,
-                                     u16 words_data_size,
-                                     u16 *data_ptr)
+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);
-                       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;
-               }
+               return I40E_ERR_PARAM;
        } else {
                /* 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) {
                        i40e_debug(hw, I40E_DEBUG_ALL,
                                   "Reading nvm buffer failed.Error code: %d.\n",
index 5250441..7effe50 100644 (file)
@@ -315,10 +315,12 @@ 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,
-                                     u16 words_data_size,
-                                     u16 *data_ptr);
+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,
                                 u16 *words, u16 *data);
 i40e_status i40e_update_nvm_checksum(struct i40e_hw *hw);