@@ -712,7 +712,7 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block)
712
712
}
713
713
EXPORT_SYMBOL (mlxsw_afa_block_append_drop );
714
714
715
- int mlxsw_afa_block_append_trap (struct mlxsw_afa_block * block )
715
+ int mlxsw_afa_block_append_trap (struct mlxsw_afa_block * block , u16 trap_id )
716
716
{
717
717
char * act = mlxsw_afa_block_append_action (block ,
718
718
MLXSW_AFA_TRAPDISC_CODE ,
@@ -722,7 +722,7 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block)
722
722
return - ENOBUFS ;
723
723
mlxsw_afa_trapdisc_pack (act , MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP ,
724
724
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD ,
725
- MLXSW_TRAP_ID_ACL0 );
725
+ trap_id );
726
726
return 0 ;
727
727
}
728
728
EXPORT_SYMBOL (mlxsw_afa_block_append_trap );
@@ -891,3 +891,74 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid)
891
891
return 0 ;
892
892
}
893
893
EXPORT_SYMBOL (mlxsw_afa_block_append_fid_set );
894
+
895
+ /* MC Routing Action
896
+ * -----------------
897
+ * The Multicast router action. Can be used by RMFT_V2 - Router Multicast
898
+ * Forwarding Table Version 2 Register.
899
+ */
900
+
901
+ #define MLXSW_AFA_MCROUTER_CODE 0x10
902
+ #define MLXSW_AFA_MCROUTER_SIZE 2
903
+
904
+ enum mlxsw_afa_mcrouter_rpf_action {
905
+ MLXSW_AFA_MCROUTER_RPF_ACTION_NOP ,
906
+ MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP ,
907
+ MLXSW_AFA_MCROUTER_RPF_ACTION_DISCARD_ERROR ,
908
+ };
909
+
910
+ /* afa_mcrouter_rpf_action */
911
+ MLXSW_ITEM32 (afa , mcrouter , rpf_action , 0x00 , 28 , 3 );
912
+
913
+ /* afa_mcrouter_expected_irif */
914
+ MLXSW_ITEM32 (afa , mcrouter , expected_irif , 0x00 , 0 , 16 );
915
+
916
+ /* afa_mcrouter_min_mtu */
917
+ MLXSW_ITEM32 (afa , mcrouter , min_mtu , 0x08 , 0 , 16 );
918
+
919
+ enum mlxsw_afa_mrouter_vrmid {
920
+ MLXSW_AFA_MCROUTER_VRMID_INVALID ,
921
+ MLXSW_AFA_MCROUTER_VRMID_VALID
922
+ };
923
+
924
+ /* afa_mcrouter_vrmid
925
+ * Valid RMID: rigr_rmid_index is used as RMID
926
+ */
927
+ MLXSW_ITEM32 (afa , mcrouter , vrmid , 0x0C , 31 , 1 );
928
+
929
+ /* afa_mcrouter_rigr_rmid_index
930
+ * When the vrmid field is set to invalid, the field is used as pointer to
931
+ * Router Interface Group (RIGR) Table in the KVD linear.
932
+ * When the vrmid is set to valid, the field is used as RMID index, ranged
933
+ * from 0 to max_mid - 1. The index is to the Port Group Table.
934
+ */
935
+ MLXSW_ITEM32 (afa , mcrouter , rigr_rmid_index , 0x0C , 0 , 24 );
936
+
937
+ static inline void
938
+ mlxsw_afa_mcrouter_pack (char * payload ,
939
+ enum mlxsw_afa_mcrouter_rpf_action rpf_action ,
940
+ u16 expected_irif , u16 min_mtu ,
941
+ enum mlxsw_afa_mrouter_vrmid vrmid , u32 rigr_rmid_index )
942
+
943
+ {
944
+ mlxsw_afa_mcrouter_rpf_action_set (payload , rpf_action );
945
+ mlxsw_afa_mcrouter_expected_irif_set (payload , expected_irif );
946
+ mlxsw_afa_mcrouter_min_mtu_set (payload , min_mtu );
947
+ mlxsw_afa_mcrouter_vrmid_set (payload , vrmid );
948
+ mlxsw_afa_mcrouter_rigr_rmid_index_set (payload , rigr_rmid_index );
949
+ }
950
+
951
+ int mlxsw_afa_block_append_mcrouter (struct mlxsw_afa_block * block ,
952
+ u16 expected_irif , u16 min_mtu ,
953
+ bool rmid_valid , u32 kvdl_index )
954
+ {
955
+ char * act = mlxsw_afa_block_append_action (block ,
956
+ MLXSW_AFA_MCROUTER_CODE ,
957
+ MLXSW_AFA_MCROUTER_SIZE );
958
+ if (!act )
959
+ return - ENOBUFS ;
960
+ mlxsw_afa_mcrouter_pack (act , MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP ,
961
+ expected_irif , min_mtu , rmid_valid , kvdl_index );
962
+ return 0 ;
963
+ }
964
+ EXPORT_SYMBOL (mlxsw_afa_block_append_mcrouter );
0 commit comments