OSDN Git Service

net: phylink: add support for polling MAC PCS
authorVladimir Oltean <vladimir.oltean@nxp.com>
Mon, 6 Jan 2020 01:34:11 +0000 (03:34 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 6 Jan 2020 07:22:32 +0000 (23:22 -0800)
Some MAC PCS blocks are unable to provide interrupts when their status
changes. As we already have support in phylink for polling status, use
this to provide a hook for MACs to enable polling mode.

The patch idea was picked up from Russell King's suggestion on the macb
phylink patch thread here [0] but the implementation was changed.
Instead of introducing a new phylink_start_poll() function, which would
make the implementation cumbersome for common PHYLINK implementations
for multiple types of devices, like DSA, just add a boolean property to
the phylink_config structure, which is just as backwards-compatible.

https://lkml.org/lkml/2019/12/16/603

Suggested-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/sfp-phylink.rst
drivers/net/phy/phylink.c
include/linux/phylink.h

index a5e00a1..d753a30 100644 (file)
@@ -251,7 +251,8 @@ this documentation.
        phylink_mac_change(priv->phylink, link_is_up);
 
     where ``link_is_up`` is true if the link is currently up or false
-    otherwise.
+    otherwise. If a MAC is unable to provide these interrupts, then
+    it should set ``priv->phylink_config.pcs_poll = true;`` in step 9.
 
 11. Verify that the driver does not call::
 
index 88686e0..af914a8 100644 (file)
@@ -1022,7 +1022,8 @@ void phylink_start(struct phylink *pl)
                if (irq <= 0)
                        mod_timer(&pl->link_poll, jiffies + HZ);
        }
-       if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->get_fixed_state)
+       if ((pl->cfg_link_an_mode == MLO_AN_FIXED && pl->get_fixed_state) ||
+           pl->config->pcs_poll)
                mod_timer(&pl->link_poll, jiffies + HZ);
        if (pl->phydev)
                phy_start(pl->phydev);
index fed5488..523209e 100644 (file)
@@ -63,10 +63,12 @@ enum phylink_op_type {
  * struct phylink_config - PHYLINK configuration structure
  * @dev: a pointer to a struct device associated with the MAC
  * @type: operation type of PHYLINK instance
+ * @pcs_poll: MAC PCS cannot provide link change interrupt
  */
 struct phylink_config {
        struct device *dev;
        enum phylink_op_type type;
+       bool pcs_poll;
 };
 
 /**