diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000/e1000_ethtool.c')
-rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_ethtool.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c index 3103f0b6bf5..6e50ca426cc 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c +++ b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c @@ -29,6 +29,7 @@ /* ethtool support for e1000 */ #include "e1000.h" +#include "e1000_oem_phy.h" #include <asm/uaccess.h> enum {NETDEV_STATS, E1000_STATS}; @@ -112,7 +113,8 @@ static int e1000_get_settings(struct net_device *netdev, struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_hw *hw = &adapter->hw; - if (hw->media_type == e1000_media_type_copper) { + if ((hw->media_type == e1000_media_type_copper) || + (hw->media_type == e1000_media_type_oem)) { ecmd->supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | @@ -283,7 +285,9 @@ static int e1000_set_pauseparam(struct net_device *netdev, } else e1000_reset(adapter); } else - retval = ((hw->media_type == e1000_media_type_fiber) ? + retval = ((hw->media_type == e1000_media_type_fiber) + || (hw->media_type == e1000_media_type_oem + && !e1000_oem_phy_is_copper(&adapter->hw)) ? e1000_setup_link(hw) : e1000_force_mac_fc(hw)); clear_bit(__E1000_RESETTING, &adapter->flags); @@ -371,6 +375,8 @@ static void e1000_get_regs(struct net_device *netdev, struct ethtool_regs *regs, regs_buff[22] = 0; /* phy receive errors (unavailable) */ regs_buff[23] = regs_buff[18]; /* mdix mode */ e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0); + } else if (hw->phy_type == e1000_phy_oem) { + e1000_oem_get_phy_regs(adapter, ®s_buff[0xd], (0xb)); } else { e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); regs_buff[13] = (u32)phy_data; /* cable length */ @@ -748,7 +754,8 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF); REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); - REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); + if (adapter->hw.mac_type != e1000_icp_xxxx) + REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF); value = E1000_RAR_ENTRIES; @@ -1264,6 +1271,9 @@ static int e1000_set_phy_loopback(struct e1000_adapter *adapter) case e1000_82540: case e1000_82545: case e1000_82545_rev_3: + case e1000_icp_xxxx: + return e1000_oem_phy_loopback(adapter); + break; case e1000_82546: case e1000_82546_rev_3: case e1000_82541: @@ -1306,8 +1316,11 @@ static int e1000_setup_loopback_test(struct e1000_adapter *adapter) ew32(RCTL, rctl); return 0; } - } else if (hw->media_type == e1000_media_type_copper) + } else if (adapter->hw.media_type == e1000_media_type_copper + || (adapter->hw.media_type == e1000_media_type_oem + && e1000_oem_phy_is_copper(&adapter->hw))) { return e1000_set_phy_loopback(adapter); + } return 7; } @@ -1337,6 +1350,10 @@ static void e1000_loopback_cleanup(struct e1000_adapter *adapter) } break; } + + if (adapter->hw.media_type == e1000_media_type_oem) { + e1000_oem_loopback_cleanup(adapter); + } } static void e1000_create_lbtest_frame(struct sk_buff *skb, @@ -1468,8 +1485,16 @@ static int e1000_link_test(struct e1000_adapter *adapter, u64 *data) if (hw->autoneg) /* if auto_neg is set wait for it */ msleep(4000); - if (!(er32(STATUS) & E1000_STATUS_LU)) { - *data = 1; + if (adapter->hw.mac_type == e1000_icp_xxxx) { + int isUp = 0; + if (e1000_oem_phy_is_link_up(&adapter->hw, &isUp) != + E1000_SUCCESS) + printk(KERN_WARNING "unable to determine Link Status!\n"); + else + *data = !isUp; + } else { + if (!(er32(STATUS) & E1000_STATUS_LU)) + *data = 1; } } return *data; @@ -1694,12 +1719,18 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) return 0; } + static int e1000_set_phys_id(struct net_device *netdev, enum ethtool_phys_id_state state) { struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_hw *hw = &adapter->hw; + if (adapter->hw.mac_type == e1000_icp_xxxx) { + /* No LED control on ICP family of gigE controllers */ + return 0; + } + switch (state) { case ETHTOOL_ID_ACTIVE: e1000_setup_led(hw); |