forked from Minki/linux
net: ethernet: ocelot: remove the need for num_stats initializer
There is a desire to share the oclot_stats_layout struct outside of the current vsc7514 driver. In order to do so, the length of the array needs to be known at compile time, and defined in the struct ocelot and struct felix_info. Since the array is defined in a .c file and would be declared in the header file via: extern struct ocelot_stat_layout[]; the size of the array will not be known at compile time to outside modules. To fix this, remove the need for defining the number of stats at compile time and allow this number to be determined at initialization. Signed-off-by: Colin Foster <colin.foster@in-advantage.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
783d108dd7
commit
2f187bfa6f
@ -1197,7 +1197,6 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports)
|
||||
|
||||
ocelot->map = felix->info->map;
|
||||
ocelot->stats_layout = felix->info->stats_layout;
|
||||
ocelot->num_stats = felix->info->num_stats;
|
||||
ocelot->num_mact_rows = felix->info->num_mact_rows;
|
||||
ocelot->vcap = felix->info->vcap;
|
||||
ocelot->vcap_pol.base = felix->info->vcap_pol_base;
|
||||
|
@ -24,7 +24,6 @@ struct felix_info {
|
||||
const u32 *port_modes;
|
||||
int num_mact_rows;
|
||||
const struct ocelot_stat_layout *stats_layout;
|
||||
unsigned int num_stats;
|
||||
int num_ports;
|
||||
int num_tx_queues;
|
||||
struct vcap_props *vcap;
|
||||
|
@ -638,6 +638,7 @@ static const struct ocelot_stat_layout vsc9959_stats_layout[] = {
|
||||
{ .offset = 0x10F, .name = "drop_green_prio_5", },
|
||||
{ .offset = 0x110, .name = "drop_green_prio_6", },
|
||||
{ .offset = 0x111, .name = "drop_green_prio_7", },
|
||||
OCELOT_STAT_END
|
||||
};
|
||||
|
||||
static const struct vcap_field vsc9959_vcap_es0_keys[] = {
|
||||
@ -2216,7 +2217,6 @@ static const struct felix_info felix_info_vsc9959 = {
|
||||
.map = vsc9959_regmap,
|
||||
.ops = &vsc9959_ops,
|
||||
.stats_layout = vsc9959_stats_layout,
|
||||
.num_stats = ARRAY_SIZE(vsc9959_stats_layout),
|
||||
.vcap = vsc9959_vcap_props,
|
||||
.vcap_pol_base = VSC9959_VCAP_POLICER_BASE,
|
||||
.vcap_pol_max = VSC9959_VCAP_POLICER_MAX,
|
||||
|
@ -636,6 +636,7 @@ static const struct ocelot_stat_layout vsc9953_stats_layout[] = {
|
||||
{ .offset = 0x8F, .name = "drop_green_prio_5", },
|
||||
{ .offset = 0x90, .name = "drop_green_prio_6", },
|
||||
{ .offset = 0x91, .name = "drop_green_prio_7", },
|
||||
OCELOT_STAT_END
|
||||
};
|
||||
|
||||
static const struct vcap_field vsc9953_vcap_es0_keys[] = {
|
||||
@ -1086,7 +1087,6 @@ static const struct felix_info seville_info_vsc9953 = {
|
||||
.map = vsc9953_regmap,
|
||||
.ops = &vsc9953_ops,
|
||||
.stats_layout = vsc9953_stats_layout,
|
||||
.num_stats = ARRAY_SIZE(vsc9953_stats_layout),
|
||||
.vcap = vsc9953_vcap_props,
|
||||
.vcap_pol_base = VSC9953_VCAP_POLICER_BASE,
|
||||
.vcap_pol_max = VSC9953_VCAP_POLICER_MAX,
|
||||
|
@ -3228,6 +3228,7 @@ static void ocelot_detect_features(struct ocelot *ocelot)
|
||||
|
||||
int ocelot_init(struct ocelot *ocelot)
|
||||
{
|
||||
const struct ocelot_stat_layout *stat;
|
||||
char queue_name[32];
|
||||
int i, ret;
|
||||
u32 port;
|
||||
@ -3240,6 +3241,10 @@ int ocelot_init(struct ocelot *ocelot)
|
||||
}
|
||||
}
|
||||
|
||||
ocelot->num_stats = 0;
|
||||
for_each_stat(ocelot, stat)
|
||||
ocelot->num_stats++;
|
||||
|
||||
ocelot->stats = devm_kcalloc(ocelot->dev,
|
||||
ocelot->num_phys_ports * ocelot->num_stats,
|
||||
sizeof(u64), GFP_KERNEL);
|
||||
|
@ -190,6 +190,7 @@ static const struct ocelot_stat_layout ocelot_stats_layout[] = {
|
||||
{ .name = "drop_green_prio_5", .offset = 0x8F, },
|
||||
{ .name = "drop_green_prio_6", .offset = 0x90, },
|
||||
{ .name = "drop_green_prio_7", .offset = 0x91, },
|
||||
OCELOT_STAT_END
|
||||
};
|
||||
|
||||
static void ocelot_pll5_init(struct ocelot *ocelot)
|
||||
@ -227,7 +228,6 @@ static int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops)
|
||||
|
||||
ocelot->map = ocelot_regmap;
|
||||
ocelot->stats_layout = ocelot_stats_layout;
|
||||
ocelot->num_stats = ARRAY_SIZE(ocelot_stats_layout);
|
||||
ocelot->num_mact_rows = 1024;
|
||||
ocelot->ops = ops;
|
||||
|
||||
|
@ -105,6 +105,13 @@
|
||||
#define REG_RESERVED_ADDR 0xffffffff
|
||||
#define REG_RESERVED(reg) REG(reg, REG_RESERVED_ADDR)
|
||||
|
||||
#define OCELOT_STAT_FLAG_END BIT(0)
|
||||
|
||||
#define for_each_stat(ocelot, stat) \
|
||||
for ((stat) = ocelot->stats_layout; \
|
||||
!((stat)->flags & OCELOT_STAT_FLAG_END); \
|
||||
(stat)++)
|
||||
|
||||
enum ocelot_target {
|
||||
ANA = 1,
|
||||
QS,
|
||||
@ -535,9 +542,12 @@ enum ocelot_ptp_pins {
|
||||
|
||||
struct ocelot_stat_layout {
|
||||
u32 offset;
|
||||
u32 flags;
|
||||
char name[ETH_GSTRING_LEN];
|
||||
};
|
||||
|
||||
#define OCELOT_STAT_END { .flags = OCELOT_STAT_FLAG_END }
|
||||
|
||||
struct ocelot_stats_region {
|
||||
struct list_head node;
|
||||
u32 offset;
|
||||
|
Loading…
Reference in New Issue
Block a user