phy: Include NC-SI in phy setup
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>
Tue, 18 Jun 2019 01:37:18 +0000 (11:37 +1000)
committerJoe Hershberger <joe.hershberger@ni.com>
Mon, 9 Mar 2020 23:11:23 +0000 (18:11 -0500)
Add NC-SI to the usual phy handling. This makes two notable changes:
- Somewhat similar to a fixed phy, phy_connect() will create an NC-SI
phy if CONFIG_PHY_NCSI is defined.
- An early return is added to phy_read() and phy_write() to handle a
case like the NC-SI phy which does not define a bus.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/phy.c
include/phy.h
include/phy_interface.h

index 80a7664e4978241851fa4d0f66621592e319c792..359cc492353b4222769e58c3128735d53fc2f985 100644 (file)
@@ -545,6 +545,9 @@ int phy_init(void)
 #ifdef CONFIG_PHY_FIXED
        phy_fixed_init();
 #endif
+#ifdef CONFIG_PHY_NCSI
+       phy_ncsi_init();
+#endif
 #ifdef CONFIG_PHY_XILINX_GMII2RGMII
        phy_xilinx_gmii2rgmii_init();
 #endif
@@ -1002,6 +1005,12 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr,
 #ifdef CONFIG_PHY_FIXED
        phydev = phy_connect_fixed(bus, dev, interface);
 #endif
+
+#ifdef CONFIG_PHY_NCSI
+       if (!phydev)
+               phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false, interface);
+#endif
+
 #ifdef CONFIG_PHY_XILINX_GMII2RGMII
        if (!phydev)
                phydev = phy_connect_gmii2rgmii(bus, dev, interface);
index 400ca25a35a9bf41f6693b7f518a185f57c80d11..edc702a1f769ec5e32c301155e5337bc48ec80dd 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mii.h>
 #include <linux/ethtool.h>
 #include <linux/mdio.h>
+#include <log.h>
 #include <phy_interface.h>
 
 #define PHY_FIXED_ID           0xa5a55a5a
@@ -173,6 +174,11 @@ static inline int phy_read(struct phy_device *phydev, int devad, int regnum)
 {
        struct mii_dev *bus = phydev->bus;
 
+       if (!bus || !bus->read) {
+               debug("%s: No bus configured\n", __func__);
+               return -1;
+       }
+
        return bus->read(bus, phydev->addr, devad, regnum);
 }
 
@@ -181,6 +187,11 @@ static inline int phy_write(struct phy_device *phydev, int devad, int regnum,
 {
        struct mii_dev *bus = phydev->bus;
 
+       if (!bus || !bus->read) {
+               debug("%s: No bus configured\n", __func__);
+               return -1;
+       }
+
        return bus->write(bus, phydev->addr, devad, regnum, val);
 }
 
@@ -402,6 +413,7 @@ int phy_vitesse_init(void);
 int phy_xilinx_init(void);
 int phy_mscc_init(void);
 int phy_fixed_init(void);
+int phy_ncsi_init(void);
 int phy_xilinx_gmii2rgmii_init(void);
 
 int board_phy_config(struct phy_device *phydev);
index 73f3a3679ceb70cf8eea0663411d270701072f8d..31ca72a81fd152ea2cfeef43b8c91a6af67bf920 100644 (file)
@@ -31,6 +31,7 @@ typedef enum {
        PHY_INTERFACE_MODE_XLAUI,
        PHY_INTERFACE_MODE_CAUI2,
        PHY_INTERFACE_MODE_CAUI4,
+       PHY_INTERFACE_MODE_NCSI,
        PHY_INTERFACE_MODE_XFI,
        PHY_INTERFACE_MODE_USXGMII,
        PHY_INTERFACE_MODE_NONE,        /* Must be last */
@@ -60,6 +61,7 @@ static const char * const phy_interface_strings[] = {
        [PHY_INTERFACE_MODE_XLAUI]              = "xlaui4",
        [PHY_INTERFACE_MODE_CAUI2]              = "caui2",
        [PHY_INTERFACE_MODE_CAUI4]              = "caui4",
+       [PHY_INTERFACE_MODE_NCSI]               = "NC-SI",
        [PHY_INTERFACE_MODE_XFI]                = "xfi",
        [PHY_INTERFACE_MODE_USXGMII]            = "usxgmii",
        [PHY_INTERFACE_MODE_NONE]               = "",