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