1b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise/*
2b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
3b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *
4b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * This software is available to you under a choice of one of two
5b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * licenses.  You may choose to be licensed under the terms of the GNU
6b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * General Public License (GPL) Version 2, available from the file
7b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * COPYING in the main directory of this source tree, or the
8b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * OpenIB.org BSD license below:
9b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *
10b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *     Redistribution and use in source and binary forms, with or
11b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *     without modification, are permitted provided that the following
12b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *     conditions are met:
13b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *
14b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *      - Redistributions of source code must retain the above
15b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *        copyright notice, this list of conditions and the following
16b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *        disclaimer.
17b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *
18b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *      - Redistributions in binary form must reproduce the above
19b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *        copyright notice, this list of conditions and the following
20b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *        disclaimer in the documentation and/or other materials
21b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *        provided with the distribution.
22b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise *
23b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise * SOFTWARE.
31b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise */
32b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#ifndef _IWCH_CM_H_
33b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define _IWCH_CM_H_
34b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
35b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include <linux/inet.h>
36b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include <linux/wait.h>
37b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include <linux/spinlock.h>
38b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include <linux/kref.h>
39b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
40b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include <rdma/ib_verbs.h>
41b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include <rdma/iw_cm.h>
42b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
43b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include "cxgb3_offload.h"
44b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#include "iwch_provider.h"
45b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
46b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_KEY_REQ "MPA ID Req Frame"
47b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_KEY_REP "MPA ID Rep Frame"
48b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
49b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_MAX_PRIVATE_DATA	256
50b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_REV		0	/* XXX - amso1100 uses rev 0 ! */
51b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_REJECT		0x20
52b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_CRC			0x40
53b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_MARKERS		0x80
54b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define MPA_FLAGS_MASK		0xE0
55b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
56b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define put_ep(ep) { \
573371836383d63b627b228875f5ac63023cbf11d2Harvey Harrison	PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__,  \
58b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	     ep, atomic_read(&((ep)->kref.refcount))); \
59989a1780698c65dfe093a6aa89ceeff84c31f528Steve Wise	WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \
60b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	kref_put(&((ep)->kref), __free_ep); \
61b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise}
62b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
63b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define get_ep(ep) { \
643371836383d63b627b228875f5ac63023cbf11d2Harvey Harrison	PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \
65b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	     ep, atomic_read(&((ep)->kref.refcount))); \
66b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	kref_get(&((ep)->kref));  \
67b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise}
68b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
69b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestruct mpa_message {
70b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 key[16];
71b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 flags;
72b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 revision;
73b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	__be16 private_data_size;
74b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 private_data[0];
75b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
76b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
77b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestruct terminate_message {
78b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 layer_etype;
79b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 ecode;
80b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	__be16 hdrct_rsvd;
81b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 len_hdrs[0];
82b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
83b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
84b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28)
85b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
86b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseenum iwch_layers_types {
87b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	LAYER_RDMAP		= 0x00,
88b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	LAYER_DDP		= 0x10,
89b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	LAYER_MPA		= 0x20,
90b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_LOCAL_CATA	= 0x00,
91b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_REMOTE_PROT	= 0x01,
92b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_REMOTE_OP		= 0x02,
93b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDP_LOCAL_CATA		= 0x00,
94b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDP_TAGGED_ERR		= 0x01,
95b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDP_UNTAGGED_ERR	= 0x02,
96b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDP_LLP			= 0x03
97b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
98b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
99b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseenum iwch_rdma_ecodes {
100b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_INV_STAG		= 0x00,
101b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_BASE_BOUNDS	= 0x01,
102b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_ACC_VIOL		= 0x02,
103b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_STAG_NOT_ASSOC	= 0x03,
104b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_TO_WRAP		= 0x04,
105b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_INV_VERS		= 0x05,
106b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_INV_OPCODE	= 0x06,
107b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_STREAM_CATA	= 0x07,
108b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_GLOBAL_CATA	= 0x08,
109b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_CANT_INV_STAG	= 0x09,
110b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	RDMAP_UNSPECIFIED	= 0xff
111b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
112b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
113b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseenum iwch_ddp_ecodes {
114b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPT_INV_STAG		= 0x00,
115b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPT_BASE_BOUNDS	= 0x01,
116b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPT_STAG_NOT_ASSOC	= 0x02,
117b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPT_TO_WRAP		= 0x03,
118b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPT_INV_VERS		= 0x04,
119b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPU_INV_QN		= 0x01,
120b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPU_INV_MSN_NOBUF	= 0x02,
121b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPU_INV_MSN_RANGE	= 0x03,
122b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPU_INV_MO		= 0x04,
123b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPU_MSG_TOOBIG		= 0x05,
124b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DDPU_INV_VERS		= 0x06
125b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
126b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
127b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseenum iwch_mpa_ecodes {
128b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MPA_CRC_ERR		= 0x02,
129b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MPA_MARKER_ERR		= 0x03
130b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
131b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
132b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseenum iwch_ep_state {
133b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	IDLE = 0,
134b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	LISTEN,
135b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	CONNECTING,
136b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MPA_REQ_WAIT,
137b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MPA_REQ_SENT,
138b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MPA_REQ_RCVD,
139b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MPA_REP_SENT,
140b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	FPDU_MODE,
141b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	ABORTING,
142b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	CLOSING,
143b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	MORIBUND,
144b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	DEAD,
145b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
146b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
147aff9e39d97585486764572ab2f3bf5dfce18c660Steve Wiseenum iwch_ep_flags {
1486e47fe43502ba6dfe86d556661795d9bb0361309Steve Wise	PEER_ABORT_IN_PROGRESS	= 0,
1496e47fe43502ba6dfe86d556661795d9bb0361309Steve Wise	ABORT_REQ_IN_PROGRESS	= 1,
1506e47fe43502ba6dfe86d556661795d9bb0361309Steve Wise	RELEASE_RESOURCES	= 2,
1516e47fe43502ba6dfe86d556661795d9bb0361309Steve Wise	CLOSE_SENT		= 3,
152aff9e39d97585486764572ab2f3bf5dfce18c660Steve Wise};
153aff9e39d97585486764572ab2f3bf5dfce18c660Steve Wise
154b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestruct iwch_ep_common {
155b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct iw_cm_id *cm_id;
156b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct iwch_qp *qp;
157b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct t3cdev *tdev;
158b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	enum iwch_ep_state state;
159b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct kref kref;
160b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	spinlock_t lock;
161b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct sockaddr_in local_addr;
162b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct sockaddr_in remote_addr;
163b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	wait_queue_head_t waitq;
164b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	int rpl_done;
165b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	int rpl_err;
1666e47fe43502ba6dfe86d556661795d9bb0361309Steve Wise	unsigned long flags;
167b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
168b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
169b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestruct iwch_listen_ep {
170b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct iwch_ep_common com;
171b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	unsigned int stid;
172b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	int backlog;
173b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
174b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
175b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestruct iwch_ep {
176b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct iwch_ep_common com;
177b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct iwch_ep *parent_ep;
178b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct timer_list timer;
179b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	unsigned int atid;
180b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u32 hwtid;
181b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u32 snd_seq;
182de3d353072f9342f04112ba0504c3e294220cb8fSteve Wise	u32 rcv_seq;
183b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct l2t_entry *l2t;
184b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct dst_entry *dst;
185b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct sk_buff *mpa_skb;
186b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	struct iwch_mpa_attributes mpa_attr;
187b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	unsigned int mpa_pkt_len;
188b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 mpa_pkt[sizeof(struct mpa_message) + MPA_MAX_PRIVATE_DATA];
189b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u8 tos;
190b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u16 emss;
191b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u16 plen;
192b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u32 ird;
193b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	u32 ord;
194b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise};
195b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
196b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestatic inline struct iwch_ep *to_ep(struct iw_cm_id *cm_id)
197b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise{
198b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	return cm_id->provider_data;
199b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise}
200b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
201b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestatic inline struct iwch_listen_ep *to_listen_ep(struct iw_cm_id *cm_id)
202b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise{
203b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	return cm_id->provider_data;
204b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise}
205b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
206b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisestatic inline int compute_wscale(int win)
207b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise{
208b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	int wscale = 0;
209b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
210b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	while (wscale < 14 && (65535<<wscale) < win)
211b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise		wscale++;
212b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise	return wscale;
213b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise}
214b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
215b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise/* CM prototypes */
216b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
217b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
218b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_create_listen(struct iw_cm_id *cm_id, int backlog);
219b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_destroy_listen(struct iw_cm_id *cm_id);
220b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);
221b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
222b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp);
223b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_quiesce_tid(struct iwch_ep *ep);
224b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_resume_tid(struct iwch_ep *ep);
225b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisevoid __free_ep(struct kref *kref);
226b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisevoid iwch_rearp(struct iwch_ep *ep);
227b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint iwch_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new, struct l2t_entry *l2t);
228b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
229b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wiseint __init iwch_cm_init(void);
230b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wisevoid __exit iwch_cm_term(void);
231f8b0dfd15277974b5c9f3ff17f9e3ab6fdbe45eeSteve Wiseextern int peer2peer;
232b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise
233b038ced7b3705bf0ac9b30e118af0f56ab48b847Steve Wise#endif				/* _IWCH_CM_H_ */
234