diff options
| -rw-r--r-- | drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c | 58 | 
1 files changed, 38 insertions, 20 deletions
| diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c index b19be7c6c1f4..21093276d2b7 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c | |||
| @@ -73,62 +73,80 @@ static const struct pch_gbe_stats pch_gbe_gstrings_stats[] = { | |||
| 73 | #define PCH_GBE_MAC_REGS_LEN (sizeof(struct pch_gbe_regs) / 4) | 73 | #define PCH_GBE_MAC_REGS_LEN (sizeof(struct pch_gbe_regs) / 4) | 
| 74 | #define PCH_GBE_REGS_LEN (PCH_GBE_MAC_REGS_LEN + PCH_GBE_PHY_REGS_LEN) | 74 | #define PCH_GBE_REGS_LEN (PCH_GBE_MAC_REGS_LEN + PCH_GBE_PHY_REGS_LEN) | 
| 75 | /** | 75 | /** | 
| 76 | * pch_gbe_get_settings - Get device-specific settings | 76 | * pch_gbe_get_link_ksettings - Get device-specific settings | 
| 77 | * @netdev: Network interface device structure | 77 | * @netdev: Network interface device structure | 
| 78 | * @ecmd: Ethtool command | 78 | * @ecmd: Ethtool command | 
| 79 | * Returns: | 79 | * Returns: | 
| 80 | * 0: Successful. | 80 | * 0: Successful. | 
| 81 | * Negative value: Failed. | 81 | * Negative value: Failed. | 
| 82 | */ | 82 | */ | 
| 83 | static int pch_gbe_get_settings(struct net_device *netdev, | 83 | static int pch_gbe_get_link_ksettings(struct net_device *netdev, | 
| 84 | struct ethtool_cmd *ecmd) | 84 | struct ethtool_link_ksettings *ecmd) | 
| 85 | { | 85 | { | 
| 86 | struct pch_gbe_adapter *adapter = netdev_priv(netdev); | 86 | struct pch_gbe_adapter *adapter = netdev_priv(netdev); | 
| 87 | u32 supported, advertising; | ||
| 87 | int ret; | 88 | int ret; | 
| 88 | 89 | ||
| 89 | ret = mii_ethtool_gset(&adapter->mii, ecmd); | 90 | ret = mii_ethtool_get_link_ksettings(&adapter->mii, ecmd); | 
| 90 | ecmd->supported &= ~(SUPPORTED_TP | SUPPORTED_1000baseT_Half); | 91 | |
| 91 | ecmd->advertising &= ~(ADVERTISED_TP | ADVERTISED_1000baseT_Half); | 92 | ethtool_convert_link_mode_to_legacy_u32(&supported, | 
| 93 | ecmd->link_modes.supported); | ||
| 94 | ethtool_convert_link_mode_to_legacy_u32(&advertising, | ||
| 95 | ecmd->link_modes.advertising); | ||
| 96 | |||
| 97 | supported &= ~(SUPPORTED_TP | SUPPORTED_1000baseT_Half); | ||
| 98 | advertising &= ~(ADVERTISED_TP | ADVERTISED_1000baseT_Half); | ||
| 99 | |||
| 100 | ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.supported, | ||
| 101 | supported); | ||
| 102 | ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.advertising, | ||
| 103 | advertising); | ||
| 92 | 104 | ||
| 93 | if (!netif_carrier_ok(adapter->netdev)) | 105 | if (!netif_carrier_ok(adapter->netdev)) | 
| 94 | ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN); | 106 | ecmd->base.speed = SPEED_UNKNOWN; | 
| 95 | return ret; | 107 | return ret; | 
| 96 | } | 108 | } | 
| 97 | 109 | ||
| 98 | /** | 110 | /** | 
| 99 | * pch_gbe_set_settings - Set device-specific settings | 111 | * pch_gbe_set_link_ksettings - Set device-specific settings | 
| 100 | * @netdev: Network interface device structure | 112 | * @netdev: Network interface device structure | 
| 101 | * @ecmd: Ethtool command | 113 | * @ecmd: Ethtool command | 
| 102 | * Returns: | 114 | * Returns: | 
| 103 | * 0: Successful. | 115 | * 0: Successful. | 
| 104 | * Negative value: Failed. | 116 | * Negative value: Failed. | 
| 105 | */ | 117 | */ | 
| 106 | static int pch_gbe_set_settings(struct net_device *netdev, | 118 | static int pch_gbe_set_link_ksettings(struct net_device *netdev, | 
| 107 | struct ethtool_cmd *ecmd) | 119 | const struct ethtool_link_ksettings *ecmd) | 
| 108 | { | 120 | { | 
| 109 | struct pch_gbe_adapter *adapter = netdev_priv(netdev); | 121 | struct pch_gbe_adapter *adapter = netdev_priv(netdev); | 
| 110 | struct pch_gbe_hw *hw = &adapter->hw; | 122 | struct pch_gbe_hw *hw = &adapter->hw; | 
| 111 | u32 speed = ethtool_cmd_speed(ecmd); | 123 | struct ethtool_link_ksettings copy_ecmd; | 
| 124 | u32 speed = ecmd->base.speed; | ||
| 125 | u32 advertising; | ||
| 112 | int ret; | 126 | int ret; | 
| 113 | 127 | ||
| 114 | pch_gbe_hal_write_phy_reg(hw, MII_BMCR, BMCR_RESET); | 128 | pch_gbe_hal_write_phy_reg(hw, MII_BMCR, BMCR_RESET); | 
| 115 | 129 | ||
| 130 | memcpy(©_ecmd, ecmd, sizeof(*ecmd)); | ||
| 131 | |||
| 116 | /* when set_settings() is called with a ethtool_cmd previously | 132 | /* when set_settings() is called with a ethtool_cmd previously | 
| 117 | * filled by get_settings() on a down link, speed is -1: */ | 133 | * filled by get_settings() on a down link, speed is -1: */ | 
| 118 | if (speed == UINT_MAX) { | 134 | if (speed == UINT_MAX) { | 
| 119 | speed = SPEED_1000; | 135 | speed = SPEED_1000; | 
| 120 | ethtool_cmd_speed_set(ecmd, speed); | 136 | copy_ecmd.base.speed = speed; | 
| 121 | ecmd->duplex = DUPLEX_FULL; | 137 | copy_ecmd.base.duplex = DUPLEX_FULL; | 
| 122 | } | 138 | } | 
| 123 | ret = mii_ethtool_sset(&adapter->mii, ecmd); | 139 | ret = mii_ethtool_set_link_ksettings(&adapter->mii, ©_ecmd); | 
| 124 | if (ret) { | 140 | if (ret) { | 
| 125 | netdev_err(netdev, "Error: mii_ethtool_sset\n"); | 141 | netdev_err(netdev, "Error: mii_ethtool_set_link_ksettings\n"); | 
| 126 | return ret; | 142 | return ret; | 
| 127 | } | 143 | } | 
| 128 | hw->mac.link_speed = speed; | 144 | hw->mac.link_speed = speed; | 
| 129 | hw->mac.link_duplex = ecmd->duplex; | 145 | hw->mac.link_duplex = copy_ecmd.base.duplex; | 
| 130 | hw->phy.autoneg_advertised = ecmd->advertising; | 146 | ethtool_convert_link_mode_to_legacy_u32( | 
| 131 | hw->mac.autoneg = ecmd->autoneg; | 147 | &advertising, copy_ecmd.link_modes.advertising); | 
| 148 | hw->phy.autoneg_advertised = advertising; | ||
| 149 | hw->mac.autoneg = copy_ecmd.base.autoneg; | ||
| 132 | 150 | ||
| 133 | /* reset the link */ | 151 | /* reset the link */ | 
| 134 | if (netif_running(adapter->netdev)) { | 152 | if (netif_running(adapter->netdev)) { | 
| @@ -487,8 +505,6 @@ static int pch_gbe_get_sset_count(struct net_device *netdev, int sset) | |||
| 487 | } | 505 | } | 
| 488 | 506 | ||
| 489 | static const struct ethtool_ops pch_gbe_ethtool_ops = { | 507 | static const struct ethtool_ops pch_gbe_ethtool_ops = { | 
| 490 | .get_settings = pch_gbe_get_settings, | ||
| 491 | .set_settings = pch_gbe_set_settings, | ||
| 492 | .get_drvinfo = pch_gbe_get_drvinfo, | 508 | .get_drvinfo = pch_gbe_get_drvinfo, | 
| 493 | .get_regs_len = pch_gbe_get_regs_len, | 509 | .get_regs_len = pch_gbe_get_regs_len, | 
| 494 | .get_regs = pch_gbe_get_regs, | 510 | .get_regs = pch_gbe_get_regs, | 
| @@ -503,6 +519,8 @@ static const struct ethtool_ops pch_gbe_ethtool_ops = { | |||
| 503 | .get_strings = pch_gbe_get_strings, | 519 | .get_strings = pch_gbe_get_strings, | 
| 504 | .get_ethtool_stats = pch_gbe_get_ethtool_stats, | 520 | .get_ethtool_stats = pch_gbe_get_ethtool_stats, | 
| 505 | .get_sset_count = pch_gbe_get_sset_count, | 521 | .get_sset_count = pch_gbe_get_sset_count, | 
| 522 | .get_link_ksettings = pch_gbe_get_link_ksettings, | ||
| 523 | .set_link_ksettings = pch_gbe_set_link_ksettings, | ||
| 506 | }; | 524 | }; | 
| 507 | 525 | ||
| 508 | void pch_gbe_set_ethtool_ops(struct net_device *netdev) | 526 | void pch_gbe_set_ethtool_ops(struct net_device *netdev) | 
