};
 
 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);
 }
 
 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);
        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.
         */
        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)
 {
 {
        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)
        .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)
        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);