aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/infiniband/hw/mthca/mthca_qp.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c
index 0db4c9761611..53af7aab1991 100644
--- a/drivers/infiniband/hw/mthca/mthca_qp.c
+++ b/drivers/infiniband/hw/mthca/mthca_qp.c
@@ -181,6 +181,10 @@ enum {
181 MTHCA_MLX_SLR = 1 << 16 181 MTHCA_MLX_SLR = 1 << 16
182}; 182};
183 183
184enum {
185 MTHCA_INVAL_LKEY = 0x100
186};
187
184struct mthca_next_seg { 188struct mthca_next_seg {
185 u32 nda_op; /* [31:6] next WQE [4:0] next opcode */ 189 u32 nda_op; /* [31:6] next WQE [4:0] next opcode */
186 u32 ee_nds; /* [31:8] next EE [7] DBD [6] F [5:0] next WQE size */ 190 u32 ee_nds; /* [31:8] next EE [7] DBD [6] F [5:0] next WQE size */
@@ -1082,7 +1086,6 @@ static int mthca_alloc_qp_common(struct mthca_dev *dev,
1082 enum ib_sig_type send_policy, 1086 enum ib_sig_type send_policy,
1083 struct mthca_qp *qp) 1087 struct mthca_qp *qp)
1084{ 1088{
1085 struct mthca_next_seg *wqe;
1086 int ret; 1089 int ret;
1087 int i; 1090 int i;
1088 1091
@@ -1105,18 +1108,28 @@ static int mthca_alloc_qp_common(struct mthca_dev *dev,
1105 } 1108 }
1106 1109
1107 if (mthca_is_memfree(dev)) { 1110 if (mthca_is_memfree(dev)) {
1111 struct mthca_next_seg *next;
1112 struct mthca_data_seg *scatter;
1113 int size = (sizeof (struct mthca_next_seg) +
1114 qp->rq.max_gs * sizeof (struct mthca_data_seg)) / 16;
1115
1108 for (i = 0; i < qp->rq.max; ++i) { 1116 for (i = 0; i < qp->rq.max; ++i) {
1109 wqe = get_recv_wqe(qp, i); 1117 next = get_recv_wqe(qp, i);
1110 wqe->nda_op = cpu_to_be32(((i + 1) & (qp->rq.max - 1)) << 1118 next->nda_op = cpu_to_be32(((i + 1) & (qp->rq.max - 1)) <<
1111 qp->rq.wqe_shift); 1119 qp->rq.wqe_shift);
1112 wqe->ee_nds = cpu_to_be32(1 << (qp->rq.wqe_shift - 4)); 1120 next->ee_nds = cpu_to_be32(size);
1121
1122 for (scatter = (void *) (next + 1);
1123 (void *) scatter < (void *) next + (1 << qp->rq.wqe_shift);
1124 ++scatter)
1125 scatter->lkey = cpu_to_be32(MTHCA_INVAL_LKEY);
1113 } 1126 }
1114 1127
1115 for (i = 0; i < qp->sq.max; ++i) { 1128 for (i = 0; i < qp->sq.max; ++i) {
1116 wqe = get_send_wqe(qp, i); 1129 next = get_send_wqe(qp, i);
1117 wqe->nda_op = cpu_to_be32((((i + 1) & (qp->sq.max - 1)) << 1130 next->nda_op = cpu_to_be32((((i + 1) & (qp->sq.max - 1)) <<
1118 qp->sq.wqe_shift) + 1131 qp->sq.wqe_shift) +
1119 qp->send_wqe_offset); 1132 qp->send_wqe_offset);
1120 } 1133 }
1121 } 1134 }
1122 1135
@@ -1975,7 +1988,7 @@ int mthca_arbel_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
1975 1988
1976 if (i < qp->rq.max_gs) { 1989 if (i < qp->rq.max_gs) {
1977 ((struct mthca_data_seg *) wqe)->byte_count = 0; 1990 ((struct mthca_data_seg *) wqe)->byte_count = 0;
1978 ((struct mthca_data_seg *) wqe)->lkey = cpu_to_be32(0x100); 1991 ((struct mthca_data_seg *) wqe)->lkey = cpu_to_be32(MTHCA_INVAL_LKEY);
1979 ((struct mthca_data_seg *) wqe)->addr = 0; 1992 ((struct mthca_data_seg *) wqe)->addr = 0;
1980 } 1993 }
1981 1994