Lines Matching refs:ch
291 static int srp_new_cm_id(struct srp_rdma_ch *ch) in srp_new_cm_id() argument
293 struct srp_target_port *target = ch->target; in srp_new_cm_id()
297 srp_cm_handler, ch); in srp_new_cm_id()
301 if (ch->cm_id) in srp_new_cm_id()
302 ib_destroy_cm_id(ch->cm_id); in srp_new_cm_id()
303 ch->cm_id = new_cm_id; in srp_new_cm_id()
304 ch->path.sgid = target->sgid; in srp_new_cm_id()
305 ch->path.dgid = target->orig_dgid; in srp_new_cm_id()
306 ch->path.pkey = target->pkey; in srp_new_cm_id()
307 ch->path.service_id = target->service_id; in srp_new_cm_id()
457 static void srp_destroy_qp(struct srp_rdma_ch *ch) in srp_destroy_qp() argument
465 WARN_ON_ONCE(ch->connected); in srp_destroy_qp()
467 ret = ib_modify_qp(ch->qp, &attr, IB_QP_STATE); in srp_destroy_qp()
472 init_completion(&ch->done); in srp_destroy_qp()
473 ret = ib_post_recv(ch->qp, &wr, &bad_wr); in srp_destroy_qp()
476 wait_for_completion(&ch->done); in srp_destroy_qp()
479 ib_destroy_qp(ch->qp); in srp_destroy_qp()
482 static int srp_create_ch_ib(struct srp_rdma_ch *ch) in srp_create_ch_ib() argument
484 struct srp_target_port *target = ch->target; in srp_create_ch_ib()
501 cq_attr.comp_vector = ch->comp_vector; in srp_create_ch_ib()
502 recv_cq = ib_create_cq(dev->dev, srp_recv_completion, NULL, ch, in srp_create_ch_ib()
510 cq_attr.comp_vector = ch->comp_vector; in srp_create_ch_ib()
511 send_cq = ib_create_cq(dev->dev, srp_send_completion, NULL, ch, in srp_create_ch_ib()
558 if (ch->qp) in srp_create_ch_ib()
559 srp_destroy_qp(ch); in srp_create_ch_ib()
560 if (ch->recv_cq) in srp_create_ch_ib()
561 ib_destroy_cq(ch->recv_cq); in srp_create_ch_ib()
562 if (ch->send_cq) in srp_create_ch_ib()
563 ib_destroy_cq(ch->send_cq); in srp_create_ch_ib()
565 ch->qp = qp; in srp_create_ch_ib()
566 ch->recv_cq = recv_cq; in srp_create_ch_ib()
567 ch->send_cq = send_cq; in srp_create_ch_ib()
570 if (ch->fr_pool) in srp_create_ch_ib()
571 srp_destroy_fr_pool(ch->fr_pool); in srp_create_ch_ib()
572 ch->fr_pool = fr_pool; in srp_create_ch_ib()
574 if (ch->fmr_pool) in srp_create_ch_ib()
575 ib_destroy_fmr_pool(ch->fmr_pool); in srp_create_ch_ib()
576 ch->fmr_pool = fmr_pool; in srp_create_ch_ib()
601 struct srp_rdma_ch *ch) in srp_free_ch_ib() argument
606 if (!ch->target) in srp_free_ch_ib()
609 if (ch->cm_id) { in srp_free_ch_ib()
610 ib_destroy_cm_id(ch->cm_id); in srp_free_ch_ib()
611 ch->cm_id = NULL; in srp_free_ch_ib()
615 if (!ch->qp) in srp_free_ch_ib()
619 if (ch->fr_pool) in srp_free_ch_ib()
620 srp_destroy_fr_pool(ch->fr_pool); in srp_free_ch_ib()
622 if (ch->fmr_pool) in srp_free_ch_ib()
623 ib_destroy_fmr_pool(ch->fmr_pool); in srp_free_ch_ib()
625 srp_destroy_qp(ch); in srp_free_ch_ib()
626 ib_destroy_cq(ch->send_cq); in srp_free_ch_ib()
627 ib_destroy_cq(ch->recv_cq); in srp_free_ch_ib()
635 ch->target = NULL; in srp_free_ch_ib()
637 ch->qp = NULL; in srp_free_ch_ib()
638 ch->send_cq = ch->recv_cq = NULL; in srp_free_ch_ib()
640 if (ch->rx_ring) { in srp_free_ch_ib()
642 srp_free_iu(target->srp_host, ch->rx_ring[i]); in srp_free_ch_ib()
643 kfree(ch->rx_ring); in srp_free_ch_ib()
644 ch->rx_ring = NULL; in srp_free_ch_ib()
646 if (ch->tx_ring) { in srp_free_ch_ib()
648 srp_free_iu(target->srp_host, ch->tx_ring[i]); in srp_free_ch_ib()
649 kfree(ch->tx_ring); in srp_free_ch_ib()
650 ch->tx_ring = NULL; in srp_free_ch_ib()
658 struct srp_rdma_ch *ch = ch_ptr; in srp_path_rec_completion() local
659 struct srp_target_port *target = ch->target; in srp_path_rec_completion()
661 ch->status = status; in srp_path_rec_completion()
666 ch->path = *pathrec; in srp_path_rec_completion()
667 complete(&ch->done); in srp_path_rec_completion()
670 static int srp_lookup_path(struct srp_rdma_ch *ch) in srp_lookup_path() argument
672 struct srp_target_port *target = ch->target; in srp_lookup_path()
675 ch->path.numb_path = 1; in srp_lookup_path()
677 init_completion(&ch->done); in srp_lookup_path()
679 ch->path_query_id = ib_sa_path_rec_get(&srp_sa_client, in srp_lookup_path()
682 &ch->path, in srp_lookup_path()
691 ch, &ch->path_query); in srp_lookup_path()
692 if (ch->path_query_id < 0) in srp_lookup_path()
693 return ch->path_query_id; in srp_lookup_path()
695 ret = wait_for_completion_interruptible(&ch->done); in srp_lookup_path()
699 if (ch->status < 0) in srp_lookup_path()
703 return ch->status; in srp_lookup_path()
706 static int srp_send_req(struct srp_rdma_ch *ch, bool multich) in srp_send_req() argument
708 struct srp_target_port *target = ch->target; in srp_send_req()
719 req->param.primary_path = &ch->path; in srp_send_req()
722 req->param.qp_num = ch->qp->qp_num; in srp_send_req()
723 req->param.qp_type = ch->qp->qp_type; in srp_send_req()
789 status = ib_send_cm_req(ch->cm_id, &req->param); in srp_send_req()
815 struct srp_rdma_ch *ch; in srp_disconnect_target() local
821 ch = &target->ch[i]; in srp_disconnect_target()
822 ch->connected = false; in srp_disconnect_target()
823 if (ch->cm_id && ib_send_cm_dreq(ch->cm_id, NULL, 0)) { in srp_disconnect_target()
831 struct srp_rdma_ch *ch) in srp_free_req_data() argument
838 if (!ch->req_ring) in srp_free_req_data()
842 req = &ch->req_ring[i]; in srp_free_req_data()
857 kfree(ch->req_ring); in srp_free_req_data()
858 ch->req_ring = NULL; in srp_free_req_data()
861 static int srp_alloc_req_data(struct srp_rdma_ch *ch) in srp_alloc_req_data() argument
863 struct srp_target_port *target = ch->target; in srp_alloc_req_data()
871 ch->req_ring = kcalloc(target->req_ring_size, sizeof(*ch->req_ring), in srp_alloc_req_data()
873 if (!ch->req_ring) in srp_alloc_req_data()
877 req = &ch->req_ring[i]; in srp_alloc_req_data()
926 struct srp_rdma_ch *ch; in srp_remove_target() local
938 ch = &target->ch[i]; in srp_remove_target()
939 srp_free_ch_ib(target, ch); in srp_remove_target()
944 ch = &target->ch[i]; in srp_remove_target()
945 srp_free_req_data(target, ch); in srp_remove_target()
947 kfree(target->ch); in srp_remove_target()
948 target->ch = NULL; in srp_remove_target()
983 c += target->ch[i].connected; in srp_connected_ch()
988 static int srp_connect_ch(struct srp_rdma_ch *ch, bool multich) in srp_connect_ch() argument
990 struct srp_target_port *target = ch->target; in srp_connect_ch()
995 ret = srp_lookup_path(ch); in srp_connect_ch()
1000 init_completion(&ch->done); in srp_connect_ch()
1001 ret = srp_send_req(ch, multich); in srp_connect_ch()
1004 ret = wait_for_completion_interruptible(&ch->done); in srp_connect_ch()
1014 ret = ch->status; in srp_connect_ch()
1017 ch->connected = true; in srp_connect_ch()
1021 ret = srp_lookup_path(ch); in srp_connect_ch()
1044 static int srp_inv_rkey(struct srp_rdma_ch *ch, u32 rkey) in srp_inv_rkey() argument
1056 return ib_post_send(ch->qp, &wr, &bad_wr); in srp_inv_rkey()
1060 struct srp_rdma_ch *ch, in srp_unmap_data() argument
1063 struct srp_target_port *target = ch->target; in srp_unmap_data()
1077 res = srp_inv_rkey(ch, (*pfr)->mr->rkey); in srp_unmap_data()
1087 srp_fr_pool_put(ch->fr_pool, req->fr_list, in srp_unmap_data()
1111 static struct scsi_cmnd *srp_claim_req(struct srp_rdma_ch *ch, in srp_claim_req() argument
1118 spin_lock_irqsave(&ch->lock, flags); in srp_claim_req()
1127 spin_unlock_irqrestore(&ch->lock, flags); in srp_claim_req()
1139 static void srp_free_req(struct srp_rdma_ch *ch, struct srp_request *req, in srp_free_req() argument
1144 srp_unmap_data(scmnd, ch, req); in srp_free_req()
1146 spin_lock_irqsave(&ch->lock, flags); in srp_free_req()
1147 ch->req_lim += req_lim_delta; in srp_free_req()
1148 spin_unlock_irqrestore(&ch->lock, flags); in srp_free_req()
1151 static void srp_finish_req(struct srp_rdma_ch *ch, struct srp_request *req, in srp_finish_req() argument
1154 struct scsi_cmnd *scmnd = srp_claim_req(ch, req, sdev, NULL); in srp_finish_req()
1157 srp_free_req(ch, req, scmnd, 0); in srp_finish_req()
1166 struct srp_rdma_ch *ch; in srp_terminate_io() local
1179 ch = &target->ch[i]; in srp_terminate_io()
1182 struct srp_request *req = &ch->req_ring[j]; in srp_terminate_io()
1184 srp_finish_req(ch, req, NULL, in srp_terminate_io()
1202 struct srp_rdma_ch *ch; in srp_rport_reconnect() local
1217 ch = &target->ch[i]; in srp_rport_reconnect()
1218 ret += srp_new_cm_id(ch); in srp_rport_reconnect()
1221 ch = &target->ch[i]; in srp_rport_reconnect()
1223 struct srp_request *req = &ch->req_ring[j]; in srp_rport_reconnect()
1225 srp_finish_req(ch, req, NULL, DID_RESET << 16); in srp_rport_reconnect()
1229 ch = &target->ch[i]; in srp_rport_reconnect()
1235 ret += srp_create_ch_ib(ch); in srp_rport_reconnect()
1237 INIT_LIST_HEAD(&ch->free_tx); in srp_rport_reconnect()
1239 list_add(&ch->tx_ring[j]->list, &ch->free_tx); in srp_rport_reconnect()
1245 ch = &target->ch[i]; in srp_rport_reconnect()
1248 ret = srp_connect_ch(ch, multich); in srp_rport_reconnect()
1276 struct srp_rdma_ch *ch) in srp_map_finish_fmr() argument
1278 struct srp_target_port *target = ch->target; in srp_map_finish_fmr()
1297 fmr = ib_fmr_pool_map_phys(ch->fmr_pool, state->pages, in srp_map_finish_fmr()
1316 struct srp_rdma_ch *ch, int sg_nents) in srp_map_finish_fr() argument
1318 struct srp_target_port *target = ch->target; in srp_map_finish_fr()
1341 desc = srp_fr_pool_get(ch->fr_pool); in srp_map_finish_fr()
1369 err = ib_post_send(ch->qp, &wr.wr, &bad_wr); in srp_map_finish_fr()
1377 struct srp_rdma_ch *ch, in srp_map_sg_entry() argument
1380 struct srp_target_port *target = ch->target; in srp_map_sg_entry()
1393 ret = srp_map_finish_fmr(state, ch); in srp_map_sg_entry()
1415 ret = srp_map_finish_fmr(state, ch); in srp_map_sg_entry()
1419 static int srp_map_sg_fmr(struct srp_map_state *state, struct srp_rdma_ch *ch, in srp_map_sg_fmr() argument
1429 state->fmr.end = req->fmr_list + ch->target->cmd_sg_cnt; in srp_map_sg_fmr()
1432 ret = srp_map_sg_entry(state, ch, sg, i); in srp_map_sg_fmr()
1437 ret = srp_map_finish_fmr(state, ch); in srp_map_sg_fmr()
1446 static int srp_map_sg_fr(struct srp_map_state *state, struct srp_rdma_ch *ch, in srp_map_sg_fr() argument
1452 state->fr.end = req->fr_list + ch->target->cmd_sg_cnt; in srp_map_sg_fr()
1458 n = srp_map_finish_fr(state, ch, count); in srp_map_sg_fr()
1472 static int srp_map_sg_dma(struct srp_map_state *state, struct srp_rdma_ch *ch, in srp_map_sg_dma() argument
1476 struct srp_target_port *target = ch->target; in srp_map_sg_dma()
1500 static int srp_map_idb(struct srp_rdma_ch *ch, struct srp_request *req, in srp_map_idb() argument
1504 struct srp_target_port *target = ch->target; in srp_map_idb()
1527 ret = srp_map_finish_fr(&state, ch, 1); in srp_map_idb()
1535 ret = srp_map_finish_fmr(&state, ch); in srp_map_idb()
1547 static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_rdma_ch *ch, in srp_map_data() argument
1550 struct srp_target_port *target = ch->target; in srp_map_data()
1614 srp_map_sg_fr(&state, ch, req, scat, count); in srp_map_data()
1616 srp_map_sg_fmr(&state, ch, req, scat, count); in srp_map_data()
1618 srp_map_sg_dma(&state, ch, req, scat, count); in srp_map_data()
1656 ret = srp_map_idb(ch, req, state.gen.next, state.gen.end, in srp_map_data()
1690 static void srp_put_tx_iu(struct srp_rdma_ch *ch, struct srp_iu *iu, in srp_put_tx_iu() argument
1695 spin_lock_irqsave(&ch->lock, flags); in srp_put_tx_iu()
1696 list_add(&iu->list, &ch->free_tx); in srp_put_tx_iu()
1698 ++ch->req_lim; in srp_put_tx_iu()
1699 spin_unlock_irqrestore(&ch->lock, flags); in srp_put_tx_iu()
1715 static struct srp_iu *__srp_get_tx_iu(struct srp_rdma_ch *ch, in __srp_get_tx_iu() argument
1718 struct srp_target_port *target = ch->target; in __srp_get_tx_iu()
1722 srp_send_completion(ch->send_cq, ch); in __srp_get_tx_iu()
1724 if (list_empty(&ch->free_tx)) in __srp_get_tx_iu()
1729 if (ch->req_lim <= rsv) { in __srp_get_tx_iu()
1734 --ch->req_lim; in __srp_get_tx_iu()
1737 iu = list_first_entry(&ch->free_tx, struct srp_iu, list); in __srp_get_tx_iu()
1742 static int srp_post_send(struct srp_rdma_ch *ch, struct srp_iu *iu, int len) in srp_post_send() argument
1744 struct srp_target_port *target = ch->target; in srp_post_send()
1759 return ib_post_send(ch->qp, &wr, &bad_wr); in srp_post_send()
1762 static int srp_post_recv(struct srp_rdma_ch *ch, struct srp_iu *iu) in srp_post_recv() argument
1764 struct srp_target_port *target = ch->target; in srp_post_recv()
1777 return ib_post_recv(ch->qp, &wr, &bad_wr); in srp_post_recv()
1780 static void srp_process_rsp(struct srp_rdma_ch *ch, struct srp_rsp *rsp) in srp_process_rsp() argument
1782 struct srp_target_port *target = ch->target; in srp_process_rsp()
1788 spin_lock_irqsave(&ch->lock, flags); in srp_process_rsp()
1789 ch->req_lim += be32_to_cpu(rsp->req_lim_delta); in srp_process_rsp()
1790 spin_unlock_irqrestore(&ch->lock, flags); in srp_process_rsp()
1792 ch->tsk_mgmt_status = -1; in srp_process_rsp()
1794 ch->tsk_mgmt_status = rsp->data[3]; in srp_process_rsp()
1795 complete(&ch->tsk_mgmt_done); in srp_process_rsp()
1800 scmnd = srp_claim_req(ch, req, NULL, scmnd); in srp_process_rsp()
1805 rsp->tag, ch - target->ch, ch->qp->qp_num); in srp_process_rsp()
1807 spin_lock_irqsave(&ch->lock, flags); in srp_process_rsp()
1808 ch->req_lim += be32_to_cpu(rsp->req_lim_delta); in srp_process_rsp()
1809 spin_unlock_irqrestore(&ch->lock, flags); in srp_process_rsp()
1831 srp_free_req(ch, req, scmnd, in srp_process_rsp()
1839 static int srp_response_common(struct srp_rdma_ch *ch, s32 req_delta, in srp_response_common() argument
1842 struct srp_target_port *target = ch->target; in srp_response_common()
1848 spin_lock_irqsave(&ch->lock, flags); in srp_response_common()
1849 ch->req_lim += req_delta; in srp_response_common()
1850 iu = __srp_get_tx_iu(ch, SRP_IU_RSP); in srp_response_common()
1851 spin_unlock_irqrestore(&ch->lock, flags); in srp_response_common()
1863 err = srp_post_send(ch, iu, len); in srp_response_common()
1867 srp_put_tx_iu(ch, iu, SRP_IU_RSP); in srp_response_common()
1873 static void srp_process_cred_req(struct srp_rdma_ch *ch, in srp_process_cred_req() argument
1882 if (srp_response_common(ch, delta, &rsp, sizeof(rsp))) in srp_process_cred_req()
1883 shost_printk(KERN_ERR, ch->target->scsi_host, PFX in srp_process_cred_req()
1887 static void srp_process_aer_req(struct srp_rdma_ch *ch, in srp_process_aer_req() argument
1890 struct srp_target_port *target = ch->target; in srp_process_aer_req()
1900 if (srp_response_common(ch, delta, &rsp, sizeof(rsp))) in srp_process_aer_req()
1905 static void srp_handle_recv(struct srp_rdma_ch *ch, struct ib_wc *wc) in srp_handle_recv() argument
1907 struct srp_target_port *target = ch->target; in srp_handle_recv()
1913 ib_dma_sync_single_for_cpu(dev, iu->dma, ch->max_ti_iu_len, in srp_handle_recv()
1927 srp_process_rsp(ch, iu->buf); in srp_handle_recv()
1931 srp_process_cred_req(ch, iu->buf); in srp_handle_recv()
1935 srp_process_aer_req(ch, iu->buf); in srp_handle_recv()
1950 ib_dma_sync_single_for_device(dev, iu->dma, ch->max_ti_iu_len, in srp_handle_recv()
1953 res = srp_post_recv(ch, iu); in srp_handle_recv()
1976 bool send_err, struct srp_rdma_ch *ch) in srp_handle_qp_err() argument
1978 struct srp_target_port *target = ch->target; in srp_handle_qp_err()
1981 complete(&ch->done); in srp_handle_qp_err()
1985 if (ch->connected && !target->qp_in_error) { in srp_handle_qp_err()
2008 struct srp_rdma_ch *ch = ch_ptr; in srp_recv_completion() local
2014 srp_handle_recv(ch, &wc); in srp_recv_completion()
2016 srp_handle_qp_err(wc.wr_id, wc.status, false, ch); in srp_recv_completion()
2023 struct srp_rdma_ch *ch = ch_ptr; in srp_send_completion() local
2030 list_add(&iu->list, &ch->free_tx); in srp_send_completion()
2032 srp_handle_qp_err(wc.wr_id, wc.status, true, ch); in srp_send_completion()
2041 struct srp_rdma_ch *ch; in srp_queuecommand() local
2067 ch = &target->ch[blk_mq_unique_tag_to_hwq(tag)]; in srp_queuecommand()
2073 spin_lock_irqsave(&ch->lock, flags); in srp_queuecommand()
2074 iu = __srp_get_tx_iu(ch, SRP_IU_CMD); in srp_queuecommand()
2075 spin_unlock_irqrestore(&ch->lock, flags); in srp_queuecommand()
2080 req = &ch->req_ring[idx]; in srp_queuecommand()
2098 len = srp_map_data(scmnd, ch, req); in srp_queuecommand()
2116 if (srp_post_send(ch, iu, len)) { in srp_queuecommand()
2130 srp_unmap_data(scmnd, ch, req); in srp_queuecommand()
2133 srp_put_tx_iu(ch, iu, SRP_IU_CMD); in srp_queuecommand()
2156 static int srp_alloc_iu_bufs(struct srp_rdma_ch *ch) in srp_alloc_iu_bufs() argument
2158 struct srp_target_port *target = ch->target; in srp_alloc_iu_bufs()
2161 ch->rx_ring = kcalloc(target->queue_size, sizeof(*ch->rx_ring), in srp_alloc_iu_bufs()
2163 if (!ch->rx_ring) in srp_alloc_iu_bufs()
2165 ch->tx_ring = kcalloc(target->queue_size, sizeof(*ch->tx_ring), in srp_alloc_iu_bufs()
2167 if (!ch->tx_ring) in srp_alloc_iu_bufs()
2171 ch->rx_ring[i] = srp_alloc_iu(target->srp_host, in srp_alloc_iu_bufs()
2172 ch->max_ti_iu_len, in srp_alloc_iu_bufs()
2174 if (!ch->rx_ring[i]) in srp_alloc_iu_bufs()
2179 ch->tx_ring[i] = srp_alloc_iu(target->srp_host, in srp_alloc_iu_bufs()
2182 if (!ch->tx_ring[i]) in srp_alloc_iu_bufs()
2185 list_add(&ch->tx_ring[i]->list, &ch->free_tx); in srp_alloc_iu_bufs()
2192 srp_free_iu(target->srp_host, ch->rx_ring[i]); in srp_alloc_iu_bufs()
2193 srp_free_iu(target->srp_host, ch->tx_ring[i]); in srp_alloc_iu_bufs()
2198 kfree(ch->tx_ring); in srp_alloc_iu_bufs()
2199 ch->tx_ring = NULL; in srp_alloc_iu_bufs()
2200 kfree(ch->rx_ring); in srp_alloc_iu_bufs()
2201 ch->rx_ring = NULL; in srp_alloc_iu_bufs()
2235 struct srp_rdma_ch *ch) in srp_cm_rep_handler() argument
2237 struct srp_target_port *target = ch->target; in srp_cm_rep_handler()
2244 ch->max_ti_iu_len = be32_to_cpu(lrsp->max_ti_iu_len); in srp_cm_rep_handler()
2245 ch->req_lim = be32_to_cpu(lrsp->req_lim_delta); in srp_cm_rep_handler()
2252 = min(ch->req_lim - SRP_TSK_MGMT_SQ_SIZE, in srp_cm_rep_handler()
2264 if (!ch->rx_ring) { in srp_cm_rep_handler()
2265 ret = srp_alloc_iu_bufs(ch); in srp_cm_rep_handler()
2280 ret = ib_modify_qp(ch->qp, qp_attr, attr_mask); in srp_cm_rep_handler()
2285 struct srp_iu *iu = ch->rx_ring[i]; in srp_cm_rep_handler()
2287 ret = srp_post_recv(ch, iu); in srp_cm_rep_handler()
2299 ret = ib_modify_qp(ch->qp, qp_attr, attr_mask); in srp_cm_rep_handler()
2309 ch->status = ret; in srp_cm_rep_handler()
2314 struct srp_rdma_ch *ch) in srp_cm_rej_handler() argument
2316 struct srp_target_port *target = ch->target; in srp_cm_rej_handler()
2324 ch->path.dlid = cpi->redirect_lid; in srp_cm_rej_handler()
2325 ch->path.pkey = cpi->redirect_pkey; in srp_cm_rej_handler()
2327 memcpy(ch->path.dgid.raw, cpi->redirect_gid, 16); in srp_cm_rej_handler()
2329 ch->status = ch->path.dlid ? in srp_cm_rej_handler()
2340 memcpy(ch->path.dgid.raw, in srp_cm_rej_handler()
2345 be64_to_cpu(ch->path.dgid.global.subnet_prefix), in srp_cm_rej_handler()
2346 be64_to_cpu(ch->path.dgid.global.interface_id)); in srp_cm_rej_handler()
2348 ch->status = SRP_PORT_REDIRECT; in srp_cm_rej_handler()
2352 ch->status = -ECONNRESET; in srp_cm_rej_handler()
2359 ch->status = -ECONNRESET; in srp_cm_rej_handler()
2380 ch->status = -ECONNRESET; in srp_cm_rej_handler()
2385 ch->status = SRP_STALE_CONN; in srp_cm_rej_handler()
2391 ch->status = -ECONNRESET; in srp_cm_rej_handler()
2397 struct srp_rdma_ch *ch = cm_id->context; in srp_cm_handler() local
2398 struct srp_target_port *target = ch->target; in srp_cm_handler()
2406 ch->status = -ECONNRESET; in srp_cm_handler()
2411 srp_cm_rep_handler(cm_id, event->private_data, ch); in srp_cm_handler()
2418 srp_cm_rej_handler(cm_id, event, ch); in srp_cm_handler()
2424 ch->connected = false; in srp_cm_handler()
2436 ch->status = 0; in srp_cm_handler()
2451 complete(&ch->done); in srp_cm_handler()
2471 static int srp_send_tsk_mgmt(struct srp_rdma_ch *ch, u64 req_tag, u64 lun, in srp_send_tsk_mgmt() argument
2474 struct srp_target_port *target = ch->target; in srp_send_tsk_mgmt()
2480 if (!ch->connected || target->qp_in_error) in srp_send_tsk_mgmt()
2483 init_completion(&ch->tsk_mgmt_done); in srp_send_tsk_mgmt()
2490 spin_lock_irq(&ch->lock); in srp_send_tsk_mgmt()
2491 iu = __srp_get_tx_iu(ch, SRP_IU_TSK_MGMT); in srp_send_tsk_mgmt()
2492 spin_unlock_irq(&ch->lock); in srp_send_tsk_mgmt()
2513 if (srp_post_send(ch, iu, sizeof(*tsk_mgmt))) { in srp_send_tsk_mgmt()
2514 srp_put_tx_iu(ch, iu, SRP_IU_TSK_MGMT); in srp_send_tsk_mgmt()
2521 if (!wait_for_completion_timeout(&ch->tsk_mgmt_done, in srp_send_tsk_mgmt()
2534 struct srp_rdma_ch *ch; in srp_abort() local
2545 ch = &target->ch[ch_idx]; in srp_abort()
2546 if (!srp_claim_req(ch, req, NULL, scmnd)) in srp_abort()
2550 if (srp_send_tsk_mgmt(ch, tag, scmnd->device->lun, in srp_abort()
2557 srp_free_req(ch, req, scmnd, 0); in srp_abort()
2567 struct srp_rdma_ch *ch; in srp_reset_device() local
2572 ch = &target->ch[0]; in srp_reset_device()
2573 if (srp_send_tsk_mgmt(ch, SRP_TAG_NO_REQ, scmnd->device->lun, in srp_reset_device()
2576 if (ch->tsk_mgmt_status) in srp_reset_device()
2580 ch = &target->ch[i]; in srp_reset_device()
2582 struct srp_request *req = &ch->req_ring[i]; in srp_reset_device()
2584 srp_finish_req(ch, req, scmnd->device, DID_RESET << 16); in srp_reset_device()
2659 struct srp_rdma_ch *ch = &target->ch[0]; in show_dgid() local
2661 return sprintf(buf, "%pI6\n", ch->path.dgid.raw); in show_dgid()
2676 struct srp_rdma_ch *ch; in show_req_lim() local
2680 ch = &target->ch[i]; in show_req_lim()
2681 req_lim = min(req_lim, ch->req_lim); in show_req_lim()
3193 struct srp_rdma_ch *ch; in srp_create_target() local
3273 target->ch = kcalloc(target->ch_count, sizeof(*target->ch), in srp_create_target()
3275 if (!target->ch) in srp_create_target()
3297 ch = &target->ch[ch_start + cpu_idx]; in srp_create_target()
3298 ch->target = target; in srp_create_target()
3299 ch->comp_vector = cv_start == cv_end ? cv_start : in srp_create_target()
3301 spin_lock_init(&ch->lock); in srp_create_target()
3302 INIT_LIST_HEAD(&ch->free_tx); in srp_create_target()
3303 ret = srp_new_cm_id(ch); in srp_create_target()
3307 ret = srp_create_ch_ib(ch); in srp_create_target()
3311 ret = srp_alloc_req_data(ch); in srp_create_target()
3315 ret = srp_connect_ch(ch, multich); in srp_create_target()
3324 srp_free_ch_ib(target, ch); in srp_create_target()
3325 srp_free_req_data(target, ch); in srp_create_target()
3326 target->ch_count = ch - target->ch; in srp_create_target()
3369 ch = &target->ch[i]; in srp_create_target()
3370 srp_free_ch_ib(target, ch); in srp_create_target()
3371 srp_free_req_data(target, ch); in srp_create_target()
3374 kfree(target->ch); in srp_create_target()