diff options
-rw-r--r-- | drivers/infiniband/hw/cxgb4/cq.c | 22 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb4/qp.c | 6 |
2 files changed, 11 insertions, 17 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c index ce468e542428..e17b155b3758 100644 --- a/drivers/infiniband/hw/cxgb4/cq.c +++ b/drivers/infiniband/hw/cxgb4/cq.c | |||
@@ -235,27 +235,21 @@ int c4iw_flush_sq(struct c4iw_qp *qhp) | |||
235 | struct t4_cq *cq = &chp->cq; | 235 | struct t4_cq *cq = &chp->cq; |
236 | int idx; | 236 | int idx; |
237 | struct t4_swsqe *swsqe; | 237 | struct t4_swsqe *swsqe; |
238 | int error = (qhp->attr.state != C4IW_QP_STATE_CLOSING && | ||
239 | qhp->attr.state != C4IW_QP_STATE_IDLE); | ||
240 | 238 | ||
241 | if (wq->sq.flush_cidx == -1) | 239 | if (wq->sq.flush_cidx == -1) |
242 | wq->sq.flush_cidx = wq->sq.cidx; | 240 | wq->sq.flush_cidx = wq->sq.cidx; |
243 | idx = wq->sq.flush_cidx; | 241 | idx = wq->sq.flush_cidx; |
244 | BUG_ON(idx >= wq->sq.size); | 242 | BUG_ON(idx >= wq->sq.size); |
245 | while (idx != wq->sq.pidx) { | 243 | while (idx != wq->sq.pidx) { |
246 | if (error) { | 244 | swsqe = &wq->sq.sw_sq[idx]; |
247 | swsqe = &wq->sq.sw_sq[idx]; | 245 | BUG_ON(swsqe->flushed); |
248 | BUG_ON(swsqe->flushed); | 246 | swsqe->flushed = 1; |
249 | swsqe->flushed = 1; | 247 | insert_sq_cqe(wq, cq, swsqe); |
250 | insert_sq_cqe(wq, cq, swsqe); | 248 | if (wq->sq.oldest_read == swsqe) { |
251 | if (wq->sq.oldest_read == swsqe) { | 249 | BUG_ON(swsqe->opcode != FW_RI_READ_REQ); |
252 | BUG_ON(swsqe->opcode != FW_RI_READ_REQ); | 250 | advance_oldest_read(wq); |
253 | advance_oldest_read(wq); | ||
254 | } | ||
255 | flushed++; | ||
256 | } else { | ||
257 | t4_sq_consume(wq); | ||
258 | } | 251 | } |
252 | flushed++; | ||
259 | if (++idx == wq->sq.size) | 253 | if (++idx == wq->sq.size) |
260 | idx = 0; | 254 | idx = 0; |
261 | } | 255 | } |
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c index e2fcbf4814f2..9b4a8b88908e 100644 --- a/drivers/infiniband/hw/cxgb4/qp.c +++ b/drivers/infiniband/hw/cxgb4/qp.c | |||
@@ -1367,6 +1367,7 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp, | |||
1367 | switch (attrs->next_state) { | 1367 | switch (attrs->next_state) { |
1368 | case C4IW_QP_STATE_CLOSING: | 1368 | case C4IW_QP_STATE_CLOSING: |
1369 | BUG_ON(atomic_read(&qhp->ep->com.kref.refcount) < 2); | 1369 | BUG_ON(atomic_read(&qhp->ep->com.kref.refcount) < 2); |
1370 | t4_set_wq_in_error(&qhp->wq); | ||
1370 | set_state(qhp, C4IW_QP_STATE_CLOSING); | 1371 | set_state(qhp, C4IW_QP_STATE_CLOSING); |
1371 | ep = qhp->ep; | 1372 | ep = qhp->ep; |
1372 | if (!internal) { | 1373 | if (!internal) { |
@@ -1374,16 +1375,15 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp, | |||
1374 | disconnect = 1; | 1375 | disconnect = 1; |
1375 | c4iw_get_ep(&qhp->ep->com); | 1376 | c4iw_get_ep(&qhp->ep->com); |
1376 | } | 1377 | } |
1377 | t4_set_wq_in_error(&qhp->wq); | ||
1378 | ret = rdma_fini(rhp, qhp, ep); | 1378 | ret = rdma_fini(rhp, qhp, ep); |
1379 | if (ret) | 1379 | if (ret) |
1380 | goto err; | 1380 | goto err; |
1381 | break; | 1381 | break; |
1382 | case C4IW_QP_STATE_TERMINATE: | 1382 | case C4IW_QP_STATE_TERMINATE: |
1383 | t4_set_wq_in_error(&qhp->wq); | ||
1383 | set_state(qhp, C4IW_QP_STATE_TERMINATE); | 1384 | set_state(qhp, C4IW_QP_STATE_TERMINATE); |
1384 | qhp->attr.layer_etype = attrs->layer_etype; | 1385 | qhp->attr.layer_etype = attrs->layer_etype; |
1385 | qhp->attr.ecode = attrs->ecode; | 1386 | qhp->attr.ecode = attrs->ecode; |
1386 | t4_set_wq_in_error(&qhp->wq); | ||
1387 | ep = qhp->ep; | 1387 | ep = qhp->ep; |
1388 | disconnect = 1; | 1388 | disconnect = 1; |
1389 | if (!internal) | 1389 | if (!internal) |
@@ -1396,8 +1396,8 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp, | |||
1396 | c4iw_get_ep(&qhp->ep->com); | 1396 | c4iw_get_ep(&qhp->ep->com); |
1397 | break; | 1397 | break; |
1398 | case C4IW_QP_STATE_ERROR: | 1398 | case C4IW_QP_STATE_ERROR: |
1399 | set_state(qhp, C4IW_QP_STATE_ERROR); | ||
1400 | t4_set_wq_in_error(&qhp->wq); | 1399 | t4_set_wq_in_error(&qhp->wq); |
1400 | set_state(qhp, C4IW_QP_STATE_ERROR); | ||
1401 | if (!internal) { | 1401 | if (!internal) { |
1402 | abort = 1; | 1402 | abort = 1; |
1403 | disconnect = 1; | 1403 | disconnect = 1; |