All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
@ 2018-12-12 12:33 Joakim Tjernlund
  2018-12-12 12:42 ` Andrew Lunn
  2018-12-12 18:34 ` Florian Fainelli
  0 siblings, 2 replies; 8+ messages in thread
From: Joakim Tjernlund @ 2018-12-12 12:33 UTC (permalink / raw)
  To: netdev @ vger . kernel . org, claudiu . manoil @ nxp . com,
	Florian Fainelli, Andrew Lunn
  Cc: Joakim Tjernlund

This allows to control carrier from /sys/class/net/ethX/carrier for
Fixed PHYs.

Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
---
 v2 - Only allow carrier changes for Fixed PHYs

 Florian: I have reimpl. this as I think you meant by registering
          a Fixed PHY callback.
 Andrew: Are happy with this as well?

 If this is OK I will sent the other 2 drivers.

 drivers/net/ethernet/freescale/gianfar.c | 26 ++++++++++++++++++++++++
 drivers/net/ethernet/freescale/gianfar.h |  2 +-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index 63daae120b2d..49971093e10f 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -491,7 +491,28 @@ static int gfar_set_mac_addr(struct net_device *dev, void *p)
 
 	return 0;
 }
+static int gfar_fixed_phy_link_update(struct net_device *dev,
+				      struct fixed_phy_status *status)
+{
+	struct gfar_private *priv;
+
+	if (dev && dev->phydev && status) {
+		priv = netdev_priv(dev);
+		status->link = !priv->no_carrier;
+	}
+	return 0;
+}
+static int gfar_change_carrier(struct net_device *dev, bool new_carrier)
+{
+	struct phy_device *phydev = dev->phydev;
+	struct gfar_private *priv;
 
+	if (!phy_is_pseudo_fixed_link(phydev))
+		return -EINVAL;
+	priv = netdev_priv(dev);
+	priv->no_carrier = !new_carrier;
+	return 0;
+}
 static const struct net_device_ops gfar_netdev_ops = {
 	.ndo_open = gfar_enet_open,
 	.ndo_start_xmit = gfar_start_xmit,
@@ -502,6 +523,7 @@ static const struct net_device_ops gfar_netdev_ops = {
 	.ndo_tx_timeout = gfar_timeout,
 	.ndo_do_ioctl = gfar_ioctl,
 	.ndo_get_stats = gfar_get_stats,
+	.ndo_change_carrier = gfar_change_carrier,
 	.ndo_set_mac_address = gfar_set_mac_addr,
 	.ndo_validate_addr = eth_validate_addr,
 #ifdef CONFIG_NET_POLL_CONTROLLER
@@ -1807,6 +1829,10 @@ static int init_phy(struct net_device *dev)
 		return -ENODEV;
 	}
 
+	if (phy_is_pseudo_fixed_link(phydev))
+		fixed_phy_set_link_update(phydev,
+					  gfar_fixed_phy_link_update);
+
 	if (interface == PHY_INTERFACE_MODE_SGMII)
 		gfar_configure_serdes(dev);
 
diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h
index 5aa814799d70..94a64d2dcc6f 100644
--- a/drivers/net/ethernet/freescale/gianfar.h
+++ b/drivers/net/ethernet/freescale/gianfar.h
@@ -1158,7 +1158,7 @@ struct gfar_private {
 	int oldspeed;
 	int oldduplex;
 	int oldlink;
-
+	bool no_carrier;
 	uint32_t msg_enable;
 
 	struct work_struct reset_task;
-- 
2.18.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 12:33 [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs Joakim Tjernlund
@ 2018-12-12 12:42 ` Andrew Lunn
  2018-12-12 13:10   ` Claudiu Manoil
  2018-12-12 18:34 ` Florian Fainelli
  1 sibling, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2018-12-12 12:42 UTC (permalink / raw)
  To: Joakim Tjernlund
  Cc: netdev @ vger . kernel . org, claudiu . manoil @ nxp . com,
	Florian Fainelli

On Wed, Dec 12, 2018 at 01:33:08PM +0100, Joakim Tjernlund wrote:
> This allows to control carrier from /sys/class/net/ethX/carrier for
> Fixed PHYs.
> 
> Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
> ---
>  v2 - Only allow carrier changes for Fixed PHYs
> 
>  Florian: I have reimpl. this as I think you meant by registering
>           a Fixed PHY callback.
>  Andrew: Are happy with this as well?

Hi Joakim

The basic idea is O.K.

> 
>  If this is OK I will sent the other 2 drivers.

Rather than replicating the code three times, how about putting all
the code in the fixed phy driver, exporting a fixed_phy_change_carrier
function which can be assigned to the .ndo.

      Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 12:42 ` Andrew Lunn
@ 2018-12-12 13:10   ` Claudiu Manoil
  2018-12-12 13:30     ` Joakim Tjernlund
  2018-12-12 14:25     ` Joakim Tjernlund
  0 siblings, 2 replies; 8+ messages in thread
From: Claudiu Manoil @ 2018-12-12 13:10 UTC (permalink / raw)
  To: Andrew Lunn, jocke@infinera.com
  Cc: netdev @ vger . kernel . org, Florian Fainelli

>-----Original Message-----
>From: Andrew Lunn <andrew@lunn.ch>
>Sent: Wednesday, December 12, 2018 2:43 PM
>To: jocke@infinera.com <joakim.tjernlund@infinera.com>
>Cc: netdev @ vger . kernel . org <netdev@vger.kernel.org>; Claudiu Manoil
><claudiu.manoil@nxp.com>; Florian Fainelli <f.fainelli@gmail.com>
>Subject: Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
>
>On Wed, Dec 12, 2018 at 01:33:08PM +0100, Joakim Tjernlund wrote:
>> This allows to control carrier from /sys/class/net/ethX/carrier for
>> Fixed PHYs.
>>
>> Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
>> ---
>>  v2 - Only allow carrier changes for Fixed PHYs
>>
>>  Florian: I have reimpl. this as I think you meant by registering
>>           a Fixed PHY callback.
>>  Andrew: Are happy with this as well?
>
>Hi Joakim
>
>The basic idea is O.K.
>
>>
>>  If this is OK I will sent the other 2 drivers.
>
>Rather than replicating the code three times, how about putting all
>the code in the fixed phy driver, exporting a fixed_phy_change_carrier
>function which can be assigned to the .ndo.
>

I agree with Andrew on this. This code is not device (eTSEC) specific, it is generic
and only uses the gianfar driver to get a reference to its net_device.
Thanks,
Claudiu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 13:10   ` Claudiu Manoil
@ 2018-12-12 13:30     ` Joakim Tjernlund
  2018-12-12 14:25     ` Joakim Tjernlund
  1 sibling, 0 replies; 8+ messages in thread
From: Joakim Tjernlund @ 2018-12-12 13:30 UTC (permalink / raw)
  To: claudiu.manoil, andrew; +Cc: netdev, f.fainelli

On Wed, 2018-12-12 at 13:10 +0000, Claudiu Manoil wrote:
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
> 
> 
> > -----Original Message-----
> > From: Andrew Lunn <andrew@lunn.ch>
> > Sent: Wednesday, December 12, 2018 2:43 PM
> > To: jocke@infinera.com <joakim.tjernlund@infinera.com>
> > Cc: netdev @ vger . kernel . org <netdev@vger.kernel.org>; Claudiu Manoil
> > <claudiu.manoil@nxp.com>; Florian Fainelli <f.fainelli@gmail.com>
> > Subject: Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
> > 
> > On Wed, Dec 12, 2018 at 01:33:08PM +0100, Joakim Tjernlund wrote:
> > > This allows to control carrier from /sys/class/net/ethX/carrier for
> > > Fixed PHYs.
> > > 
> > > Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
> > > ---
> > >  v2 - Only allow carrier changes for Fixed PHYs
> > > 
> > >  Florian: I have reimpl. this as I think you meant by registering
> > >           a Fixed PHY callback.
> > >  Andrew: Are happy with this as well?
> > 
> > Hi Joakim
> > 
> > The basic idea is O.K.
> > 
> > >  If this is OK I will sent the other 2 drivers.
> > 
> > Rather than replicating the code three times, how about putting all
> > the code in the fixed phy driver, exporting a fixed_phy_change_carrier
> > function which can be assigned to the .ndo.
> > 
> 
> I agree with Andrew on this. This code is not device (eTSEC) specific, it is generic
> and only uses the gianfar driver to get a reference to its net_device.
> Thanks,
> Claudiu

Yes, point taken. Looking into moving most stuff into Fixed PHY

 Jocke

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 13:10   ` Claudiu Manoil
  2018-12-12 13:30     ` Joakim Tjernlund
@ 2018-12-12 14:25     ` Joakim Tjernlund
  2018-12-12 14:51       ` Andrew Lunn
  1 sibling, 1 reply; 8+ messages in thread
From: Joakim Tjernlund @ 2018-12-12 14:25 UTC (permalink / raw)
  To: claudiu.manoil, andrew; +Cc: netdev, f.fainelli

On Wed, 2018-12-12 at 13:10 +0000, Claudiu Manoil wrote:
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
> 
> 
> > -----Original Message-----
> > From: Andrew Lunn <andrew@lunn.ch>
> > Sent: Wednesday, December 12, 2018 2:43 PM
> > To: jocke@infinera.com <joakim.tjernlund@infinera.com>
> > Cc: netdev @ vger . kernel . org <netdev@vger.kernel.org>; Claudiu Manoil
> > <claudiu.manoil@nxp.com>; Florian Fainelli <f.fainelli@gmail.com>
> > Subject: Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
> > 
> > On Wed, Dec 12, 2018 at 01:33:08PM +0100, Joakim Tjernlund wrote:
> > > This allows to control carrier from /sys/class/net/ethX/carrier for
> > > Fixed PHYs.
> > > 
> > > Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
> > > ---
> > >  v2 - Only allow carrier changes for Fixed PHYs
> > > 
> > >  Florian: I have reimpl. this as I think you meant by registering
> > >           a Fixed PHY callback.
> > >  Andrew: Are happy with this as well?
> > 
> > Hi Joakim
> > 
> > The basic idea is O.K.
> > 
> > >  If this is OK I will sent the other 2 drivers.
> > 
> > Rather than replicating the code three times, how about putting all
> > the code in the fixed phy driver, exporting a fixed_phy_change_carrier
> > function which can be assigned to the .ndo.
> > 
> 
> I agree with Andrew on this. This code is not device (eTSEC) specific, it is generic
> and only uses the gianfar driver to get a reference to its net_device.
> Thanks,
> Claudiu

fast check, would you be happy with this in fixed PHY:
--- a/drivers/net/phy/fixed_phy.c
+++ b/drivers/net/phy/fixed_phy.c
@@ -25,6 +25,7 @@
 #include <linux/gpio.h>
 #include <linux/seqlock.h>
 #include <linux/idr.h>
+#include <linux/netdevice.h>
 
 #include "swphy.h"
 
@@ -38,6 +39,7 @@ struct fixed_phy {
        struct phy_device *phydev;
        seqcount_t seqcount;
        struct fixed_phy_status status;
+       bool no_carrier;
        int (*link_update)(struct net_device *, struct fixed_phy_status *);
        struct list_head node;
        int link_gpio;
@@ -48,6 +50,24 @@ static struct fixed_mdio_bus platform_fmb = {
        .phys = LIST_HEAD_INIT(platform_fmb.phys),
 };
 
+int
+fixed_phy_change_carrier(struct net_device *dev, bool new_carrier)
+{
+       struct fixed_mdio_bus *fmb = &platform_fmb;
+       struct phy_device *phydev = dev->phydev;
+       struct fixed_phy *fp;
+
+       if (!phydev || !phydev->mdio.bus)
+               return -EINVAL;
+
+       list_for_each_entry(fp, &fmb->phys, node) {
+               if (fp->addr == phydev->mdio.addr) {
+                       fp->no_carrier = !new_carrier;
+                       return 0;
+               }
+       }
+       return -EINVAL;
+}
 static void fixed_phy_update(struct fixed_phy *fp)
 {
        if (gpio_is_valid(fp->link_gpio))
@@ -72,6 +92,12 @@ static int fixed_mdio_read(struct mii_bus *bus, int phy_addr, int reg_num)
                                                        &fp->status);
                                        fixed_phy_update(fp);
                                }
+                               if (fp->no_carrier) {
+                                       fp->link_update(fp->phydev->attached_dev,
+                                                       &fp->status);
+                                       fp->status.link = 0;
+                               }
+
                                state = fp->status;
                        } while (read_seqcount_retry(&fp->seqcount, s));
 

Then one just set:
  +       .ndo_change_carrier = fixed_phy_change_carrier,
in each ethernet driver.

OK?

 Jocke

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 14:25     ` Joakim Tjernlund
@ 2018-12-12 14:51       ` Andrew Lunn
  2018-12-12 17:25         ` Joakim Tjernlund
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2018-12-12 14:51 UTC (permalink / raw)
  To: Joakim Tjernlund; +Cc: claudiu.manoil, netdev, f.fainelli

> fast check, would you be happy with this in fixed PHY:
> --- a/drivers/net/phy/fixed_phy.c
> +++ b/drivers/net/phy/fixed_phy.c
> @@ -25,6 +25,7 @@
>  #include <linux/gpio.h>
>  #include <linux/seqlock.h>
>  #include <linux/idr.h>
> +#include <linux/netdevice.h>
>  
>  #include "swphy.h"
>  
> @@ -38,6 +39,7 @@ struct fixed_phy {
>         struct phy_device *phydev;
>         seqcount_t seqcount;
>         struct fixed_phy_status status;
> +       bool no_carrier;
>         int (*link_update)(struct net_device *, struct fixed_phy_status *);
>         struct list_head node;
>         int link_gpio;
> @@ -48,6 +50,24 @@ static struct fixed_mdio_bus platform_fmb = {
>         .phys = LIST_HEAD_INIT(platform_fmb.phys),
>  };
>  
> +int
> +fixed_phy_change_carrier(struct net_device *dev, bool new_carrier)
> +{
> +       struct fixed_mdio_bus *fmb = &platform_fmb;
> +       struct phy_device *phydev = dev->phydev;
> +       struct fixed_phy *fp;
> +
> +       if (!phydev || !phydev->mdio.bus)
> +               return -EINVAL;
> +
> +       list_for_each_entry(fp, &fmb->phys, node) {
> +               if (fp->addr == phydev->mdio.addr) {
> +                       fp->no_carrier = !new_carrier;

Why is no_carrier needed? You can directly change fp->status.link, so
long as you take care of locking.

> +                       return 0;
> +               }
> +       }
> +       return -EINVAL;
> +}

You need to export the function.

    Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 14:51       ` Andrew Lunn
@ 2018-12-12 17:25         ` Joakim Tjernlund
  0 siblings, 0 replies; 8+ messages in thread
From: Joakim Tjernlund @ 2018-12-12 17:25 UTC (permalink / raw)
  To: andrew; +Cc: claudiu.manoil, netdev, f.fainelli

On Wed, 2018-12-12 at 15:51 +0100, Andrew Lunn wrote:
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
> 
> 
> > fast check, would you be happy with this in fixed PHY:
> > --- a/drivers/net/phy/fixed_phy.c
> > +++ b/drivers/net/phy/fixed_phy.c
> > @@ -25,6 +25,7 @@
> >  #include <linux/gpio.h>
> >  #include <linux/seqlock.h>
> >  #include <linux/idr.h>
> > +#include <linux/netdevice.h>
> > 
> >  #include "swphy.h"
> > 
> > @@ -38,6 +39,7 @@ struct fixed_phy {
> >         struct phy_device *phydev;
> >         seqcount_t seqcount;
> >         struct fixed_phy_status status;
> > +       bool no_carrier;
> >         int (*link_update)(struct net_device *, struct fixed_phy_status *);
> >         struct list_head node;
> >         int link_gpio;
> > @@ -48,6 +50,24 @@ static struct fixed_mdio_bus platform_fmb = {
> >         .phys = LIST_HEAD_INIT(platform_fmb.phys),
> >  };
> > 
> > +int
> > +fixed_phy_change_carrier(struct net_device *dev, bool new_carrier)
> > +{
> > +       struct fixed_mdio_bus *fmb = &platform_fmb;
> > +       struct phy_device *phydev = dev->phydev;
> > +       struct fixed_phy *fp;
> > +
> > +       if (!phydev || !phydev->mdio.bus)
> > +               return -EINVAL;
> > +
> > +       list_for_each_entry(fp, &fmb->phys, node) {
> > +               if (fp->addr == phydev->mdio.addr) {
> > +                       fp->no_carrier = !new_carrier;
> 
> Why is no_carrier needed? You can directly change fp->status.link, so
> long as you take care of locking.

I to remember it for the gpio control of link state, see below.

> 
> > +                       return 0;
> > +               }
> > +       }
> > +       return -EINVAL;
> > +}
> 
> You need to export the function.

Yes, it was not a complete patch. Below is what I have now and is happy with:

diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c
index eb5167210681..aedebc251997 100644
--- a/drivers/net/phy/fixed_phy.c
+++ b/drivers/net/phy/fixed_phy.c
@@ -25,6 +25,7 @@
 #include <linux/gpio.h>
 #include <linux/seqlock.h>
 #include <linux/idr.h>
+#include <linux/netdevice.h>
 
 #include "swphy.h"
 
@@ -38,6 +39,7 @@ struct fixed_phy {
 	struct phy_device *phydev;
 	seqcount_t seqcount;
 	struct fixed_phy_status status;
+	bool no_carrier;
 	int (*link_update)(struct net_device *, struct fixed_phy_status *);
 	struct list_head node;
 	int link_gpio;
@@ -48,9 +50,27 @@ static struct fixed_mdio_bus platform_fmb = {
 	.phys = LIST_HEAD_INIT(platform_fmb.phys),
 };
 
+int
+fixed_phy_change_carrier(struct net_device *dev, bool new_carrier)
+{
+	struct fixed_mdio_bus *fmb = &platform_fmb;
+	struct phy_device *phydev = dev->phydev;
+	struct fixed_phy *fp;
+
+	if (!phydev || !phydev->mdio.bus)
+		return -EINVAL;
+
+	list_for_each_entry(fp, &fmb->phys, node) {
+		if (fp->addr == phydev->mdio.addr) {
+			fp->no_carrier = !new_carrier;
+			return 0;
+		}
+	}
+	return -EINVAL;
+}
 static void fixed_phy_update(struct fixed_phy *fp)
 {
-	if (gpio_is_valid(fp->link_gpio))
+	if (!fp->no_carrier && gpio_is_valid(fp->link_gpio))
 		fp->status.link = !!gpio_get_value_cansleep(fp->link_gpio);
 }
 
@@ -66,6 +86,7 @@ static int fixed_mdio_read(struct mii_bus *bus, int phy_addr, int reg_num)
 
 			do {
 				s = read_seqcount_begin(&fp->seqcount);
+				fp->status.link = !fp->no_carrier;
 				/* Issue callback if user registered it. */
 				if (fp->link_update) {
 					fp->link_update(fp->phydev->attached_dev,
diff --git a/include/linux/phy_fixed.h b/include/linux/phy_fixed.h
index cf6392de6eb0..09d7e613cffc 100644
--- a/include/linux/phy_fixed.h
+++ b/include/linux/phy_fixed.h
@@ -27,6 +27,7 @@ extern int fixed_phy_set_link_update(struct phy_device *phydev,
 extern int fixed_phy_update_state(struct phy_device *phydev,
 			   const struct fixed_phy_status *status,
 			   const struct fixed_phy_status *changed);
+extern int fixed_phy_change_carrier(struct net_device *dev, bool new_carrier);
 #else
 static inline int fixed_phy_add(unsigned int irq, int phy_id,
 				struct fixed_phy_status *status,
@@ -56,6 +57,10 @@ static inline int fixed_phy_update_state(struct phy_device *phydev,
 {
 	return -ENODEV;
 }
+static inline int fixed_phy_change_carrier(struct net_device *dev, bool new_carrier)
+{
+	return -EINVAL;
+}
 #endif /* CONFIG_FIXED_PHY */
 
 #endif /* __PHY_FIXED_H */
-- 
2.18.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs
  2018-12-12 12:33 [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs Joakim Tjernlund
  2018-12-12 12:42 ` Andrew Lunn
@ 2018-12-12 18:34 ` Florian Fainelli
  1 sibling, 0 replies; 8+ messages in thread
From: Florian Fainelli @ 2018-12-12 18:34 UTC (permalink / raw)
  To: Joakim Tjernlund, netdev @ vger . kernel . org,
	claudiu . manoil @ nxp . com, Andrew Lunn

On 12/12/18 4:33 AM, Joakim Tjernlund wrote:
> This allows to control carrier from /sys/class/net/ethX/carrier for
> Fixed PHYs.
> 
> Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
> ---
>  v2 - Only allow carrier changes for Fixed PHYs
> 
>  Florian: I have reimpl. this as I think you meant by registering
>           a Fixed PHY callback.
>  Andrew: Are happy with this as well?

Yes that is exactly what I had in mind, thanks for listening and
translating that into code :) Looking forward to the generic version
being submitted. Thanks!

> 
>  If this is OK I will sent the other 2 drivers.
> 
>  drivers/net/ethernet/freescale/gianfar.c | 26 ++++++++++++++++++++++++
>  drivers/net/ethernet/freescale/gianfar.h |  2 +-
>  2 files changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
> index 63daae120b2d..49971093e10f 100644
> --- a/drivers/net/ethernet/freescale/gianfar.c
> +++ b/drivers/net/ethernet/freescale/gianfar.c
> @@ -491,7 +491,28 @@ static int gfar_set_mac_addr(struct net_device *dev, void *p)
>  
>  	return 0;
>  }
> +static int gfar_fixed_phy_link_update(struct net_device *dev,
> +				      struct fixed_phy_status *status)
> +{
> +	struct gfar_private *priv;
> +
> +	if (dev && dev->phydev && status) {
> +		priv = netdev_priv(dev);
> +		status->link = !priv->no_carrier;
> +	}
> +	return 0;
> +}
> +static int gfar_change_carrier(struct net_device *dev, bool new_carrier)
> +{
> +	struct phy_device *phydev = dev->phydev;
> +	struct gfar_private *priv;
>  
> +	if (!phy_is_pseudo_fixed_link(phydev))
> +		return -EINVAL;
> +	priv = netdev_priv(dev);
> +	priv->no_carrier = !new_carrier;
> +	return 0;
> +}
>  static const struct net_device_ops gfar_netdev_ops = {
>  	.ndo_open = gfar_enet_open,
>  	.ndo_start_xmit = gfar_start_xmit,
> @@ -502,6 +523,7 @@ static const struct net_device_ops gfar_netdev_ops = {
>  	.ndo_tx_timeout = gfar_timeout,
>  	.ndo_do_ioctl = gfar_ioctl,
>  	.ndo_get_stats = gfar_get_stats,
> +	.ndo_change_carrier = gfar_change_carrier,
>  	.ndo_set_mac_address = gfar_set_mac_addr,
>  	.ndo_validate_addr = eth_validate_addr,
>  #ifdef CONFIG_NET_POLL_CONTROLLER
> @@ -1807,6 +1829,10 @@ static int init_phy(struct net_device *dev)
>  		return -ENODEV;
>  	}
>  
> +	if (phy_is_pseudo_fixed_link(phydev))
> +		fixed_phy_set_link_update(phydev,
> +					  gfar_fixed_phy_link_update);
> +
>  	if (interface == PHY_INTERFACE_MODE_SGMII)
>  		gfar_configure_serdes(dev);
>  
> diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h
> index 5aa814799d70..94a64d2dcc6f 100644
> --- a/drivers/net/ethernet/freescale/gianfar.h
> +++ b/drivers/net/ethernet/freescale/gianfar.h
> @@ -1158,7 +1158,7 @@ struct gfar_private {
>  	int oldspeed;
>  	int oldduplex;
>  	int oldlink;
> -
> +	bool no_carrier;
>  	uint32_t msg_enable;
>  
>  	struct work_struct reset_task;
> 


-- 
Florian

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-12-12 18:35 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-12 12:33 [PATCHv2] gianfar: Add gfar_change_carrier() for Fixed PHYs Joakim Tjernlund
2018-12-12 12:42 ` Andrew Lunn
2018-12-12 13:10   ` Claudiu Manoil
2018-12-12 13:30     ` Joakim Tjernlund
2018-12-12 14:25     ` Joakim Tjernlund
2018-12-12 14:51       ` Andrew Lunn
2018-12-12 17:25         ` Joakim Tjernlund
2018-12-12 18:34 ` Florian Fainelli

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.