Skip to content

Commit

Permalink
dsa: Replace mii_bus with a generic host device
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alexander Duyck authored and David S. Miller committed Sep 15, 2014
1 parent 5075314 commit b4d2394
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 32 deletions.
2 changes: 1 addition & 1 deletion arch/arm/plat-orion/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/dsa/bcm_sf2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
Expand Down
13 changes: 9 additions & 4 deletions drivers/net/dsa/mv88e6060.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand All @@ -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) \
Expand All @@ -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;
Expand Down
6 changes: 5 additions & 1 deletion drivers/net/dsa/mv88e6123_61_65.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
#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)
Expand Down
6 changes: 5 additions & 1 deletion drivers/net/dsa/mv88e6131.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,14 @@
#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;
Expand Down
6 changes: 5 additions & 1 deletion drivers/net/dsa/mv88e6171.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
#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)
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/dsa/mv88e6xxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down
9 changes: 5 additions & 4 deletions include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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)
{
Expand Down
24 changes: 8 additions & 16 deletions net/dsa/dsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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.
Expand Down Expand Up @@ -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;

Expand All @@ -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)
{
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}


Expand Down

0 comments on commit b4d2394

Please sign in to comment.