Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1397474 > unrolled thread

[PATCH v3 0/3] net: phy: add phy_ethtool_{get|set}_link_ksettings

Started byPhilippe Reynes <tremyfr@gmail.com>
First post2016-05-10 00:30 +0200
Last post2016-05-10 21:10 +0200
Articles 5 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v3 0/3] net: phy: add phy_ethtool_{get|set}_link_ksettings Philippe Reynes <tremyfr@gmail.com> - 2016-05-10 00:30 +0200
    [PATCH v3 1/3] net: phy: add phy_ethtool_{get|set}_link_ksettings Philippe Reynes <tremyfr@gmail.com> - 2016-05-10 00:30 +0200
      Re: [PATCH v3 1/3] net: phy: add phy_ethtool_{get|set}_link_ksettings David Decotigny <decot@googlers.com> - 2016-05-10 01:10 +0200
    [PATCH v3 2/3] net: ethernet: fec: use phydev from struct net_device Philippe Reynes <tremyfr@gmail.com> - 2016-05-10 00:30 +0200
    Re: [PATCH v3 0/3] net: phy: add  phy_ethtool_{get|set}_link_ksettings David Miller <davem@davemloft.net> - 2016-05-10 21:10 +0200

#1397474 — [PATCH v3 0/3] net: phy: add phy_ethtool_{get|set}_link_ksettings

FromPhilippe Reynes <tremyfr@gmail.com>
Date2016-05-10 00:30 +0200
Subject[PATCH v3 0/3] net: phy: add phy_ethtool_{get|set}_link_ksettings
Message-ID<rx1QC-6kP-3@gated-at.bofh.it>
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.

Philippe Reynes (3):
  net: phy: add phy_ethtool_{get|set}_link_ksettings
  net: ethernet: fec: use phydev from struct net_device
  net: ethernet: fec: use phy_ethtool_{get|set}_link_ksettings

 drivers/net/ethernet/freescale/fec.h      |    1 -
 drivers/net/ethernet/freescale/fec_main.c |   71 +++++++++--------------------
 drivers/net/phy/phy.c                     |   24 ++++++++++
 include/linux/phy.h                       |    4 ++
 4 files changed, 49 insertions(+), 51 deletions(-)

-- 
1.7.4.4

[toc] | [next] | [standalone]


#1397477 — [PATCH v3 1/3] net: phy: add phy_ethtool_{get|set}_link_ksettings

FromPhilippe Reynes <tremyfr@gmail.com>
Date2016-05-10 00:30 +0200
Subject[PATCH v3 1/3] net: phy: add phy_ethtool_{get|set}_link_ksettings
Message-ID<rx1QD-6kP-31@gated-at.bofh.it>
In reply to#1397474
Ethtool callbacks {get|set}_link_ksettings are often the same, so
we add two generics functions phy_ethtool_{get|set}_link_ksettings
to avoid writing severals times the same function.

Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
---
 drivers/net/phy/phy.c |   24 ++++++++++++++++++++++++
 include/linux/phy.h   |    4 ++++
 2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 6f221c8..603e8db 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1347,3 +1347,27 @@ void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
 		phydev->drv->get_wol(phydev, 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);
diff --git a/include/linux/phy.h b/include/linux/phy.h
index be3f83b..2d24b28 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -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);
 void phy_ethtool_get_wol(struct phy_device *phydev,
 			 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);
 void mdio_bus_exit(void);
-- 
1.7.4.4

[toc] | [prev] | [next] | [standalone]


#1397499 — Re: [PATCH v3 1/3] net: phy: add phy_ethtool_{get|set}_link_ksettings

FromDavid Decotigny <decot@googlers.com>
Date2016-05-10 01:10 +0200
SubjectRe: [PATCH v3 1/3] net: phy: add phy_ethtool_{get|set}_link_ksettings
Message-ID<rx2tk-76w-13@gated-at.bofh.it>
In reply to#1397477
On Mon, May 9, 2016 at 3:19 PM, Philippe Reynes <tremyfr@gmail.com> wrote:
> Ethtool callbacks {get|set}_link_ksettings are often the same, so
> we add two generics functions phy_ethtool_{get|set}_link_ksettings
> to avoid writing severals times the same function.
>
> Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
> ---
>  drivers/net/phy/phy.c |   24 ++++++++++++++++++++++++
>  include/linux/phy.h   |    4 ++++
>  2 files changed, 28 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 6f221c8..603e8db 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -1347,3 +1347,27 @@ void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
>                 phydev->drv->get_wol(phydev, 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);
> diff --git a/include/linux/phy.h b/include/linux/phy.h
> index be3f83b..2d24b28 100644
> --- a/include/linux/phy.h
> +++ b/include/linux/phy.h
> @@ -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);
>  void phy_ethtool_get_wol(struct phy_device *phydev,
>                          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);
>  void mdio_bus_exit(void);
> --
> 1.7.4.4
>

