diff options
Diffstat (limited to 'drivers/net/e1000e/ethtool.c')
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index affcacf6f5a9..f8ed03dab9b1 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -624,20 +624,24 @@ static void e1000_get_drvinfo(struct net_device *netdev, | |||
624 | struct e1000_adapter *adapter = netdev_priv(netdev); | 624 | struct e1000_adapter *adapter = netdev_priv(netdev); |
625 | char firmware_version[32]; | 625 | char firmware_version[32]; |
626 | 626 | ||
627 | strncpy(drvinfo->driver, e1000e_driver_name, 32); | 627 | strncpy(drvinfo->driver, e1000e_driver_name, |
628 | strncpy(drvinfo->version, e1000e_driver_version, 32); | 628 | sizeof(drvinfo->driver) - 1); |
629 | strncpy(drvinfo->version, e1000e_driver_version, | ||
630 | sizeof(drvinfo->version) - 1); | ||
629 | 631 | ||
630 | /* | 632 | /* |
631 | * EEPROM image version # is reported as firmware version # for | 633 | * EEPROM image version # is reported as firmware version # for |
632 | * PCI-E controllers | 634 | * PCI-E controllers |
633 | */ | 635 | */ |
634 | sprintf(firmware_version, "%d.%d-%d", | 636 | snprintf(firmware_version, sizeof(firmware_version), "%d.%d-%d", |
635 | (adapter->eeprom_vers & 0xF000) >> 12, | 637 | (adapter->eeprom_vers & 0xF000) >> 12, |
636 | (adapter->eeprom_vers & 0x0FF0) >> 4, | 638 | (adapter->eeprom_vers & 0x0FF0) >> 4, |
637 | (adapter->eeprom_vers & 0x000F)); | 639 | (adapter->eeprom_vers & 0x000F)); |
638 | 640 | ||
639 | strncpy(drvinfo->fw_version, firmware_version, 32); | 641 | strncpy(drvinfo->fw_version, firmware_version, |
640 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); | 642 | sizeof(drvinfo->fw_version) - 1); |
643 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), | ||
644 | sizeof(drvinfo->bus_info) - 1); | ||
641 | drvinfo->regdump_len = e1000_get_regs_len(netdev); | 645 | drvinfo->regdump_len = e1000_get_regs_len(netdev); |
642 | drvinfo->eedump_len = e1000_get_eeprom_len(netdev); | 646 | drvinfo->eedump_len = e1000_get_eeprom_len(netdev); |
643 | } | 647 | } |
@@ -1704,6 +1708,19 @@ static void e1000_diag_test(struct net_device *netdev, | |||
1704 | bool if_running = netif_running(netdev); | 1708 | bool if_running = netif_running(netdev); |
1705 | 1709 | ||
1706 | set_bit(__E1000_TESTING, &adapter->state); | 1710 | set_bit(__E1000_TESTING, &adapter->state); |
1711 | |||
1712 | if (!if_running) { | ||
1713 | /* Get control of and reset hardware */ | ||
1714 | if (adapter->flags & FLAG_HAS_AMT) | ||
1715 | e1000e_get_hw_control(adapter); | ||
1716 | |||
1717 | e1000e_power_up_phy(adapter); | ||
1718 | |||
1719 | adapter->hw.phy.autoneg_wait_to_complete = 1; | ||
1720 | e1000e_reset(adapter); | ||
1721 | adapter->hw.phy.autoneg_wait_to_complete = 0; | ||
1722 | } | ||
1723 | |||
1707 | if (eth_test->flags == ETH_TEST_FL_OFFLINE) { | 1724 | if (eth_test->flags == ETH_TEST_FL_OFFLINE) { |
1708 | /* Offline tests */ | 1725 | /* Offline tests */ |
1709 | 1726 | ||
@@ -1717,8 +1734,6 @@ static void e1000_diag_test(struct net_device *netdev, | |||
1717 | if (if_running) | 1734 | if (if_running) |
1718 | /* indicate we're in test mode */ | 1735 | /* indicate we're in test mode */ |
1719 | dev_close(netdev); | 1736 | dev_close(netdev); |
1720 | else | ||
1721 | e1000e_reset(adapter); | ||
1722 | 1737 | ||
1723 | if (e1000_reg_test(adapter, &data[0])) | 1738 | if (e1000_reg_test(adapter, &data[0])) |
1724 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1739 | eth_test->flags |= ETH_TEST_FL_FAILED; |
@@ -1732,8 +1747,6 @@ static void e1000_diag_test(struct net_device *netdev, | |||
1732 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1747 | eth_test->flags |= ETH_TEST_FL_FAILED; |
1733 | 1748 | ||
1734 | e1000e_reset(adapter); | 1749 | e1000e_reset(adapter); |
1735 | /* make sure the phy is powered up */ | ||
1736 | e1000e_power_up_phy(adapter); | ||
1737 | if (e1000_loopback_test(adapter, &data[3])) | 1750 | if (e1000_loopback_test(adapter, &data[3])) |
1738 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1751 | eth_test->flags |= ETH_TEST_FL_FAILED; |
1739 | 1752 | ||
@@ -1755,28 +1768,29 @@ static void e1000_diag_test(struct net_device *netdev, | |||
1755 | if (if_running) | 1768 | if (if_running) |
1756 | dev_open(netdev); | 1769 | dev_open(netdev); |
1757 | } else { | 1770 | } else { |
1758 | if (!if_running && (adapter->flags & FLAG_HAS_AMT)) { | 1771 | /* Online tests */ |
1759 | clear_bit(__E1000_TESTING, &adapter->state); | ||
1760 | dev_open(netdev); | ||
1761 | set_bit(__E1000_TESTING, &adapter->state); | ||
1762 | } | ||
1763 | 1772 | ||
1764 | e_info("online testing starting\n"); | 1773 | e_info("online testing starting\n"); |
1765 | /* Online tests */ | ||
1766 | if (e1000_link_test(adapter, &data[4])) | ||
1767 | eth_test->flags |= ETH_TEST_FL_FAILED; | ||
1768 | 1774 | ||
1769 | /* Online tests aren't run; pass by default */ | 1775 | /* register, eeprom, intr and loopback tests not run online */ |
1770 | data[0] = 0; | 1776 | data[0] = 0; |
1771 | data[1] = 0; | 1777 | data[1] = 0; |
1772 | data[2] = 0; | 1778 | data[2] = 0; |
1773 | data[3] = 0; | 1779 | data[3] = 0; |
1774 | 1780 | ||
1775 | if (!if_running && (adapter->flags & FLAG_HAS_AMT)) | 1781 | if (e1000_link_test(adapter, &data[4])) |
1776 | dev_close(netdev); | 1782 | eth_test->flags |= ETH_TEST_FL_FAILED; |
1777 | 1783 | ||
1778 | clear_bit(__E1000_TESTING, &adapter->state); | 1784 | clear_bit(__E1000_TESTING, &adapter->state); |
1779 | } | 1785 | } |
1786 | |||
1787 | if (!if_running) { | ||
1788 | e1000e_reset(adapter); | ||
1789 | |||
1790 | if (adapter->flags & FLAG_HAS_AMT) | ||
1791 | e1000e_release_hw_control(adapter); | ||
1792 | } | ||
1793 | |||
1780 | msleep_interruptible(4 * 1000); | 1794 | msleep_interruptible(4 * 1000); |
1781 | } | 1795 | } |
1782 | 1796 | ||