Skip to content

Commit

Permalink
net: dsa: split dsa_switch_setup into two functions
Browse files Browse the repository at this point in the history
Split the part of dsa_switch_setup() which is responsible for allocating
and initializing a 'struct dsa_switch' and the part which is doing a
given switch device setup and slave network device creation.

This is a preliminary change to allow a separate caller of
dsa_switch_setup_one() which may have externally initialized the
dsa_switch structure, outside of dsa_switch_setup().

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Florian Fainelli authored and David S. Miller committed Mar 6, 2015
1 parent b324c07 commit df19719
Showing 1 changed file with 51 additions and 37 deletions.
88 changes: 51 additions & 37 deletions net/dsa/dsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,43 +175,14 @@ __ATTRIBUTE_GROUPS(dsa_hwmon);
#endif /* CONFIG_NET_DSA_HWMON */

/* basic switch operations **************************************************/
static struct dsa_switch *
dsa_switch_setup(struct dsa_switch_tree *dst, int index,
struct device *parent, struct device *host_dev)
static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
{
struct dsa_chip_data *pd = dst->pd->chip + index;
struct dsa_switch_driver *drv;
struct dsa_switch *ds;
int ret;
char *name;
int i;
struct dsa_switch_driver *drv = ds->drv;
struct dsa_switch_tree *dst = ds->dst;
struct dsa_chip_data *pd = ds->pd;
bool valid_name_found = false;

/*
* Probe for switch model.
*/
drv = dsa_switch_probe(host_dev, pd->sw_addr, &name);
if (drv == NULL) {
netdev_err(dst->master_netdev, "[%d]: could not detect attached switch\n",
index);
return ERR_PTR(-EINVAL);
}
netdev_info(dst->master_netdev, "[%d]: detected a %s switch\n",
index, name);


/*
* Allocate and initialise switch state.
*/
ds = kzalloc(sizeof(*ds) + drv->priv_size, GFP_KERNEL);
if (ds == NULL)
return ERR_PTR(-ENOMEM);

ds->dst = dst;
ds->index = index;
ds->pd = dst->pd->chip + index;
ds->drv = drv;
ds->master_dev = host_dev;
int index = ds->index;
int i, ret;

/*
* Validate supplied switch configuration.
Expand Down Expand Up @@ -350,13 +321,56 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
}
#endif /* CONFIG_NET_DSA_HWMON */

return ds;
return ret;

out_free:
mdiobus_free(ds->slave_mii_bus);
out:
kfree(ds);
return ERR_PTR(ret);
return ret;
}

static struct dsa_switch *
dsa_switch_setup(struct dsa_switch_tree *dst, int index,
struct device *parent, struct device *host_dev)
{
struct dsa_chip_data *pd = dst->pd->chip + index;
struct dsa_switch_driver *drv;
struct dsa_switch *ds;
int ret;
char *name;

/*
* Probe for switch model.
*/
drv = dsa_switch_probe(host_dev, pd->sw_addr, &name);
if (drv == NULL) {
netdev_err(dst->master_netdev, "[%d]: could not detect attached switch\n",
index);
return ERR_PTR(-EINVAL);
}
netdev_info(dst->master_netdev, "[%d]: detected a %s switch\n",
index, name);


/*
* Allocate and initialise switch state.
*/
ds = kzalloc(sizeof(*ds) + drv->priv_size, GFP_KERNEL);
if (ds == NULL)
return NULL;

ds->dst = dst;
ds->index = index;
ds->pd = pd;
ds->drv = drv;
ds->master_dev = host_dev;

ret = dsa_switch_setup_one(ds, parent);
if (ret)
return NULL;

return ds;
}

static void dsa_switch_destroy(struct dsa_switch *ds)
Expand Down

0 comments on commit df19719

Please sign in to comment.