aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sun/sungem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/sun/sungem.c')
-rw-r--r--drivers/net/ethernet/sun/sungem.c98
1 files changed, 41 insertions, 57 deletions
diff --git a/drivers/net/ethernet/sun/sungem.c b/drivers/net/ethernet/sun/sungem.c
index dbfca0466760..5c5952e782cd 100644
--- a/drivers/net/ethernet/sun/sungem.c
+++ b/drivers/net/ethernet/sun/sungem.c
@@ -1250,17 +1250,12 @@ 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,
- const struct ethtool_link_ksettings *ep)
+static void gem_begin_auto_negotiation(struct gem *gp, struct ethtool_cmd *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)
@@ -1283,13 +1278,13 @@ static void gem_begin_auto_negotiation(struct gem *gp,
/* Setup link parameters */
if (!ep)
goto start_aneg;
- if (ep->base.autoneg == AUTONEG_ENABLE) {
- advertise = advertising;
+ if (ep->autoneg == AUTONEG_ENABLE) {
+ advertise = ep->advertising;
autoneg = 1;
} else {
autoneg = 0;
- speed = ep->base.speed;
- duplex = ep->base.duplex;
+ speed = ethtool_cmd_speed(ep);
+ duplex = ep->duplex;
}
start_aneg:
@@ -2520,96 +2515,85 @@ 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_link_ksettings(struct net_device *dev,
- struct ethtool_link_ksettings *cmd)
+static int gem_get_settings(struct net_device *dev, struct ethtool_cmd *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)
- supported = gp->phy_mii.def->features;
+ cmd->supported = gp->phy_mii.def->features;
else
- supported = (SUPPORTED_10baseT_Half |
+ cmd->supported = (SUPPORTED_10baseT_Half |
SUPPORTED_10baseT_Full);
/* XXX hardcoded stuff for now */
- cmd->base.port = PORT_MII;
- cmd->base.phy_address = 0; /* XXX fixed PHYAD */
+ cmd->port = PORT_MII;
+ cmd->transceiver = XCVR_EXTERNAL;
+ cmd->phy_address = 0; /* XXX fixed PHYAD */
/* Return current PHY settings */
- 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;
+ 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;
/* 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 (advertising == 0)
- advertising = supported;
+ if (cmd->advertising == 0)
+ cmd->advertising = cmd->supported;
} else { // XXX PCS ?
- supported =
+ cmd->supported =
(SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
SUPPORTED_Autoneg);
- advertising = supported;
- cmd->base.speed = 0;
- cmd->base.duplex = 0;
- cmd->base.port = 0;
- cmd->base.phy_address = 0;
- cmd->base.autoneg = 0;
+ cmd->advertising = cmd->supported;
+ ethtool_cmd_speed_set(cmd, 0);
+ cmd->duplex = cmd->port = cmd->phy_address =
+ cmd->transceiver = cmd->autoneg = 0;
/* serdes means usually a Fibre connector, with most fixed */
if (gp->phy_type == phy_serdes) {
- cmd->base.port = PORT_FIBRE;
- supported = (SUPPORTED_1000baseT_Half |
+ cmd->port = PORT_FIBRE;
+ cmd->supported = (SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full |
SUPPORTED_FIBRE | SUPPORTED_Autoneg |
SUPPORTED_Pause | SUPPORTED_Asym_Pause);
- advertising = supported;
+ cmd->advertising = cmd->supported;
+ cmd->transceiver = XCVR_INTERNAL;
if (gp->lstate == link_up)
- cmd->base.speed = SPEED_1000;
- cmd->base.duplex = DUPLEX_FULL;
- cmd->base.autoneg = 1;
+ ethtool_cmd_speed_set(cmd, SPEED_1000);
+ cmd->duplex = DUPLEX_FULL;
+ cmd->autoneg = 1;
}
}
-
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
- supported);
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
- advertising);
+ cmd->maxtxpkt = cmd->maxrxpkt = 0;
return 0;
}
-static int gem_set_link_ksettings(struct net_device *dev,
- const struct ethtool_link_ksettings *cmd)
+static int gem_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{
struct gem *gp = netdev_priv(dev);
- u32 speed = cmd->base.speed;
- u32 advertising;
-
- ethtool_convert_link_mode_to_legacy_u32(&advertising,
- cmd->link_modes.advertising);
+ u32 speed = ethtool_cmd_speed(cmd);
/* Verify the settings we care about. */
- if (cmd->base.autoneg != AUTONEG_ENABLE &&
- cmd->base.autoneg != AUTONEG_DISABLE)
+ if (cmd->autoneg != AUTONEG_ENABLE &&
+ cmd->autoneg != AUTONEG_DISABLE)
return -EINVAL;
- if (cmd->base.autoneg == AUTONEG_ENABLE &&
- advertising == 0)
+ if (cmd->autoneg == AUTONEG_ENABLE &&
+ cmd->advertising == 0)
return -EINVAL;
- if (cmd->base.autoneg == AUTONEG_DISABLE &&
+ if (cmd->autoneg == AUTONEG_DISABLE &&
((speed != SPEED_1000 &&
speed != SPEED_100 &&
speed != SPEED_10) ||
- (cmd->base.duplex != DUPLEX_HALF &&
- cmd->base.duplex != DUPLEX_FULL)))
+ (cmd->duplex != DUPLEX_HALF &&
+ cmd->duplex != DUPLEX_FULL)))
return -EINVAL;
/* Apply settings and restart link process. */
@@ -2682,13 +2666,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)