| From 59993f48b38fd46863b23bb1bb1dc3291e7278fb Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <jhovold@gmail.com> |
| Date: Thu, 8 May 2014 10:09:22 +0200 |
| Subject: Revert "net: eth: cpsw: Correctly attach to GPIO bitbang MDIO |
| driver" |
| |
| From: Johan Hovold <jhovold@gmail.com> |
| |
| commit 59993f48b38fd46863b23bb1bb1dc3291e7278fb upstream. |
| |
| This reverts commit f8d56d8f892be43a2404356073e16401eb5a42e6 ("net: |
| eth: cpsw: Correctly attach to GPIO bitbang MDIO driver"). |
| |
| Fix potential null-pointer dereference at probe if the mdio-gpio device |
| has not been successfully probed yet. |
| |
| The offending commit is plain wrong for a number of reasons. First of |
| all it accesses internal driver data of an unrelated device. Neither |
| does it check that the data is non-null (which it is in case the device |
| has not been probed yet). |
| |
| Furthermore, the decision on whether to treat any driver data according |
| to the mdio-gpio driver's internals is made based on the node name. But |
| the name is not compared against "mdio" which is the normal name for the |
| node, but rather against "gpio" which the node does not have to be named |
| (and shouldn't be according to the binding documentation). [ If this |
| hack is to be kept out-of-tree it should at least be matching against |
| the compatible property. ] |
| |
| Cc: Stefan Roese <sr@denx.de> |
| Signed-off-by: Johan Hovold <jhovold@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/ethernet/ti/cpsw.c | 14 ++------------ |
| 1 file changed, 2 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/net/ethernet/ti/cpsw.c |
| +++ b/drivers/net/ethernet/ti/cpsw.c |
| @@ -1884,18 +1884,8 @@ static int cpsw_probe_dt(struct cpsw_pla |
| mdio_node = of_find_node_by_phandle(be32_to_cpup(parp)); |
| phyid = be32_to_cpup(parp+1); |
| mdio = of_find_device_by_node(mdio_node); |
| - |
| - if (strncmp(mdio->name, "gpio", 4) == 0) { |
| - /* GPIO bitbang MDIO driver attached */ |
| - struct mii_bus *bus = dev_get_drvdata(&mdio->dev); |
| - |
| - snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), |
| - PHY_ID_FMT, bus->id, phyid); |
| - } else { |
| - /* davinci MDIO driver attached */ |
| - snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), |
| - PHY_ID_FMT, mdio->name, phyid); |
| - } |
| + snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), |
| + PHY_ID_FMT, mdio->name, phyid); |
| |
| mac_addr = of_get_mac_address(slave_node); |
| if (mac_addr) |