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
net
ethernet
chelsio
cxgb4
cxgb4_uld.h
Go to the documentation of this file.
1
/*
2
* This file is part of the Chelsio T4 Ethernet driver for Linux.
3
*
4
* Copyright (c) 2003-2010 Chelsio Communications, Inc. All rights reserved.
5
*
6
* This software is available to you under a choice of one of two
7
* licenses. You may choose to be licensed under the terms of the GNU
8
* General Public License (GPL) Version 2, available from the file
9
* COPYING in the main directory of this source tree, or the
10
* OpenIB.org BSD license below:
11
*
12
* Redistribution and use in source and binary forms, with or
13
* without modification, are permitted provided that the following
14
* conditions are met:
15
*
16
* - Redistributions of source code must retain the above
17
* copyright notice, this list of conditions and the following
18
* disclaimer.
19
*
20
* - Redistributions in binary form must reproduce the above
21
* copyright notice, this list of conditions and the following
22
* disclaimer in the documentation and/or other materials
23
* provided with the distribution.
24
*
25
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
* SOFTWARE.
33
*/
34
35
#ifndef __CXGB4_OFLD_H
36
#define __CXGB4_OFLD_H
37
38
#include <
linux/cache.h
>
39
#include <
linux/spinlock.h
>
40
#include <
linux/skbuff.h
>
41
#include <
linux/atomic.h
>
42
43
/* CPL message priority levels */
44
enum
{
45
CPL_PRIORITY_DATA
= 0,
/* data messages */
46
CPL_PRIORITY_SETUP
= 1,
/* connection setup messages */
47
CPL_PRIORITY_TEARDOWN
= 0,
/* connection teardown messages */
48
CPL_PRIORITY_LISTEN
= 1,
/* listen start/stop messages */
49
CPL_PRIORITY_ACK
= 1,
/* RX ACK messages */
50
CPL_PRIORITY_CONTROL
= 1
/* control messages */
51
};
52
53
#define INIT_TP_WR(w, tid) do { \
54
(w)->wr.wr_hi = htonl(FW_WR_OP(FW_TP_WR) | \
55
FW_WR_IMMDLEN(sizeof(*w) - sizeof(w->wr))); \
56
(w)->wr.wr_mid = htonl(FW_WR_LEN16(DIV_ROUND_UP(sizeof(*w), 16)) | \
57
FW_WR_FLOWID(tid)); \
58
(w)->wr.wr_lo = cpu_to_be64(0); \
59
} while (0)
60
61
#define INIT_TP_WR_CPL(w, cpl, tid) do { \
62
INIT_TP_WR(w, tid); \
63
OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \
64
} while (0)
65
66
#define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
67
(w)->wr.wr_hi = htonl(FW_WR_OP(FW_ULPTX_WR) | FW_WR_ATOMIC(atomic)); \
68
(w)->wr.wr_mid = htonl(FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
69
FW_WR_FLOWID(tid)); \
70
(w)->wr.wr_lo = cpu_to_be64(0); \
71
} while (0)
72
73
/* Special asynchronous notification message */
74
#define CXGB4_MSG_AN ((void *)1)
75
76
struct
serv_entry
{
77
void
*
data
;
78
};
79
80
union
aopen_entry
{
81
void
*
data
;
82
union
aopen_entry
*
next
;
83
};
84
85
/*
86
* Holds the size, base address, free list start, etc of the TID, server TID,
87
* and active-open TID tables. The tables themselves are allocated dynamically.
88
*/
89
struct
tid_info
{
90
void
**
tid_tab
;
91
unsigned
int
ntids
;
92
93
struct
serv_entry
*
stid_tab
;
94
unsigned
long
*
stid_bmap
;
95
unsigned
int
nstids
;
96
unsigned
int
stid_base
;
97
98
union
aopen_entry
*
atid_tab
;
99
unsigned
int
natids
;
100
101
unsigned
int
nftids
;
102
unsigned
int
ftid_base
;
103
unsigned
int
aftid_base
;
104
unsigned
int
aftid_end
;
105
/* Server filter region */
106
unsigned
int
sftid_base
;
107
unsigned
int
nsftids
;
108
109
spinlock_t
atid_lock
____cacheline_aligned_in_smp
;
110
union
aopen_entry
*
afree
;
111
unsigned
int
atids_in_use
;
112
113
spinlock_t
stid_lock
;
114
unsigned
int
stids_in_use
;
115
116
atomic_t
tids_in_use
;
117
};
118
119
static
inline
void
*lookup_tid(
const
struct
tid_info
*
t
,
unsigned
int
tid)
120
{
121
return
tid < t->
ntids
? t->
tid_tab
[tid] :
NULL
;
122
}
123
124
static
inline
void
*lookup_atid(
const
struct
tid_info
*
t
,
unsigned
int
atid)
125
{
126
return
atid < t->
natids
? t->
atid_tab
[atid].data :
NULL
;
127
}
128
129
static
inline
void
*lookup_stid(
const
struct
tid_info
*
t
,
unsigned
int
stid)
130
{
131
stid -= t->
stid_base
;
132
return
stid < t->
nstids
? t->
stid_tab
[stid].data :
NULL
;
133
}
134
135
static
inline
void
cxgb4_insert_tid(
struct
tid_info
*
t
,
void
*
data
,
136
unsigned
int
tid)
137
{
138
t->
tid_tab
[tid] =
data
;
139
atomic_inc
(&t->
tids_in_use
);
140
}
141
142
int
cxgb4_alloc_atid
(
struct
tid_info
*
t
,
void
*
data
);
143
int
cxgb4_alloc_stid
(
struct
tid_info
*
t
,
int
family
,
void
*
data
);
144
void
cxgb4_free_atid
(
struct
tid_info
*
t
,
unsigned
int
atid);
145
void
cxgb4_free_stid
(
struct
tid_info
*
t
,
unsigned
int
stid,
int
family
);
146
void
cxgb4_remove_tid
(
struct
tid_info
*
t
,
unsigned
int
qid
,
unsigned
int
tid);
147
148
struct
in6_addr
;
149
150
int
cxgb4_create_server
(
const
struct
net_device
*
dev
,
unsigned
int
stid,
151
__be32
sip,
__be16
sport,
unsigned
int
queue
);
152
153
static
inline
void
set_wr_txq(
struct
sk_buff
*
skb
,
int
prio
,
int
queue
)
154
{
155
skb_set_queue_mapping(skb, (queue << 1) | prio);
156
}
157
158
enum
cxgb4_uld
{
159
CXGB4_ULD_RDMA
,
160
CXGB4_ULD_ISCSI
,
161
CXGB4_ULD_MAX
162
};
163
164
enum
cxgb4_state
{
165
CXGB4_STATE_UP
,
166
CXGB4_STATE_START_RECOVERY
,
167
CXGB4_STATE_DOWN
,
168
CXGB4_STATE_DETACH
169
};
170
171
enum
cxgb4_control
{
172
CXGB4_CONTROL_DB_FULL
,
173
CXGB4_CONTROL_DB_EMPTY
,
174
CXGB4_CONTROL_DB_DROP
,
175
};
176
177
struct
pci_dev
;
178
struct
l2t_data
;
179
struct
net_device
;
180
struct
pkt_gl
;
181
struct
tp_tcp_stats
;
182
183
struct
cxgb4_range
{
184
unsigned
int
start
;
185
unsigned
int
size
;
186
};
187
188
struct
cxgb4_virt_res
{
/* virtualized HW resources */
189
struct
cxgb4_range
ddp
;
190
struct
cxgb4_range
iscsi
;
191
struct
cxgb4_range
stag
;
192
struct
cxgb4_range
rq
;
193
struct
cxgb4_range
pbl
;
194
struct
cxgb4_range
qp
;
195
struct
cxgb4_range
cq
;
196
struct
cxgb4_range
ocq
;
197
};
198
199
#define OCQ_WIN_OFFSET(pdev, vres) \
200
(pci_resource_len((pdev), 2) - roundup_pow_of_two((vres)->ocq.size))
201
202
/*
203
* Block of information the LLD provides to ULDs attaching to a device.
204
*/
205
struct
cxgb4_lld_info
{
206
struct
pci_dev
*
pdev
;
/* associated PCI device */
207
struct
l2t_data
*
l2t
;
/* L2 table */
208
struct
tid_info
*
tids
;
/* TID table */
209
struct
net_device
**
ports
;
/* device ports */
210
const
struct
cxgb4_virt_res
*
vr
;
/* assorted HW resources */
211
const
unsigned
short
*
mtus
;
/* MTU table */
212
const
unsigned
short
*
rxq_ids
;
/* the ULD's Rx queue ids */
213
unsigned
short
nrxq
;
/* # of Rx queues */
214
unsigned
short
ntxq
;
/* # of Tx queues */
215
unsigned
char
nchan
:4;
/* # of channels */
216
unsigned
char
nports
:4;
/* # of ports */
217
unsigned
char
wr_cred
;
/* WR 16-byte credits */
218
unsigned
char
adapter_type
;
/* type of adapter */
219
unsigned
char
fw_api_ver
;
/* FW API version */
220
unsigned
int
fw_vers
;
/* FW version */
221
unsigned
int
iscsi_iolen
;
/* iSCSI max I/O length */
222
unsigned
short
udb_density
;
/* # of user DB/page */
223
unsigned
short
ucq_density
;
/* # of user CQs/page */
224
void
__iomem
*
gts_reg
;
/* address of GTS register */
225
void
__iomem
*
db_reg
;
/* address of kernel doorbell */
226
int
dbfifo_int_thresh
;
/* doorbell fifo int threshold */
227
};
228
229
struct
cxgb4_uld_info
{
230
const
char
*
name
;
231
void
*(*add)(
const
struct
cxgb4_lld_info
*
p
);
232
int
(*
rx_handler
)(
void
*
handle
,
const
__be64
*
rsp
,
233
const
struct
pkt_gl
*gl);
234
int
(*
state_change
)(
void
*
handle
,
enum
cxgb4_state
new_state
);
235
int
(*
control
)(
void
*
handle
,
enum
cxgb4_control
control
, ...);
236
};
237
238
int
cxgb4_register_uld
(
enum
cxgb4_uld
type
,
const
struct
cxgb4_uld_info
*
p
);
239
int
cxgb4_unregister_uld
(
enum
cxgb4_uld
type
);
240
int
cxgb4_ofld_send
(
struct
net_device
*
dev
,
struct
sk_buff
*skb);
241
unsigned
int
cxgb4_dbfifo_count
(
const
struct
net_device
*
dev
,
int
lpfifo);
242
unsigned
int
cxgb4_port_chan
(
const
struct
net_device
*
dev
);
243
unsigned
int
cxgb4_port_viid
(
const
struct
net_device
*
dev
);
244
unsigned
int
cxgb4_port_idx
(
const
struct
net_device
*
dev
);
245
unsigned
int
cxgb4_best_mtu
(
const
unsigned
short
*mtus,
unsigned
short
mtu,
246
unsigned
int
*
idx
);
247
void
cxgb4_get_tcp_stats
(
struct
pci_dev
*pdev,
struct
tp_tcp_stats
*
v4
,
248
struct
tp_tcp_stats
*v6);
249
void
cxgb4_iscsi_init
(
struct
net_device
*
dev
,
unsigned
int
tag_mask,
250
const
unsigned
int
*pgsz_order);
251
struct
sk_buff
*
cxgb4_pktgl_to_skb
(
const
struct
pkt_gl
*gl,
252
unsigned
int
skb_len,
unsigned
int
pull_len);
253
int
cxgb4_sync_txq_pidx
(
struct
net_device
*
dev
,
u16
qid
,
u16
pidx,
u16
size
);
254
int
cxgb4_flush_eq_cache
(
struct
net_device
*
dev
);
255
#endif
/* !__CXGB4_OFLD_H */
Generated on Thu Jan 10 2013 14:00:28 for Linux Kernel by
1.8.2