Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
infiniband
hw
cxgb4
iw_cxgb4.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
3
*
4
* This software is available to you under a choice of one of two
5
* licenses. You may choose to be licensed under the terms of the GNU
6
* General Public License (GPL) Version 2, available from the file
7
* COPYING in the main directory of this source tree, or the
8
* OpenIB.org BSD license below:
9
*
10
* Redistribution and use in source and binary forms, with or
11
* without modification, are permitted provided that the following
12
* conditions are met:
13
*
14
* - Redistributions of source code must retain the above
15
* copyright notice, this list of conditions and the following
16
* disclaimer.
17
* - Redistributions in binary form must reproduce the above
18
* copyright notice, this list of conditions and the following
19
* disclaimer in the documentation and/or other materials
20
* provided with the distribution.
21
*
22
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
26
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
28
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
* SOFTWARE.
30
*/
31
#ifndef __IW_CXGB4_H__
32
#define __IW_CXGB4_H__
33
34
#include <
linux/mutex.h
>
35
#include <linux/list.h>
36
#include <
linux/spinlock.h
>
37
#include <
linux/idr.h
>
38
#include <
linux/completion.h
>
39
#include <linux/netdevice.h>
40
#include <linux/sched.h>
41
#include <linux/pci.h>
42
#include <
linux/dma-mapping.h
>
43
#include <
linux/inet.h
>
44
#include <linux/wait.h>
45
#include <
linux/kref.h
>
46
#include <
linux/timer.h
>
47
#include <
linux/io.h
>
48
49
#include <asm/byteorder.h>
50
51
#include <
net/net_namespace.h
>
52
53
#include <
rdma/ib_verbs.h
>
54
#include <
rdma/iw_cm.h
>
55
56
#include "
cxgb4.h
"
57
#include "
cxgb4_uld.h
"
58
#include "l2t.h"
59
#include "
user.h
"
60
61
#define DRV_NAME "iw_cxgb4"
62
#define MOD DRV_NAME ":"
63
64
extern
int
c4iw_debug
;
65
#define PDBG(fmt, args...) \
66
do { \
67
if (c4iw_debug) \
68
printk(MOD fmt, ## args); \
69
} while (0)
70
71
#include "
t4.h
"
72
73
#define PBL_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->pbl.start)
74
#define RQT_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->rq.start)
75
76
static
inline
void
*cplhdr(
struct
sk_buff
*
skb
)
77
{
78
return
skb->
data
;
79
}
80
81
#define C4IW_ID_TABLE_F_RANDOM 1
/* Pseudo-randomize the id's returned */
82
#define C4IW_ID_TABLE_F_EMPTY 2
/* Table is initially empty */
83
84
struct
c4iw_id_table
{
85
u32
flags
;
86
u32
start
;
/* logical minimal id */
87
u32
last
;
/* hint for find */
88
u32
max
;
89
spinlock_t
lock
;
90
unsigned
long
*
table
;
91
};
92
93
struct
c4iw_resource
{
94
struct
c4iw_id_table
tpt_table
;
95
struct
c4iw_id_table
qid_table
;
96
struct
c4iw_id_table
pdid_table
;
97
};
98
99
struct
c4iw_qid_list
{
100
struct
list_head
entry
;
101
u32
qid
;
102
};
103
104
struct
c4iw_dev_ucontext
{
105
struct
list_head
qpids
;
106
struct
list_head
cqids
;
107
struct
mutex
lock
;
108
};
109
110
enum
c4iw_rdev_flags
{
111
T4_FATAL_ERROR
= (1<<0),
112
};
113
114
struct
c4iw_stat
{
115
u64
total
;
116
u64
cur
;
117
u64
max
;
118
u64
fail
;
119
};
120
121
struct
c4iw_stats
{
122
struct
mutex
lock
;
123
struct
c4iw_stat
qid
;
124
struct
c4iw_stat
pd
;
125
struct
c4iw_stat
stag
;
126
struct
c4iw_stat
pbl
;
127
struct
c4iw_stat
rqt
;
128
struct
c4iw_stat
ocqp
;
129
u64
db_full
;
130
u64
db_empty
;
131
u64
db_drop
;
132
u64
db_state_transitions
;
133
};
134
135
struct
c4iw_rdev
{
136
struct
c4iw_resource
resource
;
137
unsigned
long
qpshift
;
138
u32
qpmask
;
139
unsigned
long
cqshift
;
140
u32
cqmask
;
141
struct
c4iw_dev_ucontext
uctx
;
142
struct
gen_pool
*
pbl_pool
;
143
struct
gen_pool
*
rqt_pool
;
144
struct
gen_pool
*
ocqp_pool
;
145
u32
flags
;
146
struct
cxgb4_lld_info
lldi
;
147
unsigned
long
oc_mw_pa
;
148
void
__iomem
*
oc_mw_kva
;
149
struct
c4iw_stats
stats
;
150
};
151
152
static
inline
int
c4iw_fatal_error(
struct
c4iw_rdev
*
rdev
)
153
{
154
return
rdev->
flags
&
T4_FATAL_ERROR
;
155
}
156
157
static
inline
int
c4iw_num_stags(
struct
c4iw_rdev
*
rdev
)
158
{
159
return
min
((
int
)
T4_MAX_NUM_STAG
, (
int
)(rdev->
lldi
.vr->stag.size >> 5));
160
}
161
162
#define C4IW_WR_TO (10*HZ)
163
164
struct
c4iw_wr_wait
{
165
struct
completion
completion
;
166
int
ret
;
167
};
168
169
static
inline
void
c4iw_init_wr_wait(
struct
c4iw_wr_wait
*wr_waitp)
170
{
171
wr_waitp->
ret
= 0;
172
init_completion(&wr_waitp->
completion
);
173
}
174
175
static
inline
void
c4iw_wake_up(
struct
c4iw_wr_wait
*wr_waitp,
int
ret
)
176
{
177
wr_waitp->
ret
=
ret
;
178
complete
(&wr_waitp->
completion
);
179
}
180
181
static
inline
int
c4iw_wait_for_reply(
struct
c4iw_rdev
*rdev,
182
struct
c4iw_wr_wait
*wr_waitp,
183
u32
hwtid,
u32
qpid,
184
const
char
*
func
)
185
{
186
unsigned
to =
C4IW_WR_TO
;
187
int
ret
;
188
189
do
{
190
ret =
wait_for_completion_timeout
(&wr_waitp->
completion
, to);
191
if
(!ret) {
192
printk
(
KERN_ERR
MOD
"%s - Device %s not responding - "
193
"tid %u qpid %u\n"
, func,
194
pci_name(rdev->
lldi
.pdev), hwtid, qpid);
195
if
(c4iw_fatal_error(rdev)) {
196
wr_waitp->
ret
= -
EIO
;
197
break
;
198
}
199
to = to << 2;
200
}
201
}
while
(!ret);
202
if
(wr_waitp->
ret
)
203
PDBG
(
"%s: FW reply %d tid %u qpid %u\n"
,
204
pci_name(rdev->
lldi
.pdev), wr_waitp->
ret
, hwtid, qpid);
205
return
wr_waitp->
ret
;
206
}
207
208
enum
db_state
{
209
NORMAL
= 0,
210
FLOW_CONTROL
= 1,
211
RECOVERY
= 2
212
};
213
214
struct
c4iw_dev
{
215
struct
ib_device
ibdev
;
216
struct
c4iw_rdev
rdev;
217
u32
device_cap_flags
;
218
struct
idr
cqidr
;
219
struct
idr
qpidr
;
220
struct
idr
mmidr
;
221
spinlock_t
lock
;
222
struct
mutex
db_mutex
;
223
struct
dentry
*
debugfs_root
;
224
enum
db_state
db_state
;
225
int
qpcnt
;
226
};
227
228
static
inline
struct
c4iw_dev
*to_c4iw_dev(
struct
ib_device
*
ibdev
)
229
{
230
return
container_of
(ibdev,
struct
c4iw_dev
, ibdev);
231
}
232
233
static
inline
struct
c4iw_dev
*rdev_to_c4iw_dev(
struct
c4iw_rdev
*rdev)
234
{
235
return
container_of
(rdev,
struct
c4iw_dev
, rdev);
236
}
237
238
static
inline
struct
c4iw_cq
*get_chp(
struct
c4iw_dev
*
rhp
,
u32
cqid)
239
{
240
return
idr_find
(&rhp->
cqidr
, cqid);
241
}
242
243
static
inline
struct
c4iw_qp
*get_qhp(
struct
c4iw_dev
*
rhp
,
u32
qpid)
244
{
245
return
idr_find
(&rhp->
qpidr
, qpid);
246
}
247
248
static
inline
struct
c4iw_mr
*get_mhp(
struct
c4iw_dev
*
rhp
,
u32
mmid)
249
{
250
return
idr_find
(&rhp->
mmidr
, mmid);
251
}
252
253
static
inline
int
_insert_handle(
struct
c4iw_dev
*
rhp
,
struct
idr
*
idr
,
254
void
*
handle
,
u32
id
,
int
lock)
255
{
256
int
ret
;
257
int
newid;
258
259
do
{
260
if
(!
idr_pre_get
(idr, lock ?
GFP_KERNEL
:
GFP_ATOMIC
))
261
return
-
ENOMEM
;
262
if
(lock)
263
spin_lock_irq(&rhp->
lock
);
264
ret =
idr_get_new_above
(idr, handle,
id
, &newid);
265
BUG_ON
(!ret && newid !=
id
);
266
if
(lock)
267
spin_unlock_irq(&rhp->
lock
);
268
}
while
(ret == -
EAGAIN
);
269
270
return
ret
;
271
}
272
273
static
inline
int
insert_handle(
struct
c4iw_dev
*rhp,
struct
idr *idr,
274
void
*handle,
u32
id
)
275
{
276
return
_insert_handle(rhp, idr, handle,
id
, 1);
277
}
278
279
static
inline
int
insert_handle_nolock(
struct
c4iw_dev
*rhp,
struct
idr *idr,
280
void
*handle,
u32
id
)
281
{
282
return
_insert_handle(rhp, idr, handle,
id
, 0);
283
}
284
285
static
inline
void
_remove_handle(
struct
c4iw_dev
*rhp,
struct
idr *idr,
286
u32
id
,
int
lock)
287
{
288
if
(lock)
289
spin_lock_irq(&rhp->
lock
);
290
idr_remove
(idr,
id
);
291
if
(lock)
292
spin_unlock_irq(&rhp->
lock
);
293
}
294
295
static
inline
void
remove_handle(
struct
c4iw_dev
*rhp,
struct
idr *idr,
u32
id
)
296
{
297
_remove_handle(rhp, idr,
id
, 1);
298
}
299
300
static
inline
void
remove_handle_nolock(
struct
c4iw_dev
*rhp,
301
struct
idr *idr,
u32
id
)
302
{
303
_remove_handle(rhp, idr,
id
, 0);
304
}
305
306
struct
c4iw_pd
{
307
struct
ib_pd
ibpd
;
308
u32
pdid
;
309
struct
c4iw_dev
*
rhp
;
310
};
311
312
static
inline
struct
c4iw_pd
*to_c4iw_pd(
struct
ib_pd
*
ibpd
)
313
{
314
return
container_of
(ibpd,
struct
c4iw_pd
, ibpd);
315
}
316
317
struct
tpt_attributes
{
318
u64
len
;
319
u64
va_fbo
;
320
enum
fw_ri_mem_perms
perms
;
321
u32
stag
;
322
u32
pdid
;
323
u32
qpid
;
324
u32
pbl_addr
;
325
u32
pbl_size
;
326
u32
state
:1;
327
u32
type
:2;
328
u32
rsvd
:1;
329
u32
remote_invaliate_disable
:1;
330
u32
zbva
:1;
331
u32
mw_bind_enable
:1;
332
u32
page_size
:5;
333
};
334
335
struct
c4iw_mr
{
336
struct
ib_mr
ibmr
;
337
struct
ib_umem
*
umem
;
338
struct
c4iw_dev
*
rhp
;
339
u64
kva
;
340
struct
tpt_attributes
attr
;
341
};
342
343
static
inline
struct
c4iw_mr
*to_c4iw_mr(
struct
ib_mr
*
ibmr
)
344
{
345
return
container_of
(ibmr,
struct
c4iw_mr
, ibmr);
346
}
347
348
struct
c4iw_mw
{
349
struct
ib_mw
ibmw
;
350
struct
c4iw_dev
*
rhp
;
351
u64
kva
;
352
struct
tpt_attributes
attr
;
353
};
354
355
static
inline
struct
c4iw_mw
*to_c4iw_mw(
struct
ib_mw
*
ibmw
)
356
{
357
return
container_of
(ibmw,
struct
c4iw_mw
, ibmw);
358
}
359
360
struct
c4iw_fr_page_list
{
361
struct
ib_fast_reg_page_list
ibpl
;
362
DEFINE_DMA_UNMAP_ADDR
(
mapping
);
363
dma_addr_t
dma_addr
;
364
struct
c4iw_dev
*
dev
;
365
int
size
;
366
};
367
368
static
inline
struct
c4iw_fr_page_list
*to_c4iw_fr_page_list(
369
struct
ib_fast_reg_page_list
*
ibpl
)
370
{
371
return
container_of
(ibpl,
struct
c4iw_fr_page_list
, ibpl);
372
}
373
374
struct
c4iw_cq
{
375
struct
ib_cq
ibcq
;
376
struct
c4iw_dev
*
rhp
;
377
struct
t4_cq
cq
;
378
spinlock_t
lock
;
379
spinlock_t
comp_handler_lock
;
380
atomic_t
refcnt
;
381
wait_queue_head_t
wait
;
382
};
383
384
static
inline
struct
c4iw_cq
*to_c4iw_cq(
struct
ib_cq
*
ibcq
)
385
{
386
return
container_of
(ibcq,
struct
c4iw_cq
, ibcq);
387
}
388
389
struct
c4iw_mpa_attributes
{
390
u8
initiator
;
391
u8
recv_marker_enabled
;
392
u8
xmit_marker_enabled
;
393
u8
crc_enabled
;
394
u8
enhanced_rdma_conn
;
395
u8
version
;
396
u8
p2p_type
;
397
};
398
399
struct
c4iw_qp_attributes
{
400
u32
scq
;
401
u32
rcq
;
402
u32
sq_num_entries
;
403
u32
rq_num_entries
;
404
u32
sq_max_sges
;
405
u32
sq_max_sges_rdma_write
;
406
u32
rq_max_sges
;
407
u32
state
;
408
u8
enable_rdma_read
;
409
u8
enable_rdma_write
;
410
u8
enable_bind
;
411
u8
enable_mmid0_fastreg
;
412
u32
max_ord
;
413
u32
max_ird
;
414
u32
pd
;
415
u32
next_state
;
416
char
terminate_buffer
[52];
417
u32
terminate_msg_len
;
418
u8
is_terminate_local
;
419
struct
c4iw_mpa_attributes
mpa_attr
;
420
struct
c4iw_ep
*
llp_stream_handle
;
421
u8
layer_etype
;
422
u8
ecode
;
423
u16
sq_db_inc
;
424
u16
rq_db_inc
;
425
};
426
427
struct
c4iw_qp
{
428
struct
ib_qp
ibqp
;
429
struct
c4iw_dev
*
rhp
;
430
struct
c4iw_ep
*
ep
;
431
struct
c4iw_qp_attributes
attr
;
432
struct
t4_wq
wq
;
433
spinlock_t
lock
;
434
struct
mutex
mutex
;
435
atomic_t
refcnt
;
436
wait_queue_head_t
wait
;
437
struct
timer_list
timer
;
438
};
439
440
static
inline
struct
c4iw_qp
*to_c4iw_qp(
struct
ib_qp
*
ibqp
)
441
{
442
return
container_of
(ibqp,
struct
c4iw_qp
, ibqp);
443
}
444
445
struct
c4iw_ucontext
{
446
struct
ib_ucontext
ibucontext
;
447
struct
c4iw_dev_ucontext
uctx
;
448
u32
key
;
449
spinlock_t
mmap_lock
;
450
struct
list_head
mmaps
;
451
};
452
453
static
inline
struct
c4iw_ucontext
*to_c4iw_ucontext(
struct
ib_ucontext
*
c
)
454
{
455
return
container_of
(c,
struct
c4iw_ucontext
,
ibucontext
);
456
}
457
458
struct
c4iw_mm_entry
{
459
struct
list_head
entry
;
460
u64
addr
;
461
u32
key
;
462
unsigned
len
;
463
};
464
465
static
inline
struct
c4iw_mm_entry
*remove_mmap(
struct
c4iw_ucontext
*
ucontext
,
466
u32
key
,
unsigned
len
)
467
{
468
struct
list_head
*
pos
, *nxt;
469
struct
c4iw_mm_entry
*mm;
470
471
spin_lock(&ucontext->
mmap_lock
);
472
list_for_each_safe
(pos, nxt, &ucontext->
mmaps
) {
473
474
mm =
list_entry
(pos,
struct
c4iw_mm_entry
,
entry
);
475
if
(mm->
key
== key && mm->
len
== len) {
476
list_del_init(&mm->
entry
);
477
spin_unlock(&ucontext->
mmap_lock
);
478
PDBG
(
"%s key 0x%x addr 0x%llx len %d\n"
, __func__,
479
key, (
unsigned
long
long
) mm->
addr
, mm->
len
);
480
return
mm;
481
}
482
}
483
spin_unlock(&ucontext->
mmap_lock
);
484
return
NULL
;
485
}
486
487
static
inline
void
insert_mmap(
struct
c4iw_ucontext
*
ucontext
,
488
struct
c4iw_mm_entry
*mm)
489
{
490
spin_lock(&ucontext->
mmap_lock
);
491
PDBG
(
"%s key 0x%x addr 0x%llx len %d\n"
, __func__,
492
mm->
key
, (
unsigned
long
long
) mm->
addr
, mm->
len
);
493
list_add_tail
(&mm->
entry
, &ucontext->
mmaps
);
494
spin_unlock(&ucontext->
mmap_lock
);
495
}
496
497
enum
c4iw_qp_attr_mask
{
498
C4IW_QP_ATTR_NEXT_STATE
= 1 << 0,
499
C4IW_QP_ATTR_SQ_DB
= 1<<1,
500
C4IW_QP_ATTR_RQ_DB
= 1<<2,
501
C4IW_QP_ATTR_ENABLE_RDMA_READ
= 1 << 7,
502
C4IW_QP_ATTR_ENABLE_RDMA_WRITE
= 1 << 8,
503
C4IW_QP_ATTR_ENABLE_RDMA_BIND
= 1 << 9,
504
C4IW_QP_ATTR_MAX_ORD
= 1 << 11,
505
C4IW_QP_ATTR_MAX_IRD
= 1 << 12,
506
C4IW_QP_ATTR_LLP_STREAM_HANDLE
= 1 << 22,
507
C4IW_QP_ATTR_STREAM_MSG_BUFFER
= 1 << 23,
508
C4IW_QP_ATTR_MPA_ATTR
= 1 << 24,
509
C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE
= 1 << 25,
510
C4IW_QP_ATTR_VALID_MODIFY
= (
C4IW_QP_ATTR_ENABLE_RDMA_READ
|
511
C4IW_QP_ATTR_ENABLE_RDMA_WRITE
|
512
C4IW_QP_ATTR_MAX_ORD
|
513
C4IW_QP_ATTR_MAX_IRD
|
514
C4IW_QP_ATTR_LLP_STREAM_HANDLE
|
515
C4IW_QP_ATTR_STREAM_MSG_BUFFER
|
516
C4IW_QP_ATTR_MPA_ATTR
|
517
C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE
)
518
};
519
520
int
c4iw_modify_qp
(
struct
c4iw_dev
*rhp,
521
struct
c4iw_qp
*qhp,
522
enum
c4iw_qp_attr_mask
mask
,
523
struct
c4iw_qp_attributes
*attrs,
524
int
internal
);
525
526
enum
c4iw_qp_state
{
527
C4IW_QP_STATE_IDLE
,
528
C4IW_QP_STATE_RTS
,
529
C4IW_QP_STATE_ERROR
,
530
C4IW_QP_STATE_TERMINATE
,
531
C4IW_QP_STATE_CLOSING
,
532
C4IW_QP_STATE_TOT
533
};
534
535
static
inline
int
c4iw_convert_state(
enum
ib_qp_state
ib_state)
536
{
537
switch
(ib_state) {
538
case
IB_QPS_RESET
:
539
case
IB_QPS_INIT
:
540
return
C4IW_QP_STATE_IDLE
;
541
case
IB_QPS_RTS
:
542
return
C4IW_QP_STATE_RTS
;
543
case
IB_QPS_SQD
:
544
return
C4IW_QP_STATE_CLOSING
;
545
case
IB_QPS_SQE
:
546
return
C4IW_QP_STATE_TERMINATE
;
547
case
IB_QPS_ERR
:
548
return
C4IW_QP_STATE_ERROR
;
549
default
:
550
return
-1;
551
}
552
}
553
554
static
inline
int
to_ib_qp_state(
int
c4iw_qp_state
)
555
{
556
switch
(c4iw_qp_state) {
557
case
C4IW_QP_STATE_IDLE
:
558
return
IB_QPS_INIT
;
559
case
C4IW_QP_STATE_RTS
:
560
return
IB_QPS_RTS
;
561
case
C4IW_QP_STATE_CLOSING
:
562
return
IB_QPS_SQD
;
563
case
C4IW_QP_STATE_TERMINATE
:
564
return
IB_QPS_SQE
;
565
case
C4IW_QP_STATE_ERROR
:
566
return
IB_QPS_ERR
;
567
}
568
return
IB_QPS_ERR
;
569
}
570
571
static
inline
u32
c4iw_ib_to_tpt_access(
int
a
)
572
{
573
return
(a &
IB_ACCESS_REMOTE_WRITE
?
FW_RI_MEM_ACCESS_REM_WRITE
: 0) |
574
(a &
IB_ACCESS_REMOTE_READ
?
FW_RI_MEM_ACCESS_REM_READ
: 0) |
575
(a &
IB_ACCESS_LOCAL_WRITE
?
FW_RI_MEM_ACCESS_LOCAL_WRITE
: 0) |
576
FW_RI_MEM_ACCESS_LOCAL_READ
;
577
}
578
579
static
inline
u32
c4iw_ib_to_tpt_bind_access(
int
acc)
580
{
581
return
(acc &
IB_ACCESS_REMOTE_WRITE
? FW_RI_MEM_ACCESS_REM_WRITE : 0) |
582
(acc &
IB_ACCESS_REMOTE_READ
?
FW_RI_MEM_ACCESS_REM_READ
: 0);
583
}
584
585
enum
c4iw_mmid_state
{
586
C4IW_STAG_STATE_VALID
,
587
C4IW_STAG_STATE_INVALID
588
};
589
590
#define C4IW_NODE_DESC "cxgb4 Chelsio Communications"
591
592
#define MPA_KEY_REQ "MPA ID Req Frame"
593
#define MPA_KEY_REP "MPA ID Rep Frame"
594
595
#define MPA_MAX_PRIVATE_DATA 256
596
#define MPA_ENHANCED_RDMA_CONN 0x10
597
#define MPA_REJECT 0x20
598
#define MPA_CRC 0x40
599
#define MPA_MARKERS 0x80
600
#define MPA_FLAGS_MASK 0xE0
601
602
#define MPA_V2_PEER2PEER_MODEL 0x8000
603
#define MPA_V2_ZERO_LEN_FPDU_RTR 0x4000
604
#define MPA_V2_RDMA_WRITE_RTR 0x8000
605
#define MPA_V2_RDMA_READ_RTR 0x4000
606
#define MPA_V2_IRD_ORD_MASK 0x3FFF
607
608
#define c4iw_put_ep(ep) { \
609
PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \
610
ep, atomic_read(&((ep)->kref.refcount))); \
611
WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \
612
kref_put(&((ep)->kref), _c4iw_free_ep); \
613
}
614
615
#define c4iw_get_ep(ep) { \
616
PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \
617
ep, atomic_read(&((ep)->kref.refcount))); \
618
kref_get(&((ep)->kref)); \
619
}
620
void
_c4iw_free_ep
(
struct
kref
*
kref
);
621
622
struct
mpa_message
{
623
u8
key
[16];
624
u8
flags
;
625
u8
revision
;
626
__be16
private_data_size
;
627
u8
private_data
[0];
628
};
629
630
struct
mpa_v2_conn_params
{
631
__be16
ird
;
632
__be16
ord
;
633
};
634
635
struct
terminate_message
{
636
u8
layer_etype
;
637
u8
ecode
;
638
__be16
hdrct_rsvd
;
639
u8
len_hdrs
[0];
640
};
641
642
#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28)
643
644
enum
c4iw_layers_types
{
645
LAYER_RDMAP
= 0x00,
646
LAYER_DDP
= 0x10,
647
LAYER_MPA
= 0x20,
648
RDMAP_LOCAL_CATA
= 0x00,
649
RDMAP_REMOTE_PROT
= 0x01,
650
RDMAP_REMOTE_OP
= 0x02,
651
DDP_LOCAL_CATA
= 0x00,
652
DDP_TAGGED_ERR
= 0x01,
653
DDP_UNTAGGED_ERR
= 0x02,
654
DDP_LLP
= 0x03
655
};
656
657
enum
c4iw_rdma_ecodes
{
658
RDMAP_INV_STAG
= 0x00,
659
RDMAP_BASE_BOUNDS
= 0x01,
660
RDMAP_ACC_VIOL
= 0x02,
661
RDMAP_STAG_NOT_ASSOC
= 0x03,
662
RDMAP_TO_WRAP
= 0x04,
663
RDMAP_INV_VERS
= 0x05,
664
RDMAP_INV_OPCODE
= 0x06,
665
RDMAP_STREAM_CATA
= 0x07,
666
RDMAP_GLOBAL_CATA
= 0x08,
667
RDMAP_CANT_INV_STAG
= 0x09,
668
RDMAP_UNSPECIFIED
= 0xff
669
};
670
671
enum
c4iw_ddp_ecodes
{
672
DDPT_INV_STAG
= 0x00,
673
DDPT_BASE_BOUNDS
= 0x01,
674
DDPT_STAG_NOT_ASSOC
= 0x02,
675
DDPT_TO_WRAP
= 0x03,
676
DDPT_INV_VERS
= 0x04,
677
DDPU_INV_QN
= 0x01,
678
DDPU_INV_MSN_NOBUF
= 0x02,
679
DDPU_INV_MSN_RANGE
= 0x03,
680
DDPU_INV_MO
= 0x04,
681
DDPU_MSG_TOOBIG
= 0x05,
682
DDPU_INV_VERS
= 0x06
683
};
684
685
enum
c4iw_mpa_ecodes
{
686
MPA_CRC_ERR
= 0x02,
687
MPA_MARKER_ERR
= 0x03,
688
MPA_LOCAL_CATA
= 0x05,
689
MPA_INSUFF_IRD
= 0x06,
690
MPA_NOMATCH_RTR
= 0x07,
691
};
692
693
enum
c4iw_ep_state
{
694
IDLE
= 0,
695
LISTEN
,
696
CONNECTING
,
697
MPA_REQ_WAIT
,
698
MPA_REQ_SENT
,
699
MPA_REQ_RCVD
,
700
MPA_REP_SENT
,
701
FPDU_MODE
,
702
ABORTING
,
703
CLOSING
,
704
MORIBUND
,
705
DEAD
,
706
};
707
708
enum
c4iw_ep_flags
{
709
PEER_ABORT_IN_PROGRESS
= 0,
710
ABORT_REQ_IN_PROGRESS
= 1,
711
RELEASE_RESOURCES
= 2,
712
CLOSE_SENT
= 3,
713
};
714
715
struct
c4iw_ep_common
{
716
struct
iw_cm_id
*
cm_id
;
717
struct
c4iw_qp
*
qp
;
718
struct
c4iw_dev
*
dev
;
719
enum
c4iw_ep_state
state
;
720
struct
kref
kref
;
721
struct
mutex
mutex
;
722
struct
sockaddr_in
local_addr
;
723
struct
sockaddr_in
remote_addr
;
724
struct
c4iw_wr_wait
wr_wait
;
725
unsigned
long
flags
;
726
};
727
728
struct
c4iw_listen_ep
{
729
struct
c4iw_ep_common
com
;
730
unsigned
int
stid
;
731
int
backlog
;
732
};
733
734
struct
c4iw_ep
{
735
struct
c4iw_ep_common
com
;
736
struct
c4iw_ep
*
parent_ep
;
737
struct
timer_list
timer
;
738
struct
list_head
entry
;
739
unsigned
int
atid
;
740
u32
hwtid
;
741
u32
snd_seq
;
742
u32
rcv_seq
;
743
struct
l2t_entry
*
l2t
;
744
struct
dst_entry
*
dst
;
745
struct
sk_buff
*
mpa_skb
;
746
struct
c4iw_mpa_attributes
mpa_attr
;
747
u8
mpa_pkt
[
sizeof
(
struct
mpa_message
) +
MPA_MAX_PRIVATE_DATA
];
748
unsigned
int
mpa_pkt_len
;
749
u32
ird
;
750
u32
ord
;
751
u32
smac_idx
;
752
u32
tx_chan
;
753
u32
mtu
;
754
u16
mss
;
755
u16
emss
;
756
u16
plen
;
757
u16
rss_qid
;
758
u16
txq_idx
;
759
u16
ctrlq_idx
;
760
u8
tos
;
761
u8
retry_with_mpa_v1
;
762
u8
tried_with_mpa_v1
;
763
};
764
765
static
inline
struct
c4iw_ep
*to_ep(
struct
iw_cm_id
*
cm_id
)
766
{
767
return
cm_id->
provider_data
;
768
}
769
770
static
inline
struct
c4iw_listen_ep
*to_listen_ep(
struct
iw_cm_id
*
cm_id
)
771
{
772
return
cm_id->
provider_data
;
773
}
774
775
static
inline
int
compute_wscale(
int
win
)
776
{
777
int
wscale = 0;
778
779
while
(wscale < 14 && (65535<<wscale) < win)
780
wscale++;
781
return
wscale;
782
}
783
784
u32
c4iw_id_alloc
(
struct
c4iw_id_table
*alloc);
785
void
c4iw_id_free
(
struct
c4iw_id_table
*alloc,
u32
obj);
786
int
c4iw_id_table_alloc
(
struct
c4iw_id_table
*alloc,
u32
start
,
u32
num,
787
u32
reserved
,
u32
flags
);
788
void
c4iw_id_table_free
(
struct
c4iw_id_table
*alloc);
789
790
typedef
int
(*
c4iw_handler_func
)(
struct
c4iw_dev
*
dev
,
struct
sk_buff
*
skb
);
791
792
int
c4iw_ep_redirect
(
void
*
ctx
,
struct
dst_entry
*old,
struct
dst_entry
*
new
,
793
struct
l2t_entry
*l2t);
794
void
c4iw_put_qpid
(
struct
c4iw_rdev
*rdev,
u32
qpid,
795
struct
c4iw_dev_ucontext
*uctx);
796
u32
c4iw_get_resource
(
struct
c4iw_id_table
*id_table);
797
void
c4iw_put_resource
(
struct
c4iw_id_table
*id_table,
u32
entry
);
798
int
c4iw_init_resource
(
struct
c4iw_rdev
*rdev,
u32
nr_tpt,
u32
nr_pdid);
799
int
c4iw_init_ctrl_qp
(
struct
c4iw_rdev
*rdev);
800
int
c4iw_pblpool_create
(
struct
c4iw_rdev
*rdev);
801
int
c4iw_rqtpool_create
(
struct
c4iw_rdev
*rdev);
802
int
c4iw_ocqp_pool_create
(
struct
c4iw_rdev
*rdev);
803
void
c4iw_pblpool_destroy
(
struct
c4iw_rdev
*rdev);
804
void
c4iw_rqtpool_destroy
(
struct
c4iw_rdev
*rdev);
805
void
c4iw_ocqp_pool_destroy
(
struct
c4iw_rdev
*rdev);
806
void
c4iw_destroy_resource
(
struct
c4iw_resource
*rscp);
807
int
c4iw_destroy_ctrl_qp
(
struct
c4iw_rdev
*rdev);
808
int
c4iw_register_device
(
struct
c4iw_dev
*dev);
809
void
c4iw_unregister_device
(
struct
c4iw_dev
*dev);
810
int
__init
c4iw_cm_init
(
void
);
811
void
__exit
c4iw_cm_term
(
void
);
812
void
c4iw_release_dev_ucontext
(
struct
c4iw_rdev
*rdev,
813
struct
c4iw_dev_ucontext
*uctx);
814
void
c4iw_init_dev_ucontext
(
struct
c4iw_rdev
*rdev,
815
struct
c4iw_dev_ucontext
*uctx);
816
int
c4iw_poll_cq
(
struct
ib_cq
*ibcq,
int
num_entries
,
struct
ib_wc
*
wc
);
817
int
c4iw_post_send
(
struct
ib_qp
*ibqp,
struct
ib_send_wr
*
wr
,
818
struct
ib_send_wr
**bad_wr);
819
int
c4iw_post_receive
(
struct
ib_qp
*ibqp,
struct
ib_recv_wr
*
wr
,
820
struct
ib_recv_wr
**bad_wr);
821
int
c4iw_bind_mw
(
struct
ib_qp
*qp,
struct
ib_mw
*mw,
822
struct
ib_mw_bind
*
mw_bind
);
823
int
c4iw_connect
(
struct
iw_cm_id
*
cm_id
,
struct
iw_cm_conn_param
*conn_param);
824
int
c4iw_create_listen
(
struct
iw_cm_id
*
cm_id
,
int
backlog
);
825
int
c4iw_destroy_listen
(
struct
iw_cm_id
*
cm_id
);
826
int
c4iw_accept_cr
(
struct
iw_cm_id
*
cm_id
,
struct
iw_cm_conn_param
*conn_param);
827
int
c4iw_reject_cr
(
struct
iw_cm_id
*
cm_id
,
const
void
*
pdata
,
u8
pdata_len);
828
void
c4iw_qp_add_ref
(
struct
ib_qp
*qp);
829
void
c4iw_qp_rem_ref
(
struct
ib_qp
*qp);
830
void
c4iw_free_fastreg_pbl
(
struct
ib_fast_reg_page_list
*page_list);
831
struct
ib_fast_reg_page_list
*
c4iw_alloc_fastreg_pbl
(
832
struct
ib_device
*
device
,
833
int
page_list_len);
834
struct
ib_mr
*
c4iw_alloc_fast_reg_mr
(
struct
ib_pd
*
pd
,
int
pbl_depth
);
835
int
c4iw_dealloc_mw
(
struct
ib_mw
*mw);
836
struct
ib_mw
*
c4iw_alloc_mw
(
struct
ib_pd
*
pd
);
837
struct
ib_mr
*
c4iw_reg_user_mr
(
struct
ib_pd
*
pd
,
u64
start
,
838
u64
length
,
u64
virt,
int
acc,
839
struct
ib_udata
*udata);
840
struct
ib_mr
*
c4iw_get_dma_mr
(
struct
ib_pd
*
pd
,
int
acc);
841
struct
ib_mr
*
c4iw_register_phys_mem
(
struct
ib_pd
*
pd
,
842
struct
ib_phys_buf
*buffer_list,
843
int
num_phys_buf,
844
int
acc,
845
u64
*iova_start);
846
int
c4iw_reregister_phys_mem
(
struct
ib_mr
*mr,
847
int
mr_rereg_mask,
848
struct
ib_pd
*
pd
,
849
struct
ib_phys_buf
*buffer_list,
850
int
num_phys_buf,
851
int
acc,
u64
*iova_start);
852
int
c4iw_dereg_mr
(
struct
ib_mr
*
ib_mr
);
853
int
c4iw_destroy_cq
(
struct
ib_cq
*
ib_cq
);
854
struct
ib_cq
*
c4iw_create_cq
(
struct
ib_device
*ibdev,
int
entries
,
855
int
vector
,
856
struct
ib_ucontext
*ib_context,
857
struct
ib_udata
*udata);
858
int
c4iw_resize_cq
(
struct
ib_cq
*cq,
int
cqe
,
struct
ib_udata
*udata);
859
int
c4iw_arm_cq
(
struct
ib_cq
*ibcq,
enum
ib_cq_notify_flags
flags
);
860
int
c4iw_destroy_qp
(
struct
ib_qp
*
ib_qp
);
861
struct
ib_qp
*
c4iw_create_qp
(
struct
ib_pd
*
pd
,
862
struct
ib_qp_init_attr
*attrs,
863
struct
ib_udata
*udata);
864
int
c4iw_ib_modify_qp
(
struct
ib_qp
*ibqp,
struct
ib_qp_attr
*
attr
,
865
int
attr_mask,
struct
ib_udata
*udata);
866
int
c4iw_ib_query_qp
(
struct
ib_qp
*ibqp,
struct
ib_qp_attr
*
attr
,
867
int
attr_mask,
struct
ib_qp_init_attr
*init_attr);
868
struct
ib_qp
*
c4iw_get_qp
(
struct
ib_device
*dev,
int
qpn);
869
u32
c4iw_rqtpool_alloc
(
struct
c4iw_rdev
*rdev,
int
size
);
870
void
c4iw_rqtpool_free
(
struct
c4iw_rdev
*rdev,
u32
addr
,
int
size
);
871
u32
c4iw_pblpool_alloc
(
struct
c4iw_rdev
*rdev,
int
size
);
872
void
c4iw_pblpool_free
(
struct
c4iw_rdev
*rdev,
u32
addr
,
int
size
);
873
u32
c4iw_ocqp_pool_alloc
(
struct
c4iw_rdev
*rdev,
int
size
);
874
void
c4iw_ocqp_pool_free
(
struct
c4iw_rdev
*rdev,
u32
addr
,
int
size
);
875
int
c4iw_ofld_send
(
struct
c4iw_rdev
*rdev,
struct
sk_buff
*
skb
);
876
void
c4iw_flush_hw_cq
(
struct
t4_cq
*cq);
877
void
c4iw_count_rcqes
(
struct
t4_cq
*cq,
struct
t4_wq
*wq,
int
*
count
);
878
void
c4iw_count_scqes
(
struct
t4_cq
*cq,
struct
t4_wq
*wq,
int
*
count
);
879
int
c4iw_ep_disconnect
(
struct
c4iw_ep
*ep,
int
abrupt,
gfp_t
gfp);
880
int
c4iw_flush_rq
(
struct
t4_wq
*wq,
struct
t4_cq
*cq,
int
count
);
881
int
c4iw_flush_sq
(
struct
t4_wq
*wq,
struct
t4_cq
*cq,
int
count
);
882
int
c4iw_ev_handler
(
struct
c4iw_dev
*rnicp,
u32
qid
);
883
u16
c4iw_rqes_posted
(
struct
c4iw_qp
*qhp);
884
int
c4iw_post_terminate
(
struct
c4iw_qp
*qhp,
struct
t4_cqe
*err_cqe);
885
u32
c4iw_get_cqid
(
struct
c4iw_rdev
*rdev,
struct
c4iw_dev_ucontext
*uctx);
886
void
c4iw_put_cqid
(
struct
c4iw_rdev
*rdev,
u32
qid
,
887
struct
c4iw_dev_ucontext
*uctx);
888
u32
c4iw_get_qpid
(
struct
c4iw_rdev
*rdev,
struct
c4iw_dev_ucontext
*uctx);
889
void
c4iw_put_qpid
(
struct
c4iw_rdev
*rdev,
u32
qid
,
890
struct
c4iw_dev_ucontext
*uctx);
891
void
c4iw_ev_dispatch
(
struct
c4iw_dev
*dev,
struct
t4_cqe
*err_cqe);
892
893
extern
struct
cxgb4_client
t4c_client
;
894
extern
c4iw_handler_func
c4iw_handlers
[
NUM_CPL_CMDS
];
895
extern
int
c4iw_max_read_depth
;
896
extern
int
db_fc_threshold
;
897
898
899
#endif
Generated on Thu Jan 10 2013 13:37:25 for Linux Kernel by
1.8.2