diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4/qp.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/qp.c | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index a59c7f04ca18..b5a24fbef70d 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
@@ -1183,6 +1183,35 @@ static int mlx4_wq_overflow(struct mlx4_ib_wq *wq, int nreq, struct ib_cq *ib_cq | |||
1183 | return cur + nreq >= wq->max_post; | 1183 | return cur + nreq >= wq->max_post; |
1184 | } | 1184 | } |
1185 | 1185 | ||
1186 | static __always_inline void set_raddr_seg(struct mlx4_wqe_raddr_seg *rseg, | ||
1187 | u64 remote_addr, u32 rkey) | ||
1188 | { | ||
1189 | rseg->raddr = cpu_to_be64(remote_addr); | ||
1190 | rseg->rkey = cpu_to_be32(rkey); | ||
1191 | rseg->reserved = 0; | ||
1192 | } | ||
1193 | |||
1194 | static void set_atomic_seg(struct mlx4_wqe_atomic_seg *aseg, struct ib_send_wr *wr) | ||
1195 | { | ||
1196 | if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) { | ||
1197 | aseg->swap_add = cpu_to_be64(wr->wr.atomic.swap); | ||
1198 | aseg->compare = cpu_to_be64(wr->wr.atomic.compare_add); | ||
1199 | } else { | ||
1200 | aseg->swap_add = cpu_to_be64(wr->wr.atomic.compare_add); | ||
1201 | aseg->compare = 0; | ||
1202 | } | ||
1203 | |||
1204 | } | ||
1205 | |||
1206 | static void set_datagram_seg(struct mlx4_wqe_datagram_seg *dseg, | ||
1207 | struct ib_send_wr *wr) | ||
1208 | { | ||
1209 | memcpy(dseg->av, &to_mah(wr->wr.ud.ah)->av, sizeof (struct mlx4_av)); | ||
1210 | dseg->dqpn = cpu_to_be32(wr->wr.ud.remote_qpn); | ||
1211 | dseg->qkey = cpu_to_be32(wr->wr.ud.remote_qkey); | ||
1212 | |||
1213 | } | ||
1214 | |||
1186 | static void set_data_seg(struct mlx4_wqe_data_seg *dseg, | 1215 | static void set_data_seg(struct mlx4_wqe_data_seg *dseg, |
1187 | struct ib_sge *sg) | 1216 | struct ib_sge *sg) |
1188 | { | 1217 | { |
@@ -1246,26 +1275,13 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1246 | switch (wr->opcode) { | 1275 | switch (wr->opcode) { |
1247 | case IB_WR_ATOMIC_CMP_AND_SWP: | 1276 | case IB_WR_ATOMIC_CMP_AND_SWP: |
1248 | case IB_WR_ATOMIC_FETCH_AND_ADD: | 1277 | case IB_WR_ATOMIC_FETCH_AND_ADD: |
1249 | ((struct mlx4_wqe_raddr_seg *) wqe)->raddr = | 1278 | set_raddr_seg(wqe, wr->wr.atomic.remote_addr, |
1250 | cpu_to_be64(wr->wr.atomic.remote_addr); | 1279 | wr->wr.atomic.rkey); |
1251 | ((struct mlx4_wqe_raddr_seg *) wqe)->rkey = | ||
1252 | cpu_to_be32(wr->wr.atomic.rkey); | ||
1253 | ((struct mlx4_wqe_raddr_seg *) wqe)->reserved = 0; | ||
1254 | |||
1255 | wqe += sizeof (struct mlx4_wqe_raddr_seg); | 1280 | wqe += sizeof (struct mlx4_wqe_raddr_seg); |
1256 | 1281 | ||
1257 | if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) { | 1282 | set_atomic_seg(wqe, wr); |
1258 | ((struct mlx4_wqe_atomic_seg *) wqe)->swap_add = | ||
1259 | cpu_to_be64(wr->wr.atomic.swap); | ||
1260 | ((struct mlx4_wqe_atomic_seg *) wqe)->compare = | ||
1261 | cpu_to_be64(wr->wr.atomic.compare_add); | ||
1262 | } else { | ||
1263 | ((struct mlx4_wqe_atomic_seg *) wqe)->swap_add = | ||
1264 | cpu_to_be64(wr->wr.atomic.compare_add); | ||
1265 | ((struct mlx4_wqe_atomic_seg *) wqe)->compare = 0; | ||
1266 | } | ||
1267 | |||
1268 | wqe += sizeof (struct mlx4_wqe_atomic_seg); | 1283 | wqe += sizeof (struct mlx4_wqe_atomic_seg); |
1284 | |||
1269 | size += (sizeof (struct mlx4_wqe_raddr_seg) + | 1285 | size += (sizeof (struct mlx4_wqe_raddr_seg) + |
1270 | sizeof (struct mlx4_wqe_atomic_seg)) / 16; | 1286 | sizeof (struct mlx4_wqe_atomic_seg)) / 16; |
1271 | 1287 | ||
@@ -1274,15 +1290,10 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1274 | case IB_WR_RDMA_READ: | 1290 | case IB_WR_RDMA_READ: |
1275 | case IB_WR_RDMA_WRITE: | 1291 | case IB_WR_RDMA_WRITE: |
1276 | case IB_WR_RDMA_WRITE_WITH_IMM: | 1292 | case IB_WR_RDMA_WRITE_WITH_IMM: |
1277 | ((struct mlx4_wqe_raddr_seg *) wqe)->raddr = | 1293 | set_raddr_seg(wqe, wr->wr.rdma.remote_addr, |
1278 | cpu_to_be64(wr->wr.rdma.remote_addr); | 1294 | wr->wr.rdma.rkey); |
1279 | ((struct mlx4_wqe_raddr_seg *) wqe)->rkey = | ||
1280 | cpu_to_be32(wr->wr.rdma.rkey); | ||
1281 | ((struct mlx4_wqe_raddr_seg *) wqe)->reserved = 0; | ||
1282 | |||
1283 | wqe += sizeof (struct mlx4_wqe_raddr_seg); | 1295 | wqe += sizeof (struct mlx4_wqe_raddr_seg); |
1284 | size += sizeof (struct mlx4_wqe_raddr_seg) / 16; | 1296 | size += sizeof (struct mlx4_wqe_raddr_seg) / 16; |
1285 | |||
1286 | break; | 1297 | break; |
1287 | 1298 | ||
1288 | default: | 1299 | default: |
@@ -1292,13 +1303,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1292 | break; | 1303 | break; |
1293 | 1304 | ||
1294 | case IB_QPT_UD: | 1305 | case IB_QPT_UD: |
1295 | memcpy(((struct mlx4_wqe_datagram_seg *) wqe)->av, | 1306 | set_datagram_seg(wqe, wr); |
1296 | &to_mah(wr->wr.ud.ah)->av, sizeof (struct mlx4_av)); | ||
1297 | ((struct mlx4_wqe_datagram_seg *) wqe)->dqpn = | ||
1298 | cpu_to_be32(wr->wr.ud.remote_qpn); | ||
1299 | ((struct mlx4_wqe_datagram_seg *) wqe)->qkey = | ||
1300 | cpu_to_be32(wr->wr.ud.remote_qkey); | ||
1301 | |||
1302 | wqe += sizeof (struct mlx4_wqe_datagram_seg); | 1307 | wqe += sizeof (struct mlx4_wqe_datagram_seg); |
1303 | size += sizeof (struct mlx4_wqe_datagram_seg) / 16; | 1308 | size += sizeof (struct mlx4_wqe_datagram_seg) / 16; |
1304 | break; | 1309 | break; |