nfp: refresh port state before reporting autonegotiation
authorJakub Kicinski <jakub.kicinski@netronome.com>
Mon, 22 May 2017 17:59:34 +0000 (10:59 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 May 2017 18:59:06 +0000 (14:59 -0400)
State of autonegotiation may have changed but is not yet refreshed.
Make sure ethtool respects the NFP_PORT_CHANGED flag when looking
at autoneg.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
drivers/net/ethernet/netronome/nfp/nfp_port.c
drivers/net/ethernet/netronome/nfp/nfp_port.h

index 23f9ea0..84fdbc4 100644 (file)
@@ -209,7 +209,7 @@ nfp_net_get_link_ksettings(struct net_device *netdev,
        cmd->base.duplex = DUPLEX_UNKNOWN;
 
        port = nfp_port_from_netdev(netdev);
-       eth_port = __nfp_port_get_eth_port(port);
+       eth_port = nfp_port_get_eth_port(port);
        if (eth_port)
                cmd->base.autoneg = eth_port->aneg != NFP_ANEG_DISABLED ?
                        AUTONEG_ENABLE : AUTONEG_DISABLE;
@@ -219,14 +219,6 @@ nfp_net_get_link_ksettings(struct net_device *netdev,
 
        /* Use link speed from ETH table if available, otherwise try the BAR */
        if (eth_port) {
-               int err;
-
-               if (test_bit(NFP_PORT_CHANGED, &port->flags)) {
-                       err = nfp_net_refresh_eth_port(port);
-                       if (err)
-                               return err;
-               }
-
                cmd->base.port = eth_port->port_type;
                cmd->base.speed = eth_port->speed;
                cmd->base.duplex = DUPLEX_FULL;
index 295db04..3beed41 100644 (file)
@@ -58,6 +58,18 @@ struct nfp_eth_table_port *__nfp_port_get_eth_port(struct nfp_port *port)
        return port->eth_port;
 }
 
+struct nfp_eth_table_port *nfp_port_get_eth_port(struct nfp_port *port)
+{
+       if (!__nfp_port_get_eth_port(port))
+               return NULL;
+
+       if (test_bit(NFP_PORT_CHANGED, &port->flags))
+               if (nfp_net_refresh_eth_port(port))
+                       return NULL;
+
+       return __nfp_port_get_eth_port(port);
+}
+
 int
 nfp_port_get_phys_port_name(struct net_device *netdev, char *name, size_t len)
 {
index 471fff1..641617d 100644 (file)
@@ -86,6 +86,7 @@ struct nfp_port {
 
 struct nfp_port *nfp_port_from_netdev(struct net_device *netdev);
 struct nfp_eth_table_port *__nfp_port_get_eth_port(struct nfp_port *port);
+struct nfp_eth_table_port *nfp_port_get_eth_port(struct nfp_port *port);
 
 int
 nfp_port_get_phys_port_name(struct net_device *netdev, char *name, size_t len);