Commit dc6079d8 authored by David S. Miller's avatar David S. Miller

Merge branch 'phy_ksettings'

Philippe Reynes says:

====================
net: phy: add phy_ethtool_{get|set}_link_ksettings

Ethtool callbacks {get|set}_link_ksettings may be the
same for many drivers. So we add two generics callbacks
phy_ethtool_{get|set}_link_ksettings.

To use those generics callbacks, the ethernet driver must
use the pointer phydev contained in struct net_device, and
not use a private structure to store this pointer.

Changelog:
v3:
- rename function to phy_ethtool_{get|set}_link_ksettings
- move code to net/phy/phy.c
  This feedback were provided by David Decotigny
v2:
- use generic function instead of macro
- ethernet driver use the pointer phydev provided by struct net_device
  Those idea were provided by Ben Hutchings,
  and Florian Fainelli acknowledge them.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 7a27de78 9365fbf5
...@@ -517,7 +517,6 @@ struct fec_enet_private { ...@@ -517,7 +517,6 @@ struct fec_enet_private {
/* Phylib and MDIO interface */ /* Phylib and MDIO interface */
struct mii_bus *mii_bus; struct mii_bus *mii_bus;
struct phy_device *phy_dev;
int mii_timeout; int mii_timeout;
uint phy_speed; uint phy_speed;
phy_interface_t phy_interface; phy_interface_t phy_interface;
......
...@@ -967,10 +967,10 @@ fec_restart(struct net_device *ndev) ...@@ -967,10 +967,10 @@ fec_restart(struct net_device *ndev)
rcntl &= ~(1 << 8); rcntl &= ~(1 << 8);
/* 1G, 100M or 10M */ /* 1G, 100M or 10M */
if (fep->phy_dev) { if (ndev->phydev) {
if (fep->phy_dev->speed == SPEED_1000) if (ndev->phydev->speed == SPEED_1000)
ecntl |= (1 << 5); ecntl |= (1 << 5);
else if (fep->phy_dev->speed == SPEED_100) else if (ndev->phydev->speed == SPEED_100)
rcntl &= ~(1 << 9); rcntl &= ~(1 << 9);
else else
rcntl |= (1 << 9); rcntl |= (1 << 9);
...@@ -991,7 +991,7 @@ fec_restart(struct net_device *ndev) ...@@ -991,7 +991,7 @@ fec_restart(struct net_device *ndev)
*/ */
cfgr = (fep->phy_interface == PHY_INTERFACE_MODE_RMII) cfgr = (fep->phy_interface == PHY_INTERFACE_MODE_RMII)
? BM_MIIGSK_CFGR_RMII : BM_MIIGSK_CFGR_MII; ? BM_MIIGSK_CFGR_RMII : BM_MIIGSK_CFGR_MII;
if (fep->phy_dev && fep->phy_dev->speed == SPEED_10) if (ndev->phydev && ndev->phydev->speed == SPEED_10)
cfgr |= BM_MIIGSK_CFGR_FRCONT_10M; cfgr |= BM_MIIGSK_CFGR_FRCONT_10M;
writel(cfgr, fep->hwp + FEC_MIIGSK_CFGR); writel(cfgr, fep->hwp + FEC_MIIGSK_CFGR);
...@@ -1005,7 +1005,7 @@ fec_restart(struct net_device *ndev) ...@@ -1005,7 +1005,7 @@ fec_restart(struct net_device *ndev)
/* enable pause frame*/ /* enable pause frame*/
if ((fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) || if ((fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) ||
((fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) && ((fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) &&
fep->phy_dev && fep->phy_dev->pause)) { ndev->phydev && ndev->phydev->pause)) {
rcntl |= FEC_ENET_FCE; rcntl |= FEC_ENET_FCE;
/* set FIFO threshold parameter to reduce overrun */ /* set FIFO threshold parameter to reduce overrun */
...@@ -1685,7 +1685,7 @@ static void fec_get_mac(struct net_device *ndev) ...@@ -1685,7 +1685,7 @@ static void fec_get_mac(struct net_device *ndev)
static void fec_enet_adjust_link(struct net_device *ndev) static void fec_enet_adjust_link(struct net_device *ndev)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
struct phy_device *phy_dev = fep->phy_dev; struct phy_device *phy_dev = ndev->phydev;
int status_change = 0; int status_change = 0;
/* Prevent a state halted on mii error */ /* Prevent a state halted on mii error */
...@@ -1885,8 +1885,6 @@ static int fec_enet_mii_probe(struct net_device *ndev) ...@@ -1885,8 +1885,6 @@ static int fec_enet_mii_probe(struct net_device *ndev)
int phy_id; int phy_id;
int dev_id = fep->dev_id; int dev_id = fep->dev_id;
fep->phy_dev = NULL;
if (fep->phy_node) { if (fep->phy_node) {
phy_dev = of_phy_connect(ndev, fep->phy_node, phy_dev = of_phy_connect(ndev, fep->phy_node,
&fec_enet_adjust_link, 0, &fec_enet_adjust_link, 0,
...@@ -1934,7 +1932,6 @@ static int fec_enet_mii_probe(struct net_device *ndev) ...@@ -1934,7 +1932,6 @@ static int fec_enet_mii_probe(struct net_device *ndev)
phy_dev->advertising = phy_dev->supported; phy_dev->advertising = phy_dev->supported;
fep->phy_dev = phy_dev;
fep->link = 0; fep->link = 0;
fep->full_duplex = 0; fep->full_duplex = 0;
...@@ -2064,30 +2061,6 @@ static void fec_enet_mii_remove(struct fec_enet_private *fep) ...@@ -2064,30 +2061,6 @@ static void fec_enet_mii_remove(struct fec_enet_private *fep)
} }
} }
static int fec_enet_get_link_ksettings(struct net_device *ndev,
struct ethtool_link_ksettings *cmd)
{
struct fec_enet_private *fep = netdev_priv(ndev);
struct phy_device *phydev = fep->phy_dev;
if (!phydev)
return -ENODEV;
return phy_ethtool_ksettings_get(phydev, cmd);
}
static int fec_enet_set_link_ksettings(struct net_device *ndev,
const struct ethtool_link_ksettings *cmd)
{
struct fec_enet_private *fep = netdev_priv(ndev);
struct phy_device *phydev = fep->phy_dev;
if (!phydev)
return -ENODEV;
return phy_ethtool_ksettings_set(phydev, cmd);
}
static void fec_enet_get_drvinfo(struct net_device *ndev, static void fec_enet_get_drvinfo(struct net_device *ndev,
struct ethtool_drvinfo *info) struct ethtool_drvinfo *info)
{ {
...@@ -2220,7 +2193,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev, ...@@ -2220,7 +2193,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
if (!fep->phy_dev) if (!ndev->phydev)
return -ENODEV; return -ENODEV;
if (pause->tx_pause != pause->rx_pause) { if (pause->tx_pause != pause->rx_pause) {
...@@ -2236,17 +2209,17 @@ static int fec_enet_set_pauseparam(struct net_device *ndev, ...@@ -2236,17 +2209,17 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0; fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0;
if (pause->rx_pause || pause->autoneg) { if (pause->rx_pause || pause->autoneg) {
fep->phy_dev->supported |= ADVERTISED_Pause; ndev->phydev->supported |= ADVERTISED_Pause;
fep->phy_dev->advertising |= ADVERTISED_Pause; ndev->phydev->advertising |= ADVERTISED_Pause;
} else { } else {
fep->phy_dev->supported &= ~ADVERTISED_Pause; ndev->phydev->supported &= ~ADVERTISED_Pause;
fep->phy_dev->advertising &= ~ADVERTISED_Pause; ndev->phydev->advertising &= ~ADVERTISED_Pause;
} }
if (pause->autoneg) { if (pause->autoneg) {
if (netif_running(ndev)) if (netif_running(ndev))
fec_stop(ndev); fec_stop(ndev);
phy_start_aneg(fep->phy_dev); phy_start_aneg(ndev->phydev);
} }
if (netif_running(ndev)) { if (netif_running(ndev)) {
napi_disable(&fep->napi); napi_disable(&fep->napi);
...@@ -2362,8 +2335,7 @@ static int fec_enet_get_sset_count(struct net_device *dev, int sset) ...@@ -2362,8 +2335,7 @@ static int fec_enet_get_sset_count(struct net_device *dev, int sset)
static int fec_enet_nway_reset(struct net_device *dev) static int fec_enet_nway_reset(struct net_device *dev)
{ {
struct fec_enet_private *fep = netdev_priv(dev); struct phy_device *phydev = dev->phydev;
struct phy_device *phydev = fep->phy_dev;
if (!phydev) if (!phydev)
return -ENODEV; return -ENODEV;
...@@ -2587,14 +2559,14 @@ static const struct ethtool_ops fec_enet_ethtool_ops = { ...@@ -2587,14 +2559,14 @@ static const struct ethtool_ops fec_enet_ethtool_ops = {
.set_tunable = fec_enet_set_tunable, .set_tunable = fec_enet_set_tunable,
.get_wol = fec_enet_get_wol, .get_wol = fec_enet_get_wol,
.set_wol = fec_enet_set_wol, .set_wol = fec_enet_set_wol,
.get_link_ksettings = fec_enet_get_link_ksettings, .get_link_ksettings = phy_ethtool_get_link_ksettings,
.set_link_ksettings = fec_enet_set_link_ksettings, .set_link_ksettings = phy_ethtool_set_link_ksettings,
}; };
static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
struct phy_device *phydev = fep->phy_dev; struct phy_device *phydev = ndev->phydev;
if (!netif_running(ndev)) if (!netif_running(ndev))
return -EINVAL; return -EINVAL;
...@@ -2849,7 +2821,7 @@ fec_enet_open(struct net_device *ndev) ...@@ -2849,7 +2821,7 @@ fec_enet_open(struct net_device *ndev)
goto err_enet_mii_probe; goto err_enet_mii_probe;
napi_enable(&fep->napi); napi_enable(&fep->napi);
phy_start(fep->phy_dev); phy_start(ndev->phydev);
netif_tx_start_all_queues(ndev); netif_tx_start_all_queues(ndev);
device_set_wakeup_enable(&ndev->dev, fep->wol_flag & device_set_wakeup_enable(&ndev->dev, fep->wol_flag &
...@@ -2873,7 +2845,7 @@ fec_enet_close(struct net_device *ndev) ...@@ -2873,7 +2845,7 @@ fec_enet_close(struct net_device *ndev)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
phy_stop(fep->phy_dev); phy_stop(ndev->phydev);
if (netif_device_present(ndev)) { if (netif_device_present(ndev)) {
napi_disable(&fep->napi); napi_disable(&fep->napi);
...@@ -2881,8 +2853,7 @@ fec_enet_close(struct net_device *ndev) ...@@ -2881,8 +2853,7 @@ fec_enet_close(struct net_device *ndev)
fec_stop(ndev); fec_stop(ndev);
} }
phy_disconnect(fep->phy_dev); phy_disconnect(ndev->phydev);
fep->phy_dev = NULL;
fec_enet_clk_enable(ndev, false); fec_enet_clk_enable(ndev, false);
pinctrl_pm_select_sleep_state(&fep->pdev->dev); pinctrl_pm_select_sleep_state(&fep->pdev->dev);
...@@ -3510,7 +3481,7 @@ static int __maybe_unused fec_suspend(struct device *dev) ...@@ -3510,7 +3481,7 @@ static int __maybe_unused fec_suspend(struct device *dev)
if (netif_running(ndev)) { if (netif_running(ndev)) {
if (fep->wol_flag & FEC_WOL_FLAG_ENABLE) if (fep->wol_flag & FEC_WOL_FLAG_ENABLE)
fep->wol_flag |= FEC_WOL_FLAG_SLEEP_ON; fep->wol_flag |= FEC_WOL_FLAG_SLEEP_ON;
phy_stop(fep->phy_dev); phy_stop(ndev->phydev);
napi_disable(&fep->napi); napi_disable(&fep->napi);
netif_tx_lock_bh(ndev); netif_tx_lock_bh(ndev);
netif_device_detach(ndev); netif_device_detach(ndev);
...@@ -3570,7 +3541,7 @@ static int __maybe_unused fec_resume(struct device *dev) ...@@ -3570,7 +3541,7 @@ static int __maybe_unused fec_resume(struct device *dev)
netif_device_attach(ndev); netif_device_attach(ndev);
netif_tx_unlock_bh(ndev); netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi); napi_enable(&fep->napi);
phy_start(fep->phy_dev); phy_start(ndev->phydev);
} }
rtnl_unlock(); rtnl_unlock();
......
...@@ -1347,3 +1347,27 @@ void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) ...@@ -1347,3 +1347,27 @@ void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
phydev->drv->get_wol(phydev, wol); phydev->drv->get_wol(phydev, wol);
} }
EXPORT_SYMBOL(phy_ethtool_get_wol); EXPORT_SYMBOL(phy_ethtool_get_wol);
int phy_ethtool_get_link_ksettings(struct net_device *ndev,
struct ethtool_link_ksettings *cmd)
{
struct phy_device *phydev = ndev->phydev;
if (!phydev)
return -ENODEV;
return phy_ethtool_ksettings_get(phydev, cmd);
}
EXPORT_SYMBOL(phy_ethtool_get_link_ksettings);
int phy_ethtool_set_link_ksettings(struct net_device *ndev,
const struct ethtool_link_ksettings *cmd)
{
struct phy_device *phydev = ndev->phydev;
if (!phydev)
return -ENODEV;
return phy_ethtool_ksettings_set(phydev, cmd);
}
EXPORT_SYMBOL(phy_ethtool_set_link_ksettings);
...@@ -829,6 +829,10 @@ int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data); ...@@ -829,6 +829,10 @@ int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data);
int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol);
void phy_ethtool_get_wol(struct phy_device *phydev, void phy_ethtool_get_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol); struct ethtool_wolinfo *wol);
int phy_ethtool_get_link_ksettings(struct net_device *ndev,
struct ethtool_link_ksettings *cmd);
int phy_ethtool_set_link_ksettings(struct net_device *ndev,
const struct ethtool_link_ksettings *cmd);
int __init mdio_bus_init(void); int __init mdio_bus_init(void);
void mdio_bus_exit(void); void mdio_bus_exit(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment