17
17
#include "smc_ism.h"
18
18
#include "smc_pnet.h"
19
19
#include "smc_netlink.h"
20
+ #include "linux/ism.h"
20
21
21
22
struct smcd_dev_list smcd_dev_list = {
22
23
.list = LIST_HEAD_INIT (smcd_dev_list .list ),
@@ -26,6 +27,20 @@ struct smcd_dev_list smcd_dev_list = {
26
27
static bool smc_ism_v2_capable ;
27
28
static u8 smc_ism_v2_system_eid [SMC_MAX_EID_LEN ];
28
29
30
+ static void smcd_register_dev (struct ism_dev * ism );
31
+ static void smcd_unregister_dev (struct ism_dev * ism );
32
+ static void smcd_handle_event (struct ism_dev * ism , struct ism_event * event );
33
+ static void smcd_handle_irq (struct ism_dev * ism , unsigned int dmbno ,
34
+ u16 dmbemask );
35
+
36
+ static struct ism_client smc_ism_client = {
37
+ .name = "SMC-D" ,
38
+ .add = smcd_register_dev ,
39
+ .remove = smcd_unregister_dev ,
40
+ .handle_event = smcd_handle_event ,
41
+ .handle_irq = smcd_handle_irq ,
42
+ };
43
+
29
44
/* Test if an ISM communication is possible - same CPC */
30
45
int smc_ism_cantalk (u64 peer_gid , unsigned short vlan_id , struct smcd_dev * smcd )
31
46
{
@@ -409,8 +424,6 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
409
424
device_initialize (& smcd -> dev );
410
425
dev_set_name (& smcd -> dev , name );
411
426
smcd -> ops = ops ;
412
- if (smc_pnetid_by_dev_port (parent , 0 , smcd -> pnetid ))
413
- smc_pnetid_by_table_smcd (smcd );
414
427
415
428
spin_lock_init (& smcd -> lock );
416
429
spin_lock_init (& smcd -> lgr_lock );
@@ -421,9 +434,25 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
421
434
}
422
435
EXPORT_SYMBOL_GPL (smcd_alloc_dev );
423
436
424
- int smcd_register_dev (struct smcd_dev * smcd )
437
+ void smcd_free_dev (struct smcd_dev * smcd )
425
438
{
426
- int rc ;
439
+ put_device (& smcd -> dev );
440
+ }
441
+ EXPORT_SYMBOL_GPL (smcd_free_dev );
442
+
443
+ static void smcd_register_dev (struct ism_dev * ism )
444
+ {
445
+ const struct smcd_ops * ops = NULL ;
446
+ struct smcd_dev * smcd ;
447
+
448
+ smcd = smcd_alloc_dev (& ism -> pdev -> dev , dev_name (& ism -> pdev -> dev ), ops ,
449
+ ISM_NR_DMBS );
450
+ if (!smcd )
451
+ return ;
452
+ smcd -> priv = ism ;
453
+ ism_set_priv (ism , & smc_ism_client , smcd );
454
+ if (smc_pnetid_by_dev_port (& ism -> pdev -> dev , 0 , smcd -> pnetid ))
455
+ smc_pnetid_by_table_smcd (smcd );
427
456
428
457
mutex_lock (& smcd_dev_list .mutex );
429
458
if (list_empty (& smcd_dev_list .list )) {
@@ -447,19 +476,20 @@ int smcd_register_dev(struct smcd_dev *smcd)
447
476
dev_name (& smcd -> dev ), smcd -> pnetid ,
448
477
smcd -> pnetid_by_user ? " (user defined)" : "" );
449
478
450
- rc = device_add (& smcd -> dev );
451
- if (rc ) {
479
+ if (device_add (& smcd -> dev )) {
452
480
mutex_lock (& smcd_dev_list .mutex );
453
481
list_del (& smcd -> list );
454
482
mutex_unlock (& smcd_dev_list .mutex );
483
+ smcd_free_dev (smcd );
455
484
}
456
485
457
- return rc ;
486
+ return ;
458
487
}
459
- EXPORT_SYMBOL_GPL (smcd_register_dev );
460
488
461
- void smcd_unregister_dev (struct smcd_dev * smcd )
489
+ static void smcd_unregister_dev (struct ism_dev * ism )
462
490
{
491
+ struct smcd_dev * smcd = ism_get_priv (ism , & smc_ism_client );
492
+
463
493
pr_warn_ratelimited ("smc: removing smcd device %s\n" ,
464
494
dev_name (& smcd -> dev ));
465
495
smcd -> going_away = 1 ;
@@ -471,16 +501,9 @@ void smcd_unregister_dev(struct smcd_dev *smcd)
471
501
472
502
device_del (& smcd -> dev );
473
503
}
474
- EXPORT_SYMBOL_GPL (smcd_unregister_dev );
475
-
476
- void smcd_free_dev (struct smcd_dev * smcd )
477
- {
478
- put_device (& smcd -> dev );
479
- }
480
- EXPORT_SYMBOL_GPL (smcd_free_dev );
481
504
482
505
/* SMCD Device event handler. Called from ISM device interrupt handler.
483
- * Parameters are smcd device pointer,
506
+ * Parameters are ism device pointer,
484
507
* - event->type (0 --> DMB, 1 --> GID),
485
508
* - event->code (event code),
486
509
* - event->tok (either DMB token when event type 0, or GID when event type 1)
@@ -490,8 +513,9 @@ EXPORT_SYMBOL_GPL(smcd_free_dev);
490
513
* Context:
491
514
* - Function called in IRQ context from ISM device driver event handler.
492
515
*/
493
- void smcd_handle_event (struct smcd_dev * smcd , struct ism_event * event )
516
+ static void smcd_handle_event (struct ism_dev * ism , struct ism_event * event )
494
517
{
518
+ struct smcd_dev * smcd = ism_get_priv (ism , & smc_ism_client );
495
519
struct smc_ism_event_work * wrk ;
496
520
497
521
if (smcd -> going_away )
@@ -505,17 +529,18 @@ void smcd_handle_event(struct smcd_dev *smcd, struct ism_event *event)
505
529
wrk -> event = * event ;
506
530
queue_work (smcd -> event_wq , & wrk -> work );
507
531
}
508
- EXPORT_SYMBOL_GPL (smcd_handle_event );
509
532
510
533
/* SMCD Device interrupt handler. Called from ISM device interrupt handler.
511
- * Parameters are smcd device pointer, DMB number, and the DMBE bitmask.
534
+ * Parameters are the ism device pointer, DMB number, and the DMBE bitmask.
512
535
* Find the connection and schedule the tasklet for this connection.
513
536
*
514
537
* Context:
515
538
* - Function called in IRQ context from ISM device driver IRQ handler.
516
539
*/
517
- void smcd_handle_irq (struct smcd_dev * smcd , unsigned int dmbno , u16 dmbemask )
540
+ static void smcd_handle_irq (struct ism_dev * ism , unsigned int dmbno ,
541
+ u16 dmbemask )
518
542
{
543
+ struct smcd_dev * smcd = ism_get_priv (ism , & smc_ism_client );
519
544
struct smc_connection * conn = NULL ;
520
545
unsigned long flags ;
521
546
@@ -525,10 +550,21 @@ void smcd_handle_irq(struct smcd_dev *smcd, unsigned int dmbno, u16 dmbemask)
525
550
tasklet_schedule (& conn -> rx_tsklet );
526
551
spin_unlock_irqrestore (& smcd -> lock , flags );
527
552
}
528
- EXPORT_SYMBOL_GPL (smcd_handle_irq );
529
553
530
- void __init smc_ism_init (void )
554
+ int smc_ism_init (void )
531
555
{
532
556
smc_ism_v2_capable = false;
533
557
memset (smc_ism_v2_system_eid , 0 , SMC_MAX_EID_LEN );
558
+ #if IS_ENABLED (CONFIG_ISM )
559
+ return ism_register_client (& smc_ism_client );
560
+ #else
561
+ return 0 ;
562
+ #endif
563
+ }
564
+
565
+ void smc_ism_exit (void )
566
+ {
567
+ #if IS_ENABLED (CONFIG_ISM )
568
+ ism_unregister_client (& smc_ism_client );
569
+ #endif
534
570
}
0 commit comments