diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-01-12 19:37:25 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-16 04:17:15 -0500 |
commit | af19b49152bdb68fda894183e88096d6d1aa5c3d (patch) | |
tree | 811e6ecedf58c3356ac721a18d9a5270e9b2c40c /drivers/net/qlcnic/qlcnic.h | |
parent | 6eb3a8553345ba2b4efd5390709e158289b9ece4 (diff) |
qlcnic: Qlogic ethernet driver for CNA devices
o 1G/10G Ethernet Driver for Qlgic QLE8240 and QLE8242 CNA devices.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/qlcnic/qlcnic.h')
-rw-r--r-- | drivers/net/qlcnic/qlcnic.h | 1106 |
1 files changed, 1106 insertions, 0 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h new file mode 100644 index 000000000000..abec46846539 --- /dev/null +++ b/drivers/net/qlcnic/qlcnic.h | |||
@@ -0,0 +1,1106 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 - QLogic Corporation. | ||
3 | * All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version 2 | ||
8 | * of the License, or (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, but | ||
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, | ||
18 | * MA 02111-1307, USA. | ||
19 | * | ||
20 | * The full GNU General Public License is included in this distribution | ||
21 | * in the file called "COPYING". | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #ifndef _QLCNIC_H_ | ||
26 | #define _QLCNIC_H_ | ||
27 | |||
28 | #include <linux/module.h> | ||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/types.h> | ||
31 | #include <linux/ioport.h> | ||
32 | #include <linux/pci.h> | ||
33 | #include <linux/netdevice.h> | ||
34 | #include <linux/etherdevice.h> | ||
35 | #include <linux/ip.h> | ||
36 | #include <linux/in.h> | ||
37 | #include <linux/tcp.h> | ||
38 | #include <linux/skbuff.h> | ||
39 | #include <linux/firmware.h> | ||
40 | |||
41 | #include <linux/ethtool.h> | ||
42 | #include <linux/mii.h> | ||
43 | #include <linux/timer.h> | ||
44 | |||
45 | #include <linux/vmalloc.h> | ||
46 | |||
47 | #include <linux/io.h> | ||
48 | #include <asm/byteorder.h> | ||
49 | |||
50 | #include "qlcnic_hdr.h" | ||
51 | |||
52 | #define _QLCNIC_LINUX_MAJOR 5 | ||
53 | #define _QLCNIC_LINUX_MINOR 0 | ||
54 | #define _QLCNIC_LINUX_SUBVERSION 0 | ||
55 | #define QLCNIC_LINUX_VERSIONID "5.0.0" | ||
56 | |||
57 | #define QLCNIC_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) | ||
58 | #define _major(v) (((v) >> 24) & 0xff) | ||
59 | #define _minor(v) (((v) >> 16) & 0xff) | ||
60 | #define _build(v) ((v) & 0xffff) | ||
61 | |||
62 | /* version in image has weird encoding: | ||
63 | * 7:0 - major | ||
64 | * 15:8 - minor | ||
65 | * 31:16 - build (little endian) | ||
66 | */ | ||
67 | #define QLCNIC_DECODE_VERSION(v) \ | ||
68 | QLCNIC_VERSION_CODE(((v) & 0xff), (((v) >> 8) & 0xff), ((v) >> 16)) | ||
69 | |||
70 | #define QLCNIC_NUM_FLASH_SECTORS (64) | ||
71 | #define QLCNIC_FLASH_SECTOR_SIZE (64 * 1024) | ||
72 | #define QLCNIC_FLASH_TOTAL_SIZE (QLCNIC_NUM_FLASH_SECTORS \ | ||
73 | * QLCNIC_FLASH_SECTOR_SIZE) | ||
74 | |||
75 | #define RCV_DESC_RINGSIZE(rds_ring) \ | ||
76 | (sizeof(struct rcv_desc) * (rds_ring)->num_desc) | ||
77 | #define RCV_BUFF_RINGSIZE(rds_ring) \ | ||
78 | (sizeof(struct qlcnic_rx_buffer) * rds_ring->num_desc) | ||
79 | #define STATUS_DESC_RINGSIZE(sds_ring) \ | ||
80 | (sizeof(struct status_desc) * (sds_ring)->num_desc) | ||
81 | #define TX_BUFF_RINGSIZE(tx_ring) \ | ||
82 | (sizeof(struct qlcnic_cmd_buffer) * tx_ring->num_desc) | ||
83 | #define TX_DESC_RINGSIZE(tx_ring) \ | ||
84 | (sizeof(struct cmd_desc_type0) * tx_ring->num_desc) | ||
85 | |||
86 | #define QLCNIC_P3P_A0 0x50 | ||
87 | |||
88 | #define QLCNIC_IS_REVISION_P3P(REVISION) (REVISION >= QLCNIC_P3P_A0) | ||
89 | |||
90 | #define FIRST_PAGE_GROUP_START 0 | ||
91 | #define FIRST_PAGE_GROUP_END 0x100000 | ||
92 | |||
93 | #define P3_MAX_MTU (9600) | ||
94 | #define QLCNIC_MAX_ETHERHDR 32 /* This contains some padding */ | ||
95 | |||
96 | #define QLCNIC_P3_RX_BUF_MAX_LEN (QLCNIC_MAX_ETHERHDR + ETH_DATA_LEN) | ||
97 | #define QLCNIC_P3_RX_JUMBO_BUF_MAX_LEN (QLCNIC_MAX_ETHERHDR + P3_MAX_MTU) | ||
98 | #define QLCNIC_CT_DEFAULT_RX_BUF_LEN 2048 | ||
99 | #define QLCNIC_LRO_BUFFER_EXTRA 2048 | ||
100 | |||
101 | #define QLCNIC_RX_LRO_BUFFER_LENGTH (8060) | ||
102 | |||
103 | /* Opcodes to be used with the commands */ | ||
104 | #define TX_ETHER_PKT 0x01 | ||
105 | #define TX_TCP_PKT 0x02 | ||
106 | #define TX_UDP_PKT 0x03 | ||
107 | #define TX_IP_PKT 0x04 | ||
108 | #define TX_TCP_LSO 0x05 | ||
109 | #define TX_TCP_LSO6 0x06 | ||
110 | #define TX_IPSEC 0x07 | ||
111 | #define TX_IPSEC_CMD 0x0a | ||
112 | #define TX_TCPV6_PKT 0x0b | ||
113 | #define TX_UDPV6_PKT 0x0c | ||
114 | |||
115 | /* Tx defines */ | ||
116 | #define MAX_BUFFERS_PER_CMD 32 | ||
117 | #define TX_STOP_THRESH ((MAX_SKB_FRAGS >> 2) + 4) | ||
118 | #define QLCNIC_MAX_TX_TIMEOUTS 2 | ||
119 | |||
120 | /* | ||
121 | * Following are the states of the Phantom. Phantom will set them and | ||
122 | * Host will read to check if the fields are correct. | ||
123 | */ | ||
124 | #define PHAN_INITIALIZE_FAILED 0xffff | ||
125 | #define PHAN_INITIALIZE_COMPLETE 0xff01 | ||
126 | |||
127 | /* Host writes the following to notify that it has done the init-handshake */ | ||
128 | #define PHAN_INITIALIZE_ACK 0xf00f | ||
129 | #define PHAN_PEG_RCV_INITIALIZED 0xff01 | ||
130 | |||
131 | #define NUM_RCV_DESC_RINGS 3 | ||
132 | #define NUM_STS_DESC_RINGS 4 | ||
133 | |||
134 | #define RCV_RING_NORMAL 0 | ||
135 | #define RCV_RING_JUMBO 1 | ||
136 | #define RCV_RING_LRO 2 | ||
137 | |||
138 | #define MIN_CMD_DESCRIPTORS 64 | ||
139 | #define MIN_RCV_DESCRIPTORS 64 | ||
140 | #define MIN_JUMBO_DESCRIPTORS 32 | ||
141 | |||
142 | #define MAX_CMD_DESCRIPTORS 1024 | ||
143 | #define MAX_RCV_DESCRIPTORS_1G 4096 | ||
144 | #define MAX_RCV_DESCRIPTORS_10G 8192 | ||
145 | #define MAX_JUMBO_RCV_DESCRIPTORS_1G 512 | ||
146 | #define MAX_JUMBO_RCV_DESCRIPTORS_10G 1024 | ||
147 | #define MAX_LRO_RCV_DESCRIPTORS 8 | ||
148 | |||
149 | #define DEFAULT_RCV_DESCRIPTORS_1G 2048 | ||
150 | #define DEFAULT_RCV_DESCRIPTORS_10G 4096 | ||
151 | |||
152 | #define get_next_index(index, length) \ | ||
153 | (((index) + 1) & ((length) - 1)) | ||
154 | |||
155 | #define MPORT_MULTI_FUNCTION_MODE 0x2222 | ||
156 | |||
157 | /* | ||
158 | * Following data structures describe the descriptors that will be used. | ||
159 | * Added fileds of tcpHdrSize and ipHdrSize, The driver needs to do it only when | ||
160 | * we are doing LSO (above the 1500 size packet) only. | ||
161 | */ | ||
162 | |||
163 | #define FLAGS_VLAN_TAGGED 0x10 | ||
164 | #define FLAGS_VLAN_OOB 0x40 | ||
165 | |||
166 | #define qlcnic_set_tx_vlan_tci(cmd_desc, v) \ | ||
167 | (cmd_desc)->vlan_TCI = cpu_to_le16(v); | ||
168 | #define qlcnic_set_cmd_desc_port(cmd_desc, var) \ | ||
169 | ((cmd_desc)->port_ctxid |= ((var) & 0x0F)) | ||
170 | #define qlcnic_set_cmd_desc_ctxid(cmd_desc, var) \ | ||
171 | ((cmd_desc)->port_ctxid |= ((var) << 4 & 0xF0)) | ||
172 | |||
173 | #define qlcnic_set_tx_port(_desc, _port) \ | ||
174 | ((_desc)->port_ctxid = ((_port) & 0xf) | (((_port) << 4) & 0xf0)) | ||
175 | |||
176 | #define qlcnic_set_tx_flags_opcode(_desc, _flags, _opcode) \ | ||
177 | ((_desc)->flags_opcode = \ | ||
178 | cpu_to_le16(((_flags) & 0x7f) | (((_opcode) & 0x3f) << 7))) | ||
179 | |||
180 | #define qlcnic_set_tx_frags_len(_desc, _frags, _len) \ | ||
181 | ((_desc)->nfrags__length = \ | ||
182 | cpu_to_le32(((_frags) & 0xff) | (((_len) & 0xffffff) << 8))) | ||
183 | |||
184 | struct cmd_desc_type0 { | ||
185 | u8 tcp_hdr_offset; /* For LSO only */ | ||
186 | u8 ip_hdr_offset; /* For LSO only */ | ||
187 | __le16 flags_opcode; /* 15:13 unused, 12:7 opcode, 6:0 flags */ | ||
188 | __le32 nfrags__length; /* 31:8 total len, 7:0 frag count */ | ||
189 | |||
190 | __le64 addr_buffer2; | ||
191 | |||
192 | __le16 reference_handle; | ||
193 | __le16 mss; | ||
194 | u8 port_ctxid; /* 7:4 ctxid 3:0 port */ | ||
195 | u8 total_hdr_length; /* LSO only : MAC+IP+TCP Hdr size */ | ||
196 | __le16 conn_id; /* IPSec offoad only */ | ||
197 | |||
198 | __le64 addr_buffer3; | ||
199 | __le64 addr_buffer1; | ||
200 | |||
201 | __le16 buffer_length[4]; | ||
202 | |||
203 | __le64 addr_buffer4; | ||
204 | |||
205 | __le32 reserved2; | ||
206 | __le16 reserved; | ||
207 | __le16 vlan_TCI; | ||
208 | |||
209 | } __attribute__ ((aligned(64))); | ||
210 | |||
211 | /* Note: sizeof(rcv_desc) should always be a mutliple of 2 */ | ||
212 | struct rcv_desc { | ||
213 | __le16 reference_handle; | ||
214 | __le16 reserved; | ||
215 | __le32 buffer_length; /* allocated buffer length (usually 2K) */ | ||
216 | __le64 addr_buffer; | ||
217 | }; | ||
218 | |||
219 | /* opcode field in status_desc */ | ||
220 | #define QLCNIC_SYN_OFFLOAD 0x03 | ||
221 | #define QLCNIC_RXPKT_DESC 0x04 | ||
222 | #define QLCNIC_OLD_RXPKT_DESC 0x3f | ||
223 | #define QLCNIC_RESPONSE_DESC 0x05 | ||
224 | #define QLCNIC_LRO_DESC 0x12 | ||
225 | |||
226 | /* for status field in status_desc */ | ||
227 | #define STATUS_CKSUM_OK (2) | ||
228 | |||
229 | /* owner bits of status_desc */ | ||
230 | #define STATUS_OWNER_HOST (0x1ULL << 56) | ||
231 | #define STATUS_OWNER_PHANTOM (0x2ULL << 56) | ||
232 | |||
233 | /* Status descriptor: | ||
234 | 0-3 port, 4-7 status, 8-11 type, 12-27 total_length | ||
235 | 28-43 reference_handle, 44-47 protocol, 48-52 pkt_offset | ||
236 | 53-55 desc_cnt, 56-57 owner, 58-63 opcode | ||
237 | */ | ||
238 | #define qlcnic_get_sts_port(sts_data) \ | ||
239 | ((sts_data) & 0x0F) | ||
240 | #define qlcnic_get_sts_status(sts_data) \ | ||
241 | (((sts_data) >> 4) & 0x0F) | ||
242 | #define qlcnic_get_sts_type(sts_data) \ | ||
243 | (((sts_data) >> 8) & 0x0F) | ||
244 | #define qlcnic_get_sts_totallength(sts_data) \ | ||
245 | (((sts_data) >> 12) & 0xFFFF) | ||
246 | #define qlcnic_get_sts_refhandle(sts_data) \ | ||
247 | (((sts_data) >> 28) & 0xFFFF) | ||
248 | #define qlcnic_get_sts_prot(sts_data) \ | ||
249 | (((sts_data) >> 44) & 0x0F) | ||
250 | #define qlcnic_get_sts_pkt_offset(sts_data) \ | ||
251 | (((sts_data) >> 48) & 0x1F) | ||
252 | #define qlcnic_get_sts_desc_cnt(sts_data) \ | ||
253 | (((sts_data) >> 53) & 0x7) | ||
254 | #define qlcnic_get_sts_opcode(sts_data) \ | ||
255 | (((sts_data) >> 58) & 0x03F) | ||
256 | |||
257 | #define qlcnic_get_lro_sts_refhandle(sts_data) \ | ||
258 | ((sts_data) & 0x0FFFF) | ||
259 | #define qlcnic_get_lro_sts_length(sts_data) \ | ||
260 | (((sts_data) >> 16) & 0x0FFFF) | ||
261 | #define qlcnic_get_lro_sts_l2_hdr_offset(sts_data) \ | ||
262 | (((sts_data) >> 32) & 0x0FF) | ||
263 | #define qlcnic_get_lro_sts_l4_hdr_offset(sts_data) \ | ||
264 | (((sts_data) >> 40) & 0x0FF) | ||
265 | #define qlcnic_get_lro_sts_timestamp(sts_data) \ | ||
266 | (((sts_data) >> 48) & 0x1) | ||
267 | #define qlcnic_get_lro_sts_type(sts_data) \ | ||
268 | (((sts_data) >> 49) & 0x7) | ||
269 | #define qlcnic_get_lro_sts_push_flag(sts_data) \ | ||
270 | (((sts_data) >> 52) & 0x1) | ||
271 | #define qlcnic_get_lro_sts_seq_number(sts_data) \ | ||
272 | ((sts_data) & 0x0FFFFFFFF) | ||
273 | |||
274 | |||
275 | struct status_desc { | ||
276 | __le64 status_desc_data[2]; | ||
277 | } __attribute__ ((aligned(16))); | ||
278 | |||
279 | /* UNIFIED ROMIMAGE */ | ||
280 | #define QLCNIC_UNI_FW_MIN_SIZE 0xc8000 | ||
281 | #define QLCNIC_UNI_DIR_SECT_PRODUCT_TBL 0x0 | ||
282 | #define QLCNIC_UNI_DIR_SECT_BOOTLD 0x6 | ||
283 | #define QLCNIC_UNI_DIR_SECT_FW 0x7 | ||
284 | |||
285 | /*Offsets */ | ||
286 | #define QLCNIC_UNI_CHIP_REV_OFF 10 | ||
287 | #define QLCNIC_UNI_FLAGS_OFF 11 | ||
288 | #define QLCNIC_UNI_BIOS_VERSION_OFF 12 | ||
289 | #define QLCNIC_UNI_BOOTLD_IDX_OFF 27 | ||
290 | #define QLCNIC_UNI_FIRMWARE_IDX_OFF 29 | ||
291 | |||
292 | struct uni_table_desc{ | ||
293 | u32 findex; | ||
294 | u32 num_entries; | ||
295 | u32 entry_size; | ||
296 | u32 reserved[5]; | ||
297 | }; | ||
298 | |||
299 | struct uni_data_desc{ | ||
300 | u32 findex; | ||
301 | u32 size; | ||
302 | u32 reserved[5]; | ||
303 | }; | ||
304 | |||
305 | /* Magic number to let user know flash is programmed */ | ||
306 | #define QLCNIC_BDINFO_MAGIC 0x12345678 | ||
307 | |||
308 | #define QLCNIC_BRDTYPE_P3_REF_QG 0x0021 | ||
309 | #define QLCNIC_BRDTYPE_P3_HMEZ 0x0022 | ||
310 | #define QLCNIC_BRDTYPE_P3_10G_CX4_LP 0x0023 | ||
311 | #define QLCNIC_BRDTYPE_P3_4_GB 0x0024 | ||
312 | #define QLCNIC_BRDTYPE_P3_IMEZ 0x0025 | ||
313 | #define QLCNIC_BRDTYPE_P3_10G_SFP_PLUS 0x0026 | ||
314 | #define QLCNIC_BRDTYPE_P3_10000_BASE_T 0x0027 | ||
315 | #define QLCNIC_BRDTYPE_P3_XG_LOM 0x0028 | ||
316 | #define QLCNIC_BRDTYPE_P3_4_GB_MM 0x0029 | ||
317 | #define QLCNIC_BRDTYPE_P3_10G_SFP_CT 0x002a | ||
318 | #define QLCNIC_BRDTYPE_P3_10G_SFP_QT 0x002b | ||
319 | #define QLCNIC_BRDTYPE_P3_10G_CX4 0x0031 | ||
320 | #define QLCNIC_BRDTYPE_P3_10G_XFP 0x0032 | ||
321 | #define QLCNIC_BRDTYPE_P3_10G_TP 0x0080 | ||
322 | |||
323 | /* Flash memory map */ | ||
324 | #define QLCNIC_BRDCFG_START 0x4000 /* board config */ | ||
325 | #define QLCNIC_BOOTLD_START 0x10000 /* bootld */ | ||
326 | #define QLCNIC_IMAGE_START 0x43000 /* compressed image */ | ||
327 | #define QLCNIC_USER_START 0x3E8000 /* Firmare info */ | ||
328 | |||
329 | #define QLCNIC_FW_VERSION_OFFSET (QLCNIC_USER_START+0x408) | ||
330 | #define QLCNIC_FW_SIZE_OFFSET (QLCNIC_USER_START+0x40c) | ||
331 | #define QLCNIC_FW_SERIAL_NUM_OFFSET (QLCNIC_USER_START+0x81c) | ||
332 | #define QLCNIC_BIOS_VERSION_OFFSET (QLCNIC_USER_START+0x83c) | ||
333 | |||
334 | #define QLCNIC_BRDTYPE_OFFSET (QLCNIC_BRDCFG_START+0x8) | ||
335 | #define QLCNIC_FW_MAGIC_OFFSET (QLCNIC_BRDCFG_START+0x128) | ||
336 | |||
337 | #define QLCNIC_FW_MIN_SIZE (0x3fffff) | ||
338 | #define QLCNIC_UNIFIED_ROMIMAGE 0 | ||
339 | #define QLCNIC_FLASH_ROMIMAGE 1 | ||
340 | #define QLCNIC_UNKNOWN_ROMIMAGE 0xff | ||
341 | |||
342 | #define QLCNIC_UNIFIED_ROMIMAGE_NAME "phanfw.bin" | ||
343 | #define QLCNIC_FLASH_ROMIMAGE_NAME "flash" | ||
344 | |||
345 | extern char qlcnic_driver_name[]; | ||
346 | |||
347 | /* Number of status descriptors to handle per interrupt */ | ||
348 | #define MAX_STATUS_HANDLE (64) | ||
349 | |||
350 | /* | ||
351 | * qlcnic_skb_frag{} is to contain mapping info for each SG list. This | ||
352 | * has to be freed when DMA is complete. This is part of qlcnic_tx_buffer{}. | ||
353 | */ | ||
354 | struct qlcnic_skb_frag { | ||
355 | u64 dma; | ||
356 | u64 length; | ||
357 | }; | ||
358 | |||
359 | struct qlcnic_recv_crb { | ||
360 | u32 crb_rcv_producer[NUM_RCV_DESC_RINGS]; | ||
361 | u32 crb_sts_consumer[NUM_STS_DESC_RINGS]; | ||
362 | u32 sw_int_mask[NUM_STS_DESC_RINGS]; | ||
363 | }; | ||
364 | |||
365 | /* Following defines are for the state of the buffers */ | ||
366 | #define QLCNIC_BUFFER_FREE 0 | ||
367 | #define QLCNIC_BUFFER_BUSY 1 | ||
368 | |||
369 | /* | ||
370 | * There will be one qlcnic_buffer per skb packet. These will be | ||
371 | * used to save the dma info for pci_unmap_page() | ||
372 | */ | ||
373 | struct qlcnic_cmd_buffer { | ||
374 | struct sk_buff *skb; | ||
375 | struct qlcnic_skb_frag frag_array[MAX_BUFFERS_PER_CMD + 1]; | ||
376 | u32 frag_count; | ||
377 | }; | ||
378 | |||
379 | /* In rx_buffer, we do not need multiple fragments as is a single buffer */ | ||
380 | struct qlcnic_rx_buffer { | ||
381 | struct list_head list; | ||
382 | struct sk_buff *skb; | ||
383 | u64 dma; | ||
384 | u16 ref_handle; | ||
385 | u16 state; | ||
386 | }; | ||
387 | |||
388 | /* Board types */ | ||
389 | #define QLCNIC_GBE 0x01 | ||
390 | #define QLCNIC_XGBE 0x02 | ||
391 | |||
392 | /* | ||
393 | * One hardware_context{} per adapter | ||
394 | * contains interrupt info as well shared hardware info. | ||
395 | */ | ||
396 | struct qlcnic_hardware_context { | ||
397 | void __iomem *pci_base0; | ||
398 | void __iomem *ocm_win_crb; | ||
399 | |||
400 | unsigned long pci_len0; | ||
401 | |||
402 | u32 ocm_win; | ||
403 | u32 crb_win; | ||
404 | |||
405 | rwlock_t crb_lock; | ||
406 | struct mutex mem_lock; | ||
407 | |||
408 | u8 cut_through; | ||
409 | u8 revision_id; | ||
410 | u8 pci_func; | ||
411 | u8 linkup; | ||
412 | u16 port_type; | ||
413 | u16 board_type; | ||
414 | }; | ||
415 | |||
416 | struct qlcnic_adapter_stats { | ||
417 | u64 xmitcalled; | ||
418 | u64 xmitfinished; | ||
419 | u64 rxdropped; | ||
420 | u64 txdropped; | ||
421 | u64 csummed; | ||
422 | u64 rx_pkts; | ||
423 | u64 lro_pkts; | ||
424 | u64 rxbytes; | ||
425 | u64 txbytes; | ||
426 | }; | ||
427 | |||
428 | /* | ||
429 | * Rcv Descriptor Context. One such per Rcv Descriptor. There may | ||
430 | * be one Rcv Descriptor for normal packets, one for jumbo and may be others. | ||
431 | */ | ||
432 | struct qlcnic_host_rds_ring { | ||
433 | u32 producer; | ||
434 | u32 num_desc; | ||
435 | u32 dma_size; | ||
436 | u32 skb_size; | ||
437 | u32 flags; | ||
438 | void __iomem *crb_rcv_producer; | ||
439 | struct rcv_desc *desc_head; | ||
440 | struct qlcnic_rx_buffer *rx_buf_arr; | ||
441 | struct list_head free_list; | ||
442 | spinlock_t lock; | ||
443 | dma_addr_t phys_addr; | ||
444 | }; | ||
445 | |||
446 | struct qlcnic_host_sds_ring { | ||
447 | u32 consumer; | ||
448 | u32 num_desc; | ||
449 | void __iomem *crb_sts_consumer; | ||
450 | void __iomem *crb_intr_mask; | ||
451 | |||
452 | struct status_desc *desc_head; | ||
453 | struct qlcnic_adapter *adapter; | ||
454 | struct napi_struct napi; | ||
455 | struct list_head free_list[NUM_RCV_DESC_RINGS]; | ||
456 | |||
457 | int irq; | ||
458 | |||
459 | dma_addr_t phys_addr; | ||
460 | char name[IFNAMSIZ+4]; | ||
461 | }; | ||
462 | |||
463 | struct qlcnic_host_tx_ring { | ||
464 | u32 producer; | ||
465 | __le32 *hw_consumer; | ||
466 | u32 sw_consumer; | ||
467 | void __iomem *crb_cmd_producer; | ||
468 | u32 num_desc; | ||
469 | |||
470 | struct netdev_queue *txq; | ||
471 | |||
472 | struct qlcnic_cmd_buffer *cmd_buf_arr; | ||
473 | struct cmd_desc_type0 *desc_head; | ||
474 | dma_addr_t phys_addr; | ||
475 | dma_addr_t hw_cons_phys_addr; | ||
476 | }; | ||
477 | |||
478 | /* | ||
479 | * Receive context. There is one such structure per instance of the | ||
480 | * receive processing. Any state information that is relevant to | ||
481 | * the receive, and is must be in this structure. The global data may be | ||
482 | * present elsewhere. | ||
483 | */ | ||
484 | struct qlcnic_recv_context { | ||
485 | u32 state; | ||
486 | u16 context_id; | ||
487 | u16 virt_port; | ||
488 | |||
489 | struct qlcnic_host_rds_ring *rds_rings; | ||
490 | struct qlcnic_host_sds_ring *sds_rings; | ||
491 | }; | ||
492 | |||
493 | /* HW context creation */ | ||
494 | |||
495 | #define QLCNIC_OS_CRB_RETRY_COUNT 4000 | ||
496 | #define QLCNIC_CDRP_SIGNATURE_MAKE(pcifn, version) \ | ||
497 | (((pcifn) & 0xff) | (((version) & 0xff) << 8) | (0xcafe << 16)) | ||
498 | |||
499 | #define QLCNIC_CDRP_CMD_BIT 0x80000000 | ||
500 | |||
501 | /* | ||
502 | * All responses must have the QLCNIC_CDRP_CMD_BIT cleared | ||
503 | * in the crb QLCNIC_CDRP_CRB_OFFSET. | ||
504 | */ | ||
505 | #define QLCNIC_CDRP_FORM_RSP(rsp) (rsp) | ||
506 | #define QLCNIC_CDRP_IS_RSP(rsp) (((rsp) & QLCNIC_CDRP_CMD_BIT) == 0) | ||
507 | |||
508 | #define QLCNIC_CDRP_RSP_OK 0x00000001 | ||
509 | #define QLCNIC_CDRP_RSP_FAIL 0x00000002 | ||
510 | #define QLCNIC_CDRP_RSP_TIMEOUT 0x00000003 | ||
511 | |||
512 | /* | ||
513 | * All commands must have the QLCNIC_CDRP_CMD_BIT set in | ||
514 | * the crb QLCNIC_CDRP_CRB_OFFSET. | ||
515 | */ | ||
516 | #define QLCNIC_CDRP_FORM_CMD(cmd) (QLCNIC_CDRP_CMD_BIT | (cmd)) | ||
517 | #define QLCNIC_CDRP_IS_CMD(cmd) (((cmd) & QLCNIC_CDRP_CMD_BIT) != 0) | ||
518 | |||
519 | #define QLCNIC_CDRP_CMD_SUBMIT_CAPABILITIES 0x00000001 | ||
520 | #define QLCNIC_CDRP_CMD_READ_MAX_RDS_PER_CTX 0x00000002 | ||
521 | #define QLCNIC_CDRP_CMD_READ_MAX_SDS_PER_CTX 0x00000003 | ||
522 | #define QLCNIC_CDRP_CMD_READ_MAX_RULES_PER_CTX 0x00000004 | ||
523 | #define QLCNIC_CDRP_CMD_READ_MAX_RX_CTX 0x00000005 | ||
524 | #define QLCNIC_CDRP_CMD_READ_MAX_TX_CTX 0x00000006 | ||
525 | #define QLCNIC_CDRP_CMD_CREATE_RX_CTX 0x00000007 | ||
526 | #define QLCNIC_CDRP_CMD_DESTROY_RX_CTX 0x00000008 | ||
527 | #define QLCNIC_CDRP_CMD_CREATE_TX_CTX 0x00000009 | ||
528 | #define QLCNIC_CDRP_CMD_DESTROY_TX_CTX 0x0000000a | ||
529 | #define QLCNIC_CDRP_CMD_SETUP_STATISTICS 0x0000000e | ||
530 | #define QLCNIC_CDRP_CMD_GET_STATISTICS 0x0000000f | ||
531 | #define QLCNIC_CDRP_CMD_DELETE_STATISTICS 0x00000010 | ||
532 | #define QLCNIC_CDRP_CMD_SET_MTU 0x00000012 | ||
533 | #define QLCNIC_CDRP_CMD_READ_PHY 0x00000013 | ||
534 | #define QLCNIC_CDRP_CMD_WRITE_PHY 0x00000014 | ||
535 | #define QLCNIC_CDRP_CMD_READ_HW_REG 0x00000015 | ||
536 | #define QLCNIC_CDRP_CMD_GET_FLOW_CTL 0x00000016 | ||
537 | #define QLCNIC_CDRP_CMD_SET_FLOW_CTL 0x00000017 | ||
538 | #define QLCNIC_CDRP_CMD_READ_MAX_MTU 0x00000018 | ||
539 | #define QLCNIC_CDRP_CMD_READ_MAX_LRO 0x00000019 | ||
540 | #define QLCNIC_CDRP_CMD_CONFIGURE_TOE 0x0000001a | ||
541 | #define QLCNIC_CDRP_CMD_FUNC_ATTRIB 0x0000001b | ||
542 | #define QLCNIC_CDRP_CMD_READ_PEXQ_PARAMETERS 0x0000001c | ||
543 | #define QLCNIC_CDRP_CMD_GET_LIC_CAPABILITIES 0x0000001d | ||
544 | #define QLCNIC_CDRP_CMD_READ_MAX_LRO_PER_BOARD 0x0000001e | ||
545 | #define QLCNIC_CDRP_CMD_MAX 0x0000001f | ||
546 | |||
547 | #define QLCNIC_RCODE_SUCCESS 0 | ||
548 | #define QLCNIC_RCODE_TIMEOUT 17 | ||
549 | #define QLCNIC_DESTROY_CTX_RESET 0 | ||
550 | |||
551 | /* | ||
552 | * Capabilities Announced | ||
553 | */ | ||
554 | #define QLCNIC_CAP0_LEGACY_CONTEXT (1) | ||
555 | #define QLCNIC_CAP0_LEGACY_MN (1 << 2) | ||
556 | #define QLCNIC_CAP0_LSO (1 << 6) | ||
557 | #define QLCNIC_CAP0_JUMBO_CONTIGUOUS (1 << 7) | ||
558 | #define QLCNIC_CAP0_LRO_CONTIGUOUS (1 << 8) | ||
559 | |||
560 | /* | ||
561 | * Context state | ||
562 | */ | ||
563 | #define QLCNIC_HOST_CTX_STATE_ACTIVE 2 | ||
564 | |||
565 | /* | ||
566 | * Rx context | ||
567 | */ | ||
568 | |||
569 | struct qlcnic_hostrq_sds_ring { | ||
570 | __le64 host_phys_addr; /* Ring base addr */ | ||
571 | __le32 ring_size; /* Ring entries */ | ||
572 | __le16 msi_index; | ||
573 | __le16 rsvd; /* Padding */ | ||
574 | }; | ||
575 | |||
576 | struct qlcnic_hostrq_rds_ring { | ||
577 | __le64 host_phys_addr; /* Ring base addr */ | ||
578 | __le64 buff_size; /* Packet buffer size */ | ||
579 | __le32 ring_size; /* Ring entries */ | ||
580 | __le32 ring_kind; /* Class of ring */ | ||
581 | }; | ||
582 | |||
583 | struct qlcnic_hostrq_rx_ctx { | ||
584 | __le64 host_rsp_dma_addr; /* Response dma'd here */ | ||
585 | __le32 capabilities[4]; /* Flag bit vector */ | ||
586 | __le32 host_int_crb_mode; /* Interrupt crb usage */ | ||
587 | __le32 host_rds_crb_mode; /* RDS crb usage */ | ||
588 | /* These ring offsets are relative to data[0] below */ | ||
589 | __le32 rds_ring_offset; /* Offset to RDS config */ | ||
590 | __le32 sds_ring_offset; /* Offset to SDS config */ | ||
591 | __le16 num_rds_rings; /* Count of RDS rings */ | ||
592 | __le16 num_sds_rings; /* Count of SDS rings */ | ||
593 | __le16 rsvd1; /* Padding */ | ||
594 | __le16 rsvd2; /* Padding */ | ||
595 | u8 reserved[128]; /* reserve space for future expansion*/ | ||
596 | /* MUST BE 64-bit aligned. | ||
597 | The following is packed: | ||
598 | - N hostrq_rds_rings | ||
599 | - N hostrq_sds_rings */ | ||
600 | char data[0]; | ||
601 | }; | ||
602 | |||
603 | struct qlcnic_cardrsp_rds_ring{ | ||
604 | __le32 host_producer_crb; /* Crb to use */ | ||
605 | __le32 rsvd1; /* Padding */ | ||
606 | }; | ||
607 | |||
608 | struct qlcnic_cardrsp_sds_ring { | ||
609 | __le32 host_consumer_crb; /* Crb to use */ | ||
610 | __le32 interrupt_crb; /* Crb to use */ | ||
611 | }; | ||
612 | |||
613 | struct qlcnic_cardrsp_rx_ctx { | ||
614 | /* These ring offsets are relative to data[0] below */ | ||
615 | __le32 rds_ring_offset; /* Offset to RDS config */ | ||
616 | __le32 sds_ring_offset; /* Offset to SDS config */ | ||
617 | __le32 host_ctx_state; /* Starting State */ | ||
618 | __le32 num_fn_per_port; /* How many PCI fn share the port */ | ||
619 | __le16 num_rds_rings; /* Count of RDS rings */ | ||
620 | __le16 num_sds_rings; /* Count of SDS rings */ | ||
621 | __le16 context_id; /* Handle for context */ | ||
622 | u8 phys_port; /* Physical id of port */ | ||
623 | u8 virt_port; /* Virtual/Logical id of port */ | ||
624 | u8 reserved[128]; /* save space for future expansion */ | ||
625 | /* MUST BE 64-bit aligned. | ||
626 | The following is packed: | ||
627 | - N cardrsp_rds_rings | ||
628 | - N cardrs_sds_rings */ | ||
629 | char data[0]; | ||
630 | }; | ||
631 | |||
632 | #define SIZEOF_HOSTRQ_RX(HOSTRQ_RX, rds_rings, sds_rings) \ | ||
633 | (sizeof(HOSTRQ_RX) + \ | ||
634 | (rds_rings)*(sizeof(struct qlcnic_hostrq_rds_ring)) + \ | ||
635 | (sds_rings)*(sizeof(struct qlcnic_hostrq_sds_ring))) | ||
636 | |||
637 | #define SIZEOF_CARDRSP_RX(CARDRSP_RX, rds_rings, sds_rings) \ | ||
638 | (sizeof(CARDRSP_RX) + \ | ||
639 | (rds_rings)*(sizeof(struct qlcnic_cardrsp_rds_ring)) + \ | ||
640 | (sds_rings)*(sizeof(struct qlcnic_cardrsp_sds_ring))) | ||
641 | |||
642 | /* | ||
643 | * Tx context | ||
644 | */ | ||
645 | |||
646 | struct qlcnic_hostrq_cds_ring { | ||
647 | __le64 host_phys_addr; /* Ring base addr */ | ||
648 | __le32 ring_size; /* Ring entries */ | ||
649 | __le32 rsvd; /* Padding */ | ||
650 | }; | ||
651 | |||
652 | struct qlcnic_hostrq_tx_ctx { | ||
653 | __le64 host_rsp_dma_addr; /* Response dma'd here */ | ||
654 | __le64 cmd_cons_dma_addr; /* */ | ||
655 | __le64 dummy_dma_addr; /* */ | ||
656 | __le32 capabilities[4]; /* Flag bit vector */ | ||
657 | __le32 host_int_crb_mode; /* Interrupt crb usage */ | ||
658 | __le32 rsvd1; /* Padding */ | ||
659 | __le16 rsvd2; /* Padding */ | ||
660 | __le16 interrupt_ctl; | ||
661 | __le16 msi_index; | ||
662 | __le16 rsvd3; /* Padding */ | ||
663 | struct qlcnic_hostrq_cds_ring cds_ring; /* Desc of cds ring */ | ||
664 | u8 reserved[128]; /* future expansion */ | ||
665 | }; | ||
666 | |||
667 | struct qlcnic_cardrsp_cds_ring { | ||
668 | __le32 host_producer_crb; /* Crb to use */ | ||
669 | __le32 interrupt_crb; /* Crb to use */ | ||
670 | }; | ||
671 | |||
672 | struct qlcnic_cardrsp_tx_ctx { | ||
673 | __le32 host_ctx_state; /* Starting state */ | ||
674 | __le16 context_id; /* Handle for context */ | ||
675 | u8 phys_port; /* Physical id of port */ | ||
676 | u8 virt_port; /* Virtual/Logical id of port */ | ||
677 | struct qlcnic_cardrsp_cds_ring cds_ring; /* Card cds settings */ | ||
678 | u8 reserved[128]; /* future expansion */ | ||
679 | }; | ||
680 | |||
681 | #define SIZEOF_HOSTRQ_TX(HOSTRQ_TX) (sizeof(HOSTRQ_TX)) | ||
682 | #define SIZEOF_CARDRSP_TX(CARDRSP_TX) (sizeof(CARDRSP_TX)) | ||
683 | |||
684 | /* CRB */ | ||
685 | |||
686 | #define QLCNIC_HOST_RDS_CRB_MODE_UNIQUE 0 | ||
687 | #define QLCNIC_HOST_RDS_CRB_MODE_SHARED 1 | ||
688 | #define QLCNIC_HOST_RDS_CRB_MODE_CUSTOM 2 | ||
689 | #define QLCNIC_HOST_RDS_CRB_MODE_MAX 3 | ||
690 | |||
691 | #define QLCNIC_HOST_INT_CRB_MODE_UNIQUE 0 | ||
692 | #define QLCNIC_HOST_INT_CRB_MODE_SHARED 1 | ||
693 | #define QLCNIC_HOST_INT_CRB_MODE_NORX 2 | ||
694 | #define QLCNIC_HOST_INT_CRB_MODE_NOTX 3 | ||
695 | #define QLCNIC_HOST_INT_CRB_MODE_NORXTX 4 | ||
696 | |||
697 | |||
698 | /* MAC */ | ||
699 | |||
700 | #define MC_COUNT_P3 38 | ||
701 | |||
702 | #define QLCNIC_MAC_NOOP 0 | ||
703 | #define QLCNIC_MAC_ADD 1 | ||
704 | #define QLCNIC_MAC_DEL 2 | ||
705 | |||
706 | struct qlcnic_mac_list_s { | ||
707 | struct list_head list; | ||
708 | uint8_t mac_addr[ETH_ALEN+2]; | ||
709 | }; | ||
710 | |||
711 | /* | ||
712 | * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is | ||
713 | * adjusted based on configured MTU. | ||
714 | */ | ||
715 | #define QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US 3 | ||
716 | #define QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS 256 | ||
717 | #define QLCNIC_DEFAULT_INTR_COALESCE_TX_PACKETS 64 | ||
718 | #define QLCNIC_DEFAULT_INTR_COALESCE_TX_TIME_US 4 | ||
719 | |||
720 | #define QLCNIC_INTR_DEFAULT 0x04 | ||
721 | |||
722 | union qlcnic_nic_intr_coalesce_data { | ||
723 | struct { | ||
724 | u16 rx_packets; | ||
725 | u16 rx_time_us; | ||
726 | u16 tx_packets; | ||
727 | u16 tx_time_us; | ||
728 | } data; | ||
729 | u64 word; | ||
730 | }; | ||
731 | |||
732 | struct qlcnic_nic_intr_coalesce { | ||
733 | u16 stats_time_us; | ||
734 | u16 rate_sample_time; | ||
735 | u16 flags; | ||
736 | u16 rsvd_1; | ||
737 | u32 low_threshold; | ||
738 | u32 high_threshold; | ||
739 | union qlcnic_nic_intr_coalesce_data normal; | ||
740 | union qlcnic_nic_intr_coalesce_data low; | ||
741 | union qlcnic_nic_intr_coalesce_data high; | ||
742 | union qlcnic_nic_intr_coalesce_data irq; | ||
743 | }; | ||
744 | |||
745 | #define QLCNIC_HOST_REQUEST 0x13 | ||
746 | #define QLCNIC_REQUEST 0x14 | ||
747 | |||
748 | #define QLCNIC_MAC_EVENT 0x1 | ||
749 | |||
750 | #define QLCNIC_IP_UP 2 | ||
751 | #define QLCNIC_IP_DOWN 3 | ||
752 | |||
753 | /* | ||
754 | * Driver --> Firmware | ||
755 | */ | ||
756 | #define QLCNIC_H2C_OPCODE_START 0 | ||
757 | #define QLCNIC_H2C_OPCODE_CONFIG_RSS 1 | ||
758 | #define QLCNIC_H2C_OPCODE_CONFIG_RSS_TBL 2 | ||
759 | #define QLCNIC_H2C_OPCODE_CONFIG_INTR_COALESCE 3 | ||
760 | #define QLCNIC_H2C_OPCODE_CONFIG_LED 4 | ||
761 | #define QLCNIC_H2C_OPCODE_CONFIG_PROMISCUOUS 5 | ||
762 | #define QLCNIC_H2C_OPCODE_CONFIG_L2_MAC 6 | ||
763 | #define QLCNIC_H2C_OPCODE_LRO_REQUEST 7 | ||
764 | #define QLCNIC_H2C_OPCODE_GET_SNMP_STATS 8 | ||
765 | #define QLCNIC_H2C_OPCODE_PROXY_START_REQUEST 9 | ||
766 | #define QLCNIC_H2C_OPCODE_PROXY_STOP_REQUEST 10 | ||
767 | #define QLCNIC_H2C_OPCODE_PROXY_SET_MTU 11 | ||
768 | #define QLCNIC_H2C_OPCODE_PROXY_SET_VPORT_MISS_MODE 12 | ||
769 | #define QLCNIC_H2C_OPCODE_GET_FINGER_PRINT_REQUEST 13 | ||
770 | #define QLCNIC_H2C_OPCODE_INSTALL_LICENSE_REQUEST 14 | ||
771 | #define QLCNIC_H2C_OPCODE_GET_LICENSE_CAPABILITY_REQUEST 15 | ||
772 | #define QLCNIC_H2C_OPCODE_GET_NET_STATS 16 | ||
773 | #define QLCNIC_H2C_OPCODE_PROXY_UPDATE_P2V 17 | ||
774 | #define QLCNIC_H2C_OPCODE_CONFIG_IPADDR 18 | ||
775 | #define QLCNIC_H2C_OPCODE_CONFIG_LOOPBACK 19 | ||
776 | #define QLCNIC_H2C_OPCODE_PROXY_STOP_DONE 20 | ||
777 | #define QLCNIC_H2C_OPCODE_GET_LINKEVENT 21 | ||
778 | #define QLCNIC_C2C_OPCODE 22 | ||
779 | #define QLCNIC_H2C_OPCODE_CONFIG_BRIDGING 23 | ||
780 | #define QLCNIC_H2C_OPCODE_CONFIG_HW_LRO 24 | ||
781 | #define QLCNIC_H2C_OPCODE_LAST 25 | ||
782 | /* | ||
783 | * Firmware --> Driver | ||
784 | */ | ||
785 | |||
786 | #define QLCNIC_C2H_OPCODE_START 128 | ||
787 | #define QLCNIC_C2H_OPCODE_CONFIG_RSS_RESPONSE 129 | ||
788 | #define QLCNIC_C2H_OPCODE_CONFIG_RSS_TBL_RESPONSE 130 | ||
789 | #define QLCNIC_C2H_OPCODE_CONFIG_MAC_RESPONSE 131 | ||
790 | #define QLCNIC_C2H_OPCODE_CONFIG_PROMISCUOUS_RESPONSE 132 | ||
791 | #define QLCNIC_C2H_OPCODE_CONFIG_L2_MAC_RESPONSE 133 | ||
792 | #define QLCNIC_C2H_OPCODE_LRO_DELETE_RESPONSE 134 | ||
793 | #define QLCNIC_C2H_OPCODE_LRO_ADD_FAILURE_RESPONSE 135 | ||
794 | #define QLCNIC_C2H_OPCODE_GET_SNMP_STATS 136 | ||
795 | #define QLCNIC_C2H_OPCODE_GET_FINGER_PRINT_REPLY 137 | ||
796 | #define QLCNIC_C2H_OPCODE_INSTALL_LICENSE_REPLY 138 | ||
797 | #define QLCNIC_C2H_OPCODE_GET_LICENSE_CAPABILITIES_REPLY 139 | ||
798 | #define QLCNIC_C2H_OPCODE_GET_NET_STATS_RESPONSE 140 | ||
799 | #define QLCNIC_C2H_OPCODE_GET_LINKEVENT_RESPONSE 141 | ||
800 | #define QLCNIC_C2H_OPCODE_LAST 142 | ||
801 | |||
802 | #define VPORT_MISS_MODE_DROP 0 /* drop all unmatched */ | ||
803 | #define VPORT_MISS_MODE_ACCEPT_ALL 1 /* accept all packets */ | ||
804 | #define VPORT_MISS_MODE_ACCEPT_MULTI 2 /* accept unmatched multicast */ | ||
805 | |||
806 | #define QLCNIC_LRO_REQUEST_CLEANUP 4 | ||
807 | |||
808 | /* Capabilites received */ | ||
809 | #define QLCNIC_FW_CAPABILITY_BDG (1 << 8) | ||
810 | #define QLCNIC_FW_CAPABILITY_FVLANTX (1 << 9) | ||
811 | #define QLCNIC_FW_CAPABILITY_HW_LRO (1 << 10) | ||
812 | |||
813 | /* module types */ | ||
814 | #define LINKEVENT_MODULE_NOT_PRESENT 1 | ||
815 | #define LINKEVENT_MODULE_OPTICAL_UNKNOWN 2 | ||
816 | #define LINKEVENT_MODULE_OPTICAL_SRLR 3 | ||
817 | #define LINKEVENT_MODULE_OPTICAL_LRM 4 | ||
818 | #define LINKEVENT_MODULE_OPTICAL_SFP_1G 5 | ||
819 | #define LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE 6 | ||
820 | #define LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN 7 | ||
821 | #define LINKEVENT_MODULE_TWINAX 8 | ||
822 | |||
823 | #define LINKSPEED_10GBPS 10000 | ||
824 | #define LINKSPEED_1GBPS 1000 | ||
825 | #define LINKSPEED_100MBPS 100 | ||
826 | #define LINKSPEED_10MBPS 10 | ||
827 | |||
828 | #define LINKSPEED_ENCODED_10MBPS 0 | ||
829 | #define LINKSPEED_ENCODED_100MBPS 1 | ||
830 | #define LINKSPEED_ENCODED_1GBPS 2 | ||
831 | |||
832 | #define LINKEVENT_AUTONEG_DISABLED 0 | ||
833 | #define LINKEVENT_AUTONEG_ENABLED 1 | ||
834 | |||
835 | #define LINKEVENT_HALF_DUPLEX 0 | ||
836 | #define LINKEVENT_FULL_DUPLEX 1 | ||
837 | |||
838 | #define LINKEVENT_LINKSPEED_MBPS 0 | ||
839 | #define LINKEVENT_LINKSPEED_ENCODED 1 | ||
840 | |||
841 | #define AUTO_FW_RESET_ENABLED 0x01 | ||
842 | /* firmware response header: | ||
843 | * 63:58 - message type | ||
844 | * 57:56 - owner | ||
845 | * 55:53 - desc count | ||
846 | * 52:48 - reserved | ||
847 | * 47:40 - completion id | ||
848 | * 39:32 - opcode | ||
849 | * 31:16 - error code | ||
850 | * 15:00 - reserved | ||
851 | */ | ||
852 | #define qlcnic_get_nic_msg_opcode(msg_hdr) \ | ||
853 | ((msg_hdr >> 32) & 0xFF) | ||
854 | |||
855 | struct qlcnic_fw_msg { | ||
856 | union { | ||
857 | struct { | ||
858 | u64 hdr; | ||
859 | u64 body[7]; | ||
860 | }; | ||
861 | u64 words[8]; | ||
862 | }; | ||
863 | }; | ||
864 | |||
865 | struct qlcnic_nic_req { | ||
866 | __le64 qhdr; | ||
867 | __le64 req_hdr; | ||
868 | __le64 words[6]; | ||
869 | }; | ||
870 | |||
871 | struct qlcnic_mac_req { | ||
872 | u8 op; | ||
873 | u8 tag; | ||
874 | u8 mac_addr[6]; | ||
875 | }; | ||
876 | |||
877 | #define QLCNIC_MSI_ENABLED 0x02 | ||
878 | #define QLCNIC_MSIX_ENABLED 0x04 | ||
879 | #define QLCNIC_LRO_ENABLED 0x08 | ||
880 | #define QLCNIC_BRIDGE_ENABLED 0X10 | ||
881 | #define QLCNIC_DIAG_ENABLED 0x20 | ||
882 | #define QLCNIC_IS_MSI_FAMILY(adapter) \ | ||
883 | ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED)) | ||
884 | |||
885 | #define MSIX_ENTRIES_PER_ADAPTER NUM_STS_DESC_RINGS | ||
886 | #define QLCNIC_MSIX_TBL_SPACE 8192 | ||
887 | #define QLCNIC_PCI_REG_MSIX_TBL 0x44 | ||
888 | |||
889 | #define QLCNIC_NETDEV_WEIGHT 128 | ||
890 | #define QLCNIC_ADAPTER_UP_MAGIC 777 | ||
891 | |||
892 | #define __QLCNIC_FW_ATTACHED 0 | ||
893 | #define __QLCNIC_DEV_UP 1 | ||
894 | #define __QLCNIC_RESETTING 2 | ||
895 | #define __QLCNIC_START_FW 4 | ||
896 | |||
897 | struct qlcnic_adapter { | ||
898 | struct qlcnic_hardware_context ahw; | ||
899 | |||
900 | struct net_device *netdev; | ||
901 | struct pci_dev *pdev; | ||
902 | struct list_head mac_list; | ||
903 | |||
904 | spinlock_t tx_clean_lock; | ||
905 | |||
906 | u16 num_txd; | ||
907 | u16 num_rxd; | ||
908 | u16 num_jumbo_rxd; | ||
909 | u16 num_lro_rxd; | ||
910 | |||
911 | u8 max_rds_rings; | ||
912 | u8 max_sds_rings; | ||
913 | u8 driver_mismatch; | ||
914 | u8 msix_supported; | ||
915 | u8 rx_csum; | ||
916 | u8 pci_using_dac; | ||
917 | u8 portnum; | ||
918 | u8 physical_port; | ||
919 | |||
920 | u8 mc_enabled; | ||
921 | u8 max_mc_count; | ||
922 | u8 rss_supported; | ||
923 | u8 rsrvd1; | ||
924 | u8 fw_wait_cnt; | ||
925 | u8 fw_fail_cnt; | ||
926 | u8 tx_timeo_cnt; | ||
927 | u8 need_fw_reset; | ||
928 | |||
929 | u8 has_link_events; | ||
930 | u8 fw_type; | ||
931 | u16 tx_context_id; | ||
932 | u16 mtu; | ||
933 | u16 is_up; | ||
934 | |||
935 | u16 link_speed; | ||
936 | u16 link_duplex; | ||
937 | u16 link_autoneg; | ||
938 | u16 module_type; | ||
939 | |||
940 | u32 capabilities; | ||
941 | u32 flags; | ||
942 | u32 irq; | ||
943 | u32 temp; | ||
944 | |||
945 | u32 int_vec_bit; | ||
946 | u32 heartbit; | ||
947 | |||
948 | u8 dev_state; | ||
949 | u8 rsrd1; | ||
950 | u32 rsrd2; | ||
951 | |||
952 | |||
953 | u8 mac_addr[ETH_ALEN]; | ||
954 | |||
955 | struct qlcnic_adapter_stats stats; | ||
956 | |||
957 | struct qlcnic_recv_context recv_ctx; | ||
958 | struct qlcnic_host_tx_ring *tx_ring; | ||
959 | |||
960 | void __iomem *tgt_mask_reg; | ||
961 | void __iomem *tgt_status_reg; | ||
962 | void __iomem *crb_int_state_reg; | ||
963 | void __iomem *isr_int_vec; | ||
964 | |||
965 | struct msix_entry msix_entries[MSIX_ENTRIES_PER_ADAPTER]; | ||
966 | |||
967 | struct delayed_work fw_work; | ||
968 | |||
969 | struct work_struct tx_timeout_task; | ||
970 | |||
971 | struct qlcnic_nic_intr_coalesce coal; | ||
972 | |||
973 | unsigned long state; | ||
974 | __le32 file_prd_off; /*File fw product offset*/ | ||
975 | u32 fw_version; | ||
976 | const struct firmware *fw; | ||
977 | }; | ||
978 | |||
979 | int qlcnic_fw_cmd_query_phy(struct qlcnic_adapter *adapter, u32 reg, u32 *val); | ||
980 | int qlcnic_fw_cmd_set_phy(struct qlcnic_adapter *adapter, u32 reg, u32 val); | ||
981 | |||
982 | u32 qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off); | ||
983 | int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *, ulong off, u32 data); | ||
984 | int qlcnic_pci_mem_write_2M(struct qlcnic_adapter *, u64 off, u64 data); | ||
985 | int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *, u64 off, u64 *data); | ||
986 | |||
987 | #define QLCRD32(adapter, off) \ | ||
988 | (qlcnic_hw_read_wx_2M(adapter, off)) | ||
989 | #define QLCWR32(adapter, off, val) \ | ||
990 | (qlcnic_hw_write_wx_2M(adapter, off, val)) | ||
991 | |||
992 | int qlcnic_pcie_sem_lock(struct qlcnic_adapter *, int, u32); | ||
993 | void qlcnic_pcie_sem_unlock(struct qlcnic_adapter *, int); | ||
994 | |||
995 | #define qlcnic_rom_lock(a) \ | ||
996 | qlcnic_pcie_sem_lock((a), 2, QLCNIC_ROM_LOCK_ID) | ||
997 | #define qlcnic_rom_unlock(a) \ | ||
998 | qlcnic_pcie_sem_unlock((a), 2) | ||
999 | #define qlcnic_phy_lock(a) \ | ||
1000 | qlcnic_pcie_sem_lock((a), 3, QLCNIC_PHY_LOCK_ID) | ||
1001 | #define qlcnic_phy_unlock(a) \ | ||
1002 | qlcnic_pcie_sem_unlock((a), 3) | ||
1003 | #define qlcnic_api_lock(a) \ | ||
1004 | qlcnic_pcie_sem_lock((a), 5, 0) | ||
1005 | #define qlcnic_api_unlock(a) \ | ||
1006 | qlcnic_pcie_sem_unlock((a), 5) | ||
1007 | #define qlcnic_sw_lock(a) \ | ||
1008 | qlcnic_pcie_sem_lock((a), 6, 0) | ||
1009 | #define qlcnic_sw_unlock(a) \ | ||
1010 | qlcnic_pcie_sem_unlock((a), 6) | ||
1011 | #define crb_win_lock(a) \ | ||
1012 | qlcnic_pcie_sem_lock((a), 7, QLCNIC_CRB_WIN_LOCK_ID) | ||
1013 | #define crb_win_unlock(a) \ | ||
1014 | qlcnic_pcie_sem_unlock((a), 7) | ||
1015 | |||
1016 | int qlcnic_get_board_info(struct qlcnic_adapter *adapter); | ||
1017 | int qlcnic_wol_supported(struct qlcnic_adapter *adapter); | ||
1018 | |||
1019 | /* Functions from qlcnic_init.c */ | ||
1020 | int qlcnic_phantom_init(struct qlcnic_adapter *adapter); | ||
1021 | int qlcnic_load_firmware(struct qlcnic_adapter *adapter); | ||
1022 | int qlcnic_need_fw_reset(struct qlcnic_adapter *adapter); | ||
1023 | void qlcnic_request_firmware(struct qlcnic_adapter *adapter); | ||
1024 | void qlcnic_release_firmware(struct qlcnic_adapter *adapter); | ||
1025 | int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter); | ||
1026 | |||
1027 | int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, int addr, int *valp); | ||
1028 | int qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr, | ||
1029 | u8 *bytes, size_t size); | ||
1030 | int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter); | ||
1031 | void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter); | ||
1032 | |||
1033 | void __iomem *qlcnic_get_ioaddr(struct qlcnic_adapter *, u32); | ||
1034 | |||
1035 | int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter); | ||
1036 | void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter); | ||
1037 | |||
1038 | void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter); | ||
1039 | void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter); | ||
1040 | |||
1041 | int qlcnic_init_firmware(struct qlcnic_adapter *adapter); | ||
1042 | void qlcnic_watchdog_task(struct work_struct *work); | ||
1043 | void qlcnic_post_rx_buffers(struct qlcnic_adapter *adapter, u32 ringid, | ||
1044 | struct qlcnic_host_rds_ring *rds_ring); | ||
1045 | int qlcnic_process_rcv_ring(struct qlcnic_host_sds_ring *sds_ring, int max); | ||
1046 | void qlcnic_set_multi(struct net_device *netdev); | ||
1047 | void qlcnic_free_mac_list(struct qlcnic_adapter *adapter); | ||
1048 | int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32); | ||
1049 | int qlcnic_config_intr_coalesce(struct qlcnic_adapter *adapter); | ||
1050 | int qlcnic_config_rss(struct qlcnic_adapter *adapter, int enable); | ||
1051 | int qlcnic_config_ipaddr(struct qlcnic_adapter *adapter, u32 ip, int cmd); | ||
1052 | int qlcnic_linkevent_request(struct qlcnic_adapter *adapter, int enable); | ||
1053 | void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup); | ||
1054 | |||
1055 | int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu); | ||
1056 | int qlcnic_change_mtu(struct net_device *netdev, int new_mtu); | ||
1057 | int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter, int enable); | ||
1058 | int qlcnic_config_bridged_mode(struct qlcnic_adapter *adapter, int enable); | ||
1059 | int qlcnic_send_lro_cleanup(struct qlcnic_adapter *adapter); | ||
1060 | void qlcnic_update_cmd_producer(struct qlcnic_adapter *adapter, | ||
1061 | struct qlcnic_host_tx_ring *tx_ring); | ||
1062 | int qlcnic_get_mac_addr(struct qlcnic_adapter *adapter, u64 *mac); | ||
1063 | |||
1064 | /* Functions from qlcnic_main.c */ | ||
1065 | int qlcnic_reset_context(struct qlcnic_adapter *); | ||
1066 | |||
1067 | /* | ||
1068 | * QLOGIC Board information | ||
1069 | */ | ||
1070 | |||
1071 | #define QLCNIC_MAX_BOARD_NAME_LEN 64 | ||
1072 | struct qlcnic_brdinfo { | ||
1073 | unsigned short vendor; | ||
1074 | unsigned short device; | ||
1075 | unsigned short sub_vendor; | ||
1076 | unsigned short sub_device; | ||
1077 | char short_name[QLCNIC_MAX_BOARD_NAME_LEN]; | ||
1078 | }; | ||
1079 | |||
1080 | static const struct qlcnic_brdinfo qlcnic_boards[] = { | ||
1081 | {0x1077, 0x8020, 0x1077, 0x203, "8200 Series Single Port 10GbE CNA"}, | ||
1082 | {0x1077, 0x8020, 0x1077, 0x207, "8200 Series Dual Port 10GbE CNA"}, | ||
1083 | {0x1077, 0x8020, 0x1077, 0x20b, | ||
1084 | "3200 Series Dual Port 10Gb Intelligent Ethernet Adapter"}, | ||
1085 | {0x1077, 0x8020, 0x1077, 0x20c, | ||
1086 | "3200 Series Quad Port 1Gb Intelligent Ethernet Adapter"}, | ||
1087 | {0x1077, 0x8020, 0x1077, 0x20f, | ||
1088 | "3200 Series Single Port 10Gb Intelligent Ethernet Adapter"}, | ||
1089 | {0x1077, 0x8020, 0x0, 0x0, "cLOM8214 1/10GbE Controller"}, | ||
1090 | }; | ||
1091 | |||
1092 | #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards) | ||
1093 | |||
1094 | static inline u32 qlcnic_tx_avail(struct qlcnic_host_tx_ring *tx_ring) | ||
1095 | { | ||
1096 | smp_mb(); | ||
1097 | if (tx_ring->producer < tx_ring->sw_consumer) | ||
1098 | return tx_ring->sw_consumer - tx_ring->producer; | ||
1099 | else | ||
1100 | return tx_ring->sw_consumer + tx_ring->num_desc - | ||
1101 | tx_ring->producer; | ||
1102 | } | ||
1103 | |||
1104 | extern const struct ethtool_ops qlcnic_ethtool_ops; | ||
1105 | |||
1106 | #endif /* __QLCNIC_H_ */ | ||