Acked-By: David Decotigny <decot@googlers.com>

[toc] | [prev] | [next] | [standalone]


#1397478 — [PATCH v3 2/3] net: ethernet: fec: use phydev from struct net_device

FromPhilippe Reynes <tremyfr@gmail.com>
Date2016-05-10 00:30 +0200
Subject[PATCH v3 2/3] net: ethernet: fec: use phydev from struct net_device
Message-ID<rx1QD-6kP-37@gated-at.bofh.it>
In reply to#1397474
The private structure contain a pointer to phydev, but the structure
net_device already contain such pointer. So we can remove the pointer
phydev in the private structure, and update the driver to use the one
contained in struct net_device.

Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
---
 drivers/net/ethernet/freescale/fec.h      |    1 -
 drivers/net/ethernet/freescale/fec_main.c |   49 ++++++++++++----------------
 2 files changed, 21 insertions(+), 29 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 195122e..f58f9ea 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -517,7 +517,6 @@ struct fec_enet_private {
 
 	/* Phylib and MDIO interface */
 	struct	mii_bus *mii_bus;
-	struct	phy_device *phy_dev;
 	int	mii_timeout;
 	uint	phy_speed;
 	phy_interface_t	phy_interface;
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index c9f77c3..9d6e35c 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -967,10 +967,10 @@ fec_restart(struct net_device *ndev)
 			rcntl &= ~(1 << 8);
 
 		/* 1G, 100M or 10M */
-		if (fep->phy_dev) {
-			if (fep->phy_dev->speed == SPEED_1000)
+		if (ndev->phydev) {
+			if (ndev->phydev->speed == SPEED_1000)
 				ecntl |= (1 << 5);
-			else if (fep->phy_dev->speed == SPEED_100)
+			else if (ndev->phydev->speed == SPEED_100)
 				rcntl &= ~(1 << 9);
 			else
 				rcntl |= (1 << 9);
@@ -991,7 +991,7 @@ fec_restart(struct net_device *ndev)
 			 */
 			cfgr = (fep->phy_interface == PHY_INTERFACE_MODE_RMII)
 				? 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;
 			writel(cfgr, fep->hwp + FEC_MIIGSK_CFGR);
 
@@ -1005,7 +1005,7 @@ fec_restart(struct net_device *ndev)
 	/* enable pause frame*/
 	if ((fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) ||
 	    ((fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) &&
-	     fep->phy_dev && fep->phy_dev->pause)) {
+	     ndev->phydev && ndev->phydev->pause)) {
 		rcntl |= FEC_ENET_FCE;
 
 		/* set FIFO threshold parameter to reduce overrun */
@@ -1685,7 +1685,7 @@ static void fec_get_mac(struct net_device *ndev)
 static void fec_enet_adjust_link(struct net_device *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;
 
 	/* Prevent a state halted on mii error */
@@ -1885,8 +1885,6 @@ static int fec_enet_mii_probe(struct net_device *ndev)
 	int phy_id;
 	int dev_id = fep->dev_id;
 
-	fep->phy_dev = NULL;
-
 	if (fep->phy_node) {
 		phy_dev = of_phy_connect(ndev, fep->phy_node,
 					 &fec_enet_adjust_link, 0,
@@ -1934,7 +1932,6 @@ static int fec_enet_mii_probe(struct net_device *ndev)
 
 	phy_dev->advertising = phy_dev->supported;
 
-	fep->phy_dev = phy_dev;
 	fep->link = 0;
 	fep->full_duplex = 0;
 
@@ -2067,8 +2064,7 @@ 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;
+	struct phy_device *phydev = ndev->phydev;
 
 	if (!phydev)
 		return -ENODEV;
@@ -2079,8 +2075,7 @@ static int fec_enet_get_link_ksettings(struct net_device *ndev,
 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;
+	struct phy_device *phydev = ndev->phydev;
 
 	if (!phydev)
 		return -ENODEV;
@@ -2220,7 +2215,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
 {
 	struct fec_enet_private *fep = netdev_priv(ndev);
 
-	if (!fep->phy_dev)
+	if (!ndev->phydev)
 		return -ENODEV;
 
 	if (pause->tx_pause != pause->rx_pause) {
@@ -2236,17 +2231,17 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
 	fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0;
 
 	if (pause->rx_pause || pause->autoneg) {
-		fep->phy_dev->supported |= ADVERTISED_Pause;
-		fep->phy_dev->advertising |= ADVERTISED_Pause;
+		ndev->phydev->supported |= ADVERTISED_Pause;
+		ndev->phydev->advertising |= ADVERTISED_Pause;
 	} else {
-		fep->phy_dev->supported &= ~ADVERTISED_Pause;
-		fep->phy_dev->advertising &= ~ADVERTISED_Pause;
+		ndev->phydev->supported &= ~ADVERTISED_Pause;
+		ndev->phydev->advertising &= ~ADVERTISED_Pause;
 	}
 
 	if (pause->autoneg) {
 		if (netif_running(ndev))
 			fec_stop(ndev);
-		phy_start_aneg(fep->phy_dev);
+		phy_start_aneg(ndev->phydev);
 	}
 	if (netif_running(ndev)) {
 		napi_disable(&fep->napi);
@@ -2362,8 +2357,7 @@ static int fec_enet_get_sset_count(struct net_device *dev, int sset)
 
 static int fec_enet_nway_reset(struct net_device *dev)
 {
-	struct fec_enet_private *fep = netdev_priv(dev);
-	struct phy_device *phydev = fep->phy_dev;
+	struct phy_device *phydev = dev->phydev;
 
 	if (!phydev)
 		return -ENODEV;
@@ -2594,7 +2588,7 @@ static const struct ethtool_ops fec_enet_ethtool_ops = {
 static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
 {
 	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))
 		return -EINVAL;
@@ -2849,7 +2843,7 @@ fec_enet_open(struct net_device *ndev)
 		goto err_enet_mii_probe;
 
 	napi_enable(&fep->napi);
-	phy_start(fep->phy_dev);
+	phy_start(ndev->phydev);
 	netif_tx_start_all_queues(ndev);
 
 	device_set_wakeup_enable(&ndev->dev, fep->wol_flag &
@@ -2873,7 +2867,7 @@ fec_enet_close(struct net_device *ndev)
 {
 	struct fec_enet_private *fep = netdev_priv(ndev);
 
-	phy_stop(fep->phy_dev);
+	phy_stop(ndev->phydev);
 
 	if (netif_device_present(ndev)) {
 		napi_disable(&fep->napi);
@@ -2881,8 +2875,7 @@ fec_enet_close(struct net_device *ndev)
 		fec_stop(ndev);
 	}
 
-	phy_disconnect(fep->phy_dev);
-	fep->phy_dev = NULL;
+	phy_disconnect(ndev->phydev);
 
 	fec_enet_clk_enable(ndev, false);
 	pinctrl_pm_select_sleep_state(&fep->pdev->dev);
@@ -3510,7 +3503,7 @@ static int __maybe_unused fec_suspend(struct device *dev)
 	if (netif_running(ndev)) {
 		if (fep->wol_flag & FEC_WOL_FLAG_ENABLE)
 			fep->wol_flag |= FEC_WOL_FLAG_SLEEP_ON;
-		phy_stop(fep->phy_dev);
+		phy_stop(ndev->phydev);
 		napi_disable(&fep->napi);
 		netif_tx_lock_bh(ndev);
 		netif_device_detach(ndev);
@@ -3570,7 +3563,7 @@ static int __maybe_unused fec_resume(struct device *dev)
 		netif_device_attach(ndev);
 		netif_tx_unlock_bh(ndev);
 		napi_enable(&fep->napi);
-		phy_start(fep->phy_dev);
+		phy_start(ndev->phydev);
 	}
 	rtnl_unlock();
 
-- 
1.7.4.4

[toc] | [prev] | [next] | [standalone]


#1398424 — Re: [PATCH v3 0/3] net: phy: add phy_ethtool_{get|set}_link_ksettings

FromDavid Miller <davem@davemloft.net>
Date2016-05-10 21:10 +0200
SubjectRe: [PATCH v3 0/3] net: phy: add phy_ethtool_{get|set}_link_ksettings
Message-ID<rxlcC-uF-11@gated-at.bofh.it>
In reply to#1397474
From: Philippe Reynes <tremyfr@gmail.com>
Date: Tue, 10 May 2016 00:19:40 +0200

> 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.

Series applied, thanks.

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web