Thread (3 messages) flat view 3 messages, 3 authors, 2010-02-16

Re: [PATCH] [V5] net: emaclite: adding MDIO and phy lib support

From: Grant Likely <hidden>
Date: 2010-02-11 22:40:45
Also in: netdev

On Thu, Feb 11, 2010 at 3:12 PM, John Linn [off-list ref] wrote:
These changes add MDIO and phy lib support to the driver as the
IP core now supports the MDIO bus.

The MDIO bus and phy are added as a child to the emaclite in the device
tree as illustrated below.

mdio {
=A0 =A0 =A0 =A0#address-cells =3D <1>;
=A0 =A0 =A0 =A0#size-cells =3D <0>;
=A0 =A0 =A0 =A0phy0: phy@7 {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0compatible =3D "marvell,88e1111";
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0reg =3D <7>;
=A0 =A0 =A0 =A0} ;
}

Signed-off-by: Sadanand Mutyala <redacted>
Signed-off-by: John Linn <redacted>
Acked-by: Grant Likely <redacted>

I've noticed one more problem below, but I'm okay with this being
merged as-is and fixed up with a follow-on patch later.

g.
+/**
+ * xemaclite_mdio_setup - Register mii_bus for the Emaclite device
+ * @lp: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0Pointer to the Emaclite device pr=
ivate data
+ * @ofdev: =A0 =A0 Pointer to OF device structure
+ *
+ * This function enables MDIO bus in the Emaclite device and registers a
+ * mii_bus.
+ *
+ * Return: =A0 =A0 0 upon success or a negative error upon failure
+ */
+static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev=
)
+{
+ =A0 =A0 =A0 struct mii_bus *bus;
+ =A0 =A0 =A0 int rc;
+ =A0 =A0 =A0 struct resource res;
+ =A0 =A0 =A0 struct device_node *np =3D of_get_parent(lp->phy_node);
+
+ =A0 =A0 =A0 /* Don't register the MDIO bus if the phy_node or its paren=
t node
+ =A0 =A0 =A0 =A0* can't be found.
+ =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 if (!np)
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENODEV;
This doesn't make sense.  The MDIO bus registration should not be
conditional on whether or not this particular xemaclite instance has a
phy on this particular bus.  Instead of following the mac
--(phandle)--> phy-device --(parent)--> mdio node linkage, this
function should look at the mac nodes children to find the mdio node.

In fact, now that I think about it, the code is actually dangerous,
because it may try and register a different mdio bus node as its own.
+
+ =A0 =A0 =A0 /* Enable the MDIO bus by asserting the enable bit in MDIO =
Control
+ =A0 =A0 =A0 =A0* register.
+ =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 out_be32(lp->base_addr + XEL_MDIOCTRL_OFFSET,
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0XEL_MDIOCTRL_MDIOEN_MASK);
+
+ =A0 =A0 =A0 bus =3D mdiobus_alloc();
+ =A0 =A0 =A0 if (!bus)
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENOMEM;
+
+ =A0 =A0 =A0 of_address_to_resource(np, 0, &res);
+ =A0 =A0 =A0 snprintf(bus->id, MII_BUS_ID_SIZE, "%.8llx",
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(unsigned long long)res.start);
+ =A0 =A0 =A0 bus->priv =3D lp;
+ =A0 =A0 =A0 bus->name =3D "Xilinx Emaclite MDIO";
+ =A0 =A0 =A0 bus->read =3D xemaclite_mdio_read;
+ =A0 =A0 =A0 bus->write =3D xemaclite_mdio_write;
+ =A0 =A0 =A0 bus->reset =3D xemaclite_mdio_reset;
+ =A0 =A0 =A0 bus->parent =3D dev;
+ =A0 =A0 =A0 bus->irq =3D lp->mdio_irqs; /* preallocated IRQ table */
+
+ =A0 =A0 =A0 lp->mii_bus =3D bus;
+
+ =A0 =A0 =A0 rc =3D of_mdiobus_register(bus, np);
+ =A0 =A0 =A0 if (rc)
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto err_register;
+
+ =A0 =A0 =A0 return 0;
+
+err_register:
+ =A0 =A0 =A0 mdiobus_free(bus);
+ =A0 =A0 =A0 return rc;
+}

--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help