diff options
| author | Sean Hefty <sean.hefty@intel.com> | 2006-06-17 23:37:39 -0400 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2006-06-17 23:37:39 -0400 |
| commit | 4e00d69454a8747798de11dc4eeef1edeee5ce98 (patch) | |
| tree | e09582595f80e1e7479c4f8b5a559be0db9ac251 | |
| parent | 75af9088514432ef0c1052ba3767ceb0beb6f101 (diff) | |
IB: Add ib_init_ah_from_wc()
Add a function to initialize address handle attributes from a work
completion. This functionality is duplicated by both verbs and the CM.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
| -rw-r--r-- | drivers/infiniband/core/verbs.c | 44 | ||||
| -rw-r--r-- | include/rdma/ib_verbs.h | 14 |
2 files changed, 42 insertions, 16 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index b78e7dc69330..468999c38803 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
| @@ -125,35 +125,47 @@ struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr) | |||
| 125 | } | 125 | } |
| 126 | EXPORT_SYMBOL(ib_create_ah); | 126 | EXPORT_SYMBOL(ib_create_ah); |
| 127 | 127 | ||
| 128 | struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc, | 128 | int ib_init_ah_from_wc(struct ib_device *device, u8 port_num, struct ib_wc *wc, |
| 129 | struct ib_grh *grh, u8 port_num) | 129 | struct ib_grh *grh, struct ib_ah_attr *ah_attr) |
| 130 | { | 130 | { |
| 131 | struct ib_ah_attr ah_attr; | ||
| 132 | u32 flow_class; | 131 | u32 flow_class; |
| 133 | u16 gid_index; | 132 | u16 gid_index; |
| 134 | int ret; | 133 | int ret; |
| 135 | 134 | ||
| 136 | memset(&ah_attr, 0, sizeof ah_attr); | 135 | memset(ah_attr, 0, sizeof *ah_attr); |
| 137 | ah_attr.dlid = wc->slid; | 136 | ah_attr->dlid = wc->slid; |
| 138 | ah_attr.sl = wc->sl; | 137 | ah_attr->sl = wc->sl; |
| 139 | ah_attr.src_path_bits = wc->dlid_path_bits; | 138 | ah_attr->src_path_bits = wc->dlid_path_bits; |
| 140 | ah_attr.port_num = port_num; | 139 | ah_attr->port_num = port_num; |
| 141 | 140 | ||
| 142 | if (wc->wc_flags & IB_WC_GRH) { | 141 | if (wc->wc_flags & IB_WC_GRH) { |
| 143 | ah_attr.ah_flags = IB_AH_GRH; | 142 | ah_attr->ah_flags = IB_AH_GRH; |
| 144 | ah_attr.grh.dgid = grh->sgid; | 143 | ah_attr->grh.dgid = grh->sgid; |
| 145 | 144 | ||
| 146 | ret = ib_find_cached_gid(pd->device, &grh->dgid, &port_num, | 145 | ret = ib_find_cached_gid(device, &grh->dgid, &port_num, |
| 147 | &gid_index); | 146 | &gid_index); |
| 148 | if (ret) | 147 | if (ret) |
| 149 | return ERR_PTR(ret); | 148 | return ret; |
| 150 | 149 | ||
| 151 | ah_attr.grh.sgid_index = (u8) gid_index; | 150 | ah_attr->grh.sgid_index = (u8) gid_index; |
| 152 | flow_class = be32_to_cpu(grh->version_tclass_flow); | 151 | flow_class = be32_to_cpu(grh->version_tclass_flow); |
| 153 | ah_attr.grh.flow_label = flow_class & 0xFFFFF; | 152 | ah_attr->grh.flow_label = flow_class & 0xFFFFF; |
| 154 | ah_attr.grh.traffic_class = (flow_class >> 20) & 0xFF; | 153 | ah_attr->grh.hop_limit = grh->hop_limit; |
| 155 | ah_attr.grh.hop_limit = grh->hop_limit; | 154 | ah_attr->grh.traffic_class = (flow_class >> 20) & 0xFF; |
| 156 | } | 155 | } |
| 156 | return 0; | ||
| 157 | } | ||
| 158 | EXPORT_SYMBOL(ib_init_ah_from_wc); | ||
| 159 | |||
| 160 | struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc, | ||
| 161 | struct ib_grh *grh, u8 port_num) | ||
| 162 | { | ||
| 163 | struct ib_ah_attr ah_attr; | ||
| 164 | int ret; | ||
| 165 | |||
| 166 | ret = ib_init_ah_from_wc(pd->device, port_num, wc, grh, &ah_attr); | ||
| 167 | if (ret) | ||
| 168 | return ERR_PTR(ret); | ||
| 157 | 169 | ||
| 158 | return ib_create_ah(pd, &ah_attr); | 170 | return ib_create_ah(pd, &ah_attr); |
| 159 | } | 171 | } |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 10a6268c2cc2..7ced208edacf 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -1088,6 +1088,20 @@ int ib_dealloc_pd(struct ib_pd *pd); | |||
| 1088 | struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); | 1088 | struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); |
| 1089 | 1089 | ||
| 1090 | /** | 1090 | /** |
| 1091 | * ib_init_ah_from_wc - Initializes address handle attributes from a | ||
| 1092 | * work completion. | ||
| 1093 | * @device: Device on which the received message arrived. | ||
| 1094 | * @port_num: Port on which the received message arrived. | ||
| 1095 | * @wc: Work completion associated with the received message. | ||
| 1096 | * @grh: References the received global route header. This parameter is | ||
| 1097 | * ignored unless the work completion indicates that the GRH is valid. | ||
| 1098 | * @ah_attr: Returned attributes that can be used when creating an address | ||
| 1099 | * handle for replying to the message. | ||
| 1100 | */ | ||
| 1101 | int ib_init_ah_from_wc(struct ib_device *device, u8 port_num, struct ib_wc *wc, | ||
| 1102 | struct ib_grh *grh, struct ib_ah_attr *ah_attr); | ||
| 1103 | |||
| 1104 | /** | ||
| 1091 | * ib_create_ah_from_wc - Creates an address handle associated with the | 1105 | * ib_create_ah_from_wc - Creates an address handle associated with the |
| 1092 | * sender of the specified work completion. | 1106 | * sender of the specified work completion. |
| 1093 | * @pd: The protection domain associated with the address handle. | 1107 | * @pd: The protection domain associated with the address handle. |
