static int bcm_enet_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct bcm_enet_priv *priv; priv = netdev_priv(dev); cmd->maxrxpkt = 0; cmd->maxtxpkt = 0; if (priv->has_phy) { if (!priv->phydev) return -ENODEV; return phy_ethtool_gset(priv->phydev, cmd); } else { cmd->autoneg = 0; cmd->speed = (priv->force_speed_100) ? SPEED_100 : SPEED_10; cmd->duplex = (priv->force_duplex_full) ? DUPLEX_FULL : DUPLEX_HALF; cmd->supported = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; cmd->advertising = 0; cmd->port = PORT_MII; cmd->transceiver = XCVR_EXTERNAL; } return 0; }
/** * arc_emac_get_settings - Get PHY settings. * @ndev: Pointer to net_device structure. * @cmd: Pointer to ethtool_cmd structure. * * This implements ethtool command for getting PHY settings. If PHY could * not be found, the function returns -ENODEV. This function calls the * relevant PHY ethtool API to get the PHY settings. * Issue "ethtool ethX" under linux prompt to execute this function. */ static int arc_emac_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd) { struct arc_emac_priv *priv = netdev_priv(ndev); return phy_ethtool_gset(priv->phy_dev, cmd); }
static int bgmac_get_settings(struct net_device *net_dev, struct ethtool_cmd *cmd) { struct bgmac *bgmac = netdev_priv(net_dev); return phy_ethtool_gset(bgmac->phy_dev, cmd); }
static int cvm_oct_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct octeon_ethernet *priv = netdev_priv(dev); if (priv->phydev) return phy_ethtool_gset(priv->phydev, cmd); return -EINVAL; }
static int au1000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct au1000_private *aup = netdev_priv(dev); if (aup->phy_dev) return phy_ethtool_gset(aup->phy_dev, cmd); return -EINVAL; }
static int fs_get_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_gset(fep->phydev, cmd); }
static int sxgbe_getsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct sxgbe_priv_data *priv = netdev_priv(dev); if (priv->phydev) return phy_ethtool_gset(priv->phydev, cmd); return -EOPNOTSUPP; }
static int tse_get_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_gset(phydev, cmd); }
static int hieth_ethtools_get_settings(struct net_device *net_dev, \ struct ethtool_cmd *cmd) { struct hieth_netdev_local *ld = netdev_priv(net_dev); if (ld->phy) return phy_ethtool_gset(ld->phy, cmd); return -EINVAL; }
static int octeon_mgmt_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) { struct octeon_mgmt *p = netdev_priv(netdev); if (p->phydev) return phy_ethtool_gset(p->phydev, cmd); return -EOPNOTSUPP; }
static int bfin_mac_ethtool_getsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct bfin_mac_local *lp = netdev_priv(dev); if (lp->phydev) return phy_ethtool_gset(lp->phydev, cmd); return -EINVAL; }
static int emac_get_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_gset(phydev, cmd); }
static int ag71xx_ethtool_get_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_gset(phydev, cmd); }
/* Return the current settings in the ethtool_cmd structure */ static int gfar_gsettings(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; cmd->maxtxpkt = get_icft_value(priv->txic); cmd->maxrxpkt = get_icft_value(priv->rxic); return phy_ethtool_gset(phydev, cmd); }
static int sh_eth_get_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); ret = phy_ethtool_gset(mdp->phydev, ecmd); spin_unlock_irqrestore(&mdp->lock, flags); return ret; }
static int uec_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) { struct ucc_geth_private *ugeth = netdev_priv(netdev); struct phy_device *phydev = ugeth->phydev; struct ucc_geth_info *ug_info = ugeth->ug_info; if (!phydev) return -ENODEV; ecmd->maxtxpkt = 1; ecmd->maxrxpkt = ug_info->interruptcoalescingmaxvalue[0]; return phy_ethtool_gset(phydev, ecmd); }
/* ethtool operations *******************************************************/ static int dsa_slave_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct dsa_slave_priv *p = netdev_priv(dev); int err; err = -EOPNOTSUPP; if (p->phy != NULL) { err = phy_read_status(p->phy); if (err == 0) err = phy_ethtool_gset(p->phy, cmd); } return err; }
static int xgbe_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) { struct xgbe_prv_data *pdata = netdev_priv(netdev); int ret; DBGPR("-->xgbe_get_settings\n"); if (!pdata->phydev) return -ENODEV; ret = phy_ethtool_gset(pdata->phydev, cmd); cmd->transceiver = XCVR_EXTERNAL; DBGPR("<--xgbe_get_settings\n"); return ret; }
/* Return the current settings in the ethtool_cmd structure */ static int gfar_gsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct gfar_private *priv = netdev_priv(dev); struct phy_device *phydev = priv->phydev; struct gfar_priv_rx_q *rx_queue = NULL; struct gfar_priv_tx_q *tx_queue = NULL; if (NULL == phydev) return -ENODEV; tx_queue = priv->tx_queue[0]; rx_queue = priv->rx_queue[0]; /* etsec-1.7 and older versions have only one txic * and rxic regs although they support multiple queues */ cmd->maxtxpkt = get_icft_value(tx_queue->txic); cmd->maxrxpkt = get_icft_value(rx_queue->rxic); return phy_ethtool_gset(phydev, cmd); }
static int fe_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct fe_priv *priv = netdev_priv(dev); int err; if (!priv->phy_dev) goto out_gset; if (priv->phy_flags == FE_PHY_FLAG_ATTACH) { err = phy_read_status(priv->phy_dev); if (err) goto out_gset; } return phy_ethtool_gset(priv->phy_dev, cmd); out_gset: return -ENODEV; }
int stmmac_ethtool_getsettings(struct net_device *dev, struct ethtool_cmd *cmd) { struct stmmac_priv *priv = netdev_priv(dev); struct phy_device *phy = priv->phydev; int rc; if (phy == NULL) { pr_err("%s: %s: PHY is not registered\n", __func__, dev->name); return -ENODEV; } if (!netif_running(dev)) { pr_err("%s: interface is disabled: we cannot track " "link speed / duplex setting\n", dev->name); return -EBUSY; } cmd->transceiver = XCVR_INTERNAL; spin_lock_irq(&priv->lock); rc = phy_ethtool_gset(phy, cmd); spin_unlock_irq(&priv->lock); return rc; }
static int stmmac_ethtool_getsettings(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)) { struct rgmii_adv adv; if (!priv->xstats.pcs_link) { ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN); cmd->duplex = DUPLEX_UNKNOWN; return 0; } cmd->duplex = priv->xstats.pcs_duplex; ethtool_cmd_speed_set(cmd, priv->xstats.pcs_speed); /* Get and convert ADV/LP_ADV from the HW AN registers */ if (!priv->hw->mac->get_adv) return -EOPNOTSUPP; /* should never happen indeed */ priv->hw->mac->get_adv(priv->hw, &adv); /* Encoding of PSE bits is defined in 802.3z, 37.2.1.4 */ if (adv.pause & STMMAC_PCS_PAUSE) cmd->advertising |= ADVERTISED_Pause; if (adv.pause & STMMAC_PCS_ASYM_PAUSE) cmd->advertising |= ADVERTISED_Asym_Pause; if (adv.lp_pause & STMMAC_PCS_PAUSE) cmd->lp_advertising |= ADVERTISED_Pause; if (adv.lp_pause & STMMAC_PCS_ASYM_PAUSE) cmd->lp_advertising |= ADVERTISED_Asym_Pause; /* Reg49[3] always set because ANE is always supported */ cmd->autoneg = ADVERTISED_Autoneg; cmd->supported |= SUPPORTED_Autoneg; cmd->advertising |= ADVERTISED_Autoneg; cmd->lp_advertising |= ADVERTISED_Autoneg; if (adv.duplex) { cmd->supported |= (SUPPORTED_1000baseT_Full | SUPPORTED_100baseT_Full | SUPPORTED_10baseT_Full); cmd->advertising |= (ADVERTISED_1000baseT_Full | ADVERTISED_100baseT_Full | ADVERTISED_10baseT_Full); } else { cmd->supported |= (SUPPORTED_1000baseT_Half | SUPPORTED_100baseT_Half | SUPPORTED_10baseT_Half); cmd->advertising |= (ADVERTISED_1000baseT_Half | ADVERTISED_100baseT_Half | ADVERTISED_10baseT_Half); } if (adv.lp_duplex) cmd->lp_advertising |= (ADVERTISED_1000baseT_Full | ADVERTISED_100baseT_Full | ADVERTISED_10baseT_Full); else cmd->lp_advertising |= (ADVERTISED_1000baseT_Half | ADVERTISED_100baseT_Half | ADVERTISED_10baseT_Half); cmd->port = PORT_OTHER; return 0; } if (phy == NULL) { pr_err("%s: %s: PHY is not registered\n", __func__, dev->name); return -ENODEV; } if (!netif_running(dev)) { pr_err("%s: interface is disabled: we cannot track " "link speed / duplex setting\n", dev->name); return -EBUSY; } cmd->transceiver = XCVR_INTERNAL; rc = phy_ethtool_gset(phy, cmd); return rc; }
static int ixp4xx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct port *port = netdev_priv(dev); return phy_ethtool_gset(port->phydev, cmd); }