diff options
-rw-r--r-- | drivers/infiniband/core/verbs.c | 26 | ||||
-rw-r--r-- | include/rdma/ib_verbs.h | 22 |
2 files changed, 48 insertions, 0 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index af7a8b08b2e9..5e03ab78fc8e 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
@@ -920,3 +920,29 @@ int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) | |||
920 | return qp->device->detach_mcast(qp, gid, lid); | 920 | return qp->device->detach_mcast(qp, gid, lid); |
921 | } | 921 | } |
922 | EXPORT_SYMBOL(ib_detach_mcast); | 922 | EXPORT_SYMBOL(ib_detach_mcast); |
923 | |||
924 | struct ib_xrcd *ib_alloc_xrcd(struct ib_device *device) | ||
925 | { | ||
926 | struct ib_xrcd *xrcd; | ||
927 | |||
928 | if (!device->alloc_xrcd) | ||
929 | return ERR_PTR(-ENOSYS); | ||
930 | |||
931 | xrcd = device->alloc_xrcd(device, NULL, NULL); | ||
932 | if (!IS_ERR(xrcd)) { | ||
933 | xrcd->device = device; | ||
934 | atomic_set(&xrcd->usecnt, 0); | ||
935 | } | ||
936 | |||
937 | return xrcd; | ||
938 | } | ||
939 | EXPORT_SYMBOL(ib_alloc_xrcd); | ||
940 | |||
941 | int ib_dealloc_xrcd(struct ib_xrcd *xrcd) | ||
942 | { | ||
943 | if (atomic_read(&xrcd->usecnt)) | ||
944 | return -EBUSY; | ||
945 | |||
946 | return xrcd->device->dealloc_xrcd(xrcd); | ||
947 | } | ||
948 | EXPORT_SYMBOL(ib_dealloc_xrcd); | ||
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 228be3e220d9..d2a5c9b991d1 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -112,6 +112,7 @@ enum ib_device_cap_flags { | |||
112 | */ | 112 | */ |
113 | IB_DEVICE_UD_IP_CSUM = (1<<18), | 113 | IB_DEVICE_UD_IP_CSUM = (1<<18), |
114 | IB_DEVICE_UD_TSO = (1<<19), | 114 | IB_DEVICE_UD_TSO = (1<<19), |
115 | IB_DEVICE_XRC = (1<<20), | ||
115 | IB_DEVICE_MEM_MGT_EXTENSIONS = (1<<21), | 116 | IB_DEVICE_MEM_MGT_EXTENSIONS = (1<<21), |
116 | IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = (1<<22), | 117 | IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = (1<<22), |
117 | }; | 118 | }; |
@@ -858,6 +859,11 @@ struct ib_pd { | |||
858 | atomic_t usecnt; /* count all resources */ | 859 | atomic_t usecnt; /* count all resources */ |
859 | }; | 860 | }; |
860 | 861 | ||
862 | struct ib_xrcd { | ||
863 | struct ib_device *device; | ||
864 | atomic_t usecnt; /* count all resources */ | ||
865 | }; | ||
866 | |||
861 | struct ib_ah { | 867 | struct ib_ah { |
862 | struct ib_device *device; | 868 | struct ib_device *device; |
863 | struct ib_pd *pd; | 869 | struct ib_pd *pd; |
@@ -1149,6 +1155,10 @@ struct ib_device { | |||
1149 | struct ib_grh *in_grh, | 1155 | struct ib_grh *in_grh, |
1150 | struct ib_mad *in_mad, | 1156 | struct ib_mad *in_mad, |
1151 | struct ib_mad *out_mad); | 1157 | struct ib_mad *out_mad); |
1158 | struct ib_xrcd * (*alloc_xrcd)(struct ib_device *device, | ||
1159 | struct ib_ucontext *ucontext, | ||
1160 | struct ib_udata *udata); | ||
1161 | int (*dealloc_xrcd)(struct ib_xrcd *xrcd); | ||
1152 | 1162 | ||
1153 | struct ib_dma_mapping_ops *dma_ops; | 1163 | struct ib_dma_mapping_ops *dma_ops; |
1154 | 1164 | ||
@@ -2060,4 +2070,16 @@ int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid); | |||
2060 | */ | 2070 | */ |
2061 | int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid); | 2071 | int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid); |
2062 | 2072 | ||
2073 | /** | ||
2074 | * ib_alloc_xrcd - Allocates an XRC domain. | ||
2075 | * @device: The device on which to allocate the XRC domain. | ||
2076 | */ | ||
2077 | struct ib_xrcd *ib_alloc_xrcd(struct ib_device *device); | ||
2078 | |||
2079 | /** | ||
2080 | * ib_dealloc_xrcd - Deallocates an XRC domain. | ||
2081 | * @xrcd: The XRC domain to deallocate. | ||
2082 | */ | ||
2083 | int ib_dealloc_xrcd(struct ib_xrcd *xrcd); | ||
2084 | |||
2063 | #endif /* IB_VERBS_H */ | 2085 | #endif /* IB_VERBS_H */ |