static int bcm_enet_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct bcm_enet_priv *priv; priv = netdev_priv(dev); if (priv->has_phy) { if (!priv->phydev) return -ENODEV; return phy_ethtool_sset(priv->phydev, cmd); } else { if (cmd->autoneg || (cmd->speed != SPEED_100 && cmd->speed != SPEED_10) || cmd->port != PORT_MII) return -EINVAL; priv->force_speed_100 = (cmd->speed == SPEED_100) ? 1 : 0; priv->force_duplex_full = (cmd->duplex == DUPLEX_FULL) ? 1 : 0; if (netif_running(dev)) bcm_enet_adjust_link(dev); return 0; } }
static int bgmac_set_settings(struct net_device *net_dev, struct ethtool_cmd *cmd) { struct bgmac *bgmac = netdev_priv(net_dev); return phy_ethtool_sset(bgmac->phy_dev, cmd); }
static int fe_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct fe_priv *priv = netdev_priv(dev); if (!priv->phy_dev) goto out_sset; if (cmd->phy_address != priv->phy_dev->addr) { if (priv->phy->phy_node[cmd->phy_address]) { priv->phy_dev = priv->phy->phy[cmd->phy_address]; priv->phy_flags = FE_PHY_FLAG_PORT; } else if (priv->mii_bus && priv->mii_bus->phy_map[cmd->phy_address]) { priv->phy_dev = priv->mii_bus->phy_map[cmd->phy_address]; priv->phy_flags = FE_PHY_FLAG_ATTACH; } else goto out_sset; } return phy_ethtool_sset(priv->phy_dev, cmd); out_sset: return -ENODEV; }
static int stmmac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct stmmac_priv *priv = netdev_priv(dev); struct phy_device *phy = priv->phydev; int rc; if ((priv->pcs & STMMAC_PCS_RGMII) || (priv->pcs & STMMAC_PCS_SGMII)) { u32 mask = ADVERTISED_Autoneg | ADVERTISED_Pause; /* Only support ANE */ if (cmd->autoneg != AUTONEG_ENABLE) return -EINVAL; mask &= (ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full | ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full); spin_lock(&priv->lock); if (priv->hw->mac->ctrl_ane) priv->hw->mac->ctrl_ane(priv->hw, 1); spin_unlock(&priv->lock); return 0; } spin_lock(&priv->lock); rc = phy_ethtool_sset(phy, cmd); spin_unlock(&priv->lock); return rc; }
static int sh_eth_set_settings(struct net_device *ndev, struct ethtool_cmd *ecmd) { struct sh_eth_private *mdp = netdev_priv(ndev); unsigned long flags; int ret; spin_lock_irqsave(&mdp->lock, flags); /* disable tx and rx */ sh_eth_rcv_snd_disable(ndev); ret = phy_ethtool_sset(mdp->phydev, ecmd); if (ret) goto error_exit; if (ecmd->duplex == DUPLEX_FULL) mdp->duplex = 1; else mdp->duplex = 0; if (mdp->cd->set_duplex) mdp->cd->set_duplex(ndev); error_exit: mdelay(1); /* enable tx and rx */ sh_eth_rcv_snd_enable(ndev); spin_unlock_irqrestore(&mdp->lock, flags); return ret; }
static int sxgbe_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct sxgbe_priv_data *priv = netdev_priv(dev); if (priv->phydev) return phy_ethtool_sset(priv->phydev, cmd); return -EOPNOTSUPP; }
static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct fs_enet_private *fep = netdev_priv(dev); if (!fep->phydev) return -ENODEV; return phy_ethtool_sset(fep->phydev, cmd); }
static int dsa_slave_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct dsa_slave_priv *p = netdev_priv(dev); if (p->phy != NULL) return phy_ethtool_sset(p->phy, cmd); return -EOPNOTSUPP; }
static int tse_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct alt_tse_private *priv = netdev_priv(dev); struct phy_device *phydev = priv->phydev; if (phydev == NULL) return -ENODEV; return phy_ethtool_sset(phydev, cmd); }
static int gfar_ssettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct gfar_private *priv = netdev_priv(dev); struct phy_device *phydev = priv->phydev; if (NULL == phydev) return -ENODEV; return phy_ethtool_sset(phydev, cmd); }
static int emac_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct emac_board_info *dm = netdev_priv(dev); struct phy_device *phydev = dm->phy_dev; if (!phydev) return -ENODEV; return phy_ethtool_sset(phydev, cmd); }
/** * arc_emac_set_settings - Set PHY settings as passed in the argument. * @ndev: Pointer to net_device structure. * @cmd: Pointer to ethtool_cmd structure. * * This implements ethtool command for setting various PHY settings. If PHY * could not be found, the function returns -ENODEV. This function calls the * relevant PHY ethtool API to set the PHY. * Issue e.g. "ethtool -s ethX speed 1000" under linux prompt to execute this * function. */ static int arc_emac_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd) { struct arc_emac_priv *priv = netdev_priv(ndev); if (!capable(CAP_NET_ADMIN)) return -EPERM; return phy_ethtool_sset(priv->phy_dev, cmd); }
static int uec_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) { struct ucc_geth_private *ugeth = netdev_priv(netdev); struct phy_device *phydev = ugeth->phydev; if (!phydev) return -ENODEV; return phy_ethtool_sset(phydev, ecmd); }
static int ag71xx_ethtool_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct ag71xx *ag = netdev_priv(dev); struct phy_device *phydev = ag->phy_dev; if (!phydev) return -ENODEV; return phy_ethtool_sset(phydev, cmd); }
int stmmac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct stmmac_priv *priv = netdev_priv(dev); struct phy_device *phy = priv->phydev; int rc; spin_lock(&priv->lock); rc = phy_ethtool_sset(phy, cmd); spin_unlock(&priv->lock); return rc; }
static int cvm_oct_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct octeon_ethernet *priv = netdev_priv(dev); if (!capable(CAP_NET_ADMIN)) return -EPERM; if (priv->phydev) return phy_ethtool_sset(priv->phydev, cmd); return -EINVAL; }
static int au1000_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct au1000_private *aup = netdev_priv(dev); if (!capable(CAP_NET_ADMIN)) return -EPERM; if (aup->phy_dev) return phy_ethtool_sset(aup->phy_dev, cmd); return -EINVAL; }
static int bfin_mac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct bfin_mac_local *lp = netdev_priv(dev); if (!capable(CAP_NET_ADMIN)) return -EPERM; if (lp->phydev) return phy_ethtool_sset(lp->phydev, cmd); return -EINVAL; }
static int octeon_mgmt_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd) { struct octeon_mgmt *p = netdev_priv(netdev); if (!capable(CAP_NET_ADMIN)) return -EPERM; if (p->phydev) return phy_ethtool_sset(p->phydev, cmd); return -EOPNOTSUPP; }
static int hieth_ethtools_set_settings(struct net_device *net_dev, \ struct ethtool_cmd *cmd) { struct hieth_netdev_local *ld = netdev_priv(net_dev); if (!capable(CAP_NET_ADMIN)) return -EPERM; if (ld->phy) return phy_ethtool_sset(ld->phy, cmd); return -EINVAL; }
static int stmmac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct stmmac_priv *priv = netdev_priv(dev); struct phy_device *phy = priv->phydev; int rc; spin_lock(&priv->lock); #ifndef CONFIG_EMU_MODE rc = phy_ethtool_sset(phy, cmd); #endif spin_unlock(&priv->lock); return rc; }
static int stmmac_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) { struct stmmac_priv *priv = netdev_priv(netdev); struct phy_device *phy = priv->phydev; int new_pause = FLOW_OFF; int ret = 0; spin_lock(&priv->lock); if (pause->rx_pause) new_pause |= FLOW_RX; if (pause->tx_pause) new_pause |= FLOW_TX; priv->flow_ctrl = new_pause; if (phy->autoneg) { if (netif_running(netdev)) { struct ethtool_cmd cmd; /* auto-negotiation automatically restarted */ cmd.cmd = ETHTOOL_NWAY_RST; cmd.supported = phy->supported; cmd.advertising = phy->advertising; cmd.autoneg = phy->autoneg; cmd.speed = phy->speed; cmd.duplex = phy->duplex; cmd.phy_address = phy->addr; ret = phy_ethtool_sset(phy, &cmd); } } else { unsigned long ioaddr = netdev->base_addr; priv->hw->mac->flow_ctrl(ioaddr, phy->duplex, priv->flow_ctrl, priv->pause); } spin_unlock(&priv->lock); return ret; }
static int ixp4xx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct port *port = netdev_priv(dev); return phy_ethtool_sset(port->phydev, cmd); }