diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 66 | 
1 files changed, 66 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index a7c9c5d77e0..1e0b94ba2ef 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -1816,6 +1816,69 @@ static const struct net_device_ops igb_netdev_ops = {  };  /** + * igb_set_fw_version - Configure version string for ethtool + * @adapter: adapter struct + * + **/ +void igb_set_fw_version(struct igb_adapter *adapter) +{ +	struct e1000_hw *hw = &adapter->hw; +	u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset; +	u16 major, build, patch, fw_version; +	u32 etrack_id; + +	hw->nvm.ops.read(hw, 5, 1, &fw_version); +	if (adapter->hw.mac.type != e1000_i211) { +		hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh); +		hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl); +		etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl; + +		/* combo image version needs to be found */ +		hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset); +		if ((comb_offset != 0x0) && +		    (comb_offset != IGB_NVM_VER_INVALID)) { +			hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset +					 + 1), 1, &comb_verh); +			hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset), +					 1, &comb_verl); + +			/* Only display Option Rom if it exists and is valid */ +			if ((comb_verh && comb_verl) && +			    ((comb_verh != IGB_NVM_VER_INVALID) && +			     (comb_verl != IGB_NVM_VER_INVALID))) { +				major = comb_verl >> IGB_COMB_VER_SHFT; +				build = (comb_verl << IGB_COMB_VER_SHFT) | +					(comb_verh >> IGB_COMB_VER_SHFT); +				patch = comb_verh & IGB_COMB_VER_MASK; +				snprintf(adapter->fw_version, +					 sizeof(adapter->fw_version), +					 "%d.%d%d, 0x%08x, %d.%d.%d", +					 (fw_version & IGB_MAJOR_MASK) >> +					 IGB_MAJOR_SHIFT, +					 (fw_version & IGB_MINOR_MASK) >> +					 IGB_MINOR_SHIFT, +					 (fw_version & IGB_BUILD_MASK), +					 etrack_id, major, build, patch); +				goto out; +			} +		} +		snprintf(adapter->fw_version, sizeof(adapter->fw_version), +			 "%d.%d%d, 0x%08x", +			 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, +			 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, +			 (fw_version & IGB_BUILD_MASK), etrack_id); +	} else { +		snprintf(adapter->fw_version, sizeof(adapter->fw_version), +			 "%d.%d%d", +			 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, +			 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, +			 (fw_version & IGB_BUILD_MASK)); +	} +out: +	return; +} + +/**   * igb_probe - Device Initialization Routine   * @pdev: PCI device information struct   * @ent: entry in igb_pci_tbl @@ -2025,6 +2088,9 @@ static int __devinit igb_probe(struct pci_dev *pdev,  		goto err_eeprom;  	} +	/* get firmware version for ethtool -i */ +	igb_set_fw_version(adapter); +  	setup_timer(&adapter->watchdog_timer, igb_watchdog,  	            (unsigned long) adapter);  	setup_timer(&adapter->phy_info_timer, igb_update_phy_info,  |