]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
Merge branches 'pm-cpufreq-sched' and 'intel_pstate'
[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 (WARN_ON(!bridge_port))
630                 return -EINVAL;
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
709         if (switchdev_trans_ph_prepare(trans))
710                 return 0;
711
712         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
713                                                 orig_dev);
714         if (WARN_ON(!bridge_port))
715                 return -EINVAL;
716
717         if (!bridge_port->bridge_device->multicast_enabled)
718                 return 0;
719
720         return mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port,
721                                                     MLXSW_SP_FLOOD_TYPE_MC,
722                                                     is_port_mc_router);
723 }
724
725 static int mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port *mlxsw_sp_port,
726                                          struct switchdev_trans *trans,
727                                          struct net_device *orig_dev,
728                                          bool mc_disabled)
729 {
730         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
731         struct mlxsw_sp_bridge_device *bridge_device;
732         struct mlxsw_sp_bridge_port *bridge_port;
733         int err;
734
735         if (switchdev_trans_ph_prepare(trans))
736                 return 0;
737
738         /* It's possible we failed to enslave the port, yet this
739          * operation is executed due to it being deferred.
740          */
741         bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
742         if (!bridge_device)
743                 return 0;
744
745         list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
746                 enum mlxsw_sp_flood_type packet_type = MLXSW_SP_FLOOD_TYPE_MC;
747                 bool member = mc_disabled ? true : bridge_port->mrouter;
748
749                 err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
750                                                            bridge_port,
751                                                            packet_type, member);
752                 if (err)
753                         return err;
754         }
755
756         bridge_device->multicast_enabled = !mc_disabled;
757
758         return 0;
759 }
760
761 static int mlxsw_sp_port_attr_set(struct net_device *dev,
762                                   const struct switchdev_attr *attr,
763                                   struct switchdev_trans *trans)
764 {
765         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
766         int err;
767
768         switch (attr->id) {
769         case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
770                 err = mlxsw_sp_port_attr_stp_state_set(mlxsw_sp_port, trans,
771                                                        attr->orig_dev,
772                                                        attr->u.stp_state);
773                 break;
774         case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
775                 err = mlxsw_sp_port_attr_br_flags_set(mlxsw_sp_port, trans,
776                                                       attr->orig_dev,
777                                                       attr->u.brport_flags);
778                 break;
779         case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
780                 err = mlxsw_sp_port_attr_br_ageing_set(mlxsw_sp_port, trans,
781                                                        attr->u.ageing_time);
782                 break;
783         case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
784                 err = mlxsw_sp_port_attr_br_vlan_set(mlxsw_sp_port, trans,
785                                                      attr->orig_dev,
786                                                      attr->u.vlan_filtering);
787                 break;
788         case SWITCHDEV_ATTR_ID_PORT_MROUTER:
789                 err = mlxsw_sp_port_attr_mc_router_set(mlxsw_sp_port, trans,
790                                                        attr->orig_dev,
791                                                        attr->u.mrouter);
792                 break;
793         case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
794                 err = mlxsw_sp_port_mc_disabled_set(mlxsw_sp_port, trans,
795                                                     attr->orig_dev,
796                                                     attr->u.mc_disabled);
797                 break;
798         default:
799                 err = -EOPNOTSUPP;
800                 break;
801         }
802
803         return err;
804 }
805
806 static bool mlxsw_sp_mc_flood(const struct mlxsw_sp_bridge_port *bridge_port)
807 {
808         const struct mlxsw_sp_bridge_device *bridge_device;
809
810         bridge_device = bridge_port->bridge_device;
811         return !bridge_device->multicast_enabled ? true : bridge_port->mrouter;
812 }
813
814 static int
815 mlxsw_sp_port_vlan_fid_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
816                             struct mlxsw_sp_bridge_port *bridge_port)
817 {
818         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
819         struct mlxsw_sp_bridge_device *bridge_device;
820         u8 local_port = mlxsw_sp_port->local_port;
821         u16 vid = mlxsw_sp_port_vlan->vid;
822         struct mlxsw_sp_fid *fid;
823         int err;
824
825         bridge_device = bridge_port->bridge_device;
826         fid = bridge_device->ops->fid_get(bridge_device, vid);
827         if (IS_ERR(fid))
828                 return PTR_ERR(fid);
829
830         err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port,
831                                      bridge_port->flags & BR_FLOOD);
832         if (err)
833                 goto err_fid_uc_flood_set;
834
835         err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port,
836                                      mlxsw_sp_mc_flood(bridge_port));
837         if (err)
838                 goto err_fid_mc_flood_set;
839
840         err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port,
841                                      true);
842         if (err)
843                 goto err_fid_bc_flood_set;
844
845         err = mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port, vid);
846         if (err)
847                 goto err_fid_port_vid_map;
848
849         mlxsw_sp_port_vlan->fid = fid;
850
851         return 0;
852
853 err_fid_port_vid_map:
854         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
855 err_fid_bc_flood_set:
856         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
857 err_fid_mc_flood_set:
858         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
859 err_fid_uc_flood_set:
860         mlxsw_sp_fid_put(fid);
861         return err;
862 }
863
864 static void
865 mlxsw_sp_port_vlan_fid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
866 {
867         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
868         struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
869         u8 local_port = mlxsw_sp_port->local_port;
870         u16 vid = mlxsw_sp_port_vlan->vid;
871
872         mlxsw_sp_port_vlan->fid = NULL;
873         mlxsw_sp_fid_port_vid_unmap(fid, mlxsw_sp_port, vid);
874         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
875         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
876         mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
877         mlxsw_sp_fid_put(fid);
878 }
879
880 static u16
881 mlxsw_sp_port_pvid_determine(const struct mlxsw_sp_port *mlxsw_sp_port,
882                              u16 vid, bool is_pvid)
883 {
884         if (is_pvid)
885                 return vid;
886         else if (mlxsw_sp_port->pvid == vid)
887                 return 0;       /* Dis-allow untagged packets */
888         else
889                 return mlxsw_sp_port->pvid;
890 }
891
892 static int
893 mlxsw_sp_port_vlan_bridge_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
894                                struct mlxsw_sp_bridge_port *bridge_port)
895 {
896         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
897         struct mlxsw_sp_bridge_vlan *bridge_vlan;
898         u16 vid = mlxsw_sp_port_vlan->vid;
899         int err;
900
901         /* No need to continue if only VLAN flags were changed */
902         if (mlxsw_sp_port_vlan->bridge_port)
903                 return 0;
904
905         err = mlxsw_sp_port_vlan_fid_join(mlxsw_sp_port_vlan, bridge_port);
906         if (err)
907                 return err;
908
909         err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid,
910                                              bridge_port->flags & BR_LEARNING);
911         if (err)
912                 goto err_port_vid_learning_set;
913
914         err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid,
915                                         bridge_port->stp_state);
916         if (err)
917                 goto err_port_vid_stp_set;
918
919         bridge_vlan = mlxsw_sp_bridge_vlan_get(bridge_port, vid);
920         if (!bridge_vlan) {
921                 err = -ENOMEM;
922                 goto err_bridge_vlan_get;
923         }
924
925         list_add(&mlxsw_sp_port_vlan->bridge_vlan_node,
926                  &bridge_vlan->port_vlan_list);
927
928         mlxsw_sp_bridge_port_get(mlxsw_sp_port->mlxsw_sp->bridge,
929                                  bridge_port->dev);
930         mlxsw_sp_port_vlan->bridge_port = bridge_port;
931
932         return 0;
933
934 err_bridge_vlan_get:
935         mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
936 err_port_vid_stp_set:
937         mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
938 err_port_vid_learning_set:
939         mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
940         return err;
941 }
942
943 void
944 mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
945 {
946         struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
947         struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
948         struct mlxsw_sp_bridge_vlan *bridge_vlan;
949         struct mlxsw_sp_bridge_port *bridge_port;
950         u16 vid = mlxsw_sp_port_vlan->vid;
951         bool last;
952
953         if (WARN_ON(mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021Q &&
954                     mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021D))
955                 return;
956
957         bridge_port = mlxsw_sp_port_vlan->bridge_port;
958         bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
959         last = list_is_singular(&bridge_vlan->port_vlan_list);
960
961         list_del(&mlxsw_sp_port_vlan->bridge_vlan_node);
962         mlxsw_sp_bridge_vlan_put(bridge_vlan);
963         mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
964         mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
965         if (last)
966                 mlxsw_sp_bridge_port_fdb_flush(mlxsw_sp_port->mlxsw_sp,
967                                                bridge_port,
968                                                mlxsw_sp_fid_index(fid));
969         mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
970
971         mlxsw_sp_bridge_port_put(mlxsw_sp_port->mlxsw_sp->bridge, bridge_port);
972         mlxsw_sp_port_vlan->bridge_port = NULL;
973 }
974
975 static int
976 mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port,
977                               struct mlxsw_sp_bridge_port *bridge_port,
978                               u16 vid, bool is_untagged, bool is_pvid)
979 {
980         u16 pvid = mlxsw_sp_port_pvid_determine(mlxsw_sp_port, vid, is_pvid);
981         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
982         struct mlxsw_sp_bridge_vlan *bridge_vlan;
983         u16 old_pvid = mlxsw_sp_port->pvid;
984         int err;
985
986         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_get(mlxsw_sp_port, vid);
987         if (IS_ERR(mlxsw_sp_port_vlan))
988                 return PTR_ERR(mlxsw_sp_port_vlan);
989
990         err = mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, true,
991                                      is_untagged);
992         if (err)
993                 goto err_port_vlan_set;
994
995         err = mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid);
996         if (err)
997                 goto err_port_pvid_set;
998
999         err = mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port);
1000         if (err)
1001                 goto err_port_vlan_bridge_join;
1002
1003         bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
1004
1005         return 0;
1006
1007 err_port_vlan_bridge_join:
1008         mlxsw_sp_port_pvid_set(mlxsw_sp_port, old_pvid);
1009 err_port_pvid_set:
1010         mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1011 err_port_vlan_set:
1012         mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan);
1013         return err;
1014 }
1015
1016 static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port,
1017                                    const struct switchdev_obj_port_vlan *vlan,
1018                                    struct switchdev_trans *trans)
1019 {
1020         bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1021         bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1022         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1023         struct net_device *orig_dev = vlan->obj.orig_dev;
1024         struct mlxsw_sp_bridge_port *bridge_port;
1025         u16 vid;
1026
1027         if (switchdev_trans_ph_prepare(trans))
1028                 return 0;
1029
1030         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1031         if (WARN_ON(!bridge_port))
1032                 return -EINVAL;
1033
1034         if (!bridge_port->bridge_device->vlan_enabled)
1035                 return 0;
1036
1037         for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) {
1038                 int err;
1039
1040                 err = mlxsw_sp_bridge_port_vlan_add(mlxsw_sp_port, bridge_port,
1041                                                     vid, flag_untagged,
1042                                                     flag_pvid);
1043                 if (err)
1044                         return err;
1045         }
1046
1047         return 0;
1048 }
1049
1050 static enum mlxsw_reg_sfdf_flush_type mlxsw_sp_fdb_flush_type(bool lagged)
1051 {
1052         return lagged ? MLXSW_REG_SFDF_FLUSH_PER_LAG_AND_FID :
1053                         MLXSW_REG_SFDF_FLUSH_PER_PORT_AND_FID;
1054 }
1055
1056 static int
1057 mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
1058                                struct mlxsw_sp_bridge_port *bridge_port,
1059                                u16 fid_index)
1060 {
1061         bool lagged = bridge_port->lagged;
1062         char sfdf_pl[MLXSW_REG_SFDF_LEN];
1063         u16 system_port;
1064
1065         system_port = lagged ? bridge_port->lag_id : bridge_port->system_port;
1066         mlxsw_reg_sfdf_pack(sfdf_pl, mlxsw_sp_fdb_flush_type(lagged));
1067         mlxsw_reg_sfdf_fid_set(sfdf_pl, fid_index);
1068         mlxsw_reg_sfdf_port_fid_system_port_set(sfdf_pl, system_port);
1069
1070         return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdf), sfdf_pl);
1071 }
1072
1073 static enum mlxsw_reg_sfd_rec_policy mlxsw_sp_sfd_rec_policy(bool dynamic)
1074 {
1075         return dynamic ? MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_INGRESS :
1076                          MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY;
1077 }
1078
1079 static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
1080 {
1081         return adding ? MLXSW_REG_SFD_OP_WRITE_EDIT :
1082                         MLXSW_REG_SFD_OP_WRITE_REMOVE;
1083 }
1084
1085 static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
1086                                      const char *mac, u16 fid, bool adding,
1087                                      enum mlxsw_reg_sfd_rec_action action,
1088                                      bool dynamic)
1089 {
1090         char *sfd_pl;
1091         int err;
1092
1093         sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1094         if (!sfd_pl)
1095                 return -ENOMEM;
1096
1097         mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1098         mlxsw_reg_sfd_uc_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1099                               mac, fid, action, local_port);
1100         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1101         kfree(sfd_pl);
1102
1103         return err;
1104 }
1105
1106 static int mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
1107                                    const char *mac, u16 fid, bool adding,
1108                                    bool dynamic)
1109 {
1110         return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, adding,
1111                                          MLXSW_REG_SFD_REC_ACTION_NOP, dynamic);
1112 }
1113
1114 int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
1115                         bool adding)
1116 {
1117         return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, 0, mac, fid, adding,
1118                                          MLXSW_REG_SFD_REC_ACTION_FORWARD_IP_ROUTER,
1119                                          false);
1120 }
1121
1122 static int mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp *mlxsw_sp, u16 lag_id,
1123                                        const char *mac, u16 fid, u16 lag_vid,
1124                                        bool adding, bool dynamic)
1125 {
1126         char *sfd_pl;
1127         int err;
1128
1129         sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1130         if (!sfd_pl)
1131                 return -ENOMEM;
1132
1133         mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1134         mlxsw_reg_sfd_uc_lag_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1135                                   mac, fid, MLXSW_REG_SFD_REC_ACTION_NOP,
1136                                   lag_vid, lag_id);
1137         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1138         kfree(sfd_pl);
1139
1140         return err;
1141 }
1142
1143 static int
1144 mlxsw_sp_port_fdb_set(struct mlxsw_sp_port *mlxsw_sp_port,
1145                       struct switchdev_notifier_fdb_info *fdb_info, bool adding)
1146 {
1147         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1148         struct net_device *orig_dev = fdb_info->info.dev;
1149         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1150         struct mlxsw_sp_bridge_device *bridge_device;
1151         struct mlxsw_sp_bridge_port *bridge_port;
1152         u16 fid_index, vid;
1153
1154         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1155         if (!bridge_port)
1156                 return -EINVAL;
1157
1158         bridge_device = bridge_port->bridge_device;
1159         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1160                                                                bridge_device,
1161                                                                fdb_info->vid);
1162         if (!mlxsw_sp_port_vlan)
1163                 return 0;
1164
1165         fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1166         vid = mlxsw_sp_port_vlan->vid;
1167
1168         if (!bridge_port->lagged)
1169                 return mlxsw_sp_port_fdb_uc_op(mlxsw_sp,
1170                                                bridge_port->system_port,
1171                                                fdb_info->addr, fid_index,
1172                                                adding, false);
1173         else
1174                 return mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp,
1175                                                    bridge_port->lag_id,
1176                                                    fdb_info->addr, fid_index,
1177                                                    vid, adding, false);
1178 }
1179
1180 static int mlxsw_sp_port_mdb_op(struct mlxsw_sp *mlxsw_sp, const char *addr,
1181                                 u16 fid, u16 mid, bool adding)
1182 {
1183         char *sfd_pl;
1184         int err;
1185
1186         sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1187         if (!sfd_pl)
1188                 return -ENOMEM;
1189
1190         mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1191         mlxsw_reg_sfd_mc_pack(sfd_pl, 0, addr, fid,
1192                               MLXSW_REG_SFD_REC_ACTION_NOP, mid);
1193         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1194         kfree(sfd_pl);
1195         return err;
1196 }
1197
1198 static int mlxsw_sp_port_smid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 mid,
1199                                   bool add, bool clear_all_ports)
1200 {
1201         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1202         char *smid_pl;
1203         int err, i;
1204
1205         smid_pl = kmalloc(MLXSW_REG_SMID_LEN, GFP_KERNEL);
1206         if (!smid_pl)
1207                 return -ENOMEM;
1208
1209         mlxsw_reg_smid_pack(smid_pl, mid, mlxsw_sp_port->local_port, add);
1210         if (clear_all_ports) {
1211                 for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++)
1212                         if (mlxsw_sp->ports[i])
1213                                 mlxsw_reg_smid_port_mask_set(smid_pl, i, 1);
1214         }
1215         err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(smid), smid_pl);
1216         kfree(smid_pl);
1217         return err;
1218 }
1219
1220 static struct mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp *mlxsw_sp,
1221                                               const unsigned char *addr,
1222                                               u16 fid)
1223 {
1224         struct mlxsw_sp_mid *mid;
1225
1226         list_for_each_entry(mid, &mlxsw_sp->bridge->mids_list, list) {
1227                 if (ether_addr_equal(mid->addr, addr) && mid->fid == fid)
1228                         return mid;
1229         }
1230         return NULL;
1231 }
1232
1233 static struct mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp,
1234                                                 const unsigned char *addr,
1235                                                 u16 fid)
1236 {
1237         struct mlxsw_sp_mid *mid;
1238         u16 mid_idx;
1239
1240         mid_idx = find_first_zero_bit(mlxsw_sp->bridge->mids_bitmap,
1241                                       MLXSW_SP_MID_MAX);
1242         if (mid_idx == MLXSW_SP_MID_MAX)
1243                 return NULL;
1244
1245         mid = kzalloc(sizeof(*mid), GFP_KERNEL);
1246         if (!mid)
1247                 return NULL;
1248
1249         set_bit(mid_idx, mlxsw_sp->bridge->mids_bitmap);
1250         ether_addr_copy(mid->addr, addr);
1251         mid->fid = fid;
1252         mid->mid = mid_idx;
1253         mid->ref_count = 0;
1254         list_add_tail(&mid->list, &mlxsw_sp->bridge->mids_list);
1255
1256         return mid;
1257 }
1258
1259 static int __mlxsw_sp_mc_dec_ref(struct mlxsw_sp *mlxsw_sp,
1260                                  struct mlxsw_sp_mid *mid)
1261 {
1262         if (--mid->ref_count == 0) {
1263                 list_del(&mid->list);
1264                 clear_bit(mid->mid, mlxsw_sp->bridge->mids_bitmap);
1265                 kfree(mid);
1266                 return 1;
1267         }
1268         return 0;
1269 }
1270
1271 static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
1272                                  const struct switchdev_obj_port_mdb *mdb,
1273                                  struct switchdev_trans *trans)
1274 {
1275         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1276         struct net_device *orig_dev = mdb->obj.orig_dev;
1277         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1278         struct net_device *dev = mlxsw_sp_port->dev;
1279         struct mlxsw_sp_bridge_device *bridge_device;
1280         struct mlxsw_sp_bridge_port *bridge_port;
1281         struct mlxsw_sp_mid *mid;
1282         u16 fid_index;
1283         int err = 0;
1284
1285         if (switchdev_trans_ph_prepare(trans))
1286                 return 0;
1287
1288         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1289         if (WARN_ON(!bridge_port))
1290                 return -EINVAL;
1291
1292         bridge_device = bridge_port->bridge_device;
1293         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1294                                                                bridge_device,
1295                                                                mdb->vid);
1296         if (WARN_ON(!mlxsw_sp_port_vlan))
1297                 return -EINVAL;
1298
1299         fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1300
1301         mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, fid_index);
1302         if (!mid) {
1303                 mid = __mlxsw_sp_mc_alloc(mlxsw_sp, mdb->addr, fid_index);
1304                 if (!mid) {
1305                         netdev_err(dev, "Unable to allocate MC group\n");
1306                         return -ENOMEM;
1307                 }
1308         }
1309         mid->ref_count++;
1310
1311         err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, true,
1312                                      mid->ref_count == 1);
1313         if (err) {
1314                 netdev_err(dev, "Unable to set SMID\n");
1315                 goto err_out;
1316         }
1317
1318         if (mid->ref_count == 1) {
1319                 err = mlxsw_sp_port_mdb_op(mlxsw_sp, mdb->addr, fid_index,
1320                                            mid->mid, true);
1321                 if (err) {
1322                         netdev_err(dev, "Unable to set MC SFD\n");
1323                         goto err_out;
1324                 }
1325         }
1326
1327         return 0;
1328
1329 err_out:
1330         __mlxsw_sp_mc_dec_ref(mlxsw_sp, mid);
1331         return err;
1332 }
1333
1334 static int mlxsw_sp_port_obj_add(struct net_device *dev,
1335                                  const struct switchdev_obj *obj,
1336                                  struct switchdev_trans *trans)
1337 {
1338         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1339         int err = 0;
1340
1341         switch (obj->id) {
1342         case SWITCHDEV_OBJ_ID_PORT_VLAN:
1343                 err = mlxsw_sp_port_vlans_add(mlxsw_sp_port,
1344                                               SWITCHDEV_OBJ_PORT_VLAN(obj),
1345                                               trans);
1346                 break;
1347         case SWITCHDEV_OBJ_ID_PORT_MDB:
1348                 err = mlxsw_sp_port_mdb_add(mlxsw_sp_port,
1349                                             SWITCHDEV_OBJ_PORT_MDB(obj),
1350                                             trans);
1351                 break;
1352         default:
1353                 err = -EOPNOTSUPP;
1354                 break;
1355         }
1356
1357         return err;
1358 }
1359
1360 static void
1361 mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port *mlxsw_sp_port,
1362                               struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
1363 {
1364         u16 pvid = mlxsw_sp_port->pvid == vid ? 0 : vid;
1365         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1366
1367         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1368         if (WARN_ON(!mlxsw_sp_port_vlan))
1369                 return;
1370
1371         mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
1372         mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid);
1373         mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1374         mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan);
1375 }
1376
1377 static int mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
1378                                    const struct switchdev_obj_port_vlan *vlan)
1379 {
1380         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1381         struct net_device *orig_dev = vlan->obj.orig_dev;
1382         struct mlxsw_sp_bridge_port *bridge_port;
1383         u16 vid;
1384
1385         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1386         if (WARN_ON(!bridge_port))
1387                 return -EINVAL;
1388
1389         if (!bridge_port->bridge_device->vlan_enabled)
1390                 return 0;
1391
1392         for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++)
1393                 mlxsw_sp_bridge_port_vlan_del(mlxsw_sp_port, bridge_port, vid);
1394
1395         return 0;
1396 }
1397
1398 static int mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
1399                                  const struct switchdev_obj_port_mdb *mdb)
1400 {
1401         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1402         struct net_device *orig_dev = mdb->obj.orig_dev;
1403         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1404         struct mlxsw_sp_bridge_device *bridge_device;
1405         struct net_device *dev = mlxsw_sp_port->dev;
1406         struct mlxsw_sp_bridge_port *bridge_port;
1407         struct mlxsw_sp_mid *mid;
1408         u16 fid_index;
1409         u16 mid_idx;
1410         int err = 0;
1411
1412         bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1413         if (WARN_ON(!bridge_port))
1414                 return -EINVAL;
1415
1416         bridge_device = bridge_port->bridge_device;
1417         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1418                                                                bridge_device,
1419                                                                mdb->vid);
1420         if (WARN_ON(!mlxsw_sp_port_vlan))
1421                 return -EINVAL;
1422
1423         fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1424
1425         mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, fid_index);
1426         if (!mid) {
1427                 netdev_err(dev, "Unable to remove port from MC DB\n");
1428                 return -EINVAL;
1429         }
1430
1431         err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false, false);
1432         if (err)
1433                 netdev_err(dev, "Unable to remove port from SMID\n");
1434
1435         mid_idx = mid->mid;
1436         if (__mlxsw_sp_mc_dec_ref(mlxsw_sp, mid)) {
1437                 err = mlxsw_sp_port_mdb_op(mlxsw_sp, mdb->addr, fid_index,
1438                                            mid_idx, false);
1439                 if (err)
1440                         netdev_err(dev, "Unable to remove MC SFD\n");
1441         }
1442
1443         return err;
1444 }
1445
1446 static int mlxsw_sp_port_obj_del(struct net_device *dev,
1447                                  const struct switchdev_obj *obj)
1448 {
1449         struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1450         int err = 0;
1451
1452         switch (obj->id) {
1453         case SWITCHDEV_OBJ_ID_PORT_VLAN:
1454                 err = mlxsw_sp_port_vlans_del(mlxsw_sp_port,
1455                                               SWITCHDEV_OBJ_PORT_VLAN(obj));
1456                 break;
1457         case SWITCHDEV_OBJ_ID_PORT_MDB:
1458                 err = mlxsw_sp_port_mdb_del(mlxsw_sp_port,
1459                                             SWITCHDEV_OBJ_PORT_MDB(obj));
1460                 break;
1461         default:
1462                 err = -EOPNOTSUPP;
1463                 break;
1464         }
1465
1466         return err;
1467 }
1468
1469 static struct mlxsw_sp_port *mlxsw_sp_lag_rep_port(struct mlxsw_sp *mlxsw_sp,
1470                                                    u16 lag_id)
1471 {
1472         struct mlxsw_sp_port *mlxsw_sp_port;
1473         u64 max_lag_members;
1474         int i;
1475
1476         max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
1477                                              MAX_LAG_MEMBERS);
1478         for (i = 0; i < max_lag_members; i++) {
1479                 mlxsw_sp_port = mlxsw_sp_port_lagged_get(mlxsw_sp, lag_id, i);
1480                 if (mlxsw_sp_port)
1481                         return mlxsw_sp_port;
1482         }
1483         return NULL;
1484 }
1485
1486 static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = {
1487         .switchdev_port_attr_get        = mlxsw_sp_port_attr_get,
1488         .switchdev_port_attr_set        = mlxsw_sp_port_attr_set,
1489         .switchdev_port_obj_add         = mlxsw_sp_port_obj_add,
1490         .switchdev_port_obj_del         = mlxsw_sp_port_obj_del,
1491 };
1492
1493 static int
1494 mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
1495                                 struct mlxsw_sp_bridge_port *bridge_port,
1496                                 struct mlxsw_sp_port *mlxsw_sp_port)
1497 {
1498         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1499
1500         if (is_vlan_dev(bridge_port->dev))
1501                 return -EINVAL;
1502
1503         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
1504         if (WARN_ON(!mlxsw_sp_port_vlan))
1505                 return -EINVAL;
1506
1507         /* Let VLAN-aware bridge take care of its own VLANs */
1508         mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan);
1509
1510         return 0;
1511 }
1512
1513 static void
1514 mlxsw_sp_bridge_8021q_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
1515                                  struct mlxsw_sp_bridge_port *bridge_port,
1516                                  struct mlxsw_sp_port *mlxsw_sp_port)
1517 {
1518         mlxsw_sp_port_vlan_get(mlxsw_sp_port, 1);
1519         /* Make sure untagged frames are allowed to ingress */
1520         mlxsw_sp_port_pvid_set(mlxsw_sp_port, 1);
1521 }
1522
1523 static struct mlxsw_sp_fid *
1524 mlxsw_sp_bridge_8021q_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
1525                               u16 vid)
1526 {
1527         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
1528
1529         return mlxsw_sp_fid_8021q_get(mlxsw_sp, vid);
1530 }
1531
1532 static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021q_ops = {
1533         .port_join      = mlxsw_sp_bridge_8021q_port_join,
1534         .port_leave     = mlxsw_sp_bridge_8021q_port_leave,
1535         .fid_get        = mlxsw_sp_bridge_8021q_fid_get,
1536 };
1537
1538 static bool
1539 mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port *mlxsw_sp_port,
1540                            const struct net_device *br_dev)
1541 {
1542         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1543
1544         list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
1545                             list) {
1546                 if (mlxsw_sp_port_vlan->bridge_port &&
1547                     mlxsw_sp_port_vlan->bridge_port->bridge_device->dev ==
1548                     br_dev)
1549                         return true;
1550         }
1551
1552         return false;
1553 }
1554
1555 static int
1556 mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
1557                                 struct mlxsw_sp_bridge_port *bridge_port,
1558                                 struct mlxsw_sp_port *mlxsw_sp_port)
1559 {
1560         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1561         u16 vid;
1562
1563         if (!is_vlan_dev(bridge_port->dev))
1564                 return -EINVAL;
1565         vid = vlan_dev_vlan_id(bridge_port->dev);
1566
1567         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1568         if (WARN_ON(!mlxsw_sp_port_vlan))
1569                 return -EINVAL;
1570
1571         if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
1572                 netdev_err(mlxsw_sp_port->dev, "Can't bridge VLAN uppers of the same port\n");
1573                 return -EINVAL;
1574         }
1575
1576         /* Port is no longer usable as a router interface */
1577         if (mlxsw_sp_port_vlan->fid)
1578                 mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port_vlan);
1579
1580         return mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port);
1581 }
1582
1583 static void
1584 mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
1585                                  struct mlxsw_sp_bridge_port *bridge_port,
1586                                  struct mlxsw_sp_port *mlxsw_sp_port)
1587 {
1588         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1589         u16 vid = vlan_dev_vlan_id(bridge_port->dev);
1590
1591         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1592         if (WARN_ON(!mlxsw_sp_port_vlan))
1593                 return;
1594
1595         mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
1596 }
1597
1598 static struct mlxsw_sp_fid *
1599 mlxsw_sp_bridge_8021d_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
1600                               u16 vid)
1601 {
1602         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
1603
1604         return mlxsw_sp_fid_8021d_get(mlxsw_sp, bridge_device->dev->ifindex);
1605 }
1606
1607 static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021d_ops = {
1608         .port_join      = mlxsw_sp_bridge_8021d_port_join,
1609         .port_leave     = mlxsw_sp_bridge_8021d_port_leave,
1610         .fid_get        = mlxsw_sp_bridge_8021d_fid_get,
1611 };
1612
1613 int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
1614                               struct net_device *brport_dev,
1615                               struct net_device *br_dev)
1616 {
1617         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1618         struct mlxsw_sp_bridge_device *bridge_device;
1619         struct mlxsw_sp_bridge_port *bridge_port;
1620         int err;
1621
1622         bridge_port = mlxsw_sp_bridge_port_get(mlxsw_sp->bridge, brport_dev);
1623         if (IS_ERR(bridge_port))
1624                 return PTR_ERR(bridge_port);
1625         bridge_device = bridge_port->bridge_device;
1626
1627         err = bridge_device->ops->port_join(bridge_device, bridge_port,
1628                                             mlxsw_sp_port);
1629         if (err)
1630                 goto err_port_join;
1631
1632         return 0;
1633
1634 err_port_join:
1635         mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
1636         return err;
1637 }
1638
1639 void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
1640                                 struct net_device *brport_dev,
1641                                 struct net_device *br_dev)
1642 {
1643         struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1644         struct mlxsw_sp_bridge_device *bridge_device;
1645         struct mlxsw_sp_bridge_port *bridge_port;
1646
1647         bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
1648         if (!bridge_device)
1649                 return;
1650         bridge_port = __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
1651         if (!bridge_port)
1652                 return;
1653
1654         bridge_device->ops->port_leave(bridge_device, bridge_port,
1655                                        mlxsw_sp_port);
1656         mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
1657 }
1658
1659 static void
1660 mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,
1661                             const char *mac, u16 vid,
1662                             struct net_device *dev)
1663 {
1664         struct switchdev_notifier_fdb_info info;
1665
1666         info.addr = mac;
1667         info.vid = vid;
1668         call_switchdev_notifiers(type, dev, &info.info);
1669 }
1670
1671 static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
1672                                             char *sfn_pl, int rec_index,
1673                                             bool adding)
1674 {
1675         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1676         struct mlxsw_sp_bridge_device *bridge_device;
1677         struct mlxsw_sp_bridge_port *bridge_port;
1678         struct mlxsw_sp_port *mlxsw_sp_port;
1679         enum switchdev_notifier_type type;
1680         char mac[ETH_ALEN];
1681         u8 local_port;
1682         u16 vid, fid;
1683         bool do_notification = true;
1684         int err;
1685
1686         mlxsw_reg_sfn_mac_unpack(sfn_pl, rec_index, mac, &fid, &local_port);
1687         mlxsw_sp_port = mlxsw_sp->ports[local_port];
1688         if (!mlxsw_sp_port) {
1689                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Incorrect local port in FDB notification\n");
1690                 goto just_remove;
1691         }
1692
1693         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
1694         if (!mlxsw_sp_port_vlan) {
1695                 netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
1696                 goto just_remove;
1697         }
1698
1699         bridge_port = mlxsw_sp_port_vlan->bridge_port;
1700         if (!bridge_port) {
1701                 netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
1702                 goto just_remove;
1703         }
1704
1705         bridge_device = bridge_port->bridge_device;
1706         vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
1707
1708 do_fdb_op:
1709         err = mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid,
1710                                       adding, true);
1711         if (err) {
1712                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
1713                 return;
1714         }
1715
1716         if (!do_notification)
1717                 return;
1718         type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
1719         mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev);
1720
1721         return;
1722
1723 just_remove:
1724         adding = false;
1725         do_notification = false;
1726         goto do_fdb_op;
1727 }
1728
1729 static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
1730                                                 char *sfn_pl, int rec_index,
1731                                                 bool adding)
1732 {
1733         struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1734         struct mlxsw_sp_bridge_device *bridge_device;
1735         struct mlxsw_sp_bridge_port *bridge_port;
1736         struct mlxsw_sp_port *mlxsw_sp_port;
1737         enum switchdev_notifier_type type;
1738         char mac[ETH_ALEN];
1739         u16 lag_vid = 0;
1740         u16 lag_id;
1741         u16 vid, fid;
1742         bool do_notification = true;
1743         int err;
1744
1745         mlxsw_reg_sfn_mac_lag_unpack(sfn_pl, rec_index, mac, &fid, &lag_id);
1746         mlxsw_sp_port = mlxsw_sp_lag_rep_port(mlxsw_sp, lag_id);
1747         if (!mlxsw_sp_port) {
1748                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Cannot find port representor for LAG\n");
1749                 goto just_remove;
1750         }
1751
1752         mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
1753         if (!mlxsw_sp_port_vlan) {
1754                 netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
1755                 goto just_remove;
1756         }
1757
1758         bridge_port = mlxsw_sp_port_vlan->bridge_port;
1759         if (!bridge_port) {
1760                 netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
1761                 goto just_remove;
1762         }
1763
1764         bridge_device = bridge_port->bridge_device;
1765         vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
1766         lag_vid = mlxsw_sp_port_vlan->vid;
1767
1768 do_fdb_op:
1769         err = mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp, lag_id, mac, fid, lag_vid,
1770                                           adding, true);
1771         if (err) {
1772                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
1773                 return;
1774         }
1775
1776         if (!do_notification)
1777                 return;
1778         type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
1779         mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev);
1780
1781         return;
1782
1783 just_remove:
1784         adding = false;
1785         do_notification = false;
1786         goto do_fdb_op;
1787 }
1788
1789 static void mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp *mlxsw_sp,
1790                                             char *sfn_pl, int rec_index)
1791 {
1792         switch (mlxsw_reg_sfn_rec_type_get(sfn_pl, rec_index)) {
1793         case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC:
1794                 mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
1795                                                 rec_index, true);
1796                 break;
1797         case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC:
1798                 mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
1799                                                 rec_index, false);
1800                 break;
1801         case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC_LAG:
1802                 mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
1803                                                     rec_index, true);
1804                 break;
1805         case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC_LAG:
1806                 mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
1807                                                     rec_index, false);
1808                 break;
1809         }
1810 }
1811
1812 static void mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp *mlxsw_sp)
1813 {
1814         struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
1815
1816         mlxsw_core_schedule_dw(&bridge->fdb_notify.dw,
1817                                msecs_to_jiffies(bridge->fdb_notify.interval));
1818 }
1819
1820 static void mlxsw_sp_fdb_notify_work(struct work_struct *work)
1821 {
1822         struct mlxsw_sp_bridge *bridge;
1823         struct mlxsw_sp *mlxsw_sp;
1824         char *sfn_pl;
1825         u8 num_rec;
1826         int i;
1827         int err;
1828
1829         sfn_pl = kmalloc(MLXSW_REG_SFN_LEN, GFP_KERNEL);
1830         if (!sfn_pl)
1831                 return;
1832
1833         bridge = container_of(work, struct mlxsw_sp_bridge, fdb_notify.dw.work);
1834         mlxsw_sp = bridge->mlxsw_sp;
1835
1836         rtnl_lock();
1837         mlxsw_reg_sfn_pack(sfn_pl);
1838         err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(sfn), sfn_pl);
1839         if (err) {
1840                 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to get FDB notifications\n");
1841                 goto out;
1842         }
1843         num_rec = mlxsw_reg_sfn_num_rec_get(sfn_pl);
1844         for (i = 0; i < num_rec; i++)
1845                 mlxsw_sp_fdb_notify_rec_process(mlxsw_sp, sfn_pl, i);
1846
1847 out:
1848         rtnl_unlock();
1849         kfree(sfn_pl);
1850         mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp);
1851 }
1852
1853 struct mlxsw_sp_switchdev_event_work {
1854         struct work_struct work;
1855         struct switchdev_notifier_fdb_info fdb_info;
1856         struct net_device *dev;
1857         unsigned long event;
1858 };
1859
1860 static void mlxsw_sp_switchdev_event_work(struct work_struct *work)
1861 {
1862         struct mlxsw_sp_switchdev_event_work *switchdev_work =
1863                 container_of(work, struct mlxsw_sp_switchdev_event_work, work);
1864         struct net_device *dev = switchdev_work->dev;
1865         struct switchdev_notifier_fdb_info *fdb_info;
1866         struct mlxsw_sp_port *mlxsw_sp_port;
1867         int err;
1868
1869         rtnl_lock();
1870         mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(dev);
1871         if (!mlxsw_sp_port)
1872                 goto out;
1873
1874         switch (switchdev_work->event) {
1875         case SWITCHDEV_FDB_ADD_TO_DEVICE:
1876                 fdb_info = &switchdev_work->fdb_info;
1877                 err = mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, true);
1878                 if (err)
1879                         break;
1880                 mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
1881                                             fdb_info->addr,
1882                                             fdb_info->vid, dev);
1883                 break;
1884         case SWITCHDEV_FDB_DEL_TO_DEVICE:
1885                 fdb_info = &switchdev_work->fdb_info;
1886                 mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false);
1887                 break;
1888         }
1889
1890 out:
1891         rtnl_unlock();
1892         kfree(switchdev_work->fdb_info.addr);
1893         kfree(switchdev_work);
1894         dev_put(dev);
1895 }
1896
1897 /* Called under rcu_read_lock() */
1898 static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
1899                                     unsigned long event, void *ptr)
1900 {
1901         struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1902         struct mlxsw_sp_switchdev_event_work *switchdev_work;
1903         struct switchdev_notifier_fdb_info *fdb_info = ptr;
1904
1905         if (!mlxsw_sp_port_dev_lower_find_rcu(dev))
1906                 return NOTIFY_DONE;
1907
1908         switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
1909         if (!switchdev_work)
1910                 return NOTIFY_BAD;
1911
1912         INIT_WORK(&switchdev_work->work, mlxsw_sp_switchdev_event_work);
1913         switchdev_work->dev = dev;
1914         switchdev_work->event = event;
1915
1916         switch (event) {
1917         case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */
1918         case SWITCHDEV_FDB_DEL_TO_DEVICE:
1919                 memcpy(&switchdev_work->fdb_info, ptr,
1920                        sizeof(switchdev_work->fdb_info));
1921                 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1922                 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
1923                                 fdb_info->addr);
1924                 /* Take a reference on the device. This can be either
1925                  * upper device containig mlxsw_sp_port or just a
1926                  * mlxsw_sp_port
1927                  */
1928                 dev_hold(dev);
1929                 break;
1930         default:
1931                 kfree(switchdev_work);
1932                 return NOTIFY_DONE;
1933         }
1934
1935         mlxsw_core_schedule_work(&switchdev_work->work);
1936
1937         return NOTIFY_DONE;
1938 }
1939
1940 static struct notifier_block mlxsw_sp_switchdev_notifier = {
1941         .notifier_call = mlxsw_sp_switchdev_event,
1942 };
1943
1944 static int mlxsw_sp_fdb_init(struct mlxsw_sp *mlxsw_sp)
1945 {
1946         struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
1947         int err;
1948
1949         err = mlxsw_sp_ageing_set(mlxsw_sp, MLXSW_SP_DEFAULT_AGEING_TIME);
1950         if (err) {
1951                 dev_err(mlxsw_sp->bus_info->dev, "Failed to set default ageing time\n");
1952                 return err;
1953         }
1954
1955         err = register_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
1956         if (err) {
1957                 dev_err(mlxsw_sp->bus_info->dev, "Failed to register switchdev notifier\n");
1958                 return err;
1959         }
1960
1961         INIT_DELAYED_WORK(&bridge->fdb_notify.dw, mlxsw_sp_fdb_notify_work);
1962         bridge->fdb_notify.interval = MLXSW_SP_DEFAULT_LEARNING_INTERVAL;
1963         mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp);
1964         return 0;
1965 }
1966
1967 static void mlxsw_sp_fdb_fini(struct mlxsw_sp *mlxsw_sp)
1968 {
1969         cancel_delayed_work_sync(&mlxsw_sp->bridge->fdb_notify.dw);
1970         unregister_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
1971
1972 }
1973
1974 int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp)
1975 {
1976         struct mlxsw_sp_bridge *bridge;
1977
1978         bridge = kzalloc(sizeof(*mlxsw_sp->bridge), GFP_KERNEL);
1979         if (!bridge)
1980                 return -ENOMEM;
1981         mlxsw_sp->bridge = bridge;
1982         bridge->mlxsw_sp = mlxsw_sp;
1983
1984         INIT_LIST_HEAD(&mlxsw_sp->bridge->bridges_list);
1985         INIT_LIST_HEAD(&mlxsw_sp->bridge->mids_list);
1986
1987         bridge->bridge_8021q_ops = &mlxsw_sp_bridge_8021q_ops;
1988         bridge->bridge_8021d_ops = &mlxsw_sp_bridge_8021d_ops;
1989
1990         return mlxsw_sp_fdb_init(mlxsw_sp);
1991 }
1992
1993 void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp)
1994 {
1995         mlxsw_sp_fdb_fini(mlxsw_sp);
1996         WARN_ON(!list_empty(&mlxsw_sp->bridge->mids_list));
1997         WARN_ON(!list_empty(&mlxsw_sp->bridge->bridges_list));
1998         kfree(mlxsw_sp->bridge);
1999 }
2000
2001 void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port)
2002 {
2003         mlxsw_sp_port->dev->switchdev_ops = &mlxsw_sp_port_switchdev_ops;
2004 }
2005
2006 void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port)
2007 {
2008 }