]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/e1000e/ethtool.c
Pull documentation into release branch
[linux-2.6-omap-h63xx.git] / drivers / net / e1000e / ethtool.c
index 2e8218fb05795c906d1c731812f61751af8a50c6..0666e62e9ad29fb0fcbcd34043ac0178ed3325b3 100644 (file)
@@ -110,6 +110,7 @@ static int e1000_get_settings(struct net_device *netdev,
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
+       u32 status;
 
        if (hw->media_type == e1000_media_type_copper) {
 
@@ -147,16 +148,16 @@ static int e1000_get_settings(struct net_device *netdev,
                ecmd->transceiver = XCVR_EXTERNAL;
        }
 
-       if (er32(STATUS) & E1000_STATUS_LU) {
-
-               adapter->hw.mac.ops.get_link_up_info(hw, &adapter->link_speed,
-                                                 &adapter->link_duplex);
-               ecmd->speed = adapter->link_speed;
-
-               /* unfortunately FULL_DUPLEX != DUPLEX_FULL
-                *        and HALF_DUPLEX != DUPLEX_HALF */
+       status = er32(STATUS);
+       if (status & E1000_STATUS_LU) {
+               if (status & E1000_STATUS_SPEED_1000)
+                       ecmd->speed = 1000;
+               else if (status & E1000_STATUS_SPEED_100)
+                       ecmd->speed = 100;
+               else
+                       ecmd->speed = 10;
 
-               if (adapter->link_duplex == FULL_DUPLEX)
+               if (status & E1000_STATUS_FD)
                        ecmd->duplex = DUPLEX_FULL;
                else
                        ecmd->duplex = DUPLEX_HALF;
@@ -170,6 +171,16 @@ static int e1000_get_settings(struct net_device *netdev,
        return 0;
 }
 
+static u32 e1000_get_link(struct net_device *netdev)
+{
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+       struct e1000_hw *hw = &adapter->hw;
+       u32 status;
+       
+       status = er32(STATUS);
+       return (status & E1000_STATUS_LU);
+}
+
 static int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
 {
        struct e1000_mac_info *mac = &adapter->hw.mac;
@@ -301,6 +312,7 @@ static int e1000_set_pauseparam(struct net_device *netdev,
        hw->mac.original_fc = hw->mac.fc;
 
        if (adapter->fc_autoneg == AUTONEG_ENABLE) {
+               hw->mac.fc = e1000_fc_default;
                if (netif_running(adapter->netdev)) {
                        e1000e_down(adapter);
                        e1000e_up(adapter);
@@ -1450,11 +1462,11 @@ static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
        }
 
        *data = e1000_setup_desc_rings(adapter);
-       if (data)
+       if (*data)
                goto out;
 
        *data = e1000_setup_loopback_test(adapter);
-       if (data)
+       if (*data)
                goto err_loopback;
 
        *data = e1000_run_loopback_test(adapter);
@@ -1750,7 +1762,7 @@ static const struct ethtool_ops e1000_ethtool_ops = {
        .get_msglevel           = e1000_get_msglevel,
        .set_msglevel           = e1000_set_msglevel,
        .nway_reset             = e1000_nway_reset,
-       .get_link               = ethtool_op_get_link,
+       .get_link               = e1000_get_link,
        .get_eeprom_len         = e1000_get_eeprom_len,
        .get_eeprom             = e1000_get_eeprom,
        .set_eeprom             = e1000_set_eeprom,