mv643xx_eth: unify ethtool ops for phy'd and phy-less interfaces
authorLennert Buytenhek <buytenh@wantstofly.org>
Thu, 12 Feb 2009 14:06:46 +0000 (14:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Feb 2009 07:43:53 +0000 (23:43 -0800)
It's a waste having two different versions of this structure around
when the differences between ethtool ops for phy'd and phy-less
interfaces are so minor.

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mv643xx_eth.c

index 8fab31f631a0e933183c114dd3cfa2a742b06e67..e8fbc0badf7ee656d3c133d961e228be0d855e47 100644 (file)
@@ -1279,9 +1279,9 @@ static const struct mv643xx_eth_stats mv643xx_eth_stats[] = {
 };
 
 static int
-mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+mv643xx_eth_get_settings_phy(struct mv643xx_eth_private *mp,
+                            struct ethtool_cmd *cmd)
 {
-       struct mv643xx_eth_private *mp = netdev_priv(dev);
        int err;
 
        err = phy_read_status(mp->phy);
@@ -1298,10 +1298,9 @@ mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 }
 
 static int
-mv643xx_eth_get_settings_phyless(struct net_device *dev,
+mv643xx_eth_get_settings_phyless(struct mv643xx_eth_private *mp,
                                 struct ethtool_cmd *cmd)
 {
-       struct mv643xx_eth_private *mp = netdev_priv(dev);
        u32 port_status;
 
        port_status = rdlp(mp, PORT_STATUS);
@@ -1333,11 +1332,25 @@ mv643xx_eth_get_settings_phyless(struct net_device *dev,
        return 0;
 }
 
+static int
+mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+{
+       struct mv643xx_eth_private *mp = netdev_priv(dev);
+
+       if (mp->phy != NULL)
+               return mv643xx_eth_get_settings_phy(mp, cmd);
+       else
+               return mv643xx_eth_get_settings_phyless(mp, cmd);
+}
+
 static int
 mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
        struct mv643xx_eth_private *mp = netdev_priv(dev);
 
+       if (mp->phy == NULL)
+               return -EINVAL;
+
        /*
         * The MAC does not support 1000baseT_Half.
         */
@@ -1346,13 +1359,6 @@ mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
        return phy_ethtool_sset(mp->phy, cmd);
 }
 
-static int
-mv643xx_eth_set_settings_phyless(struct net_device *dev,
-                                struct ethtool_cmd *cmd)
-{
-       return -EINVAL;
-}
-
 static void mv643xx_eth_get_drvinfo(struct net_device *dev,
                                    struct ethtool_drvinfo *drvinfo)
 {
@@ -1367,12 +1373,10 @@ static int mv643xx_eth_nway_reset(struct net_device *dev)
 {
        struct mv643xx_eth_private *mp = netdev_priv(dev);
 
-       return genphy_restart_aneg(mp->phy);
-}
+       if (mp->phy == NULL)
+               return -EINVAL;
 
-static int mv643xx_eth_nway_reset_phyless(struct net_device *dev)
-{
-       return -EINVAL;
+       return genphy_restart_aneg(mp->phy);
 }
 
 static u32 mv643xx_eth_get_link(struct net_device *dev)
@@ -1440,18 +1444,6 @@ static const struct ethtool_ops mv643xx_eth_ethtool_ops = {
        .get_sset_count         = mv643xx_eth_get_sset_count,
 };
 
-static const struct ethtool_ops mv643xx_eth_ethtool_ops_phyless = {
-       .get_settings           = mv643xx_eth_get_settings_phyless,
-       .set_settings           = mv643xx_eth_set_settings_phyless,
-       .get_drvinfo            = mv643xx_eth_get_drvinfo,
-       .nway_reset             = mv643xx_eth_nway_reset_phyless,
-       .get_link               = mv643xx_eth_get_link,
-       .set_sg                 = ethtool_op_set_sg,
-       .get_strings            = mv643xx_eth_get_strings,
-       .get_ethtool_stats      = mv643xx_eth_get_ethtool_stats,
-       .get_sset_count         = mv643xx_eth_get_sset_count,
-};
-
 
 /* address handling *********************************************************/
 static void uc_addr_get(struct mv643xx_eth_private *mp, unsigned char *addr)
@@ -2673,12 +2665,10 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
        if (pd->phy_addr != MV643XX_ETH_PHY_NONE)
                mp->phy = phy_scan(mp, pd->phy_addr);
 
-       if (mp->phy != NULL) {
+       if (mp->phy != NULL)
                phy_init(mp, pd->speed, pd->duplex);
-               SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);
-       } else {
-               SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops_phyless);
-       }
+
+       SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);
 
        init_pscr(mp, pd->speed, pd->duplex);