Commit 0c665e2b authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: flower: use the common netdev notifier

Use driver's common notifier for LAG and tunnel configuration.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarJohn Hurley <john.hurley@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3e333590
...@@ -626,17 +626,13 @@ nfp_fl_lag_changels_event(struct nfp_fl_lag *lag, struct net_device *netdev, ...@@ -626,17 +626,13 @@ nfp_fl_lag_changels_event(struct nfp_fl_lag *lag, struct net_device *netdev,
schedule_delayed_work(&lag->work, NFP_FL_LAG_DELAY); schedule_delayed_work(&lag->work, NFP_FL_LAG_DELAY);
} }
static int int nfp_flower_lag_netdev_event(struct nfp_flower_priv *priv,
nfp_fl_lag_netdev_event(struct notifier_block *nb, unsigned long event, struct net_device *netdev,
void *ptr) unsigned long event, void *ptr)
{ {
struct net_device *netdev; struct nfp_fl_lag *lag = &priv->nfp_lag;
struct nfp_fl_lag *lag;
int err; int err;
netdev = netdev_notifier_info_to_dev(ptr);
lag = container_of(nb, struct nfp_fl_lag, lag_nb);
switch (event) { switch (event) {
case NETDEV_CHANGEUPPER: case NETDEV_CHANGEUPPER:
err = nfp_fl_lag_changeupper_event(lag, ptr); err = nfp_fl_lag_changeupper_event(lag, ptr);
...@@ -673,8 +669,6 @@ void nfp_flower_lag_init(struct nfp_fl_lag *lag) ...@@ -673,8 +669,6 @@ void nfp_flower_lag_init(struct nfp_fl_lag *lag)
/* 0 is a reserved batch version so increment to first valid value. */ /* 0 is a reserved batch version so increment to first valid value. */
nfp_fl_increment_version(lag); nfp_fl_increment_version(lag);
lag->lag_nb.notifier_call = nfp_fl_lag_netdev_event;
} }
void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag) void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag)
......
...@@ -661,23 +661,30 @@ static int nfp_flower_start(struct nfp_app *app) ...@@ -661,23 +661,30 @@ static int nfp_flower_start(struct nfp_app *app)
err = nfp_flower_lag_reset(&app_priv->nfp_lag); err = nfp_flower_lag_reset(&app_priv->nfp_lag);
if (err) if (err)
return err; return err;
err = register_netdevice_notifier(&app_priv->nfp_lag.lag_nb);
if (err)
return err;
} }
return nfp_tunnel_config_start(app); return nfp_tunnel_config_start(app);
} }
static void nfp_flower_stop(struct nfp_app *app) static void nfp_flower_stop(struct nfp_app *app)
{
nfp_tunnel_config_stop(app);
}
static int
nfp_flower_netdev_event(struct nfp_app *app, struct net_device *netdev,
unsigned long event, void *ptr)
{ {
struct nfp_flower_priv *app_priv = app->priv; struct nfp_flower_priv *app_priv = app->priv;
int ret;
if (app_priv->flower_ext_feats & NFP_FL_FEATS_LAG) if (app_priv->flower_ext_feats & NFP_FL_FEATS_LAG) {
unregister_netdevice_notifier(&app_priv->nfp_lag.lag_nb); ret = nfp_flower_lag_netdev_event(app_priv, netdev, event, ptr);
if (ret & NOTIFY_STOP_MASK)
return ret;
}
nfp_tunnel_config_stop(app); return nfp_tunnel_mac_event_handler(app, netdev, event, ptr);
} }
const struct nfp_app_type app_flower = { const struct nfp_app_type app_flower = {
...@@ -708,6 +715,8 @@ const struct nfp_app_type app_flower = { ...@@ -708,6 +715,8 @@ const struct nfp_app_type app_flower = {
.start = nfp_flower_start, .start = nfp_flower_start,
.stop = nfp_flower_stop, .stop = nfp_flower_stop,
.netdev_event = nfp_flower_netdev_event,
.ctrl_msg_rx = nfp_flower_cmsg_rx, .ctrl_msg_rx = nfp_flower_cmsg_rx,
.sriov_enable = nfp_flower_sriov_enable, .sriov_enable = nfp_flower_sriov_enable,
......
...@@ -72,7 +72,6 @@ struct nfp_mtu_conf { ...@@ -72,7 +72,6 @@ struct nfp_mtu_conf {
/** /**
* struct nfp_fl_lag - Flower APP priv data for link aggregation * struct nfp_fl_lag - Flower APP priv data for link aggregation
* @lag_nb: Notifier to track master/slave events
* @work: Work queue for writing configs to the HW * @work: Work queue for writing configs to the HW
* @lock: Lock to protect lag_group_list * @lock: Lock to protect lag_group_list
* @group_list: List of all master/slave groups offloaded * @group_list: List of all master/slave groups offloaded
...@@ -85,7 +84,6 @@ struct nfp_mtu_conf { ...@@ -85,7 +84,6 @@ struct nfp_mtu_conf {
* retransmission * retransmission
*/ */
struct nfp_fl_lag { struct nfp_fl_lag {
struct notifier_block lag_nb;
struct delayed_work work; struct delayed_work work;
struct mutex lock; struct mutex lock;
struct list_head group_list; struct list_head group_list;
...@@ -126,7 +124,6 @@ struct nfp_fl_lag { ...@@ -126,7 +124,6 @@ struct nfp_fl_lag {
* @nfp_neigh_off_lock: Lock for the neighbour address list * @nfp_neigh_off_lock: Lock for the neighbour address list
* @nfp_mac_off_ids: IDA to manage id assignment for offloaded macs * @nfp_mac_off_ids: IDA to manage id assignment for offloaded macs
* @nfp_mac_off_count: Number of MACs in address list * @nfp_mac_off_count: Number of MACs in address list
* @nfp_tun_mac_nb: Notifier to monitor link state
* @nfp_tun_neigh_nb: Notifier to monitor neighbour state * @nfp_tun_neigh_nb: Notifier to monitor neighbour state
* @reify_replies: atomically stores the number of replies received * @reify_replies: atomically stores the number of replies received
* from firmware for repr reify * from firmware for repr reify
...@@ -160,7 +157,6 @@ struct nfp_flower_priv { ...@@ -160,7 +157,6 @@ struct nfp_flower_priv {
spinlock_t nfp_neigh_off_lock; spinlock_t nfp_neigh_off_lock;
struct ida nfp_mac_off_ids; struct ida nfp_mac_off_ids;
int nfp_mac_off_count; int nfp_mac_off_count;
struct notifier_block nfp_tun_mac_nb;
struct notifier_block nfp_tun_neigh_nb; struct notifier_block nfp_tun_neigh_nb;
atomic_t reify_replies; atomic_t reify_replies;
wait_queue_head_t reify_wait_queue; wait_queue_head_t reify_wait_queue;
...@@ -252,6 +248,9 @@ void nfp_flower_rx_flow_stats(struct nfp_app *app, struct sk_buff *skb); ...@@ -252,6 +248,9 @@ void nfp_flower_rx_flow_stats(struct nfp_app *app, struct sk_buff *skb);
int nfp_tunnel_config_start(struct nfp_app *app); int nfp_tunnel_config_start(struct nfp_app *app);
void nfp_tunnel_config_stop(struct nfp_app *app); void nfp_tunnel_config_stop(struct nfp_app *app);
int nfp_tunnel_mac_event_handler(struct nfp_app *app,
struct net_device *netdev,
unsigned long event, void *ptr);
void nfp_tunnel_write_macs(struct nfp_app *app); void nfp_tunnel_write_macs(struct nfp_app *app);
void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4); void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4); void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
...@@ -262,6 +261,9 @@ int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data, ...@@ -262,6 +261,9 @@ int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
void nfp_flower_lag_init(struct nfp_fl_lag *lag); void nfp_flower_lag_init(struct nfp_fl_lag *lag);
void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag); void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag);
int nfp_flower_lag_reset(struct nfp_fl_lag *lag); int nfp_flower_lag_reset(struct nfp_fl_lag *lag);
int nfp_flower_lag_netdev_event(struct nfp_flower_priv *priv,
struct net_device *netdev,
unsigned long event, void *ptr);
bool nfp_flower_lag_unprocessed_msg(struct nfp_app *app, struct sk_buff *skb); bool nfp_flower_lag_unprocessed_msg(struct nfp_app *app, struct sk_buff *skb);
int nfp_flower_lag_populate_pre_action(struct nfp_app *app, int nfp_flower_lag_populate_pre_action(struct nfp_app *app,
struct net_device *master, struct net_device *master,
......
...@@ -652,29 +652,16 @@ static void nfp_tun_add_to_mac_offload_list(struct net_device *netdev, ...@@ -652,29 +652,16 @@ static void nfp_tun_add_to_mac_offload_list(struct net_device *netdev,
mutex_unlock(&priv->nfp_mac_off_lock); mutex_unlock(&priv->nfp_mac_off_lock);
} }
static int nfp_tun_mac_event_handler(struct notifier_block *nb, int nfp_tunnel_mac_event_handler(struct nfp_app *app,
unsigned long event, void *ptr) struct net_device *netdev,
unsigned long event, void *ptr)
{ {
struct nfp_flower_priv *app_priv;
struct net_device *netdev;
struct nfp_app *app;
if (event == NETDEV_DOWN || event == NETDEV_UNREGISTER) { if (event == NETDEV_DOWN || event == NETDEV_UNREGISTER) {
app_priv = container_of(nb, struct nfp_flower_priv,
nfp_tun_mac_nb);
app = app_priv->app;
netdev = netdev_notifier_info_to_dev(ptr);
/* If non-nfp netdev then free its offload index. */ /* If non-nfp netdev then free its offload index. */
if (nfp_tun_is_netdev_to_offload(netdev)) if (nfp_tun_is_netdev_to_offload(netdev))
nfp_tun_del_mac_idx(app, netdev->ifindex); nfp_tun_del_mac_idx(app, netdev->ifindex);
} else if (event == NETDEV_UP || event == NETDEV_CHANGEADDR || } else if (event == NETDEV_UP || event == NETDEV_CHANGEADDR ||
event == NETDEV_REGISTER) { event == NETDEV_REGISTER) {
app_priv = container_of(nb, struct nfp_flower_priv,
nfp_tun_mac_nb);
app = app_priv->app;
netdev = netdev_notifier_info_to_dev(ptr);
nfp_tun_add_to_mac_offload_list(netdev, app); nfp_tun_add_to_mac_offload_list(netdev, app);
/* Force a list write to keep NFP up to date. */ /* Force a list write to keep NFP up to date. */
...@@ -686,13 +673,11 @@ static int nfp_tun_mac_event_handler(struct notifier_block *nb, ...@@ -686,13 +673,11 @@ static int nfp_tun_mac_event_handler(struct notifier_block *nb,
int nfp_tunnel_config_start(struct nfp_app *app) int nfp_tunnel_config_start(struct nfp_app *app)
{ {
struct nfp_flower_priv *priv = app->priv; struct nfp_flower_priv *priv = app->priv;
int err;
/* Initialise priv data for MAC offloading. */ /* Initialise priv data for MAC offloading. */
priv->nfp_mac_off_count = 0; priv->nfp_mac_off_count = 0;
mutex_init(&priv->nfp_mac_off_lock); mutex_init(&priv->nfp_mac_off_lock);
INIT_LIST_HEAD(&priv->nfp_mac_off_list); INIT_LIST_HEAD(&priv->nfp_mac_off_list);
priv->nfp_tun_mac_nb.notifier_call = nfp_tun_mac_event_handler;
mutex_init(&priv->nfp_mac_index_lock); mutex_init(&priv->nfp_mac_index_lock);
INIT_LIST_HEAD(&priv->nfp_mac_index_list); INIT_LIST_HEAD(&priv->nfp_mac_index_list);
ida_init(&priv->nfp_mac_off_ids); ida_init(&priv->nfp_mac_off_ids);
...@@ -706,21 +691,7 @@ int nfp_tunnel_config_start(struct nfp_app *app) ...@@ -706,21 +691,7 @@ int nfp_tunnel_config_start(struct nfp_app *app)
INIT_LIST_HEAD(&priv->nfp_neigh_off_list); INIT_LIST_HEAD(&priv->nfp_neigh_off_list);
priv->nfp_tun_neigh_nb.notifier_call = nfp_tun_neigh_event_handler; priv->nfp_tun_neigh_nb.notifier_call = nfp_tun_neigh_event_handler;
err = register_netdevice_notifier(&priv->nfp_tun_mac_nb); return register_netevent_notifier(&priv->nfp_tun_neigh_nb);
if (err)
goto err_free_mac_ida;
err = register_netevent_notifier(&priv->nfp_tun_neigh_nb);
if (err)
goto err_unreg_mac_nb;
return 0;
err_unreg_mac_nb:
unregister_netdevice_notifier(&priv->nfp_tun_mac_nb);
err_free_mac_ida:
ida_destroy(&priv->nfp_mac_off_ids);
return err;
} }
void nfp_tunnel_config_stop(struct nfp_app *app) void nfp_tunnel_config_stop(struct nfp_app *app)
...@@ -732,7 +703,6 @@ void nfp_tunnel_config_stop(struct nfp_app *app) ...@@ -732,7 +703,6 @@ void nfp_tunnel_config_stop(struct nfp_app *app)
struct nfp_ipv4_addr_entry *ip_entry; struct nfp_ipv4_addr_entry *ip_entry;
struct list_head *ptr, *storage; struct list_head *ptr, *storage;
unregister_netdevice_notifier(&priv->nfp_tun_mac_nb);
unregister_netevent_notifier(&priv->nfp_tun_neigh_nb); unregister_netevent_notifier(&priv->nfp_tun_neigh_nb);
/* Free any memory that may be occupied by MAC list. */ /* Free any memory that may be occupied by MAC list. */
......
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