diff options
author | Hal Rosenstock <halr@voltaire.com> | 2005-07-27 14:45:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-27 19:26:12 -0400 |
commit | 513789ed995fb2ba72ba2a5bee53ea11d1170580 (patch) | |
tree | fa9a4e73b9420a06af37290ba6ae405200dd0935 /drivers/infiniband | |
parent | cabe3cbcbb3b09637b9e706c49eadb180fca057e (diff) |
[PATCH] IB: Add ib_create_ah_from_wc to IB verbs
Added new call: ib_create_ah_from_wc. Call will allocate an address handle
given work completion information, including any received GRH.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Hal Rosenstock <halr@voltaire.com>
Cc: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/verbs.c | 35 | ||||
-rw-r--r-- | drivers/infiniband/include/ib_mad.h | 9 | ||||
-rw-r--r-- | drivers/infiniband/include/ib_verbs.h | 24 |
3 files changed, 59 insertions, 9 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 2516f9646515..62951594eec6 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/err.h> | 41 | #include <linux/err.h> |
42 | 42 | ||
43 | #include <ib_verbs.h> | 43 | #include <ib_verbs.h> |
44 | #include <ib_cache.h> | ||
44 | 45 | ||
45 | /* Protection domains */ | 46 | /* Protection domains */ |
46 | 47 | ||
@@ -88,6 +89,40 @@ struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr) | |||
88 | } | 89 | } |
89 | EXPORT_SYMBOL(ib_create_ah); | 90 | EXPORT_SYMBOL(ib_create_ah); |
90 | 91 | ||
92 | struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc, | ||
93 | struct ib_grh *grh, u8 port_num) | ||
94 | { | ||
95 | struct ib_ah_attr ah_attr; | ||
96 | u32 flow_class; | ||
97 | u16 gid_index; | ||
98 | int ret; | ||
99 | |||
100 | memset(&ah_attr, 0, sizeof ah_attr); | ||
101 | ah_attr.dlid = wc->slid; | ||
102 | ah_attr.sl = wc->sl; | ||
103 | ah_attr.src_path_bits = wc->dlid_path_bits; | ||
104 | ah_attr.port_num = port_num; | ||
105 | |||
106 | if (wc->wc_flags & IB_WC_GRH) { | ||
107 | ah_attr.ah_flags = IB_AH_GRH; | ||
108 | ah_attr.grh.dgid = grh->dgid; | ||
109 | |||
110 | ret = ib_find_cached_gid(pd->device, &grh->sgid, &port_num, | ||
111 | &gid_index); | ||
112 | if (ret) | ||
113 | return ERR_PTR(ret); | ||
114 | |||
115 | ah_attr.grh.sgid_index = (u8) gid_index; | ||
116 | flow_class = be32_to_cpu(&grh->version_tclass_flow); | ||
117 | ah_attr.grh.flow_label = flow_class & 0xFFFFF; | ||
118 | ah_attr.grh.traffic_class = (flow_class >> 20) & 0xFF; | ||
119 | ah_attr.grh.hop_limit = grh->hop_limit; | ||
120 | } | ||
121 | |||
122 | return ib_create_ah(pd, &ah_attr); | ||
123 | } | ||
124 | EXPORT_SYMBOL(ib_create_ah_from_wc); | ||
125 | |||
91 | int ib_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) | 126 | int ib_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) |
92 | { | 127 | { |
93 | return ah->device->modify_ah ? | 128 | return ah->device->modify_ah ? |
diff --git a/drivers/infiniband/include/ib_mad.h b/drivers/infiniband/include/ib_mad.h index c5f3170c59ef..817e932c79c0 100644 --- a/drivers/infiniband/include/ib_mad.h +++ b/drivers/infiniband/include/ib_mad.h | |||
@@ -77,15 +77,6 @@ | |||
77 | #define IB_QP1_QKEY 0x80010000 | 77 | #define IB_QP1_QKEY 0x80010000 |
78 | #define IB_QP_SET_QKEY 0x80000000 | 78 | #define IB_QP_SET_QKEY 0x80000000 |
79 | 79 | ||
80 | struct ib_grh { | ||
81 | u32 version_tclass_flow; | ||
82 | u16 paylen; | ||
83 | u8 next_hdr; | ||
84 | u8 hop_limit; | ||
85 | union ib_gid sgid; | ||
86 | union ib_gid dgid; | ||
87 | } __attribute__ ((packed)); | ||
88 | |||
89 | struct ib_mad_hdr { | 80 | struct ib_mad_hdr { |
90 | u8 base_version; | 81 | u8 base_version; |
91 | u8 mgmt_class; | 82 | u8 mgmt_class; |
diff --git a/drivers/infiniband/include/ib_verbs.h b/drivers/infiniband/include/ib_verbs.h index b6107c4b683a..5d24edaa66e6 100644 --- a/drivers/infiniband/include/ib_verbs.h +++ b/drivers/infiniband/include/ib_verbs.h | |||
@@ -289,6 +289,15 @@ struct ib_global_route { | |||
289 | u8 traffic_class; | 289 | u8 traffic_class; |
290 | }; | 290 | }; |
291 | 291 | ||
292 | struct ib_grh { | ||
293 | u32 version_tclass_flow; | ||
294 | u16 paylen; | ||
295 | u8 next_hdr; | ||
296 | u8 hop_limit; | ||
297 | union ib_gid sgid; | ||
298 | union ib_gid dgid; | ||
299 | }; | ||
300 | |||
292 | enum { | 301 | enum { |
293 | IB_MULTICAST_QPN = 0xffffff | 302 | IB_MULTICAST_QPN = 0xffffff |
294 | }; | 303 | }; |
@@ -991,6 +1000,21 @@ int ib_dealloc_pd(struct ib_pd *pd); | |||
991 | struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); | 1000 | struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); |
992 | 1001 | ||
993 | /** | 1002 | /** |
1003 | * ib_create_ah_from_wc - Creates an address handle associated with the | ||
1004 | * sender of the specified work completion. | ||
1005 | * @pd: The protection domain associated with the address handle. | ||
1006 | * @wc: Work completion information associated with a received message. | ||
1007 | * @grh: References the received global route header. This parameter is | ||
1008 | * ignored unless the work completion indicates that the GRH is valid. | ||
1009 | * @port_num: The outbound port number to associate with the address. | ||
1010 | * | ||
1011 | * The address handle is used to reference a local or global destination | ||
1012 | * in all UD QP post sends. | ||
1013 | */ | ||
1014 | struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc, | ||
1015 | struct ib_grh *grh, u8 port_num); | ||
1016 | |||
1017 | /** | ||
994 | * ib_modify_ah - Modifies the address vector associated with an address | 1018 | * ib_modify_ah - Modifies the address vector associated with an address |
995 | * handle. | 1019 | * handle. |
996 | * @ah: The address handle to modify. | 1020 | * @ah: The address handle to modify. |