dsa: Replace mii_bus with a generic host device
authorAlexander Duyck <alexander.h.duyck@intel.com>
Mon, 15 Sep 2014 17:00:27 +0000 (13:00 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 15 Sep 2014 21:24:20 +0000 (17:24 -0400)
This change makes it so that instead of passing and storing a mii_bus we
instead pass and store a host_dev.  From there we can test to determine the
exact type of device, and can verify it is the correct device for our switch.

So for example it would be possible to pass a device pointer from a pci_dev
and instead of checking for a PHY ID we could check for a vendor and/or device
ID.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/arm/plat-orion/common.c
drivers/net/dsa/bcm_sf2.c
drivers/net/dsa/mv88e6060.c
drivers/net/dsa/mv88e6123_61_65.c
drivers/net/dsa/mv88e6131.c
drivers/net/dsa/mv88e6171.c
drivers/net/dsa/mv88e6xxx.c
include/net/dsa.h
net/dsa/dsa.c
net/dsa/slave.c

index 3ec6e8e8d3683f4f76bf8aff68ccfb814441a9e3..f5b00f41c4f6d848e023e08f436e0b3208e1d265 100644 (file)
@@ -499,7 +499,7 @@ void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq)
 
        d->netdev = &orion_ge00.dev;
        for (i = 0; i < d->nr_chips; i++)
-               d->chip[i].mii_bus = &orion_ge00_shared.dev;
+               d->chip[i].host_dev = &orion_ge00_shared.dev;
        orion_switch_device.dev.platform_data = d;
 
        platform_device_register(&orion_switch_device);
index e9918c7f1792a5d199471017154cdbf9c0fb9020..02d7db320d90526b6cce3c0bee6d4510476ab105 100644 (file)
@@ -129,7 +129,7 @@ static int bcm_sf2_sw_get_sset_count(struct dsa_switch *ds)
        return BCM_SF2_STATS_SIZE;
 }
 
-static char *bcm_sf2_sw_probe(struct mii_bus *bus, int sw_addr)
+static char *bcm_sf2_sw_probe(struct device *host_dev, int sw_addr)
 {
        return "Broadcom Starfighter 2";
 }
index d8037c1055ace9522bebe839a024716de3b5ed64..776e965dc9f45c886b5c23456a801d2a26bbc2cd 100644 (file)
@@ -21,7 +21,8 @@
 
 static int reg_read(struct dsa_switch *ds, int addr, int reg)
 {
-       return mdiobus_read(ds->master_mii_bus, ds->pd->sw_addr + addr, reg);
+       return mdiobus_read(to_mii_bus(ds->master_dev),
+                           ds->pd->sw_addr + addr, reg);
 }
 
 #define REG_READ(addr, reg)                                    \
@@ -37,8 +38,8 @@ static int reg_read(struct dsa_switch *ds, int addr, int reg)
 
 static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
 {
-       return mdiobus_write(ds->master_mii_bus, ds->pd->sw_addr + addr,
-                            reg, val);
+       return mdiobus_write(to_mii_bus(ds->master_dev),
+                            ds->pd->sw_addr + addr, reg, val);
 }
 
 #define REG_WRITE(addr, reg, val)                              \
@@ -50,10 +51,14 @@ static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
                        return __ret;                           \
        })
 
