net: emaclite: Support multiple phys connected to one MDIO bus
authorMichal Simek <michal.simek@xilinx.com>
Thu, 30 May 2013 00:28:04 +0000 (00:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 31 May 2013 00:08:43 +0000 (17:08 -0700)
For system which contains at least two ethernet IP where
one IP manage MDIO bus with several PHYs.

Example dts node:
ethernet_mac0: ethernet@81000000 {
compatible = "xlnx,xps-ethernetlite-1.00.a";
device_type = "network";
interrupt-parent = <&xps_intc_0>;
interrupts = < 1 0 >;
local-mac-address = [ 00 0a 35 00 db bb ];
phy-handle = <&ethernet_mac0_phy0>;
reg = < 0x81000000 0x10000 >;
xlnx,duplex = <0x1>;
xlnx,family = "spartan3e";
xlnx,include-internal-loopback = <0x0>;
xlnx,include-mdio = <0x1>;
xlnx,rx-ping-pong = <0x0>;
xlnx,tx-ping-pong = <0x0>;
ethernet_mac0_mdio {
#address-cells = <1>;
#size-cells = <0>;
ethernet_mac0_phy0: phy@1 {
reg = <0x1>;
} ;
ethernet_mac0_phy1: phy@3 {
reg = <0x3>;
} ;
} ;
} ;
ethernet_mac2: ethernet@81040000 {
compatible = "xlnx,xps-ethernetlite-1.00.a";
device_type = "network";
interrupt-parent = <&xps_intc_0>;
interrupts = < 11 0 >;
local-mac-address = [ 00 0a 35 00 db bb ];
phy-handle = <&ethernet_mac0_phy1>;
reg = < 0x81040000 0x10000 >;
xlnx,duplex = <0x1>;
xlnx,family = "spartan3e";
xlnx,include-internal-loopback = <0x0>;
xlnx,include-mdio = <0x0>;
xlnx,rx-ping-pong = <0x0>;
xlnx,tx-ping-pong = <0x0>;
} ;

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/xilinx/xilinx_emaclite.c

index a16dc35089987b359db335b5837444a6306facdf..fcd1e0b46103425e83c54a7488918ba8573d949c 100644 (file)
@@ -848,6 +848,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
        int rc;
        struct resource res;
        struct device_node *np = of_get_parent(lp->phy_node);
+       struct device_node *npp;
 
        /* Don't register the MDIO bus if the phy_node or its parent node
         * can't be found.
@@ -856,6 +857,17 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
                dev_err(dev, "Failed to register mdio bus.\n");
                return -ENODEV;
        }
+       npp = of_get_parent(np);
+
+       of_address_to_resource(npp, 0, &res);
+       if (lp->ndev->mem_start != res.start) {
+               struct phy_device *phydev;
+               phydev = of_phy_find_device(lp->phy_node);
+               if (!phydev)
+                       dev_info(dev,
+                                "MDIO of the phy is not registered yet\n");
+               return 0;
+       }
 
        /* Enable the MDIO bus by asserting the enable bit in MDIO Control
         * register.
@@ -869,7 +881,6 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
                return -ENOMEM;
        }
 
-       of_address_to_resource(np, 0, &res);
        snprintf(bus->id, MII_BUS_ID_SIZE, "%.8llx",
                 (unsigned long long)res.start);
        bus->priv = lp;