4477 lines · c
1/*2 * Copyright (c) 2009-2014 Chelsio, Inc. All rights reserved.3 *4 * This software is available to you under a choice of one of two5 * licenses. You may choose to be licensed under the terms of the GNU6 * General Public License (GPL) Version 2, available from the file7 * COPYING in the main directory of this source tree, or the8 * OpenIB.org BSD license below:9 *10 * Redistribution and use in source and binary forms, with or11 * without modification, are permitted provided that the following12 * conditions are met:13 *14 * - Redistributions of source code must retain the above15 * copyright notice, this list of conditions and the following16 * disclaimer.17 *18 * - Redistributions in binary form must reproduce the above19 * copyright notice, this list of conditions and the following20 * disclaimer in the documentation and/or other materials21 * provided with the distribution.22 *23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE30 * SOFTWARE.31 */32#include <linux/module.h>33#include <linux/list.h>34#include <linux/workqueue.h>35#include <linux/skbuff.h>36#include <linux/timer.h>37#include <linux/notifier.h>38#include <linux/inetdevice.h>39#include <linux/ip.h>40#include <linux/tcp.h>41#include <linux/if_vlan.h>42 43#include <net/neighbour.h>44#include <net/netevent.h>45#include <net/route.h>46#include <net/tcp.h>47#include <net/ip6_route.h>48#include <net/addrconf.h>49 50#include <rdma/ib_addr.h>51 52#include <libcxgb_cm.h>53#include "iw_cxgb4.h"54#include "clip_tbl.h"55 56static char *states[] = {57 "idle",58 "listen",59 "connecting",60 "mpa_wait_req",61 "mpa_req_sent",62 "mpa_req_rcvd",63 "mpa_rep_sent",64 "fpdu_mode",65 "aborting",66 "closing",67 "moribund",68 "dead",69 NULL,70};71 72static int nocong;73module_param(nocong, int, 0644);74MODULE_PARM_DESC(nocong, "Turn of congestion control (default=0)");75 76static int enable_ecn;77module_param(enable_ecn, int, 0644);78MODULE_PARM_DESC(enable_ecn, "Enable ECN (default=0/disabled)");79 80static int dack_mode;81module_param(dack_mode, int, 0644);82MODULE_PARM_DESC(dack_mode, "Delayed ack mode (default=0)");83 84uint c4iw_max_read_depth = 32;85module_param(c4iw_max_read_depth, int, 0644);86MODULE_PARM_DESC(c4iw_max_read_depth,87 "Per-connection max ORD/IRD (default=32)");88 89static int enable_tcp_timestamps;90module_param(enable_tcp_timestamps, int, 0644);91MODULE_PARM_DESC(enable_tcp_timestamps, "Enable tcp timestamps (default=0)");92 93static int enable_tcp_sack;94module_param(enable_tcp_sack, int, 0644);95MODULE_PARM_DESC(enable_tcp_sack, "Enable tcp SACK (default=0)");96 97static int enable_tcp_window_scaling = 1;98module_param(enable_tcp_window_scaling, int, 0644);99MODULE_PARM_DESC(enable_tcp_window_scaling,100 "Enable tcp window scaling (default=1)");101 102static int peer2peer = 1;103module_param(peer2peer, int, 0644);104MODULE_PARM_DESC(peer2peer, "Support peer2peer ULPs (default=1)");105 106static int p2p_type = FW_RI_INIT_P2PTYPE_READ_REQ;107module_param(p2p_type, int, 0644);108MODULE_PARM_DESC(p2p_type, "RDMAP opcode to use for the RTR message: "109 "1=RDMA_READ 0=RDMA_WRITE (default 1)");110 111static int ep_timeout_secs = 60;112module_param(ep_timeout_secs, int, 0644);113MODULE_PARM_DESC(ep_timeout_secs, "CM Endpoint operation timeout "114 "in seconds (default=60)");115 116static int mpa_rev = 2;117module_param(mpa_rev, int, 0644);118MODULE_PARM_DESC(mpa_rev, "MPA Revision, 0 supports amso1100, "119 "1 is RFC5044 spec compliant, 2 is IETF MPA Peer Connect Draft"120 " compliant (default=2)");121 122static int markers_enabled;123module_param(markers_enabled, int, 0644);124MODULE_PARM_DESC(markers_enabled, "Enable MPA MARKERS (default(0)=disabled)");125 126static int crc_enabled = 1;127module_param(crc_enabled, int, 0644);128MODULE_PARM_DESC(crc_enabled, "Enable MPA CRC (default(1)=enabled)");129 130static int rcv_win = 256 * 1024;131module_param(rcv_win, int, 0644);132MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256KB)");133 134static int snd_win = 128 * 1024;135module_param(snd_win, int, 0644);136MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=128KB)");137 138static struct workqueue_struct *workq;139 140static struct sk_buff_head rxq;141 142static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp);143static void ep_timeout(struct timer_list *t);144static void connect_reply_upcall(struct c4iw_ep *ep, int status);145static int sched(struct c4iw_dev *dev, struct sk_buff *skb);146 147static LIST_HEAD(timeout_list);148static DEFINE_SPINLOCK(timeout_lock);149 150static void deref_cm_id(struct c4iw_ep_common *epc)151{152 epc->cm_id->rem_ref(epc->cm_id);153 epc->cm_id = NULL;154 set_bit(CM_ID_DEREFED, &epc->history);155}156 157static void ref_cm_id(struct c4iw_ep_common *epc)158{159 set_bit(CM_ID_REFED, &epc->history);160 epc->cm_id->add_ref(epc->cm_id);161}162 163static void deref_qp(struct c4iw_ep *ep)164{165 c4iw_qp_rem_ref(&ep->com.qp->ibqp);166 clear_bit(QP_REFERENCED, &ep->com.flags);167 set_bit(QP_DEREFED, &ep->com.history);168}169 170static void ref_qp(struct c4iw_ep *ep)171{172 set_bit(QP_REFERENCED, &ep->com.flags);173 set_bit(QP_REFED, &ep->com.history);174 c4iw_qp_add_ref(&ep->com.qp->ibqp);175}176 177static void start_ep_timer(struct c4iw_ep *ep)178{179 pr_debug("ep %p\n", ep);180 if (timer_pending(&ep->timer)) {181 pr_err("%s timer already started! ep %p\n",182 __func__, ep);183 return;184 }185 clear_bit(TIMEOUT, &ep->com.flags);186 c4iw_get_ep(&ep->com);187 ep->timer.expires = jiffies + ep_timeout_secs * HZ;188 add_timer(&ep->timer);189}190 191static int stop_ep_timer(struct c4iw_ep *ep)192{193 pr_debug("ep %p stopping\n", ep);194 del_timer_sync(&ep->timer);195 if (!test_and_set_bit(TIMEOUT, &ep->com.flags)) {196 c4iw_put_ep(&ep->com);197 return 0;198 }199 return 1;200}201 202static int c4iw_l2t_send(struct c4iw_rdev *rdev, struct sk_buff *skb,203 struct l2t_entry *l2e)204{205 int error = 0;206 207 if (c4iw_fatal_error(rdev)) {208 kfree_skb(skb);209 pr_err("%s - device in error state - dropping\n", __func__);210 return -EIO;211 }212 error = cxgb4_l2t_send(rdev->lldi.ports[0], skb, l2e);213 if (error < 0)214 kfree_skb(skb);215 else if (error == NET_XMIT_DROP)216 return -ENOMEM;217 return error < 0 ? error : 0;218}219 220int c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb)221{222 int error = 0;223 224 if (c4iw_fatal_error(rdev)) {225 kfree_skb(skb);226 pr_err("%s - device in error state - dropping\n", __func__);227 return -EIO;228 }229 error = cxgb4_ofld_send(rdev->lldi.ports[0], skb);230 if (error < 0)231 kfree_skb(skb);232 return error < 0 ? error : 0;233}234 235static void release_tid(struct c4iw_rdev *rdev, u32 hwtid, struct sk_buff *skb)236{237 u32 len = roundup(sizeof(struct cpl_tid_release), 16);238 239 skb = get_skb(skb, len, GFP_KERNEL);240 if (!skb)241 return;242 243 cxgb_mk_tid_release(skb, len, hwtid, 0);244 c4iw_ofld_send(rdev, skb);245 return;246}247 248static void set_emss(struct c4iw_ep *ep, u16 opt)249{250 ep->emss = ep->com.dev->rdev.lldi.mtus[TCPOPT_MSS_G(opt)] -251 ((AF_INET == ep->com.remote_addr.ss_family) ?252 sizeof(struct iphdr) : sizeof(struct ipv6hdr)) -253 sizeof(struct tcphdr);254 ep->mss = ep->emss;255 if (TCPOPT_TSTAMP_G(opt))256 ep->emss -= round_up(TCPOLEN_TIMESTAMP, 4);257 if (ep->emss < 128)258 ep->emss = 128;259 if (ep->emss & 7)260 pr_debug("Warning: misaligned mtu idx %u mss %u emss=%u\n",261 TCPOPT_MSS_G(opt), ep->mss, ep->emss);262 pr_debug("mss_idx %u mss %u emss=%u\n", TCPOPT_MSS_G(opt), ep->mss,263 ep->emss);264}265 266static enum c4iw_ep_state state_read(struct c4iw_ep_common *epc)267{268 enum c4iw_ep_state state;269 270 mutex_lock(&epc->mutex);271 state = epc->state;272 mutex_unlock(&epc->mutex);273 return state;274}275 276static void __state_set(struct c4iw_ep_common *epc, enum c4iw_ep_state new)277{278 epc->state = new;279}280 281static void state_set(struct c4iw_ep_common *epc, enum c4iw_ep_state new)282{283 mutex_lock(&epc->mutex);284 pr_debug("%s -> %s\n", states[epc->state], states[new]);285 __state_set(epc, new);286 mutex_unlock(&epc->mutex);287 return;288}289 290static int alloc_ep_skb_list(struct sk_buff_head *ep_skb_list, int size)291{292 struct sk_buff *skb;293 unsigned int i;294 size_t len;295 296 len = roundup(sizeof(union cpl_wr_size), 16);297 for (i = 0; i < size; i++) {298 skb = alloc_skb(len, GFP_KERNEL);299 if (!skb)300 goto fail;301 skb_queue_tail(ep_skb_list, skb);302 }303 return 0;304fail:305 skb_queue_purge(ep_skb_list);306 return -ENOMEM;307}308 309static void *alloc_ep(int size, gfp_t gfp)310{311 struct c4iw_ep_common *epc;312 313 epc = kzalloc(size, gfp);314 if (epc) {315 epc->wr_waitp = c4iw_alloc_wr_wait(gfp);316 if (!epc->wr_waitp) {317 kfree(epc);318 epc = NULL;319 goto out;320 }321 kref_init(&epc->kref);322 mutex_init(&epc->mutex);323 c4iw_init_wr_wait(epc->wr_waitp);324 }325 pr_debug("alloc ep %p\n", epc);326out:327 return epc;328}329 330static void remove_ep_tid(struct c4iw_ep *ep)331{332 unsigned long flags;333 334 xa_lock_irqsave(&ep->com.dev->hwtids, flags);335 __xa_erase(&ep->com.dev->hwtids, ep->hwtid);336 if (xa_empty(&ep->com.dev->hwtids))337 wake_up(&ep->com.dev->wait);338 xa_unlock_irqrestore(&ep->com.dev->hwtids, flags);339}340 341static int insert_ep_tid(struct c4iw_ep *ep)342{343 unsigned long flags;344 int err;345 346 xa_lock_irqsave(&ep->com.dev->hwtids, flags);347 err = __xa_insert(&ep->com.dev->hwtids, ep->hwtid, ep, GFP_KERNEL);348 xa_unlock_irqrestore(&ep->com.dev->hwtids, flags);349 350 return err;351}352 353/*354 * Atomically lookup the ep ptr given the tid and grab a reference on the ep.355 */356static struct c4iw_ep *get_ep_from_tid(struct c4iw_dev *dev, unsigned int tid)357{358 struct c4iw_ep *ep;359 unsigned long flags;360 361 xa_lock_irqsave(&dev->hwtids, flags);362 ep = xa_load(&dev->hwtids, tid);363 if (ep)364 c4iw_get_ep(&ep->com);365 xa_unlock_irqrestore(&dev->hwtids, flags);366 return ep;367}368 369/*370 * Atomically lookup the ep ptr given the stid and grab a reference on the ep.371 */372static struct c4iw_listen_ep *get_ep_from_stid(struct c4iw_dev *dev,373 unsigned int stid)374{375 struct c4iw_listen_ep *ep;376 unsigned long flags;377 378 xa_lock_irqsave(&dev->stids, flags);379 ep = xa_load(&dev->stids, stid);380 if (ep)381 c4iw_get_ep(&ep->com);382 xa_unlock_irqrestore(&dev->stids, flags);383 return ep;384}385 386void _c4iw_free_ep(struct kref *kref)387{388 struct c4iw_ep *ep;389 390 ep = container_of(kref, struct c4iw_ep, com.kref);391 pr_debug("ep %p state %s\n", ep, states[ep->com.state]);392 if (test_bit(QP_REFERENCED, &ep->com.flags))393 deref_qp(ep);394 if (test_bit(RELEASE_RESOURCES, &ep->com.flags)) {395 if (ep->com.remote_addr.ss_family == AF_INET6) {396 struct sockaddr_in6 *sin6 =397 (struct sockaddr_in6 *)398 &ep->com.local_addr;399 400 cxgb4_clip_release(401 ep->com.dev->rdev.lldi.ports[0],402 (const u32 *)&sin6->sin6_addr.s6_addr,403 1);404 }405 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid,406 ep->com.local_addr.ss_family);407 dst_release(ep->dst);408 cxgb4_l2t_release(ep->l2t);409 kfree_skb(ep->mpa_skb);410 }411 if (!skb_queue_empty(&ep->com.ep_skb_list))412 skb_queue_purge(&ep->com.ep_skb_list);413 c4iw_put_wr_wait(ep->com.wr_waitp);414 kfree(ep);415}416 417static void release_ep_resources(struct c4iw_ep *ep)418{419 set_bit(RELEASE_RESOURCES, &ep->com.flags);420 421 /*422 * If we have a hwtid, then remove it from the idr table423 * so lookups will no longer find this endpoint. Otherwise424 * we have a race where one thread finds the ep ptr just425 * before the other thread is freeing the ep memory.426 */427 if (ep->hwtid != -1)428 remove_ep_tid(ep);429 c4iw_put_ep(&ep->com);430}431 432static int status2errno(int status)433{434 switch (status) {435 case CPL_ERR_NONE:436 return 0;437 case CPL_ERR_CONN_RESET:438 return -ECONNRESET;439 case CPL_ERR_ARP_MISS:440 return -EHOSTUNREACH;441 case CPL_ERR_CONN_TIMEDOUT:442 return -ETIMEDOUT;443 case CPL_ERR_TCAM_FULL:444 return -ENOMEM;445 case CPL_ERR_CONN_EXIST:446 return -EADDRINUSE;447 default:448 return -EIO;449 }450}451 452/*453 * Try and reuse skbs already allocated...454 */455static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp)456{457 if (skb && !skb_is_nonlinear(skb) && !skb_cloned(skb)) {458 skb_trim(skb, 0);459 skb_get(skb);460 skb_reset_transport_header(skb);461 } else {462 skb = alloc_skb(len, gfp);463 if (!skb)464 return NULL;465 }466 t4_set_arp_err_handler(skb, NULL, NULL);467 return skb;468}469 470static struct net_device *get_real_dev(struct net_device *egress_dev)471{472 return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev;473}474 475static void arp_failure_discard(void *handle, struct sk_buff *skb)476{477 pr_err("ARP failure\n");478 kfree_skb(skb);479}480 481static void mpa_start_arp_failure(void *handle, struct sk_buff *skb)482{483 pr_err("ARP failure during MPA Negotiation - Closing Connection\n");484}485 486enum {487 NUM_FAKE_CPLS = 2,488 FAKE_CPL_PUT_EP_SAFE = NUM_CPL_CMDS + 0,489 FAKE_CPL_PASS_PUT_EP_SAFE = NUM_CPL_CMDS + 1,490};491 492static int _put_ep_safe(struct c4iw_dev *dev, struct sk_buff *skb)493{494 struct c4iw_ep *ep;495 496 ep = *((struct c4iw_ep **)(skb->cb + 2 * sizeof(void *)));497 release_ep_resources(ep);498 return 0;499}500 501static int _put_pass_ep_safe(struct c4iw_dev *dev, struct sk_buff *skb)502{503 struct c4iw_ep *ep;504 505 ep = *((struct c4iw_ep **)(skb->cb + 2 * sizeof(void *)));506 c4iw_put_ep(&ep->parent_ep->com);507 release_ep_resources(ep);508 return 0;509}510 511/*512 * Fake up a special CPL opcode and call sched() so process_work() will call513 * _put_ep_safe() in a safe context to free the ep resources. This is needed514 * because ARP error handlers are called in an ATOMIC context, and515 * _c4iw_free_ep() needs to block.516 */517static void queue_arp_failure_cpl(struct c4iw_ep *ep, struct sk_buff *skb,518 int cpl)519{520 struct cpl_act_establish *rpl = cplhdr(skb);521 522 /* Set our special ARP_FAILURE opcode */523 rpl->ot.opcode = cpl;524 525 /*526 * Save ep in the skb->cb area, after where sched() will save the dev527 * ptr.528 */529 *((struct c4iw_ep **)(skb->cb + 2 * sizeof(void *))) = ep;530 sched(ep->com.dev, skb);531}532 533/* Handle an ARP failure for an accept */534static void pass_accept_rpl_arp_failure(void *handle, struct sk_buff *skb)535{536 struct c4iw_ep *ep = handle;537 538 pr_err("ARP failure during accept - tid %u - dropping connection\n",539 ep->hwtid);540 541 __state_set(&ep->com, DEAD);542 queue_arp_failure_cpl(ep, skb, FAKE_CPL_PASS_PUT_EP_SAFE);543}544 545/*546 * Handle an ARP failure for an active open.547 */548static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)549{550 struct c4iw_ep *ep = handle;551 552 pr_err("ARP failure during connect\n");553 connect_reply_upcall(ep, -EHOSTUNREACH);554 __state_set(&ep->com, DEAD);555 if (ep->com.remote_addr.ss_family == AF_INET6) {556 struct sockaddr_in6 *sin6 =557 (struct sockaddr_in6 *)&ep->com.local_addr;558 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],559 (const u32 *)&sin6->sin6_addr.s6_addr, 1);560 }561 xa_erase_irq(&ep->com.dev->atids, ep->atid);562 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);563 queue_arp_failure_cpl(ep, skb, FAKE_CPL_PUT_EP_SAFE);564}565 566/*567 * Handle an ARP failure for a CPL_ABORT_REQ. Change it into a no RST variant568 * and send it along.569 */570static void abort_arp_failure(void *handle, struct sk_buff *skb)571{572 int ret;573 struct c4iw_ep *ep = handle;574 struct c4iw_rdev *rdev = &ep->com.dev->rdev;575 struct cpl_abort_req *req = cplhdr(skb);576 577 pr_debug("rdev %p\n", rdev);578 req->cmd = CPL_ABORT_NO_RST;579 skb_get(skb);580 ret = c4iw_ofld_send(rdev, skb);581 if (ret) {582 __state_set(&ep->com, DEAD);583 queue_arp_failure_cpl(ep, skb, FAKE_CPL_PUT_EP_SAFE);584 } else585 kfree_skb(skb);586}587 588static int send_flowc(struct c4iw_ep *ep)589{590 struct fw_flowc_wr *flowc;591 struct sk_buff *skb = skb_dequeue(&ep->com.ep_skb_list);592 u16 vlan = ep->l2t->vlan;593 int nparams;594 int flowclen, flowclen16;595 596 if (WARN_ON(!skb))597 return -ENOMEM;598 599 if (vlan == CPL_L2T_VLAN_NONE)600 nparams = 9;601 else602 nparams = 10;603 604 flowclen = offsetof(struct fw_flowc_wr, mnemval[nparams]);605 flowclen16 = DIV_ROUND_UP(flowclen, 16);606 flowclen = flowclen16 * 16;607 608 flowc = __skb_put(skb, flowclen);609 memset(flowc, 0, flowclen);610 611 flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) |612 FW_FLOWC_WR_NPARAMS_V(nparams));613 flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(flowclen16) |614 FW_WR_FLOWID_V(ep->hwtid));615 616 flowc->mnemval[0].mnemonic = FW_FLOWC_MNEM_PFNVFN;617 flowc->mnemval[0].val = cpu_to_be32(FW_PFVF_CMD_PFN_V618 (ep->com.dev->rdev.lldi.pf));619 flowc->mnemval[1].mnemonic = FW_FLOWC_MNEM_CH;620 flowc->mnemval[1].val = cpu_to_be32(ep->tx_chan);621 flowc->mnemval[2].mnemonic = FW_FLOWC_MNEM_PORT;622 flowc->mnemval[2].val = cpu_to_be32(ep->tx_chan);623 flowc->mnemval[3].mnemonic = FW_FLOWC_MNEM_IQID;624 flowc->mnemval[3].val = cpu_to_be32(ep->rss_qid);625 flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SNDNXT;626 flowc->mnemval[4].val = cpu_to_be32(ep->snd_seq);627 flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_RCVNXT;628 flowc->mnemval[5].val = cpu_to_be32(ep->rcv_seq);629 flowc->mnemval[6].mnemonic = FW_FLOWC_MNEM_SNDBUF;630 flowc->mnemval[6].val = cpu_to_be32(ep->snd_win);631 flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS;632 flowc->mnemval[7].val = cpu_to_be32(ep->emss);633 flowc->mnemval[8].mnemonic = FW_FLOWC_MNEM_RCV_SCALE;634 flowc->mnemval[8].val = cpu_to_be32(ep->snd_wscale);635 if (nparams == 10) {636 u16 pri;637 pri = (vlan & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;638 flowc->mnemval[9].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS;639 flowc->mnemval[9].val = cpu_to_be32(pri);640 }641 642 set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);643 return c4iw_ofld_send(&ep->com.dev->rdev, skb);644}645 646static int send_halfclose(struct c4iw_ep *ep)647{648 struct sk_buff *skb = skb_dequeue(&ep->com.ep_skb_list);649 u32 wrlen = roundup(sizeof(struct cpl_close_con_req), 16);650 651 pr_debug("ep %p tid %u\n", ep, ep->hwtid);652 if (WARN_ON(!skb))653 return -ENOMEM;654 655 cxgb_mk_close_con_req(skb, wrlen, ep->hwtid, ep->txq_idx,656 NULL, arp_failure_discard);657 658 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);659}660 661static void read_tcb(struct c4iw_ep *ep)662{663 struct sk_buff *skb;664 struct cpl_get_tcb *req;665 int wrlen = roundup(sizeof(*req), 16);666 667 skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);668 if (WARN_ON(!skb))669 return;670 671 set_wr_txq(skb, CPL_PRIORITY_CONTROL, ep->ctrlq_idx);672 req = (struct cpl_get_tcb *) skb_put(skb, wrlen);673 memset(req, 0, wrlen);674 INIT_TP_WR(req, ep->hwtid);675 OPCODE_TID(req) = cpu_to_be32(MK_OPCODE_TID(CPL_GET_TCB, ep->hwtid));676 req->reply_ctrl = htons(REPLY_CHAN_V(0) | QUEUENO_V(ep->rss_qid));677 678 /*679 * keep a ref on the ep so the tcb is not unlocked before this680 * cpl completes. The ref is released in read_tcb_rpl().681 */682 c4iw_get_ep(&ep->com);683 if (WARN_ON(c4iw_ofld_send(&ep->com.dev->rdev, skb)))684 c4iw_put_ep(&ep->com);685}686 687static int send_abort_req(struct c4iw_ep *ep)688{689 u32 wrlen = roundup(sizeof(struct cpl_abort_req), 16);690 struct sk_buff *req_skb = skb_dequeue(&ep->com.ep_skb_list);691 692 pr_debug("ep %p tid %u\n", ep, ep->hwtid);693 if (WARN_ON(!req_skb))694 return -ENOMEM;695 696 cxgb_mk_abort_req(req_skb, wrlen, ep->hwtid, ep->txq_idx,697 ep, abort_arp_failure);698 699 return c4iw_l2t_send(&ep->com.dev->rdev, req_skb, ep->l2t);700}701 702static int send_abort(struct c4iw_ep *ep)703{704 if (!ep->com.qp || !ep->com.qp->srq) {705 send_abort_req(ep);706 return 0;707 }708 set_bit(ABORT_REQ_IN_PROGRESS, &ep->com.flags);709 read_tcb(ep);710 return 0;711}712 713static int send_connect(struct c4iw_ep *ep)714{715 struct cpl_act_open_req *req = NULL;716 struct cpl_t5_act_open_req *t5req = NULL;717 struct cpl_t6_act_open_req *t6req = NULL;718 struct cpl_act_open_req6 *req6 = NULL;719 struct cpl_t5_act_open_req6 *t5req6 = NULL;720 struct cpl_t6_act_open_req6 *t6req6 = NULL;721 struct sk_buff *skb;722 u64 opt0;723 u32 opt2;724 unsigned int mtu_idx;725 u32 wscale;726 int win, sizev4, sizev6, wrlen;727 struct sockaddr_in *la = (struct sockaddr_in *)728 &ep->com.local_addr;729 struct sockaddr_in *ra = (struct sockaddr_in *)730 &ep->com.remote_addr;731 struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)732 &ep->com.local_addr;733 struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)734 &ep->com.remote_addr;735 int ret;736 enum chip_type adapter_type = ep->com.dev->rdev.lldi.adapter_type;737 u32 isn = (get_random_u32() & ~7UL) - 1;738 struct net_device *netdev;739 u64 params;740 741 netdev = ep->com.dev->rdev.lldi.ports[0];742 743 switch (CHELSIO_CHIP_VERSION(adapter_type)) {744 case CHELSIO_T4:745 sizev4 = sizeof(struct cpl_act_open_req);746 sizev6 = sizeof(struct cpl_act_open_req6);747 break;748 case CHELSIO_T5:749 sizev4 = sizeof(struct cpl_t5_act_open_req);750 sizev6 = sizeof(struct cpl_t5_act_open_req6);751 break;752 case CHELSIO_T6:753 sizev4 = sizeof(struct cpl_t6_act_open_req);754 sizev6 = sizeof(struct cpl_t6_act_open_req6);755 break;756 default:757 pr_err("T%d Chip is not supported\n",758 CHELSIO_CHIP_VERSION(adapter_type));759 return -EINVAL;760 }761 762 wrlen = (ep->com.remote_addr.ss_family == AF_INET) ?763 roundup(sizev4, 16) :764 roundup(sizev6, 16);765 766 pr_debug("ep %p atid %u\n", ep, ep->atid);767 768 skb = get_skb(NULL, wrlen, GFP_KERNEL);769 if (!skb) {770 pr_err("%s - failed to alloc skb\n", __func__);771 return -ENOMEM;772 }773 set_wr_txq(skb, CPL_PRIORITY_SETUP, ep->ctrlq_idx);774 775 cxgb_best_mtu(ep->com.dev->rdev.lldi.mtus, ep->mtu, &mtu_idx,776 enable_tcp_timestamps,777 (ep->com.remote_addr.ss_family == AF_INET) ? 0 : 1);778 wscale = cxgb_compute_wscale(rcv_win);779 780 /*781 * Specify the largest window that will fit in opt0. The782 * remainder will be specified in the rx_data_ack.783 */784 win = ep->rcv_win >> 10;785 if (win > RCV_BUFSIZ_M)786 win = RCV_BUFSIZ_M;787 788 opt0 = (nocong ? NO_CONG_F : 0) |789 KEEP_ALIVE_F |790 DELACK_F |791 WND_SCALE_V(wscale) |792 MSS_IDX_V(mtu_idx) |793 L2T_IDX_V(ep->l2t->idx) |794 TX_CHAN_V(ep->tx_chan) |795 SMAC_SEL_V(ep->smac_idx) |796 DSCP_V(ep->tos >> 2) |797 ULP_MODE_V(ULP_MODE_TCPDDP) |798 RCV_BUFSIZ_V(win);799 opt2 = RX_CHANNEL_V(0) |800 CCTRL_ECN_V(enable_ecn) |801 RSS_QUEUE_VALID_F | RSS_QUEUE_V(ep->rss_qid);802 if (enable_tcp_timestamps)803 opt2 |= TSTAMPS_EN_F;804 if (enable_tcp_sack)805 opt2 |= SACK_EN_F;806 if (wscale && enable_tcp_window_scaling)807 opt2 |= WND_SCALE_EN_F;808 if (CHELSIO_CHIP_VERSION(adapter_type) > CHELSIO_T4) {809 if (peer2peer)810 isn += 4;811 812 opt2 |= T5_OPT_2_VALID_F;813 opt2 |= CONG_CNTRL_V(CONG_ALG_TAHOE);814 opt2 |= T5_ISS_F;815 }816 817 params = cxgb4_select_ntuple(netdev, ep->l2t);818 819 if (ep->com.remote_addr.ss_family == AF_INET6)820 cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0],821 (const u32 *)&la6->sin6_addr.s6_addr, 1);822 823 t4_set_arp_err_handler(skb, ep, act_open_req_arp_failure);824 825 if (ep->com.remote_addr.ss_family == AF_INET) {826 switch (CHELSIO_CHIP_VERSION(adapter_type)) {827 case CHELSIO_T4:828 req = skb_put(skb, wrlen);829 INIT_TP_WR(req, 0);830 break;831 case CHELSIO_T5:832 t5req = skb_put(skb, wrlen);833 INIT_TP_WR(t5req, 0);834 req = (struct cpl_act_open_req *)t5req;835 break;836 case CHELSIO_T6:837 t6req = skb_put(skb, wrlen);838 INIT_TP_WR(t6req, 0);839 req = (struct cpl_act_open_req *)t6req;840 t5req = (struct cpl_t5_act_open_req *)t6req;841 break;842 default:843 pr_err("T%d Chip is not supported\n",844 CHELSIO_CHIP_VERSION(adapter_type));845 ret = -EINVAL;846 goto clip_release;847 }848 849 OPCODE_TID(req) = cpu_to_be32(MK_OPCODE_TID(CPL_ACT_OPEN_REQ,850 ((ep->rss_qid<<14) | ep->atid)));851 req->local_port = la->sin_port;852 req->peer_port = ra->sin_port;853 req->local_ip = la->sin_addr.s_addr;854 req->peer_ip = ra->sin_addr.s_addr;855 req->opt0 = cpu_to_be64(opt0);856 857 if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) {858 req->params = cpu_to_be32(params);859 req->opt2 = cpu_to_be32(opt2);860 } else {861 if (is_t5(ep->com.dev->rdev.lldi.adapter_type)) {862 t5req->params =863 cpu_to_be64(FILTER_TUPLE_V(params));864 t5req->rsvd = cpu_to_be32(isn);865 pr_debug("snd_isn %u\n", t5req->rsvd);866 t5req->opt2 = cpu_to_be32(opt2);867 } else {868 t6req->params =869 cpu_to_be64(FILTER_TUPLE_V(params));870 t6req->rsvd = cpu_to_be32(isn);871 pr_debug("snd_isn %u\n", t6req->rsvd);872 t6req->opt2 = cpu_to_be32(opt2);873 }874 }875 } else {876 switch (CHELSIO_CHIP_VERSION(adapter_type)) {877 case CHELSIO_T4:878 req6 = skb_put(skb, wrlen);879 INIT_TP_WR(req6, 0);880 break;881 case CHELSIO_T5:882 t5req6 = skb_put(skb, wrlen);883 INIT_TP_WR(t5req6, 0);884 req6 = (struct cpl_act_open_req6 *)t5req6;885 break;886 case CHELSIO_T6:887 t6req6 = skb_put(skb, wrlen);888 INIT_TP_WR(t6req6, 0);889 req6 = (struct cpl_act_open_req6 *)t6req6;890 t5req6 = (struct cpl_t5_act_open_req6 *)t6req6;891 break;892 default:893 pr_err("T%d Chip is not supported\n",894 CHELSIO_CHIP_VERSION(adapter_type));895 ret = -EINVAL;896 goto clip_release;897 }898 899 OPCODE_TID(req6) = cpu_to_be32(MK_OPCODE_TID(CPL_ACT_OPEN_REQ6,900 ((ep->rss_qid<<14)|ep->atid)));901 req6->local_port = la6->sin6_port;902 req6->peer_port = ra6->sin6_port;903 req6->local_ip_hi = *((__be64 *)(la6->sin6_addr.s6_addr));904 req6->local_ip_lo = *((__be64 *)(la6->sin6_addr.s6_addr + 8));905 req6->peer_ip_hi = *((__be64 *)(ra6->sin6_addr.s6_addr));906 req6->peer_ip_lo = *((__be64 *)(ra6->sin6_addr.s6_addr + 8));907 req6->opt0 = cpu_to_be64(opt0);908 909 if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) {910 req6->params = cpu_to_be32(cxgb4_select_ntuple(netdev,911 ep->l2t));912 req6->opt2 = cpu_to_be32(opt2);913 } else {914 if (is_t5(ep->com.dev->rdev.lldi.adapter_type)) {915 t5req6->params =916 cpu_to_be64(FILTER_TUPLE_V(params));917 t5req6->rsvd = cpu_to_be32(isn);918 pr_debug("snd_isn %u\n", t5req6->rsvd);919 t5req6->opt2 = cpu_to_be32(opt2);920 } else {921 t6req6->params =922 cpu_to_be64(FILTER_TUPLE_V(params));923 t6req6->rsvd = cpu_to_be32(isn);924 pr_debug("snd_isn %u\n", t6req6->rsvd);925 t6req6->opt2 = cpu_to_be32(opt2);926 }927 928 }929 }930 931 set_bit(ACT_OPEN_REQ, &ep->com.history);932 ret = c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);933clip_release:934 if (ret && ep->com.remote_addr.ss_family == AF_INET6)935 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],936 (const u32 *)&la6->sin6_addr.s6_addr, 1);937 return ret;938}939 940static int send_mpa_req(struct c4iw_ep *ep, struct sk_buff *skb,941 u8 mpa_rev_to_use)942{943 int mpalen, wrlen, ret;944 struct fw_ofld_tx_data_wr *req;945 struct mpa_message *mpa;946 struct mpa_v2_conn_params mpa_v2_params;947 948 pr_debug("ep %p tid %u pd_len %d\n",949 ep, ep->hwtid, ep->plen);950 951 mpalen = sizeof(*mpa) + ep->plen;952 if (mpa_rev_to_use == 2)953 mpalen += sizeof(struct mpa_v2_conn_params);954 wrlen = roundup(mpalen + sizeof(*req), 16);955 skb = get_skb(skb, wrlen, GFP_KERNEL);956 if (!skb) {957 connect_reply_upcall(ep, -ENOMEM);958 return -ENOMEM;959 }960 set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);961 962 req = skb_put_zero(skb, wrlen);963 req->op_to_immdlen = cpu_to_be32(964 FW_WR_OP_V(FW_OFLD_TX_DATA_WR) |965 FW_WR_COMPL_F |966 FW_WR_IMMDLEN_V(mpalen));967 req->flowid_len16 = cpu_to_be32(968 FW_WR_FLOWID_V(ep->hwtid) |969 FW_WR_LEN16_V(wrlen >> 4));970 req->plen = cpu_to_be32(mpalen);971 req->tunnel_to_proxy = cpu_to_be32(972 FW_OFLD_TX_DATA_WR_FLUSH_F |973 FW_OFLD_TX_DATA_WR_SHOVE_F);974 975 mpa = (struct mpa_message *)(req + 1);976 memcpy(mpa->key, MPA_KEY_REQ, sizeof(mpa->key));977 978 mpa->flags = 0;979 if (crc_enabled)980 mpa->flags |= MPA_CRC;981 if (markers_enabled) {982 mpa->flags |= MPA_MARKERS;983 ep->mpa_attr.recv_marker_enabled = 1;984 } else {985 ep->mpa_attr.recv_marker_enabled = 0;986 }987 if (mpa_rev_to_use == 2)988 mpa->flags |= MPA_ENHANCED_RDMA_CONN;989 990 mpa->private_data_size = htons(ep->plen);991 mpa->revision = mpa_rev_to_use;992 if (mpa_rev_to_use == 1) {993 ep->tried_with_mpa_v1 = 1;994 ep->retry_with_mpa_v1 = 0;995 }996 997 if (mpa_rev_to_use == 2) {998 mpa->private_data_size =999 htons(ntohs(mpa->private_data_size) +1000 sizeof(struct mpa_v2_conn_params));1001 pr_debug("initiator ird %u ord %u\n", ep->ird,1002 ep->ord);1003 mpa_v2_params.ird = htons((u16)ep->ird);1004 mpa_v2_params.ord = htons((u16)ep->ord);1005 1006 if (peer2peer) {1007 mpa_v2_params.ird |= htons(MPA_V2_PEER2PEER_MODEL);1008 if (p2p_type == FW_RI_INIT_P2PTYPE_RDMA_WRITE)1009 mpa_v2_params.ord |=1010 htons(MPA_V2_RDMA_WRITE_RTR);1011 else if (p2p_type == FW_RI_INIT_P2PTYPE_READ_REQ)1012 mpa_v2_params.ord |=1013 htons(MPA_V2_RDMA_READ_RTR);1014 }1015 memcpy(mpa->private_data, &mpa_v2_params,1016 sizeof(struct mpa_v2_conn_params));1017 1018 if (ep->plen)1019 memcpy(mpa->private_data +1020 sizeof(struct mpa_v2_conn_params),1021 ep->mpa_pkt + sizeof(*mpa), ep->plen);1022 } else1023 if (ep->plen)1024 memcpy(mpa->private_data,1025 ep->mpa_pkt + sizeof(*mpa), ep->plen);1026 1027 /*1028 * Reference the mpa skb. This ensures the data area1029 * will remain in memory until the hw acks the tx.1030 * Function fw4_ack() will deref it.1031 */1032 skb_get(skb);1033 t4_set_arp_err_handler(skb, NULL, arp_failure_discard);1034 ep->mpa_skb = skb;1035 ret = c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);1036 if (ret)1037 return ret;1038 start_ep_timer(ep);1039 __state_set(&ep->com, MPA_REQ_SENT);1040 ep->mpa_attr.initiator = 1;1041 ep->snd_seq += mpalen;1042 return ret;1043}1044 1045static int send_mpa_reject(struct c4iw_ep *ep, const void *pdata, u8 plen)1046{1047 int mpalen, wrlen;1048 struct fw_ofld_tx_data_wr *req;1049 struct mpa_message *mpa;1050 struct sk_buff *skb;1051 struct mpa_v2_conn_params mpa_v2_params;1052 1053 pr_debug("ep %p tid %u pd_len %d\n",1054 ep, ep->hwtid, ep->plen);1055 1056 mpalen = sizeof(*mpa) + plen;1057 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn)1058 mpalen += sizeof(struct mpa_v2_conn_params);1059 wrlen = roundup(mpalen + sizeof(*req), 16);1060 1061 skb = get_skb(NULL, wrlen, GFP_KERNEL);1062 if (!skb) {1063 pr_err("%s - cannot alloc skb!\n", __func__);1064 return -ENOMEM;1065 }1066 set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);1067 1068 req = skb_put_zero(skb, wrlen);1069 req->op_to_immdlen = cpu_to_be32(1070 FW_WR_OP_V(FW_OFLD_TX_DATA_WR) |1071 FW_WR_COMPL_F |1072 FW_WR_IMMDLEN_V(mpalen));1073 req->flowid_len16 = cpu_to_be32(1074 FW_WR_FLOWID_V(ep->hwtid) |1075 FW_WR_LEN16_V(wrlen >> 4));1076 req->plen = cpu_to_be32(mpalen);1077 req->tunnel_to_proxy = cpu_to_be32(1078 FW_OFLD_TX_DATA_WR_FLUSH_F |1079 FW_OFLD_TX_DATA_WR_SHOVE_F);1080 1081 mpa = (struct mpa_message *)(req + 1);1082 memset(mpa, 0, sizeof(*mpa));1083 memcpy(mpa->key, MPA_KEY_REP, sizeof(mpa->key));1084 mpa->flags = MPA_REJECT;1085 mpa->revision = ep->mpa_attr.version;1086 mpa->private_data_size = htons(plen);1087 1088 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {1089 mpa->flags |= MPA_ENHANCED_RDMA_CONN;1090 mpa->private_data_size =1091 htons(ntohs(mpa->private_data_size) +1092 sizeof(struct mpa_v2_conn_params));1093 mpa_v2_params.ird = htons(((u16)ep->ird) |1094 (peer2peer ? MPA_V2_PEER2PEER_MODEL :1095 0));1096 mpa_v2_params.ord = htons(((u16)ep->ord) | (peer2peer ?1097 (p2p_type ==1098 FW_RI_INIT_P2PTYPE_RDMA_WRITE ?1099 MPA_V2_RDMA_WRITE_RTR : p2p_type ==1100 FW_RI_INIT_P2PTYPE_READ_REQ ?1101 MPA_V2_RDMA_READ_RTR : 0) : 0));1102 memcpy(mpa->private_data, &mpa_v2_params,1103 sizeof(struct mpa_v2_conn_params));1104 1105 if (ep->plen)1106 memcpy(mpa->private_data +1107 sizeof(struct mpa_v2_conn_params), pdata, plen);1108 } else1109 if (plen)1110 memcpy(mpa->private_data, pdata, plen);1111 1112 /*1113 * Reference the mpa skb again. This ensures the data area1114 * will remain in memory until the hw acks the tx.1115 * Function fw4_ack() will deref it.1116 */1117 skb_get(skb);1118 set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);1119 t4_set_arp_err_handler(skb, NULL, mpa_start_arp_failure);1120 ep->mpa_skb = skb;1121 ep->snd_seq += mpalen;1122 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);1123}1124 1125static int send_mpa_reply(struct c4iw_ep *ep, const void *pdata, u8 plen)1126{1127 int mpalen, wrlen;1128 struct fw_ofld_tx_data_wr *req;1129 struct mpa_message *mpa;1130 struct sk_buff *skb;1131 struct mpa_v2_conn_params mpa_v2_params;1132 1133 pr_debug("ep %p tid %u pd_len %d\n",1134 ep, ep->hwtid, ep->plen);1135 1136 mpalen = sizeof(*mpa) + plen;1137 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn)1138 mpalen += sizeof(struct mpa_v2_conn_params);1139 wrlen = roundup(mpalen + sizeof(*req), 16);1140 1141 skb = get_skb(NULL, wrlen, GFP_KERNEL);1142 if (!skb) {1143 pr_err("%s - cannot alloc skb!\n", __func__);1144 return -ENOMEM;1145 }1146 set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);1147 1148 req = skb_put_zero(skb, wrlen);1149 req->op_to_immdlen = cpu_to_be32(1150 FW_WR_OP_V(FW_OFLD_TX_DATA_WR) |1151 FW_WR_COMPL_F |1152 FW_WR_IMMDLEN_V(mpalen));1153 req->flowid_len16 = cpu_to_be32(1154 FW_WR_FLOWID_V(ep->hwtid) |1155 FW_WR_LEN16_V(wrlen >> 4));1156 req->plen = cpu_to_be32(mpalen);1157 req->tunnel_to_proxy = cpu_to_be32(1158 FW_OFLD_TX_DATA_WR_FLUSH_F |1159 FW_OFLD_TX_DATA_WR_SHOVE_F);1160 1161 mpa = (struct mpa_message *)(req + 1);1162 memset(mpa, 0, sizeof(*mpa));1163 memcpy(mpa->key, MPA_KEY_REP, sizeof(mpa->key));1164 mpa->flags = 0;1165 if (ep->mpa_attr.crc_enabled)1166 mpa->flags |= MPA_CRC;1167 if (ep->mpa_attr.recv_marker_enabled)1168 mpa->flags |= MPA_MARKERS;1169 mpa->revision = ep->mpa_attr.version;1170 mpa->private_data_size = htons(plen);1171 1172 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {1173 mpa->flags |= MPA_ENHANCED_RDMA_CONN;1174 mpa->private_data_size =1175 htons(ntohs(mpa->private_data_size) +1176 sizeof(struct mpa_v2_conn_params));1177 mpa_v2_params.ird = htons((u16)ep->ird);1178 mpa_v2_params.ord = htons((u16)ep->ord);1179 if (peer2peer && (ep->mpa_attr.p2p_type !=1180 FW_RI_INIT_P2PTYPE_DISABLED)) {1181 mpa_v2_params.ird |= htons(MPA_V2_PEER2PEER_MODEL);1182 1183 if (p2p_type == FW_RI_INIT_P2PTYPE_RDMA_WRITE)1184 mpa_v2_params.ord |=1185 htons(MPA_V2_RDMA_WRITE_RTR);1186 else if (p2p_type == FW_RI_INIT_P2PTYPE_READ_REQ)1187 mpa_v2_params.ord |=1188 htons(MPA_V2_RDMA_READ_RTR);1189 }1190 1191 memcpy(mpa->private_data, &mpa_v2_params,1192 sizeof(struct mpa_v2_conn_params));1193 1194 if (ep->plen)1195 memcpy(mpa->private_data +1196 sizeof(struct mpa_v2_conn_params), pdata, plen);1197 } else1198 if (plen)1199 memcpy(mpa->private_data, pdata, plen);1200 1201 /*1202 * Reference the mpa skb. This ensures the data area1203 * will remain in memory until the hw acks the tx.1204 * Function fw4_ack() will deref it.1205 */1206 skb_get(skb);1207 t4_set_arp_err_handler(skb, NULL, mpa_start_arp_failure);1208 ep->mpa_skb = skb;1209 __state_set(&ep->com, MPA_REP_SENT);1210 ep->snd_seq += mpalen;1211 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);1212}1213 1214static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)1215{1216 struct c4iw_ep *ep;1217 struct cpl_act_establish *req = cplhdr(skb);1218 unsigned short tcp_opt = ntohs(req->tcp_opt);1219 unsigned int tid = GET_TID(req);1220 unsigned int atid = TID_TID_G(ntohl(req->tos_atid));1221 struct tid_info *t = dev->rdev.lldi.tids;1222 int ret;1223 1224 ep = lookup_atid(t, atid);1225 if (!ep)1226 return -EINVAL;1227 1228 pr_debug("ep %p tid %u snd_isn %u rcv_isn %u\n", ep, tid,1229 be32_to_cpu(req->snd_isn), be32_to_cpu(req->rcv_isn));1230 1231 mutex_lock(&ep->com.mutex);1232 dst_confirm(ep->dst);1233 1234 /* setup the hwtid for this connection */1235 ep->hwtid = tid;1236 cxgb4_insert_tid(t, ep, tid, ep->com.local_addr.ss_family);1237 insert_ep_tid(ep);1238 1239 ep->snd_seq = be32_to_cpu(req->snd_isn);1240 ep->rcv_seq = be32_to_cpu(req->rcv_isn);1241 ep->snd_wscale = TCPOPT_SND_WSCALE_G(tcp_opt);1242 1243 set_emss(ep, tcp_opt);1244 1245 /* dealloc the atid */1246 xa_erase_irq(&ep->com.dev->atids, atid);1247 cxgb4_free_atid(t, atid);1248 set_bit(ACT_ESTAB, &ep->com.history);1249 1250 /* start MPA negotiation */1251 ret = send_flowc(ep);1252 if (ret)1253 goto err;1254 if (ep->retry_with_mpa_v1)1255 ret = send_mpa_req(ep, skb, 1);1256 else1257 ret = send_mpa_req(ep, skb, mpa_rev);1258 if (ret)1259 goto err;1260 mutex_unlock(&ep->com.mutex);1261 return 0;1262err:1263 mutex_unlock(&ep->com.mutex);1264 connect_reply_upcall(ep, -ENOMEM);1265 c4iw_ep_disconnect(ep, 0, GFP_KERNEL);1266 return 0;1267}1268 1269static void close_complete_upcall(struct c4iw_ep *ep, int status)1270{1271 struct iw_cm_event event;1272 1273 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1274 memset(&event, 0, sizeof(event));1275 event.event = IW_CM_EVENT_CLOSE;1276 event.status = status;1277 if (ep->com.cm_id) {1278 pr_debug("close complete delivered ep %p cm_id %p tid %u\n",1279 ep, ep->com.cm_id, ep->hwtid);1280 ep->com.cm_id->event_handler(ep->com.cm_id, &event);1281 deref_cm_id(&ep->com);1282 set_bit(CLOSE_UPCALL, &ep->com.history);1283 }1284}1285 1286static void peer_close_upcall(struct c4iw_ep *ep)1287{1288 struct iw_cm_event event;1289 1290 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1291 memset(&event, 0, sizeof(event));1292 event.event = IW_CM_EVENT_DISCONNECT;1293 if (ep->com.cm_id) {1294 pr_debug("peer close delivered ep %p cm_id %p tid %u\n",1295 ep, ep->com.cm_id, ep->hwtid);1296 ep->com.cm_id->event_handler(ep->com.cm_id, &event);1297 set_bit(DISCONN_UPCALL, &ep->com.history);1298 }1299}1300 1301static void peer_abort_upcall(struct c4iw_ep *ep)1302{1303 struct iw_cm_event event;1304 1305 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1306 memset(&event, 0, sizeof(event));1307 event.event = IW_CM_EVENT_CLOSE;1308 event.status = -ECONNRESET;1309 if (ep->com.cm_id) {1310 pr_debug("abort delivered ep %p cm_id %p tid %u\n", ep,1311 ep->com.cm_id, ep->hwtid);1312 ep->com.cm_id->event_handler(ep->com.cm_id, &event);1313 deref_cm_id(&ep->com);1314 set_bit(ABORT_UPCALL, &ep->com.history);1315 }1316}1317 1318static void connect_reply_upcall(struct c4iw_ep *ep, int status)1319{1320 struct iw_cm_event event;1321 1322 pr_debug("ep %p tid %u status %d\n",1323 ep, ep->hwtid, status);1324 memset(&event, 0, sizeof(event));1325 event.event = IW_CM_EVENT_CONNECT_REPLY;1326 event.status = status;1327 memcpy(&event.local_addr, &ep->com.local_addr,1328 sizeof(ep->com.local_addr));1329 memcpy(&event.remote_addr, &ep->com.remote_addr,1330 sizeof(ep->com.remote_addr));1331 1332 if ((status == 0) || (status == -ECONNREFUSED)) {1333 if (!ep->tried_with_mpa_v1) {1334 /* this means MPA_v2 is used */1335 event.ord = ep->ird;1336 event.ird = ep->ord;1337 event.private_data_len = ep->plen -1338 sizeof(struct mpa_v2_conn_params);1339 event.private_data = ep->mpa_pkt +1340 sizeof(struct mpa_message) +1341 sizeof(struct mpa_v2_conn_params);1342 } else {1343 /* this means MPA_v1 is used */1344 event.ord = cur_max_read_depth(ep->com.dev);1345 event.ird = cur_max_read_depth(ep->com.dev);1346 event.private_data_len = ep->plen;1347 event.private_data = ep->mpa_pkt +1348 sizeof(struct mpa_message);1349 }1350 }1351 1352 pr_debug("ep %p tid %u status %d\n", ep,1353 ep->hwtid, status);1354 set_bit(CONN_RPL_UPCALL, &ep->com.history);1355 ep->com.cm_id->event_handler(ep->com.cm_id, &event);1356 1357 if (status < 0)1358 deref_cm_id(&ep->com);1359}1360 1361static int connect_request_upcall(struct c4iw_ep *ep)1362{1363 struct iw_cm_event event;1364 int ret;1365 1366 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1367 memset(&event, 0, sizeof(event));1368 event.event = IW_CM_EVENT_CONNECT_REQUEST;1369 memcpy(&event.local_addr, &ep->com.local_addr,1370 sizeof(ep->com.local_addr));1371 memcpy(&event.remote_addr, &ep->com.remote_addr,1372 sizeof(ep->com.remote_addr));1373 event.provider_data = ep;1374 if (!ep->tried_with_mpa_v1) {1375 /* this means MPA_v2 is used */1376 event.ord = ep->ord;1377 event.ird = ep->ird;1378 event.private_data_len = ep->plen -1379 sizeof(struct mpa_v2_conn_params);1380 event.private_data = ep->mpa_pkt + sizeof(struct mpa_message) +1381 sizeof(struct mpa_v2_conn_params);1382 } else {1383 /* this means MPA_v1 is used. Send max supported */1384 event.ord = cur_max_read_depth(ep->com.dev);1385 event.ird = cur_max_read_depth(ep->com.dev);1386 event.private_data_len = ep->plen;1387 event.private_data = ep->mpa_pkt + sizeof(struct mpa_message);1388 }1389 c4iw_get_ep(&ep->com);1390 ret = ep->parent_ep->com.cm_id->event_handler(ep->parent_ep->com.cm_id,1391 &event);1392 if (ret)1393 c4iw_put_ep(&ep->com);1394 set_bit(CONNREQ_UPCALL, &ep->com.history);1395 c4iw_put_ep(&ep->parent_ep->com);1396 return ret;1397}1398 1399static void established_upcall(struct c4iw_ep *ep)1400{1401 struct iw_cm_event event;1402 1403 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1404 memset(&event, 0, sizeof(event));1405 event.event = IW_CM_EVENT_ESTABLISHED;1406 event.ird = ep->ord;1407 event.ord = ep->ird;1408 if (ep->com.cm_id) {1409 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1410 ep->com.cm_id->event_handler(ep->com.cm_id, &event);1411 set_bit(ESTAB_UPCALL, &ep->com.history);1412 }1413}1414 1415static int update_rx_credits(struct c4iw_ep *ep, u32 credits)1416{1417 struct sk_buff *skb;1418 u32 wrlen = roundup(sizeof(struct cpl_rx_data_ack), 16);1419 u32 credit_dack;1420 1421 pr_debug("ep %p tid %u credits %u\n",1422 ep, ep->hwtid, credits);1423 skb = get_skb(NULL, wrlen, GFP_KERNEL);1424 if (!skb) {1425 pr_err("update_rx_credits - cannot alloc skb!\n");1426 return 0;1427 }1428 1429 /*1430 * If we couldn't specify the entire rcv window at connection setup1431 * due to the limit in the number of bits in the RCV_BUFSIZ field,1432 * then add the overage in to the credits returned.1433 */1434 if (ep->rcv_win > RCV_BUFSIZ_M * 1024)1435 credits += ep->rcv_win - RCV_BUFSIZ_M * 1024;1436 1437 credit_dack = credits | RX_FORCE_ACK_F | RX_DACK_CHANGE_F |1438 RX_DACK_MODE_V(dack_mode);1439 1440 cxgb_mk_rx_data_ack(skb, wrlen, ep->hwtid, ep->ctrlq_idx,1441 credit_dack);1442 1443 c4iw_ofld_send(&ep->com.dev->rdev, skb);1444 return credits;1445}1446 1447#define RELAXED_IRD_NEGOTIATION 11448 1449/*1450 * process_mpa_reply - process streaming mode MPA reply1451 *1452 * Returns:1453 *1454 * 0 upon success indicating a connect request was delivered to the ULP1455 * or the mpa request is incomplete but valid so far.1456 *1457 * 1 if a failure requires the caller to close the connection.1458 *1459 * 2 if a failure requires the caller to abort the connection.1460 */1461static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb)1462{1463 struct mpa_message *mpa;1464 struct mpa_v2_conn_params *mpa_v2_params;1465 u16 plen;1466 u16 resp_ird, resp_ord;1467 u8 rtr_mismatch = 0, insuff_ird = 0;1468 struct c4iw_qp_attributes attrs;1469 enum c4iw_qp_attr_mask mask;1470 int err;1471 int disconnect = 0;1472 1473 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1474 1475 /*1476 * If we get more than the supported amount of private data1477 * then we must fail this connection.1478 */1479 if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) {1480 err = -EINVAL;1481 goto err_stop_timer;1482 }1483 1484 /*1485 * copy the new data into our accumulation buffer.1486 */1487 skb_copy_from_linear_data(skb, &(ep->mpa_pkt[ep->mpa_pkt_len]),1488 skb->len);1489 ep->mpa_pkt_len += skb->len;1490 1491 /*1492 * if we don't even have the mpa message, then bail.1493 */1494 if (ep->mpa_pkt_len < sizeof(*mpa))1495 return 0;1496 mpa = (struct mpa_message *) ep->mpa_pkt;1497 1498 /* Validate MPA header. */1499 if (mpa->revision > mpa_rev) {1500 pr_err("%s MPA version mismatch. Local = %d, Received = %d\n",1501 __func__, mpa_rev, mpa->revision);1502 err = -EPROTO;1503 goto err_stop_timer;1504 }1505 if (memcmp(mpa->key, MPA_KEY_REP, sizeof(mpa->key))) {1506 err = -EPROTO;1507 goto err_stop_timer;1508 }1509 1510 plen = ntohs(mpa->private_data_size);1511 1512 /*1513 * Fail if there's too much private data.1514 */1515 if (plen > MPA_MAX_PRIVATE_DATA) {1516 err = -EPROTO;1517 goto err_stop_timer;1518 }1519 1520 /*1521 * If plen does not account for pkt size1522 */1523 if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) {1524 err = -EPROTO;1525 goto err_stop_timer;1526 }1527 1528 ep->plen = (u8) plen;1529 1530 /*1531 * If we don't have all the pdata yet, then bail.1532 * We'll continue process when more data arrives.1533 */1534 if (ep->mpa_pkt_len < (sizeof(*mpa) + plen))1535 return 0;1536 1537 if (mpa->flags & MPA_REJECT) {1538 err = -ECONNREFUSED;1539 goto err_stop_timer;1540 }1541 1542 /*1543 * Stop mpa timer. If it expired, then1544 * we ignore the MPA reply. process_timeout()1545 * will abort the connection.1546 */1547 if (stop_ep_timer(ep))1548 return 0;1549 1550 /*1551 * If we get here we have accumulated the entire mpa1552 * start reply message including private data. And1553 * the MPA header is valid.1554 */1555 __state_set(&ep->com, FPDU_MODE);1556 ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0;1557 ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0;1558 ep->mpa_attr.version = mpa->revision;1559 ep->mpa_attr.p2p_type = FW_RI_INIT_P2PTYPE_DISABLED;1560 1561 if (mpa->revision == 2) {1562 ep->mpa_attr.enhanced_rdma_conn =1563 mpa->flags & MPA_ENHANCED_RDMA_CONN ? 1 : 0;1564 if (ep->mpa_attr.enhanced_rdma_conn) {1565 mpa_v2_params = (struct mpa_v2_conn_params *)1566 (ep->mpa_pkt + sizeof(*mpa));1567 resp_ird = ntohs(mpa_v2_params->ird) &1568 MPA_V2_IRD_ORD_MASK;1569 resp_ord = ntohs(mpa_v2_params->ord) &1570 MPA_V2_IRD_ORD_MASK;1571 pr_debug("responder ird %u ord %u ep ird %u ord %u\n",1572 resp_ird, resp_ord, ep->ird, ep->ord);1573 1574 /*1575 * This is a double-check. Ideally, below checks are1576 * not required since ird/ord stuff has been taken1577 * care of in c4iw_accept_cr1578 */1579 if (ep->ird < resp_ord) {1580 if (RELAXED_IRD_NEGOTIATION && resp_ord <=1581 ep->com.dev->rdev.lldi.max_ordird_qp)1582 ep->ird = resp_ord;1583 else1584 insuff_ird = 1;1585 } else if (ep->ird > resp_ord) {1586 ep->ird = resp_ord;1587 }1588 if (ep->ord > resp_ird) {1589 if (RELAXED_IRD_NEGOTIATION)1590 ep->ord = resp_ird;1591 else1592 insuff_ird = 1;1593 }1594 if (insuff_ird) {1595 err = -ENOMEM;1596 ep->ird = resp_ord;1597 ep->ord = resp_ird;1598 }1599 1600 if (ntohs(mpa_v2_params->ird) &1601 MPA_V2_PEER2PEER_MODEL) {1602 if (ntohs(mpa_v2_params->ord) &1603 MPA_V2_RDMA_WRITE_RTR)1604 ep->mpa_attr.p2p_type =1605 FW_RI_INIT_P2PTYPE_RDMA_WRITE;1606 else if (ntohs(mpa_v2_params->ord) &1607 MPA_V2_RDMA_READ_RTR)1608 ep->mpa_attr.p2p_type =1609 FW_RI_INIT_P2PTYPE_READ_REQ;1610 }1611 }1612 } else if (mpa->revision == 1)1613 if (peer2peer)1614 ep->mpa_attr.p2p_type = p2p_type;1615 1616 pr_debug("crc_enabled=%d, recv_marker_enabled=%d, xmit_marker_enabled=%d, version=%d p2p_type=%d local-p2p_type = %d\n",1617 ep->mpa_attr.crc_enabled,1618 ep->mpa_attr.recv_marker_enabled,1619 ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version,1620 ep->mpa_attr.p2p_type, p2p_type);1621 1622 /*1623 * If responder's RTR does not match with that of initiator, assign1624 * FW_RI_INIT_P2PTYPE_DISABLED in mpa attributes so that RTR is not1625 * generated when moving QP to RTS state.1626 * A TERM message will be sent after QP has moved to RTS state1627 */1628 if ((ep->mpa_attr.version == 2) && peer2peer &&1629 (ep->mpa_attr.p2p_type != p2p_type)) {1630 ep->mpa_attr.p2p_type = FW_RI_INIT_P2PTYPE_DISABLED;1631 rtr_mismatch = 1;1632 }1633 1634 attrs.mpa_attr = ep->mpa_attr;1635 attrs.max_ird = ep->ird;1636 attrs.max_ord = ep->ord;1637 attrs.llp_stream_handle = ep;1638 attrs.next_state = C4IW_QP_STATE_RTS;1639 1640 mask = C4IW_QP_ATTR_NEXT_STATE |1641 C4IW_QP_ATTR_LLP_STREAM_HANDLE | C4IW_QP_ATTR_MPA_ATTR |1642 C4IW_QP_ATTR_MAX_IRD | C4IW_QP_ATTR_MAX_ORD;1643 1644 /* bind QP and TID with INIT_WR */1645 err = c4iw_modify_qp(ep->com.qp->rhp,1646 ep->com.qp, mask, &attrs, 1);1647 if (err)1648 goto err;1649 1650 /*1651 * If responder's RTR requirement did not match with what initiator1652 * supports, generate TERM message1653 */1654 if (rtr_mismatch) {1655 pr_err("%s: RTR mismatch, sending TERM\n", __func__);1656 attrs.layer_etype = LAYER_MPA | DDP_LLP;1657 attrs.ecode = MPA_NOMATCH_RTR;1658 attrs.next_state = C4IW_QP_STATE_TERMINATE;1659 attrs.send_term = 1;1660 err = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,1661 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);1662 err = -ENOMEM;1663 disconnect = 1;1664 goto out;1665 }1666 1667 /*1668 * Generate TERM if initiator IRD is not sufficient for responder1669 * provided ORD. Currently, we do the same behaviour even when1670 * responder provided IRD is also not sufficient as regards to1671 * initiator ORD.1672 */1673 if (insuff_ird) {1674 pr_err("%s: Insufficient IRD, sending TERM\n", __func__);1675 attrs.layer_etype = LAYER_MPA | DDP_LLP;1676 attrs.ecode = MPA_INSUFF_IRD;1677 attrs.next_state = C4IW_QP_STATE_TERMINATE;1678 attrs.send_term = 1;1679 err = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,1680 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);1681 err = -ENOMEM;1682 disconnect = 1;1683 goto out;1684 }1685 goto out;1686err_stop_timer:1687 stop_ep_timer(ep);1688err:1689 disconnect = 2;1690out:1691 connect_reply_upcall(ep, err);1692 return disconnect;1693}1694 1695/*1696 * process_mpa_request - process streaming mode MPA request1697 *1698 * Returns:1699 *1700 * 0 upon success indicating a connect request was delivered to the ULP1701 * or the mpa request is incomplete but valid so far.1702 *1703 * 1 if a failure requires the caller to close the connection.1704 *1705 * 2 if a failure requires the caller to abort the connection.1706 */1707static int process_mpa_request(struct c4iw_ep *ep, struct sk_buff *skb)1708{1709 struct mpa_message *mpa;1710 struct mpa_v2_conn_params *mpa_v2_params;1711 u16 plen;1712 1713 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1714 1715 /*1716 * If we get more than the supported amount of private data1717 * then we must fail this connection.1718 */1719 if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt))1720 goto err_stop_timer;1721 1722 pr_debug("enter (%s line %u)\n", __FILE__, __LINE__);1723 1724 /*1725 * Copy the new data into our accumulation buffer.1726 */1727 skb_copy_from_linear_data(skb, &(ep->mpa_pkt[ep->mpa_pkt_len]),1728 skb->len);1729 ep->mpa_pkt_len += skb->len;1730 1731 /*1732 * If we don't even have the mpa message, then bail.1733 * We'll continue process when more data arrives.1734 */1735 if (ep->mpa_pkt_len < sizeof(*mpa))1736 return 0;1737 1738 pr_debug("enter (%s line %u)\n", __FILE__, __LINE__);1739 mpa = (struct mpa_message *) ep->mpa_pkt;1740 1741 /*1742 * Validate MPA Header.1743 */1744 if (mpa->revision > mpa_rev) {1745 pr_err("%s MPA version mismatch. Local = %d, Received = %d\n",1746 __func__, mpa_rev, mpa->revision);1747 goto err_stop_timer;1748 }1749 1750 if (memcmp(mpa->key, MPA_KEY_REQ, sizeof(mpa->key)))1751 goto err_stop_timer;1752 1753 plen = ntohs(mpa->private_data_size);1754 1755 /*1756 * Fail if there's too much private data.1757 */1758 if (plen > MPA_MAX_PRIVATE_DATA)1759 goto err_stop_timer;1760 1761 /*1762 * If plen does not account for pkt size1763 */1764 if (ep->mpa_pkt_len > (sizeof(*mpa) + plen))1765 goto err_stop_timer;1766 ep->plen = (u8) plen;1767 1768 /*1769 * If we don't have all the pdata yet, then bail.1770 */1771 if (ep->mpa_pkt_len < (sizeof(*mpa) + plen))1772 return 0;1773 1774 /*1775 * If we get here we have accumulated the entire mpa1776 * start reply message including private data.1777 */1778 ep->mpa_attr.initiator = 0;1779 ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0;1780 ep->mpa_attr.recv_marker_enabled = markers_enabled;1781 ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0;1782 ep->mpa_attr.version = mpa->revision;1783 if (mpa->revision == 1)1784 ep->tried_with_mpa_v1 = 1;1785 ep->mpa_attr.p2p_type = FW_RI_INIT_P2PTYPE_DISABLED;1786 1787 if (mpa->revision == 2) {1788 ep->mpa_attr.enhanced_rdma_conn =1789 mpa->flags & MPA_ENHANCED_RDMA_CONN ? 1 : 0;1790 if (ep->mpa_attr.enhanced_rdma_conn) {1791 mpa_v2_params = (struct mpa_v2_conn_params *)1792 (ep->mpa_pkt + sizeof(*mpa));1793 ep->ird = ntohs(mpa_v2_params->ird) &1794 MPA_V2_IRD_ORD_MASK;1795 ep->ird = min_t(u32, ep->ird,1796 cur_max_read_depth(ep->com.dev));1797 ep->ord = ntohs(mpa_v2_params->ord) &1798 MPA_V2_IRD_ORD_MASK;1799 ep->ord = min_t(u32, ep->ord,1800 cur_max_read_depth(ep->com.dev));1801 pr_debug("initiator ird %u ord %u\n",1802 ep->ird, ep->ord);1803 if (ntohs(mpa_v2_params->ird) & MPA_V2_PEER2PEER_MODEL)1804 if (peer2peer) {1805 if (ntohs(mpa_v2_params->ord) &1806 MPA_V2_RDMA_WRITE_RTR)1807 ep->mpa_attr.p2p_type =1808 FW_RI_INIT_P2PTYPE_RDMA_WRITE;1809 else if (ntohs(mpa_v2_params->ord) &1810 MPA_V2_RDMA_READ_RTR)1811 ep->mpa_attr.p2p_type =1812 FW_RI_INIT_P2PTYPE_READ_REQ;1813 }1814 }1815 } else if (mpa->revision == 1)1816 if (peer2peer)1817 ep->mpa_attr.p2p_type = p2p_type;1818 1819 pr_debug("crc_enabled=%d, recv_marker_enabled=%d, xmit_marker_enabled=%d, version=%d p2p_type=%d\n",1820 ep->mpa_attr.crc_enabled, ep->mpa_attr.recv_marker_enabled,1821 ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version,1822 ep->mpa_attr.p2p_type);1823 1824 __state_set(&ep->com, MPA_REQ_RCVD);1825 1826 /* drive upcall */1827 mutex_lock_nested(&ep->parent_ep->com.mutex, SINGLE_DEPTH_NESTING);1828 if (ep->parent_ep->com.state != DEAD) {1829 if (connect_request_upcall(ep))1830 goto err_unlock_parent;1831 } else {1832 goto err_unlock_parent;1833 }1834 mutex_unlock(&ep->parent_ep->com.mutex);1835 return 0;1836 1837err_unlock_parent:1838 mutex_unlock(&ep->parent_ep->com.mutex);1839 goto err_out;1840err_stop_timer:1841 (void)stop_ep_timer(ep);1842err_out:1843 return 2;1844}1845 1846static int rx_data(struct c4iw_dev *dev, struct sk_buff *skb)1847{1848 struct c4iw_ep *ep;1849 struct cpl_rx_data *hdr = cplhdr(skb);1850 unsigned int dlen = ntohs(hdr->len);1851 unsigned int tid = GET_TID(hdr);1852 __u8 status = hdr->status;1853 int disconnect = 0;1854 1855 ep = get_ep_from_tid(dev, tid);1856 if (!ep)1857 return 0;1858 pr_debug("ep %p tid %u dlen %u\n", ep, ep->hwtid, dlen);1859 skb_pull(skb, sizeof(*hdr));1860 skb_trim(skb, dlen);1861 mutex_lock(&ep->com.mutex);1862 1863 switch (ep->com.state) {1864 case MPA_REQ_SENT:1865 update_rx_credits(ep, dlen);1866 ep->rcv_seq += dlen;1867 disconnect = process_mpa_reply(ep, skb);1868 break;1869 case MPA_REQ_WAIT:1870 update_rx_credits(ep, dlen);1871 ep->rcv_seq += dlen;1872 disconnect = process_mpa_request(ep, skb);1873 break;1874 case FPDU_MODE: {1875 struct c4iw_qp_attributes attrs;1876 1877 update_rx_credits(ep, dlen);1878 if (status)1879 pr_err("%s Unexpected streaming data." \1880 " qpid %u ep %p state %d tid %u status %d\n",1881 __func__, ep->com.qp->wq.sq.qid, ep,1882 ep->com.state, ep->hwtid, status);1883 attrs.next_state = C4IW_QP_STATE_TERMINATE;1884 c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,1885 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);1886 disconnect = 1;1887 break;1888 }1889 default:1890 break;1891 }1892 mutex_unlock(&ep->com.mutex);1893 if (disconnect)1894 c4iw_ep_disconnect(ep, disconnect == 2, GFP_KERNEL);1895 c4iw_put_ep(&ep->com);1896 return 0;1897}1898 1899static void complete_cached_srq_buffers(struct c4iw_ep *ep, u32 srqidx)1900{1901 enum chip_type adapter_type;1902 1903 adapter_type = ep->com.dev->rdev.lldi.adapter_type;1904 1905 /*1906 * If this TCB had a srq buffer cached, then we must complete1907 * it. For user mode, that means saving the srqidx in the1908 * user/kernel status page for this qp. For kernel mode, just1909 * synthesize the CQE now.1910 */1911 if (CHELSIO_CHIP_VERSION(adapter_type) > CHELSIO_T5 && srqidx) {1912 if (ep->com.qp->ibqp.uobject)1913 t4_set_wq_in_error(&ep->com.qp->wq, srqidx);1914 else1915 c4iw_flush_srqidx(ep->com.qp, srqidx);1916 }1917}1918 1919static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb)1920{1921 u32 srqidx;1922 struct c4iw_ep *ep;1923 struct cpl_abort_rpl_rss6 *rpl = cplhdr(skb);1924 int release = 0;1925 unsigned int tid = GET_TID(rpl);1926 1927 ep = get_ep_from_tid(dev, tid);1928 if (!ep) {1929 pr_warn("Abort rpl to freed endpoint\n");1930 return 0;1931 }1932 1933 if (ep->com.qp && ep->com.qp->srq) {1934 srqidx = ABORT_RSS_SRQIDX_G(be32_to_cpu(rpl->srqidx_status));1935 complete_cached_srq_buffers(ep, srqidx ? srqidx : ep->srqe_idx);1936 }1937 1938 pr_debug("ep %p tid %u\n", ep, ep->hwtid);1939 mutex_lock(&ep->com.mutex);1940 switch (ep->com.state) {1941 case ABORTING:1942 c4iw_wake_up_noref(ep->com.wr_waitp, -ECONNRESET);1943 __state_set(&ep->com, DEAD);1944 release = 1;1945 break;1946 default:1947 pr_err("%s ep %p state %d\n", __func__, ep, ep->com.state);1948 break;1949 }1950 mutex_unlock(&ep->com.mutex);1951 1952 if (release) {1953 close_complete_upcall(ep, -ECONNRESET);1954 release_ep_resources(ep);1955 }1956 c4iw_put_ep(&ep->com);1957 return 0;1958}1959 1960static int send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid)1961{1962 struct sk_buff *skb;1963 struct fw_ofld_connection_wr *req;1964 unsigned int mtu_idx;1965 u32 wscale;1966 struct sockaddr_in *sin;1967 int win;1968 1969 skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);1970 if (!skb)1971 return -ENOMEM;1972 1973 req = __skb_put_zero(skb, sizeof(*req));1974 req->op_compl = htonl(WR_OP_V(FW_OFLD_CONNECTION_WR));1975 req->len16_pkd = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*req), 16)));1976 req->le.filter = cpu_to_be32(cxgb4_select_ntuple(1977 ep->com.dev->rdev.lldi.ports[0],1978 ep->l2t));1979 sin = (struct sockaddr_in *)&ep->com.local_addr;1980 req->le.lport = sin->sin_port;1981 req->le.u.ipv4.lip = sin->sin_addr.s_addr;1982 sin = (struct sockaddr_in *)&ep->com.remote_addr;1983 req->le.pport = sin->sin_port;1984 req->le.u.ipv4.pip = sin->sin_addr.s_addr;1985 req->tcb.t_state_to_astid =1986 htonl(FW_OFLD_CONNECTION_WR_T_STATE_V(TCP_SYN_SENT) |1987 FW_OFLD_CONNECTION_WR_ASTID_V(atid));1988 req->tcb.cplrxdataack_cplpassacceptrpl =1989 htons(FW_OFLD_CONNECTION_WR_CPLRXDATAACK_F);1990 req->tcb.tx_max = (__force __be32) jiffies;1991 req->tcb.rcv_adv = htons(1);1992 cxgb_best_mtu(ep->com.dev->rdev.lldi.mtus, ep->mtu, &mtu_idx,1993 enable_tcp_timestamps,1994 (ep->com.remote_addr.ss_family == AF_INET) ? 0 : 1);1995 wscale = cxgb_compute_wscale(rcv_win);1996 1997 /*1998 * Specify the largest window that will fit in opt0. The1999 * remainder will be specified in the rx_data_ack.2000 */2001 win = ep->rcv_win >> 10;2002 if (win > RCV_BUFSIZ_M)2003 win = RCV_BUFSIZ_M;2004 2005 req->tcb.opt0 = (__force __be64) (TCAM_BYPASS_F |2006 (nocong ? NO_CONG_F : 0) |2007 KEEP_ALIVE_F |2008 DELACK_F |2009 WND_SCALE_V(wscale) |2010 MSS_IDX_V(mtu_idx) |2011 L2T_IDX_V(ep->l2t->idx) |2012 TX_CHAN_V(ep->tx_chan) |2013 SMAC_SEL_V(ep->smac_idx) |2014 DSCP_V(ep->tos >> 2) |2015 ULP_MODE_V(ULP_MODE_TCPDDP) |2016 RCV_BUFSIZ_V(win));2017 req->tcb.opt2 = (__force __be32) (PACE_V(1) |2018 TX_QUEUE_V(ep->com.dev->rdev.lldi.tx_modq[ep->tx_chan]) |2019 RX_CHANNEL_V(0) |2020 CCTRL_ECN_V(enable_ecn) |2021 RSS_QUEUE_VALID_F | RSS_QUEUE_V(ep->rss_qid));2022 if (enable_tcp_timestamps)2023 req->tcb.opt2 |= (__force __be32)TSTAMPS_EN_F;2024 if (enable_tcp_sack)2025 req->tcb.opt2 |= (__force __be32)SACK_EN_F;2026 if (wscale && enable_tcp_window_scaling)2027 req->tcb.opt2 |= (__force __be32)WND_SCALE_EN_F;2028 req->tcb.opt0 = cpu_to_be64((__force u64)req->tcb.opt0);2029 req->tcb.opt2 = cpu_to_be32((__force u32)req->tcb.opt2);2030 set_wr_txq(skb, CPL_PRIORITY_CONTROL, ep->ctrlq_idx);2031 set_bit(ACT_OFLD_CONN, &ep->com.history);2032 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);2033}2034 2035/*2036 * Some of the error codes above implicitly indicate that there is no TID2037 * allocated with the result of an ACT_OPEN. We use this predicate to make2038 * that explicit.2039 */2040static inline int act_open_has_tid(int status)2041{2042 return (status != CPL_ERR_TCAM_PARITY &&2043 status != CPL_ERR_TCAM_MISS &&2044 status != CPL_ERR_TCAM_FULL &&2045 status != CPL_ERR_CONN_EXIST_SYNRECV &&2046 status != CPL_ERR_CONN_EXIST);2047}2048 2049static char *neg_adv_str(unsigned int status)2050{2051 switch (status) {2052 case CPL_ERR_RTX_NEG_ADVICE:2053 return "Retransmit timeout";2054 case CPL_ERR_PERSIST_NEG_ADVICE:2055 return "Persist timeout";2056 case CPL_ERR_KEEPALV_NEG_ADVICE:2057 return "Keepalive timeout";2058 default:2059 return "Unknown";2060 }2061}2062 2063static void set_tcp_window(struct c4iw_ep *ep, struct port_info *pi)2064{2065 ep->snd_win = snd_win;2066 ep->rcv_win = rcv_win;2067 pr_debug("snd_win %d rcv_win %d\n",2068 ep->snd_win, ep->rcv_win);2069}2070 2071#define ACT_OPEN_RETRY_COUNT 22072 2073static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,2074 struct dst_entry *dst, struct c4iw_dev *cdev,2075 bool clear_mpa_v1, enum chip_type adapter_type, u8 tos)2076{2077 struct neighbour *n;2078 int err, step;2079 struct net_device *pdev;2080 2081 n = dst_neigh_lookup(dst, peer_ip);2082 if (!n)2083 return -ENODEV;2084 2085 rcu_read_lock();2086 err = -ENOMEM;2087 if (n->dev->flags & IFF_LOOPBACK) {2088 if (iptype == 4)2089 pdev = __ip_dev_find(&init_net, *(__be32 *)peer_ip, false);2090 else if (IS_ENABLED(CONFIG_IPV6))2091 for_each_netdev(&init_net, pdev) {2092 if (ipv6_chk_addr(&init_net,2093 (struct in6_addr *)peer_ip,2094 pdev, 1))2095 break;2096 }2097 else2098 pdev = NULL;2099 2100 if (!pdev) {2101 err = -ENODEV;2102 goto out;2103 }2104 if (is_vlan_dev(pdev))2105 pdev = vlan_dev_real_dev(pdev);2106 ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,2107 n, pdev, rt_tos2priority(tos));2108 if (!ep->l2t)2109 goto out;2110 ep->mtu = pdev->mtu;2111 ep->tx_chan = cxgb4_port_chan(pdev);2112 ep->smac_idx = ((struct port_info *)netdev_priv(pdev))->smt_idx;2113 step = cdev->rdev.lldi.ntxq /2114 cdev->rdev.lldi.nchan;2115 ep->txq_idx = cxgb4_port_idx(pdev) * step;2116 step = cdev->rdev.lldi.nrxq /2117 cdev->rdev.lldi.nchan;2118 ep->ctrlq_idx = cxgb4_port_idx(pdev);2119 ep->rss_qid = cdev->rdev.lldi.rxq_ids[2120 cxgb4_port_idx(pdev) * step];2121 set_tcp_window(ep, (struct port_info *)netdev_priv(pdev));2122 } else {2123 pdev = get_real_dev(n->dev);2124 ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,2125 n, pdev, rt_tos2priority(tos));2126 if (!ep->l2t)2127 goto out;2128 ep->mtu = dst_mtu(dst);2129 ep->tx_chan = cxgb4_port_chan(pdev);2130 ep->smac_idx = ((struct port_info *)netdev_priv(pdev))->smt_idx;2131 step = cdev->rdev.lldi.ntxq /2132 cdev->rdev.lldi.nchan;2133 ep->txq_idx = cxgb4_port_idx(pdev) * step;2134 ep->ctrlq_idx = cxgb4_port_idx(pdev);2135 step = cdev->rdev.lldi.nrxq /2136 cdev->rdev.lldi.nchan;2137 ep->rss_qid = cdev->rdev.lldi.rxq_ids[2138 cxgb4_port_idx(pdev) * step];2139 set_tcp_window(ep, (struct port_info *)netdev_priv(pdev));2140 2141 if (clear_mpa_v1) {2142 ep->retry_with_mpa_v1 = 0;2143 ep->tried_with_mpa_v1 = 0;2144 }2145 }2146 err = 0;2147out:2148 rcu_read_unlock();2149 2150 neigh_release(n);2151 2152 return err;2153}2154 2155static int c4iw_reconnect(struct c4iw_ep *ep)2156{2157 int err = 0;2158 int size = 0;2159 struct sockaddr_in *laddr = (struct sockaddr_in *)2160 &ep->com.cm_id->m_local_addr;2161 struct sockaddr_in *raddr = (struct sockaddr_in *)2162 &ep->com.cm_id->m_remote_addr;2163 struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)2164 &ep->com.cm_id->m_local_addr;2165 struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)2166 &ep->com.cm_id->m_remote_addr;2167 int iptype;2168 __u8 *ra;2169 2170 pr_debug("qp %p cm_id %p\n", ep->com.qp, ep->com.cm_id);2171 c4iw_init_wr_wait(ep->com.wr_waitp);2172 2173 /* When MPA revision is different on nodes, the node with MPA_rev=22174 * tries to reconnect with MPA_rev 1 for the same EP through2175 * c4iw_reconnect(), where the same EP is assigned with new tid for2176 * further connection establishment. As we are using the same EP pointer2177 * for reconnect, few skbs are used during the previous c4iw_connect(),2178 * which leaves the EP with inadequate skbs for further2179 * c4iw_reconnect(), Further causing a crash due to an empty2180 * skb_list() during peer_abort(). Allocate skbs which is already used.2181 */2182 size = (CN_MAX_CON_BUF - skb_queue_len(&ep->com.ep_skb_list));2183 if (alloc_ep_skb_list(&ep->com.ep_skb_list, size)) {2184 err = -ENOMEM;2185 goto fail1;2186 }2187 2188 /*2189 * Allocate an active TID to initiate a TCP connection.2190 */2191 ep->atid = cxgb4_alloc_atid(ep->com.dev->rdev.lldi.tids, ep);2192 if (ep->atid == -1) {2193 pr_err("%s - cannot alloc atid\n", __func__);2194 err = -ENOMEM;2195 goto fail2;2196 }2197 err = xa_insert_irq(&ep->com.dev->atids, ep->atid, ep, GFP_KERNEL);2198 if (err)2199 goto fail2a;2200 2201 /* find a route */2202 if (ep->com.cm_id->m_local_addr.ss_family == AF_INET) {2203 ep->dst = cxgb_find_route(&ep->com.dev->rdev.lldi, get_real_dev,2204 laddr->sin_addr.s_addr,2205 raddr->sin_addr.s_addr,2206 laddr->sin_port,2207 raddr->sin_port, ep->com.cm_id->tos);2208 iptype = 4;2209 ra = (__u8 *)&raddr->sin_addr;2210 } else {2211 ep->dst = cxgb_find_route6(&ep->com.dev->rdev.lldi,2212 get_real_dev,2213 laddr6->sin6_addr.s6_addr,2214 raddr6->sin6_addr.s6_addr,2215 laddr6->sin6_port,2216 raddr6->sin6_port,2217 ep->com.cm_id->tos,2218 raddr6->sin6_scope_id);2219 iptype = 6;2220 ra = (__u8 *)&raddr6->sin6_addr;2221 }2222 if (!ep->dst) {2223 pr_err("%s - cannot find route\n", __func__);2224 err = -EHOSTUNREACH;2225 goto fail3;2226 }2227 err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, false,2228 ep->com.dev->rdev.lldi.adapter_type,2229 ep->com.cm_id->tos);2230 if (err) {2231 pr_err("%s - cannot alloc l2e\n", __func__);2232 goto fail4;2233 }2234 2235 pr_debug("txq_idx %u tx_chan %u smac_idx %u rss_qid %u l2t_idx %u\n",2236 ep->txq_idx, ep->tx_chan, ep->smac_idx, ep->rss_qid,2237 ep->l2t->idx);2238 2239 state_set(&ep->com, CONNECTING);2240 ep->tos = ep->com.cm_id->tos;2241 2242 /* send connect request to rnic */2243 err = send_connect(ep);2244 if (!err)2245 goto out;2246 2247 cxgb4_l2t_release(ep->l2t);2248fail4:2249 dst_release(ep->dst);2250fail3:2251 xa_erase_irq(&ep->com.dev->atids, ep->atid);2252fail2a:2253 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);2254fail2:2255 /*2256 * remember to send notification to upper layer.2257 * We are in here so the upper layer is not aware that this is2258 * re-connect attempt and so, upper layer is still waiting for2259 * response of 1st connect request.2260 */2261 connect_reply_upcall(ep, -ECONNRESET);2262fail1:2263 c4iw_put_ep(&ep->com);2264out:2265 return err;2266}2267 2268static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)2269{2270 struct c4iw_ep *ep;2271 struct cpl_act_open_rpl *rpl = cplhdr(skb);2272 unsigned int atid = TID_TID_G(AOPEN_ATID_G(2273 ntohl(rpl->atid_status)));2274 struct tid_info *t = dev->rdev.lldi.tids;2275 int status = AOPEN_STATUS_G(ntohl(rpl->atid_status));2276 struct sockaddr_in *la;2277 struct sockaddr_in *ra;2278 struct sockaddr_in6 *la6;2279 struct sockaddr_in6 *ra6;2280 int ret = 0;2281 2282 ep = lookup_atid(t, atid);2283 if (!ep)2284 return -EINVAL;2285 2286 la = (struct sockaddr_in *)&ep->com.local_addr;2287 ra = (struct sockaddr_in *)&ep->com.remote_addr;2288 la6 = (struct sockaddr_in6 *)&ep->com.local_addr;2289 ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr;2290 2291 pr_debug("ep %p atid %u status %u errno %d\n", ep, atid,2292 status, status2errno(status));2293 2294 if (cxgb_is_neg_adv(status)) {2295 pr_debug("Connection problems for atid %u status %u (%s)\n",2296 atid, status, neg_adv_str(status));2297 ep->stats.connect_neg_adv++;2298 mutex_lock(&dev->rdev.stats.lock);2299 dev->rdev.stats.neg_adv++;2300 mutex_unlock(&dev->rdev.stats.lock);2301 return 0;2302 }2303 2304 set_bit(ACT_OPEN_RPL, &ep->com.history);2305 2306 /*2307 * Log interesting failures.2308 */2309 switch (status) {2310 case CPL_ERR_CONN_RESET:2311 case CPL_ERR_CONN_TIMEDOUT:2312 break;2313 case CPL_ERR_TCAM_FULL:2314 mutex_lock(&dev->rdev.stats.lock);2315 dev->rdev.stats.tcam_full++;2316 mutex_unlock(&dev->rdev.stats.lock);2317 if (ep->com.local_addr.ss_family == AF_INET &&2318 dev->rdev.lldi.enable_fw_ofld_conn) {2319 ret = send_fw_act_open_req(ep, TID_TID_G(AOPEN_ATID_G(2320 ntohl(rpl->atid_status))));2321 if (ret)2322 goto fail;2323 return 0;2324 }2325 break;2326 case CPL_ERR_CONN_EXIST:2327 if (ep->retry_count++ < ACT_OPEN_RETRY_COUNT) {2328 set_bit(ACT_RETRY_INUSE, &ep->com.history);2329 if (ep->com.remote_addr.ss_family == AF_INET6) {2330 struct sockaddr_in6 *sin6 =2331 (struct sockaddr_in6 *)2332 &ep->com.local_addr;2333 cxgb4_clip_release(2334 ep->com.dev->rdev.lldi.ports[0],2335 (const u32 *)2336 &sin6->sin6_addr.s6_addr, 1);2337 }2338 xa_erase_irq(&ep->com.dev->atids, atid);2339 cxgb4_free_atid(t, atid);2340 dst_release(ep->dst);2341 cxgb4_l2t_release(ep->l2t);2342 c4iw_reconnect(ep);2343 return 0;2344 }2345 break;2346 default:2347 if (ep->com.local_addr.ss_family == AF_INET) {2348 pr_info("Active open failure - atid %u status %u errno %d %pI4:%u->%pI4:%u\n",2349 atid, status, status2errno(status),2350 &la->sin_addr.s_addr, ntohs(la->sin_port),2351 &ra->sin_addr.s_addr, ntohs(ra->sin_port));2352 } else {2353 pr_info("Active open failure - atid %u status %u errno %d %pI6:%u->%pI6:%u\n",2354 atid, status, status2errno(status),2355 la6->sin6_addr.s6_addr, ntohs(la6->sin6_port),2356 ra6->sin6_addr.s6_addr, ntohs(ra6->sin6_port));2357 }2358 break;2359 }2360 2361fail:2362 connect_reply_upcall(ep, status2errno(status));2363 state_set(&ep->com, DEAD);2364 2365 if (ep->com.remote_addr.ss_family == AF_INET6) {2366 struct sockaddr_in6 *sin6 =2367 (struct sockaddr_in6 *)&ep->com.local_addr;2368 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],2369 (const u32 *)&sin6->sin6_addr.s6_addr, 1);2370 }2371 if (status && act_open_has_tid(status))2372 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, GET_TID(rpl),2373 ep->com.local_addr.ss_family);2374 2375 xa_erase_irq(&ep->com.dev->atids, atid);2376 cxgb4_free_atid(t, atid);2377 dst_release(ep->dst);2378 cxgb4_l2t_release(ep->l2t);2379 c4iw_put_ep(&ep->com);2380 2381 return 0;2382}2383 2384static int pass_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)2385{2386 struct cpl_pass_open_rpl *rpl = cplhdr(skb);2387 unsigned int stid = GET_TID(rpl);2388 struct c4iw_listen_ep *ep = get_ep_from_stid(dev, stid);2389 2390 if (!ep) {2391 pr_warn("%s stid %d lookup failure!\n", __func__, stid);2392 goto out;2393 }2394 pr_debug("ep %p status %d error %d\n", ep,2395 rpl->status, status2errno(rpl->status));2396 c4iw_wake_up_noref(ep->com.wr_waitp, status2errno(rpl->status));2397 c4iw_put_ep(&ep->com);2398out:2399 return 0;2400}2401 2402static int close_listsrv_rpl(struct c4iw_dev *dev, struct sk_buff *skb)2403{2404 struct cpl_close_listsvr_rpl *rpl = cplhdr(skb);2405 unsigned int stid = GET_TID(rpl);2406 struct c4iw_listen_ep *ep = get_ep_from_stid(dev, stid);2407 2408 if (!ep) {2409 pr_warn("%s stid %d lookup failure!\n", __func__, stid);2410 goto out;2411 }2412 pr_debug("ep %p\n", ep);2413 c4iw_wake_up_noref(ep->com.wr_waitp, status2errno(rpl->status));2414 c4iw_put_ep(&ep->com);2415out:2416 return 0;2417}2418 2419static int accept_cr(struct c4iw_ep *ep, struct sk_buff *skb,2420 struct cpl_pass_accept_req *req)2421{2422 struct cpl_pass_accept_rpl *rpl;2423 unsigned int mtu_idx;2424 u64 opt0;2425 u32 opt2;2426 u32 wscale;2427 struct cpl_t5_pass_accept_rpl *rpl5 = NULL;2428 int win;2429 enum chip_type adapter_type = ep->com.dev->rdev.lldi.adapter_type;2430 2431 pr_debug("ep %p tid %u\n", ep, ep->hwtid);2432 cxgb_best_mtu(ep->com.dev->rdev.lldi.mtus, ep->mtu, &mtu_idx,2433 enable_tcp_timestamps && req->tcpopt.tstamp,2434 (ep->com.remote_addr.ss_family == AF_INET) ? 0 : 1);2435 wscale = cxgb_compute_wscale(rcv_win);2436 2437 /*2438 * Specify the largest window that will fit in opt0. The2439 * remainder will be specified in the rx_data_ack.2440 */2441 win = ep->rcv_win >> 10;2442 if (win > RCV_BUFSIZ_M)2443 win = RCV_BUFSIZ_M;2444 opt0 = (nocong ? NO_CONG_F : 0) |2445 KEEP_ALIVE_F |2446 DELACK_F |2447 WND_SCALE_V(wscale) |2448 MSS_IDX_V(mtu_idx) |2449 L2T_IDX_V(ep->l2t->idx) |2450 TX_CHAN_V(ep->tx_chan) |2451 SMAC_SEL_V(ep->smac_idx) |2452 DSCP_V(ep->tos >> 2) |2453 ULP_MODE_V(ULP_MODE_TCPDDP) |2454 RCV_BUFSIZ_V(win);2455 opt2 = RX_CHANNEL_V(0) |2456 RSS_QUEUE_VALID_F | RSS_QUEUE_V(ep->rss_qid);2457 2458 if (enable_tcp_timestamps && req->tcpopt.tstamp)2459 opt2 |= TSTAMPS_EN_F;2460 if (enable_tcp_sack && req->tcpopt.sack)2461 opt2 |= SACK_EN_F;2462 if (wscale && enable_tcp_window_scaling)2463 opt2 |= WND_SCALE_EN_F;2464 if (enable_ecn) {2465 const struct tcphdr *tcph;2466 u32 hlen = ntohl(req->hdr_len);2467 2468 if (CHELSIO_CHIP_VERSION(adapter_type) <= CHELSIO_T5)2469 tcph = (const void *)(req + 1) + ETH_HDR_LEN_G(hlen) +2470 IP_HDR_LEN_G(hlen);2471 else2472 tcph = (const void *)(req + 1) +2473 T6_ETH_HDR_LEN_G(hlen) + T6_IP_HDR_LEN_G(hlen);2474 if (tcph->ece && tcph->cwr)2475 opt2 |= CCTRL_ECN_V(1);2476 }2477 2478 if (!is_t4(adapter_type)) {2479 u32 isn = (get_random_u32() & ~7UL) - 1;2480 2481 skb = get_skb(skb, roundup(sizeof(*rpl5), 16), GFP_KERNEL);2482 rpl5 = __skb_put_zero(skb, roundup(sizeof(*rpl5), 16));2483 rpl = (void *)rpl5;2484 INIT_TP_WR_CPL(rpl5, CPL_PASS_ACCEPT_RPL, ep->hwtid);2485 opt2 |= T5_OPT_2_VALID_F;2486 opt2 |= CONG_CNTRL_V(CONG_ALG_TAHOE);2487 opt2 |= T5_ISS_F;2488 if (peer2peer)2489 isn += 4;2490 rpl5->iss = cpu_to_be32(isn);2491 pr_debug("iss %u\n", be32_to_cpu(rpl5->iss));2492 } else {2493 skb = get_skb(skb, sizeof(*rpl), GFP_KERNEL);2494 rpl = __skb_put_zero(skb, sizeof(*rpl));2495 INIT_TP_WR_CPL(rpl, CPL_PASS_ACCEPT_RPL, ep->hwtid);2496 }2497 2498 rpl->opt0 = cpu_to_be64(opt0);2499 rpl->opt2 = cpu_to_be32(opt2);2500 set_wr_txq(skb, CPL_PRIORITY_SETUP, ep->ctrlq_idx);2501 t4_set_arp_err_handler(skb, ep, pass_accept_rpl_arp_failure);2502 2503 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);2504}2505 2506static void reject_cr(struct c4iw_dev *dev, u32 hwtid, struct sk_buff *skb)2507{2508 pr_debug("c4iw_dev %p tid %u\n", dev, hwtid);2509 skb_trim(skb, sizeof(struct cpl_tid_release));2510 release_tid(&dev->rdev, hwtid, skb);2511 return;2512}2513 2514static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)2515{2516 struct c4iw_ep *child_ep = NULL, *parent_ep;2517 struct cpl_pass_accept_req *req = cplhdr(skb);2518 unsigned int stid = PASS_OPEN_TID_G(ntohl(req->tos_stid));2519 struct tid_info *t = dev->rdev.lldi.tids;2520 unsigned int hwtid = GET_TID(req);2521 struct dst_entry *dst;2522 __u8 local_ip[16], peer_ip[16];2523 __be16 local_port, peer_port;2524 struct sockaddr_in6 *sin6;2525 int err;2526 u16 peer_mss = ntohs(req->tcpopt.mss);2527 int iptype;2528 unsigned short hdrs;2529 u8 tos;2530 2531 parent_ep = (struct c4iw_ep *)get_ep_from_stid(dev, stid);2532 if (!parent_ep) {2533 pr_err("%s connect request on invalid stid %d\n",2534 __func__, stid);2535 goto reject;2536 }2537 2538 if (state_read(&parent_ep->com) != LISTEN) {2539 pr_err("%s - listening ep not in LISTEN\n", __func__);2540 goto reject;2541 }2542 2543 if (parent_ep->com.cm_id->tos_set)2544 tos = parent_ep->com.cm_id->tos;2545 else2546 tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid));2547 2548 cxgb_get_4tuple(req, parent_ep->com.dev->rdev.lldi.adapter_type,2549 &iptype, local_ip, peer_ip, &local_port, &peer_port);2550 2551 /* Find output route */2552 if (iptype == 4) {2553 pr_debug("parent ep %p hwtid %u laddr %pI4 raddr %pI4 lport %d rport %d peer_mss %d\n"2554 , parent_ep, hwtid,2555 local_ip, peer_ip, ntohs(local_port),2556 ntohs(peer_port), peer_mss);2557 dst = cxgb_find_route(&dev->rdev.lldi, get_real_dev,2558 *(__be32 *)local_ip, *(__be32 *)peer_ip,2559 local_port, peer_port, tos);2560 } else {2561 pr_debug("parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n"2562 , parent_ep, hwtid,2563 local_ip, peer_ip, ntohs(local_port),2564 ntohs(peer_port), peer_mss);2565 dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev,2566 local_ip, peer_ip, local_port, peer_port,2567 tos,2568 ((struct sockaddr_in6 *)2569 &parent_ep->com.local_addr)->sin6_scope_id);2570 }2571 if (!dst) {2572 pr_err("%s - failed to find dst entry!\n", __func__);2573 goto reject;2574 }2575 2576 child_ep = alloc_ep(sizeof(*child_ep), GFP_KERNEL);2577 if (!child_ep) {2578 pr_err("%s - failed to allocate ep entry!\n", __func__);2579 dst_release(dst);2580 goto reject;2581 }2582 2583 err = import_ep(child_ep, iptype, peer_ip, dst, dev, false,2584 parent_ep->com.dev->rdev.lldi.adapter_type, tos);2585 if (err) {2586 pr_err("%s - failed to allocate l2t entry!\n", __func__);2587 dst_release(dst);2588 kfree(child_ep);2589 goto reject;2590 }2591 2592 hdrs = ((iptype == 4) ? sizeof(struct iphdr) : sizeof(struct ipv6hdr)) +2593 sizeof(struct tcphdr) +2594 ((enable_tcp_timestamps && req->tcpopt.tstamp) ? 12 : 0);2595 if (peer_mss && child_ep->mtu > (peer_mss + hdrs))2596 child_ep->mtu = peer_mss + hdrs;2597 2598 skb_queue_head_init(&child_ep->com.ep_skb_list);2599 if (alloc_ep_skb_list(&child_ep->com.ep_skb_list, CN_MAX_CON_BUF))2600 goto fail;2601 2602 state_set(&child_ep->com, CONNECTING);2603 child_ep->com.dev = dev;2604 child_ep->com.cm_id = NULL;2605 2606 if (iptype == 4) {2607 struct sockaddr_in *sin = (struct sockaddr_in *)2608 &child_ep->com.local_addr;2609 2610 sin->sin_family = AF_INET;2611 sin->sin_port = local_port;2612 sin->sin_addr.s_addr = *(__be32 *)local_ip;2613 2614 sin = (struct sockaddr_in *)&child_ep->com.local_addr;2615 sin->sin_family = AF_INET;2616 sin->sin_port = ((struct sockaddr_in *)2617 &parent_ep->com.local_addr)->sin_port;2618 sin->sin_addr.s_addr = *(__be32 *)local_ip;2619 2620 sin = (struct sockaddr_in *)&child_ep->com.remote_addr;2621 sin->sin_family = AF_INET;2622 sin->sin_port = peer_port;2623 sin->sin_addr.s_addr = *(__be32 *)peer_ip;2624 } else {2625 sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr;2626 sin6->sin6_family = PF_INET6;2627 sin6->sin6_port = local_port;2628 memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);2629 2630 sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr;2631 sin6->sin6_family = PF_INET6;2632 sin6->sin6_port = ((struct sockaddr_in6 *)2633 &parent_ep->com.local_addr)->sin6_port;2634 memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);2635 2636 sin6 = (struct sockaddr_in6 *)&child_ep->com.remote_addr;2637 sin6->sin6_family = PF_INET6;2638 sin6->sin6_port = peer_port;2639 memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16);2640 }2641 2642 c4iw_get_ep(&parent_ep->com);2643 child_ep->parent_ep = parent_ep;2644 child_ep->tos = tos;2645 child_ep->dst = dst;2646 child_ep->hwtid = hwtid;2647 2648 pr_debug("tx_chan %u smac_idx %u rss_qid %u\n",2649 child_ep->tx_chan, child_ep->smac_idx, child_ep->rss_qid);2650 2651 timer_setup(&child_ep->timer, ep_timeout, 0);2652 cxgb4_insert_tid(t, child_ep, hwtid,2653 child_ep->com.local_addr.ss_family);2654 insert_ep_tid(child_ep);2655 if (accept_cr(child_ep, skb, req)) {2656 c4iw_put_ep(&parent_ep->com);2657 release_ep_resources(child_ep);2658 } else {2659 set_bit(PASS_ACCEPT_REQ, &child_ep->com.history);2660 }2661 if (iptype == 6) {2662 sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr;2663 cxgb4_clip_get(child_ep->com.dev->rdev.lldi.ports[0],2664 (const u32 *)&sin6->sin6_addr.s6_addr, 1);2665 }2666 goto out;2667fail:2668 c4iw_put_ep(&child_ep->com);2669reject:2670 reject_cr(dev, hwtid, skb);2671out:2672 if (parent_ep)2673 c4iw_put_ep(&parent_ep->com);2674 return 0;2675}2676 2677static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb)2678{2679 struct c4iw_ep *ep;2680 struct cpl_pass_establish *req = cplhdr(skb);2681 unsigned int tid = GET_TID(req);2682 int ret;2683 u16 tcp_opt = ntohs(req->tcp_opt);2684 2685 ep = get_ep_from_tid(dev, tid);2686 if (!ep)2687 return 0;2688 2689 pr_debug("ep %p tid %u\n", ep, ep->hwtid);2690 ep->snd_seq = be32_to_cpu(req->snd_isn);2691 ep->rcv_seq = be32_to_cpu(req->rcv_isn);2692 ep->snd_wscale = TCPOPT_SND_WSCALE_G(tcp_opt);2693 2694 pr_debug("ep %p hwtid %u tcp_opt 0x%02x\n", ep, tid, tcp_opt);2695 2696 set_emss(ep, tcp_opt);2697 2698 dst_confirm(ep->dst);2699 mutex_lock(&ep->com.mutex);2700 ep->com.state = MPA_REQ_WAIT;2701 start_ep_timer(ep);2702 set_bit(PASS_ESTAB, &ep->com.history);2703 ret = send_flowc(ep);2704 mutex_unlock(&ep->com.mutex);2705 if (ret)2706 c4iw_ep_disconnect(ep, 1, GFP_KERNEL);2707 c4iw_put_ep(&ep->com);2708 2709 return 0;2710}2711 2712static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb)2713{2714 struct cpl_peer_close *hdr = cplhdr(skb);2715 struct c4iw_ep *ep;2716 struct c4iw_qp_attributes attrs;2717 int disconnect = 1;2718 int release = 0;2719 unsigned int tid = GET_TID(hdr);2720 int ret;2721 2722 ep = get_ep_from_tid(dev, tid);2723 if (!ep)2724 return 0;2725 2726 pr_debug("ep %p tid %u\n", ep, ep->hwtid);2727 dst_confirm(ep->dst);2728 2729 set_bit(PEER_CLOSE, &ep->com.history);2730 mutex_lock(&ep->com.mutex);2731 switch (ep->com.state) {2732 case MPA_REQ_WAIT:2733 __state_set(&ep->com, CLOSING);2734 break;2735 case MPA_REQ_SENT:2736 __state_set(&ep->com, CLOSING);2737 connect_reply_upcall(ep, -ECONNRESET);2738 break;2739 case MPA_REQ_RCVD:2740 2741 /*2742 * We're gonna mark this puppy DEAD, but keep2743 * the reference on it until the ULP accepts or2744 * rejects the CR. Also wake up anyone waiting2745 * in rdma connection migration (see c4iw_accept_cr()).2746 */2747 __state_set(&ep->com, CLOSING);2748 pr_debug("waking up ep %p tid %u\n", ep, ep->hwtid);2749 c4iw_wake_up_noref(ep->com.wr_waitp, -ECONNRESET);2750 break;2751 case MPA_REP_SENT:2752 __state_set(&ep->com, CLOSING);2753 pr_debug("waking up ep %p tid %u\n", ep, ep->hwtid);2754 c4iw_wake_up_noref(ep->com.wr_waitp, -ECONNRESET);2755 break;2756 case FPDU_MODE:2757 start_ep_timer(ep);2758 __state_set(&ep->com, CLOSING);2759 attrs.next_state = C4IW_QP_STATE_CLOSING;2760 ret = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,2761 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);2762 if (ret != -ECONNRESET) {2763 peer_close_upcall(ep);2764 disconnect = 1;2765 }2766 break;2767 case ABORTING:2768 disconnect = 0;2769 break;2770 case CLOSING:2771 __state_set(&ep->com, MORIBUND);2772 disconnect = 0;2773 break;2774 case MORIBUND:2775 (void)stop_ep_timer(ep);2776 if (ep->com.cm_id && ep->com.qp) {2777 attrs.next_state = C4IW_QP_STATE_IDLE;2778 c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,2779 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);2780 }2781 close_complete_upcall(ep, 0);2782 __state_set(&ep->com, DEAD);2783 release = 1;2784 disconnect = 0;2785 break;2786 case DEAD:2787 disconnect = 0;2788 break;2789 default:2790 WARN_ONCE(1, "Bad endpoint state %u\n", ep->com.state);2791 }2792 mutex_unlock(&ep->com.mutex);2793 if (disconnect)2794 c4iw_ep_disconnect(ep, 0, GFP_KERNEL);2795 if (release)2796 release_ep_resources(ep);2797 c4iw_put_ep(&ep->com);2798 return 0;2799}2800 2801static void finish_peer_abort(struct c4iw_dev *dev, struct c4iw_ep *ep)2802{2803 complete_cached_srq_buffers(ep, ep->srqe_idx);2804 if (ep->com.cm_id && ep->com.qp) {2805 struct c4iw_qp_attributes attrs;2806 2807 attrs.next_state = C4IW_QP_STATE_ERROR;2808 c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,2809 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);2810 }2811 peer_abort_upcall(ep);2812 release_ep_resources(ep);2813 c4iw_put_ep(&ep->com);2814}2815 2816static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)2817{2818 struct cpl_abort_req_rss6 *req = cplhdr(skb);2819 struct c4iw_ep *ep;2820 struct sk_buff *rpl_skb;2821 struct c4iw_qp_attributes attrs;2822 int ret;2823 int release = 0;2824 unsigned int tid = GET_TID(req);2825 u8 status;2826 u32 srqidx;2827 2828 u32 len = roundup(sizeof(struct cpl_abort_rpl), 16);2829 2830 ep = get_ep_from_tid(dev, tid);2831 if (!ep)2832 return 0;2833 2834 status = ABORT_RSS_STATUS_G(be32_to_cpu(req->srqidx_status));2835 2836 if (cxgb_is_neg_adv(status)) {2837 pr_debug("Negative advice on abort- tid %u status %d (%s)\n",2838 ep->hwtid, status, neg_adv_str(status));2839 ep->stats.abort_neg_adv++;2840 mutex_lock(&dev->rdev.stats.lock);2841 dev->rdev.stats.neg_adv++;2842 mutex_unlock(&dev->rdev.stats.lock);2843 goto deref_ep;2844 }2845 2846 pr_debug("ep %p tid %u state %u\n", ep, ep->hwtid,2847 ep->com.state);2848 set_bit(PEER_ABORT, &ep->com.history);2849 2850 /*2851 * Wake up any threads in rdma_init() or rdma_fini().2852 * However, this is not needed if com state is just2853 * MPA_REQ_SENT2854 */2855 if (ep->com.state != MPA_REQ_SENT)2856 c4iw_wake_up_noref(ep->com.wr_waitp, -ECONNRESET);2857 2858 mutex_lock(&ep->com.mutex);2859 switch (ep->com.state) {2860 case CONNECTING:2861 c4iw_put_ep(&ep->parent_ep->com);2862 break;2863 case MPA_REQ_WAIT:2864 (void)stop_ep_timer(ep);2865 break;2866 case MPA_REQ_SENT:2867 (void)stop_ep_timer(ep);2868 if (status != CPL_ERR_CONN_RESET || mpa_rev == 1 ||2869 (mpa_rev == 2 && ep->tried_with_mpa_v1))2870 connect_reply_upcall(ep, -ECONNRESET);2871 else {2872 /*2873 * we just don't send notification upwards because we2874 * want to retry with mpa_v1 without upper layers even2875 * knowing it.2876 *2877 * do some housekeeping so as to re-initiate the2878 * connection2879 */2880 pr_info("%s: mpa_rev=%d. Retrying with mpav1\n",2881 __func__, mpa_rev);2882 ep->retry_with_mpa_v1 = 1;2883 }2884 break;2885 case MPA_REP_SENT:2886 break;2887 case MPA_REQ_RCVD:2888 break;2889 case MORIBUND:2890 case CLOSING:2891 stop_ep_timer(ep);2892 fallthrough;2893 case FPDU_MODE:2894 if (ep->com.qp && ep->com.qp->srq) {2895 srqidx = ABORT_RSS_SRQIDX_G(2896 be32_to_cpu(req->srqidx_status));2897 if (srqidx) {2898 complete_cached_srq_buffers(ep, srqidx);2899 } else {2900 /* Hold ep ref until finish_peer_abort() */2901 c4iw_get_ep(&ep->com);2902 __state_set(&ep->com, ABORTING);2903 set_bit(PEER_ABORT_IN_PROGRESS, &ep->com.flags);2904 read_tcb(ep);2905 break;2906 2907 }2908 }2909 2910 if (ep->com.cm_id && ep->com.qp) {2911 attrs.next_state = C4IW_QP_STATE_ERROR;2912 ret = c4iw_modify_qp(ep->com.qp->rhp,2913 ep->com.qp, C4IW_QP_ATTR_NEXT_STATE,2914 &attrs, 1);2915 if (ret)2916 pr_err("%s - qp <- error failed!\n", __func__);2917 }2918 peer_abort_upcall(ep);2919 break;2920 case ABORTING:2921 break;2922 case DEAD:2923 pr_warn("%s PEER_ABORT IN DEAD STATE!!!!\n", __func__);2924 mutex_unlock(&ep->com.mutex);2925 goto deref_ep;2926 default:2927 WARN_ONCE(1, "Bad endpoint state %u\n", ep->com.state);2928 break;2929 }2930 dst_confirm(ep->dst);2931 if (ep->com.state != ABORTING) {2932 __state_set(&ep->com, DEAD);2933 /* we don't release if we want to retry with mpa_v1 */2934 if (!ep->retry_with_mpa_v1)2935 release = 1;2936 }2937 mutex_unlock(&ep->com.mutex);2938 2939 rpl_skb = skb_dequeue(&ep->com.ep_skb_list);2940 if (WARN_ON(!rpl_skb)) {2941 release = 1;2942 goto out;2943 }2944 2945 cxgb_mk_abort_rpl(rpl_skb, len, ep->hwtid, ep->txq_idx);2946 2947 c4iw_ofld_send(&ep->com.dev->rdev, rpl_skb);2948out:2949 if (release)2950 release_ep_resources(ep);2951 else if (ep->retry_with_mpa_v1) {2952 if (ep->com.remote_addr.ss_family == AF_INET6) {2953 struct sockaddr_in6 *sin6 =2954 (struct sockaddr_in6 *)2955 &ep->com.local_addr;2956 cxgb4_clip_release(2957 ep->com.dev->rdev.lldi.ports[0],2958 (const u32 *)&sin6->sin6_addr.s6_addr,2959 1);2960 }2961 xa_erase_irq(&ep->com.dev->hwtids, ep->hwtid);2962 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid,2963 ep->com.local_addr.ss_family);2964 dst_release(ep->dst);2965 cxgb4_l2t_release(ep->l2t);2966 c4iw_reconnect(ep);2967 }2968 2969deref_ep:2970 c4iw_put_ep(&ep->com);2971 /* Dereferencing ep, referenced in peer_abort_intr() */2972 c4iw_put_ep(&ep->com);2973 return 0;2974}2975 2976static int close_con_rpl(struct c4iw_dev *dev, struct sk_buff *skb)2977{2978 struct c4iw_ep *ep;2979 struct c4iw_qp_attributes attrs;2980 struct cpl_close_con_rpl *rpl = cplhdr(skb);2981 int release = 0;2982 unsigned int tid = GET_TID(rpl);2983 2984 ep = get_ep_from_tid(dev, tid);2985 if (!ep)2986 return 0;2987 2988 pr_debug("ep %p tid %u\n", ep, ep->hwtid);2989 2990 /* The cm_id may be null if we failed to connect */2991 mutex_lock(&ep->com.mutex);2992 set_bit(CLOSE_CON_RPL, &ep->com.history);2993 switch (ep->com.state) {2994 case CLOSING:2995 __state_set(&ep->com, MORIBUND);2996 break;2997 case MORIBUND:2998 (void)stop_ep_timer(ep);2999 if ((ep->com.cm_id) && (ep->com.qp)) {3000 attrs.next_state = C4IW_QP_STATE_IDLE;3001 c4iw_modify_qp(ep->com.qp->rhp,3002 ep->com.qp,3003 C4IW_QP_ATTR_NEXT_STATE,3004 &attrs, 1);3005 }3006 close_complete_upcall(ep, 0);3007 __state_set(&ep->com, DEAD);3008 release = 1;3009 break;3010 case ABORTING:3011 case DEAD:3012 break;3013 default:3014 WARN_ONCE(1, "Bad endpoint state %u\n", ep->com.state);3015 break;3016 }3017 mutex_unlock(&ep->com.mutex);3018 if (release)3019 release_ep_resources(ep);3020 c4iw_put_ep(&ep->com);3021 return 0;3022}3023 3024static int terminate(struct c4iw_dev *dev, struct sk_buff *skb)3025{3026 struct cpl_rdma_terminate *rpl = cplhdr(skb);3027 unsigned int tid = GET_TID(rpl);3028 struct c4iw_ep *ep;3029 struct c4iw_qp_attributes attrs;3030 3031 ep = get_ep_from_tid(dev, tid);3032 3033 if (ep) {3034 if (ep->com.qp) {3035 pr_warn("TERM received tid %u qpid %u\n", tid,3036 ep->com.qp->wq.sq.qid);3037 attrs.next_state = C4IW_QP_STATE_TERMINATE;3038 c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,3039 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);3040 }3041 3042 /* As per draft-hilland-iwarp-verbs-v1.0, sec 6.2.3,3043 * when entering the TERM state the RNIC MUST initiate a CLOSE.3044 */3045 c4iw_ep_disconnect(ep, 1, GFP_KERNEL);3046 c4iw_put_ep(&ep->com);3047 } else3048 pr_warn("TERM received tid %u no ep/qp\n", tid);3049 3050 return 0;3051}3052 3053/*3054 * Upcall from the adapter indicating data has been transmitted.3055 * For us its just the single MPA request or reply. We can now free3056 * the skb holding the mpa message.3057 */3058static int fw4_ack(struct c4iw_dev *dev, struct sk_buff *skb)3059{3060 struct c4iw_ep *ep;3061 struct cpl_fw4_ack *hdr = cplhdr(skb);3062 u8 credits = hdr->credits;3063 unsigned int tid = GET_TID(hdr);3064 3065 3066 ep = get_ep_from_tid(dev, tid);3067 if (!ep)3068 return 0;3069 pr_debug("ep %p tid %u credits %u\n",3070 ep, ep->hwtid, credits);3071 if (credits == 0) {3072 pr_debug("0 credit ack ep %p tid %u state %u\n",3073 ep, ep->hwtid, state_read(&ep->com));3074 goto out;3075 }3076 3077 dst_confirm(ep->dst);3078 if (ep->mpa_skb) {3079 pr_debug("last streaming msg ack ep %p tid %u state %u initiator %u freeing skb\n",3080 ep, ep->hwtid, state_read(&ep->com),3081 ep->mpa_attr.initiator ? 1 : 0);3082 mutex_lock(&ep->com.mutex);3083 kfree_skb(ep->mpa_skb);3084 ep->mpa_skb = NULL;3085 if (test_bit(STOP_MPA_TIMER, &ep->com.flags))3086 stop_ep_timer(ep);3087 mutex_unlock(&ep->com.mutex);3088 }3089out:3090 c4iw_put_ep(&ep->com);3091 return 0;3092}3093 3094int c4iw_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)3095{3096 int abort;3097 struct c4iw_ep *ep = to_ep(cm_id);3098 3099 pr_debug("ep %p tid %u\n", ep, ep->hwtid);3100 3101 mutex_lock(&ep->com.mutex);3102 if (ep->com.state != MPA_REQ_RCVD) {3103 mutex_unlock(&ep->com.mutex);3104 c4iw_put_ep(&ep->com);3105 return -ECONNRESET;3106 }3107 set_bit(ULP_REJECT, &ep->com.history);3108 if (mpa_rev == 0)3109 abort = 1;3110 else3111 abort = send_mpa_reject(ep, pdata, pdata_len);3112 mutex_unlock(&ep->com.mutex);3113 3114 stop_ep_timer(ep);3115 c4iw_ep_disconnect(ep, abort != 0, GFP_KERNEL);3116 c4iw_put_ep(&ep->com);3117 return 0;3118}3119 3120int c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)3121{3122 int err;3123 struct c4iw_qp_attributes attrs;3124 enum c4iw_qp_attr_mask mask;3125 struct c4iw_ep *ep = to_ep(cm_id);3126 struct c4iw_dev *h = to_c4iw_dev(cm_id->device);3127 struct c4iw_qp *qp = get_qhp(h, conn_param->qpn);3128 int abort = 0;3129 3130 pr_debug("ep %p tid %u\n", ep, ep->hwtid);3131 3132 mutex_lock(&ep->com.mutex);3133 if (ep->com.state != MPA_REQ_RCVD) {3134 err = -ECONNRESET;3135 goto err_out;3136 }3137 3138 if (!qp) {3139 err = -EINVAL;3140 goto err_out;3141 }3142 3143 set_bit(ULP_ACCEPT, &ep->com.history);3144 if ((conn_param->ord > cur_max_read_depth(ep->com.dev)) ||3145 (conn_param->ird > cur_max_read_depth(ep->com.dev))) {3146 err = -EINVAL;3147 goto err_abort;3148 }3149 3150 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {3151 if (conn_param->ord > ep->ird) {3152 if (RELAXED_IRD_NEGOTIATION) {3153 conn_param->ord = ep->ird;3154 } else {3155 ep->ird = conn_param->ird;3156 ep->ord = conn_param->ord;3157 send_mpa_reject(ep, conn_param->private_data,3158 conn_param->private_data_len);3159 err = -ENOMEM;3160 goto err_abort;3161 }3162 }3163 if (conn_param->ird < ep->ord) {3164 if (RELAXED_IRD_NEGOTIATION &&3165 ep->ord <= h->rdev.lldi.max_ordird_qp) {3166 conn_param->ird = ep->ord;3167 } else {3168 err = -ENOMEM;3169 goto err_abort;3170 }3171 }3172 }3173 ep->ird = conn_param->ird;3174 ep->ord = conn_param->ord;3175 3176 if (ep->mpa_attr.version == 1) {3177 if (peer2peer && ep->ird == 0)3178 ep->ird = 1;3179 } else {3180 if (peer2peer &&3181 (ep->mpa_attr.p2p_type != FW_RI_INIT_P2PTYPE_DISABLED) &&3182 (p2p_type == FW_RI_INIT_P2PTYPE_READ_REQ) && ep->ird == 0)3183 ep->ird = 1;3184 }3185 3186 pr_debug("ird %d ord %d\n", ep->ird, ep->ord);3187 3188 ep->com.cm_id = cm_id;3189 ref_cm_id(&ep->com);3190 ep->com.qp = qp;3191 ref_qp(ep);3192 3193 /* bind QP to EP and move to RTS */3194 attrs.mpa_attr = ep->mpa_attr;3195 attrs.max_ird = ep->ird;3196 attrs.max_ord = ep->ord;3197 attrs.llp_stream_handle = ep;3198 attrs.next_state = C4IW_QP_STATE_RTS;3199 3200 /* bind QP and TID with INIT_WR */3201 mask = C4IW_QP_ATTR_NEXT_STATE |3202 C4IW_QP_ATTR_LLP_STREAM_HANDLE |3203 C4IW_QP_ATTR_MPA_ATTR |3204 C4IW_QP_ATTR_MAX_IRD |3205 C4IW_QP_ATTR_MAX_ORD;3206 3207 err = c4iw_modify_qp(ep->com.qp->rhp,3208 ep->com.qp, mask, &attrs, 1);3209 if (err)3210 goto err_deref_cm_id;3211 3212 set_bit(STOP_MPA_TIMER, &ep->com.flags);3213 err = send_mpa_reply(ep, conn_param->private_data,3214 conn_param->private_data_len);3215 if (err)3216 goto err_deref_cm_id;3217 3218 __state_set(&ep->com, FPDU_MODE);3219 established_upcall(ep);3220 mutex_unlock(&ep->com.mutex);3221 c4iw_put_ep(&ep->com);3222 return 0;3223err_deref_cm_id:3224 deref_cm_id(&ep->com);3225err_abort:3226 abort = 1;3227err_out:3228 mutex_unlock(&ep->com.mutex);3229 if (abort)3230 c4iw_ep_disconnect(ep, 1, GFP_KERNEL);3231 c4iw_put_ep(&ep->com);3232 return err;3233}3234 3235static int pick_local_ipaddrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id)3236{3237 struct in_device *ind;3238 int found = 0;3239 struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr;3240 struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;3241 const struct in_ifaddr *ifa;3242 3243 ind = in_dev_get(dev->rdev.lldi.ports[0]);3244 if (!ind)3245 return -EADDRNOTAVAIL;3246 rcu_read_lock();3247 in_dev_for_each_ifa_rcu(ifa, ind) {3248 if (ifa->ifa_flags & IFA_F_SECONDARY)3249 continue;3250 laddr->sin_addr.s_addr = ifa->ifa_address;3251 raddr->sin_addr.s_addr = ifa->ifa_address;3252 found = 1;3253 break;3254 }3255 rcu_read_unlock();3256 3257 in_dev_put(ind);3258 return found ? 0 : -EADDRNOTAVAIL;3259}3260 3261static int get_lladdr(struct net_device *dev, struct in6_addr *addr,3262 unsigned char banned_flags)3263{3264 struct inet6_dev *idev;3265 int err = -EADDRNOTAVAIL;3266 3267 rcu_read_lock();3268 idev = __in6_dev_get(dev);3269 if (idev != NULL) {3270 struct inet6_ifaddr *ifp;3271 3272 read_lock_bh(&idev->lock);3273 list_for_each_entry(ifp, &idev->addr_list, if_list) {3274 if (ifp->scope == IFA_LINK &&3275 !(ifp->flags & banned_flags)) {3276 memcpy(addr, &ifp->addr, 16);3277 err = 0;3278 break;3279 }3280 }3281 read_unlock_bh(&idev->lock);3282 }3283 rcu_read_unlock();3284 return err;3285}3286 3287static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id)3288{3289 struct in6_addr addr;3290 struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;3291 struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr;3292 3293 if (!get_lladdr(dev->rdev.lldi.ports[0], &addr, IFA_F_TENTATIVE)) {3294 memcpy(la6->sin6_addr.s6_addr, &addr, 16);3295 memcpy(ra6->sin6_addr.s6_addr, &addr, 16);3296 return 0;3297 }3298 return -EADDRNOTAVAIL;3299}3300 3301int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)3302{3303 struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);3304 struct c4iw_ep *ep;3305 int err = 0;3306 struct sockaddr_in *laddr;3307 struct sockaddr_in *raddr;3308 struct sockaddr_in6 *laddr6;3309 struct sockaddr_in6 *raddr6;3310 __u8 *ra;3311 int iptype;3312 3313 if ((conn_param->ord > cur_max_read_depth(dev)) ||3314 (conn_param->ird > cur_max_read_depth(dev))) {3315 err = -EINVAL;3316 goto out;3317 }3318 ep = alloc_ep(sizeof(*ep), GFP_KERNEL);3319 if (!ep) {3320 pr_err("%s - cannot alloc ep\n", __func__);3321 err = -ENOMEM;3322 goto out;3323 }3324 3325 skb_queue_head_init(&ep->com.ep_skb_list);3326 if (alloc_ep_skb_list(&ep->com.ep_skb_list, CN_MAX_CON_BUF)) {3327 err = -ENOMEM;3328 goto fail1;3329 }3330 3331 timer_setup(&ep->timer, ep_timeout, 0);3332 ep->plen = conn_param->private_data_len;3333 if (ep->plen)3334 memcpy(ep->mpa_pkt + sizeof(struct mpa_message),3335 conn_param->private_data, ep->plen);3336 ep->ird = conn_param->ird;3337 ep->ord = conn_param->ord;3338 3339 if (peer2peer && ep->ord == 0)3340 ep->ord = 1;3341 3342 ep->com.cm_id = cm_id;3343 ref_cm_id(&ep->com);3344 cm_id->provider_data = ep;3345 ep->com.dev = dev;3346 ep->com.qp = get_qhp(dev, conn_param->qpn);3347 if (!ep->com.qp) {3348 pr_warn("%s qpn 0x%x not found!\n", __func__, conn_param->qpn);3349 err = -EINVAL;3350 goto fail2;3351 }3352 ref_qp(ep);3353 pr_debug("qpn 0x%x qp %p cm_id %p\n", conn_param->qpn,3354 ep->com.qp, cm_id);3355 3356 /*3357 * Allocate an active TID to initiate a TCP connection.3358 */3359 ep->atid = cxgb4_alloc_atid(dev->rdev.lldi.tids, ep);3360 if (ep->atid == -1) {3361 pr_err("%s - cannot alloc atid\n", __func__);3362 err = -ENOMEM;3363 goto fail2;3364 }3365 err = xa_insert_irq(&dev->atids, ep->atid, ep, GFP_KERNEL);3366 if (err)3367 goto fail5;3368 3369 memcpy(&ep->com.local_addr, &cm_id->m_local_addr,3370 sizeof(ep->com.local_addr));3371 memcpy(&ep->com.remote_addr, &cm_id->m_remote_addr,3372 sizeof(ep->com.remote_addr));3373 3374 laddr = (struct sockaddr_in *)&ep->com.local_addr;3375 raddr = (struct sockaddr_in *)&ep->com.remote_addr;3376 laddr6 = (struct sockaddr_in6 *)&ep->com.local_addr;3377 raddr6 = (struct sockaddr_in6 *) &ep->com.remote_addr;3378 3379 if (cm_id->m_remote_addr.ss_family == AF_INET) {3380 iptype = 4;3381 ra = (__u8 *)&raddr->sin_addr;3382 3383 /*3384 * Handle loopback requests to INADDR_ANY.3385 */3386 if (raddr->sin_addr.s_addr == htonl(INADDR_ANY)) {3387 err = pick_local_ipaddrs(dev, cm_id);3388 if (err)3389 goto fail3;3390 }3391 3392 /* find a route */3393 pr_debug("saddr %pI4 sport 0x%x raddr %pI4 rport 0x%x\n",3394 &laddr->sin_addr, ntohs(laddr->sin_port),3395 ra, ntohs(raddr->sin_port));3396 ep->dst = cxgb_find_route(&dev->rdev.lldi, get_real_dev,3397 laddr->sin_addr.s_addr,3398 raddr->sin_addr.s_addr,3399 laddr->sin_port,3400 raddr->sin_port, cm_id->tos);3401 } else {3402 iptype = 6;3403 ra = (__u8 *)&raddr6->sin6_addr;3404 3405 /*3406 * Handle loopback requests to INADDR_ANY.3407 */3408 if (ipv6_addr_type(&raddr6->sin6_addr) == IPV6_ADDR_ANY) {3409 err = pick_local_ip6addrs(dev, cm_id);3410 if (err)3411 goto fail3;3412 }3413 3414 /* find a route */3415 pr_debug("saddr %pI6 sport 0x%x raddr %pI6 rport 0x%x\n",3416 laddr6->sin6_addr.s6_addr,3417 ntohs(laddr6->sin6_port),3418 raddr6->sin6_addr.s6_addr, ntohs(raddr6->sin6_port));3419 ep->dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev,3420 laddr6->sin6_addr.s6_addr,3421 raddr6->sin6_addr.s6_addr,3422 laddr6->sin6_port,3423 raddr6->sin6_port, cm_id->tos,3424 raddr6->sin6_scope_id);3425 }3426 if (!ep->dst) {3427 pr_err("%s - cannot find route\n", __func__);3428 err = -EHOSTUNREACH;3429 goto fail3;3430 }3431 3432 err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true,3433 ep->com.dev->rdev.lldi.adapter_type, cm_id->tos);3434 if (err) {3435 pr_err("%s - cannot alloc l2e\n", __func__);3436 goto fail4;3437 }3438 3439 pr_debug("txq_idx %u tx_chan %u smac_idx %u rss_qid %u l2t_idx %u\n",3440 ep->txq_idx, ep->tx_chan, ep->smac_idx, ep->rss_qid,3441 ep->l2t->idx);3442 3443 state_set(&ep->com, CONNECTING);3444 ep->tos = cm_id->tos;3445 3446 /* send connect request to rnic */3447 err = send_connect(ep);3448 if (!err)3449 goto out;3450 3451 cxgb4_l2t_release(ep->l2t);3452fail4:3453 dst_release(ep->dst);3454fail3:3455 xa_erase_irq(&ep->com.dev->atids, ep->atid);3456fail5:3457 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);3458fail2:3459 skb_queue_purge(&ep->com.ep_skb_list);3460 deref_cm_id(&ep->com);3461fail1:3462 c4iw_put_ep(&ep->com);3463out:3464 return err;3465}3466 3467static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)3468{3469 int err;3470 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)3471 &ep->com.local_addr;3472 3473 if (ipv6_addr_type(&sin6->sin6_addr) != IPV6_ADDR_ANY) {3474 err = cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0],3475 (const u32 *)&sin6->sin6_addr.s6_addr, 1);3476 if (err)3477 return err;3478 }3479 c4iw_init_wr_wait(ep->com.wr_waitp);3480 err = cxgb4_create_server6(ep->com.dev->rdev.lldi.ports[0],3481 ep->stid, &sin6->sin6_addr,3482 sin6->sin6_port,3483 ep->com.dev->rdev.lldi.rxq_ids[0]);3484 if (!err)3485 err = c4iw_wait_for_reply(&ep->com.dev->rdev,3486 ep->com.wr_waitp,3487 0, 0, __func__);3488 else if (err > 0)3489 err = net_xmit_errno(err);3490 if (err) {3491 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],3492 (const u32 *)&sin6->sin6_addr.s6_addr, 1);3493 pr_err("cxgb4_create_server6/filter failed err %d stid %d laddr %pI6 lport %d\n",3494 err, ep->stid,3495 sin6->sin6_addr.s6_addr, ntohs(sin6->sin6_port));3496 }3497 return err;3498}3499 3500static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)3501{3502 int err;3503 struct sockaddr_in *sin = (struct sockaddr_in *)3504 &ep->com.local_addr;3505 3506 if (dev->rdev.lldi.enable_fw_ofld_conn) {3507 do {3508 err = cxgb4_create_server_filter(3509 ep->com.dev->rdev.lldi.ports[0], ep->stid,3510 sin->sin_addr.s_addr, sin->sin_port, 0,3511 ep->com.dev->rdev.lldi.rxq_ids[0], 0, 0);3512 if (err == -EBUSY) {3513 if (c4iw_fatal_error(&ep->com.dev->rdev)) {3514 err = -EIO;3515 break;3516 }3517 set_current_state(TASK_UNINTERRUPTIBLE);3518 schedule_timeout(usecs_to_jiffies(100));3519 }3520 } while (err == -EBUSY);3521 } else {3522 c4iw_init_wr_wait(ep->com.wr_waitp);3523 err = cxgb4_create_server(ep->com.dev->rdev.lldi.ports[0],3524 ep->stid, sin->sin_addr.s_addr, sin->sin_port,3525 0, ep->com.dev->rdev.lldi.rxq_ids[0]);3526 if (!err)3527 err = c4iw_wait_for_reply(&ep->com.dev->rdev,3528 ep->com.wr_waitp,3529 0, 0, __func__);3530 else if (err > 0)3531 err = net_xmit_errno(err);3532 }3533 if (err)3534 pr_err("cxgb4_create_server/filter failed err %d stid %d laddr %pI4 lport %d\n"3535 , err, ep->stid,3536 &sin->sin_addr, ntohs(sin->sin_port));3537 return err;3538}3539 3540int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)3541{3542 int err = 0;3543 struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);3544 struct c4iw_listen_ep *ep;3545 3546 might_sleep();3547 3548 ep = alloc_ep(sizeof(*ep), GFP_KERNEL);3549 if (!ep) {3550 pr_err("%s - cannot alloc ep\n", __func__);3551 err = -ENOMEM;3552 goto fail1;3553 }3554 skb_queue_head_init(&ep->com.ep_skb_list);3555 pr_debug("ep %p\n", ep);3556 ep->com.cm_id = cm_id;3557 ref_cm_id(&ep->com);3558 ep->com.dev = dev;3559 ep->backlog = backlog;3560 memcpy(&ep->com.local_addr, &cm_id->m_local_addr,3561 sizeof(ep->com.local_addr));3562 3563 /*3564 * Allocate a server TID.3565 */3566 if (dev->rdev.lldi.enable_fw_ofld_conn &&3567 ep->com.local_addr.ss_family == AF_INET)3568 ep->stid = cxgb4_alloc_sftid(dev->rdev.lldi.tids,3569 cm_id->m_local_addr.ss_family, ep);3570 else3571 ep->stid = cxgb4_alloc_stid(dev->rdev.lldi.tids,3572 cm_id->m_local_addr.ss_family, ep);3573 3574 if (ep->stid == -1) {3575 pr_err("%s - cannot alloc stid\n", __func__);3576 err = -ENOMEM;3577 goto fail2;3578 }3579 err = xa_insert_irq(&dev->stids, ep->stid, ep, GFP_KERNEL);3580 if (err)3581 goto fail3;3582 3583 state_set(&ep->com, LISTEN);3584 if (ep->com.local_addr.ss_family == AF_INET)3585 err = create_server4(dev, ep);3586 else3587 err = create_server6(dev, ep);3588 if (!err) {3589 cm_id->provider_data = ep;3590 goto out;3591 }3592 xa_erase_irq(&ep->com.dev->stids, ep->stid);3593fail3:3594 cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,3595 ep->com.local_addr.ss_family);3596fail2:3597 deref_cm_id(&ep->com);3598 c4iw_put_ep(&ep->com);3599fail1:3600out:3601 return err;3602}3603 3604int c4iw_destroy_listen(struct iw_cm_id *cm_id)3605{3606 int err;3607 struct c4iw_listen_ep *ep = to_listen_ep(cm_id);3608 3609 pr_debug("ep %p\n", ep);3610 3611 might_sleep();3612 state_set(&ep->com, DEAD);3613 if (ep->com.dev->rdev.lldi.enable_fw_ofld_conn &&3614 ep->com.local_addr.ss_family == AF_INET) {3615 err = cxgb4_remove_server_filter(3616 ep->com.dev->rdev.lldi.ports[0], ep->stid,3617 ep->com.dev->rdev.lldi.rxq_ids[0], false);3618 } else {3619 struct sockaddr_in6 *sin6;3620 c4iw_init_wr_wait(ep->com.wr_waitp);3621 err = cxgb4_remove_server(3622 ep->com.dev->rdev.lldi.ports[0], ep->stid,3623 ep->com.dev->rdev.lldi.rxq_ids[0],3624 ep->com.local_addr.ss_family == AF_INET6);3625 if (err)3626 goto done;3627 err = c4iw_wait_for_reply(&ep->com.dev->rdev, ep->com.wr_waitp,3628 0, 0, __func__);3629 sin6 = (struct sockaddr_in6 *)&ep->com.local_addr;3630 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],3631 (const u32 *)&sin6->sin6_addr.s6_addr, 1);3632 }3633 xa_erase_irq(&ep->com.dev->stids, ep->stid);3634 cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,3635 ep->com.local_addr.ss_family);3636done:3637 deref_cm_id(&ep->com);3638 c4iw_put_ep(&ep->com);3639 return err;3640}3641 3642int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp)3643{3644 int ret = 0;3645 int close = 0;3646 int fatal = 0;3647 struct c4iw_rdev *rdev;3648 3649 mutex_lock(&ep->com.mutex);3650 3651 pr_debug("ep %p state %s, abrupt %d\n", ep,3652 states[ep->com.state], abrupt);3653 3654 /*3655 * Ref the ep here in case we have fatal errors causing the3656 * ep to be released and freed.3657 */3658 c4iw_get_ep(&ep->com);3659 3660 rdev = &ep->com.dev->rdev;3661 if (c4iw_fatal_error(rdev)) {3662 fatal = 1;3663 close_complete_upcall(ep, -EIO);3664 ep->com.state = DEAD;3665 }3666 switch (ep->com.state) {3667 case MPA_REQ_WAIT:3668 case MPA_REQ_SENT:3669 case MPA_REQ_RCVD:3670 case MPA_REP_SENT:3671 case FPDU_MODE:3672 case CONNECTING:3673 close = 1;3674 if (abrupt)3675 ep->com.state = ABORTING;3676 else {3677 ep->com.state = CLOSING;3678 3679 /*3680 * if we close before we see the fw4_ack() then we fix3681 * up the timer state since we're reusing it.3682 */3683 if (ep->mpa_skb &&3684 test_bit(STOP_MPA_TIMER, &ep->com.flags)) {3685 clear_bit(STOP_MPA_TIMER, &ep->com.flags);3686 stop_ep_timer(ep);3687 }3688 start_ep_timer(ep);3689 }3690 set_bit(CLOSE_SENT, &ep->com.flags);3691 break;3692 case CLOSING:3693 if (!test_and_set_bit(CLOSE_SENT, &ep->com.flags)) {3694 close = 1;3695 if (abrupt) {3696 (void)stop_ep_timer(ep);3697 ep->com.state = ABORTING;3698 } else3699 ep->com.state = MORIBUND;3700 }3701 break;3702 case MORIBUND:3703 case ABORTING:3704 case DEAD:3705 pr_debug("ignoring disconnect ep %p state %u\n",3706 ep, ep->com.state);3707 break;3708 default:3709 WARN_ONCE(1, "Bad endpoint state %u\n", ep->com.state);3710 break;3711 }3712 3713 if (close) {3714 if (abrupt) {3715 set_bit(EP_DISC_ABORT, &ep->com.history);3716 ret = send_abort(ep);3717 } else {3718 set_bit(EP_DISC_CLOSE, &ep->com.history);3719 ret = send_halfclose(ep);3720 }3721 if (ret) {3722 set_bit(EP_DISC_FAIL, &ep->com.history);3723 if (!abrupt) {3724 stop_ep_timer(ep);3725 close_complete_upcall(ep, -EIO);3726 }3727 if (ep->com.qp) {3728 struct c4iw_qp_attributes attrs;3729 3730 attrs.next_state = C4IW_QP_STATE_ERROR;3731 ret = c4iw_modify_qp(ep->com.qp->rhp,3732 ep->com.qp,3733 C4IW_QP_ATTR_NEXT_STATE,3734 &attrs, 1);3735 if (ret)3736 pr_err("%s - qp <- error failed!\n",3737 __func__);3738 }3739 fatal = 1;3740 }3741 }3742 mutex_unlock(&ep->com.mutex);3743 c4iw_put_ep(&ep->com);3744 if (fatal)3745 release_ep_resources(ep);3746 return ret;3747}3748 3749static void active_ofld_conn_reply(struct c4iw_dev *dev, struct sk_buff *skb,3750 struct cpl_fw6_msg_ofld_connection_wr_rpl *req)3751{3752 struct c4iw_ep *ep;3753 int atid = be32_to_cpu(req->tid);3754 3755 ep = (struct c4iw_ep *)lookup_atid(dev->rdev.lldi.tids,3756 (__force u32) req->tid);3757 if (!ep)3758 return;3759 3760 switch (req->retval) {3761 case FW_ENOMEM:3762 set_bit(ACT_RETRY_NOMEM, &ep->com.history);3763 if (ep->retry_count++ < ACT_OPEN_RETRY_COUNT) {3764 send_fw_act_open_req(ep, atid);3765 return;3766 }3767 fallthrough;3768 case FW_EADDRINUSE:3769 set_bit(ACT_RETRY_INUSE, &ep->com.history);3770 if (ep->retry_count++ < ACT_OPEN_RETRY_COUNT) {3771 send_fw_act_open_req(ep, atid);3772 return;3773 }3774 break;3775 default:3776 pr_info("%s unexpected ofld conn wr retval %d\n",3777 __func__, req->retval);3778 break;3779 }3780 pr_err("active ofld_connect_wr failure %d atid %d\n",3781 req->retval, atid);3782 mutex_lock(&dev->rdev.stats.lock);3783 dev->rdev.stats.act_ofld_conn_fails++;3784 mutex_unlock(&dev->rdev.stats.lock);3785 connect_reply_upcall(ep, status2errno(req->retval));3786 state_set(&ep->com, DEAD);3787 if (ep->com.remote_addr.ss_family == AF_INET6) {3788 struct sockaddr_in6 *sin6 =3789 (struct sockaddr_in6 *)&ep->com.local_addr;3790 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],3791 (const u32 *)&sin6->sin6_addr.s6_addr, 1);3792 }3793 xa_erase_irq(&dev->atids, atid);3794 cxgb4_free_atid(dev->rdev.lldi.tids, atid);3795 dst_release(ep->dst);3796 cxgb4_l2t_release(ep->l2t);3797 c4iw_put_ep(&ep->com);3798}3799 3800static void passive_ofld_conn_reply(struct c4iw_dev *dev, struct sk_buff *skb,3801 struct cpl_fw6_msg_ofld_connection_wr_rpl *req)3802{3803 struct sk_buff *rpl_skb;3804 struct cpl_pass_accept_req *cpl;3805 int ret;3806 3807 rpl_skb = (struct sk_buff *)(unsigned long)req->cookie;3808 if (req->retval) {3809 pr_err("%s passive open failure %d\n", __func__, req->retval);3810 mutex_lock(&dev->rdev.stats.lock);3811 dev->rdev.stats.pas_ofld_conn_fails++;3812 mutex_unlock(&dev->rdev.stats.lock);3813 kfree_skb(rpl_skb);3814 } else {3815 cpl = (struct cpl_pass_accept_req *)cplhdr(rpl_skb);3816 OPCODE_TID(cpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_REQ,3817 (__force u32) htonl(3818 (__force u32) req->tid)));3819 ret = pass_accept_req(dev, rpl_skb);3820 if (!ret)3821 kfree_skb(rpl_skb);3822 }3823 return;3824}3825 3826static inline u64 t4_tcb_get_field64(__be64 *tcb, u16 word)3827{3828 u64 tlo = be64_to_cpu(tcb[((31 - word) / 2)]);3829 u64 thi = be64_to_cpu(tcb[((31 - word) / 2) - 1]);3830 u64 t;3831 u32 shift = 32;3832 3833 t = (thi << shift) | (tlo >> shift);3834 3835 return t;3836}3837 3838static inline u32 t4_tcb_get_field32(__be64 *tcb, u16 word, u32 mask, u32 shift)3839{3840 u32 v;3841 u64 t = be64_to_cpu(tcb[(31 - word) / 2]);3842 3843 if (word & 0x1)3844 shift += 32;3845 v = (t >> shift) & mask;3846 return v;3847}3848 3849static int read_tcb_rpl(struct c4iw_dev *dev, struct sk_buff *skb)3850{3851 struct cpl_get_tcb_rpl *rpl = cplhdr(skb);3852 __be64 *tcb = (__be64 *)(rpl + 1);3853 unsigned int tid = GET_TID(rpl);3854 struct c4iw_ep *ep;3855 u64 t_flags_64;3856 u32 rx_pdu_out;3857 3858 ep = get_ep_from_tid(dev, tid);3859 if (!ep)3860 return 0;3861 /* Examine the TF_RX_PDU_OUT (bit 49 of the t_flags) in order to3862 * determine if there's a rx PDU feedback event pending.3863 *3864 * If that bit is set, it means we'll need to re-read the TCB's3865 * rq_start value. The final value is the one present in a TCB3866 * with the TF_RX_PDU_OUT bit cleared.3867 */3868 3869 t_flags_64 = t4_tcb_get_field64(tcb, TCB_T_FLAGS_W);3870 rx_pdu_out = (t_flags_64 & TF_RX_PDU_OUT_V(1)) >> TF_RX_PDU_OUT_S;3871 3872 c4iw_put_ep(&ep->com); /* from get_ep_from_tid() */3873 c4iw_put_ep(&ep->com); /* from read_tcb() */3874 3875 /* If TF_RX_PDU_OUT bit is set, re-read the TCB */3876 if (rx_pdu_out) {3877 if (++ep->rx_pdu_out_cnt >= 2) {3878 WARN_ONCE(1, "tcb re-read() reached the guard limit, finishing the cleanup\n");3879 goto cleanup;3880 }3881 read_tcb(ep);3882 return 0;3883 }3884 3885 ep->srqe_idx = t4_tcb_get_field32(tcb, TCB_RQ_START_W, TCB_RQ_START_M,3886 TCB_RQ_START_S);3887cleanup:3888 pr_debug("ep %p tid %u %016x\n", ep, ep->hwtid, ep->srqe_idx);3889 3890 if (test_bit(PEER_ABORT_IN_PROGRESS, &ep->com.flags))3891 finish_peer_abort(dev, ep);3892 else if (test_bit(ABORT_REQ_IN_PROGRESS, &ep->com.flags))3893 send_abort_req(ep);3894 else3895 WARN_ONCE(1, "unexpected state!");3896 3897 return 0;3898}3899 3900static int deferred_fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb)3901{3902 struct cpl_fw6_msg *rpl = cplhdr(skb);3903 struct cpl_fw6_msg_ofld_connection_wr_rpl *req;3904 3905 switch (rpl->type) {3906 case FW6_TYPE_CQE:3907 c4iw_ev_dispatch(dev, (struct t4_cqe *)&rpl->data[0]);3908 break;3909 case FW6_TYPE_OFLD_CONNECTION_WR_RPL:3910 req = (struct cpl_fw6_msg_ofld_connection_wr_rpl *)rpl->data;3911 switch (req->t_state) {3912 case TCP_SYN_SENT:3913 active_ofld_conn_reply(dev, skb, req);3914 break;3915 case TCP_SYN_RECV:3916 passive_ofld_conn_reply(dev, skb, req);3917 break;3918 default:3919 pr_err("%s unexpected ofld conn wr state %d\n",3920 __func__, req->t_state);3921 break;3922 }3923 break;3924 }3925 return 0;3926}3927 3928static void build_cpl_pass_accept_req(struct sk_buff *skb, int stid , u8 tos)3929{3930 __be32 l2info;3931 __be16 hdr_len, vlantag, len;3932 u16 eth_hdr_len;3933 int tcp_hdr_len, ip_hdr_len;3934 u8 intf;3935 struct cpl_rx_pkt *cpl = cplhdr(skb);3936 struct cpl_pass_accept_req *req;3937 struct tcp_options_received tmp_opt;3938 struct c4iw_dev *dev;3939 enum chip_type type;3940 3941 dev = *((struct c4iw_dev **) (skb->cb + sizeof(void *)));3942 /* Store values from cpl_rx_pkt in temporary location. */3943 vlantag = cpl->vlan;3944 len = cpl->len;3945 l2info = cpl->l2info;3946 hdr_len = cpl->hdr_len;3947 intf = cpl->iff;3948 3949 __skb_pull(skb, sizeof(*req) + sizeof(struct rss_header));3950 3951 /*3952 * We need to parse the TCP options from SYN packet.3953 * to generate cpl_pass_accept_req.3954 */3955 memset(&tmp_opt, 0, sizeof(tmp_opt));3956 tcp_clear_options(&tmp_opt);3957 tcp_parse_options(&init_net, skb, &tmp_opt, 0, NULL);3958 3959 req = __skb_push(skb, sizeof(*req));3960 memset(req, 0, sizeof(*req));3961 req->l2info = cpu_to_be16(SYN_INTF_V(intf) |3962 SYN_MAC_IDX_V(RX_MACIDX_G(3963 be32_to_cpu(l2info))) |3964 SYN_XACT_MATCH_F);3965 type = dev->rdev.lldi.adapter_type;3966 tcp_hdr_len = RX_TCPHDR_LEN_G(be16_to_cpu(hdr_len));3967 ip_hdr_len = RX_IPHDR_LEN_G(be16_to_cpu(hdr_len));3968 req->hdr_len =3969 cpu_to_be32(SYN_RX_CHAN_V(RX_CHAN_G(be32_to_cpu(l2info))));3970 if (CHELSIO_CHIP_VERSION(type) <= CHELSIO_T5) {3971 eth_hdr_len = is_t4(type) ?3972 RX_ETHHDR_LEN_G(be32_to_cpu(l2info)) :3973 RX_T5_ETHHDR_LEN_G(be32_to_cpu(l2info));3974 req->hdr_len |= cpu_to_be32(TCP_HDR_LEN_V(tcp_hdr_len) |3975 IP_HDR_LEN_V(ip_hdr_len) |3976 ETH_HDR_LEN_V(eth_hdr_len));3977 } else { /* T6 and later */3978 eth_hdr_len = RX_T6_ETHHDR_LEN_G(be32_to_cpu(l2info));3979 req->hdr_len |= cpu_to_be32(T6_TCP_HDR_LEN_V(tcp_hdr_len) |3980 T6_IP_HDR_LEN_V(ip_hdr_len) |3981 T6_ETH_HDR_LEN_V(eth_hdr_len));3982 }3983 req->vlan = vlantag;3984 req->len = len;3985 req->tos_stid = cpu_to_be32(PASS_OPEN_TID_V(stid) |3986 PASS_OPEN_TOS_V(tos));3987 req->tcpopt.mss = htons(tmp_opt.mss_clamp);3988 if (tmp_opt.wscale_ok)3989 req->tcpopt.wsf = tmp_opt.snd_wscale;3990 req->tcpopt.tstamp = tmp_opt.saw_tstamp;3991 if (tmp_opt.sack_ok)3992 req->tcpopt.sack = 1;3993 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_REQ, 0));3994 return;3995}3996 3997static void send_fw_pass_open_req(struct c4iw_dev *dev, struct sk_buff *skb,3998 __be32 laddr, __be16 lport,3999 __be32 raddr, __be16 rport,4000 u32 rcv_isn, u32 filter, u16 window,4001 u32 rss_qid, u8 port_id)4002{4003 struct sk_buff *req_skb;4004 struct fw_ofld_connection_wr *req;4005 struct cpl_pass_accept_req *cpl = cplhdr(skb);4006 int ret;4007 4008 req_skb = alloc_skb(sizeof(struct fw_ofld_connection_wr), GFP_KERNEL);4009 if (!req_skb)4010 return;4011 req = __skb_put_zero(req_skb, sizeof(*req));4012 req->op_compl = htonl(WR_OP_V(FW_OFLD_CONNECTION_WR) | FW_WR_COMPL_F);4013 req->len16_pkd = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(sizeof(*req), 16)));4014 req->le.version_cpl = htonl(FW_OFLD_CONNECTION_WR_CPL_F);4015 req->le.filter = (__force __be32) filter;4016 req->le.lport = lport;4017 req->le.pport = rport;4018 req->le.u.ipv4.lip = laddr;4019 req->le.u.ipv4.pip = raddr;4020 req->tcb.rcv_nxt = htonl(rcv_isn + 1);4021 req->tcb.rcv_adv = htons(window);4022 req->tcb.t_state_to_astid =4023 htonl(FW_OFLD_CONNECTION_WR_T_STATE_V(TCP_SYN_RECV) |4024 FW_OFLD_CONNECTION_WR_RCV_SCALE_V(cpl->tcpopt.wsf) |4025 FW_OFLD_CONNECTION_WR_ASTID_V(4026 PASS_OPEN_TID_G(ntohl(cpl->tos_stid))));4027 4028 /*4029 * We store the qid in opt2 which will be used by the firmware4030 * to send us the wr response.4031 */4032 req->tcb.opt2 = htonl(RSS_QUEUE_V(rss_qid));4033 4034 /*4035 * We initialize the MSS index in TCB to 0xF.4036 * So that when driver sends cpl_pass_accept_rpl4037 * TCB picks up the correct value. If this was 04038 * TP will ignore any value > 0 for MSS index.4039 */4040 req->tcb.opt0 = cpu_to_be64(MSS_IDX_V(0xF));4041 req->cookie = (uintptr_t)skb;4042 4043 set_wr_txq(req_skb, CPL_PRIORITY_CONTROL, port_id);4044 ret = cxgb4_ofld_send(dev->rdev.lldi.ports[0], req_skb);4045 if (ret < 0) {4046 pr_err("%s - cxgb4_ofld_send error %d - dropping\n", __func__,4047 ret);4048 kfree_skb(skb);4049 kfree_skb(req_skb);4050 }4051}4052 4053/*4054 * Handler for CPL_RX_PKT message. Need to handle cpl_rx_pkt4055 * messages when a filter is being used instead of server to4056 * redirect a syn packet. When packets hit filter they are redirected4057 * to the offload queue and driver tries to establish the connection4058 * using firmware work request.4059 */4060static int rx_pkt(struct c4iw_dev *dev, struct sk_buff *skb)4061{4062 int stid;4063 unsigned int filter;4064 struct ethhdr *eh = NULL;4065 struct vlan_ethhdr *vlan_eh = NULL;4066 struct iphdr *iph;4067 struct tcphdr *tcph;4068 struct rss_header *rss = (void *)skb->data;4069 struct cpl_rx_pkt *cpl = (void *)skb->data;4070 struct cpl_pass_accept_req *req = (void *)(rss + 1);4071 struct l2t_entry *e;4072 struct dst_entry *dst;4073 struct c4iw_ep *lep = NULL;4074 u16 window;4075 struct port_info *pi;4076 struct net_device *pdev;4077 u16 rss_qid, eth_hdr_len;4078 int step;4079 struct neighbour *neigh;4080 4081 /* Drop all non-SYN packets */4082 if (!(cpl->l2info & cpu_to_be32(RXF_SYN_F)))4083 goto reject;4084 4085 /*4086 * Drop all packets which did not hit the filter.4087 * Unlikely to happen.4088 */4089 if (!(rss->filter_hit && rss->filter_tid))4090 goto reject;4091 4092 /*4093 * Calculate the server tid from filter hit index from cpl_rx_pkt.4094 */4095 stid = (__force int) cpu_to_be32((__force u32) rss->hash_val);4096 4097 lep = (struct c4iw_ep *)get_ep_from_stid(dev, stid);4098 if (!lep) {4099 pr_warn("%s connect request on invalid stid %d\n",4100 __func__, stid);4101 goto reject;4102 }4103 4104 switch (CHELSIO_CHIP_VERSION(dev->rdev.lldi.adapter_type)) {4105 case CHELSIO_T4:4106 eth_hdr_len = RX_ETHHDR_LEN_G(be32_to_cpu(cpl->l2info));4107 break;4108 case CHELSIO_T5:4109 eth_hdr_len = RX_T5_ETHHDR_LEN_G(be32_to_cpu(cpl->l2info));4110 break;4111 case CHELSIO_T6:4112 eth_hdr_len = RX_T6_ETHHDR_LEN_G(be32_to_cpu(cpl->l2info));4113 break;4114 default:4115 pr_err("T%d Chip is not supported\n",4116 CHELSIO_CHIP_VERSION(dev->rdev.lldi.adapter_type));4117 goto reject;4118 }4119 4120 if (eth_hdr_len == ETH_HLEN) {4121 eh = (struct ethhdr *)(req + 1);4122 iph = (struct iphdr *)(eh + 1);4123 } else {4124 vlan_eh = (struct vlan_ethhdr *)(req + 1);4125 iph = (struct iphdr *)(vlan_eh + 1);4126 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(cpl->vlan));4127 }4128 4129 if (iph->version != 0x4)4130 goto reject;4131 4132 tcph = (struct tcphdr *)(iph + 1);4133 skb_set_network_header(skb, (void *)iph - (void *)rss);4134 skb_set_transport_header(skb, (void *)tcph - (void *)rss);4135 skb_get(skb);4136 4137 pr_debug("lip 0x%x lport %u pip 0x%x pport %u tos %d\n",4138 ntohl(iph->daddr), ntohs(tcph->dest), ntohl(iph->saddr),4139 ntohs(tcph->source), iph->tos);4140 4141 dst = cxgb_find_route(&dev->rdev.lldi, get_real_dev,4142 iph->daddr, iph->saddr, tcph->dest,4143 tcph->source, iph->tos);4144 if (!dst) {4145 pr_err("%s - failed to find dst entry!\n", __func__);4146 goto reject;4147 }4148 neigh = dst_neigh_lookup_skb(dst, skb);4149 4150 if (!neigh) {4151 pr_err("%s - failed to allocate neigh!\n", __func__);4152 goto free_dst;4153 }4154 4155 if (neigh->dev->flags & IFF_LOOPBACK) {4156 pdev = ip_dev_find(&init_net, iph->daddr);4157 if (!pdev) {4158 pr_err("%s - failed to find device!\n", __func__);4159 goto free_dst;4160 }4161 e = cxgb4_l2t_get(dev->rdev.lldi.l2t, neigh,4162 pdev, 0);4163 pi = (struct port_info *)netdev_priv(pdev);4164 dev_put(pdev);4165 } else {4166 pdev = get_real_dev(neigh->dev);4167 e = cxgb4_l2t_get(dev->rdev.lldi.l2t, neigh,4168 pdev, 0);4169 pi = (struct port_info *)netdev_priv(pdev);4170 }4171 neigh_release(neigh);4172 if (!e) {4173 pr_err("%s - failed to allocate l2t entry!\n",4174 __func__);4175 goto free_dst;4176 }4177 4178 step = dev->rdev.lldi.nrxq / dev->rdev.lldi.nchan;4179 rss_qid = dev->rdev.lldi.rxq_ids[pi->port_id * step];4180 window = (__force u16) htons((__force u16)tcph->window);4181 4182 /* Calcuate filter portion for LE region. */4183 filter = (__force unsigned int) cpu_to_be32(cxgb4_select_ntuple(4184 dev->rdev.lldi.ports[0],4185 e));4186 4187 /*4188 * Synthesize the cpl_pass_accept_req. We have everything except the4189 * TID. Once firmware sends a reply with TID we update the TID field4190 * in cpl and pass it through the regular cpl_pass_accept_req path.4191 */4192 build_cpl_pass_accept_req(skb, stid, iph->tos);4193 send_fw_pass_open_req(dev, skb, iph->daddr, tcph->dest, iph->saddr,4194 tcph->source, ntohl(tcph->seq), filter, window,4195 rss_qid, pi->port_id);4196 cxgb4_l2t_release(e);4197free_dst:4198 dst_release(dst);4199reject:4200 if (lep)4201 c4iw_put_ep(&lep->com);4202 return 0;4203}4204 4205/*4206 * These are the real handlers that are called from a4207 * work queue.4208 */4209static c4iw_handler_func work_handlers[NUM_CPL_CMDS + NUM_FAKE_CPLS] = {4210 [CPL_ACT_ESTABLISH] = act_establish,4211 [CPL_ACT_OPEN_RPL] = act_open_rpl,4212 [CPL_RX_DATA] = rx_data,4213 [CPL_ABORT_RPL_RSS] = abort_rpl,4214 [CPL_ABORT_RPL] = abort_rpl,4215 [CPL_PASS_OPEN_RPL] = pass_open_rpl,4216 [CPL_CLOSE_LISTSRV_RPL] = close_listsrv_rpl,4217 [CPL_PASS_ACCEPT_REQ] = pass_accept_req,4218 [CPL_PASS_ESTABLISH] = pass_establish,4219 [CPL_PEER_CLOSE] = peer_close,4220 [CPL_ABORT_REQ_RSS] = peer_abort,4221 [CPL_CLOSE_CON_RPL] = close_con_rpl,4222 [CPL_RDMA_TERMINATE] = terminate,4223 [CPL_FW4_ACK] = fw4_ack,4224 [CPL_GET_TCB_RPL] = read_tcb_rpl,4225 [CPL_FW6_MSG] = deferred_fw6_msg,4226 [CPL_RX_PKT] = rx_pkt,4227 [FAKE_CPL_PUT_EP_SAFE] = _put_ep_safe,4228 [FAKE_CPL_PASS_PUT_EP_SAFE] = _put_pass_ep_safe4229};4230 4231static void process_timeout(struct c4iw_ep *ep)4232{4233 struct c4iw_qp_attributes attrs;4234 int abort = 1;4235 4236 mutex_lock(&ep->com.mutex);4237 pr_debug("ep %p tid %u state %d\n", ep, ep->hwtid, ep->com.state);4238 set_bit(TIMEDOUT, &ep->com.history);4239 switch (ep->com.state) {4240 case MPA_REQ_SENT:4241 connect_reply_upcall(ep, -ETIMEDOUT);4242 break;4243 case MPA_REQ_WAIT:4244 case MPA_REQ_RCVD:4245 case MPA_REP_SENT:4246 case FPDU_MODE:4247 break;4248 case CLOSING:4249 case MORIBUND:4250 if (ep->com.cm_id && ep->com.qp) {4251 attrs.next_state = C4IW_QP_STATE_ERROR;4252 c4iw_modify_qp(ep->com.qp->rhp,4253 ep->com.qp, C4IW_QP_ATTR_NEXT_STATE,4254 &attrs, 1);4255 }4256 close_complete_upcall(ep, -ETIMEDOUT);4257 break;4258 case ABORTING:4259 case DEAD:4260 4261 /*4262 * These states are expected if the ep timed out at the same4263 * time as another thread was calling stop_ep_timer().4264 * So we silently do nothing for these states.4265 */4266 abort = 0;4267 break;4268 default:4269 WARN(1, "%s unexpected state ep %p tid %u state %u\n",4270 __func__, ep, ep->hwtid, ep->com.state);4271 abort = 0;4272 }4273 mutex_unlock(&ep->com.mutex);4274 if (abort)4275 c4iw_ep_disconnect(ep, 1, GFP_KERNEL);4276 c4iw_put_ep(&ep->com);4277}4278 4279static void process_timedout_eps(void)4280{4281 struct c4iw_ep *ep;4282 4283 spin_lock_irq(&timeout_lock);4284 while (!list_empty(&timeout_list)) {4285 struct list_head *tmp;4286 4287 tmp = timeout_list.next;4288 list_del(tmp);4289 tmp->next = NULL;4290 tmp->prev = NULL;4291 spin_unlock_irq(&timeout_lock);4292 ep = list_entry(tmp, struct c4iw_ep, entry);4293 process_timeout(ep);4294 spin_lock_irq(&timeout_lock);4295 }4296 spin_unlock_irq(&timeout_lock);4297}4298 4299static void process_work(struct work_struct *work)4300{4301 struct sk_buff *skb = NULL;4302 struct c4iw_dev *dev;4303 struct cpl_act_establish *rpl;4304 unsigned int opcode;4305 int ret;4306 4307 process_timedout_eps();4308 while ((skb = skb_dequeue(&rxq))) {4309 rpl = cplhdr(skb);4310 dev = *((struct c4iw_dev **) (skb->cb + sizeof(void *)));4311 opcode = rpl->ot.opcode;4312 4313 if (opcode >= ARRAY_SIZE(work_handlers) ||4314 !work_handlers[opcode]) {4315 pr_err("No handler for opcode 0x%x.\n", opcode);4316 kfree_skb(skb);4317 } else {4318 ret = work_handlers[opcode](dev, skb);4319 if (!ret)4320 kfree_skb(skb);4321 }4322 process_timedout_eps();4323 }4324}4325 4326static DECLARE_WORK(skb_work, process_work);4327 4328static void ep_timeout(struct timer_list *t)4329{4330 struct c4iw_ep *ep = from_timer(ep, t, timer);4331 int kickit = 0;4332 4333 spin_lock(&timeout_lock);4334 if (!test_and_set_bit(TIMEOUT, &ep->com.flags)) {4335 /*4336 * Only insert if it is not already on the list.4337 */4338 if (!ep->entry.next) {4339 list_add_tail(&ep->entry, &timeout_list);4340 kickit = 1;4341 }4342 }4343 spin_unlock(&timeout_lock);4344 if (kickit)4345 queue_work(workq, &skb_work);4346}4347 4348/*4349 * All the CM events are handled on a work queue to have a safe context.4350 */4351static int sched(struct c4iw_dev *dev, struct sk_buff *skb)4352{4353 4354 /*4355 * Save dev in the skb->cb area.4356 */4357 *((struct c4iw_dev **) (skb->cb + sizeof(void *))) = dev;4358 4359 /*4360 * Queue the skb and schedule the worker thread.4361 */4362 skb_queue_tail(&rxq, skb);4363 queue_work(workq, &skb_work);4364 return 0;4365}4366 4367static int set_tcb_rpl(struct c4iw_dev *dev, struct sk_buff *skb)4368{4369 struct cpl_set_tcb_rpl *rpl = cplhdr(skb);4370 4371 if (rpl->status != CPL_ERR_NONE) {4372 pr_err("Unexpected SET_TCB_RPL status %u for tid %u\n",4373 rpl->status, GET_TID(rpl));4374 }4375 kfree_skb(skb);4376 return 0;4377}4378 4379static int fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb)4380{4381 struct cpl_fw6_msg *rpl = cplhdr(skb);4382 struct c4iw_wr_wait *wr_waitp;4383 int ret;4384 4385 pr_debug("type %u\n", rpl->type);4386 4387 switch (rpl->type) {4388 case FW6_TYPE_WR_RPL:4389 ret = (int)((be64_to_cpu(rpl->data[0]) >> 8) & 0xff);4390 wr_waitp = (struct c4iw_wr_wait *)(__force unsigned long) rpl->data[1];4391 pr_debug("wr_waitp %p ret %u\n", wr_waitp, ret);4392 if (wr_waitp)4393 c4iw_wake_up_deref(wr_waitp, ret ? -ret : 0);4394 kfree_skb(skb);4395 break;4396 case FW6_TYPE_CQE:4397 case FW6_TYPE_OFLD_CONNECTION_WR_RPL:4398 sched(dev, skb);4399 break;4400 default:4401 pr_err("%s unexpected fw6 msg type %u\n",4402 __func__, rpl->type);4403 kfree_skb(skb);4404 break;4405 }4406 return 0;4407}4408 4409static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)4410{4411 struct cpl_abort_req_rss *req = cplhdr(skb);4412 struct c4iw_ep *ep;4413 unsigned int tid = GET_TID(req);4414 4415 ep = get_ep_from_tid(dev, tid);4416 /* This EP will be dereferenced in peer_abort() */4417 if (!ep) {4418 pr_warn("Abort on non-existent endpoint, tid %d\n", tid);4419 kfree_skb(skb);4420 return 0;4421 }4422 if (cxgb_is_neg_adv(req->status)) {4423 pr_debug("Negative advice on abort- tid %u status %d (%s)\n",4424 ep->hwtid, req->status,4425 neg_adv_str(req->status));4426 goto out;4427 }4428 pr_debug("ep %p tid %u state %u\n", ep, ep->hwtid, ep->com.state);4429 4430 c4iw_wake_up_noref(ep->com.wr_waitp, -ECONNRESET);4431out:4432 sched(dev, skb);4433 return 0;4434}4435 4436/*4437 * Most upcalls from the T4 Core go to sched() to4438 * schedule the processing on a work queue.4439 */4440c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS] = {4441 [CPL_ACT_ESTABLISH] = sched,4442 [CPL_ACT_OPEN_RPL] = sched,4443 [CPL_RX_DATA] = sched,4444 [CPL_ABORT_RPL_RSS] = sched,4445 [CPL_ABORT_RPL] = sched,4446 [CPL_PASS_OPEN_RPL] = sched,4447 [CPL_CLOSE_LISTSRV_RPL] = sched,4448 [CPL_PASS_ACCEPT_REQ] = sched,4449 [CPL_PASS_ESTABLISH] = sched,4450 [CPL_PEER_CLOSE] = sched,4451 [CPL_CLOSE_CON_RPL] = sched,4452 [CPL_ABORT_REQ_RSS] = peer_abort_intr,4453 [CPL_RDMA_TERMINATE] = sched,4454 [CPL_FW4_ACK] = sched,4455 [CPL_SET_TCB_RPL] = set_tcb_rpl,4456 [CPL_GET_TCB_RPL] = sched,4457 [CPL_FW6_MSG] = fw6_msg,4458 [CPL_RX_PKT] = sched4459};4460 4461int __init c4iw_cm_init(void)4462{4463 skb_queue_head_init(&rxq);4464 4465 workq = alloc_ordered_workqueue("iw_cxgb4", WQ_MEM_RECLAIM);4466 if (!workq)4467 return -ENOMEM;4468 4469 return 0;4470}4471 4472void c4iw_cm_term(void)4473{4474 WARN_ON(!list_empty(&timeout_list));4475 destroy_workqueue(workq);4476}4477