@@ -572,27 +572,9 @@ static void mlxsw_emad_rx_listener_func(struct sk_buff *skb, u8 local_port,
572
572
dev_kfree_skb (skb );
573
573
}
574
574
575
- static const struct mlxsw_rx_listener mlxsw_emad_rx_listener = {
576
- .func = mlxsw_emad_rx_listener_func ,
577
- .local_port = MLXSW_PORT_DONT_CARE ,
578
- .trap_id = MLXSW_TRAP_ID_ETHEMAD ,
579
- };
580
-
581
- static int mlxsw_emad_traps_set (struct mlxsw_core * mlxsw_core )
582
- {
583
- char htgt_pl [MLXSW_REG_HTGT_LEN ];
584
- char hpkt_pl [MLXSW_REG_HPKT_LEN ];
585
- int err ;
586
-
587
- mlxsw_reg_htgt_pack (htgt_pl , MLXSW_REG_HTGT_TRAP_GROUP_EMAD );
588
- err = mlxsw_reg_write (mlxsw_core , MLXSW_REG (htgt ), htgt_pl );
589
- if (err )
590
- return err ;
591
-
592
- mlxsw_reg_hpkt_pack (hpkt_pl , MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU ,
593
- MLXSW_TRAP_ID_ETHEMAD );
594
- return mlxsw_reg_write (mlxsw_core , MLXSW_REG (hpkt ), hpkt_pl );
595
- }
575
+ static const struct mlxsw_listener mlxsw_emad_rx_listener =
576
+ MLXSW_RXL (mlxsw_emad_rx_listener_func , ETHEMAD , TRAP_TO_CPU , false,
577
+ EMAD , DISCARD );
596
578
597
579
static int mlxsw_emad_init (struct mlxsw_core * mlxsw_core )
598
580
{
@@ -613,42 +595,33 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
613
595
INIT_LIST_HEAD (& mlxsw_core -> emad .trans_list );
614
596
spin_lock_init (& mlxsw_core -> emad .trans_list_lock );
615
597
616
- err = mlxsw_core_rx_listener_register (mlxsw_core ,
617
- & mlxsw_emad_rx_listener ,
618
- mlxsw_core );
598
+ err = mlxsw_core_trap_register (mlxsw_core , & mlxsw_emad_rx_listener ,
599
+ mlxsw_core );
619
600
if (err )
620
601
return err ;
621
602
622
- err = mlxsw_emad_traps_set (mlxsw_core );
603
+ err = mlxsw_core -> driver -> basic_trap_groups_set (mlxsw_core );
623
604
if (err )
624
605
goto err_emad_trap_set ;
625
-
626
606
mlxsw_core -> emad .use_emad = true;
627
607
628
608
return 0 ;
629
609
630
610
err_emad_trap_set :
631
- mlxsw_core_rx_listener_unregister (mlxsw_core ,
632
- & mlxsw_emad_rx_listener ,
633
- mlxsw_core );
611
+ mlxsw_core_trap_unregister (mlxsw_core , & mlxsw_emad_rx_listener ,
612
+ mlxsw_core );
634
613
return err ;
635
614
}
636
615
637
616
static void mlxsw_emad_fini (struct mlxsw_core * mlxsw_core )
638
617
{
639
- char hpkt_pl [MLXSW_REG_HPKT_LEN ];
640
618
641
619
if (!(mlxsw_core -> bus -> features & MLXSW_BUS_F_TXRX ))
642
620
return ;
643
621
644
622
mlxsw_core -> emad .use_emad = false;
645
- mlxsw_reg_hpkt_pack (hpkt_pl , MLXSW_REG_HPKT_ACTION_DISCARD ,
646
- MLXSW_TRAP_ID_ETHEMAD );
647
- mlxsw_reg_write (mlxsw_core , MLXSW_REG (hpkt ), hpkt_pl );
648
-
649
- mlxsw_core_rx_listener_unregister (mlxsw_core ,
650
- & mlxsw_emad_rx_listener ,
651
- mlxsw_core );
623
+ mlxsw_core_trap_unregister (mlxsw_core , & mlxsw_emad_rx_listener ,
624
+ mlxsw_core );
652
625
}
653
626
654
627
static struct sk_buff * mlxsw_emad_alloc (const struct mlxsw_core * mlxsw_core ,
@@ -1392,6 +1365,75 @@ void mlxsw_core_event_listener_unregister(struct mlxsw_core *mlxsw_core,
1392
1365
}
1393
1366
EXPORT_SYMBOL (mlxsw_core_event_listener_unregister );
1394
1367
1368
+ static int mlxsw_core_listener_register (struct mlxsw_core * mlxsw_core ,
1369
+ const struct mlxsw_listener * listener ,
1370
+ void * priv )
1371
+ {
1372
+ if (listener -> is_event )
1373
+ return mlxsw_core_event_listener_register (mlxsw_core ,
1374
+ & listener -> u .event_listener ,
1375
+ priv );
1376
+ else
1377
+ return mlxsw_core_rx_listener_register (mlxsw_core ,
1378
+ & listener -> u .rx_listener ,
1379
+ priv );
1380
+ }
1381
+
1382
+ static void mlxsw_core_listener_unregister (struct mlxsw_core * mlxsw_core ,
1383
+ const struct mlxsw_listener * listener ,
1384
+ void * priv )
1385
+ {
1386
+ if (listener -> is_event )
1387
+ mlxsw_core_event_listener_unregister (mlxsw_core ,
1388
+ & listener -> u .event_listener ,
1389
+ priv );
1390
+ else
1391
+ mlxsw_core_rx_listener_unregister (mlxsw_core ,
1392
+ & listener -> u .rx_listener ,
1393
+ priv );
1394
+ }
1395
+
1396
+ int mlxsw_core_trap_register (struct mlxsw_core * mlxsw_core ,
1397
+ const struct mlxsw_listener * listener , void * priv )
1398
+ {
1399
+ char hpkt_pl [MLXSW_REG_HPKT_LEN ];
1400
+ int err ;
1401
+
1402
+ err = mlxsw_core_listener_register (mlxsw_core , listener , priv );
1403
+ if (err )
1404
+ return err ;
1405
+
1406
+ mlxsw_reg_hpkt_pack (hpkt_pl , listener -> action , listener -> trap_id ,
1407
+ listener -> trap_group , listener -> is_ctrl );
1408
+ err = mlxsw_reg_write (mlxsw_core , MLXSW_REG (hpkt ), hpkt_pl );
1409
+ if (err )
1410
+ goto err_trap_set ;
1411
+
1412
+ return 0 ;
1413
+
1414
+ err_trap_set :
1415
+ mlxsw_core_listener_unregister (mlxsw_core , listener , priv );
1416
+ return err ;
1417
+ }
1418
+ EXPORT_SYMBOL (mlxsw_core_trap_register );
1419
+
1420
+ void mlxsw_core_trap_unregister (struct mlxsw_core * mlxsw_core ,
1421
+ const struct mlxsw_listener * listener ,
1422
+ void * priv )
1423
+ {
1424
+ char hpkt_pl [MLXSW_REG_HPKT_LEN ];
1425
+
1426
+ if (!listener -> is_event ) {
1427
+ mlxsw_reg_hpkt_pack (hpkt_pl , listener -> unreg_action ,
1428
+ listener -> trap_id , listener -> trap_group ,
1429
+ listener -> is_ctrl );
1430
+ mlxsw_reg_write (mlxsw_core , MLXSW_REG (hpkt ), hpkt_pl );
1431
+ }
1432
+
1433
+ mlxsw_core_listener_unregister (mlxsw_core , listener , priv );
1434
+ }
1435
+ EXPORT_SYMBOL (mlxsw_core_trap_unregister );
1436
+
1395
1437
static u64 mlxsw_core_tid_get (struct mlxsw_core * mlxsw_core )
1396
1438
{
1397
1439
return atomic64_inc_return (& mlxsw_core -> emad .tid );
0 commit comments