@@ -273,10 +273,9 @@ static int ism_read_local_gid(struct ism_dev *ism)
273
273
return ret ;
274
274
}
275
275
276
- static int ism_query_rgid (struct smcd_dev * smcd , u64 rgid , u32 vid_valid ,
276
+ static int ism_query_rgid (struct ism_dev * ism , u64 rgid , u32 vid_valid ,
277
277
u32 vid )
278
278
{
279
- struct ism_dev * ism = smcd -> priv ;
280
279
union ism_query_rgid cmd ;
281
280
282
281
memset (& cmd , 0 , sizeof (cmd ));
@@ -290,6 +289,11 @@ static int ism_query_rgid(struct smcd_dev *smcd, u64 rgid, u32 vid_valid,
290
289
return ism_cmd (ism , & cmd );
291
290
}
292
291
292
+ static int smcd_query_rgid (struct smcd_dev * smcd , u64 rgid , u32 vid_valid , u32 vid )
293
+ {
294
+ return ism_query_rgid (smcd -> priv , rgid , vid_valid , vid );
295
+ }
296
+
293
297
static void ism_free_dmb (struct ism_dev * ism , struct ism_dmb * dmb )
294
298
{
295
299
clear_bit (dmb -> sba_idx , ism -> sba_bitmap );
@@ -326,9 +330,9 @@ static int ism_alloc_dmb(struct ism_dev *ism, struct ism_dmb *dmb)
326
330
return dmb -> cpu_addr ? 0 : - ENOMEM ;
327
331
}
328
332
329
- static int ism_register_dmb (struct smcd_dev * smcd , struct ism_dmb * dmb )
333
+ int ism_register_dmb (struct ism_dev * ism , struct ism_dmb * dmb ,
334
+ struct ism_client * client )
330
335
{
331
- struct ism_dev * ism = smcd -> priv ;
332
336
union ism_reg_dmb cmd ;
333
337
int ret ;
334
338
@@ -353,18 +357,19 @@ static int ism_register_dmb(struct smcd_dev *smcd, struct ism_dmb *dmb)
353
357
goto out ;
354
358
}
355
359
dmb -> dmb_tok = cmd .response .dmb_tok ;
360
+ ism -> sba_client_arr [dmb -> sba_idx - ISM_DMB_BIT_OFFSET ] = client -> id ;
356
361
out :
357
362
return ret ;
358
363
}
364
+ EXPORT_SYMBOL_GPL (ism_register_dmb );
359
365
360
366
static int smcd_register_dmb (struct smcd_dev * smcd , struct smcd_dmb * dmb )
361
367
{
362
- return ism_register_dmb (smcd , (struct ism_dmb * )dmb );
368
+ return ism_register_dmb (smcd -> priv , (struct ism_dmb * )dmb , NULL );
363
369
}
364
370
365
- static int ism_unregister_dmb (struct smcd_dev * smcd , struct ism_dmb * dmb )
371
+ int ism_unregister_dmb (struct ism_dev * ism , struct ism_dmb * dmb )
366
372
{
367
- struct ism_dev * ism = smcd -> priv ;
368
373
union ism_unreg_dmb cmd ;
369
374
int ret ;
370
375
@@ -374,6 +379,8 @@ static int ism_unregister_dmb(struct smcd_dev *smcd, struct ism_dmb *dmb)
374
379
375
380
cmd .request .dmb_tok = dmb -> dmb_tok ;
376
381
382
+ ism -> sba_client_arr [dmb -> sba_idx - ISM_DMB_BIT_OFFSET ] = NO_CLIENT ;
383
+
377
384
ret = ism_cmd (ism , & cmd );
378
385
if (ret && ret != ISM_ERROR )
379
386
goto out ;
@@ -382,15 +389,15 @@ static int ism_unregister_dmb(struct smcd_dev *smcd, struct ism_dmb *dmb)
382
389
out :
383
390
return ret ;
384
391
}
392
+ EXPORT_SYMBOL_GPL (ism_unregister_dmb );
385
393
386
394
static int smcd_unregister_dmb (struct smcd_dev * smcd , struct smcd_dmb * dmb )
387
395
{
388
- return ism_unregister_dmb (smcd , (struct ism_dmb * )dmb );
396
+ return ism_unregister_dmb (smcd -> priv , (struct ism_dmb * )dmb );
389
397
}
390
398
391
- static int ism_add_vlan_id (struct smcd_dev * smcd , u64 vlan_id )
399
+ static int ism_add_vlan_id (struct ism_dev * ism , u64 vlan_id )
392
400
{
393
- struct ism_dev * ism = smcd -> priv ;
394
401
union ism_set_vlan_id cmd ;
395
402
396
403
memset (& cmd , 0 , sizeof (cmd ));
@@ -402,9 +409,13 @@ static int ism_add_vlan_id(struct smcd_dev *smcd, u64 vlan_id)
402
409
return ism_cmd (ism , & cmd );
403
410
}
404
411
405
- static int ism_del_vlan_id (struct smcd_dev * smcd , u64 vlan_id )
412
+ static int smcd_add_vlan_id (struct smcd_dev * smcd , u64 vlan_id )
413
+ {
414
+ return ism_add_vlan_id (smcd -> priv , vlan_id );
415
+ }
416
+
417
+ static int ism_del_vlan_id (struct ism_dev * ism , u64 vlan_id )
406
418
{
407
- struct ism_dev * ism = smcd -> priv ;
408
419
union ism_set_vlan_id cmd ;
409
420
410
421
memset (& cmd , 0 , sizeof (cmd ));
@@ -416,6 +427,11 @@ static int ism_del_vlan_id(struct smcd_dev *smcd, u64 vlan_id)
416
427
return ism_cmd (ism , & cmd );
417
428
}
418
429
430
+ static int smcd_del_vlan_id (struct smcd_dev * smcd , u64 vlan_id )
431
+ {
432
+ return ism_del_vlan_id (smcd -> priv , vlan_id );
433
+ }
434
+
419
435
static int ism_set_vlan_required (struct smcd_dev * smcd )
420
436
{
421
437
return ism_cmd_simple (smcd -> priv , ISM_SET_VLAN );
@@ -426,8 +442,8 @@ static int ism_reset_vlan_required(struct smcd_dev *smcd)
426
442
return ism_cmd_simple (smcd -> priv , ISM_RESET_VLAN );
427
443
}
428
444
429
- static int ism_signal_ieq (struct smcd_dev * smcd , u64 rgid , u32 trigger_irq ,
430
- u32 event_code , u64 info )
445
+ static int smcd_signal_ieq (struct smcd_dev * smcd , u64 rgid , u32 trigger_irq ,
446
+ u32 event_code , u64 info )
431
447
{
432
448
struct ism_dev * ism = smcd -> priv ;
433
449
union ism_sig_ieq cmd ;
@@ -450,8 +466,9 @@ static unsigned int max_bytes(unsigned int start, unsigned int len,
450
466
return min (boundary - (start & (boundary - 1 )), len );
451
467
}
452
468
453
- static int ism_move (struct smcd_dev * smcd , u64 dmb_tok , unsigned int idx ,
454
- bool sf , unsigned int offset , void * data , unsigned int size )
469
+ static int smcd_move (struct smcd_dev * smcd , u64 dmb_tok , unsigned int idx ,
470
+ bool sf , unsigned int offset , void * data ,
471
+ unsigned int size )
455
472
{
456
473
struct ism_dev * ism = smcd -> priv ;
457
474
unsigned int bytes ;
@@ -495,14 +512,15 @@ static void ism_create_system_eid(void)
495
512
memcpy (& SYSTEM_EID .type , tmp , 4 );
496
513
}
497
514
498
- static u8 * ism_get_system_eid (void )
515
+ u8 * ism_get_seid (void )
499
516
{
500
517
return SYSTEM_EID .seid_string ;
501
518
}
519
+ EXPORT_SYMBOL_GPL (ism_get_seid );
502
520
503
- static u16 ism_get_chid (struct smcd_dev * smcd )
521
+ static u16 smcd_get_chid (struct smcd_dev * smcd )
504
522
{
505
- struct ism_dev * ism = ( struct ism_dev * ) smcd -> priv ;
523
+ struct ism_dev * ism = smcd -> priv ;
506
524
507
525
if (!ism || !ism -> pdev )
508
526
return 0 ;
@@ -565,18 +583,26 @@ static irqreturn_t ism_handle_irq(int irq, void *data)
565
583
return IRQ_HANDLED ;
566
584
}
567
585
586
+ static u64 smcd_get_local_gid (struct smcd_dev * smcd )
587
+ {
588
+ struct ism_dev * ism = smcd -> priv ;
589
+
590
+ return ism -> local_gid ;
591
+ }
592
+
568
593
static const struct smcd_ops ism_ops = {
569
- .query_remote_gid = ism_query_rgid ,
594
+ .query_remote_gid = smcd_query_rgid ,
570
595
.register_dmb = smcd_register_dmb ,
571
596
.unregister_dmb = smcd_unregister_dmb ,
572
- .add_vlan_id = ism_add_vlan_id ,
573
- .del_vlan_id = ism_del_vlan_id ,
597
+ .add_vlan_id = smcd_add_vlan_id ,
598
+ .del_vlan_id = smcd_del_vlan_id ,
574
599
.set_vlan_required = ism_set_vlan_required ,
575
600
.reset_vlan_required = ism_reset_vlan_required ,
576
- .signal_event = ism_signal_ieq ,
577
- .move_data = ism_move ,
578
- .get_system_eid = ism_get_system_eid ,
579
- .get_chid = ism_get_chid ,
601
+ .signal_event = smcd_signal_ieq ,
602
+ .move_data = smcd_move ,
603
+ .get_system_eid = ism_get_seid ,
604
+ .get_local_gid = smcd_get_local_gid ,
605
+ .get_chid = smcd_get_chid ,
580
606
};
581
607
582
608
static void ism_dev_add_work_func (struct work_struct * work )
@@ -599,10 +625,15 @@ static int ism_dev_init(struct ism_dev *ism)
599
625
if (ret <= 0 )
600
626
goto out ;
601
627
628
+ ism -> sba_client_arr = kzalloc (ISM_NR_DMBS , GFP_KERNEL );
629
+ if (!ism -> sba_client_arr )
630
+ goto free_vectors ;
631
+ memset (ism -> sba_client_arr , NO_CLIENT , ISM_NR_DMBS );
632
+
602
633
ret = request_irq (pci_irq_vector (pdev , 0 ), ism_handle_irq , 0 ,
603
634
pci_name (pdev ), ism );
604
635
if (ret )
605
- goto free_vectors ;
636
+ goto free_client_arr ;
606
637
607
638
ret = register_sba (ism );
608
639
if (ret )
@@ -616,7 +647,7 @@ static int ism_dev_init(struct ism_dev *ism)
616
647
if (ret )
617
648
goto unreg_ieq ;
618
649
619
- if (!ism_add_vlan_id (ism -> smcd , ISM_RESERVED_VLANID ))
650
+ if (!ism_add_vlan_id (ism , ISM_RESERVED_VLANID ))
620
651
/* hardware is V2 capable */
621
652
ism_create_system_eid ();
622
653
@@ -651,6 +682,8 @@ static int ism_dev_init(struct ism_dev *ism)
651
682
unregister_sba (ism );
652
683
free_irq :
653
684
free_irq (pci_irq_vector (pdev , 0 ), ism );
685
+ free_client_arr :
686
+ kfree (ism -> sba_client_arr );
654
687
free_vectors :
655
688
pci_free_irq_vectors (pdev );
656
689
out :
@@ -746,10 +779,11 @@ static void ism_dev_exit(struct ism_dev *ism)
746
779
747
780
if (SYSTEM_EID .serial_number [0 ] != '0' ||
748
781
SYSTEM_EID .type [0 ] != '0' )
749
- ism_del_vlan_id (ism -> smcd , ISM_RESERVED_VLANID );
782
+ ism_del_vlan_id (ism , ISM_RESERVED_VLANID );
750
783
unregister_ieq (ism );
751
784
unregister_sba (ism );
752
785
free_irq (pci_irq_vector (pdev , 0 ), ism );
786
+ kfree (ism -> sba_client_arr );
753
787
pci_free_irq_vectors (pdev );
754
788
list_del_init (& ism -> list );
755
789
}
0 commit comments