@@ -392,16 +392,51 @@ enum {
392
392
_VERB_IDX_MAX /* Must always be last! */
393
393
};
394
394
395
- static inline int check_driver_override (struct rvt_dev_info * rdi ,
396
- size_t offset , void * func )
397
- {
398
- if (!* (void * * )((void * )& rdi -> ibdev + offset )) {
399
- * (void * * )((void * )& rdi -> ibdev + offset ) = func ;
400
- return 0 ;
401
- }
402
-
403
- return 1 ;
404
- }
395
+ static const struct ib_device_ops rvt_dev_ops = {
396
+ .alloc_fmr = rvt_alloc_fmr ,
397
+ .alloc_mr = rvt_alloc_mr ,
398
+ .alloc_pd = rvt_alloc_pd ,
399
+ .alloc_ucontext = rvt_alloc_ucontext ,
400
+ .attach_mcast = rvt_attach_mcast ,
401
+ .create_ah = rvt_create_ah ,
402
+ .create_cq = rvt_create_cq ,
403
+ .create_qp = rvt_create_qp ,
404
+ .create_srq = rvt_create_srq ,
405
+ .dealloc_fmr = rvt_dealloc_fmr ,
406
+ .dealloc_pd = rvt_dealloc_pd ,
407
+ .dealloc_ucontext = rvt_dealloc_ucontext ,
408
+ .dereg_mr = rvt_dereg_mr ,
409
+ .destroy_ah = rvt_destroy_ah ,
410
+ .destroy_cq = rvt_destroy_cq ,
411
+ .destroy_qp = rvt_destroy_qp ,
412
+ .destroy_srq = rvt_destroy_srq ,
413
+ .detach_mcast = rvt_detach_mcast ,
414
+ .get_dma_mr = rvt_get_dma_mr ,
415
+ .get_port_immutable = rvt_get_port_immutable ,
416
+ .map_mr_sg = rvt_map_mr_sg ,
417
+ .map_phys_fmr = rvt_map_phys_fmr ,
418
+ .mmap = rvt_mmap ,
419
+ .modify_ah = rvt_modify_ah ,
420
+ .modify_device = rvt_modify_device ,
421
+ .modify_port = rvt_modify_port ,
422
+ .modify_qp = rvt_modify_qp ,
423
+ .modify_srq = rvt_modify_srq ,
424
+ .poll_cq = rvt_poll_cq ,
425
+ .post_recv = rvt_post_recv ,
426
+ .post_send = rvt_post_send ,
427
+ .post_srq_recv = rvt_post_srq_recv ,
428
+ .query_ah = rvt_query_ah ,
429
+ .query_device = rvt_query_device ,
430
+ .query_gid = rvt_query_gid ,
431
+ .query_pkey = rvt_query_pkey ,
432
+ .query_port = rvt_query_port ,
433
+ .query_qp = rvt_query_qp ,
434
+ .query_srq = rvt_query_srq ,
435
+ .reg_user_mr = rvt_reg_user_mr ,
436
+ .req_notify_cq = rvt_req_notify_cq ,
437
+ .resize_cq = rvt_resize_cq ,
438
+ .unmap_fmr = rvt_unmap_fmr ,
439
+ };
405
440
406
441
static noinline int check_support (struct rvt_dev_info * rdi , int verb )
407
442
{
@@ -416,76 +451,36 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
416
451
return - EINVAL ;
417
452
break ;
418
453
419
- case QUERY_DEVICE :
420
- check_driver_override (rdi , offsetof(struct ib_device ,
421
- query_device ),
422
- rvt_query_device );
423
- break ;
424
-
425
454
case MODIFY_DEVICE :
426
455
/*
427
456
* rdmavt does not support modify device currently drivers must
428
457
* provide.
429
458
*/
430
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
431
- modify_device ),
432
- rvt_modify_device ))
459
+ if (!rdi -> ibdev .modify_device )
433
460
return - EOPNOTSUPP ;
434
461
break ;
435
462
436
463
case QUERY_PORT :
437
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
438
- query_port ),
439
- rvt_query_port ))
464
+ if (!rdi -> ibdev .query_port )
440
465
if (!rdi -> driver_f .query_port_state )
441
466
return - EINVAL ;
442
467
break ;
443
468
444
469
case MODIFY_PORT :
445
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
446
- modify_port ),
447
- rvt_modify_port ))
470
+ if (!rdi -> ibdev .modify_port )
448
471
if (!rdi -> driver_f .cap_mask_chg ||
449
472
!rdi -> driver_f .shut_down_port )
450
473
return - EINVAL ;
451
474
break ;
452
475
453
- case QUERY_PKEY :
454
- check_driver_override (rdi , offsetof(struct ib_device ,
455
- query_pkey ),
456
- rvt_query_pkey );
457
- break ;
458
-
459
476
case QUERY_GID :
460
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
461
- query_gid ),
462
- rvt_query_gid ))
477
+ if (!rdi -> ibdev .query_gid )
463
478
if (!rdi -> driver_f .get_guid_be )
464
479
return - EINVAL ;
465
480
break ;
466
481
467
- case ALLOC_UCONTEXT :
468
- check_driver_override (rdi , offsetof(struct ib_device ,
469
- alloc_ucontext ),
470
- rvt_alloc_ucontext );
471
- break ;
472
-
473
- case DEALLOC_UCONTEXT :
474
- check_driver_override (rdi , offsetof(struct ib_device ,
475
- dealloc_ucontext ),
476
- rvt_dealloc_ucontext );
477
- break ;
478
-
479
- case GET_PORT_IMMUTABLE :
480
- check_driver_override (rdi , offsetof(struct ib_device ,
481
- get_port_immutable ),
482
- rvt_get_port_immutable );
483
- break ;
484
-
485
482
case CREATE_QP :
486
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
487
- create_qp ),
488
- rvt_create_qp ))
483
+ if (!rdi -> ibdev .create_qp )
489
484
if (!rdi -> driver_f .qp_priv_alloc ||
490
485
!rdi -> driver_f .qp_priv_free ||
491
486
!rdi -> driver_f .notify_qp_reset ||
@@ -496,9 +491,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
496
491
break ;
497
492
498
493
case MODIFY_QP :
499
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
500
- modify_qp ),
501
- rvt_modify_qp ))
494
+ if (!rdi -> ibdev .modify_qp )
502
495
if (!rdi -> driver_f .notify_qp_reset ||
503
496
!rdi -> driver_f .schedule_send ||
504
497
!rdi -> driver_f .get_pmtu_from_attr ||
@@ -512,9 +505,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
512
505
break ;
513
506
514
507
case DESTROY_QP :
515
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
516
- destroy_qp ),
517
- rvt_destroy_qp ))
508
+ if (!rdi -> ibdev .destroy_qp )
518
509
if (!rdi -> driver_f .qp_priv_free ||
519
510
!rdi -> driver_f .notify_qp_reset ||
520
511
!rdi -> driver_f .flush_qp_waiters ||
@@ -523,197 +514,14 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
523
514
return - EINVAL ;
524
515
break ;
525
516
526
- case QUERY_QP :
527
- check_driver_override (rdi , offsetof(struct ib_device ,
528
- query_qp ),
529
- rvt_query_qp );
530
- break ;
531
-
532
517
case POST_SEND :
533
- if (!check_driver_override (rdi , offsetof(struct ib_device ,
534
- post_send ),
535
- rvt_post_send ))
518
+ if (!rdi -> ibdev .post_send )
536
519
if (!rdi -> driver_f .schedule_send ||
537
520
!rdi -> driver_f .do_send ||
538
521
!rdi -> post_parms )
539
522
return - EINVAL ;
540
523
break ;
541
524
542
- case POST_RECV :
543
- check_driver_override (rdi , offsetof(struct ib_device ,
544
- post_recv ),
545
- rvt_post_recv );
546
- break ;
547
- case POST_SRQ_RECV :
548
- check_driver_override (rdi , offsetof(struct ib_device ,
549
- post_srq_recv ),
550
- rvt_post_srq_recv );
551
- break ;
552
-
553
- case CREATE_AH :
554
- check_driver_override (rdi , offsetof(struct ib_device ,
555
- create_ah ),
556
- rvt_create_ah );
557
- break ;
558
-
559
- case DESTROY_AH :
560
- check_driver_override (rdi , offsetof(struct ib_device ,
561
- destroy_ah ),
562
- rvt_destroy_ah );
563
- break ;
564
-
565
- case MODIFY_AH :
566
- check_driver_override (rdi , offsetof(struct ib_device ,
567
- modify_ah ),
568
- rvt_modify_ah );
569
- break ;
570
-
571
- case QUERY_AH :
572
- check_driver_override (rdi , offsetof(struct ib_device ,
573
- query_ah ),
574
- rvt_query_ah );
575
- break ;
576
-
577
- case CREATE_SRQ :
578
- check_driver_override (rdi , offsetof(struct ib_device ,
579
- create_srq ),
580
- rvt_create_srq );
581
- break ;
582
-
583
- case MODIFY_SRQ :
584
- check_driver_override (rdi , offsetof(struct ib_device ,
585
- modify_srq ),
586
- rvt_modify_srq );
587
- break ;
588
-
589
- case DESTROY_SRQ :
590
- check_driver_override (rdi , offsetof(struct ib_device ,
591
- destroy_srq ),
592
- rvt_destroy_srq );
593
- break ;
594
-
595
- case QUERY_SRQ :
596
- check_driver_override (rdi , offsetof(struct ib_device ,
597
- query_srq ),
598
- rvt_query_srq );
599
- break ;
600
-
601
- case ATTACH_MCAST :
602
- check_driver_override (rdi , offsetof(struct ib_device ,
603
- attach_mcast ),
604
- rvt_attach_mcast );
605
- break ;
606
-
607
- case DETACH_MCAST :
608
- check_driver_override (rdi , offsetof(struct ib_device ,
609
- detach_mcast ),
610
- rvt_detach_mcast );
611
- break ;
612
-
613
- case GET_DMA_MR :
614
- check_driver_override (rdi , offsetof(struct ib_device ,
615
- get_dma_mr ),
616
- rvt_get_dma_mr );
617
- break ;
618
-
619
- case REG_USER_MR :
620
- check_driver_override (rdi , offsetof(struct ib_device ,
621
- reg_user_mr ),
622
- rvt_reg_user_mr );
623
- break ;
624
-
625
- case DEREG_MR :
626
- check_driver_override (rdi , offsetof(struct ib_device ,
627
- dereg_mr ),
628
- rvt_dereg_mr );
629
- break ;
630
-
631
- case ALLOC_FMR :
632
- check_driver_override (rdi , offsetof(struct ib_device ,
633
- alloc_fmr ),
634
- rvt_alloc_fmr );
635
- break ;
636
-
637
- case ALLOC_MR :
638
- check_driver_override (rdi , offsetof(struct ib_device ,
639
- alloc_mr ),
640
- rvt_alloc_mr );
641
- break ;
642
-
643
- case MAP_MR_SG :
644
- check_driver_override (rdi , offsetof(struct ib_device ,
645
- map_mr_sg ),
646
- rvt_map_mr_sg );
647
- break ;
648
-
649
- case MAP_PHYS_FMR :
650
- check_driver_override (rdi , offsetof(struct ib_device ,
651
- map_phys_fmr ),
652
- rvt_map_phys_fmr );
653
- break ;
654
-
655
- case UNMAP_FMR :
656
- check_driver_override (rdi , offsetof(struct ib_device ,
657
- unmap_fmr ),
658
- rvt_unmap_fmr );
659
- break ;
660
-
661
- case DEALLOC_FMR :
662
- check_driver_override (rdi , offsetof(struct ib_device ,
663
- dealloc_fmr ),
664
- rvt_dealloc_fmr );
665
- break ;
666
-
667
- case MMAP :
668
- check_driver_override (rdi , offsetof(struct ib_device ,
669
- mmap ),
670
- rvt_mmap );
671
- break ;
672
-
673
- case CREATE_CQ :
674
- check_driver_override (rdi , offsetof(struct ib_device ,
675
- create_cq ),
676
- rvt_create_cq );
677
- break ;
678
-
679
- case DESTROY_CQ :
680
- check_driver_override (rdi , offsetof(struct ib_device ,
681
- destroy_cq ),
682
- rvt_destroy_cq );
683
- break ;
684
-
685
- case POLL_CQ :
686
- check_driver_override (rdi , offsetof(struct ib_device ,
687
- poll_cq ),
688
- rvt_poll_cq );
689
- break ;
690
-
691
- case REQ_NOTFIY_CQ :
692
- check_driver_override (rdi , offsetof(struct ib_device ,
693
- req_notify_cq ),
694
- rvt_req_notify_cq );
695
- break ;
696
-
697
- case RESIZE_CQ :
698
- check_driver_override (rdi , offsetof(struct ib_device ,
699
- resize_cq ),
700
- rvt_resize_cq );
701
- break ;
702
-
703
- case ALLOC_PD :
704
- check_driver_override (rdi , offsetof(struct ib_device ,
705
- alloc_pd ),
706
- rvt_alloc_pd );
707
- break ;
708
-
709
- case DEALLOC_PD :
710
- check_driver_override (rdi , offsetof(struct ib_device ,
711
- dealloc_pd ),
712
- rvt_dealloc_pd );
713
- break ;
714
-
715
- default :
716
- return - EINVAL ;
717
525
}
718
526
719
527
return 0 ;
@@ -745,6 +553,7 @@ int rvt_register_device(struct rvt_dev_info *rdi, u32 driver_id)
745
553
return - EINVAL ;
746
554
}
747
555
556
+ ib_set_device_ops (& rdi -> ibdev , & rvt_dev_ops );
748
557
749
558
/* Once we get past here we can use rvt_pr macros and tracepoints */
750
559
trace_rvt_dbg (rdi , "Driver attempting registration" );
0 commit comments