diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_common.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 121 | 
1 files changed, 118 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 9bef255f6a18..61188f343955 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c @@ -1613,6 +1613,7 @@ static void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, u16 data,  /**   *  ixgbe_shift_in_eeprom_bits - Shift data bits in from the EEPROM   *  @hw: pointer to hardware structure + *  @count: number of bits to shift   **/  static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count)  { @@ -1667,7 +1668,7 @@ static void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, u32 *eec)  /**   *  ixgbe_lower_eeprom_clk - Lowers the EEPROM's clock input.   *  @hw: pointer to hardware structure - *  @eecd: EECD's current value + *  @eec: EEC's current value   **/  static void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, u32 *eec)  { @@ -2037,7 +2038,7 @@ static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr)  /**   *  ixgbe_set_mta - Set bit-vector in multicast table   *  @hw: pointer to hardware structure - *  @hash_value: Multicast address hash value + *  @mc_addr: Multicast address   *   *  Sets the bit-vector in the multicast table.   **/ @@ -3086,6 +3087,8 @@ s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw)   *  ixgbe_find_vlvf_slot - find the vlanid or the first empty slot   *  @hw: pointer to hardware structure   *  @vlan: VLAN id to write to VLAN filter + *  @vlvf_bypass: true to find vlanid only, false returns first empty slot if + *		  vlanid not found   *   *  return the VLVF index where this VLAN id should be placed   * @@ -3476,7 +3479,7 @@ void ixgbe_set_mac_anti_spoofing(struct ixgbe_hw *hw, bool enable, int vf)   *  ixgbe_set_vlan_anti_spoofing - Enable/Disable VLAN anti-spoofing   *  @hw: pointer to hardware structure   *  @enable: enable or disable switch for VLAN anti-spoofing - *  @pf: Virtual Function pool - VF Pool to set for VLAN anti-spoofing + *  @vf: Virtual Function pool - VF Pool to set for VLAN anti-spoofing   *   **/  void ixgbe_set_vlan_anti_spoofing(struct ixgbe_hw *hw, bool enable, int vf) @@ -4028,6 +4031,118 @@ s32 ixgbe_init_thermal_sensor_thresh_generic(struct ixgbe_hw *hw)  	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)  {  	u32 rxctrl;  |