be2net: fix unnecessary access to hardware to get link, port info
authorAjit Khaparde <ajitk@serverengines.com>
Sun, 29 Nov 2009 17:57:46 +0000 (17:57 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Dec 2009 08:50:26 +0000 (00:50 -0800)
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>
drivers/net/benet/be.h
drivers/net/benet/be_ethtool.c
drivers/net/benet/be_main.c

index d90cc015abb3e0806bc37ea9711904bf30fa745a..12247480a1f8aa296a108b68534d4cbb6a372a36 100644 (file)
@@ -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;
index 3c05f2b99ab64361ad2a78238c80a4b2815d812c..329560f9e54318bce5f9ea82770715f7bb033772 100644 (file)
@@ -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;
 
index f3e97ab3321d5636067a507b83be2f2d778eef2f..e291b1b87532f11daff02923d4bde29f95055d6e 100644 (file)
@@ -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);
@@ -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: