Skip to content

Commit

Permalink
be2net: fix unnecessary access to hardware to get link, port info
Browse files Browse the repository at this point in the history
Every time while doing ethtool->get_settings we are accessing
the hardware to get link status and port information.
This is not necessary.  We now use the cached copy for this info
and update it when the link status changes.

From: Suresh R <sureshr@serverengines.com>

Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ajit Khaparde authored and David S. Miller committed Dec 2, 2009
1 parent b7b83ac commit 0dffc83
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 21 deletions.
2 changes: 2 additions & 0 deletions drivers/net/benet/be.h
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ struct be_adapter {
u32 cap;
u32 rx_fc; /* Rx flow control */
u32 tx_fc; /* Tx flow control */
int link_speed;
u8 port_type;
};

extern const struct ethtool_ops be_ethtool_ops;
Expand Down
54 changes: 33 additions & 21 deletions drivers/net/benet/be_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
3 changes: 3 additions & 0 deletions drivers/net/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ void be_link_status_update(struct be_adapter *adapter, bool link_up)

/* If link came up or went down */
if (adapter->link_up != link_up) {
adapter->link_speed = -1;
if (link_up) {
netif_start_queue(netdev);
netif_carrier_on(netdev);
Expand Down Expand Up @@ -1674,6 +1675,8 @@ static int be_setup(struct be_adapter *adapter)
if (status != 0)
goto rx_qs_destroy;

adapter->link_speed = -1;

return 0;

rx_qs_destroy:
Expand Down

0 comments on commit 0dffc83

Please sign in to comment.