]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / drivers / net / ethernet / mellanox / mlxsw / spectrum_switchdev.c
1 /*
2  * drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
3  * Copyright (c) 2015 Mellanox Technologies. All rights reserved.
4  * Copyright (c) 2015 Jiri Pirko <jiri@mellanox.com>
5  * Copyright (c) 2015 Ido Schimmel <idosch@mellanox.com>
6  * Copyright (c) 2015 Elad Raz <eladr@mellanox.com>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the names of the copyright holders nor the names of its
17  *    contributors may be used to endorse or promote products derived from
18  *    this software without specific prior written permission.
19  *
20  * Alternatively, this software may be distributed under the terms of the
21  * GNU General Public License ("GPL") version 2 as published by the Free
22  * Software Foundation.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36
37 #include <linux/kernel.h>
38 #include <linux/types.h>
39 #include <linux/netdevice.h>
40 #include <linux/etherdevice.h>
41 #include <linux/slab.h>
42 #include <linux/device.h>
43 #include <linux/skbuff.h>
44 #include <linux/if_vlan.h>
45 #include <linux/if_bridge.h>
46 #include <linux/workqueue.h>
47 #include <linux/jiffies.h>
48 #include <linux/rtnetlink.h>
49 #include <net/switchdev.h>
50
51 #include "spectrum.h"
52 #include "core.h"
53 #include "reg.h"
54
55 struct mlxsw_sp_bridge_ops;
56
57 struct mlxsw_sp_bridge {
58         struct mlxsw_sp *mlxsw_sp;
59         struct {
60                 struct delayed_work dw;
61 #define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100
62                 unsigned int interval; /* ms */
63         } fdb_notify;
64 #define MLXSW_SP_MIN_AGEING_TIME 10
65 #define MLXSW_SP_MAX_AGEING_TIME 1000000
66 #define MLXSW_SP_DEFAULT_AGEING_TIME 300
67         u32 ageing_time;
68         bool vlan_enabled_exists;
69         struct list_head bridges_list;
70         struct list_head mids_list;
71         DECLARE_BITMAP(mids_bitmap, MLXSW_SP_MID_MAX);
72         const struct mlxsw_sp_bridge_ops *bridge_8021q_ops;
73         const struct mlxsw_sp_bridge_ops *bridge_8021d_ops;
74 };
75
76 struct mlxsw_sp_bridge_device {
77         struct net_device *dev;
78         struct list_head list;
79         struct list_head ports_list;
80         u8 vlan_enabled:1,
81            multicast_enabled:1;
82         const struct mlxsw_sp_bridge_ops *ops;
83 };
84
85 struct mlxsw_sp_bridge_port {
86         struct net_device *dev;
87         struct mlxsw_sp_bridge_device *bridge_device;
88         struct list_head list;
89         struct list_head vlans_list;
90         unsigned int ref_count;
91         u8 stp_state;
92         unsigned long flags;
93         bool mrouter;
94         bool lagged;
95         union {
96                 u16 lag_id;
97                 u16 system_port;
98         };
99 };
100
101 struct mlxsw_sp_bridge_vlan {
102         struct list_head list;
103         struct list_head port_vlan_list;
104         u16 vid;
105 };
106
107 struct mlxsw_sp_bridge_ops {
108         int (*port_join)(struct mlxsw_sp_bridge_device *bridge_device,
109                          struct mlxsw_sp_bridge_port *bridge_port,
110                          struct mlxsw_sp_port *mlxsw_sp_port);
111         void (*port_leave)(struct mlxsw_sp_bridge_device *bridge_device,
112                            struct mlxsw_sp_bridge_port *bridge_port,
113                            struct mlxsw_sp_port *mlxsw_sp_port);
114         struct mlxsw_sp_fid *
115                 (*fid_get)(struct mlxsw_sp_bridge_device *bridge_device,
116                            u16 vid);
117 };
118
119 static int
120 mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
121                                struct mlxsw_sp_bridge_port *bridge_port,
122                                u16 fid_index);
123
124 static struct mlxsw_sp_bridge_device *
125 mlxsw_sp_bridge_device_find(const struct mlxsw_sp_bridge *bridge,
126                             const struct net_device *br_dev)
127 {
128         struct mlxsw_sp_bridge_device *bridge_device;
129
130         list_for_each_entry(bridge_device, &bridge->bridges_list, list)
131                 if (bridge_device->dev == br_dev)
132                         return bridge_device;
133
134         return NULL;
135 }
136
137 static struct mlxsw_sp_bridge_device *
138 mlxsw_sp_bridge_device_create(struct mlxsw_sp_bridge *bridge,
139                               struct net_device *br_dev)
140 {
141         struct device *dev = bridge->mlxsw_sp->bus_info->dev;
142         struct mlxsw_sp_bridge_device *bridge_device;
143         bool vlan_enabled = br_vlan_enabled(br_dev);
144
145         if (vlan_enabled && bridge->vlan_enabled_exists) {
146                 dev_err(dev, "Only one VLAN-aware bridge is supported\n");
147                 return ERR_PTR(-EINVAL);
148         }
149
150         bridge_device = kzalloc(sizeof(*bridge_device), GFP_KERNEL);
151         if (!bridge_device)
152                 return ERR_PTR(-ENOMEM);
153
154         bridge_device->dev = br_dev;
155         bridge_device->vlan_enabled = vlan_enabled;
156         bridge_device->multicast_enabled = br_multicast_enabled(br_dev);
157         INIT_LIST_HEAD(&bridge_device->ports_list);
158         if (vlan_enabled) {
159                 bridge->vlan_enabled_exists = true;
160                 bridge_device->ops = bridge->bridge_8021q_ops;
161         } else {
162                 bridge_device->ops = bridge->bridge_8021d_ops;
163         }
164         list_add(&bridge_device->list, &bridge->bridges_list);
165
166         return bridge_device;
167 }
168
169 static void
170 mlxsw_sp_bridge_device_destroy(struct mlxsw_sp_bridge *bridge,
171                                struct mlxsw_sp_bridge_device *bridge_device)
172 {
173         list_del(&bridge_device->list);
174         if (bridge_device->vlan_enabled)
175                 bridge->vlan_enabled_exists = false;
176         WARN_ON(!list_empty(&bridge_device->ports_list));
177         kfree(bridge_device);
178 }
179
180 static struct mlxsw_sp_bridge_device *
181 mlxsw_sp_bridge_device_get(struct mlxsw_sp_bridge *bridge,
182                            struct net_device *br_dev)
183 {
184         struct mlxsw_sp_bridge_device *bridge_device;
185
186         bridge_device = mlxsw_sp_bridge_device_find(bridge, br_dev);
187         if (bridge_device)
188                 return bridge_device;
189
190         return mlxsw_sp_bridge_device_create(bridge, br_dev);
191 }
192
193 static void
194 mlxsw_sp_bridge_device_put(struct mlxsw_sp_bridge *bridge,
195                            struct mlxsw_sp_bridge_device *bridge_device)
196 {
197         if (list_empty(&bridge_device->ports_list))
198                 mlxsw_sp_bridge_device_destroy(bridge, bridge_device);
199 }
200
201 static struct mlxsw_sp_bridge_port *
202 __mlxsw_sp_bridge_port_find(const struct mlxsw_sp_bridge_device *bridge_device,
203                             const struct net_device *brport_dev)
204 {
205         struct mlxsw_sp_bridge_port *bridge_port;
206
207         list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
208                 if (bridge_port->dev == brport_dev)
209                         return bridge_port;
210         }
211
212         return NULL;
213 }
214
215 static struct mlxsw_sp_bridge_port *
216 mlxsw_sp_bridge_port_find(struct mlxsw_sp_bridge *bridge,
217                           struct net_device *brport_dev)
218 {
219         struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
220         struct mlxsw_sp_bridge_device *bridge_device;
221
222         if (!br_dev)
223                 return NULL;
224
225         bridge_device = mlxsw_sp_bridge_device_find(bridge, br_dev);
226         if (!bridge_device)
227                 return NULL;
228
229         return __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
230 }
231
232 static struct mlxsw_sp_bridge_port *
233 mlxsw_sp_bridge_port_create(struct mlxsw_sp_bridge_device *bridge_device,
234                             struct net_device *brport_dev)
235 {
236         struct mlxsw_sp_bridge_port *bridge_port;
237         struct mlxsw_sp_port *mlxsw_sp_port;
238
239         bridge_port = kzalloc(sizeof(*bridge_port), GFP_KERNEL);
240         if (!bridge_port)
241                 return NULL;
242
243         mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(brport_dev);
244         bridge_port->lagged = mlxsw_sp_port->lagged;
245         if (bridge_port->lagged)
246                 bridge_port->lag_id = mlxsw_sp_port->lag_id;
247         else
248                 bridge_port->system_port = mlxsw_sp_port->local_port;
249         bridge_port->dev = brport_dev;
250         bridge_port->bridge_device = bridge_device;
251         bridge_port->stp_state = BR_STATE_DISABLED;
252         bridge_port->flags = BR_LEARNING | BR_FLOOD | BR_LEARNING_SYNC;
253         INIT_LIST_HEAD(&bridge_port->vlans_list);
254         list_add(&bridge_port->list, &bridge_device->ports_list);
255         bridge_port->ref_count = 1;
256
257         return bridge_port;
258 }
259
260 static void
261 mlxsw_sp_bridge_port_destroy(struct mlxsw_sp_bridge_port *bridge_port)
262 {
263         list_del(&bridge_port->list);
264         WARN_ON(!list_empty(&bridge_port->vlans_list));
265         kfree(bridge_port);
266 }
267
268 static bool
269 mlxsw_sp_bridge_port_should_destroy(const struct mlxsw_sp_bridge_port *
270                                     bridge_port)
271 {
272         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_port->dev);
273
274         /* In case ports were pulled from out of a bridged LAG, then
275          * it's possible the reference count isn't zero, yet the bridge
276          * port should be destroyed, as it's no longer an upper of ours.
277          */
278         if (!mlxsw_sp && list_empty(&bridge_port->vlans_list))
279                 return true;
280         else if (bridge_port->ref_count == 0)
281                 return true;
282         else
283                 return false;
284 }
285
286 static struct mlxsw_sp_bridge_port *
287 mlxsw_sp_bridge_port_get(struct mlxsw_sp_bridge *bridge,
288                          struct net_device *brport_dev)
289 {
290         struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
291         struct mlxsw_sp_bridge_device *bridge_device;
292         struct mlxsw_sp_bridge_port *bridge_port;
293         int err;
294
295         bridge_port = mlxsw_sp_bridge_port_find(bridge, brport_dev);
296         if (bridge_port) {
297                 bridge_port->ref_count++;
298                 return bridge_port;
299         }
300
301         bridge_device = mlxsw_sp_bridge_device_get(bridge, br_dev);
302         if (IS_ERR(bridge_device))
303                 return ERR_CAST(bridge_device);
304
305         bridge_port = mlxsw_sp_bridge_port_create(bridge_device, brport_dev);
306         if (!bridge_port) {
307                 err = -ENOMEM;
308                 goto err_bridge_port_create;
309         }
310
311         return bridge_port;
312
313 err_bridge_port_create:
314         mlxsw_sp_bridge_device_put(bridge, bridge_device);
315         return ERR_PTR(err);
316 }
317
318 static void mlxsw_sp_bridge_port_put(struct mlxsw_sp_bridge *bridge,
319                                      struct mlxsw_sp_bridge_port *bridge_port)
320 {
321         struct mlxsw_sp_bridge_device *bridge_device;
322
323         bridge_port->ref_count--;
324         if (!mlxsw_sp_bridge_port_should_destroy(bridge_port))
325                 return;
326         bridge_device = bridge_port->bridge_device;
327         mlxsw_sp_bridge_port_destroy(bridge_port);
328         mlxsw_sp_bridge_device_put(bridge, bridge_device);
329 }
330
331 static struct mlxsw_sp_port_vlan *
332 mlxsw_sp_port_vlan_find_by_bridge(struct mlxsw_sp_port *mlxsw_sp_port,
333                                   const struct mlxsw_sp_bridge_device *
334                                   bridge_device,
335                                   u16 vid)
336 {
337         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
338
339         list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
340                             list) {
341                 if (!mlxsw_sp_port_vlan->bridge_port)
342                         continue;
343                 if (mlxsw_sp_port_vlan->bridge_port->bridge_device !=
344                     bridge_device)
345                         continue;
346                 if (bridge_device->vlan_enabled &&
347                     mlxsw_sp_port_vlan->vid != vid)
348                         continue;
349                 return mlxsw_sp_port_vlan;
350         }
351
352         return NULL;
353 }
354
355 static struct mlxsw_sp_port_vlan*
356 mlxsw_sp_port_vlan_find_by_fid(struct mlxsw_sp_port *mlxsw_sp_port,
357                                u16 fid_index)
358 {
359         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
360
361         list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
362                             list) {
363                 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
364
365                 if (fid && mlxsw_sp_fid_index(fid) == fid_index)
366                         return mlxsw_sp_port_vlan;
367         }
368
369         return NULL;
370 }
371
372 static struct mlxsw_sp_bridge_vlan *
373 mlxsw_sp_bridge_vlan_find(const struct mlxsw_sp_bridge_port *bridge_port,
374                           u16 vid)
375 {
376         struct mlxsw_sp_bridge_vlan *bridge_vlan;
377
378         list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
379                 if (bridge_vlan->vid == vid)
380                         return bridge_vlan;
381         }
382
383         return NULL;
384 }
385
386 static struct mlxsw_sp_bridge_vlan *
387 mlxsw_sp_bridge_vlan_create(struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
388 {
389         struct mlxsw_sp_bridge_vlan *bridge_vlan;
390
391         bridge_vlan = kzalloc(sizeof(*bridge_vlan), GFP_KERNEL);
392         if (!bridge_vlan)
393                 return NULL;
394
395         INIT_LIST_HEAD(&bridge_vlan->port_vlan_list);
396         bridge_vlan->vid = vid;
397         list_add(&bridge_vlan->list, &bridge_port->vlans_list);
398
399         return bridge_vlan;
400 }
401
402 static void
403 mlxsw_sp_bridge_vlan_destroy(struct mlxsw_sp_bridge_vlan *bridge_vlan)
404 {
405         list_del(&bridge_vlan->list);
406         WARN_ON(!list_empty(&bridge_vlan->port_vlan_list));
407         kfree(bridge_vlan);
408 }
409
410 static struct mlxsw_sp_bridge_vlan *
411 mlxsw_sp_bridge_vlan_get(struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
412 {
413         struct mlxsw_sp_bridge_vlan *bridge_vlan;
414
415         bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
416         if (bridge_vlan)
417                 return bridge_vlan;
418
419         return mlxsw_sp_bridge_vlan_create(bridge_port, vid);
420 }
421
422 static void mlxsw_sp_bridge_vlan_put(struct mlxsw_sp_bridge_vlan *bridge_vlan)
423 {
424         if (list_empty(&bridge_vlan->port_vlan_list))
425                 mlxsw_sp_bridge_vlan_destroy(bridge_vlan);
426 }
427
428 static void mlxsw_sp_port_bridge_flags_get(struct mlxsw_sp_bridge *bridge,
429                                            struct net_device *dev,
430                                            unsigned long *brport_flags)
431 {
432         struct mlxsw_sp_bridge_port *bridge_port;
433
434         bridge_port = mlxsw_sp_bridge_port_find(bridge, dev);
435         if (WARN_ON(!bridge_port))
436                 return;
437
438         memcpy(brport_flags, &bridge_port->flags, sizeof(*brport_flags));
439 }
440
441 static int mlxsw_sp_port_attr_get(struct net_device *dev,
442                                   struct switchdev_attr *attr)
443 {
444         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
445         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
446
447         switch (attr->id) {
448         case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
449                 attr->u.ppid.id_len = sizeof(mlxsw_sp->base_mac);
450                 memcpy(&attr->u.ppid.id, &mlxsw_sp->base_mac,
451                        attr->u.ppid.id_len);
452                 break;
453         case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
454                 mlxsw_sp_port_bridge_flags_get(mlxsw_sp->bridge, attr->orig_dev,
455                                                &attr->u.brport_flags);
456                 break;
457         case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT:
458                 attr->u.brport_flags_support = BR_LEARNING | BR_FLOOD;
459                 break;
460         default:
461                 return -EOPNOTSUPP;
462         }
463
464         return 0;
465 }
466
467 static int
468 mlxsw_sp_port_bridge_vlan_stp_set(struct mlxsw_sp_port *mlxsw_sp_port,
469                                   struct mlxsw_sp_bridge_vlan *bridge_vlan,
470                                   u8 state)
471 {
472         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
473
474         list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
475                             bridge_vlan_node) {
476                 if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
477                         continue;
478                 return mlxsw_sp_port_vid_stp_set(mlxsw_sp_port,
479                                                  bridge_vlan->vid, state);
480         }
481
482         return 0;
483 }
484
485 static int mlxsw_sp_port_attr_stp_state_set(struct mlxsw_sp_port *mlxsw_sp_port,
486                                             struct switchdev_trans *trans,
487                                             struct net_device *orig_dev,
488                                             u8 state)
489 {
490         struct mlxsw_sp_bridge_port *bridge_port;
491         struct mlxsw_sp_bridge_vlan *bridge_vlan;
492         int err;
493
494         if (switchdev_trans_ph_prepare(trans))
495                 return 0;
496
497         /* It's possible we failed to enslave the port, yet this
498          * operation is executed due to it being deferred.
499          */
500         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
501                                                 orig_dev);
502         if (!bridge_port)
503                 return 0;
504
505         list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
506                 err = mlxsw_sp_port_bridge_vlan_stp_set(mlxsw_sp_port,
507                                                         bridge_vlan, state);
508                 if (err)
509                         goto err_port_bridge_vlan_stp_set;
510         }
511
512         bridge_port->stp_state = state;
513
514         return 0;
515
516 err_port_bridge_vlan_stp_set:
517         list_for_each_entry_continue_reverse(bridge_vlan,
518                                              &bridge_port->vlans_list, list)
519                 mlxsw_sp_port_bridge_vlan_stp_set(mlxsw_sp_port, bridge_vlan,
520                                                   bridge_port->stp_state);
521         return err;
522 }
523
524 static int
525 mlxsw_sp_port_bridge_vlan_flood_set(struct mlxsw_sp_port *mlxsw_sp_port,
526                                     struct mlxsw_sp_bridge_vlan *bridge_vlan,
527                                     enum mlxsw_sp_flood_type packet_type,
528                                     bool member)
529 {
530         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
531
532         list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
533                             bridge_vlan_node) {
534                 if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
535                         continue;
536                 return mlxsw_sp_fid_flood_set(mlxsw_sp_port_vlan->fid,
537                                               packet_type,
538                                               mlxsw_sp_port->local_port,
539                                               member);
540         }
541
542         return 0;
543 }
544
545 static int
546 mlxsw_sp_bridge_port_flood_table_set(struct mlxsw_sp_port *mlxsw_sp_port,
547                                      struct mlxsw_sp_bridge_port *bridge_port,
548                                      enum mlxsw_sp_flood_type packet_type,
549                                      bool member)
550 {
551         struct mlxsw_sp_bridge_vlan *bridge_vlan;
552         int err;
553
554         list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
555                 err = mlxsw_sp_port_bridge_vlan_flood_set(mlxsw_sp_port,
556                                                           bridge_vlan,
557                                                           packet_type,
558                                                           member);
559                 if (err)
560                         goto err_port_bridge_vlan_flood_set;
561         }
562
563         return 0;
564
565 err_port_bridge_vlan_flood_set:
566         list_for_each_entry_continue_reverse(bridge_vlan,
567                                              &bridge_port->vlans_list, list)
568                 mlxsw_sp_port_bridge_vlan_flood_set(mlxsw_sp_port, bridge_vlan,
569                                                     packet_type, !member);
570         return err;
571 }
572
573 static int
574 mlxsw_sp_port_bridge_vlan_learning_set(struct mlxsw_sp_port *mlxsw_sp_port,
575                                        struct mlxsw_sp_bridge_vlan *bridge_vlan,
576                                        bool set)
577 {
578         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
579         u16 vid = bridge_vlan->vid;
580
581         list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
582                             bridge_vlan_node) {
583                 if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
584                         continue;
585                 return mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, set);
586         }
587
588         return 0;
589 }
590
591 static int
592 mlxsw_sp_bridge_port_learning_set(struct mlxsw_sp_port *mlxsw_sp_port,
593                                   struct mlxsw_sp_bridge_port *bridge_port,
594                                   bool set)
595 {
596         struct mlxsw_sp_bridge_vlan *bridge_vlan;
597         int err;
598
599         list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
600                 err = mlxsw_sp_port_bridge_vlan_learning_set(mlxsw_sp_port,
601                                                              bridge_vlan, set);
602                 if (err)
603                         goto err_port_bridge_vlan_learning_set;
604         }
605
606         return 0;
607
608 err_port_bridge_vlan_learning_set:
609         list_for_each_entry_continue_reverse(bridge_vlan,
610                                              &bridge_port->vlans_list, list)
611                 mlxsw_sp_port_bridge_vlan_learning_set(mlxsw_sp_port,
612                                                        bridge_vlan, !set);
613         return err;
614 }
615
616 static int mlxsw_sp_port_attr_br_flags_set(struct mlxsw_sp_port *mlxsw_sp_port,
617                                            struct switchdev_trans *trans,
618                                            struct net_device *orig_dev,
619                                            unsigned long brport_flags)
620 {
621         struct mlxsw_sp_bridge_port *bridge_port;
622         int err;
623
624         if (switchdev_trans_ph_prepare(trans))
625                 return 0;
626
627         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
628                                                 orig_dev);
629         if (!bridge_port)
630                 return 0;
631
632         err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port,
633                                                    MLXSW_SP_FLOOD_TYPE_UC,
634                                                    brport_flags & BR_FLOOD);
635         if (err)
636                 return err;
637
638         err = mlxsw_sp_bridge_port_learning_set(mlxsw_sp_port, bridge_port,
639                                                 brport_flags & BR_LEARNING);
640         if (err)
641                 return err;
642
643         memcpy(&bridge_port->flags, &brport_flags, sizeof(brport_flags));
644
645         return 0;
646 }
647
648 static int mlxsw_sp_ageing_set(struct mlxsw_sp *mlxsw_sp, u32 ageing_time)
649 {
650         char sfdat_pl[MLXSW_REG_SFDAT_LEN];
651         int err;
652
653         mlxsw_reg_sfdat_pack(sfdat_pl, ageing_time);
654         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdat), sfdat_pl);
655         if (err)
656                 return err;
657         mlxsw_sp->bridge->ageing_time = ageing_time;
658         return 0;
659 }
660
661 static int mlxsw_sp_port_attr_br_ageing_set(struct mlxsw_sp_port *mlxsw_sp_port,
662                                             struct switchdev_trans *trans,
663                                             unsigned long ageing_clock_t)
664 {
665         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
666         unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
667         u32 ageing_time = jiffies_to_msecs(ageing_jiffies) / 1000;
668
669         if (switchdev_trans_ph_prepare(trans)) {
670                 if (ageing_time < MLXSW_SP_MIN_AGEING_TIME ||
671                     ageing_time > MLXSW_SP_MAX_AGEING_TIME)
672                         return -ERANGE;
673                 else
674                         return 0;
675         }
676
677         return mlxsw_sp_ageing_set(mlxsw_sp, ageing_time);
678 }
679
680 static int mlxsw_sp_port_attr_br_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port,
681                                           struct switchdev_trans *trans,
682                                           struct net_device *orig_dev,
683                                           bool vlan_enabled)
684 {
685         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
686         struct mlxsw_sp_bridge_device *bridge_device;
687
688         if (!switchdev_trans_ph_prepare(trans))
689                 return 0;
690
691         bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
692         if (WARN_ON(!bridge_device))
693                 return -EINVAL;
694
695         if (bridge_device->vlan_enabled == vlan_enabled)
696                 return 0;
697
698         netdev_err(bridge_device->dev, "VLAN filtering can't be changed for existing bridge\n");
699         return -EINVAL;
700 }
701
702 static int mlxsw_sp_port_attr_mc_router_set(struct mlxsw_sp_port *mlxsw_sp_port,
703                                             struct switchdev_trans *trans,
704                                             struct net_device *orig_dev,
705                                             bool is_port_mc_router)
706 {
707         struct mlxsw_sp_bridge_port *bridge_port;
708         int err;
709
710         if (switchdev_trans_ph_prepare(trans))
711                 return 0;
712
713         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
714                                                 orig_dev);
715         if (!bridge_port)
716                 return 0;
717
718         if (!bridge_port->bridge_device->multicast_enabled)
719                 goto out;
720
721         err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port,
722                                                    MLXSW_SP_FLOOD_TYPE_MC,
723                                                    is_port_mc_router);
724         if (err)
725                 return err;
726
727 out:
728         bridge_port->mrouter = is_port_mc_router;
729         return 0;
730 }
731
732 static int mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port *mlxsw_sp_port,
733                                          struct switchdev_trans *trans,
734                                          struct net_device *orig_dev,
735                                          bool mc_disabled)
736 {
737         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
738         struct mlxsw_sp_bridge_device *bridge_device;
739         struct mlxsw_sp_bridge_port *bridge_port;
740         int err;
741
742         if (switchdev_trans_ph_prepare(trans))
743                 return 0;
744
745         /* It's possible we failed to enslave the port, yet this
746          * operation is executed due to it being deferred.
747          */
748         bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
749         if (!bridge_device)
750                 return 0;
751
752         list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
753                 enum mlxsw_sp_flood_type packet_type = MLXSW_SP_FLOOD_TYPE_MC;
754                 bool member = mc_disabled ? true : bridge_port->mrouter;
755
756                 err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
757                                                            bridge_port,
758                                                            packet_type, member);
759                 if (err)
760                         return err;
761         }
762
763         bridge_device->multicast_enabled = !mc_disabled;
764
765         return 0;
766 }
767
768 static int mlxsw_sp_port_attr_set(struct net_device *dev,
769                                   const struct switchdev_attr *attr,
770                                   struct switchdev_trans *trans)
771 {
772         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
773         int err;
774
775         switch (attr->id) {
776         case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
777                 err = mlxsw_sp_port_attr_stp_state_set(mlxsw_sp_port, trans,
778                                                        attr->orig_dev,
779                                                        attr->u.stp_state);
780                 break;
781         case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
782                 err = mlxsw_sp_port_attr_br_flags_set(mlxsw_sp_port, trans,
783                                                       attr->orig_dev,
784                                                       attr->u.brport_flags);
785                 break;
786         case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
787                 err = mlxsw_sp_port_attr_br_ageing_set(mlxsw_sp_port, trans,
788                                                        attr->u.ageing_time);
789                 break;
790         case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
791                 err = mlxsw_sp_port_attr_br_vlan_set(mlxsw_sp_port, trans,
792                                                      attr->orig_dev,
793                                                      attr->u.vlan_filtering);
794                 break;
795         case SWITCHDEV_ATTR_ID_PORT_MROUTER:
796                 err = mlxsw_sp_port_attr_mc_router_set(mlxsw_sp_port, trans,
797                                                        attr->orig_dev,
798                                                        attr->u.mrouter);
799                 break;
800         case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
801                 err = mlxsw_sp_port_mc_disabled_set(mlxsw_sp_port, trans,
802                                                     attr->orig_dev,
803                                                     attr->u.mc_disabled);
804                 break;
805         default:
806                 err = -EOPNOTSUPP;
807                 break;
808         }
809
810         return err;
811 }
812
813 static bool mlxsw_sp_mc_flood(const struct mlxsw_sp_bridge_port *bridge_port)
814 {
815         const struct mlxsw_sp_bridge_device *bridge_device;
816
817         bridge_device = bridge_port->bridge_device;
818         return !bridge_device->multicast_enabled ? true : bridge_port->mrouter;
819 }
820
821 static int
822 mlxsw_sp_port_vlan_fid_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
823                             struct mlxsw_sp_bridge_port *bridge_port)
824 {
825         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
826         struct mlxsw_sp_bridge_device *bridge_device;
827         u8 local_port = mlxsw_sp_port->local_port;
828         u16 vid = mlxsw_sp_port_vlan->vid;
829         struct mlxsw_sp_fid *fid;
830         int err;
831
832         bridge_device = bridge_port->bridge_device;
833         fid = bridge_device->ops->fid_get(bridge_device, vid);
834         if (IS_ERR(fid))
835                 return PTR_ERR(fid);
836
837         err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port,
838                                      bridge_port->flags & BR_FLOOD);
839         if (err)
840                 goto err_fid_uc_flood_set;
841
842         err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port,
843                                      mlxsw_sp_mc_flood(bridge_port));
844         if (err)
845                 goto err_fid_mc_flood_set;
846
847         err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port,
848                                      true);
849         if (err)
850                 goto err_fid_bc_flood_set;
851
852         err = mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port, vid);
853         if (err)
854                 goto err_fid_port_vid_map;
855
856         mlxsw_sp_port_vlan->fid = fid;
857
858         return 0;
859
860 err_fid_port_vid_map:
861         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
862 err_fid_bc_flood_set:
863         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
864 err_fid_mc_flood_set:
865         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
866 err_fid_uc_flood_set:
867         mlxsw_sp_fid_put(fid);
868         return err;
869 }
870
871 static void
872 mlxsw_sp_port_vlan_fid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
873 {
874         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
875         struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
876         u8 local_port = mlxsw_sp_port->local_port;
877         u16 vid = mlxsw_sp_port_vlan->vid;
878
879         mlxsw_sp_port_vlan->fid = NULL;
880         mlxsw_sp_fid_port_vid_unmap(fid, mlxsw_sp_port, vid);
881         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
882         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
883         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
884         mlxsw_sp_fid_put(fid);
885 }
886
887 static u16
888 mlxsw_sp_port_pvid_determine(const struct mlxsw_sp_port *mlxsw_sp_port,
889                              u16 vid, bool is_pvid)
890 {
891         if (is_pvid)
892                 return vid;
893         else if (mlxsw_sp_port->pvid == vid)
894                 return 0;       /* Dis-allow untagged packets */
895         else
896                 return mlxsw_sp_port->pvid;
897 }
898
899 static int
900 mlxsw_sp_port_vlan_bridge_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
901                                struct mlxsw_sp_bridge_port *bridge_port)
902 {
903         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
904         struct mlxsw_sp_bridge_vlan *bridge_vlan;
905         u16 vid = mlxsw_sp_port_vlan->vid;
906         int err;
907
908         /* No need to continue if only VLAN flags were changed */
909         if (mlxsw_sp_port_vlan->bridge_port)
910                 return 0;
911
912         err = mlxsw_sp_port_vlan_fid_join(mlxsw_sp_port_vlan, bridge_port);
913         if (err)
914                 return err;
915
916         err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid,
917                                              bridge_port->flags & BR_LEARNING);
918         if (err)
919                 goto err_port_vid_learning_set;
920
921         err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid,
922                                         bridge_port->stp_state);
923         if (err)
924                 goto err_port_vid_stp_set;
925
926         bridge_vlan = mlxsw_sp_bridge_vlan_get(bridge_port, vid);
927         if (!bridge_vlan) {
928                 err = -ENOMEM;
929                 goto err_bridge_vlan_get;
930         }
931
932         list_add(&mlxsw_sp_port_vlan->bridge_vlan_node,
933                  &bridge_vlan->port_vlan_list);
934
935         mlxsw_sp_bridge_port_get(mlxsw_sp_port->mlxsw_sp->bridge,
936                                  bridge_port->dev);
937         mlxsw_sp_port_vlan->bridge_port = bridge_port;
938
939         return 0;
940
941 err_bridge_vlan_get:
942         mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
943 err_port_vid_stp_set:
944         mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
945 err_port_vid_learning_set:
946         mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
947         return err;
948 }
949
950 void
951 mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
952 {
953         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
954         struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
955         struct mlxsw_sp_bridge_vlan *bridge_vlan;
956         struct mlxsw_sp_bridge_port *bridge_port;
957         u16 vid = mlxsw_sp_port_vlan->vid;
958         bool last;
959
960         if (WARN_ON(mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021Q &&
961                     mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021D))
962                 return;
963
964         bridge_port = mlxsw_sp_port_vlan->bridge_port;
965         bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
966         last = list_is_singular(&bridge_vlan->port_vlan_list);
967
968         list_del(&mlxsw_sp_port_vlan->bridge_vlan_node);
969         mlxsw_sp_bridge_vlan_put(bridge_vlan);
970         mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
971         mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
972         if (last)
973                 mlxsw_sp_bridge_port_fdb_flush(mlxsw_sp_port->mlxsw_sp,
974                                                bridge_port,
975                                                mlxsw_sp_fid_index(fid));
976         mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
977
978         mlxsw_sp_bridge_port_put(mlxsw_sp_port->mlxsw_sp->bridge, bridge_port);
979         mlxsw_sp_port_vlan->bridge_port = NULL;
980 }
981
982 static int
983 mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port,
984                               struct mlxsw_sp_bridge_port *bridge_port,
985                               u16 vid, bool is_untagged, bool is_pvid)
986 {
987         u16 pvid = mlxsw_sp_port_pvid_determine(mlxsw_sp_port, vid, is_pvid);
988         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
989         u16 old_pvid = mlxsw_sp_port->pvid;
990         int err;
991
992         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_get(mlxsw_sp_port, vid);
993         if (IS_ERR(mlxsw_sp_port_vlan))
994                 return PTR_ERR(mlxsw_sp_port_vlan);
995
996         err = mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, true,
997                                      is_untagged);
998         if (err)
999                 goto err_port_vlan_set;
1000
1001         err = mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid);
1002         if (err)
1003                 goto err_port_pvid_set;
1004
1005         err = mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port);
1006         if (err)
1007                 goto err_port_vlan_bridge_join;
1008
1009         return 0;
1010
1011 err_port_vlan_bridge_join:
1012         mlxsw_sp_port_pvid_set(mlxsw_sp_port, old_pvid);
1013 err_port_pvid_set:
1014         mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1015 err_port_vlan_set:
1016         mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan);
1017         return err;
1018 }
1019
1020 static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port,
1021                                    const struct switchdev_obj_port_vlan *vlan,
1022                                    struct switchdev_trans *trans)
1023 {
1024         bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1025         bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1026         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1027         struct net_device *orig_dev = vlan->obj.orig_dev;
1028         struct mlxsw_sp_bridge_port *bridge_port;
1029         u16 vid;
1030
1031         if (switchdev_trans_ph_prepare(trans))
1032                 return 0;
1033
1034         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1035         if (WARN_ON(!bridge_port))
1036                 return -EINVAL;
1037
1038         if (!bridge_port->bridge_device->vlan_enabled)
1039                 return 0;
1040
1041         for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) {
1042                 int err;
1043
1044                 err = mlxsw_sp_bridge_port_vlan_add(mlxsw_sp_port, bridge_port,
1045                                                     vid, flag_untagged,
1046                                                     flag_pvid);
1047                 if (err)
1048                         return err;
1049         }
1050
1051         return 0;
1052 }
1053
1054 static enum mlxsw_reg_sfdf_flush_type mlxsw_sp_fdb_flush_type(bool lagged)
1055 {
1056         return lagged ? MLXSW_REG_SFDF_FLUSH_PER_LAG_AND_FID :
1057                         MLXSW_REG_SFDF_FLUSH_PER_PORT_AND_FID;
1058 }
1059
1060 static int
1061 mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
1062                                struct mlxsw_sp_bridge_port *bridge_port,
1063                                u16 fid_index)
1064 {
1065         bool lagged = bridge_port->lagged;
1066         char sfdf_pl[MLXSW_REG_SFDF_LEN];
1067         u16 system_port;
1068
1069         system_port = lagged ? bridge_port->lag_id : bridge_port->system_port;
1070         mlxsw_reg_sfdf_pack(sfdf_pl, mlxsw_sp_fdb_flush_type(lagged));
1071         mlxsw_reg_sfdf_fid_set(sfdf_pl, fid_index);
1072         mlxsw_reg_sfdf_port_fid_system_port_set(sfdf_pl, system_port);
1073
1074         return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdf), sfdf_pl);
1075 }
1076
1077 static enum mlxsw_reg_sfd_rec_policy mlxsw_sp_sfd_rec_policy(bool dynamic)
1078 {
1079         return dynamic ? MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_INGRESS :
1080                          MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY;
1081 }
1082
1083 static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
1084 {
1085         return adding ? MLXSW_REG_SFD_OP_WRITE_EDIT :
1086                         MLXSW_REG_SFD_OP_WRITE_REMOVE;
1087 }
1088
1089 static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
1090                                      const char *mac, u16 fid, bool adding,
1091                                      enum mlxsw_reg_sfd_rec_action action,
1092                                      bool dynamic)
1093 {
1094         char *sfd_pl;
1095         int err;
1096
1097         sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1098         if (!sfd_pl)
1099                 return -ENOMEM;
1100
1101         mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1102         mlxsw_reg_sfd_uc_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1103                               mac, fid, action, local_port);
1104         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1105         kfree(sfd_pl);
1106
1107         return err;
1108 }
1109
1110 static int mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
1111                                    const char *mac, u16 fid, bool adding,
1112                                    bool dynamic)
1113 {
1114         return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, adding,
1115                                          MLXSW_REG_SFD_REC_ACTION_NOP, dynamic);
1116 }
1117
1118 int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
1119                         bool adding)
1120 {
1121         return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, 0, mac, fid, adding,
1122                                          MLXSW_REG_SFD_REC_ACTION_FORWARD_IP_ROUTER,
1123                                          false);
1124 }
1125
1126 static int mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp *mlxsw_sp, u16 lag_id,
1127                                        const char *mac, u16 fid, u16 lag_vid,
1128                                        bool adding, bool dynamic)
1129 {
1130         char *sfd_pl;
1131         int err;
1132
1133         sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1134         if (!sfd_pl)
1135                 return -ENOMEM;
1136
1137         mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1138         mlxsw_reg_sfd_uc_lag_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1139                                   mac, fid, MLXSW_REG_SFD_REC_ACTION_NOP,
1140                                   lag_vid, lag_id);
1141         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1142         kfree(sfd_pl);
1143
1144         return err;
1145 }
1146
1147 static int
1148 mlxsw_sp_port_fdb_set(struct mlxsw_sp_port *mlxsw_sp_port,
1149                       struct switchdev_notifier_fdb_info *fdb_info, bool adding)
1150 {
1151         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1152         struct net_device *orig_dev = fdb_info->info.dev;
1153         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1154         struct mlxsw_sp_bridge_device *bridge_device;
1155         struct mlxsw_sp_bridge_port *bridge_port;
1156         u16 fid_index, vid;
1157
1158         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1159         if (!bridge_port)
1160                 return -EINVAL;
1161
1162         bridge_device = bridge_port->bridge_device;
1163         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1164                                                                bridge_device,
1165                                                                fdb_info->vid);
1166         if (!mlxsw_sp_port_vlan)
1167                 return 0;
1168
1169         fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1170         vid = mlxsw_sp_port_vlan->vid;
1171
1172         if (!bridge_port->lagged)
1173                 return mlxsw_sp_port_fdb_uc_op(mlxsw_sp,
1174                                                bridge_port->system_port,
1175                                                fdb_info->addr, fid_index,
1176                                                adding, false);
1177         else
1178                 return mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp,
1179                                                    bridge_port->lag_id,
1180                                                    fdb_info->addr, fid_index,
1181                                                    vid, adding, false);
1182 }
1183
1184 static int mlxsw_sp_port_mdb_op(struct mlxsw_sp *mlxsw_sp, const char *addr,
1185                                 u16 fid, u16 mid, bool adding)
1186 {
1187         char *sfd_pl;
1188         int err;
1189
1190         sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1191         if (!sfd_pl)
1192                 return -ENOMEM;
1193
1194         mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1195         mlxsw_reg_sfd_mc_pack(sfd_pl, 0, addr, fid,
1196                               MLXSW_REG_SFD_REC_ACTION_NOP, mid);
1197         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1198         kfree(sfd_pl);
1199         return err;
1200 }
1201
1202 static int mlxsw_sp_port_smid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 mid,
1203                                   bool add, bool clear_all_ports)
1204 {
1205         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1206         char *smid_pl;
1207         int err, i;
1208
1209         smid_pl = kmalloc(MLXSW_REG_SMID_LEN, GFP_KERNEL);
1210         if (!smid_pl)
1211                 return -ENOMEM;
1212
1213         mlxsw_reg_smid_pack(smid_pl, mid, mlxsw_sp_port->local_port, add);
1214         if (clear_all_ports) {
1215                 for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++)
1216                         if (mlxsw_sp->ports[i])
1217                                 mlxsw_reg_smid_port_mask_set(smid_pl, i, 1);
1218         }
1219         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(smid), smid_pl);
1220         kfree(smid_pl);
1221         return err;
1222 }
1223
1224 static struct mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp *mlxsw_sp,
1225                                               const unsigned char *addr,
1226                                               u16 fid)
1227 {
1228         struct mlxsw_sp_mid *mid;
1229
1230         list_for_each_entry(mid, &mlxsw_sp->bridge->mids_list, list) {
1231                 if (ether_addr_equal(mid->addr, addr) && mid->fid == fid)
1232                         return mid;
1233         }
1234         return NULL;
1235 }
1236
1237 static struct mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp,
1238                                                 const unsigned char *addr,
1239                                                 u16 fid)
1240 {
1241         struct mlxsw_sp_mid *mid;
1242         u16 mid_idx;
1243
1244         mid_idx = find_first_zero_bit(mlxsw_sp->bridge->mids_bitmap,
1245                                       MLXSW_SP_MID_MAX);
1246         if (mid_idx == MLXSW_SP_MID_MAX)
1247                 return NULL;
1248
1249         mid = kzalloc(sizeof(*mid), GFP_KERNEL);
1250         if (!mid)
1251                 return NULL;
1252
1253         set_bit(mid_idx, mlxsw_sp->bridge->mids_bitmap);
1254         ether_addr_copy(mid->addr, addr);
1255         mid->fid = fid;
1256         mid->mid = mid_idx;
1257         mid->ref_count = 0;
1258         list_add_tail(&mid->list, &mlxsw_sp->bridge->mids_list);
1259
1260         return mid;
1261 }
1262
1263 static int __mlxsw_sp_mc_dec_ref(struct mlxsw_sp *mlxsw_sp,
1264                                  struct mlxsw_sp_mid *mid)
1265 {
1266         if (--mid->ref_count == 0) {
1267                 list_del(&mid->list);
1268                 clear_bit(mid->mid, mlxsw_sp->bridge->mids_bitmap);
1269                 kfree(mid);
1270                 return 1;
1271         }
1272         return 0;
1273 }
1274
1275 static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
1276                                  const struct switchdev_obj_port_mdb *mdb,
1277                                  struct switchdev_trans *trans)
1278 {
1279         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1280         struct net_device *orig_dev = mdb->obj.orig_dev;
1281         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1282         struct net_device *dev = mlxsw_sp_port->dev;
1283         struct mlxsw_sp_bridge_device *bridge_device;
1284         struct mlxsw_sp_bridge_port *bridge_port;
1285         struct mlxsw_sp_mid *mid;
1286         u16 fid_index;
1287         int err = 0;
1288
1289         if (switchdev_trans_ph_prepare(trans))
1290                 return 0;
1291
1292         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1293         if (!bridge_port)
1294                 return 0;
1295
1296         bridge_device = bridge_port->bridge_device;
1297         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1298                                                                bridge_device,
1299                                                                mdb->vid);
1300         if (!mlxsw_sp_port_vlan)
1301                 return 0;
1302
1303         fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1304
1305         mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, fid_index);
1306         if (!mid) {
1307                 mid = __mlxsw_sp_mc_alloc(mlxsw_sp, mdb->addr, fid_index);
1308                 if (!mid) {
1309                         netdev_err(dev, "Unable to allocate MC group\n");
1310                         return -ENOMEM;
1311                 }
1312         }
1313         mid->ref_count++;
1314
1315         err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, true,
1316                                      mid->ref_count == 1);
1317         if (err) {
1318                 netdev_err(dev, "Unable to set SMID\n");
1319                 goto err_out;
1320         }
1321
1322         if (mid->ref_count == 1) {
1323                 err = mlxsw_sp_port_mdb_op(mlxsw_sp, mdb->addr, fid_index,
1324                                            mid->mid, true);
1325                 if (err) {
1326                         netdev_err(dev, "Unable to set MC SFD\n");
1327                         goto err_out;
1328                 }
1329         }
1330
1331         return 0;
1332
1333 err_out:
1334         __mlxsw_sp_mc_dec_ref(mlxsw_sp, mid);
1335         return err;
1336 }
1337
1338 static int mlxsw_sp_port_obj_add(struct net_device *dev,
1339                                  const struct switchdev_obj *obj,
1340                                  struct switchdev_trans *trans)
1341 {
1342         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1343         int err = 0;
1344
1345         switch (obj->id) {
1346         case SWITCHDEV_OBJ_ID_PORT_VLAN:
1347                 err = mlxsw_sp_port_vlans_add(mlxsw_sp_port,
1348                                               SWITCHDEV_OBJ_PORT_VLAN(obj),
1349                                               trans);
1350                 break;
1351         case SWITCHDEV_OBJ_ID_PORT_MDB:
1352                 err = mlxsw_sp_port_mdb_add(mlxsw_sp_port,
1353                                             SWITCHDEV_OBJ_PORT_MDB(obj),
1354                                             trans);
1355                 break;
1356         default:
1357                 err = -EOPNOTSUPP;
1358                 break;
1359         }
1360
1361         return err;
1362 }
1363
1364 static void
1365 mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port *mlxsw_sp_port,
1366                               struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
1367 {
1368         u16 pvid = mlxsw_sp_port->pvid == vid ? 0 : vid;
1369         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1370
1371         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1372         if (WARN_ON(!mlxsw_sp_port_vlan))
1373                 return;
1374
1375         mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
1376         mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid);
1377         mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1378         mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan);
1379 }
1380
1381 static int mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
1382                                    const struct switchdev_obj_port_vlan *vlan)
1383 {
1384         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1385         struct net_device *orig_dev = vlan->obj.orig_dev;
1386         struct mlxsw_sp_bridge_port *bridge_port;
1387         u16 vid;
1388
1389         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1390         if (WARN_ON(!bridge_port))
1391                 return -EINVAL;
1392
1393         if (!bridge_port->bridge_device->vlan_enabled)
1394                 return 0;
1395
1396         for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++)
1397                 mlxsw_sp_bridge_port_vlan_del(mlxsw_sp_port, bridge_port, vid);
1398
1399         return 0;
1400 }
1401
1402 static int mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
1403                                  const struct switchdev_obj_port_mdb *mdb)
1404 {
1405         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1406         struct net_device *orig_dev = mdb->obj.orig_dev;
1407         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1408         struct mlxsw_sp_bridge_device *bridge_device;
1409         struct net_device *dev = mlxsw_sp_port->dev;
1410         struct mlxsw_sp_bridge_port *bridge_port;
1411         struct mlxsw_sp_mid *mid;
1412         u16 fid_index;
1413         u16 mid_idx;
1414         int err = 0;
1415
1416         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1417         if (!bridge_port)
1418                 return 0;
1419
1420         bridge_device = bridge_port->bridge_device;
1421         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1422                                                                bridge_device,
1423                                                                mdb->vid);
1424         if (!mlxsw_sp_port_vlan)
1425                 return 0;
1426
1427         fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1428
1429         mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, fid_index);
1430         if (!mid) {
1431                 netdev_err(dev, "Unable to remove port from MC DB\n");
1432                 return -EINVAL;
1433         }
1434
1435         err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false, false);
1436         if (err)
1437                 netdev_err(dev, "Unable to remove port from SMID\n");
1438
1439         mid_idx = mid->mid;
1440         if (__mlxsw_sp_mc_dec_ref(mlxsw_sp, mid)) {
1441                 err = mlxsw_sp_port_mdb_op(mlxsw_sp, mdb->addr, fid_index,
1442                                            mid_idx, false);
1443                 if (err)
1444                         netdev_err(dev, "Unable to remove MC SFD\n");
1445         }
1446
1447         return err;
1448 }
1449
1450 static int mlxsw_sp_port_obj_del(struct net_device *dev,
1451                                  const struct switchdev_obj *obj)
1452 {
1453         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1454         int err = 0;
1455
1456         switch (obj->id) {
1457         case SWITCHDEV_OBJ_ID_PORT_VLAN:
1458                 err = mlxsw_sp_port_vlans_del(mlxsw_sp_port,
1459                                               SWITCHDEV_OBJ_PORT_VLAN(obj));
1460                 break;
1461         case SWITCHDEV_OBJ_ID_PORT_MDB:
1462                 err = mlxsw_sp_port_mdb_del(mlxsw_sp_port,
1463                                             SWITCHDEV_OBJ_PORT_MDB(obj));
1464                 break;
1465         default:
1466                 err = -EOPNOTSUPP;
1467                 break;
1468         }
1469
1470         return err;
1471 }
1472
1473 static struct mlxsw_sp_port *mlxsw_sp_lag_rep_port(struct mlxsw_sp *mlxsw_sp,
1474                                                    u16 lag_id)
1475 {
1476         struct mlxsw_sp_port *mlxsw_sp_port;
1477         u64 max_lag_members;
1478         int i;
1479
1480         max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
1481                                              MAX_LAG_MEMBERS);
1482         for (i = 0; i < max_lag_members; i++) {
1483                 mlxsw_sp_port = mlxsw_sp_port_lagged_get(mlxsw_sp, lag_id, i);
1484                 if (mlxsw_sp_port)
1485                         return mlxsw_sp_port;
1486         }
1487         return NULL;
1488 }
1489
1490 static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = {
1491         .switchdev_port_attr_get        = mlxsw_sp_port_attr_get,
1492         .switchdev_port_attr_set        = mlxsw_sp_port_attr_set,
1493         .switchdev_port_obj_add         = mlxsw_sp_port_obj_add,
1494         .switchdev_port_obj_del         = mlxsw_sp_port_obj_del,
1495 };
1496
1497 static int
1498 mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
1499                                 struct mlxsw_sp_bridge_port *bridge_port,
1500                                 struct mlxsw_sp_port *mlxsw_sp_port)
1501 {
1502         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1503
1504         if (is_vlan_dev(bridge_port->dev))
1505                 return -EINVAL;
1506
1507         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
1508         if (WARN_ON(!mlxsw_sp_port_vlan))
1509                 return -EINVAL;
1510
1511         /* Let VLAN-aware bridge take care of its own VLANs */
1512         mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan);
1513
1514         return 0;
1515 }
1516
1517 static void
1518 mlxsw_sp_bridge_8021q_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
1519                                  struct mlxsw_sp_bridge_port *bridge_port,
1520                                  struct mlxsw_sp_port *mlxsw_sp_port)
1521 {
1522         mlxsw_sp_port_vlan_get(mlxsw_sp_port, 1);
1523         /* Make sure untagged frames are allowed to ingress */
1524         mlxsw_sp_port_pvid_set(mlxsw_sp_port, 1);
1525 }
1526
1527 static struct mlxsw_sp_fid *
1528 mlxsw_sp_bridge_8021q_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
1529                               u16 vid)
1530 {
1531         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
1532
1533         return mlxsw_sp_fid_8021q_get(mlxsw_sp, vid);
1534 }
1535
1536 static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021q_ops = {
1537         .port_join      = mlxsw_sp_bridge_8021q_port_join,
1538         .port_leave     = mlxsw_sp_bridge_8021q_port_leave,
1539         .fid_get        = mlxsw_sp_bridge_8021q_fid_get,
1540 };
1541
1542 static bool
1543 mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port *mlxsw_sp_port,
1544                            const struct net_device *br_dev)
1545 {
1546         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1547
1548         list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
1549                             list) {
1550                 if (mlxsw_sp_port_vlan->bridge_port &&
1551                     mlxsw_sp_port_vlan->bridge_port->bridge_device->dev ==
1552                     br_dev)
1553                         return true;
1554         }
1555
1556         return false;
1557 }
1558
1559 static int
1560 mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
1561                                 struct mlxsw_sp_bridge_port *bridge_port,
1562                                 struct mlxsw_sp_port *mlxsw_sp_port)
1563 {
1564         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1565         u16 vid;
1566
1567         if (!is_vlan_dev(bridge_port->dev))
1568                 return -EINVAL;
1569         vid = vlan_dev_vlan_id(bridge_port->dev);
1570
1571         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1572         if (WARN_ON(!mlxsw_sp_port_vlan))
1573                 return -EINVAL;
1574
1575         if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
1576                 netdev_err(mlxsw_sp_port->dev, "Can't bridge VLAN uppers of the same port\n");
1577                 return -EINVAL;
1578         }
1579
1580         /* Port is no longer usable as a router interface */
1581         if (mlxsw_sp_port_vlan->fid)
1582                 mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port_vlan);
1583
1584         return mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port);
1585 }
1586
1587 static void
1588 mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
1589                                  struct mlxsw_sp_bridge_port *bridge_port,
1590                                  struct mlxsw_sp_port *mlxsw_sp_port)
1591 {
1592         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1593         u16 vid = vlan_dev_vlan_id(bridge_port->dev);
1594
1595         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1596         if (WARN_ON(!mlxsw_sp_port_vlan))
1597                 return;
1598
1599         mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
1600 }
1601
1602 static struct mlxsw_sp_fid *
1603 mlxsw_sp_bridge_8021d_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
1604                               u16 vid)
1605 {
1606         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
1607
1608         return mlxsw_sp_fid_8021d_get(mlxsw_sp, bridge_device->dev->ifindex);
1609 }
1610
1611 static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021d_ops = {
1612         .port_join      = mlxsw_sp_bridge_8021d_port_join,
1613         .port_leave     = mlxsw_sp_bridge_8021d_port_leave,
1614         .fid_get        = mlxsw_sp_bridge_8021d_fid_get,
1615 };
1616
1617 int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
1618                               struct net_device *brport_dev,
1619                               struct net_device *br_dev)
1620 {
1621         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1622         struct mlxsw_sp_bridge_device *bridge_device;
1623         struct mlxsw_sp_bridge_port *bridge_port;
1624         int err;
1625
1626         bridge_port = mlxsw_sp_bridge_port_get(mlxsw_sp->bridge, brport_dev);
1627         if (IS_ERR(bridge_port))
1628                 return PTR_ERR(bridge_port);
1629         bridge_device = bridge_port->bridge_device;
1630
1631         err = bridge_device->ops->port_join(bridge_device, bridge_port,
1632                                             mlxsw_sp_port);
1633         if (err)
1634                 goto err_port_join;
1635
1636         return 0;
1637
1638 err_port_join:
1639         mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
1640         return err;
1641 }
1642
1643 void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
1644                                 struct net_device *brport_dev,
1645                                 struct net_device *br_dev)
1646 {
1647         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1648         struct mlxsw_sp_bridge_device *bridge_device;
1649         struct mlxsw_sp_bridge_port *bridge_port;
1650
1651         bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
1652         if (!bridge_device)
1653                 return;
1654         bridge_port = __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
1655         if (!bridge_port)
1656                 return;
1657
1658         bridge_device->ops->port_leave(bridge_device, bridge_port,
1659                                        mlxsw_sp_port);
1660         mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
1661 }
1662
1663 static void
1664 mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,
1665                             const char *mac, u16 vid,
1666                             struct net_device *dev)
1667 {
1668         struct switchdev_notifier_fdb_info info;
1669
1670         info.addr = mac;
1671         info.vid = vid;
1672         call_switchdev_notifiers(type, dev, &info.info);
1673 }
1674
1675 static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
1676                                             char *sfn_pl, int rec_index,
1677                                             bool adding)
1678 {
1679         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1680         struct mlxsw_sp_bridge_device *bridge_device;
1681         struct mlxsw_sp_bridge_port *bridge_port;
1682         struct mlxsw_sp_port *mlxsw_sp_port;
1683         enum switchdev_notifier_type type;
1684         char mac[ETH_ALEN];
1685         u8 local_port;
1686         u16 vid, fid;
1687         bool do_notification = true;
1688         int err;
1689
1690         mlxsw_reg_sfn_mac_unpack(sfn_pl, rec_index, mac, &fid, &local_port);
1691         mlxsw_sp_port = mlxsw_sp->ports[local_port];
1692         if (!mlxsw_sp_port) {
1693                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Incorrect local port in FDB notification\n");
1694                 goto just_remove;
1695         }
1696
1697         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
1698         if (!mlxsw_sp_port_vlan) {
1699                 netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
1700                 goto just_remove;
1701         }
1702
1703         bridge_port = mlxsw_sp_port_vlan->bridge_port;
1704         if (!bridge_port) {
1705                 netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
1706                 goto just_remove;
1707         }
1708
1709         bridge_device = bridge_port->bridge_device;
1710         vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
1711
1712 do_fdb_op:
1713         err = mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid,
1714                                       adding, true);
1715         if (err) {
1716                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
1717                 return;
1718         }
1719
1720         if (!do_notification)
1721                 return;
1722         type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
1723         mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev);
1724
1725         return;
1726
1727 just_remove:
1728         adding = false;
1729         do_notification = false;
1730         goto do_fdb_op;
1731 }
1732
1733 static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
1734                                                 char *sfn_pl, int rec_index,
1735                                                 bool adding)
1736 {
1737         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1738         struct mlxsw_sp_bridge_device *bridge_device;
1739         struct mlxsw_sp_bridge_port *bridge_port;
1740         struct mlxsw_sp_port *mlxsw_sp_port;
1741         enum switchdev_notifier_type type;
1742         char mac[ETH_ALEN];
1743         u16 lag_vid = 0;
1744         u16 lag_id;
1745         u16 vid, fid;
1746         bool do_notification = true;
1747         int err;
1748
1749         mlxsw_reg_sfn_mac_lag_unpack(sfn_pl, rec_index, mac, &fid, &lag_id);
1750         mlxsw_sp_port = mlxsw_sp_lag_rep_port(mlxsw_sp, lag_id);
1751         if (!mlxsw_sp_port) {
1752                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Cannot find port representor for LAG\n");
1753                 goto just_remove;
1754         }
1755
1756         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
1757         if (!mlxsw_sp_port_vlan) {
1758                 netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
1759                 goto just_remove;
1760         }
1761
1762         bridge_port = mlxsw_sp_port_vlan->bridge_port;
1763         if (!bridge_port) {
1764                 netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
1765                 goto just_remove;
1766         }
1767
1768         bridge_device = bridge_port->bridge_device;
1769         vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
1770         lag_vid = mlxsw_sp_port_vlan->vid;
1771
1772 do_fdb_op:
1773         err = mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp, lag_id, mac, fid, lag_vid,
1774                                           adding, true);
1775         if (err) {
1776                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
1777                 return;
1778         }
1779
1780         if (!do_notification)
1781                 return;
1782         type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
1783         mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev);
1784
1785         return;
1786
1787 just_remove:
1788         adding = false;
1789         do_notification = false;
1790         goto do_fdb_op;
1791 }
1792
1793 static void mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp *mlxsw_sp,
1794                                             char *sfn_pl, int rec_index)
1795 {
1796         switch (mlxsw_reg_sfn_rec_type_get(sfn_pl, rec_index)) {
1797         case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC:
1798                 mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
1799                                                 rec_index, true);
1800                 break;
1801         case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC:
1802                 mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
1803                                                 rec_index, false);
1804                 break;
1805         case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC_LAG:
1806                 mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
1807                                                     rec_index, true);
1808                 break;
1809         case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC_LAG:
1810                 mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
1811                                                     rec_index, false);
1812                 break;
1813         }
1814 }
1815
1816 static void mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp *mlxsw_sp)
1817 {
1818         struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
1819
1820         mlxsw_core_schedule_dw(&bridge->fdb_notify.dw,
1821                                msecs_to_jiffies(bridge->fdb_notify.interval));
1822 }
1823
1824 static void mlxsw_sp_fdb_notify_work(struct work_struct *work)
1825 {
1826         struct mlxsw_sp_bridge *bridge;
1827         struct mlxsw_sp *mlxsw_sp;
1828         char *sfn_pl;
1829         u8 num_rec;
1830         int i;
1831         int err;
1832
1833         sfn_pl = kmalloc(MLXSW_REG_SFN_LEN, GFP_KERNEL);
1834         if (!sfn_pl)
1835                 return;
1836
1837         bridge = container_of(work, struct mlxsw_sp_bridge, fdb_notify.dw.work);
1838         mlxsw_sp = bridge->mlxsw_sp;
1839
1840         rtnl_lock();
1841         mlxsw_reg_sfn_pack(sfn_pl);
1842         err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(sfn), sfn_pl);
1843         if (err) {
1844                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to get FDB notifications\n");
1845                 goto out;
1846         }
1847         num_rec = mlxsw_reg_sfn_num_rec_get(sfn_pl);
1848         for (i = 0; i < num_rec; i++)
1849                 mlxsw_sp_fdb_notify_rec_process(mlxsw_sp, sfn_pl, i);
1850
1851 out:
1852         rtnl_unlock();
1853         kfree(sfn_pl);
1854         mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp);
1855 }
1856
1857 struct mlxsw_sp_switchdev_event_work {
1858         struct work_struct work;
1859         struct switchdev_notifier_fdb_info fdb_info;
1860         struct net_device *dev;
1861         unsigned long event;
1862 };
1863
1864 static void mlxsw_sp_switchdev_event_work(struct work_struct *work)
1865 {
1866         struct mlxsw_sp_switchdev_event_work *switchdev_work =
1867                 container_of(work, struct mlxsw_sp_switchdev_event_work, work);
1868         struct net_device *dev = switchdev_work->dev;
1869         struct switchdev_notifier_fdb_info *fdb_info;
1870         struct mlxsw_sp_port *mlxsw_sp_port;
1871         int err;
1872
1873         rtnl_lock();
1874         mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(dev);
1875         if (!mlxsw_sp_port)
1876                 goto out;
1877
1878         switch (switchdev_work->event) {
1879         case SWITCHDEV_FDB_ADD_TO_DEVICE:
1880                 fdb_info = &switchdev_work->fdb_info;
1881                 err = mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, true);
1882                 if (err)
1883                         break;
1884                 mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
1885                                             fdb_info->addr,
1886                                             fdb_info->vid, dev);
1887                 break;
1888         case SWITCHDEV_FDB_DEL_TO_DEVICE:
1889                 fdb_info = &switchdev_work->fdb_info;
1890                 mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false);
1891                 break;
1892         }
1893
1894 out:
1895         rtnl_unlock();
1896         kfree(switchdev_work->fdb_info.addr);
1897         kfree(switchdev_work);
1898         dev_put(dev);
1899 }
1900
1901 /* Called under rcu_read_lock() */
1902 static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
1903                                     unsigned long event, void *ptr)
1904 {
1905         struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1906         struct mlxsw_sp_switchdev_event_work *switchdev_work;
1907         struct switchdev_notifier_fdb_info *fdb_info = ptr;
1908
1909         if (!mlxsw_sp_port_dev_lower_find_rcu(dev))
1910                 return NOTIFY_DONE;
1911
1912         switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
1913         if (!switchdev_work)
1914                 return NOTIFY_BAD;
1915
1916         INIT_WORK(&switchdev_work->work, mlxsw_sp_switchdev_event_work);
1917         switchdev_work->dev = dev;
1918         switchdev_work->event = event;
1919
1920         switch (event) {
1921         case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */
1922         case SWITCHDEV_FDB_DEL_TO_DEVICE:
1923                 memcpy(&switchdev_work->fdb_info, ptr,
1924                        sizeof(switchdev_work->fdb_info));
1925                 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1926                 if (!switchdev_work->fdb_info.addr)
1927                         goto err_addr_alloc;
1928                 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
1929                                 fdb_info->addr);
1930                 /* Take a reference on the device. This can be either
1931                  * upper device containig mlxsw_sp_port or just a
1932                  * mlxsw_sp_port
1933                  */
1934                 dev_hold(dev);
1935                 break;
1936         default:
1937                 kfree(switchdev_work);
1938                 return NOTIFY_DONE;
1939         }
1940
1941         mlxsw_core_schedule_work(&switchdev_work->work);
1942
1943         return NOTIFY_DONE;
1944
1945 err_addr_alloc:
1946         kfree(switchdev_work);
1947         return NOTIFY_BAD;
1948 }
1949
1950 static struct notifier_block mlxsw_sp_switchdev_notifier = {
1951         .notifier_call = mlxsw_sp_switchdev_event,
1952 };
1953
1954 static int mlxsw_sp_fdb_init(struct mlxsw_sp *mlxsw_sp)
1955 {
1956         struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
1957         int err;
1958
1959         err = mlxsw_sp_ageing_set(mlxsw_sp, MLXSW_SP_DEFAULT_AGEING_TIME);
1960         if (err) {
1961                 dev_err(mlxsw_sp->bus_info->dev, "Failed to set default ageing time\n");
1962                 return err;
1963         }
1964
1965         err = register_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
1966         if (err) {
1967                 dev_err(mlxsw_sp->bus_info->dev, "Failed to register switchdev notifier\n");
1968                 return err;
1969         }
1970
1971         INIT_DELAYED_WORK(&bridge->fdb_notify.dw, mlxsw_sp_fdb_notify_work);
1972         bridge->fdb_notify.interval = MLXSW_SP_DEFAULT_LEARNING_INTERVAL;
1973         mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp);
1974         return 0;
1975 }
1976
1977 static void mlxsw_sp_fdb_fini(struct mlxsw_sp *mlxsw_sp)
1978 {
1979         cancel_delayed_work_sync(&mlxsw_sp->bridge->fdb_notify.dw);
1980         unregister_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
1981
1982 }
1983
1984 static void mlxsw_sp_mids_fini(struct mlxsw_sp *mlxsw_sp)
1985 {
1986         struct mlxsw_sp_mid *mid, *tmp;
1987
1988         list_for_each_entry_safe(mid, tmp, &mlxsw_sp->bridge->mids_list, list) {
1989                 list_del(&mid->list);
1990                 clear_bit(mid->mid, mlxsw_sp->bridge->mids_bitmap);
1991                 kfree(mid);
1992         }
1993 }
1994
1995 int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp)
1996 {
1997         struct mlxsw_sp_bridge *bridge;
1998
1999         bridge = kzalloc(sizeof(*mlxsw_sp->bridge), GFP_KERNEL);
2000         if (!bridge)
2001                 return -ENOMEM;
2002         mlxsw_sp->bridge = bridge;
2003         bridge->mlxsw_sp = mlxsw_sp;
2004
2005         INIT_LIST_HEAD(&mlxsw_sp->bridge->bridges_list);
2006         INIT_LIST_HEAD(&mlxsw_sp->bridge->mids_list);
2007
2008         bridge->bridge_8021q_ops = &mlxsw_sp_bridge_8021q_ops;
2009         bridge->bridge_8021d_ops = &mlxsw_sp_bridge_8021d_ops;
2010
2011         return mlxsw_sp_fdb_init(mlxsw_sp);
2012 }
2013
2014 void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp)
2015 {
2016         mlxsw_sp_fdb_fini(mlxsw_sp);
2017         mlxsw_sp_mids_fini(mlxsw_sp);
2018         WARN_ON(!list_empty(&mlxsw_sp->bridge->bridges_list));
2019         kfree(mlxsw_sp->bridge);
2020 }
2021
2022 void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port)
2023 {
2024         mlxsw_sp_port->dev->switchdev_ops = &mlxsw_sp_port_switchdev_ops;
2025 }
2026
2027 void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port)
2028 {
2029 }