diff options
Diffstat (limited to 'drivers/net/benet/be_ethtool.c')
-rw-r--r-- | drivers/net/benet/be_ethtool.c | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index 3c05f2b99ab..329560f9e54 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c @@ -297,36 +297,48 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) u8 mac_speed = 0, connector = 0; u16 link_speed = 0; bool link_up = false; + int status; - be_cmd_link_status_query(adapter, &link_up, &mac_speed, &link_speed); + if (adapter->link_speed < 0) { + status = be_cmd_link_status_query(adapter, &link_up, + &mac_speed, &link_speed); + + /* link_speed is in units of 10 Mbps */ + if (link_speed) { + ecmd->speed = link_speed*10; + } else { + switch (mac_speed) { + case PHY_LINK_SPEED_1GBPS: + ecmd->speed = SPEED_1000; + break; + case PHY_LINK_SPEED_10GBPS: + ecmd->speed = SPEED_10000; + break; + } + } - /* link_speed is in units of 10 Mbps */ - if (link_speed) { - ecmd->speed = link_speed*10; - } else { - switch (mac_speed) { - case PHY_LINK_SPEED_1GBPS: - ecmd->speed = SPEED_1000; + status = be_cmd_read_port_type(adapter, adapter->port_num, + &connector); + switch (connector) { + case 7: + ecmd->port = PORT_FIBRE; break; - case PHY_LINK_SPEED_10GBPS: - ecmd->speed = SPEED_10000; + default: + ecmd->port = PORT_TP; break; } + + /* Save for future use */ + adapter->link_speed = ecmd->speed; + adapter->port_type = ecmd->port; + } else { + ecmd->speed = adapter->link_speed; + ecmd->port = adapter->port_type; } + ecmd->duplex = DUPLEX_FULL; ecmd->autoneg = AUTONEG_DISABLE; ecmd->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_TP); - - be_cmd_read_port_type(adapter, adapter->port_num, &connector); - switch (connector) { - case 7: - ecmd->port = PORT_FIBRE; - break; - default: - ecmd->port = PORT_TP; - break; - } - ecmd->phy_address = adapter->port_num; ecmd->transceiver = XCVR_INTERNAL; |