|
@@ -4028,6 +4028,118 @@ s32 ixgbe_init_thermal_sensor_thresh_generic(struct ixgbe_hw *hw)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * ixgbe_get_orom_version - Return option ROM from EEPROM
|
|
|
|
+ *
|
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
|
+ * @nvm_ver: pointer to output structure
|
|
|
|
+ *
|
|
|
|
+ * if valid option ROM version, nvm_ver->or_valid set to true
|
|
|
|
+ * else nvm_ver->or_valid is false.
|
|
|
|
+ **/
|
|
|
|
+void ixgbe_get_orom_version(struct ixgbe_hw *hw,
|
|
|
|
+ struct ixgbe_nvm_version *nvm_ver)
|
|
|
|
+{
|
|
|
|
+ u16 offset, eeprom_cfg_blkh, eeprom_cfg_blkl;
|
|
|
|
+
|
|
|
|
+ nvm_ver->or_valid = false;
|
|
|
|
+ /* Option Rom may or may not be present. Start with pointer */
|
|
|
|
+ hw->eeprom.ops.read(hw, NVM_OROM_OFFSET, &offset);
|
|
|
|
+
|
|
|
|
+ /* make sure offset is valid */
|
|
|
|
+ if (offset == 0x0 || offset == NVM_INVALID_PTR)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ hw->eeprom.ops.read(hw, offset + NVM_OROM_BLK_HI, &eeprom_cfg_blkh);
|
|
|
|
+ hw->eeprom.ops.read(hw, offset + NVM_OROM_BLK_LOW, &eeprom_cfg_blkl);
|
|
|
|
+
|
|
|
|
+ /* option rom exists and is valid */
|
|
|
|
+ if ((eeprom_cfg_blkl | eeprom_cfg_blkh) == 0x0 ||
|
|
|
|
+ eeprom_cfg_blkl == NVM_VER_INVALID ||
|
|
|
|
+ eeprom_cfg_blkh == NVM_VER_INVALID)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ nvm_ver->or_valid = true;
|
|
|
|
+ nvm_ver->or_major = eeprom_cfg_blkl >> NVM_OROM_SHIFT;
|
|
|
|
+ nvm_ver->or_build = (eeprom_cfg_blkl << NVM_OROM_SHIFT) |
|
|
|
|
+ (eeprom_cfg_blkh >> NVM_OROM_SHIFT);
|
|
|
|
+ nvm_ver->or_patch = eeprom_cfg_blkh & NVM_OROM_PATCH_MASK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * ixgbe_get_oem_prod_version Etrack ID from EEPROM
|
|
|
|
+ *
|
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
|
+ * @nvm_ver: pointer to output structure
|
|
|
|
+ *
|
|
|
|
+ * if valid OEM product version, nvm_ver->oem_valid set to true
|
|
|
|
+ * else nvm_ver->oem_valid is false.
|
|
|
|
+ **/
|
|
|
|
+void ixgbe_get_oem_prod_version(struct ixgbe_hw *hw,
|
|
|
|
+ struct ixgbe_nvm_version *nvm_ver)
|
|
|
|
+{
|
|
|
|
+ u16 rel_num, prod_ver, mod_len, cap, offset;
|
|
|
|
+
|
|
|
|
+ nvm_ver->oem_valid = false;
|
|
|
|
+ hw->eeprom.ops.read(hw, NVM_OEM_PROD_VER_PTR, &offset);
|
|
|
|
+
|
|
|
|
+ /* Return is offset to OEM Product Version block is invalid */
|
|
|
|
+ if (offset == 0x0 && offset == NVM_INVALID_PTR)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ /* Read product version block */
|
|
|
|
+ hw->eeprom.ops.read(hw, offset, &mod_len);
|
|
|
|
+ hw->eeprom.ops.read(hw, offset + NVM_OEM_PROD_VER_CAP_OFF, &cap);
|
|
|
|
+
|
|
|
|
+ /* Return if OEM product version block is invalid */
|
|
|
|
+ if (mod_len != NVM_OEM_PROD_VER_MOD_LEN ||
|
|
|
|
+ (cap & NVM_OEM_PROD_VER_CAP_MASK) != 0x0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ hw->eeprom.ops.read(hw, offset + NVM_OEM_PROD_VER_OFF_L, &prod_ver);
|
|
|
|
+ hw->eeprom.ops.read(hw, offset + NVM_OEM_PROD_VER_OFF_H, &rel_num);
|
|
|
|
+
|
|
|
|
+ /* Return if version is invalid */
|
|
|
|
+ if ((rel_num | prod_ver) == 0x0 ||
|
|
|
|
+ rel_num == NVM_VER_INVALID || prod_ver == NVM_VER_INVALID)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ nvm_ver->oem_major = prod_ver >> NVM_VER_SHIFT;
|
|
|
|
+ nvm_ver->oem_minor = prod_ver & NVM_VER_MASK;
|
|
|
|
+ nvm_ver->oem_release = rel_num;
|
|
|
|
+ nvm_ver->oem_valid = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * ixgbe_get_etk_id - Return Etrack ID from EEPROM
|
|
|
|
+ *
|
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
|
+ * @nvm_ver: pointer to output structure
|
|
|
|
+ *
|
|
|
|
+ * word read errors will return 0xFFFF
|
|
|
|
+ **/
|
|
|
|
+void ixgbe_get_etk_id(struct ixgbe_hw *hw,
|
|
|
|
+ struct ixgbe_nvm_version *nvm_ver)
|
|
|
|
+{
|
|
|
|
+ u16 etk_id_l, etk_id_h;
|
|
|
|
+
|
|
|
|
+ if (hw->eeprom.ops.read(hw, NVM_ETK_OFF_LOW, &etk_id_l))
|
|
|
|
+ etk_id_l = NVM_VER_INVALID;
|
|
|
|
+ if (hw->eeprom.ops.read(hw, NVM_ETK_OFF_HI, &etk_id_h))
|
|
|
|
+ etk_id_h = NVM_VER_INVALID;
|
|
|
|
+
|
|
|
|
+ /* The word order for the version format is determined by high order
|
|
|
|
+ * word bit 15.
|
|
|
|
+ */
|
|
|
|
+ if ((etk_id_h & NVM_ETK_VALID) == 0) {
|
|
|
|
+ nvm_ver->etk_id = etk_id_h;
|
|
|
|
+ nvm_ver->etk_id |= (etk_id_l << NVM_ETK_SHIFT);
|
|
|
|
+ } else {
|
|
|
|
+ nvm_ver->etk_id = etk_id_l;
|
|
|
|
+ nvm_ver->etk_id |= (etk_id_h << NVM_ETK_SHIFT);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void ixgbe_disable_rx_generic(struct ixgbe_hw *hw)
|
|
void ixgbe_disable_rx_generic(struct ixgbe_hw *hw)
|
|
{
|
|
{
|
|
u32 rxctrl;
|
|
u32 rxctrl;
|