-static char *mv88e6060_probe(struct mii_bus *bus, int sw_addr)
+static char *mv88e6060_probe(struct device *host_dev, int sw_addr)
 {
+       struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
        int ret;
 
+       if (bus == NULL)
+               return NULL;
+
        ret = mdiobus_read(bus, sw_addr + REG_PORT(0), 0x03);
        if (ret >= 0) {
                ret &= 0xfff0;
index 975774f338c2ea090df6b53a2c81502becdff869..a332c53ff955906eaeec11edd81350b247561fed 100644 (file)
 #include <net/dsa.h>
 #include "mv88e6xxx.h"
 
-static char *mv88e6123_61_65_probe(struct mii_bus *bus, int sw_addr)
+static char *mv88e6123_61_65_probe(struct device *host_dev, int sw_addr)
 {
+       struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
        int ret;
 
+       if (bus == NULL)
+               return NULL;
+
        ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03);
        if (ret >= 0) {
                if (ret == 0x1212)
index 35541f2ceca3f3b87631fbd333fe9ec29a4c75fc..244c735014fa47421b25091efd9b70077e1089e0 100644 (file)
 #define ID_6095                0x0950
 #define ID_6131                0x1060
 
-static char *mv88e6131_probe(struct mii_bus *bus, int sw_addr)
+static char *mv88e6131_probe(struct device *host_dev, int sw_addr)
 {
+       struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
        int ret;
 
+       if (bus == NULL)
+               return NULL;
+
        ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03);
        if (ret >= 0) {
                ret &= 0xfff0;
index 03a70069a8c670a041c4dc5a1f260201c40fc885..6365e30138af7e613a9ad2dc4b27a79f583142a9 100644 (file)
 #include <net/dsa.h>
 #include "mv88e6xxx.h"
 
-static char *mv88e6171_probe(struct mii_bus *bus, int sw_addr)
+static char *mv88e6171_probe(struct device *host_dev, int sw_addr)
 {
+       struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
        int ret;
 
+       if (bus == NULL)
+               return NULL;
+
        ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03);
        if (ret >= 0) {
                if ((ret & 0xfff0) == 0x1710)
index 901d2a9704ef13a9f389b7c8d0b56214600b5554..d6f6428b27dcc02dbce52a3f0666d58b8ccbf385 100644 (file)
@@ -78,7 +78,7 @@ int mv88e6xxx_reg_read(struct dsa_switch *ds, int addr, int reg)
        int ret;
 
        mutex_lock(&ps->smi_mutex);
-       ret = __mv88e6xxx_reg_read(ds->master_mii_bus,
+       ret = __mv88e6xxx_reg_read(to_mii_bus(ds->master_dev),
                                   ds->pd->sw_addr, addr, reg);
        mutex_unlock(&ps->smi_mutex);
 
@@ -122,7 +122,7 @@ int mv88e6xxx_reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
        int ret;
 
        mutex_lock(&ps->smi_mutex);
-       ret = __mv88e6xxx_reg_write(ds->master_mii_bus,
+       ret = __mv88e6xxx_reg_write(to_mii_bus(ds->master_dev),
                                    ds->pd->sw_addr, addr, reg, val);
        mutex_unlock(&ps->smi_mutex);
 
index a55c4e6a4f0f3df5c53e406a2bf6c3bb65c5b0e0..c779e9bba1b3cbfac293b89e016cbcaa1bb52de0 100644 (file)
@@ -34,7 +34,7 @@ struct dsa_chip_data {
        /*
         * How to access the switch configuration registers.
         */
-       struct device   *mii_bus;
+       struct device   *host_dev;
        int             sw_addr;
 
        /* Device tree node pointer for this specific switch chip
@@ -134,9 +134,9 @@ struct dsa_switch {
        struct dsa_switch_driver        *drv;
 
        /*
-        * Reference to mii bus to use.
+        * Reference to host device to use.
         */
-       struct mii_bus          *master_mii_bus;
+       struct device           *master_dev;
 
        /*
         * Slave mii_bus and devices for the individual ports.
@@ -178,7 +178,7 @@ struct dsa_switch_driver {
        /*
         * Probing and setup.
         */
-       char    *(*probe)(struct mii_bus *bus, int sw_addr);
+       char    *(*probe)(struct device *host_dev, int sw_addr);
        int     (*setup)(struct dsa_switch *ds);
        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
 
@@ -213,6 +213,7 @@ struct dsa_switch_driver {
 
 void register_switch_driver(struct dsa_switch_driver *type);
 void unregister_switch_driver(struct dsa_switch_driver *type);
+struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
 
 static inline void *ds_to_priv(struct dsa_switch *ds)
 {
index 1df0a7cf1e9e25dc83a7ac2024e1c2b9136f1988..b34d6978d7734dd992655e6e9bfa81282d86d64b 100644 (file)
@@ -43,7 +43,7 @@ void unregister_switch_driver(struct dsa_switch_driver *drv)
 EXPORT_SYMBOL_GPL(unregister_switch_driver);
 
 static struct dsa_switch_driver *
-dsa_switch_probe(struct mii_bus *bus, int sw_addr, char **_name)
+dsa_switch_probe(struct device *host_dev, int sw_addr, char **_name)
 {
        struct dsa_switch_driver *ret;
        struct list_head *list;
@@ -58,7 +58,7 @@ dsa_switch_probe(struct mii_bus *bus, int sw_addr, char **_name)
 
                drv = list_entry(list, struct dsa_switch_driver, list);
 
-               name = drv->probe(bus, sw_addr);
+               name = drv->probe(host_dev, sw_addr);
                if (name != NULL) {
                        ret = drv;
                        break;
@@ -75,7 +75,7 @@ dsa_switch_probe(struct mii_bus *bus, int sw_addr, char **_name)
 /* basic switch operations **************************************************/
 static struct dsa_switch *
 dsa_switch_setup(struct dsa_switch_tree *dst, int index,
-                struct device *parent, struct mii_bus *bus)
+                struct device *parent, struct device *host_dev)
 {
        struct dsa_chip_data *pd = dst->pd->chip + index;
        struct dsa_switch_driver *drv;
@@ -88,7 +88,7 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
        /*
         * Probe for switch model.
         */
-       drv = dsa_switch_probe(bus, pd->sw_addr, &name);
+       drv = dsa_switch_probe(host_dev, pd->sw_addr, &name);
        if (drv == NULL) {
                printk(KERN_ERR "%s[%d]: could not detect attached switch\n",
                       dst->master_netdev->name, index);
@@ -109,8 +109,7 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
        ds->index = index;
        ds->pd = dst->pd->chip + index;
        ds->drv = drv;
-       ds->master_mii_bus = bus;
-
+       ds->master_dev = host_dev;
 
        /*
         * Validate supplied switch configuration.
@@ -285,7 +284,7 @@ static struct device *dev_find_class(struct device *parent, char *class)
        return device_find_child(parent, class, dev_is_class);
 }
 
-static struct mii_bus *dev_to_mii_bus(struct device *dev)
+struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev)
 {
        struct device *d;
 
@@ -301,6 +300,7 @@ static struct mii_bus *dev_to_mii_bus(struct device *dev)
 
        return NULL;
 }
+EXPORT_SYMBOL_GPL(dsa_host_dev_to_mii_bus);
 
 static struct net_device *dev_to_net_device(struct device *dev)
 {
@@ -566,17 +566,9 @@ static int dsa_probe(struct platform_device *pdev)
        dst->cpu_port = -1;
 
        for (i = 0; i < pd->nr_chips; i++) {
-               struct mii_bus *bus;
                struct dsa_switch *ds;
 
-               bus = dev_to_mii_bus(pd->chip[i].mii_bus);
-               if (bus == NULL) {
-                       printk(KERN_ERR "%s[%d]: no mii bus found for "
-                               "dsa switch\n", dev->name, i);
-                       continue;
-               }
-
-               ds = dsa_switch_setup(dst, i, &pdev->dev, bus);
+               ds = dsa_switch_setup(dst, i, &pdev->dev, pd->chip[i].host_dev);
                if (IS_ERR(ds)) {
                        printk(KERN_ERR "%s[%d]: couldn't create dsa switch "
                                "instance (error %ld)\n", dev->name, i,
index e38a331111c0c111d69fddf0a7b6b91a641db21a..90c9689ed3625e41b16b5a35dd31c910a5b96325 100644 (file)
@@ -44,7 +44,7 @@ void dsa_slave_mii_bus_init(struct dsa_switch *ds)
        ds->slave_mii_bus->write = dsa_slave_phy_write;
        snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x",
                        ds->index, ds->pd->sw_addr);
-       ds->slave_mii_bus->parent = &ds->master_mii_bus->dev;
+       ds->slave_mii_bus->parent = ds->master_dev;
 }