net: dsa: add support for phylink mac_select_pcs()
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Thu, 17 Feb 2022 18:30:35 +0000 (18:30 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Feb 2022 11:28:32 +0000 (11:28 +0000)
Add DSA support for the phylink mac_select_pcs() method so DSA drivers
can return provide phylink with the appropriate PCS for the PHY
interface mode.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/port.c

index c8626dec970c53f3ced69f0adbbbbf3302233d85..bc6eef6af81038ffb6fcb9da2a5a77e46ba0ce9d 100644 (file)
@@ -788,6 +788,9 @@ struct dsa_switch_ops {
        void    (*phylink_validate)(struct dsa_switch *ds, int port,
                                    unsigned long *supported,
                                    struct phylink_link_state *state);
+       struct phylink_pcs *(*phylink_mac_select_pcs)(struct dsa_switch *ds,
+                                                     int port,
+                                                     phy_interface_t iface);
        int     (*phylink_mac_link_state)(struct dsa_switch *ds, int port,
                                          struct phylink_link_state *state);
        void    (*phylink_mac_config)(struct dsa_switch *ds, int port,
index c731af0adf04db58d638155b3b3fc8a92c6ecf9d..056c6f51ac203a7c39987fa28d6c1590671a3ba6 100644 (file)
@@ -1053,6 +1053,20 @@ static void dsa_port_phylink_mac_pcs_get_state(struct phylink_config *config,
        }
 }
 
+static struct phylink_pcs *
+dsa_port_phylink_mac_select_pcs(struct phylink_config *config,
+                               phy_interface_t interface)
+{
+       struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
+       struct dsa_switch *ds = dp->ds;
+       struct phylink_pcs *pcs = NULL;
+
+       if (ds->ops->phylink_mac_select_pcs)
+               pcs = ds->ops->phylink_mac_select_pcs(ds, dp->index, interface);
+
+       return pcs;
+}
+
 static void dsa_port_phylink_mac_config(struct phylink_config *config,
                                        unsigned int mode,
                                        const struct phylink_link_state *state)
@@ -1119,6 +1133,7 @@ static void dsa_port_phylink_mac_link_up(struct phylink_config *config,
 
 static const struct phylink_mac_ops dsa_port_phylink_mac_ops = {
        .validate = dsa_port_phylink_validate,
+       .mac_select_pcs = dsa_port_phylink_mac_select_pcs,
        .mac_pcs_get_state = dsa_port_phylink_mac_pcs_get_state,
        .mac_config = dsa_port_phylink_mac_config,
        .mac_an_restart = dsa_port_phylink_mac_an_restart,