Lines Matching refs:ep

111 static void connect_reply_upcall(struct iwch_ep *ep, int status);
113 static void start_ep_timer(struct iwch_ep *ep) in start_ep_timer() argument
115 PDBG("%s ep %p\n", __func__, ep); in start_ep_timer()
116 if (timer_pending(&ep->timer)) { in start_ep_timer()
117 PDBG("%s stopped / restarted timer ep %p\n", __func__, ep); in start_ep_timer()
118 del_timer_sync(&ep->timer); in start_ep_timer()
120 get_ep(&ep->com); in start_ep_timer()
121 ep->timer.expires = jiffies + ep_timeout_secs * HZ; in start_ep_timer()
122 ep->timer.data = (unsigned long)ep; in start_ep_timer()
123 ep->timer.function = ep_timeout; in start_ep_timer()
124 add_timer(&ep->timer); in start_ep_timer()
127 static void stop_ep_timer(struct iwch_ep *ep) in stop_ep_timer() argument
129 PDBG("%s ep %p\n", __func__, ep); in stop_ep_timer()
130 if (!timer_pending(&ep->timer)) { in stop_ep_timer()
132 __func__, ep, ep->com.state); in stop_ep_timer()
135 del_timer_sync(&ep->timer); in stop_ep_timer()
136 put_ep(&ep->com); in stop_ep_timer()
186 int iwch_quiesce_tid(struct iwch_ep *ep) in iwch_quiesce_tid() argument
195 req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); in iwch_quiesce_tid()
196 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, ep->hwtid)); in iwch_quiesce_tid()
204 return iwch_cxgb3_ofld_send(ep->com.tdev, skb); in iwch_quiesce_tid()
207 int iwch_resume_tid(struct iwch_ep *ep) in iwch_resume_tid() argument
216 req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); in iwch_resume_tid()
217 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, ep->hwtid)); in iwch_resume_tid()
225 return iwch_cxgb3_ofld_send(ep->com.tdev, skb); in iwch_resume_tid()
228 static void set_emss(struct iwch_ep *ep, u16 opt) in set_emss() argument
230 PDBG("%s ep %p opt %u\n", __func__, ep, opt); in set_emss()
231 ep->emss = T3C_DATA(ep->com.tdev)->mtus[G_TCPOPT_MSS(opt)] - 40; in set_emss()
233 ep->emss -= 12; in set_emss()
234 if (ep->emss < 128) in set_emss()
235 ep->emss = 128; in set_emss()
236 PDBG("emss=%d\n", ep->emss); in set_emss()
282 struct iwch_ep *ep; in __free_ep() local
283 ep = container_of(container_of(kref, struct iwch_ep_common, kref), in __free_ep()
285 PDBG("%s ep %p state %s\n", __func__, ep, states[state_read(&ep->com)]); in __free_ep()
286 if (test_bit(RELEASE_RESOURCES, &ep->com.flags)) { in __free_ep()
287 cxgb3_remove_tid(ep->com.tdev, (void *)ep, ep->hwtid); in __free_ep()
288 dst_release(ep->dst); in __free_ep()
289 l2t_release(ep->com.tdev, ep->l2t); in __free_ep()
291 kfree(ep); in __free_ep()
294 static void release_ep_resources(struct iwch_ep *ep) in release_ep_resources() argument
296 PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid); in release_ep_resources()
297 set_bit(RELEASE_RESOURCES, &ep->com.flags); in release_ep_resources()
298 put_ep(&ep->com); in release_ep_resources()
387 static int send_halfclose(struct iwch_ep *ep, gfp_t gfp) in send_halfclose() argument
392 PDBG("%s ep %p\n", __func__, ep); in send_halfclose()
402 req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); in send_halfclose()
403 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_CON_REQ, ep->hwtid)); in send_halfclose()
404 return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in send_halfclose()
407 static int send_abort(struct iwch_ep *ep, struct sk_buff *skb, gfp_t gfp) in send_abort() argument
411 PDBG("%s ep %p\n", __func__, ep); in send_abort()
423 req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); in send_abort()
424 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, ep->hwtid)); in send_abort()
426 return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in send_abort()
429 static int send_connect(struct iwch_ep *ep) in send_connect() argument
437 PDBG("%s ep %p\n", __func__, ep); in send_connect()
445 mtu_idx = find_best_mtu(T3C_DATA(ep->com.tdev), dst_mtu(ep->dst)); in send_connect()
453 V_L2T_IDX(ep->l2t->idx) | V_TX_CHANNEL(ep->l2t->smt_idx); in send_connect()
454 opt0l = V_TOS((ep->tos >> 2) & M_TOS) | V_RCV_BUFSIZ(rcv_win>>10); in send_connect()
462 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, ep->atid)); in send_connect()
463 req->local_port = ep->com.local_addr.sin_port; in send_connect()
464 req->peer_port = ep->com.remote_addr.sin_port; in send_connect()
465 req->local_ip = ep->com.local_addr.sin_addr.s_addr; in send_connect()
466 req->peer_ip = ep->com.remote_addr.sin_addr.s_addr; in send_connect()
471 return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in send_connect()
474 static void send_mpa_req(struct iwch_ep *ep, struct sk_buff *skb) in send_mpa_req() argument
481 PDBG("%s ep %p pd_len %d\n", __func__, ep, ep->plen); in send_mpa_req()
485 mpalen = sizeof(*mpa) + ep->plen; in send_mpa_req()
490 connect_reply_upcall(ep, -ENOMEM); in send_mpa_req()
503 mpa->private_data_size = htons(ep->plen); in send_mpa_req()
506 if (ep->plen) in send_mpa_req()
507 memcpy(mpa->private_data, ep->mpa_pkt + sizeof(*mpa), ep->plen); in send_mpa_req()
520 req->wr_lo = htonl(V_WR_TID(ep->hwtid)); in send_mpa_req()
522 req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | in send_mpa_req()
525 req->sndseq = htonl(ep->snd_seq); in send_mpa_req()
526 BUG_ON(ep->mpa_skb); in send_mpa_req()
527 ep->mpa_skb = skb; in send_mpa_req()
528 iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in send_mpa_req()
529 start_ep_timer(ep); in send_mpa_req()
530 state_set(&ep->com, MPA_REQ_SENT); in send_mpa_req()
534 static int send_mpa_reject(struct iwch_ep *ep, const void *pdata, u8 plen) in send_mpa_reject() argument
541 PDBG("%s ep %p plen %d\n", __func__, ep, plen); in send_mpa_reject()
571 req->wr_lo = htonl(V_WR_TID(ep->hwtid)); in send_mpa_reject()
573 req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | in send_mpa_reject()
576 req->sndseq = htonl(ep->snd_seq); in send_mpa_reject()
577 BUG_ON(ep->mpa_skb); in send_mpa_reject()
578 ep->mpa_skb = skb; in send_mpa_reject()
579 return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in send_mpa_reject()
582 static int send_mpa_reply(struct iwch_ep *ep, const void *pdata, u8 plen) in send_mpa_reply() argument
590 PDBG("%s ep %p plen %d\n", __func__, ep, plen); in send_mpa_reply()
604 mpa->flags = (ep->mpa_attr.crc_enabled ? MPA_CRC : 0) | in send_mpa_reply()
622 req->wr_lo = htonl(V_WR_TID(ep->hwtid)); in send_mpa_reply()
624 req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | in send_mpa_reply()
627 req->sndseq = htonl(ep->snd_seq); in send_mpa_reply()
628 ep->mpa_skb = skb; in send_mpa_reply()
629 state_set(&ep->com, MPA_REP_SENT); in send_mpa_reply()
630 return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in send_mpa_reply()
635 struct iwch_ep *ep = ctx; in act_establish() local
639 PDBG("%s ep %p tid %d\n", __func__, ep, tid); in act_establish()
641 dst_confirm(ep->dst); in act_establish()
644 ep->hwtid = tid; in act_establish()
645 cxgb3_insert_tid(ep->com.tdev, &t3c_client, ep, tid); in act_establish()
647 ep->snd_seq = ntohl(req->snd_isn); in act_establish()
648 ep->rcv_seq = ntohl(req->rcv_isn); in act_establish()
650 set_emss(ep, ntohs(req->tcp_opt)); in act_establish()
653 cxgb3_free_atid(ep->com.tdev, ep->atid); in act_establish()
656 send_mpa_req(ep, skb); in act_establish()
661 static void abort_connection(struct iwch_ep *ep, struct sk_buff *skb, gfp_t gfp) in abort_connection() argument
663 PDBG("%s ep %p\n", __FILE__, ep); in abort_connection()
664 state_set(&ep->com, ABORTING); in abort_connection()
665 send_abort(ep, skb, gfp); in abort_connection()
668 static void close_complete_upcall(struct iwch_ep *ep) in close_complete_upcall() argument
672 PDBG("%s ep %p\n", __func__, ep); in close_complete_upcall()
675 if (ep->com.cm_id) { in close_complete_upcall()
677 ep, ep->com.cm_id, ep->hwtid); in close_complete_upcall()
678 ep->com.cm_id->event_handler(ep->com.cm_id, &event); in close_complete_upcall()
679 ep->com.cm_id->rem_ref(ep->com.cm_id); in close_complete_upcall()
680 ep->com.cm_id = NULL; in close_complete_upcall()
681 ep->com.qp = NULL; in close_complete_upcall()
685 static void peer_close_upcall(struct iwch_ep *ep) in peer_close_upcall() argument
689 PDBG("%s ep %p\n", __func__, ep); in peer_close_upcall()
692 if (ep->com.cm_id) { in peer_close_upcall()
694 ep, ep->com.cm_id, ep->hwtid); in peer_close_upcall()
695 ep->com.cm_id->event_handler(ep->com.cm_id, &event); in peer_close_upcall()
699 static void peer_abort_upcall(struct iwch_ep *ep) in peer_abort_upcall() argument
703 PDBG("%s ep %p\n", __func__, ep); in peer_abort_upcall()
707 if (ep->com.cm_id) { in peer_abort_upcall()
708 PDBG("abort delivered ep %p cm_id %p tid %d\n", ep, in peer_abort_upcall()
709 ep->com.cm_id, ep->hwtid); in peer_abort_upcall()
710 ep->com.cm_id->event_handler(ep->com.cm_id, &event); in peer_abort_upcall()
711 ep->com.cm_id->rem_ref(ep->com.cm_id); in peer_abort_upcall()
712 ep->com.cm_id = NULL; in peer_abort_upcall()
713 ep->com.qp = NULL; in peer_abort_upcall()
717 static void connect_reply_upcall(struct iwch_ep *ep, int status) in connect_reply_upcall() argument
721 PDBG("%s ep %p status %d\n", __func__, ep, status); in connect_reply_upcall()
725 memcpy(&event.local_addr, &ep->com.local_addr, in connect_reply_upcall()
726 sizeof(ep->com.local_addr)); in connect_reply_upcall()
727 memcpy(&event.remote_addr, &ep->com.remote_addr, in connect_reply_upcall()
728 sizeof(ep->com.remote_addr)); in connect_reply_upcall()
731 event.private_data_len = ep->plen; in connect_reply_upcall()
732 event.private_data = ep->mpa_pkt + sizeof(struct mpa_message); in connect_reply_upcall()
734 if (ep->com.cm_id) { in connect_reply_upcall()
735 PDBG("%s ep %p tid %d status %d\n", __func__, ep, in connect_reply_upcall()
736 ep->hwtid, status); in connect_reply_upcall()
737 ep->com.cm_id->event_handler(ep->com.cm_id, &event); in connect_reply_upcall()
740 ep->com.cm_id->rem_ref(ep->com.cm_id); in connect_reply_upcall()
741 ep->com.cm_id = NULL; in connect_reply_upcall()
742 ep->com.qp = NULL; in connect_reply_upcall()
746 static void connect_request_upcall(struct iwch_ep *ep) in connect_request_upcall() argument
750 PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid); in connect_request_upcall()
753 memcpy(&event.local_addr, &ep->com.local_addr, in connect_request_upcall()
754 sizeof(ep->com.local_addr)); in connect_request_upcall()
755 memcpy(&event.remote_addr, &ep->com.remote_addr, in connect_request_upcall()
756 sizeof(ep->com.local_addr)); in connect_request_upcall()
757 event.private_data_len = ep->plen; in connect_request_upcall()
758 event.private_data = ep->mpa_pkt + sizeof(struct mpa_message); in connect_request_upcall()
759 event.provider_data = ep; in connect_request_upcall()
765 if (state_read(&ep->parent_ep->com) != DEAD) { in connect_request_upcall()
766 get_ep(&ep->com); in connect_request_upcall()
767 ep->parent_ep->com.cm_id->event_handler( in connect_request_upcall()
768 ep->parent_ep->com.cm_id, in connect_request_upcall()
771 put_ep(&ep->parent_ep->com); in connect_request_upcall()
772 ep->parent_ep = NULL; in connect_request_upcall()
775 static void established_upcall(struct iwch_ep *ep) in established_upcall() argument
779 PDBG("%s ep %p\n", __func__, ep); in established_upcall()
787 if (ep->com.cm_id) { in established_upcall()
788 PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid); in established_upcall()
789 ep->com.cm_id->event_handler(ep->com.cm_id, &event); in established_upcall()
793 static int update_rx_credits(struct iwch_ep *ep, u32 credits) in update_rx_credits() argument
798 PDBG("%s ep %p credits %u\n", __func__, ep, credits); in update_rx_credits()
807 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, ep->hwtid)); in update_rx_credits()
810 iwch_cxgb3_ofld_send(ep->com.tdev, skb); in update_rx_credits()
814 static void process_mpa_reply(struct iwch_ep *ep, struct sk_buff *skb) in process_mpa_reply() argument
822 PDBG("%s ep %p\n", __func__, ep); in process_mpa_reply()
829 stop_ep_timer(ep); in process_mpa_reply()
830 if (state_read(&ep->com) != MPA_REQ_SENT) in process_mpa_reply()
837 if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) { in process_mpa_reply()
845 skb_copy_from_linear_data(skb, &(ep->mpa_pkt[ep->mpa_pkt_len]), in process_mpa_reply()
847 ep->mpa_pkt_len += skb->len; in process_mpa_reply()
852 if (ep->mpa_pkt_len < sizeof(*mpa)) in process_mpa_reply()
854 mpa = (struct mpa_message *) ep->mpa_pkt; in process_mpa_reply()
879 if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) { in process_mpa_reply()
884 ep->plen = (u8) plen; in process_mpa_reply()
890 if (ep->mpa_pkt_len < (sizeof(*mpa) + plen)) in process_mpa_reply()
903 state_set(&ep->com, FPDU_MODE); in process_mpa_reply()
904 ep->mpa_attr.initiator = 1; in process_mpa_reply()
905 ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0; in process_mpa_reply()
906 ep->mpa_attr.recv_marker_enabled = markers_enabled; in process_mpa_reply()
907 ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0; in process_mpa_reply()
908 ep->mpa_attr.version = mpa_rev; in process_mpa_reply()
911 ep->mpa_attr.crc_enabled, ep->mpa_attr.recv_marker_enabled, in process_mpa_reply()
912 ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version); in process_mpa_reply()
914 attrs.mpa_attr = ep->mpa_attr; in process_mpa_reply()
915 attrs.max_ird = ep->ird; in process_mpa_reply()
916 attrs.max_ord = ep->ord; in process_mpa_reply()
917 attrs.llp_stream_handle = ep; in process_mpa_reply()
925 err = iwch_modify_qp(ep->com.qp->rhp, in process_mpa_reply()
926 ep->com.qp, mask, &attrs, 1); in process_mpa_reply()
930 if (peer2peer && iwch_rqes_posted(ep->com.qp) == 0) { in process_mpa_reply()
931 iwch_post_zb_read(ep); in process_mpa_reply()
936 abort_connection(ep, skb, GFP_KERNEL); in process_mpa_reply()
938 connect_reply_upcall(ep, err); in process_mpa_reply()
942 static void process_mpa_request(struct iwch_ep *ep, struct sk_buff *skb) in process_mpa_request() argument
947 PDBG("%s ep %p\n", __func__, ep); in process_mpa_request()
954 stop_ep_timer(ep); in process_mpa_request()
955 if (state_read(&ep->com) != MPA_REQ_WAIT) in process_mpa_request()
962 if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) { in process_mpa_request()
963 abort_connection(ep, skb, GFP_KERNEL); in process_mpa_request()
972 skb_copy_from_linear_data(skb, &(ep->mpa_pkt[ep->mpa_pkt_len]), in process_mpa_request()
974 ep->mpa_pkt_len += skb->len; in process_mpa_request()
980 if (ep->mpa_pkt_len < sizeof(*mpa)) in process_mpa_request()
983 mpa = (struct mpa_message *) ep->mpa_pkt; in process_mpa_request()
989 abort_connection(ep, skb, GFP_KERNEL); in process_mpa_request()
994 abort_connection(ep, skb, GFP_KERNEL); in process_mpa_request()
1004 abort_connection(ep, skb, GFP_KERNEL); in process_mpa_request()
1011 if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) { in process_mpa_request()
1012 abort_connection(ep, skb, GFP_KERNEL); in process_mpa_request()
1015 ep->plen = (u8) plen; in process_mpa_request()
1020 if (ep->mpa_pkt_len < (sizeof(*mpa) + plen)) in process_mpa_request()
1027 ep->mpa_attr.initiator = 0; in process_mpa_request()
1028 ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0; in process_mpa_request()
1029 ep->mpa_attr.recv_marker_enabled = markers_enabled; in process_mpa_request()
1030 ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0; in process_mpa_request()
1031 ep->mpa_attr.version = mpa_rev; in process_mpa_request()
1034 ep->mpa_attr.crc_enabled, ep->mpa_attr.recv_marker_enabled, in process_mpa_request()
1035 ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version); in process_mpa_request()
1037 state_set(&ep->com, MPA_REQ_RCVD); in process_mpa_request()
1040 connect_request_upcall(ep); in process_mpa_request()
1046 struct iwch_ep *ep = ctx; in rx_data() local
1050 PDBG("%s ep %p dlen %u\n", __func__, ep, dlen); in rx_data()
1055 ep->rcv_seq += dlen; in rx_data()
1056 BUG_ON(ep->rcv_seq != (ntohl(hdr->seq) + dlen)); in rx_data()
1058 switch (state_read(&ep->com)) { in rx_data()
1060 process_mpa_reply(ep, skb); in rx_data()
1063 process_mpa_request(ep, skb); in rx_data()
1070 __func__, ep, state_read(&ep->com), ep->hwtid); in rx_data()
1080 update_rx_credits(ep, dlen); in rx_data()
1092 struct iwch_ep *ep = ctx; in tx_ack() local
1098 PDBG("%s ep %p credits %u\n", __func__, ep, credits); in tx_ack()
1102 __func__, ep, state_read(&ep->com)); in tx_ack()
1106 spin_lock_irqsave(&ep->com.lock, flags); in tx_ack()
1108 dst_confirm(ep->dst); in tx_ack()
1109 if (!ep->mpa_skb) { in tx_ack()
1111 __func__, ep, ep->com.state); in tx_ack()
1112 if (ep->mpa_attr.initiator) { in tx_ack()
1114 __func__, ep, ep->com.state); in tx_ack()
1115 if (peer2peer && ep->com.state == FPDU_MODE) in tx_ack()
1119 __func__, ep, ep->com.state); in tx_ack()
1120 if (ep->com.state == MPA_REQ_RCVD) { in tx_ack()
1121 ep->com.rpl_done = 1; in tx_ack()
1122 wake_up(&ep->com.waitq); in tx_ack()
1127 __func__, ep, ep->com.state); in tx_ack()
1128 kfree_skb(ep->mpa_skb); in tx_ack()
1129 ep->mpa_skb = NULL; in tx_ack()
1131 spin_unlock_irqrestore(&ep->com.lock, flags); in tx_ack()
1133 iwch_post_zb_read(ep); in tx_ack()
1139 struct iwch_ep *ep = ctx; in abort_rpl() local
1143 PDBG("%s ep %p\n", __func__, ep); in abort_rpl()
1144 BUG_ON(!ep); in abort_rpl()
1150 if (!test_and_set_bit(ABORT_REQ_IN_PROGRESS, &ep->com.flags)) { in abort_rpl()
1154 spin_lock_irqsave(&ep->com.lock, flags); in abort_rpl()
1155 switch (ep->com.state) { in abort_rpl()
1157 close_complete_upcall(ep); in abort_rpl()
1158 __state_set(&ep->com, DEAD); in abort_rpl()
1163 __func__, ep, ep->com.state); in abort_rpl()
1166 spin_unlock_irqrestore(&ep->com.lock, flags); in abort_rpl()
1169 release_ep_resources(ep); in abort_rpl()
1184 struct iwch_ep *ep = ctx; in act_open_rpl() local
1187 PDBG("%s ep %p status %u errno %d\n", __func__, ep, rpl->status, in act_open_rpl()
1189 connect_reply_upcall(ep, status2errno(rpl->status)); in act_open_rpl()
1190 state_set(&ep->com, DEAD); in act_open_rpl()
1191 if (ep->com.tdev->type != T3A && act_open_has_tid(rpl->status)) in act_open_rpl()
1192 release_tid(ep->com.tdev, GET_TID(rpl), NULL); in act_open_rpl()
1193 cxgb3_free_atid(ep->com.tdev, ep->atid); in act_open_rpl()
1194 dst_release(ep->dst); in act_open_rpl()
1195 l2t_release(ep->com.tdev, ep->l2t); in act_open_rpl()
1196 put_ep(&ep->com); in act_open_rpl()
1200 static int listen_start(struct iwch_listen_ep *ep) in listen_start() argument
1205 PDBG("%s ep %p\n", __func__, ep); in listen_start()
1214 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, ep->stid)); in listen_start()
1215 req->local_port = ep->com.local_addr.sin_port; in listen_start()
1216 req->local_ip = ep->com.local_addr.sin_addr.s_addr; in listen_start()
1225 return iwch_cxgb3_ofld_send(ep->com.tdev, skb); in listen_start()
1230 struct iwch_listen_ep *ep = ctx; in pass_open_rpl() local
1233 PDBG("%s ep %p status %d error %d\n", __func__, ep, in pass_open_rpl()
1235 ep->com.rpl_err = status2errno(rpl->status); in pass_open_rpl()
1236 ep->com.rpl_done = 1; in pass_open_rpl()
1237 wake_up(&ep->com.waitq); in pass_open_rpl()
1242 static int listen_stop(struct iwch_listen_ep *ep) in listen_stop() argument
1247 PDBG("%s ep %p\n", __func__, ep); in listen_stop()
1256 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid)); in listen_stop()
1258 return iwch_cxgb3_ofld_send(ep->com.tdev, skb); in listen_stop()
1264 struct iwch_listen_ep *ep = ctx; in close_listsrv_rpl() local
1267 PDBG("%s ep %p\n", __func__, ep); in close_listsrv_rpl()
1268 ep->com.rpl_err = status2errno(rpl->status); in close_listsrv_rpl()
1269 ep->com.rpl_done = 1; in close_listsrv_rpl()
1270 wake_up(&ep->com.waitq); in close_listsrv_rpl()
1274 static void accept_cr(struct iwch_ep *ep, __be32 peer_ip, struct sk_buff *skb) in accept_cr() argument
1281 PDBG("%s ep %p\n", __func__, ep); in accept_cr()
1285 mtu_idx = find_best_mtu(T3C_DATA(ep->com.tdev), dst_mtu(ep->dst)); in accept_cr()
1293 V_L2T_IDX(ep->l2t->idx) | V_TX_CHANNEL(ep->l2t->smt_idx); in accept_cr()
1294 opt0l = V_TOS((ep->tos >> 2) & M_TOS) | V_RCV_BUFSIZ(rcv_win>>10); in accept_cr()
1300 OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_RPL, ep->hwtid)); in accept_cr()
1307 iwch_l2t_send(ep->com.tdev, skb, ep->l2t); in accept_cr()
1423 struct iwch_ep *ep = ctx; in pass_establish() local
1426 PDBG("%s ep %p\n", __func__, ep); in pass_establish()
1427 ep->snd_seq = ntohl(req->snd_isn); in pass_establish()
1428 ep->rcv_seq = ntohl(req->rcv_isn); in pass_establish()
1430 set_emss(ep, ntohs(req->tcp_opt)); in pass_establish()
1432 dst_confirm(ep->dst); in pass_establish()
1433 state_set(&ep->com, MPA_REQ_WAIT); in pass_establish()
1434 start_ep_timer(ep); in pass_establish()
1441 struct iwch_ep *ep = ctx; in peer_close() local
1447 PDBG("%s ep %p\n", __func__, ep); in peer_close()
1448 dst_confirm(ep->dst); in peer_close()
1450 spin_lock_irqsave(&ep->com.lock, flags); in peer_close()
1451 switch (ep->com.state) { in peer_close()
1453 __state_set(&ep->com, CLOSING); in peer_close()
1456 __state_set(&ep->com, CLOSING); in peer_close()
1457 connect_reply_upcall(ep, -ECONNRESET); in peer_close()
1467 __state_set(&ep->com, CLOSING); in peer_close()
1468 ep->com.rpl_done = 1; in peer_close()
1469 ep->com.rpl_err = -ECONNRESET; in peer_close()
1470 PDBG("waking up ep %p\n", ep); in peer_close()
1471 wake_up(&ep->com.waitq); in peer_close()
1474 __state_set(&ep->com, CLOSING); in peer_close()
1475 ep->com.rpl_done = 1; in peer_close()
1476 ep->com.rpl_err = -ECONNRESET; in peer_close()
1477 PDBG("waking up ep %p\n", ep); in peer_close()
1478 wake_up(&ep->com.waitq); in peer_close()
1481 start_ep_timer(ep); in peer_close()
1482 __state_set(&ep->com, CLOSING); in peer_close()
1484 iwch_modify_qp(ep->com.qp->rhp, ep->com.qp, in peer_close()
1486 peer_close_upcall(ep); in peer_close()
1492 __state_set(&ep->com, MORIBUND); in peer_close()
1496 stop_ep_timer(ep); in peer_close()
1497 if (ep->com.cm_id && ep->com.qp) { in peer_close()
1499 iwch_modify_qp(ep->com.qp->rhp, ep->com.qp, in peer_close()
1502 close_complete_upcall(ep); in peer_close()
1503 __state_set(&ep->com, DEAD); in peer_close()
1513 spin_unlock_irqrestore(&ep->com.lock, flags); in peer_close()
1515 iwch_ep_disconnect(ep, 0, GFP_KERNEL); in peer_close()
1517 release_ep_resources(ep); in peer_close()
1533 struct iwch_ep *ep = ctx; in peer_abort() local
1542 PDBG("%s neg_adv_abort ep %p tid %d\n", __func__, ep, in peer_abort()
1543 ep->hwtid); in peer_abort()
1544 t3_l2t_send_event(ep->com.tdev, ep->l2t); in peer_abort()
1552 if (!test_and_set_bit(PEER_ABORT_IN_PROGRESS, &ep->com.flags)) { in peer_abort()
1556 spin_lock_irqsave(&ep->com.lock, flags); in peer_abort()
1557 PDBG("%s ep %p state %u\n", __func__, ep, ep->com.state); in peer_abort()
1558 switch (ep->com.state) { in peer_abort()
1562 stop_ep_timer(ep); in peer_abort()
1565 stop_ep_timer(ep); in peer_abort()
1566 connect_reply_upcall(ep, -ECONNRESET); in peer_abort()
1569 ep->com.rpl_done = 1; in peer_abort()
1570 ep->com.rpl_err = -ECONNRESET; in peer_abort()
1571 PDBG("waking up ep %p\n", ep); in peer_abort()
1572 wake_up(&ep->com.waitq); in peer_abort()
1582 ep->com.rpl_done = 1; in peer_abort()
1583 ep->com.rpl_err = -ECONNRESET; in peer_abort()
1584 PDBG("waking up ep %p\n", ep); in peer_abort()
1585 wake_up(&ep->com.waitq); in peer_abort()
1589 stop_ep_timer(ep); in peer_abort()
1592 if (ep->com.cm_id && ep->com.qp) { in peer_abort()
1594 ret = iwch_modify_qp(ep->com.qp->rhp, in peer_abort()
1595 ep->com.qp, IWCH_QP_ATTR_NEXT_STATE, in peer_abort()
1602 peer_abort_upcall(ep); in peer_abort()
1608 spin_unlock_irqrestore(&ep->com.lock, flags); in peer_abort()
1614 dst_confirm(ep->dst); in peer_abort()
1615 if (ep->com.state != ABORTING) { in peer_abort()
1616 __state_set(&ep->com, DEAD); in peer_abort()
1619 spin_unlock_irqrestore(&ep->com.lock, flags); in peer_abort()
1631 rpl->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); in peer_abort()
1632 OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, ep->hwtid)); in peer_abort()
1634 iwch_cxgb3_ofld_send(ep->com.tdev, rpl_skb); in peer_abort()
1637 release_ep_resources(ep); in peer_abort()
1643 struct iwch_ep *ep = ctx; in close_con_rpl() local
1648 PDBG("%s ep %p\n", __func__, ep); in close_con_rpl()
1649 BUG_ON(!ep); in close_con_rpl()
1652 spin_lock_irqsave(&ep->com.lock, flags); in close_con_rpl()
1653 switch (ep->com.state) { in close_con_rpl()
1655 __state_set(&ep->com, MORIBUND); in close_con_rpl()
1658 stop_ep_timer(ep); in close_con_rpl()
1659 if ((ep->com.cm_id) && (ep->com.qp)) { in close_con_rpl()
1661 iwch_modify_qp(ep->com.qp->rhp, in close_con_rpl()
1662 ep->com.qp, in close_con_rpl()
1666 close_complete_upcall(ep); in close_con_rpl()
1667 __state_set(&ep->com, DEAD); in close_con_rpl()
1677 spin_unlock_irqrestore(&ep->com.lock, flags); in close_con_rpl()
1679 release_ep_resources(ep); in close_con_rpl()
1697 struct iwch_ep *ep = ctx; in terminate() local
1699 if (state_read(&ep->com) != FPDU_MODE) in terminate()
1702 PDBG("%s ep %p\n", __func__, ep); in terminate()
1705 skb_copy_from_linear_data(skb, ep->com.qp->attr.terminate_buffer, in terminate()
1707 ep->com.qp->attr.terminate_msg_len = skb->len; in terminate()
1708 ep->com.qp->attr.is_terminate_local = 0; in terminate()
1715 struct iwch_ep *ep = ctx; in ec_status() local
1717 PDBG("%s ep %p tid %u status %d\n", __func__, ep, ep->hwtid, in ec_status()
1723 __func__, ep->hwtid); in ec_status()
1724 stop_ep_timer(ep); in ec_status()
1726 iwch_modify_qp(ep->com.qp->rhp, in ec_status()
1727 ep->com.qp, IWCH_QP_ATTR_NEXT_STATE, in ec_status()
1729 abort_connection(ep, NULL, GFP_KERNEL); in ec_status()
1736 struct iwch_ep *ep = (struct iwch_ep *)arg; in ep_timeout() local
1741 spin_lock_irqsave(&ep->com.lock, flags); in ep_timeout()
1742 PDBG("%s ep %p tid %u state %d\n", __func__, ep, ep->hwtid, in ep_timeout()
1743 ep->com.state); in ep_timeout()
1744 switch (ep->com.state) { in ep_timeout()
1746 __state_set(&ep->com, ABORTING); in ep_timeout()
1747 connect_reply_upcall(ep, -ETIMEDOUT); in ep_timeout()
1750 __state_set(&ep->com, ABORTING); in ep_timeout()
1754 if (ep->com.cm_id && ep->com.qp) { in ep_timeout()
1756 iwch_modify_qp(ep->com.qp->rhp, in ep_timeout()
1757 ep->com.qp, IWCH_QP_ATTR_NEXT_STATE, in ep_timeout()
1760 __state_set(&ep->com, ABORTING); in ep_timeout()
1764 __func__, ep, ep->com.state); in ep_timeout()
1767 spin_unlock_irqrestore(&ep->com.lock, flags); in ep_timeout()
1769 abort_connection(ep, NULL, GFP_ATOMIC); in ep_timeout()
1770 put_ep(&ep->com); in ep_timeout()
1776 struct iwch_ep *ep = to_ep(cm_id); in iwch_reject_cr() local
1777 PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); in iwch_reject_cr()
1779 if (state_read(&ep->com) == DEAD) { in iwch_reject_cr()
1780 put_ep(&ep->com); in iwch_reject_cr()
1783 BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD); in iwch_reject_cr()
1785 abort_connection(ep, NULL, GFP_KERNEL); in iwch_reject_cr()
1787 err = send_mpa_reject(ep, pdata, pdata_len); in iwch_reject_cr()
1788 err = iwch_ep_disconnect(ep, 0, GFP_KERNEL); in iwch_reject_cr()
1790 put_ep(&ep->com); in iwch_reject_cr()
1799 struct iwch_ep *ep = to_ep(cm_id); in iwch_accept_cr() local
1803 PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); in iwch_accept_cr()
1804 if (state_read(&ep->com) == DEAD) { in iwch_accept_cr()
1809 BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD); in iwch_accept_cr()
1814 abort_connection(ep, NULL, GFP_KERNEL); in iwch_accept_cr()
1820 ep->com.cm_id = cm_id; in iwch_accept_cr()
1821 ep->com.qp = qp; in iwch_accept_cr()
1823 ep->ird = conn_param->ird; in iwch_accept_cr()
1824 ep->ord = conn_param->ord; in iwch_accept_cr()
1826 if (peer2peer && ep->ird == 0) in iwch_accept_cr()
1827 ep->ird = 1; in iwch_accept_cr()
1829 PDBG("%s %d ird %d ord %d\n", __func__, __LINE__, ep->ird, ep->ord); in iwch_accept_cr()
1832 attrs.mpa_attr = ep->mpa_attr; in iwch_accept_cr()
1833 attrs.max_ird = ep->ird; in iwch_accept_cr()
1834 attrs.max_ord = ep->ord; in iwch_accept_cr()
1835 attrs.llp_stream_handle = ep; in iwch_accept_cr()
1845 err = iwch_modify_qp(ep->com.qp->rhp, in iwch_accept_cr()
1846 ep->com.qp, mask, &attrs, 1); in iwch_accept_cr()
1852 wait_event(ep->com.waitq, ep->com.rpl_done); in iwch_accept_cr()
1853 err = ep->com.rpl_err; in iwch_accept_cr()
1858 err = send_mpa_reply(ep, conn_param->private_data, in iwch_accept_cr()
1864 state_set(&ep->com, FPDU_MODE); in iwch_accept_cr()
1865 established_upcall(ep); in iwch_accept_cr()
1866 put_ep(&ep->com); in iwch_accept_cr()
1869 ep->com.cm_id = NULL; in iwch_accept_cr()
1870 ep->com.qp = NULL; in iwch_accept_cr()
1873 put_ep(&ep->com); in iwch_accept_cr()
1892 struct iwch_ep *ep; in iwch_connect() local
1908 ep = alloc_ep(sizeof(*ep), GFP_KERNEL); in iwch_connect()
1909 if (!ep) { in iwch_connect()
1914 init_timer(&ep->timer); in iwch_connect()
1915 ep->plen = conn_param->private_data_len; in iwch_connect()
1916 if (ep->plen) in iwch_connect()
1917 memcpy(ep->mpa_pkt + sizeof(struct mpa_message), in iwch_connect()
1918 conn_param->private_data, ep->plen); in iwch_connect()
1919 ep->ird = conn_param->ird; in iwch_connect()
1920 ep->ord = conn_param->ord; in iwch_connect()
1922 if (peer2peer && ep->ord == 0) in iwch_connect()
1923 ep->ord = 1; in iwch_connect()
1925 ep->com.tdev = h->rdev.t3cdev_p; in iwch_connect()
1928 ep->com.cm_id = cm_id; in iwch_connect()
1929 ep->com.qp = get_qhp(h, conn_param->qpn); in iwch_connect()
1930 BUG_ON(!ep->com.qp); in iwch_connect()
1932 ep->com.qp, cm_id); in iwch_connect()
1937 ep->atid = cxgb3_alloc_atid(h->rdev.t3cdev_p, &t3c_client, ep); in iwch_connect()
1938 if (ep->atid == -1) { in iwch_connect()
1953 ep->dst = &rt->dst; in iwch_connect()
1954 ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst, NULL, in iwch_connect()
1956 if (!ep->l2t) { in iwch_connect()
1962 state_set(&ep->com, CONNECTING); in iwch_connect()
1963 ep->tos = IPTOS_LOWDELAY; in iwch_connect()
1964 memcpy(&ep->com.local_addr, &cm_id->local_addr, in iwch_connect()
1965 sizeof(ep->com.local_addr)); in iwch_connect()
1966 memcpy(&ep->com.remote_addr, &cm_id->remote_addr, in iwch_connect()
1967 sizeof(ep->com.remote_addr)); in iwch_connect()
1970 err = send_connect(ep); in iwch_connect()
1974 l2t_release(h->rdev.t3cdev_p, ep->l2t); in iwch_connect()
1976 dst_release(ep->dst); in iwch_connect()
1978 cxgb3_free_atid(ep->com.tdev, ep->atid); in iwch_connect()
1981 put_ep(&ep->com); in iwch_connect()
1990 struct iwch_listen_ep *ep; in iwch_create_listen() local
2000 ep = alloc_ep(sizeof(*ep), GFP_KERNEL); in iwch_create_listen()
2001 if (!ep) { in iwch_create_listen()
2006 PDBG("%s ep %p\n", __func__, ep); in iwch_create_listen()
2007 ep->com.tdev = h->rdev.t3cdev_p; in iwch_create_listen()
2009 ep->com.cm_id = cm_id; in iwch_create_listen()
2010 ep->backlog = backlog; in iwch_create_listen()
2011 memcpy(&ep->com.local_addr, &cm_id->local_addr, in iwch_create_listen()
2012 sizeof(ep->com.local_addr)); in iwch_create_listen()
2017 ep->stid = cxgb3_alloc_stid(h->rdev.t3cdev_p, &t3c_client, ep); in iwch_create_listen()
2018 if (ep->stid == -1) { in iwch_create_listen()
2024 state_set(&ep->com, LISTEN); in iwch_create_listen()
2025 err = listen_start(ep); in iwch_create_listen()
2030 wait_event(ep->com.waitq, ep->com.rpl_done); in iwch_create_listen()
2031 err = ep->com.rpl_err; in iwch_create_listen()
2033 cm_id->provider_data = ep; in iwch_create_listen()
2037 cxgb3_free_stid(ep->com.tdev, ep->stid); in iwch_create_listen()
2040 put_ep(&ep->com); in iwch_create_listen()
2049 struct iwch_listen_ep *ep = to_listen_ep(cm_id); in iwch_destroy_listen() local
2051 PDBG("%s ep %p\n", __func__, ep); in iwch_destroy_listen()
2054 state_set(&ep->com, DEAD); in iwch_destroy_listen()
2055 ep->com.rpl_done = 0; in iwch_destroy_listen()
2056 ep->com.rpl_err = 0; in iwch_destroy_listen()
2057 err = listen_stop(ep); in iwch_destroy_listen()
2060 wait_event(ep->com.waitq, ep->com.rpl_done); in iwch_destroy_listen()
2061 cxgb3_free_stid(ep->com.tdev, ep->stid); in iwch_destroy_listen()
2063 err = ep->com.rpl_err; in iwch_destroy_listen()
2065 put_ep(&ep->com); in iwch_destroy_listen()
2069 int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp) in iwch_ep_disconnect() argument
2078 spin_lock_irqsave(&ep->com.lock, flags); in iwch_ep_disconnect()
2080 PDBG("%s ep %p state %s, abrupt %d\n", __func__, ep, in iwch_ep_disconnect()
2081 states[ep->com.state], abrupt); in iwch_ep_disconnect()
2083 tdev = (struct t3cdev *)ep->com.tdev; in iwch_ep_disconnect()
2087 close_complete_upcall(ep); in iwch_ep_disconnect()
2088 ep->com.state = DEAD; in iwch_ep_disconnect()
2090 switch (ep->com.state) { in iwch_ep_disconnect()
2098 ep->com.state = ABORTING; in iwch_ep_disconnect()
2100 ep->com.state = CLOSING; in iwch_ep_disconnect()
2101 start_ep_timer(ep); in iwch_ep_disconnect()
2103 set_bit(CLOSE_SENT, &ep->com.flags); in iwch_ep_disconnect()
2106 if (!test_and_set_bit(CLOSE_SENT, &ep->com.flags)) { in iwch_ep_disconnect()
2109 stop_ep_timer(ep); in iwch_ep_disconnect()
2110 ep->com.state = ABORTING; in iwch_ep_disconnect()
2112 ep->com.state = MORIBUND; in iwch_ep_disconnect()
2119 __func__, ep, ep->com.state); in iwch_ep_disconnect()
2126 spin_unlock_irqrestore(&ep->com.lock, flags); in iwch_ep_disconnect()
2129 ret = send_abort(ep, NULL, gfp); in iwch_ep_disconnect()
2131 ret = send_halfclose(ep, gfp); in iwch_ep_disconnect()
2136 release_ep_resources(ep); in iwch_ep_disconnect()
2143 struct iwch_ep *ep = ctx; in iwch_ep_redirect() local
2145 if (ep->dst != old) in iwch_ep_redirect()
2148 PDBG("%s ep %p redirect to dst %p l2t %p\n", __func__, ep, new, in iwch_ep_redirect()
2151 l2t_release(ep->com.tdev, ep->l2t); in iwch_ep_redirect()
2152 ep->l2t = l2t; in iwch_ep_redirect()
2154 ep->dst = new; in iwch_ep_redirect()
2183 void *ep; in process_work() local
2188 ep = *((void **) (skb->cb)); in process_work()
2190 ret = work_handlers[G_OPCODE(ntohl((__force __be32)skb->csum))](tdev, skb, ep); in process_work()
2197 put_ep((struct iwch_ep_common *)ep); in process_work()