Commit 6bdf576e authored by Lennert Buytenhek's avatar Lennert Buytenhek Committed by David S. Miller

mv643xx_eth: unify ethtool ops for phy'd and phy-less interfaces

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: default avatarLennert Buytenhek <buytenh@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aa611f85
...@@ -1279,9 +1279,9 @@ static const struct mv643xx_eth_stats mv643xx_eth_stats[] = { ...@@ -1279,9 +1279,9 @@ static const struct mv643xx_eth_stats mv643xx_eth_stats[] = {
}; };
static int 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; int err;
err = phy_read_status(mp->phy); err = phy_read_status(mp->phy);
...@@ -1298,10 +1298,9 @@ mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -1298,10 +1298,9 @@ mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
} }
static int 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 ethtool_cmd *cmd)
{ {
struct mv643xx_eth_private *mp = netdev_priv(dev);
u32 port_status; u32 port_status;
port_status = rdlp(mp, PORT_STATUS); port_status = rdlp(mp, PORT_STATUS);
...@@ -1333,11 +1332,25 @@ mv643xx_eth_get_settings_phyless(struct net_device *dev, ...@@ -1333,11 +1332,25 @@ mv643xx_eth_get_settings_phyless(struct net_device *dev,
return 0; 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 static int
mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{ {
struct mv643xx_eth_private *mp = netdev_priv(dev); struct mv643xx_eth_private *mp = netdev_priv(dev);
if (mp->phy == NULL)
return -EINVAL;
/* /*
* The MAC does not support 1000baseT_Half. * The MAC does not support 1000baseT_Half.
*/ */
...@@ -1346,13 +1359,6 @@ mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -1346,13 +1359,6 @@ mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
return phy_ethtool_sset(mp->phy, 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, static void mv643xx_eth_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *drvinfo) struct ethtool_drvinfo *drvinfo)
{ {
...@@ -1367,12 +1373,10 @@ static int mv643xx_eth_nway_reset(struct net_device *dev) ...@@ -1367,12 +1373,10 @@ static int mv643xx_eth_nway_reset(struct net_device *dev)
{ {
struct mv643xx_eth_private *mp = netdev_priv(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 genphy_restart_aneg(mp->phy);
{
return -EINVAL;
} }
static u32 mv643xx_eth_get_link(struct net_device *dev) static u32 mv643xx_eth_get_link(struct net_device *dev)
...@@ -1440,18 +1444,6 @@ static const struct ethtool_ops mv643xx_eth_ethtool_ops = { ...@@ -1440,18 +1444,6 @@ static const struct ethtool_ops mv643xx_eth_ethtool_ops = {
.get_sset_count = mv643xx_eth_get_sset_count, .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 *********************************************************/ /* address handling *********************************************************/
static void uc_addr_get(struct mv643xx_eth_private *mp, unsigned char *addr) 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) ...@@ -2673,12 +2665,10 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
if (pd->phy_addr != MV643XX_ETH_PHY_NONE) if (pd->phy_addr != MV643XX_ETH_PHY_NONE)
mp->phy = phy_scan(mp, pd->phy_addr); mp->phy = phy_scan(mp, pd->phy_addr);
if (mp->phy != NULL) { if (mp->phy != NULL)
phy_init(mp, pd->speed, pd->duplex); phy_init(mp, pd->speed, pd->duplex);
SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);
} else { SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);
SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops_phyless);
}
init_pscr(mp, pd->speed, pd->duplex); init_pscr(mp, pd->speed, pd->duplex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment