Skip to content

Commit

Permalink
net: dsa: hellcreek: Report VLAN table occupancy
Browse files Browse the repository at this point in the history
The VLAN membership configuration is cached in software already. So, it can be
reported via devlink. Add support for it:

|root@tsn:~# devlink resource show platform/ff240000.switch
|platform/ff240000.switch:
|  name VLAN size 4096 occ 4 unit entry dpipe_tables none

Signed-off-by: Kurt Kanzenbach <kurt@kmk-computers.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Kurt Kanzenbach authored and Jakub Kicinski committed Feb 2, 2021
1 parent 14e8e0f commit 7f976d5
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
59 changes: 59 additions & 0 deletions drivers/net/dsa/hirschmann/hellcreek.c
Original file line number Diff line number Diff line change
Expand Up @@ -1000,6 +1000,51 @@ static int hellcreek_setup_fdb(struct hellcreek *hellcreek)
return ret;
}

static u64 hellcreek_devlink_vlan_table_get(void *priv)
{
struct hellcreek *hellcreek = priv;
u64 count = 0;
int i;

mutex_lock(&hellcreek->reg_lock);
for (i = 0; i < VLAN_N_VID; ++i)
if (hellcreek->vidmbrcfg[i])
count++;
mutex_unlock(&hellcreek->reg_lock);

return count;
}

static int hellcreek_setup_devlink_resources(struct dsa_switch *ds)
{
struct devlink_resource_size_params size_params;
struct hellcreek *hellcreek = ds->priv;
int err;

devlink_resource_size_params_init(&size_params, VLAN_N_VID,
VLAN_N_VID,
1, DEVLINK_RESOURCE_UNIT_ENTRY);

err = dsa_devlink_resource_register(ds, "VLAN", VLAN_N_VID,
HELLCREEK_DEVLINK_PARAM_ID_VLAN_TABLE,
DEVLINK_RESOURCE_ID_PARENT_TOP,
&size_params);
if (err)
goto out;

dsa_devlink_resource_occ_get_register(ds,
HELLCREEK_DEVLINK_PARAM_ID_VLAN_TABLE,
hellcreek_devlink_vlan_table_get,
hellcreek);

return 0;

out:
dsa_devlink_resources_unregister(ds);

return err;
}

static int hellcreek_setup(struct dsa_switch *ds)
{
struct hellcreek *hellcreek = ds->priv;
Expand Down Expand Up @@ -1053,9 +1098,22 @@ static int hellcreek_setup(struct dsa_switch *ds)
return ret;
}

/* Register devlink resources with DSA */
ret = hellcreek_setup_devlink_resources(ds);
if (ret) {
dev_err(hellcreek->dev,
"Failed to setup devlink resources!\n");
return ret;
}

return 0;
}

static void hellcreek_teardown(struct dsa_switch *ds)
{
dsa_devlink_resources_unregister(ds);
}

static void hellcreek_phylink_validate(struct dsa_switch *ds, int port,
unsigned long *supported,
struct phylink_link_state *state)
Expand Down Expand Up @@ -1447,6 +1505,7 @@ static const struct dsa_switch_ops hellcreek_ds_ops = {
.port_vlan_del = hellcreek_vlan_del,
.port_vlan_filtering = hellcreek_vlan_filtering,
.setup = hellcreek_setup,
.teardown = hellcreek_teardown,
};

static int hellcreek_probe(struct platform_device *pdev)
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/dsa/hirschmann/hellcreek.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,4 +298,9 @@ struct hellcreek {
#define dw_to_hellcreek_port(dw) \
container_of(dw, struct hellcreek_port, schedule_work)

/* Devlink resources */
enum hellcreek_devlink_resource_id {
HELLCREEK_DEVLINK_PARAM_ID_VLAN_TABLE,
};

#endif /* _HELLCREEK_H_ */

0 comments on commit 7f976d5

Please sign in to comment.