hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/net/ethernet/rocker/rocker_ofdpa.c
....@@ -1,13 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * drivers/net/ethernet/rocker/rocker_ofdpa.c - Rocker switch OF-DPA-like
34 * implementation
45 * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
56 * Copyright (c) 2014-2016 Jiri Pirko <jiri@mellanox.com>
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License as published by
9
- * the Free Software Foundation; either version 2 of the License, or
10
- * (at your option) any later version.
117 */
128
139 #include <linux/kernel.h>
....@@ -22,6 +18,7 @@
2218 #include <net/neighbour.h>
2319 #include <net/switchdev.h>
2420 #include <net/ip_fib.h>
21
+#include <net/nexthop.h>
2522 #include <net/arp.h>
2623
2724 #include "rocker.h"
....@@ -1276,7 +1273,7 @@
12761273 bool removing;
12771274 int err = 0;
12781275
1279
- entry = kzalloc(sizeof(*entry), GFP_KERNEL);
1276
+ entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
12801277 if (!entry)
12811278 return -ENOMEM;
12821279
....@@ -1833,10 +1830,10 @@
18331830 rtnl_lock();
18341831 if (learned && removing)
18351832 call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE,
1836
- lw->ofdpa_port->dev, &info.info);
1833
+ lw->ofdpa_port->dev, &info.info, NULL);
18371834 else if (learned && !removing)
18381835 call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE,
1839
- lw->ofdpa_port->dev, &info.info);
1836
+ lw->ofdpa_port->dev, &info.info, NULL);
18401837 rtnl_unlock();
18411838
18421839 kfree(work);
....@@ -2286,13 +2283,13 @@
22862283
22872284 /* XXX support ECMP */
22882285
2289
- nh = fi->fib_nh;
2290
- nh_on_port = (fi->fib_dev == ofdpa_port->dev);
2291
- has_gw = !!nh->nh_gw;
2286
+ nh = fib_info_nh(fi, 0);
2287
+ nh_on_port = (nh->fib_nh_dev == ofdpa_port->dev);
2288
+ has_gw = !!nh->fib_nh_gw4;
22922289
22932290 if (has_gw && nh_on_port) {
22942291 err = ofdpa_port_ipv4_nh(ofdpa_port, flags,
2295
- nh->nh_gw, &index);
2292
+ nh->fib_nh_gw4, &index);
22962293 if (err)
22972294 return err;
22982295
....@@ -2509,16 +2506,6 @@
25092506 ofdpa_port->brport_flags = orig_flags;
25102507
25112508 return err;
2512
-}
2513
-
2514
-static int
2515
-ofdpa_port_attr_bridge_flags_get(const struct rocker_port *rocker_port,
2516
- unsigned long *p_brport_flags)
2517
-{
2518
- const struct ofdpa_port *ofdpa_port = rocker_port->wpriv;
2519
-
2520
- *p_brport_flags = ofdpa_port->brport_flags;
2521
- return 0;
25222509 }
25232510
25242511 static int
....@@ -2747,11 +2734,13 @@
27472734 {
27482735 struct ofdpa *ofdpa = rocker->wpriv;
27492736 struct ofdpa_port *ofdpa_port;
2737
+ struct fib_nh *nh;
27502738 int err;
27512739
27522740 if (ofdpa->fib_aborted)
27532741 return 0;
2754
- ofdpa_port = ofdpa_port_dev_lower_find(fen_info->fi->fib_dev, rocker);
2742
+ nh = fib_info_nh(fen_info->fi, 0);
2743
+ ofdpa_port = ofdpa_port_dev_lower_find(nh->fib_nh_dev, rocker);
27552744 if (!ofdpa_port)
27562745 return 0;
27572746 err = ofdpa_port_fib_ipv4(ofdpa_port, htonl(fen_info->dst),
....@@ -2759,7 +2748,7 @@
27592748 fen_info->tb_id, 0);
27602749 if (err)
27612750 return err;
2762
- fen_info->fi->fib_nh->nh_flags |= RTNH_F_OFFLOAD;
2751
+ nh->fib_nh_flags |= RTNH_F_OFFLOAD;
27632752 return 0;
27642753 }
27652754
....@@ -2768,13 +2757,15 @@
27682757 {
27692758 struct ofdpa *ofdpa = rocker->wpriv;
27702759 struct ofdpa_port *ofdpa_port;
2760
+ struct fib_nh *nh;
27712761
27722762 if (ofdpa->fib_aborted)
27732763 return 0;
2774
- ofdpa_port = ofdpa_port_dev_lower_find(fen_info->fi->fib_dev, rocker);
2764
+ nh = fib_info_nh(fen_info->fi, 0);
2765
+ ofdpa_port = ofdpa_port_dev_lower_find(nh->fib_nh_dev, rocker);
27752766 if (!ofdpa_port)
27762767 return 0;
2777
- fen_info->fi->fib_nh->nh_flags &= ~RTNH_F_OFFLOAD;
2768
+ nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
27782769 return ofdpa_port_fib_ipv4(ofdpa_port, htonl(fen_info->dst),
27792770 fen_info->dst_len, fen_info->fi,
27802771 fen_info->tb_id, OFDPA_OP_FLAG_REMOVE);
....@@ -2794,15 +2785,18 @@
27942785
27952786 spin_lock_irqsave(&ofdpa->flow_tbl_lock, flags);
27962787 hash_for_each_safe(ofdpa->flow_tbl, bkt, tmp, flow_entry, entry) {
2788
+ struct fib_nh *nh;
2789
+
27972790 if (flow_entry->key.tbl_id !=
27982791 ROCKER_OF_DPA_TABLE_ID_UNICAST_ROUTING)
27992792 continue;
2800
- ofdpa_port = ofdpa_port_dev_lower_find(flow_entry->fi->fib_dev,
2801
- rocker);
2793
+ nh = fib_info_nh(flow_entry->fi, 0);
2794
+ ofdpa_port = ofdpa_port_dev_lower_find(nh->fib_nh_dev, rocker);
28022795 if (!ofdpa_port)
28032796 continue;
2804
- flow_entry->fi->fib_nh->nh_flags &= ~RTNH_F_OFFLOAD;
2805
- ofdpa_flow_tbl_del(ofdpa_port, OFDPA_OP_FLAG_REMOVE,
2797
+ nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
2798
+ ofdpa_flow_tbl_del(ofdpa_port,
2799
+ OFDPA_OP_FLAG_REMOVE | OFDPA_OP_FLAG_NOWAIT,
28062800 flow_entry);
28072801 }
28082802 spin_unlock_irqrestore(&ofdpa->flow_tbl_lock, flags);
....@@ -2823,7 +2817,6 @@
28232817 .port_stop = ofdpa_port_stop,
28242818 .port_attr_stp_state_set = ofdpa_port_attr_stp_state_set,
28252819 .port_attr_bridge_flags_set = ofdpa_port_attr_bridge_flags_set,
2826
- .port_attr_bridge_flags_get = ofdpa_port_attr_bridge_flags_get,
28272820 .port_attr_bridge_flags_support_get = ofdpa_port_attr_bridge_flags_support_get,
28282821 .port_attr_bridge_ageing_time_set = ofdpa_port_attr_bridge_ageing_time_set,
28292822 .port_obj_vlan_add = ofdpa_port_obj_vlan_add,