OSDN Git Service

net: sun: sungem: use new api ethtool_{get|set}_link_ksettings
authorPhilippe Reynes <tremyfr@gmail.com>
Sat, 4 Mar 2017 23:04:18 +0000 (00:04 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Mar 2017 06:18:05 +0000 (22:18 -0800)
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sun/sungem.c

index 5c5952e..dbfca04 100644 (file)
@@ -1250,12 +1250,17 @@ static void gem_stop_dma(struct gem *gp)
 
 
 // XXX dbl check what that function should do when called on PCS PHY
-static void gem_begin_auto_negotiation(struct gem *gp, struct ethtool_cmd *ep)
+static void gem_begin_auto_negotiation(struct gem *gp,
+                                      const struct ethtool_link_ksettings *ep)
 {
        u32 advertise, features;
        int autoneg;
        int speed;
        int duplex;
+       u32 advertising;
+
+       ethtool_convert_link_mode_to_legacy_u32(&advertising,
+                                               ep->link_modes.advertising);
 
        if (gp->phy_type != phy_mii_mdio0 &&
            gp->phy_type != phy_mii_mdio1)
@@ -1278,13 +1283,13 @@ static void gem_begin_auto_negotiation(struct gem *gp, struct ethtool_cmd *ep)
        /* Setup link parameters */
        if (!ep)
                goto start_aneg;
-       if (ep->autoneg == AUTONEG_ENABLE) {
-               advertise = ep->advertising;
+       if (ep->base.autoneg == AUTONEG_ENABLE) {
+               advertise = advertising;
                autoneg = 1;
        } else {
                autoneg = 0;
-               speed = ethtool_cmd_speed(ep);
-               duplex = ep->duplex;
+               speed = ep->base.speed;
+               duplex = ep->base.duplex;
        }
 
 start_aneg:
@@ -2515,85 +2520,96 @@ static void gem_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info
        strlcpy(info->bus_info, pci_name(gp->pdev), sizeof(info->bus_info));
 }
 
-static int gem_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int gem_get_link_ksettings(struct net_device *dev,
+                                 struct ethtool_link_ksettings *cmd)
 {
        struct gem *gp = netdev_priv(dev);
+       u32 supported, advertising;
 
        if (gp->phy_type == phy_mii_mdio0 ||
            gp->phy_type == phy_mii_mdio1) {
                if (gp->phy_mii.def)
-                       cmd->supported = gp->phy_mii.def->features;
+                       supported = gp->phy_mii.def->features;
                else
-                       cmd->supported = (SUPPORTED_10baseT_Half |
+                       supported = (SUPPORTED_10baseT_Half |
                                          SUPPORTED_10baseT_Full);
 
                /* XXX hardcoded stuff for now */
-               cmd->port = PORT_MII;
-               cmd->transceiver = XCVR_EXTERNAL;
-               cmd->phy_address = 0; /* XXX fixed PHYAD */
+               cmd->base.port = PORT_MII;
+               cmd->base.phy_address = 0; /* XXX fixed PHYAD */
 
                /* Return current PHY settings */
-               cmd->autoneg = gp->want_autoneg;
-               ethtool_cmd_speed_set(cmd, gp->phy_mii.speed);
-               cmd->duplex = gp->phy_mii.duplex;
-               cmd->advertising = gp->phy_mii.advertising;
+               cmd->base.autoneg = gp->want_autoneg;
+               cmd->base.speed = gp->phy_mii.speed;
+               cmd->base.duplex = gp->phy_mii.duplex;
+               advertising = gp->phy_mii.advertising;
 
                /* If we started with a forced mode, we don't have a default
                 * advertise set, we need to return something sensible so
                 * userland can re-enable autoneg properly.
                 */
-               if (cmd->advertising == 0)
-                       cmd->advertising = cmd->supported;
+               if (advertising == 0)
+                       advertising = supported;
        } else { // XXX PCS ?
-               cmd->supported =
+               supported =
                        (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
                         SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
                         SUPPORTED_Autoneg);
-               cmd->advertising = cmd->supported;
-               ethtool_cmd_speed_set(cmd, 0);
-               cmd->duplex = cmd->port = cmd->phy_address =
-                       cmd->transceiver = cmd->autoneg = 0;
+               advertising = supported;
+               cmd->base.speed = 0;
+               cmd->base.duplex = 0;
+               cmd->base.port = 0;
+               cmd->base.phy_address = 0;
+               cmd->base.autoneg = 0;
 
                /* serdes means usually a Fibre connector, with most fixed */
                if (gp->phy_type == phy_serdes) {
-                       cmd->port = PORT_FIBRE;
-                       cmd->supported = (SUPPORTED_1000baseT_Half |
+                       cmd->base.port = PORT_FIBRE;
+                       supported = (SUPPORTED_1000baseT_Half |
                                SUPPORTED_1000baseT_Full |
                                SUPPORTED_FIBRE | SUPPORTED_Autoneg |
                                SUPPORTED_Pause | SUPPORTED_Asym_Pause);
-                       cmd->advertising = cmd->supported;
-                       cmd->transceiver = XCVR_INTERNAL;
+                       advertising = supported;
                        if (gp->lstate == link_up)
-                               ethtool_cmd_speed_set(cmd, SPEED_1000);
-                       cmd->duplex = DUPLEX_FULL;
-                       cmd->autoneg = 1;
+                               cmd->base.speed = SPEED_1000;
+                       cmd->base.duplex = DUPLEX_FULL;
+                       cmd->base.autoneg = 1;
                }
        }
-       cmd->maxtxpkt = cmd->maxrxpkt = 0;
+
+       ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+                                               supported);
+       ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+                                               advertising);
 
        return 0;
 }
 
-static int gem_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int gem_set_link_ksettings(struct net_device *dev,
+                                 const struct ethtool_link_ksettings *cmd)
 {
        struct gem *gp = netdev_priv(dev);
-       u32 speed = ethtool_cmd_speed(cmd);
+       u32 speed = cmd->base.speed;
+       u32 advertising;
+
+       ethtool_convert_link_mode_to_legacy_u32(&advertising,
+                                               cmd->link_modes.advertising);
 
        /* Verify the settings we care about. */
-       if (cmd->autoneg != AUTONEG_ENABLE &&
-           cmd->autoneg != AUTONEG_DISABLE)
+       if (cmd->base.autoneg != AUTONEG_ENABLE &&
+           cmd->base.autoneg != AUTONEG_DISABLE)
                return -EINVAL;
 
-       if (cmd->autoneg == AUTONEG_ENABLE &&
-           cmd->advertising == 0)
+       if (cmd->base.autoneg == AUTONEG_ENABLE &&
+           advertising == 0)
                return -EINVAL;
 
-       if (cmd->autoneg == AUTONEG_DISABLE &&
+       if (cmd->base.autoneg == AUTONEG_DISABLE &&
            ((speed != SPEED_1000 &&
              speed != SPEED_100 &&
              speed != SPEED_10) ||
-            (cmd->duplex != DUPLEX_HALF &&
-             cmd->duplex != DUPLEX_FULL)))
+            (cmd->base.duplex != DUPLEX_HALF &&
+             cmd->base.duplex != DUPLEX_FULL)))
                return -EINVAL;
 
        /* Apply settings and restart link process. */
@@ -2666,13 +2682,13 @@ static int gem_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 static const struct ethtool_ops gem_ethtool_ops = {
        .get_drvinfo            = gem_get_drvinfo,
        .get_link               = ethtool_op_get_link,
-       .get_settings           = gem_get_settings,
-       .set_settings           = gem_set_settings,
        .nway_reset             = gem_nway_reset,
        .get_msglevel           = gem_get_msglevel,
        .set_msglevel           = gem_set_msglevel,
        .get_wol                = gem_get_wol,
        .set_wol                = gem_set_wol,
+       .get_link_ksettings     = gem_get_link_ksettings,
+       .set_link_ksettings     = gem_set_link_ksettings,
 };
 
 static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)