brintos

brintos / linux-shallow public Read only

0
0
Text · 118.3 KiB · 8d753e6 Raw
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