@@ -27,6 +27,7 @@ struct mlxsw_sp_fid {
27
27
struct mlxsw_sp_rif * rif ;
28
28
refcount_t ref_count ;
29
29
u16 fid_index ;
30
+ u16 fid_offset ;
30
31
struct mlxsw_sp_fid_family * fid_family ;
31
32
struct rhash_head ht_node ;
32
33
@@ -102,7 +103,6 @@ struct mlxsw_sp_fid_family {
102
103
enum mlxsw_sp_rif_type rif_type ;
103
104
const struct mlxsw_sp_fid_ops * ops ;
104
105
struct mlxsw_sp * mlxsw_sp ;
105
- u8 lag_vid_valid :1 ;
106
106
};
107
107
108
108
static const int mlxsw_sp_sfgc_uc_packet_types [MLXSW_REG_SFGC_TYPE_MAX ] = {
@@ -137,11 +137,6 @@ bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index)
137
137
return fid_family -> start_index == fid_index ;
138
138
}
139
139
140
- bool mlxsw_sp_fid_lag_vid_valid (const struct mlxsw_sp_fid * fid )
141
- {
142
- return fid -> fid_family -> lag_vid_valid ;
143
- }
144
-
145
140
struct mlxsw_sp_fid * mlxsw_sp_fid_lookup_by_index (struct mlxsw_sp * mlxsw_sp ,
146
141
u16 fid_index )
147
142
{
@@ -206,7 +201,7 @@ int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid,
206
201
const struct mlxsw_sp_fid_ops * ops = fid_family -> ops ;
207
202
int err ;
208
203
209
- if (WARN_ON (! ops -> nve_flood_index_set || fid -> nve_flood_index_valid ))
204
+ if (WARN_ON (fid -> nve_flood_index_valid ))
210
205
return - EINVAL ;
211
206
212
207
err = ops -> nve_flood_index_set (fid , nve_flood_index );
@@ -224,7 +219,7 @@ void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid)
224
219
struct mlxsw_sp_fid_family * fid_family = fid -> fid_family ;
225
220
const struct mlxsw_sp_fid_ops * ops = fid_family -> ops ;
226
221
227
- if (WARN_ON (!ops -> nve_flood_index_clear || ! fid -> nve_flood_index_valid ))
222
+ if (WARN_ON (!fid -> nve_flood_index_valid ))
228
223
return ;
229
224
230
225
fid -> nve_flood_index_valid = false;
@@ -244,7 +239,7 @@ int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,
244
239
struct mlxsw_sp * mlxsw_sp = fid_family -> mlxsw_sp ;
245
240
int err ;
246
241
247
- if (WARN_ON (! ops -> vni_set || fid -> vni_valid ))
242
+ if (WARN_ON (fid -> vni_valid ))
248
243
return - EINVAL ;
249
244
250
245
fid -> nve_type = type ;
@@ -276,7 +271,7 @@ void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid)
276
271
const struct mlxsw_sp_fid_ops * ops = fid_family -> ops ;
277
272
struct mlxsw_sp * mlxsw_sp = fid_family -> mlxsw_sp ;
278
273
279
- if (WARN_ON (!ops -> vni_clear || ! fid -> vni_valid ))
274
+ if (WARN_ON (!fid -> vni_valid ))
280
275
return ;
281
276
282
277
fid -> vni_valid = false;
@@ -405,6 +400,7 @@ static void mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg)
405
400
u16 vid = * (u16 * ) arg ;
406
401
407
402
mlxsw_sp_fid_8021q_fid (fid )-> vid = vid ;
403
+ fid -> fid_offset = 0 ;
408
404
}
409
405
410
406
static enum mlxsw_reg_sfmr_op mlxsw_sp_sfmr_op (bool valid )
@@ -424,13 +420,13 @@ static int mlxsw_sp_fid_op(struct mlxsw_sp *mlxsw_sp, u16 fid_index,
424
420
}
425
421
426
422
static int mlxsw_sp_fid_vni_op (struct mlxsw_sp * mlxsw_sp , u16 fid_index ,
427
- __be32 vni , bool vni_valid , u32 nve_flood_index ,
428
- bool nve_flood_index_valid )
423
+ u16 fid_offset , __be32 vni , bool vni_valid ,
424
+ u32 nve_flood_index , bool nve_flood_index_valid )
429
425
{
430
426
char sfmr_pl [MLXSW_REG_SFMR_LEN ];
431
427
432
428
mlxsw_reg_sfmr_pack (sfmr_pl , MLXSW_REG_SFMR_OP_CREATE_FID , fid_index ,
433
- 0 );
429
+ fid_offset );
434
430
mlxsw_reg_sfmr_vv_set (sfmr_pl , vni_valid );
435
431
mlxsw_reg_sfmr_vni_set (sfmr_pl , be32_to_cpu (vni ));
436
432
mlxsw_reg_sfmr_vtfp_set (sfmr_pl , nve_flood_index_valid );
@@ -459,20 +455,23 @@ static void mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg)
459
455
int br_ifindex = * (int * ) arg ;
460
456
461
457
mlxsw_sp_fid_8021d_fid (fid )-> br_ifindex = br_ifindex ;
458
+ fid -> fid_offset = 0 ;
462
459
}
463
460
464
461
static int mlxsw_sp_fid_8021d_configure (struct mlxsw_sp_fid * fid )
465
462
{
466
463
struct mlxsw_sp_fid_family * fid_family = fid -> fid_family ;
467
464
468
- return mlxsw_sp_fid_op (fid_family -> mlxsw_sp , fid -> fid_index , 0 , true);
465
+ return mlxsw_sp_fid_op (fid_family -> mlxsw_sp , fid -> fid_index ,
466
+ fid -> fid_offset , true);
469
467
}
470
468
471
469
static void mlxsw_sp_fid_8021d_deconfigure (struct mlxsw_sp_fid * fid )
472
470
{
473
471
if (fid -> vni_valid )
474
472
mlxsw_sp_nve_fid_disable (fid -> fid_family -> mlxsw_sp , fid );
475
- mlxsw_sp_fid_op (fid -> fid_family -> mlxsw_sp , fid -> fid_index , 0 , false);
473
+ mlxsw_sp_fid_op (fid -> fid_family -> mlxsw_sp , fid -> fid_index ,
474
+ fid -> fid_offset , false);
476
475
}
477
476
478
477
static int mlxsw_sp_fid_8021d_index_alloc (struct mlxsw_sp_fid * fid ,
@@ -614,17 +613,19 @@ static int mlxsw_sp_fid_8021d_vni_set(struct mlxsw_sp_fid *fid, __be32 vni)
614
613
{
615
614
struct mlxsw_sp_fid_family * fid_family = fid -> fid_family ;
616
615
617
- return mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index , vni ,
618
- true, fid -> nve_flood_index ,
616
+ return mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index ,
617
+ fid -> fid_offset , vni , true,
618
+ fid -> nve_flood_index ,
619
619
fid -> nve_flood_index_valid );
620
620
}
621
621
622
622
static void mlxsw_sp_fid_8021d_vni_clear (struct mlxsw_sp_fid * fid )
623
623
{
624
624
struct mlxsw_sp_fid_family * fid_family = fid -> fid_family ;
625
625
626
- mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index , 0 , false,
627
- fid -> nve_flood_index , fid -> nve_flood_index_valid );
626
+ mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index ,
627
+ fid -> fid_offset , 0 , false, fid -> nve_flood_index ,
628
+ fid -> nve_flood_index_valid );
628
629
}
629
630
630
631
static int mlxsw_sp_fid_8021d_nve_flood_index_set (struct mlxsw_sp_fid * fid ,
@@ -633,16 +634,17 @@ static int mlxsw_sp_fid_8021d_nve_flood_index_set(struct mlxsw_sp_fid *fid,
633
634
struct mlxsw_sp_fid_family * fid_family = fid -> fid_family ;
634
635
635
636
return mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index ,
636
- fid -> vni , fid -> vni_valid , nve_flood_index ,
637
- true);
637
+ fid -> fid_offset , fid -> vni , fid -> vni_valid ,
638
+ nve_flood_index , true);
638
639
}
639
640
640
641
static void mlxsw_sp_fid_8021d_nve_flood_index_clear (struct mlxsw_sp_fid * fid )
641
642
{
642
643
struct mlxsw_sp_fid_family * fid_family = fid -> fid_family ;
643
644
644
- mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index , fid -> vni ,
645
- fid -> vni_valid , 0 , false);
645
+ mlxsw_sp_fid_vni_op (fid_family -> mlxsw_sp , fid -> fid_index ,
646
+ fid -> fid_offset , fid -> vni , fid -> vni_valid , 0 ,
647
+ false);
646
648
}
647
649
648
650
static void
@@ -699,7 +701,6 @@ static const struct mlxsw_sp_fid_family mlxsw_sp_fid_8021d_family = {
699
701
.nr_flood_tables = ARRAY_SIZE (mlxsw_sp_fid_8021d_flood_tables ),
700
702
.rif_type = MLXSW_SP_RIF_TYPE_FID ,
701
703
.ops = & mlxsw_sp_fid_8021d_ops ,
702
- .lag_vid_valid = 1 ,
703
704
};
704
705
705
706
static bool
@@ -748,9 +749,13 @@ static const struct mlxsw_sp_fid_family mlxsw_sp_fid_8021q_emu_family = {
748
749
.nr_flood_tables = ARRAY_SIZE (mlxsw_sp_fid_8021d_flood_tables ),
749
750
.rif_type = MLXSW_SP_RIF_TYPE_VLAN ,
750
751
.ops = & mlxsw_sp_fid_8021q_emu_ops ,
751
- .lag_vid_valid = 1 ,
752
752
};
753
753
754
+ static void mlxsw_sp_fid_rfid_setup (struct mlxsw_sp_fid * fid , const void * arg )
755
+ {
756
+ fid -> fid_offset = 0 ;
757
+ }
758
+
754
759
static int mlxsw_sp_fid_rfid_configure (struct mlxsw_sp_fid * fid )
755
760
{
756
761
/* rFIDs are allocated by the device during init */
@@ -815,13 +820,39 @@ mlxsw_sp_fid_rfid_port_vid_unmap(struct mlxsw_sp_fid *fid,
815
820
mlxsw_sp -> fid_core -> port_fid_mappings [local_port ]-- ;
816
821
}
817
822
823
+ static int mlxsw_sp_fid_rfid_vni_set (struct mlxsw_sp_fid * fid , __be32 vni )
824
+ {
825
+ return - EOPNOTSUPP ;
826
+ }
827
+
828
+ static void mlxsw_sp_fid_rfid_vni_clear (struct mlxsw_sp_fid * fid )
829
+ {
830
+ WARN_ON_ONCE (1 );
831
+ }
832
+
833
+ static int mlxsw_sp_fid_rfid_nve_flood_index_set (struct mlxsw_sp_fid * fid ,
834
+ u32 nve_flood_index )
835
+ {
836
+ return - EOPNOTSUPP ;
837
+ }
838
+
839
+ static void mlxsw_sp_fid_rfid_nve_flood_index_clear (struct mlxsw_sp_fid * fid )
840
+ {
841
+ WARN_ON_ONCE (1 );
842
+ }
843
+
818
844
static const struct mlxsw_sp_fid_ops mlxsw_sp_fid_rfid_ops = {
845
+ .setup = mlxsw_sp_fid_rfid_setup ,
819
846
.configure = mlxsw_sp_fid_rfid_configure ,
820
847
.deconfigure = mlxsw_sp_fid_rfid_deconfigure ,
821
848
.index_alloc = mlxsw_sp_fid_rfid_index_alloc ,
822
849
.compare = mlxsw_sp_fid_rfid_compare ,
823
850
.port_vid_map = mlxsw_sp_fid_rfid_port_vid_map ,
824
851
.port_vid_unmap = mlxsw_sp_fid_rfid_port_vid_unmap ,
852
+ .vni_set = mlxsw_sp_fid_rfid_vni_set ,
853
+ .vni_clear = mlxsw_sp_fid_rfid_vni_clear ,
854
+ .nve_flood_index_set = mlxsw_sp_fid_rfid_nve_flood_index_set ,
855
+ .nve_flood_index_clear = mlxsw_sp_fid_rfid_nve_flood_index_clear ,
825
856
};
826
857
827
858
#define MLXSW_SP_RFID_BASE (15 * 1024)
@@ -836,16 +867,22 @@ static const struct mlxsw_sp_fid_family mlxsw_sp_fid_rfid_family = {
836
867
.ops = & mlxsw_sp_fid_rfid_ops ,
837
868
};
838
869
870
+ static void mlxsw_sp_fid_dummy_setup (struct mlxsw_sp_fid * fid , const void * arg )
871
+ {
872
+ fid -> fid_offset = 0 ;
873
+ }
874
+
839
875
static int mlxsw_sp_fid_dummy_configure (struct mlxsw_sp_fid * fid )
840
876
{
841
877
struct mlxsw_sp * mlxsw_sp = fid -> fid_family -> mlxsw_sp ;
842
878
843
- return mlxsw_sp_fid_op (mlxsw_sp , fid -> fid_index , 0 , true);
879
+ return mlxsw_sp_fid_op (mlxsw_sp , fid -> fid_index , fid -> fid_offset , true);
844
880
}
845
881
846
882
static void mlxsw_sp_fid_dummy_deconfigure (struct mlxsw_sp_fid * fid )
847
883
{
848
- mlxsw_sp_fid_op (fid -> fid_family -> mlxsw_sp , fid -> fid_index , 0 , false);
884
+ mlxsw_sp_fid_op (fid -> fid_family -> mlxsw_sp , fid -> fid_index ,
885
+ fid -> fid_offset , false);
849
886
}
850
887
851
888
static int mlxsw_sp_fid_dummy_index_alloc (struct mlxsw_sp_fid * fid ,
@@ -862,11 +899,37 @@ static bool mlxsw_sp_fid_dummy_compare(const struct mlxsw_sp_fid *fid,
862
899
return true;
863
900
}
864
901
902
+ static int mlxsw_sp_fid_dummy_vni_set (struct mlxsw_sp_fid * fid , __be32 vni )
903
+ {
904
+ return - EOPNOTSUPP ;
905
+ }
906
+
907
+ static void mlxsw_sp_fid_dummy_vni_clear (struct mlxsw_sp_fid * fid )
908
+ {
909
+ WARN_ON_ONCE (1 );
910
+ }
911
+
912
+ static int mlxsw_sp_fid_dummy_nve_flood_index_set (struct mlxsw_sp_fid * fid ,
913
+ u32 nve_flood_index )
914
+ {
915
+ return - EOPNOTSUPP ;
916
+ }
917
+
918
+ static void mlxsw_sp_fid_dummy_nve_flood_index_clear (struct mlxsw_sp_fid * fid )
919
+ {
920
+ WARN_ON_ONCE (1 );
921
+ }
922
+
865
923
static const struct mlxsw_sp_fid_ops mlxsw_sp_fid_dummy_ops = {
924
+ .setup = mlxsw_sp_fid_dummy_setup ,
866
925
.configure = mlxsw_sp_fid_dummy_configure ,
867
926
.deconfigure = mlxsw_sp_fid_dummy_deconfigure ,
868
927
.index_alloc = mlxsw_sp_fid_dummy_index_alloc ,
869
928
.compare = mlxsw_sp_fid_dummy_compare ,
929
+ .vni_set = mlxsw_sp_fid_dummy_vni_set ,
930
+ .vni_clear = mlxsw_sp_fid_dummy_vni_clear ,
931
+ .nve_flood_index_set = mlxsw_sp_fid_dummy_nve_flood_index_set ,
932
+ .nve_flood_index_clear = mlxsw_sp_fid_dummy_nve_flood_index_clear ,
870
933
};
871
934
872
935
static const struct mlxsw_sp_fid_family mlxsw_sp_fid_dummy_family = {
@@ -927,8 +990,7 @@ static struct mlxsw_sp_fid *mlxsw_sp_fid_get(struct mlxsw_sp *mlxsw_sp,
927
990
fid -> fid_index = fid_index ;
928
991
__set_bit (fid_index - fid_family -> start_index , fid_family -> fids_bitmap );
929
992
930
- if (fid -> fid_family -> ops -> setup )
931
- fid -> fid_family -> ops -> setup (fid , arg );
993
+ fid -> fid_family -> ops -> setup (fid , arg );
932
994
933
995
err = fid -> fid_family -> ops -> configure (fid );
934
996
if (err )
0 commit comments