Lines Matching refs:cep

36 	struct erdma_cep *cep = sk_to_cep(sk);  in erdma_sk_save_upcalls()  local
39 cep->sk_state_change = sk->sk_state_change; in erdma_sk_save_upcalls()
40 cep->sk_data_ready = sk->sk_data_ready; in erdma_sk_save_upcalls()
41 cep->sk_error_report = sk->sk_error_report; in erdma_sk_save_upcalls()
45 static void erdma_sk_restore_upcalls(struct sock *sk, struct erdma_cep *cep) in erdma_sk_restore_upcalls() argument
47 sk->sk_state_change = cep->sk_state_change; in erdma_sk_restore_upcalls()
48 sk->sk_data_ready = cep->sk_data_ready; in erdma_sk_restore_upcalls()
49 sk->sk_error_report = cep->sk_error_report; in erdma_sk_restore_upcalls()
56 struct erdma_cep *cep; in erdma_socket_disassoc() local
60 cep = sk_to_cep(sk); in erdma_socket_disassoc()
61 if (cep) { in erdma_socket_disassoc()
62 erdma_sk_restore_upcalls(sk, cep); in erdma_socket_disassoc()
63 erdma_cep_put(cep); in erdma_socket_disassoc()
73 static void erdma_cep_socket_assoc(struct erdma_cep *cep, struct socket *s) in erdma_cep_socket_assoc() argument
75 cep->sock = s; in erdma_cep_socket_assoc()
76 erdma_cep_get(cep); in erdma_cep_socket_assoc()
77 s->sk->sk_user_data = cep; in erdma_cep_socket_assoc()
83 static void erdma_disassoc_listen_cep(struct erdma_cep *cep) in erdma_disassoc_listen_cep() argument
85 if (cep->listen_cep) { in erdma_disassoc_listen_cep()
86 erdma_cep_put(cep->listen_cep); in erdma_disassoc_listen_cep()
87 cep->listen_cep = NULL; in erdma_disassoc_listen_cep()
93 struct erdma_cep *cep = kzalloc(sizeof(*cep), GFP_KERNEL); in erdma_cep_alloc() local
96 if (!cep) in erdma_cep_alloc()
99 INIT_LIST_HEAD(&cep->listenq); in erdma_cep_alloc()
100 INIT_LIST_HEAD(&cep->devq); in erdma_cep_alloc()
101 INIT_LIST_HEAD(&cep->work_freelist); in erdma_cep_alloc()
103 kref_init(&cep->ref); in erdma_cep_alloc()
104 cep->state = ERDMA_EPSTATE_IDLE; in erdma_cep_alloc()
105 init_waitqueue_head(&cep->waitq); in erdma_cep_alloc()
106 spin_lock_init(&cep->lock); in erdma_cep_alloc()
107 cep->dev = dev; in erdma_cep_alloc()
110 list_add_tail(&cep->devq, &dev->cep_list); in erdma_cep_alloc()
113 return cep; in erdma_cep_alloc()
116 static void erdma_cm_free_work(struct erdma_cep *cep) in erdma_cm_free_work() argument
121 list_for_each_safe(w, tmp, &cep->work_freelist) { in erdma_cm_free_work()
128 static void erdma_cancel_mpatimer(struct erdma_cep *cep) in erdma_cancel_mpatimer() argument
130 spin_lock_bh(&cep->lock); in erdma_cancel_mpatimer()
131 if (cep->mpa_timer) { in erdma_cancel_mpatimer()
132 if (cancel_delayed_work(&cep->mpa_timer->work)) { in erdma_cancel_mpatimer()
133 erdma_cep_put(cep); in erdma_cancel_mpatimer()
134 kfree(cep->mpa_timer); in erdma_cancel_mpatimer()
136 cep->mpa_timer = NULL; in erdma_cancel_mpatimer()
138 spin_unlock_bh(&cep->lock); in erdma_cancel_mpatimer()
144 spin_lock_bh(&work->cep->lock); in erdma_put_work()
145 list_add(&work->list, &work->cep->work_freelist); in erdma_put_work()
146 spin_unlock_bh(&work->cep->lock); in erdma_put_work()
149 static void erdma_cep_set_inuse(struct erdma_cep *cep) in erdma_cep_set_inuse() argument
153 spin_lock_irqsave(&cep->lock, flags); in erdma_cep_set_inuse()
154 while (cep->in_use) { in erdma_cep_set_inuse()
155 spin_unlock_irqrestore(&cep->lock, flags); in erdma_cep_set_inuse()
156 wait_event_interruptible(cep->waitq, !cep->in_use); in erdma_cep_set_inuse()
160 spin_lock_irqsave(&cep->lock, flags); in erdma_cep_set_inuse()
163 cep->in_use = 1; in erdma_cep_set_inuse()
164 spin_unlock_irqrestore(&cep->lock, flags); in erdma_cep_set_inuse()
167 static void erdma_cep_set_free(struct erdma_cep *cep) in erdma_cep_set_free() argument
171 spin_lock_irqsave(&cep->lock, flags); in erdma_cep_set_free()
172 cep->in_use = 0; in erdma_cep_set_free()
173 spin_unlock_irqrestore(&cep->lock, flags); in erdma_cep_set_free()
175 wake_up(&cep->waitq); in erdma_cep_set_free()
180 struct erdma_cep *cep = container_of(ref, struct erdma_cep, ref); in __erdma_cep_dealloc() local
181 struct erdma_dev *dev = cep->dev; in __erdma_cep_dealloc()
184 WARN_ON(cep->listen_cep); in __erdma_cep_dealloc()
186 kfree(cep->private_data); in __erdma_cep_dealloc()
187 kfree(cep->mpa.pdata); in __erdma_cep_dealloc()
188 spin_lock_bh(&cep->lock); in __erdma_cep_dealloc()
189 if (!list_empty(&cep->work_freelist)) in __erdma_cep_dealloc()
190 erdma_cm_free_work(cep); in __erdma_cep_dealloc()
191 spin_unlock_bh(&cep->lock); in __erdma_cep_dealloc()
194 list_del(&cep->devq); in __erdma_cep_dealloc()
196 kfree(cep); in __erdma_cep_dealloc()
199 static struct erdma_cm_work *erdma_get_work(struct erdma_cep *cep) in erdma_get_work() argument
203 spin_lock_bh(&cep->lock); in erdma_get_work()
204 if (!list_empty(&cep->work_freelist)) { in erdma_get_work()
205 work = list_entry(cep->work_freelist.next, struct erdma_cm_work, in erdma_get_work()
210 spin_unlock_bh(&cep->lock); in erdma_get_work()
214 static int erdma_cm_alloc_work(struct erdma_cep *cep, int num) in erdma_cm_alloc_work() argument
221 if (!(list_empty(&cep->work_freelist))) in erdma_cm_alloc_work()
222 erdma_cm_free_work(cep); in erdma_cm_alloc_work()
225 work->cep = cep; in erdma_cm_alloc_work()
227 list_add(&work->list, &cep->work_freelist); in erdma_cm_alloc_work()
233 static int erdma_cm_upcall(struct erdma_cep *cep, enum iw_cm_event_type reason, in erdma_cm_upcall() argument
244 event.provider_data = cep; in erdma_cm_upcall()
245 cm_id = cep->listen_cep->cm_id; in erdma_cm_upcall()
247 event.ird = cep->dev->attrs.max_ird; in erdma_cm_upcall()
248 event.ord = cep->dev->attrs.max_ord; in erdma_cm_upcall()
250 cm_id = cep->cm_id; in erdma_cm_upcall()
255 u16 pd_len = be16_to_cpu(cep->mpa.hdr.params.pd_len); in erdma_cm_upcall()
257 if (pd_len && cep->mpa.pdata) { in erdma_cm_upcall()
259 event.private_data = cep->mpa.pdata; in erdma_cm_upcall()
262 getname_local(cep->sock, &event.local_addr); in erdma_cm_upcall()
263 getname_peer(cep->sock, &event.remote_addr); in erdma_cm_upcall()
271 struct erdma_cep *cep = qp->cep; in erdma_qp_cm_drop() local
273 if (!qp->cep) in erdma_qp_cm_drop()
276 erdma_cep_set_inuse(cep); in erdma_qp_cm_drop()
279 if (cep->state == ERDMA_EPSTATE_CLOSED) in erdma_qp_cm_drop()
282 if (cep->cm_id) { in erdma_qp_cm_drop()
283 switch (cep->state) { in erdma_qp_cm_drop()
285 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, in erdma_qp_cm_drop()
289 erdma_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0); in erdma_qp_cm_drop()
300 cep->cm_id->rem_ref(cep->cm_id); in erdma_qp_cm_drop()
301 cep->cm_id = NULL; in erdma_qp_cm_drop()
302 erdma_cep_put(cep); in erdma_qp_cm_drop()
304 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_qp_cm_drop()
306 if (cep->sock) { in erdma_qp_cm_drop()
307 erdma_socket_disassoc(cep->sock); in erdma_qp_cm_drop()
308 sock_release(cep->sock); in erdma_qp_cm_drop()
309 cep->sock = NULL; in erdma_qp_cm_drop()
312 if (cep->qp) { in erdma_qp_cm_drop()
313 cep->qp = NULL; in erdma_qp_cm_drop()
317 erdma_cep_set_free(cep); in erdma_qp_cm_drop()
320 void erdma_cep_put(struct erdma_cep *cep) in erdma_cep_put() argument
322 WARN_ON(kref_read(&cep->ref) < 1); in erdma_cep_put()
323 kref_put(&cep->ref, __erdma_cep_dealloc); in erdma_cep_put()
326 void erdma_cep_get(struct erdma_cep *cep) in erdma_cep_get() argument
328 kref_get(&cep->ref); in erdma_cep_get()
331 static int erdma_send_mpareqrep(struct erdma_cep *cep, const void *pdata, in erdma_send_mpareqrep() argument
334 struct socket *s = cep->sock; in erdma_send_mpareqrep()
335 struct mpa_rr *rr = &cep->mpa.hdr; in erdma_send_mpareqrep()
351 iov[iovec_num].iov_base = &cep->mpa.ext_data; in erdma_send_mpareqrep()
352 iov[iovec_num].iov_len = sizeof(cep->mpa.ext_data); in erdma_send_mpareqrep()
354 mpa_len += sizeof(cep->mpa.ext_data); in erdma_send_mpareqrep()
377 static int __recv_mpa_hdr(struct erdma_cep *cep, int hdr_rcvd, char *hdr, in __recv_mpa_hdr() argument
380 struct socket *s = cep->sock; in __recv_mpa_hdr()
438 static int erdma_recv_mpa_rr(struct erdma_cep *cep) in erdma_recv_mpa_rr() argument
440 struct mpa_rr *hdr = &cep->mpa.hdr; in erdma_recv_mpa_rr()
441 struct socket *s = cep->sock; in erdma_recv_mpa_rr()
445 if (cep->mpa.bytes_rcvd < sizeof(struct mpa_rr)) { in erdma_recv_mpa_rr()
446 ret = __recv_mpa_hdr(cep, cep->mpa.bytes_rcvd, in erdma_recv_mpa_rr()
447 (char *)&cep->mpa.hdr, in erdma_recv_mpa_rr()
449 cep->mpa.bytes_rcvd += rcvd; in erdma_recv_mpa_rr()
458 if (cep->mpa.bytes_rcvd - sizeof(struct mpa_rr) < in erdma_recv_mpa_rr()
461 cep, cep->mpa.bytes_rcvd - sizeof(struct mpa_rr), in erdma_recv_mpa_rr()
462 (char *)&cep->mpa.ext_data, in erdma_recv_mpa_rr()
464 cep->mpa.bytes_rcvd += rcvd; in erdma_recv_mpa_rr()
470 pd_rcvd = cep->mpa.bytes_rcvd - sizeof(struct mpa_rr) - in erdma_recv_mpa_rr()
481 ret = __recv_mpa_hdr(cep, 0, (char *)&word, sizeof(word), in erdma_recv_mpa_rr()
496 if (!cep->mpa.pdata) { in erdma_recv_mpa_rr()
497 cep->mpa.pdata = kmalloc(pd_len + 4, GFP_KERNEL); in erdma_recv_mpa_rr()
498 if (!cep->mpa.pdata) in erdma_recv_mpa_rr()
502 rcvd = ksock_recv(s, cep->mpa.pdata + pd_rcvd, to_rcv + 4, in erdma_recv_mpa_rr()
510 cep->mpa.bytes_rcvd += rcvd; in erdma_recv_mpa_rr()
524 static int erdma_proc_mpareq(struct erdma_cep *cep) in erdma_proc_mpareq() argument
529 ret = erdma_recv_mpa_rr(cep); in erdma_proc_mpareq()
533 req = &cep->mpa.hdr; in erdma_proc_mpareq()
545 cep->state = ERDMA_EPSTATE_RECVD_MPAREQ; in erdma_proc_mpareq()
548 erdma_cep_get(cep); in erdma_proc_mpareq()
549 ret = erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REQUEST, 0); in erdma_proc_mpareq()
551 erdma_cep_put(cep); in erdma_proc_mpareq()
560 kfree(cep->mpa.pdata); in erdma_proc_mpareq()
561 cep->mpa.pdata = NULL; in erdma_proc_mpareq()
562 erdma_send_mpareqrep(cep, NULL, 0); in erdma_proc_mpareq()
567 static int erdma_proc_mpareply(struct erdma_cep *cep) in erdma_proc_mpareply() argument
570 struct erdma_qp *qp = cep->qp; in erdma_proc_mpareply()
574 ret = erdma_recv_mpa_rr(cep); in erdma_proc_mpareply()
578 erdma_cancel_mpatimer(cep); in erdma_proc_mpareply()
580 rep = &cep->mpa.hdr; in erdma_proc_mpareply()
588 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNRESET); in erdma_proc_mpareply()
595 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNREFUSED); in erdma_proc_mpareply()
600 qp_attrs.irq_size = cep->ird; in erdma_proc_mpareply()
601 qp_attrs.orq_size = cep->ord; in erdma_proc_mpareply()
612 if (__mpa_ext_cc(cep->mpa.ext_data.bits) != qp->attrs.cc) in erdma_proc_mpareply()
623 ret = erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, 0); in erdma_proc_mpareply()
625 cep->state = ERDMA_EPSTATE_RDMA_MODE; in erdma_proc_mpareply()
632 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -EINVAL); in erdma_proc_mpareply()
637 static void erdma_accept_newconn(struct erdma_cep *cep) in erdma_accept_newconn() argument
639 struct socket *s = cep->sock; in erdma_accept_newconn()
644 if (cep->state != ERDMA_EPSTATE_LISTENING) in erdma_accept_newconn()
647 new_cep = erdma_cep_alloc(cep->dev); in erdma_accept_newconn()
663 new_cep->sk_state_change = cep->sk_state_change; in erdma_accept_newconn()
664 new_cep->sk_data_ready = cep->sk_data_ready; in erdma_accept_newconn()
665 new_cep->sk_error_report = cep->sk_error_report; in erdma_accept_newconn()
682 new_cep->listen_cep = cep; in erdma_accept_newconn()
683 erdma_cep_get(cep); in erdma_accept_newconn()
690 erdma_cep_put(cep); in erdma_accept_newconn()
716 static int erdma_newconn_connected(struct erdma_cep *cep) in erdma_newconn_connected() argument
720 cep->mpa.hdr.params.bits = 0; in erdma_newconn_connected()
721 __mpa_rr_set_revision(&cep->mpa.hdr.params.bits, MPA_REVISION_EXT_1); in erdma_newconn_connected()
723 memcpy(cep->mpa.hdr.key, MPA_KEY_REQ, MPA_KEY_SIZE); in erdma_newconn_connected()
724 cep->mpa.ext_data.cookie = cpu_to_be32(cep->qp->attrs.cookie); in erdma_newconn_connected()
725 __mpa_ext_set_cc(&cep->mpa.ext_data.bits, cep->qp->attrs.cc); in erdma_newconn_connected()
727 ret = erdma_send_mpareqrep(cep, cep->private_data, cep->pd_len); in erdma_newconn_connected()
728 cep->state = ERDMA_EPSTATE_AWAIT_MPAREP; in erdma_newconn_connected()
729 cep->mpa.hdr.params.pd_len = 0; in erdma_newconn_connected()
732 ret = erdma_cm_queue_work(cep, ERDMA_CM_WORK_MPATIMEOUT); in erdma_newconn_connected()
740 struct erdma_cep *cep; in erdma_cm_work_handler() local
744 cep = work->cep; in erdma_cm_work_handler()
746 erdma_cep_set_inuse(cep); in erdma_cm_work_handler()
750 erdma_cancel_mpatimer(cep); in erdma_cm_work_handler()
751 if (cep->state == ERDMA_EPSTATE_CONNECTING) { in erdma_cm_work_handler()
752 ret = erdma_newconn_connected(cep); in erdma_cm_work_handler()
754 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, in erdma_cm_work_handler()
761 if (cep->state == ERDMA_EPSTATE_CONNECTING) { in erdma_cm_work_handler()
762 cep->mpa_timer = NULL; in erdma_cm_work_handler()
763 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, in erdma_cm_work_handler()
769 erdma_accept_newconn(cep); in erdma_cm_work_handler()
772 if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ) { in erdma_cm_work_handler()
773 if (cep->listen_cep) { in erdma_cm_work_handler()
774 erdma_cep_set_inuse(cep->listen_cep); in erdma_cm_work_handler()
776 if (cep->listen_cep->state == in erdma_cm_work_handler()
778 ret = erdma_proc_mpareq(cep); in erdma_cm_work_handler()
782 erdma_cep_set_free(cep->listen_cep); in erdma_cm_work_handler()
785 erdma_cep_put(cep->listen_cep); in erdma_cm_work_handler()
786 cep->listen_cep = NULL; in erdma_cm_work_handler()
788 erdma_cep_put(cep); in erdma_cm_work_handler()
791 } else if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) { in erdma_cm_work_handler()
792 ret = erdma_proc_mpareply(cep); in erdma_cm_work_handler()
799 if (cep->cm_id) in erdma_cm_work_handler()
800 erdma_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0); in erdma_cm_work_handler()
804 if (cep->cm_id) { in erdma_cm_work_handler()
805 if (cep->state == ERDMA_EPSTATE_CONNECTING || in erdma_cm_work_handler()
806 cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) { in erdma_cm_work_handler()
810 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, in erdma_cm_work_handler()
812 } else if (cep->state == ERDMA_EPSTATE_RDMA_MODE) { in erdma_cm_work_handler()
817 erdma_cm_upcall(cep, IW_CM_EVENT_DISCONNECT, 0); in erdma_cm_work_handler()
818 erdma_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0); in erdma_cm_work_handler()
820 } else if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ) { in erdma_cm_work_handler()
822 erdma_disassoc_listen_cep(cep); in erdma_cm_work_handler()
823 erdma_cep_put(cep); in erdma_cm_work_handler()
828 cep->mpa_timer = NULL; in erdma_cm_work_handler()
829 if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) { in erdma_cm_work_handler()
835 cep->mpa.hdr.params.pd_len = 0; in erdma_cm_work_handler()
837 if (cep->cm_id) in erdma_cm_work_handler()
838 erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, in erdma_cm_work_handler()
841 } else if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ) { in erdma_cm_work_handler()
843 erdma_disassoc_listen_cep(cep); in erdma_cm_work_handler()
845 erdma_cep_put(cep); in erdma_cm_work_handler()
854 erdma_cancel_mpatimer(cep); in erdma_cm_work_handler()
855 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_cm_work_handler()
856 if (cep->qp) { in erdma_cm_work_handler()
857 struct erdma_qp *qp = cep->qp; in erdma_cm_work_handler()
863 erdma_cep_set_free(cep); in erdma_cm_work_handler()
868 erdma_cep_set_inuse(cep); in erdma_cm_work_handler()
869 cep->qp = NULL; in erdma_cm_work_handler()
873 if (cep->sock) { in erdma_cm_work_handler()
874 erdma_socket_disassoc(cep->sock); in erdma_cm_work_handler()
875 sock_release(cep->sock); in erdma_cm_work_handler()
876 cep->sock = NULL; in erdma_cm_work_handler()
879 if (cep->cm_id) { in erdma_cm_work_handler()
880 cep->cm_id->rem_ref(cep->cm_id); in erdma_cm_work_handler()
881 cep->cm_id = NULL; in erdma_cm_work_handler()
882 if (cep->state != ERDMA_EPSTATE_LISTENING) in erdma_cm_work_handler()
883 erdma_cep_put(cep); in erdma_cm_work_handler()
886 erdma_cep_set_free(cep); in erdma_cm_work_handler()
888 erdma_cep_put(cep); in erdma_cm_work_handler()
891 int erdma_cm_queue_work(struct erdma_cep *cep, enum erdma_work_type type) in erdma_cm_queue_work() argument
893 struct erdma_cm_work *work = erdma_get_work(cep); in erdma_cm_queue_work()
900 work->cep = cep; in erdma_cm_queue_work()
902 erdma_cep_get(cep); in erdma_cm_queue_work()
907 cep->mpa_timer = work; in erdma_cm_queue_work()
909 if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) in erdma_cm_queue_work()
914 cep->mpa_timer = work; in erdma_cm_queue_work()
926 struct erdma_cep *cep; in erdma_cm_llp_data_ready() local
930 cep = sk_to_cep(sk); in erdma_cm_llp_data_ready()
931 if (!cep) in erdma_cm_llp_data_ready()
934 if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ || in erdma_cm_llp_data_ready()
935 cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) in erdma_cm_llp_data_ready()
936 erdma_cm_queue_work(cep, ERDMA_CM_WORK_READ_MPAHDR); in erdma_cm_llp_data_ready()
944 struct erdma_cep *cep = sk_to_cep(sk); in erdma_cm_llp_error_report() local
946 if (cep) in erdma_cm_llp_error_report()
947 cep->sk_error_report(sk); in erdma_cm_llp_error_report()
952 struct erdma_cep *cep; in erdma_cm_llp_state_change() local
957 cep = sk_to_cep(sk); in erdma_cm_llp_state_change()
958 if (!cep) { in erdma_cm_llp_state_change()
962 orig_state_change = cep->sk_state_change; in erdma_cm_llp_state_change()
966 if (cep->state == ERDMA_EPSTATE_CONNECTING) in erdma_cm_llp_state_change()
967 erdma_cm_queue_work(cep, ERDMA_CM_WORK_CONNECTED); in erdma_cm_llp_state_change()
969 erdma_cm_queue_work(cep, ERDMA_CM_WORK_ACCEPT); in erdma_cm_llp_state_change()
973 if (cep->state != ERDMA_EPSTATE_LISTENING) in erdma_cm_llp_state_change()
974 erdma_cm_queue_work(cep, ERDMA_CM_WORK_PEER_CLOSE); in erdma_cm_llp_state_change()
1001 struct erdma_cep *cep = NULL; in erdma_connect() local
1027 cep = erdma_cep_alloc(dev); in erdma_connect()
1028 if (!cep) { in erdma_connect()
1033 erdma_cep_set_inuse(cep); in erdma_connect()
1036 erdma_cep_get(cep); in erdma_connect()
1037 qp->cep = cep; in erdma_connect()
1038 cep->qp = qp; in erdma_connect()
1042 cep->cm_id = id; in erdma_connect()
1050 ret = erdma_cm_alloc_work(cep, 6); in erdma_connect()
1056 cep->ird = params->ird; in erdma_connect()
1057 cep->ord = params->ord; in erdma_connect()
1058 cep->state = ERDMA_EPSTATE_CONNECTING; in erdma_connect()
1060 erdma_cep_socket_assoc(cep, s); in erdma_connect()
1063 cep->pd_len = pd_len; in erdma_connect()
1064 cep->private_data = kmalloc(pd_len, GFP_KERNEL); in erdma_connect()
1065 if (!cep->private_data) { in erdma_connect()
1070 memcpy(cep->private_data, params->private_data, in erdma_connect()
1079 ret = erdma_cm_queue_work(cep, ERDMA_CM_WORK_CONNECTED); in erdma_connect()
1083 ret = erdma_cm_queue_work(cep, ERDMA_CM_WORK_CONNECTTIMEOUT); in erdma_connect()
1088 erdma_cep_set_free(cep); in erdma_connect()
1092 kfree(cep->private_data); in erdma_connect()
1093 cep->private_data = NULL; in erdma_connect()
1094 cep->pd_len = 0; in erdma_connect()
1100 cep->cm_id = NULL; in erdma_connect()
1104 qp->cep = NULL; in erdma_connect()
1105 erdma_cep_put(cep); in erdma_connect()
1106 cep->qp = NULL; in erdma_connect()
1108 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_connect()
1110 erdma_cep_set_free(cep); in erdma_connect()
1113 erdma_cep_put(cep); in erdma_connect()
1127 struct erdma_cep *cep = (struct erdma_cep *)id->provider_data; in erdma_accept() local
1132 erdma_cep_set_inuse(cep); in erdma_accept()
1133 erdma_cep_put(cep); in erdma_accept()
1136 if (cep->mpa.hdr.params.pd_len) { in erdma_accept()
1137 cep->mpa.hdr.params.pd_len = 0; in erdma_accept()
1138 kfree(cep->mpa.pdata); in erdma_accept()
1139 cep->mpa.pdata = NULL; in erdma_accept()
1141 erdma_cancel_mpatimer(cep); in erdma_accept()
1143 if (cep->state != ERDMA_EPSTATE_RECVD_MPAREQ) { in erdma_accept()
1144 erdma_cep_set_free(cep); in erdma_accept()
1145 erdma_cep_put(cep); in erdma_accept()
1175 cep->ird = params->ird; in erdma_accept()
1176 cep->ord = params->ord; in erdma_accept()
1178 cep->cm_id = id; in erdma_accept()
1188 erdma_cep_get(cep); in erdma_accept()
1189 qp->cep = cep; in erdma_accept()
1190 cep->qp = qp; in erdma_accept()
1192 cep->state = ERDMA_EPSTATE_RDMA_MODE; in erdma_accept()
1197 if (qp->attrs.cc != __mpa_ext_cc(cep->mpa.ext_data.bits)) in erdma_accept()
1212 cep->mpa.ext_data.bits = 0; in erdma_accept()
1213 __mpa_ext_set_cc(&cep->mpa.ext_data.bits, qp->attrs.cc); in erdma_accept()
1214 cep->mpa.ext_data.cookie = cpu_to_be32(cep->qp->attrs.cookie); in erdma_accept()
1216 ret = erdma_send_mpareqrep(cep, params->private_data, in erdma_accept()
1219 ret = erdma_cm_upcall(cep, IW_CM_EVENT_ESTABLISHED, 0); in erdma_accept()
1223 erdma_cep_set_free(cep); in erdma_accept()
1229 erdma_socket_disassoc(cep->sock); in erdma_accept()
1230 sock_release(cep->sock); in erdma_accept()
1231 cep->sock = NULL; in erdma_accept()
1233 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_accept()
1235 if (cep->cm_id) { in erdma_accept()
1236 cep->cm_id->rem_ref(id); in erdma_accept()
1237 cep->cm_id = NULL; in erdma_accept()
1240 if (qp->cep) { in erdma_accept()
1241 erdma_cep_put(cep); in erdma_accept()
1242 qp->cep = NULL; in erdma_accept()
1245 cep->qp = NULL; in erdma_accept()
1248 erdma_cep_set_free(cep); in erdma_accept()
1249 erdma_cep_put(cep); in erdma_accept()
1256 struct erdma_cep *cep = (struct erdma_cep *)id->provider_data; in erdma_reject() local
1258 erdma_cep_set_inuse(cep); in erdma_reject()
1259 erdma_cep_put(cep); in erdma_reject()
1261 erdma_cancel_mpatimer(cep); in erdma_reject()
1263 if (cep->state != ERDMA_EPSTATE_RECVD_MPAREQ) { in erdma_reject()
1264 erdma_cep_set_free(cep); in erdma_reject()
1265 erdma_cep_put(cep); in erdma_reject()
1270 if (__mpa_rr_revision(cep->mpa.hdr.params.bits) == MPA_REVISION_EXT_1) { in erdma_reject()
1271 cep->mpa.hdr.params.bits |= MPA_RR_FLAG_REJECT; /* reject */ in erdma_reject()
1272 erdma_send_mpareqrep(cep, pdata, plen); in erdma_reject()
1275 erdma_socket_disassoc(cep->sock); in erdma_reject()
1276 sock_release(cep->sock); in erdma_reject()
1277 cep->sock = NULL; in erdma_reject()
1279 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_reject()
1281 erdma_cep_set_free(cep); in erdma_reject()
1282 erdma_cep_put(cep); in erdma_reject()
1290 struct erdma_cep *cep = NULL; in erdma_create_listen() local
1314 cep = erdma_cep_alloc(dev); in erdma_create_listen()
1315 if (!cep) { in erdma_create_listen()
1319 erdma_cep_socket_assoc(cep, s); in erdma_create_listen()
1321 ret = erdma_cm_alloc_work(cep, backlog); in erdma_create_listen()
1329 cep->cm_id = id; in erdma_create_listen()
1342 list_add_tail(&cep->listenq, (struct list_head *)id->provider_data); in erdma_create_listen()
1343 cep->state = ERDMA_EPSTATE_LISTENING; in erdma_create_listen()
1348 if (cep) { in erdma_create_listen()
1349 erdma_cep_set_inuse(cep); in erdma_create_listen()
1351 if (cep->cm_id) { in erdma_create_listen()
1352 cep->cm_id->rem_ref(cep->cm_id); in erdma_create_listen()
1353 cep->cm_id = NULL; in erdma_create_listen()
1355 cep->sock = NULL; in erdma_create_listen()
1357 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_create_listen()
1359 erdma_cep_set_free(cep); in erdma_create_listen()
1360 erdma_cep_put(cep); in erdma_create_listen()
1375 struct erdma_cep *cep = in erdma_drop_listeners() local
1380 erdma_cep_set_inuse(cep); in erdma_drop_listeners()
1382 if (cep->cm_id) { in erdma_drop_listeners()
1383 cep->cm_id->rem_ref(cep->cm_id); in erdma_drop_listeners()
1384 cep->cm_id = NULL; in erdma_drop_listeners()
1386 if (cep->sock) { in erdma_drop_listeners()
1387 erdma_socket_disassoc(cep->sock); in erdma_drop_listeners()
1388 sock_release(cep->sock); in erdma_drop_listeners()
1389 cep->sock = NULL; in erdma_drop_listeners()
1391 cep->state = ERDMA_EPSTATE_CLOSED; in erdma_drop_listeners()
1392 erdma_cep_set_free(cep); in erdma_drop_listeners()
1393 erdma_cep_put(cep); in erdma_drop_listeners()