summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2020-08-31 22:52:33 +0300
committerDavid S. Miller <davem@davemloft.net>2020-08-31 22:52:33 +0300
commit10eb4667946068e34f0cde1485f030aa68c89275 (patch)
treee3b1dc75e25a7c2e562bc65d94aaaba9f787b53c /include
parentd60432994ea2ec559f60951260f381be9e460b64 (diff)
parent588d05504d2d3b419733356af5fb8970aa551c20 (diff)
downloadlinux-10eb4667946068e34f0cde1485f030aa68c89275.tar.xz
Merge branch 'net-phy-add-Lynx-PCS-MDIO-module'
Ioana Ciornei says: ==================== net: phy: add Lynx PCS MDIO module Add support for the Lynx PCS as a separate module in drivers/net/phy/. The advantage of this structure is that multiple ethernet or switch drivers used on NXP hardware (ENETC, Seville, Felix DSA switch etc) can share the same implementation of PCS configuration and runtime management. The module implements phylink_pcs_ops and exports a phylink_pcs (incorporated into a lynx_pcs) which can be directly passed to phylink through phylink_pcs_set. The first 3 patches add some missing pieces in phylink and the locked mdiobus write accessor. Next, the Lynx PCS MDIO module is added as a standalone module. The majority of the code is extracted from the Felix DSA driver. The last patch makes the necessary changes in the Felix and Seville drivers in order to use the new common PCS implementation. At the moment, USXGMII (only with in-band AN), SGMII, QSGMII (with and without in-band AN) and 2500Base-X (only w/o in-band AN) are supported by the Lynx PCS MDIO module since these were also supported by Felix and no functional change is intended at this time. Changes in v2: * got rid of the mdio_lynx_pcs structure and directly exported the functions without the need of an indirection * made the necessary adjustments for this in the Felix DSA driver * solved the broken allmodconfig build test by making the module tristate instead of bool * fixed a memory leakage in the Felix driver (the pcs structure was allocated twice) Changes in v3: * added support for PHYLINK PCS ops in DSA (patch 5/9) * cleanup in Felix PHYLINK operations and migrate to phylink_mac_link_up() being the callback of choice for applying MAC configuration (patches 6-8) Changes in v4: * use the newly introduced phylink PCS mechanism * install the phylink_pcs in the phylink_mac_config DSA ops * remove the direct implementations of the PCS ops * do no use the SGMII_ prefix when referring to the IF_MORE register * add a phylink helper to decode the USXGMII code word * remove cleanup patches for Felix (these have been already accepted) * Seville (recently introduced) now has PCS support through the same Lynx PCS module Changes in v5: - move the pcs-lynx driver to drivers/net/pcs - reword the commit message a bit in 4/5 - add error checking and error propagation in 4/5 - s/IF_MODE_DUPLEX/IF_MODE_HALF_DUPLEX in 4/5 ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/linux/mdio.h6
-rw-r--r--include/linux/pcs-lynx.h21
-rw-r--r--include/linux/phylink.h3
3 files changed, 30 insertions, 0 deletions
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
index 898cbf00332a..3a88b699b758 100644
--- a/include/linux/mdio.h
+++ b/include/linux/mdio.h
@@ -358,6 +358,12 @@ static inline int mdiobus_c45_read(struct mii_bus *bus, int prtad, int devad,
return mdiobus_read(bus, prtad, mdiobus_c45_addr(devad, regnum));
}
+static inline int mdiobus_c45_write(struct mii_bus *bus, int prtad, int devad,
+ u16 regnum, u16 val)
+{
+ return mdiobus_write(bus, prtad, mdiobus_c45_addr(devad, regnum), val);
+}
+
int mdiobus_register_device(struct mdio_device *mdiodev);
int mdiobus_unregister_device(struct mdio_device *mdiodev);
bool mdiobus_is_registered_device(struct mii_bus *bus, int addr);
diff --git a/include/linux/pcs-lynx.h b/include/linux/pcs-lynx.h
new file mode 100644
index 000000000000..a6440d6ebe95
--- /dev/null
+++ b/include/linux/pcs-lynx.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
+/* Copyright 2020 NXP
+ * Lynx PCS helpers
+ */
+
+#ifndef __LINUX_PCS_LYNX_H
+#define __LINUX_PCS_LYNX_H
+
+#include <linux/mdio.h>
+#include <linux/phylink.h>
+
+struct lynx_pcs {
+ struct phylink_pcs pcs;
+ struct mdio_device *mdio;
+};
+
+struct lynx_pcs *lynx_pcs_create(struct mdio_device *mdio);
+
+void lynx_pcs_destroy(struct lynx_pcs *pcs);
+
+#endif /* __LINUX_PCS_LYNX_H */
diff --git a/include/linux/phylink.h b/include/linux/phylink.h
index c36fb41a7d90..d81a714cfbbd 100644
--- a/include/linux/phylink.h
+++ b/include/linux/phylink.h
@@ -490,4 +490,7 @@ void phylink_mii_c22_pcs_an_restart(struct mdio_device *pcs);
void phylink_mii_c45_pcs_get_state(struct mdio_device *pcs,
struct phylink_link_state *state);
+
+void phylink_decode_usxgmii_word(struct phylink_link_state *state,
+ uint16_t lpa);
#endif