ath25: 4.9: fix Ethernet tiny issues

Few tiny fixes for issues caused by changes in the upstream:
 - do not touch PHY IRQ array (core code initializes it itself now)
 - add missed SET_NETDEV_DEV() invocation (causes segfault during phy
   connection)
 - use phy API inside the MDIO probe function instead of direct field
   access (consider phy structure changes in upstream and prevent
   similar issues in the future)

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
This commit is contained in:
Sergey Ryazanov 2017-06-07 01:49:37 +03:00 committed by John Crispin
parent 0827a0b4f1
commit b1cc215d27

View file

@ -33,7 +33,7 @@
+obj-$(CONFIG_NET_AR231X) += ar231x.o +obj-$(CONFIG_NET_AR231X) += ar231x.o
--- /dev/null --- /dev/null
+++ b/drivers/net/ethernet/atheros/ar231x/ar231x.c +++ b/drivers/net/ethernet/atheros/ar231x/ar231x.c
@@ -0,0 +1,1206 @@ @@ -0,0 +1,1198 @@
+/* +/*
+ * ar231x.c: Linux driver for the Atheros AR231x Ethernet device. + * ar231x.c: Linux driver for the Atheros AR231x Ethernet device.
+ * + *
@ -221,6 +221,8 @@
+ +
+ platform_set_drvdata(pdev, dev); + platform_set_drvdata(pdev, dev);
+ +
+ SET_NETDEV_DEV(dev, &pdev->dev);
+
+ sp = netdev_priv(dev); + sp = netdev_priv(dev);
+ sp->dev = dev; + sp->dev = dev;
+ sp->cfg = pdev->dev.platform_data; + sp->cfg = pdev->dev.platform_data;
@ -304,8 +306,6 @@
+ sp->mii_bus->reset = ar231x_mdiobus_reset; + sp->mii_bus->reset = ar231x_mdiobus_reset;
+ sp->mii_bus->name = "ar231x_eth_mii"; + sp->mii_bus->name = "ar231x_eth_mii";
+ snprintf(sp->mii_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id); + snprintf(sp->mii_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id);
+ sp->mii_bus->irq = kmalloc(sizeof(int), GFP_KERNEL);
+ *sp->mii_bus->irq = PHY_POLL;
+ +
+ mdiobus_register(sp->mii_bus); + mdiobus_register(sp->mii_bus);
+ +
@ -1192,28 +1192,19 @@
+{ +{
+ struct ar231x_private *const sp = netdev_priv(dev); + struct ar231x_private *const sp = netdev_priv(dev);
+ struct phy_device *phydev = NULL; + struct phy_device *phydev = NULL;
+ int phy_addr;
+ +
+ /* find the first (lowest address) PHY on the current MAC's MII bus */ + /* find the first (lowest address) PHY on the current MAC's MII bus */
+ for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) + phydev = phy_find_first(sp->mii_bus);
+ if (sp->mii_bus->phy_map[phy_addr]) {
+ phydev = sp->mii_bus->phy_map[phy_addr];
+ sp->phy = phy_addr;
+ break; /* break out with first one found */
+ }
+
+ if (!phydev) { + if (!phydev) {
+ printk(KERN_ERR "ar231x: %s: no PHY found\n", dev->name); + printk(KERN_ERR "ar231x: %s: no PHY found\n", dev->name);
+ return -1; + return -1;
+ } + }
+ +
+ /* now we are supposed to have a proper phydev, to attach to... */ + /* now we are supposed to have a proper phydev, to attach to... */
+ BUG_ON(!phydev);
+ BUG_ON(phydev->attached_dev); + BUG_ON(phydev->attached_dev);
+ +
+ phydev = phy_connect(dev, dev_name(&phydev->dev), &ar231x_adjust_link, + phydev = phy_connect(dev, phydev_name(phydev), &ar231x_adjust_link,
+ PHY_INTERFACE_MODE_MII); + PHY_INTERFACE_MODE_MII);
+
+ if (IS_ERR(phydev)) { + if (IS_ERR(phydev)) {
+ printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); + printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
+ return PTR_ERR(phydev); + return PTR_ERR(phydev);
@ -1233,9 +1224,10 @@
+ +
+ sp->oldduplex = -1; + sp->oldduplex = -1;
+ sp->phy_dev = phydev; + sp->phy_dev = phydev;
+ sp->phy = phydev->mdio.addr;
+ +
+ printk(KERN_INFO "%s: attached PHY driver [%s] (mii_bus:phy_addr=%s)\n", + printk(KERN_INFO "%s: attached PHY driver [%s] (mii_bus:phy_addr=%s)\n",
+ dev->name, phydev->drv->name, dev_name(&phydev->dev)); + dev->name, phydev->drv->name, phydev_name(phydev));
+ +
+ return 0; + return 0;
+} +}