Re: [PATCH v3 09/13] net: Rework ucc_geth driver to use of_mdio infrastructure
On Sun, Apr 26, 2009 at 3:00 AM, Joakim Tjernlund joakim.tjernl...@transmode.se wrote: Change in fixed link case, see inline. From: Grant Likely grant.lik...@secretlab.ca This patch simplifies the driver by making use of more common code. Signed-off-by: Grant Likely grant.lik...@secretlab.ca Acked-by: Andy Fleming aflem...@freescale.com --- drivers/net/ucc_geth.c | 47 --- drivers/net/ucc_geth.h | 2 +- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index d3f39e8..195b490 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -27,6 +27,7 @@ #include linux/mii.h #include linux/phy.h #include linux/workqueue.h +#include linux/of_mdio.h #include linux/of_platform.h #include asm/uaccess.h @@ -1542,12 +1543,14 @@ static int init_phy(struct net_device *dev) priv-oldspeed = 0; priv-oldduplex = -1; - phydev = phy_connect(dev, ug_info-phy_bus_id, adjust_link, 0, - priv-phy_interface); + if (!ug_info-phy_node) + return 0; - if (IS_ERR(phydev)) { + phydev = of_phy_connect(dev, ug_info-phy_node, adjust_link, 0, + priv-phy_interface); + if (!phydev) { printk(%s: Could not attach to PHY\n, dev-name); - return PTR_ERR(phydev); + return -ENODEV; } phydev-supported = (ADVERTISED_10baseT_Half | @@ -3519,14 +3522,12 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma { struct device *device = ofdev-dev; struct device_node *np = ofdev-node; - struct device_node *mdio; struct net_device *dev = NULL; struct ucc_geth_private *ugeth = NULL; struct ucc_geth_info *ug_info; struct resource res; struct device_node *phy; int err, ucc_num, max_speed = 0; - const phandle *ph; const u32 *fixed_link; const unsigned int *prop; const char *sprop; @@ -3626,45 +3627,21 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma ug_info-uf_info.irq = irq_of_parse_and_map(np, 0); fixed_link = of_get_property(np, fixed-link, NULL); if (fixed_link) { - snprintf(ug_info-phy_bus_id, sizeof(ug_info-phy_bus_id), - PHY_ID_FMT, 0, fixed_link[0]); phy = NULL; phy assigned to NULL ... } else { - char bus_name[MII_BUS_ID_SIZE]; - - ph = of_get_property(np, phy-handle, NULL); - phy = of_find_node_by_phandle(*ph); - + phy = of_parse_phandle(np, phy-handle, 0); if (phy == NULL) return -ENODEV; - - /* set the PHY address */ - prop = of_get_property(phy, reg, NULL); - if (prop == NULL) - return -1; - - /* Set the bus id */ - mdio = of_get_parent(phy); - - if (mdio == NULL) - return -ENODEV; - - err = of_address_to_resource(mdio, 0, res); - - if (err) { - of_node_put(mdio); - return err; - } - fsl_pq_mdio_bus_name(bus_name, mdio); - of_node_put(mdio); - snprintf(ug_info-phy_bus_id, sizeof(ug_info-phy_bus_id), - %s:%02x, bus_name, *prop); } + ug_info-phy_node = phy; /* get the phy interface type, or default to MII */ prop = of_get_property(np, phy-connection-type, NULL); if (!prop) { /* handle interface property present in old trees */ + if (!phy) + return -ENODEV; .. here an error is returned. Is this intentional? Yes, I did that intentionally because it looked like a bug to me because of_get_property() is passed the phy value. However, I suppose that if phy is null then of_get_property will just return NULL, so I think I made a mistake. I'll post a patch to remove these two lines. g. + prop = of_get_property(phy, interface, NULL); if (prop != NULL) { phy_interface = enet_to_phy_interface[*prop]; diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 2f8ee7c..bc31975 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h @@ -1100,7 +1100,7 @@ struct ucc_geth_info { u32 eventRegMask; u16 pausePeriod; u16 extensionField; - char phy_bus_id[BUS_ID_SIZE]; + struct device_node *phy_node; u8 weightfactor[NUM_TX_QUEUES]; u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH v3 09/13] net: Rework ucc_geth driver to use of_mdio infrastructure
Change in fixed link case, see inline. From: Grant Likely grant.lik...@secretlab.ca This patch simplifies the driver by making use of more common code. Signed-off-by: Grant Likely grant.lik...@secretlab.ca Acked-by: Andy Fleming aflem...@freescale.com --- drivers/net/ucc_geth.c | 47 --- drivers/net/ucc_geth.h |2 +- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index d3f39e8..195b490 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -27,6 +27,7 @@ #include linux/mii.h #include linux/phy.h #include linux/workqueue.h +#include linux/of_mdio.h #include linux/of_platform.h #include asm/uaccess.h @@ -1542,12 +1543,14 @@ static int init_phy(struct net_device *dev) priv-oldspeed = 0; priv-oldduplex = -1; - phydev = phy_connect(dev, ug_info-phy_bus_id, adjust_link, 0, - priv-phy_interface); + if (!ug_info-phy_node) + return 0; - if (IS_ERR(phydev)) { + phydev = of_phy_connect(dev, ug_info-phy_node, adjust_link, 0, +priv-phy_interface); + if (!phydev) { printk(%s: Could not attach to PHY\n, dev-name); - return PTR_ERR(phydev); + return -ENODEV; } phydev-supported = (ADVERTISED_10baseT_Half | @@ -3519,14 +3522,12 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma { struct device *device = ofdev-dev; struct device_node *np = ofdev-node; - struct device_node *mdio; struct net_device *dev = NULL; struct ucc_geth_private *ugeth = NULL; struct ucc_geth_info *ug_info; struct resource res; struct device_node *phy; int err, ucc_num, max_speed = 0; - const phandle *ph; const u32 *fixed_link; const unsigned int *prop; const char *sprop; @@ -3626,45 +3627,21 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma ug_info-uf_info.irq = irq_of_parse_and_map(np, 0); fixed_link = of_get_property(np, fixed-link, NULL); if (fixed_link) { - snprintf(ug_info-phy_bus_id, sizeof(ug_info-phy_bus_id), - PHY_ID_FMT, 0, fixed_link[0]); phy = NULL; phy assigned to NULL ... } else { - char bus_name[MII_BUS_ID_SIZE]; - - ph = of_get_property(np, phy-handle, NULL); - phy = of_find_node_by_phandle(*ph); - + phy = of_parse_phandle(np, phy-handle, 0); if (phy == NULL) return -ENODEV; - - /* set the PHY address */ - prop = of_get_property(phy, reg, NULL); - if (prop == NULL) - return -1; - - /* Set the bus id */ - mdio = of_get_parent(phy); - - if (mdio == NULL) - return -ENODEV; - - err = of_address_to_resource(mdio, 0, res); - - if (err) { - of_node_put(mdio); - return err; - } - fsl_pq_mdio_bus_name(bus_name, mdio); - of_node_put(mdio); - snprintf(ug_info-phy_bus_id, sizeof(ug_info-phy_bus_id), - %s:%02x, bus_name, *prop); } + ug_info-phy_node = phy; /* get the phy interface type, or default to MII */ prop = of_get_property(np, phy-connection-type, NULL); if (!prop) { /* handle interface property present in old trees */ + if (!phy) + return -ENODEV; .. here an error is returned. Is this intentional? + prop = of_get_property(phy, interface, NULL); if (prop != NULL) { phy_interface = enet_to_phy_interface[*prop]; diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 2f8ee7c..bc31975 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h @@ -1100,7 +1100,7 @@ struct ucc_geth_info { u32 eventRegMask; u16 pausePeriod; u16 extensionField; - char phy_bus_id[BUS_ID_SIZE]; + struct device_node *phy_node; u8 weightfactor[NUM_TX_QUEUES]; u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[PATCH v3 09/13] net: Rework ucc_geth driver to use of_mdio infrastructure
From: Grant Likely grant.lik...@secretlab.ca This patch simplifies the driver by making use of more common code. Signed-off-by: Grant Likely grant.lik...@secretlab.ca Acked-by: Andy Fleming aflem...@freescale.com --- drivers/net/ucc_geth.c | 47 --- drivers/net/ucc_geth.h |2 +- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index d3f39e8..195b490 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -27,6 +27,7 @@ #include linux/mii.h #include linux/phy.h #include linux/workqueue.h +#include linux/of_mdio.h #include linux/of_platform.h #include asm/uaccess.h @@ -1542,12 +1543,14 @@ static int init_phy(struct net_device *dev) priv-oldspeed = 0; priv-oldduplex = -1; - phydev = phy_connect(dev, ug_info-phy_bus_id, adjust_link, 0, -priv-phy_interface); + if (!ug_info-phy_node) + return 0; - if (IS_ERR(phydev)) { + phydev = of_phy_connect(dev, ug_info-phy_node, adjust_link, 0, + priv-phy_interface); + if (!phydev) { printk(%s: Could not attach to PHY\n, dev-name); - return PTR_ERR(phydev); + return -ENODEV; } phydev-supported = (ADVERTISED_10baseT_Half | @@ -3519,14 +3522,12 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma { struct device *device = ofdev-dev; struct device_node *np = ofdev-node; - struct device_node *mdio; struct net_device *dev = NULL; struct ucc_geth_private *ugeth = NULL; struct ucc_geth_info *ug_info; struct resource res; struct device_node *phy; int err, ucc_num, max_speed = 0; - const phandle *ph; const u32 *fixed_link; const unsigned int *prop; const char *sprop; @@ -3626,45 +3627,21 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma ug_info-uf_info.irq = irq_of_parse_and_map(np, 0); fixed_link = of_get_property(np, fixed-link, NULL); if (fixed_link) { - snprintf(ug_info-phy_bus_id, sizeof(ug_info-phy_bus_id), -PHY_ID_FMT, 0, fixed_link[0]); phy = NULL; } else { - char bus_name[MII_BUS_ID_SIZE]; - - ph = of_get_property(np, phy-handle, NULL); - phy = of_find_node_by_phandle(*ph); - + phy = of_parse_phandle(np, phy-handle, 0); if (phy == NULL) return -ENODEV; - - /* set the PHY address */ - prop = of_get_property(phy, reg, NULL); - if (prop == NULL) - return -1; - - /* Set the bus id */ - mdio = of_get_parent(phy); - - if (mdio == NULL) - return -ENODEV; - - err = of_address_to_resource(mdio, 0, res); - - if (err) { - of_node_put(mdio); - return err; - } - fsl_pq_mdio_bus_name(bus_name, mdio); - of_node_put(mdio); - snprintf(ug_info-phy_bus_id, sizeof(ug_info-phy_bus_id), - %s:%02x, bus_name, *prop); } + ug_info-phy_node = phy; /* get the phy interface type, or default to MII */ prop = of_get_property(np, phy-connection-type, NULL); if (!prop) { /* handle interface property present in old trees */ + if (!phy) + return -ENODEV; + prop = of_get_property(phy, interface, NULL); if (prop != NULL) { phy_interface = enet_to_phy_interface[*prop]; diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 2f8ee7c..bc31975 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h @@ -1100,7 +1100,7 @@ struct ucc_geth_info { u32 eventRegMask; u16 pausePeriod; u16 extensionField; - char phy_bus_id[BUS_ID_SIZE]; + struct device_node *phy_node; u8 weightfactor[NUM_TX_QUEUES]; u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev