Commit 4beb0c24 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by David S. Miller

net/prestera: Split devlink and traps registrations to separate routines

Separate devlink registrations and traps registrations so devlink will
be registered when driver is fully initialized.
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1d264db4
...@@ -345,8 +345,6 @@ static struct prestera_trap prestera_trap_items_arr[] = { ...@@ -345,8 +345,6 @@ static struct prestera_trap prestera_trap_items_arr[] = {
}, },
}; };
static void prestera_devlink_traps_fini(struct prestera_switch *sw);
static int prestera_drop_counter_get(struct devlink *devlink, static int prestera_drop_counter_get(struct devlink *devlink,
const struct devlink_trap *trap, const struct devlink_trap *trap,
u64 *p_drops); u64 *p_drops);
...@@ -381,8 +379,6 @@ static int prestera_trap_action_set(struct devlink *devlink, ...@@ -381,8 +379,6 @@ static int prestera_trap_action_set(struct devlink *devlink,
enum devlink_trap_action action, enum devlink_trap_action action,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
static int prestera_devlink_traps_register(struct prestera_switch *sw);
static const struct devlink_ops prestera_dl_ops = { static const struct devlink_ops prestera_dl_ops = {
.info_get = prestera_dl_info_get, .info_get = prestera_dl_info_get,
.trap_init = prestera_trap_init, .trap_init = prestera_trap_init,
...@@ -407,34 +403,18 @@ void prestera_devlink_free(struct prestera_switch *sw) ...@@ -407,34 +403,18 @@ void prestera_devlink_free(struct prestera_switch *sw)
devlink_free(dl); devlink_free(dl);
} }
int prestera_devlink_register(struct prestera_switch *sw) void prestera_devlink_register(struct prestera_switch *sw)
{ {
struct devlink *dl = priv_to_devlink(sw); struct devlink *dl = priv_to_devlink(sw);
int err;
devlink_register(dl); devlink_register(dl);
err = prestera_devlink_traps_register(sw);
if (err) {
devlink_unregister(dl);
dev_err(sw->dev->dev, "devlink_traps_register failed: %d\n",
err);
return err;
}
return 0;
} }
void prestera_devlink_unregister(struct prestera_switch *sw) void prestera_devlink_unregister(struct prestera_switch *sw)
{ {
struct prestera_trap_data *trap_data = sw->trap_data;
struct devlink *dl = priv_to_devlink(sw); struct devlink *dl = priv_to_devlink(sw);
prestera_devlink_traps_fini(sw);
devlink_unregister(dl); devlink_unregister(dl);
kfree(trap_data->trap_items_arr);
kfree(trap_data);
} }
int prestera_devlink_port_register(struct prestera_port *port) int prestera_devlink_port_register(struct prestera_port *port)
...@@ -482,7 +462,7 @@ struct devlink_port *prestera_devlink_get_port(struct net_device *dev) ...@@ -482,7 +462,7 @@ struct devlink_port *prestera_devlink_get_port(struct net_device *dev)
return &port->dl_port; return &port->dl_port;
} }
static int prestera_devlink_traps_register(struct prestera_switch *sw) int prestera_devlink_traps_register(struct prestera_switch *sw)
{ {
const u32 groups_count = ARRAY_SIZE(prestera_trap_groups_arr); const u32 groups_count = ARRAY_SIZE(prestera_trap_groups_arr);
const u32 traps_count = ARRAY_SIZE(prestera_trap_items_arr); const u32 traps_count = ARRAY_SIZE(prestera_trap_items_arr);
...@@ -621,8 +601,9 @@ static int prestera_drop_counter_get(struct devlink *devlink, ...@@ -621,8 +601,9 @@ static int prestera_drop_counter_get(struct devlink *devlink,
cpu_code_type, p_drops); cpu_code_type, p_drops);
} }
static void prestera_devlink_traps_fini(struct prestera_switch *sw) void prestera_devlink_traps_unregister(struct prestera_switch *sw)
{ {
struct prestera_trap_data *trap_data = sw->trap_data;
struct devlink *dl = priv_to_devlink(sw); struct devlink *dl = priv_to_devlink(sw);
const struct devlink_trap *trap; const struct devlink_trap *trap;
int i; int i;
...@@ -634,4 +615,6 @@ static void prestera_devlink_traps_fini(struct prestera_switch *sw) ...@@ -634,4 +615,6 @@ static void prestera_devlink_traps_fini(struct prestera_switch *sw)
devlink_trap_groups_unregister(dl, prestera_trap_groups_arr, devlink_trap_groups_unregister(dl, prestera_trap_groups_arr,
ARRAY_SIZE(prestera_trap_groups_arr)); ARRAY_SIZE(prestera_trap_groups_arr));
kfree(trap_data->trap_items_arr);
kfree(trap_data);
} }
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
struct prestera_switch *prestera_devlink_alloc(struct prestera_device *dev); struct prestera_switch *prestera_devlink_alloc(struct prestera_device *dev);
void prestera_devlink_free(struct prestera_switch *sw); void prestera_devlink_free(struct prestera_switch *sw);
int prestera_devlink_register(struct prestera_switch *sw); void prestera_devlink_register(struct prestera_switch *sw);
void prestera_devlink_unregister(struct prestera_switch *sw); void prestera_devlink_unregister(struct prestera_switch *sw);
int prestera_devlink_port_register(struct prestera_port *port); int prestera_devlink_port_register(struct prestera_port *port);
...@@ -22,5 +22,7 @@ struct devlink_port *prestera_devlink_get_port(struct net_device *dev); ...@@ -22,5 +22,7 @@ struct devlink_port *prestera_devlink_get_port(struct net_device *dev);
void prestera_devlink_trap_report(struct prestera_port *port, void prestera_devlink_trap_report(struct prestera_port *port,
struct sk_buff *skb, u8 cpu_code); struct sk_buff *skb, u8 cpu_code);
int prestera_devlink_traps_register(struct prestera_switch *sw);
void prestera_devlink_traps_unregister(struct prestera_switch *sw);
#endif /* _PRESTERA_DEVLINK_H_ */ #endif /* _PRESTERA_DEVLINK_H_ */
...@@ -851,7 +851,7 @@ static int prestera_switch_init(struct prestera_switch *sw) ...@@ -851,7 +851,7 @@ static int prestera_switch_init(struct prestera_switch *sw)
if (err) if (err)
goto err_span_init; goto err_span_init;
err = prestera_devlink_register(sw); err = prestera_devlink_traps_register(sw);
if (err) if (err)
goto err_dl_register; goto err_dl_register;
...@@ -863,12 +863,13 @@ static int prestera_switch_init(struct prestera_switch *sw) ...@@ -863,12 +863,13 @@ static int prestera_switch_init(struct prestera_switch *sw)
if (err) if (err)
goto err_ports_create; goto err_ports_create;
prestera_devlink_register(sw);
return 0; return 0;
err_ports_create: err_ports_create:
prestera_lag_fini(sw); prestera_lag_fini(sw);
err_lag_init: err_lag_init:
prestera_devlink_unregister(sw); prestera_devlink_traps_unregister(sw);
err_dl_register: err_dl_register:
prestera_span_fini(sw); prestera_span_fini(sw);
err_span_init: err_span_init:
...@@ -888,9 +889,10 @@ static int prestera_switch_init(struct prestera_switch *sw) ...@@ -888,9 +889,10 @@ static int prestera_switch_init(struct prestera_switch *sw)
static void prestera_switch_fini(struct prestera_switch *sw) static void prestera_switch_fini(struct prestera_switch *sw)
{ {
prestera_devlink_unregister(sw);
prestera_destroy_ports(sw); prestera_destroy_ports(sw);
prestera_lag_fini(sw); prestera_lag_fini(sw);
prestera_devlink_unregister(sw); prestera_devlink_traps_unregister(sw);
prestera_span_fini(sw); prestera_span_fini(sw);
prestera_acl_fini(sw); prestera_acl_fini(sw);
prestera_event_handlers_unregister(sw); prestera_event_handlers_unregister(sw);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment