/* move the qp to the reset state */ static void rxe_qp_reset(struct rxe_qp *qp) { /* stop tasks from running */ rxe_disable_task(&qp->resp.task); /* stop request/comp */ if (qp->sq.queue) { if (qp_type(qp) == IB_QPT_RC) rxe_disable_task(&qp->comp.task); rxe_disable_task(&qp->req.task); } /* move qp to the reset state */ qp->req.state = QP_STATE_RESET; qp->resp.state = QP_STATE_RESET; /* let state machines reset themselves drain work and packet queues * etc. */ __rxe_do_task(&qp->resp.task); if (qp->sq.queue) { __rxe_do_task(&qp->comp.task); __rxe_do_task(&qp->req.task); rxe_queue_reset(qp->sq.queue); } /* cleanup attributes */ atomic_set(&qp->ssn, 0); qp->req.opcode = -1; qp->req.need_retry = 0; qp->req.noack_pkts = 0; qp->resp.msn = 0; qp->resp.opcode = -1; qp->resp.drop_msg = 0; qp->resp.goto_error = 0; qp->resp.sent_psn_nak = 0; if (qp->resp.mr) { rxe_drop_ref(qp->resp.mr); qp->resp.mr = NULL; } cleanup_rd_atomic_resources(qp); /* reenable tasks */ rxe_enable_task(&qp->resp.task); if (qp->sq.queue) { if (qp_type(qp) == IB_QPT_RC) rxe_enable_task(&qp->comp.task); rxe_enable_task(&qp->req.task); } }
/* called by the destroy qp verb */ void rxe_qp_destroy(struct rxe_qp *qp) { qp->valid = 0; qp->qp_timeout_jiffies = 0; rxe_cleanup_task(&qp->resp.task); del_timer_sync(&qp->retrans_timer); del_timer_sync(&qp->rnr_nak_timer); rxe_cleanup_task(&qp->req.task); if (qp_type(qp) == IB_QPT_RC) rxe_cleanup_task(&qp->comp.task); /* flush out any receive wr's or pending requests */ __rxe_do_task(&qp->req.task); if (qp->sq.queue) { __rxe_do_task(&qp->comp.task); __rxe_do_task(&qp->req.task); } }
/* drain the send queue */ static void rxe_qp_drain(struct rxe_qp *qp) { if (qp->sq.queue) { if (qp->req.state != QP_STATE_DRAINED) { qp->req.state = QP_STATE_DRAIN; if (qp_type(qp) == IB_QPT_RC) rxe_run_task(&qp->comp.task, 1); else __rxe_do_task(&qp->comp.task); rxe_run_task(&qp->req.task, 1); } } }
/* move the qp to the error state */ void rxe_qp_error(struct rxe_qp *qp) { qp->req.state = QP_STATE_ERROR; qp->resp.state = QP_STATE_ERROR; /* drain work and packet queues */ rxe_run_task(&qp->resp.task, 1); if (qp_type(qp) == IB_QPT_RC) rxe_run_task(&qp->comp.task, 1); else __rxe_do_task(&qp->comp.task); rxe_run_task(&qp->req.task, 1); }