|
@@ -1815,6 +1815,69 @@ static const struct net_device_ops igb_netdev_ops = {
|
|
|
.ndo_set_features = igb_set_features,
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * 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
|
|
@@ -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,
|