1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Linux network driver for QLogic BR-series Converged Network Adapter. |
4 | */ |
5 | /* |
6 | * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. |
7 | * Copyright (c) 2014-2015 QLogic Corporation |
8 | * All rights reserved |
9 | * www.qlogic.com |
10 | */ |
11 | |
12 | /* BNA Hardware and Firmware Interface */ |
13 | |
14 | /* Skipping statistics collection to avoid clutter. |
15 | * Command is no longer needed: |
16 | * MTU |
17 | * TxQ Stop |
18 | * RxQ Stop |
19 | * RxF Enable/Disable |
20 | * |
21 | * HDS-off request is dynamic |
22 | * keep structures as multiple of 32-bit fields for alignment. |
23 | * All values must be written in big-endian. |
24 | */ |
25 | #ifndef __BFI_ENET_H__ |
26 | #define __BFI_ENET_H__ |
27 | |
28 | #include "bfa_defs.h" |
29 | #include "bfi.h" |
30 | |
31 | #define BFI_ENET_CFG_MAX 32 /* Max resources per PF */ |
32 | |
33 | #define BFI_ENET_TXQ_PRIO_MAX 8 |
34 | #define BFI_ENET_RX_QSET_MAX 16 |
35 | #define BFI_ENET_TXQ_WI_VECT_MAX 4 |
36 | |
37 | #define BFI_ENET_VLAN_ID_MAX 4096 |
38 | #define BFI_ENET_VLAN_BLOCK_SIZE 512 /* in bits */ |
39 | #define BFI_ENET_VLAN_BLOCKS_MAX \ |
40 | (BFI_ENET_VLAN_ID_MAX / BFI_ENET_VLAN_BLOCK_SIZE) |
41 | #define BFI_ENET_VLAN_WORD_SIZE 32 /* in bits */ |
42 | #define BFI_ENET_VLAN_WORDS_MAX \ |
43 | (BFI_ENET_VLAN_BLOCK_SIZE / BFI_ENET_VLAN_WORD_SIZE) |
44 | |
45 | #define 64 /* entries */ |
46 | #define 10 /* 32-bit words */ |
47 | |
48 | union bfi_addr_be_u { |
49 | struct { |
50 | u32 addr_hi; /* Most Significant 32-bits */ |
51 | u32 addr_lo; /* Least Significant 32-Bits */ |
52 | } __packed a32; |
53 | } __packed; |
54 | |
55 | /* T X Q U E U E D E F I N E S */ |
56 | /* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */ |
57 | /* TxQ Entry Opcodes */ |
58 | #define BFI_ENET_TXQ_WI_SEND (0x402) /* Single Frame Transmission */ |
59 | #define BFI_ENET_TXQ_WI_SEND_LSO (0x403) /* Multi-Frame Transmission */ |
60 | #define BFI_ENET_TXQ_WI_EXTENSION (0x104) /* Extension WI */ |
61 | |
62 | /* TxQ Entry Control Flags */ |
63 | #define BFI_ENET_TXQ_WI_CF_FCOE_CRC BIT(8) |
64 | #define BFI_ENET_TXQ_WI_CF_IPID_MODE BIT(5) |
65 | #define BFI_ENET_TXQ_WI_CF_INS_PRIO BIT(4) |
66 | #define BFI_ENET_TXQ_WI_CF_INS_VLAN BIT(3) |
67 | #define BFI_ENET_TXQ_WI_CF_UDP_CKSUM BIT(2) |
68 | #define BFI_ENET_TXQ_WI_CF_TCP_CKSUM BIT(1) |
69 | #define BFI_ENET_TXQ_WI_CF_IP_CKSUM BIT(0) |
70 | |
71 | struct bfi_enet_txq_wi_base { |
72 | u8 reserved; |
73 | u8 num_vectors; /* number of vectors present */ |
74 | u16 opcode; |
75 | /* BFI_ENET_TXQ_WI_SEND or BFI_ENET_TXQ_WI_SEND_LSO */ |
76 | u16 flags; /* OR of all the flags */ |
77 | u16 l4_hdr_size_n_offset; |
78 | u16 vlan_tag; |
79 | u16 lso_mss; /* Only 14 LSB are valid */ |
80 | u32 frame_length; /* Only 24 LSB are valid */ |
81 | } __packed; |
82 | |
83 | struct bfi_enet_txq_wi_ext { |
84 | u16 reserved; |
85 | u16 opcode; /* BFI_ENET_TXQ_WI_EXTENSION */ |
86 | u32 reserved2[3]; |
87 | } __packed; |
88 | |
89 | struct bfi_enet_txq_wi_vector { /* Tx Buffer Descriptor */ |
90 | u16 reserved; |
91 | u16 length; /* Only 14 LSB are valid */ |
92 | union bfi_addr_be_u addr; |
93 | } __packed; |
94 | |
95 | /* TxQ Entry Structure */ |
96 | struct bfi_enet_txq_entry { |
97 | union { |
98 | struct bfi_enet_txq_wi_base base; |
99 | struct bfi_enet_txq_wi_ext ext; |
100 | } __packed wi; |
101 | struct bfi_enet_txq_wi_vector vector[BFI_ENET_TXQ_WI_VECT_MAX]; |
102 | } __packed; |
103 | |
104 | #define wi_hdr wi.base |
105 | #define wi_ext_hdr wi.ext |
106 | |
107 | #define BFI_ENET_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \ |
108 | (((_hdr_size) << 10) | ((_offset) & 0x3FF)) |
109 | |
110 | /* R X Q U E U E D E F I N E S */ |
111 | struct bfi_enet_rxq_entry { |
112 | union bfi_addr_be_u rx_buffer; |
113 | } __packed; |
114 | |
115 | /* R X C O M P L E T I O N Q U E U E D E F I N E S */ |
116 | /* CQ Entry Flags */ |
117 | #define BFI_ENET_CQ_EF_MAC_ERROR BIT(0) |
118 | #define BFI_ENET_CQ_EF_FCS_ERROR BIT(1) |
119 | #define BFI_ENET_CQ_EF_TOO_LONG BIT(2) |
120 | #define BFI_ENET_CQ_EF_FC_CRC_OK BIT(3) |
121 | |
122 | #define BFI_ENET_CQ_EF_RSVD1 BIT(4) |
123 | #define BFI_ENET_CQ_EF_L4_CKSUM_OK BIT(5) |
124 | #define BFI_ENET_CQ_EF_L3_CKSUM_OK BIT(6) |
125 | #define BIT(7) |
126 | |
127 | #define BFI_ENET_CQ_EF_UDP BIT(8) |
128 | #define BFI_ENET_CQ_EF_TCP BIT(9) |
129 | #define BFI_ENET_CQ_EF_IP_OPTIONS BIT(10) |
130 | #define BFI_ENET_CQ_EF_IPV6 BIT(11) |
131 | |
132 | #define BFI_ENET_CQ_EF_IPV4 BIT(12) |
133 | #define BFI_ENET_CQ_EF_VLAN BIT(13) |
134 | #define BIT(14) |
135 | #define BFI_ENET_CQ_EF_RSVD2 BIT(15) |
136 | |
137 | #define BFI_ENET_CQ_EF_MCAST_MATCH BIT(16) |
138 | #define BFI_ENET_CQ_EF_MCAST BIT(17) |
139 | #define BFI_ENET_CQ_EF_BCAST BIT(18) |
140 | #define BFI_ENET_CQ_EF_REMOTE BIT(19) |
141 | |
142 | #define BFI_ENET_CQ_EF_LOCAL BIT(20) |
143 | |
144 | /* CQ Entry Structure */ |
145 | struct bfi_enet_cq_entry { |
146 | u32 flags; |
147 | u16 vlan_tag; |
148 | u16 length; |
149 | u32 ; |
150 | u8 valid; |
151 | u8 reserved1; |
152 | u8 reserved2; |
153 | u8 rxq_id; |
154 | } __packed; |
155 | |
156 | /* E N E T C O N T R O L P A T H C O M M A N D S */ |
157 | struct bfi_enet_q { |
158 | union bfi_addr_u pg_tbl; |
159 | union bfi_addr_u first_entry; |
160 | u16 pages; /* # of pages */ |
161 | u16 page_sz; |
162 | } __packed; |
163 | |
164 | struct bfi_enet_txq { |
165 | struct bfi_enet_q q; |
166 | u8 priority; |
167 | u8 rsvd[3]; |
168 | } __packed; |
169 | |
170 | struct bfi_enet_rxq { |
171 | struct bfi_enet_q q; |
172 | u16 rx_buffer_size; |
173 | u16 rsvd; |
174 | } __packed; |
175 | |
176 | struct bfi_enet_cq { |
177 | struct bfi_enet_q q; |
178 | } __packed; |
179 | |
180 | struct bfi_enet_ib_cfg { |
181 | u8 int_pkt_dma; |
182 | u8 int_enabled; |
183 | u8 int_pkt_enabled; |
184 | u8 continuous_coalescing; |
185 | u8 msix; |
186 | u8 rsvd[3]; |
187 | u32 coalescing_timeout; |
188 | u32 inter_pkt_timeout; |
189 | u8 inter_pkt_count; |
190 | u8 rsvd1[3]; |
191 | } __packed; |
192 | |
193 | struct bfi_enet_ib { |
194 | union bfi_addr_u index_addr; |
195 | union { |
196 | u16 msix_index; |
197 | u16 intx_bitmask; |
198 | } __packed intr; |
199 | u16 rsvd; |
200 | } __packed; |
201 | |
202 | /* ENET command messages */ |
203 | enum bfi_enet_h2i_msgs { |
204 | /* Rx Commands */ |
205 | BFI_ENET_H2I_RX_CFG_SET_REQ = 1, |
206 | BFI_ENET_H2I_RX_CFG_CLR_REQ = 2, |
207 | |
208 | BFI_ENET_H2I_RIT_CFG_REQ = 3, |
209 | = 4, |
210 | = 5, |
211 | BFI_ENET_H2I_RX_PROMISCUOUS_REQ = 6, |
212 | BFI_ENET_H2I_RX_DEFAULT_REQ = 7, |
213 | |
214 | BFI_ENET_H2I_MAC_UCAST_SET_REQ = 8, |
215 | BFI_ENET_H2I_MAC_UCAST_CLR_REQ = 9, |
216 | BFI_ENET_H2I_MAC_UCAST_ADD_REQ = 10, |
217 | BFI_ENET_H2I_MAC_UCAST_DEL_REQ = 11, |
218 | |
219 | BFI_ENET_H2I_MAC_MCAST_ADD_REQ = 12, |
220 | BFI_ENET_H2I_MAC_MCAST_DEL_REQ = 13, |
221 | BFI_ENET_H2I_MAC_MCAST_FILTER_REQ = 14, |
222 | |
223 | BFI_ENET_H2I_RX_VLAN_SET_REQ = 15, |
224 | BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ = 16, |
225 | |
226 | /* Tx Commands */ |
227 | BFI_ENET_H2I_TX_CFG_SET_REQ = 17, |
228 | BFI_ENET_H2I_TX_CFG_CLR_REQ = 18, |
229 | |
230 | /* Port Commands */ |
231 | BFI_ENET_H2I_PORT_ADMIN_UP_REQ = 19, |
232 | BFI_ENET_H2I_SET_PAUSE_REQ = 20, |
233 | BFI_ENET_H2I_DIAG_LOOPBACK_REQ = 21, |
234 | |
235 | /* Get Attributes Command */ |
236 | BFI_ENET_H2I_GET_ATTR_REQ = 22, |
237 | |
238 | /* Statistics Commands */ |
239 | BFI_ENET_H2I_STATS_GET_REQ = 23, |
240 | BFI_ENET_H2I_STATS_CLR_REQ = 24, |
241 | |
242 | BFI_ENET_H2I_WOL_MAGIC_REQ = 25, |
243 | BFI_ENET_H2I_WOL_FRAME_REQ = 26, |
244 | |
245 | BFI_ENET_H2I_MAX = 27, |
246 | }; |
247 | |
248 | enum bfi_enet_i2h_msgs { |
249 | /* Rx Responses */ |
250 | BFI_ENET_I2H_RX_CFG_SET_RSP = |
251 | BFA_I2HM(BFI_ENET_H2I_RX_CFG_SET_REQ), |
252 | BFI_ENET_I2H_RX_CFG_CLR_RSP = |
253 | BFA_I2HM(BFI_ENET_H2I_RX_CFG_CLR_REQ), |
254 | |
255 | BFI_ENET_I2H_RIT_CFG_RSP = |
256 | BFA_I2HM(BFI_ENET_H2I_RIT_CFG_REQ), |
257 | = |
258 | BFA_I2HM(BFI_ENET_H2I_RSS_CFG_REQ), |
259 | = |
260 | BFA_I2HM(BFI_ENET_H2I_RSS_ENABLE_REQ), |
261 | BFI_ENET_I2H_RX_PROMISCUOUS_RSP = |
262 | BFA_I2HM(BFI_ENET_H2I_RX_PROMISCUOUS_REQ), |
263 | BFI_ENET_I2H_RX_DEFAULT_RSP = |
264 | BFA_I2HM(BFI_ENET_H2I_RX_DEFAULT_REQ), |
265 | |
266 | BFI_ENET_I2H_MAC_UCAST_SET_RSP = |
267 | BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_SET_REQ), |
268 | BFI_ENET_I2H_MAC_UCAST_CLR_RSP = |
269 | BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_CLR_REQ), |
270 | BFI_ENET_I2H_MAC_UCAST_ADD_RSP = |
271 | BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_ADD_REQ), |
272 | BFI_ENET_I2H_MAC_UCAST_DEL_RSP = |
273 | BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_DEL_REQ), |
274 | |
275 | BFI_ENET_I2H_MAC_MCAST_ADD_RSP = |
276 | BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_ADD_REQ), |
277 | BFI_ENET_I2H_MAC_MCAST_DEL_RSP = |
278 | BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_DEL_REQ), |
279 | BFI_ENET_I2H_MAC_MCAST_FILTER_RSP = |
280 | BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_FILTER_REQ), |
281 | |
282 | BFI_ENET_I2H_RX_VLAN_SET_RSP = |
283 | BFA_I2HM(BFI_ENET_H2I_RX_VLAN_SET_REQ), |
284 | |
285 | BFI_ENET_I2H_RX_VLAN_STRIP_ENABLE_RSP = |
286 | BFA_I2HM(BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ), |
287 | |
288 | /* Tx Responses */ |
289 | BFI_ENET_I2H_TX_CFG_SET_RSP = |
290 | BFA_I2HM(BFI_ENET_H2I_TX_CFG_SET_REQ), |
291 | BFI_ENET_I2H_TX_CFG_CLR_RSP = |
292 | BFA_I2HM(BFI_ENET_H2I_TX_CFG_CLR_REQ), |
293 | |
294 | /* Port Responses */ |
295 | BFI_ENET_I2H_PORT_ADMIN_RSP = |
296 | BFA_I2HM(BFI_ENET_H2I_PORT_ADMIN_UP_REQ), |
297 | |
298 | BFI_ENET_I2H_SET_PAUSE_RSP = |
299 | BFA_I2HM(BFI_ENET_H2I_SET_PAUSE_REQ), |
300 | BFI_ENET_I2H_DIAG_LOOPBACK_RSP = |
301 | BFA_I2HM(BFI_ENET_H2I_DIAG_LOOPBACK_REQ), |
302 | |
303 | /* Attributes Response */ |
304 | BFI_ENET_I2H_GET_ATTR_RSP = |
305 | BFA_I2HM(BFI_ENET_H2I_GET_ATTR_REQ), |
306 | |
307 | /* Statistics Responses */ |
308 | BFI_ENET_I2H_STATS_GET_RSP = |
309 | BFA_I2HM(BFI_ENET_H2I_STATS_GET_REQ), |
310 | BFI_ENET_I2H_STATS_CLR_RSP = |
311 | BFA_I2HM(BFI_ENET_H2I_STATS_CLR_REQ), |
312 | |
313 | BFI_ENET_I2H_WOL_MAGIC_RSP = |
314 | BFA_I2HM(BFI_ENET_H2I_WOL_MAGIC_REQ), |
315 | BFI_ENET_I2H_WOL_FRAME_RSP = |
316 | BFA_I2HM(BFI_ENET_H2I_WOL_FRAME_REQ), |
317 | |
318 | /* AENs */ |
319 | BFI_ENET_I2H_LINK_DOWN_AEN = BFA_I2HM(BFI_ENET_H2I_MAX), |
320 | BFI_ENET_I2H_LINK_UP_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 1), |
321 | |
322 | BFI_ENET_I2H_PORT_ENABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 2), |
323 | BFI_ENET_I2H_PORT_DISABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 3), |
324 | |
325 | BFI_ENET_I2H_BW_UPDATE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 4), |
326 | }; |
327 | |
328 | /* The following error codes can be returned by the enet commands */ |
329 | enum bfi_enet_err { |
330 | BFI_ENET_CMD_OK = 0, |
331 | BFI_ENET_CMD_FAIL = 1, |
332 | BFI_ENET_CMD_DUP_ENTRY = 2, /* !< Duplicate entry in CAM */ |
333 | BFI_ENET_CMD_CAM_FULL = 3, /* !< CAM is full */ |
334 | BFI_ENET_CMD_NOT_OWNER = 4, /* !< Not permitted, b'cos not owner */ |
335 | BFI_ENET_CMD_NOT_EXEC = 5, /* !< Was not sent to f/w at all */ |
336 | BFI_ENET_CMD_WAITING = 6, /* !< Waiting for completion */ |
337 | BFI_ENET_CMD_PORT_DISABLED = 7, /* !< port in disabled state */ |
338 | }; |
339 | |
340 | /* Generic Request |
341 | * |
342 | * bfi_enet_req is used by: |
343 | * BFI_ENET_H2I_RX_CFG_CLR_REQ |
344 | * BFI_ENET_H2I_TX_CFG_CLR_REQ |
345 | */ |
346 | struct bfi_enet_req { |
347 | struct bfi_msgq_mhdr mh; |
348 | } __packed; |
349 | |
350 | /* Enable/Disable Request |
351 | * |
352 | * bfi_enet_enable_req is used by: |
353 | * BFI_ENET_H2I_RSS_ENABLE_REQ (enet_id must be zero) |
354 | * BFI_ENET_H2I_RX_PROMISCUOUS_REQ (enet_id must be zero) |
355 | * BFI_ENET_H2I_RX_DEFAULT_REQ (enet_id must be zero) |
356 | * BFI_ENET_H2I_RX_MAC_MCAST_FILTER_REQ |
357 | * BFI_ENET_H2I_PORT_ADMIN_UP_REQ (enet_id must be zero) |
358 | */ |
359 | struct bfi_enet_enable_req { |
360 | struct bfi_msgq_mhdr mh; |
361 | u8 enable; /* 1 = enable; 0 = disable */ |
362 | u8 rsvd[3]; |
363 | } __packed; |
364 | |
365 | /* Generic Response */ |
366 | struct bfi_enet_rsp { |
367 | struct bfi_msgq_mhdr mh; |
368 | u8 error; /*!< if error see cmd_offset */ |
369 | u8 rsvd; |
370 | u16 cmd_offset; /*!< offset to invalid parameter */ |
371 | } __packed; |
372 | |
373 | /* GLOBAL CONFIGURATION */ |
374 | |
375 | /* bfi_enet_attr_req is used by: |
376 | * BFI_ENET_H2I_GET_ATTR_REQ |
377 | */ |
378 | struct bfi_enet_attr_req { |
379 | struct bfi_msgq_mhdr mh; |
380 | } __packed; |
381 | |
382 | /* bfi_enet_attr_rsp is used by: |
383 | * BFI_ENET_I2H_GET_ATTR_RSP |
384 | */ |
385 | struct bfi_enet_attr_rsp { |
386 | struct bfi_msgq_mhdr mh; |
387 | u8 error; /*!< if error see cmd_offset */ |
388 | u8 rsvd; |
389 | u16 cmd_offset; /*!< offset to invalid parameter */ |
390 | u32 max_cfg; |
391 | u32 max_ucmac; |
392 | u32 rit_size; |
393 | } __packed; |
394 | |
395 | /* Tx Configuration |
396 | * |
397 | * bfi_enet_tx_cfg is used by: |
398 | * BFI_ENET_H2I_TX_CFG_SET_REQ |
399 | */ |
400 | enum bfi_enet_tx_vlan_mode { |
401 | BFI_ENET_TX_VLAN_NOP = 0, |
402 | BFI_ENET_TX_VLAN_INS = 1, |
403 | BFI_ENET_TX_VLAN_WI = 2, |
404 | }; |
405 | |
406 | struct bfi_enet_tx_cfg { |
407 | u8 vlan_mode; /*!< processing mode */ |
408 | u8 rsvd; |
409 | u16 vlan_id; |
410 | u8 admit_tagged_frame; |
411 | u8 apply_vlan_filter; |
412 | u8 add_to_vswitch; |
413 | u8 rsvd1[1]; |
414 | } __packed; |
415 | |
416 | struct bfi_enet_tx_cfg_req { |
417 | struct bfi_msgq_mhdr mh; |
418 | u8 num_queues; /* # of Tx Queues */ |
419 | u8 rsvd[3]; |
420 | |
421 | struct { |
422 | struct bfi_enet_txq q; |
423 | struct bfi_enet_ib ib; |
424 | } __packed q_cfg[BFI_ENET_TXQ_PRIO_MAX]; |
425 | |
426 | struct bfi_enet_ib_cfg ib_cfg; |
427 | |
428 | struct bfi_enet_tx_cfg tx_cfg; |
429 | }; |
430 | |
431 | struct bfi_enet_tx_cfg_rsp { |
432 | struct bfi_msgq_mhdr mh; |
433 | u8 error; |
434 | u8 hw_id; /* For debugging */ |
435 | u8 rsvd[2]; |
436 | struct { |
437 | u32 q_dbell; /* PCI base address offset */ |
438 | u32 i_dbell; /* PCI base address offset */ |
439 | u8 hw_qid; /* For debugging */ |
440 | u8 rsvd[3]; |
441 | } __packed q_handles[BFI_ENET_TXQ_PRIO_MAX]; |
442 | }; |
443 | |
444 | /* Rx Configuration |
445 | * |
446 | * bfi_enet_rx_cfg is used by: |
447 | * BFI_ENET_H2I_RX_CFG_SET_REQ |
448 | */ |
449 | enum bfi_enet_rxq_type { |
450 | BFI_ENET_RXQ_SINGLE = 1, |
451 | BFI_ENET_RXQ_LARGE_SMALL = 2, |
452 | BFI_ENET_RXQ_HDS = 3, |
453 | BFI_ENET_RXQ_HDS_OPT_BASED = 4, |
454 | }; |
455 | |
456 | enum bfi_enet_hds_type { |
457 | BFI_ENET_HDS_FORCED = 0x01, |
458 | BFI_ENET_HDS_IPV6_UDP = 0x02, |
459 | BFI_ENET_HDS_IPV6_TCP = 0x04, |
460 | BFI_ENET_HDS_IPV4_TCP = 0x08, |
461 | BFI_ENET_HDS_IPV4_UDP = 0x10, |
462 | }; |
463 | |
464 | struct bfi_enet_rx_cfg { |
465 | u8 rxq_type; |
466 | u8 rsvd[1]; |
467 | u16 frame_size; |
468 | |
469 | struct { |
470 | u8 ; |
471 | u8 force_offset; |
472 | u8 type; |
473 | u8 rsvd1; |
474 | } __packed hds; |
475 | |
476 | u8 multi_buffer; |
477 | u8 strip_vlan; |
478 | u8 drop_untagged; |
479 | u8 rsvd2; |
480 | } __packed; |
481 | |
482 | /* |
483 | * Multicast frames are received on the ql of q-set index zero. |
484 | * On the completion queue. RxQ ID = even is for large/data buffer queues |
485 | * and RxQ ID = odd is for small/header buffer queues. |
486 | */ |
487 | struct bfi_enet_rx_cfg_req { |
488 | struct bfi_msgq_mhdr mh; |
489 | u8 num_queue_sets; /* # of Rx Queue Sets */ |
490 | u8 rsvd[3]; |
491 | |
492 | struct { |
493 | struct bfi_enet_rxq ql; /* large/data/single buffers */ |
494 | struct bfi_enet_rxq qs; /* small/header buffers */ |
495 | struct bfi_enet_cq cq; |
496 | struct bfi_enet_ib ib; |
497 | } __packed q_cfg[BFI_ENET_RX_QSET_MAX]; |
498 | |
499 | struct bfi_enet_ib_cfg ib_cfg; |
500 | |
501 | struct bfi_enet_rx_cfg rx_cfg; |
502 | } __packed; |
503 | |
504 | struct bfi_enet_rx_cfg_rsp { |
505 | struct bfi_msgq_mhdr mh; |
506 | u8 error; |
507 | u8 hw_id; /* For debugging */ |
508 | u8 rsvd[2]; |
509 | struct { |
510 | u32 ql_dbell; /* PCI base address offset */ |
511 | u32 qs_dbell; /* PCI base address offset */ |
512 | u32 i_dbell; /* PCI base address offset */ |
513 | u8 hw_lqid; /* For debugging */ |
514 | u8 hw_sqid; /* For debugging */ |
515 | u8 hw_cqid; /* For debugging */ |
516 | u8 rsvd; |
517 | } __packed q_handles[BFI_ENET_RX_QSET_MAX]; |
518 | } __packed; |
519 | |
520 | /* RIT |
521 | * |
522 | * bfi_enet_rit_req is used by: |
523 | * BFI_ENET_H2I_RIT_CFG_REQ |
524 | */ |
525 | struct bfi_enet_rit_req { |
526 | struct bfi_msgq_mhdr mh; |
527 | u16 size; /* number of table-entries used */ |
528 | u8 rsvd[2]; |
529 | u8 table[BFI_ENET_RSS_RIT_MAX]; |
530 | } __packed; |
531 | |
532 | /* RSS |
533 | * |
534 | * bfi_enet_rss_cfg_req is used by: |
535 | * BFI_ENET_H2I_RSS_CFG_REQ |
536 | */ |
537 | enum { |
538 | = 0x01, |
539 | = 0x02, |
540 | = 0x04, |
541 | = 0x08 |
542 | }; |
543 | |
544 | struct { |
545 | u8 ; |
546 | u8 ; |
547 | u8 [2]; |
548 | u32 [BFI_ENET_RSS_KEY_LEN]; |
549 | } __packed; |
550 | |
551 | struct { |
552 | struct bfi_msgq_mhdr ; |
553 | struct bfi_enet_rss_cfg ; |
554 | } __packed; |
555 | |
556 | /* MAC Unicast |
557 | * |
558 | * bfi_enet_rx_vlan_req is used by: |
559 | * BFI_ENET_H2I_MAC_UCAST_SET_REQ |
560 | * BFI_ENET_H2I_MAC_UCAST_CLR_REQ |
561 | * BFI_ENET_H2I_MAC_UCAST_ADD_REQ |
562 | * BFI_ENET_H2I_MAC_UCAST_DEL_REQ |
563 | */ |
564 | struct bfi_enet_ucast_req { |
565 | struct bfi_msgq_mhdr mh; |
566 | u8 mac_addr[ETH_ALEN]; |
567 | u8 rsvd[2]; |
568 | } __packed; |
569 | |
570 | /* MAC Unicast + VLAN */ |
571 | struct bfi_enet_mac_n_vlan_req { |
572 | struct bfi_msgq_mhdr mh; |
573 | u16 vlan_id; |
574 | u8 mac_addr[ETH_ALEN]; |
575 | } __packed; |
576 | |
577 | /* MAC Multicast |
578 | * |
579 | * bfi_enet_mac_mfilter_add_req is used by: |
580 | * BFI_ENET_H2I_MAC_MCAST_ADD_REQ |
581 | */ |
582 | struct bfi_enet_mcast_add_req { |
583 | struct bfi_msgq_mhdr mh; |
584 | u8 mac_addr[ETH_ALEN]; |
585 | u8 rsvd[2]; |
586 | } __packed; |
587 | |
588 | /* bfi_enet_mac_mfilter_add_rsp is used by: |
589 | * BFI_ENET_I2H_MAC_MCAST_ADD_RSP |
590 | */ |
591 | struct bfi_enet_mcast_add_rsp { |
592 | struct bfi_msgq_mhdr mh; |
593 | u8 error; |
594 | u8 rsvd; |
595 | u16 cmd_offset; |
596 | u16 handle; |
597 | u8 rsvd1[2]; |
598 | } __packed; |
599 | |
600 | /* bfi_enet_mac_mfilter_del_req is used by: |
601 | * BFI_ENET_H2I_MAC_MCAST_DEL_REQ |
602 | */ |
603 | struct bfi_enet_mcast_del_req { |
604 | struct bfi_msgq_mhdr mh; |
605 | u16 handle; |
606 | u8 rsvd[2]; |
607 | } __packed; |
608 | |
609 | /* VLAN |
610 | * |
611 | * bfi_enet_rx_vlan_req is used by: |
612 | * BFI_ENET_H2I_RX_VLAN_SET_REQ |
613 | */ |
614 | struct bfi_enet_rx_vlan_req { |
615 | struct bfi_msgq_mhdr mh; |
616 | u8 block_idx; |
617 | u8 rsvd[3]; |
618 | u32 bit_mask[BFI_ENET_VLAN_WORDS_MAX]; |
619 | } __packed; |
620 | |
621 | /* PAUSE |
622 | * |
623 | * bfi_enet_set_pause_req is used by: |
624 | * BFI_ENET_H2I_SET_PAUSE_REQ |
625 | */ |
626 | struct bfi_enet_set_pause_req { |
627 | struct bfi_msgq_mhdr mh; |
628 | u8 rsvd[2]; |
629 | u8 tx_pause; /* 1 = enable; 0 = disable */ |
630 | u8 rx_pause; /* 1 = enable; 0 = disable */ |
631 | } __packed; |
632 | |
633 | /* DIAGNOSTICS |
634 | * |
635 | * bfi_enet_diag_lb_req is used by: |
636 | * BFI_ENET_H2I_DIAG_LOOPBACK |
637 | */ |
638 | struct bfi_enet_diag_lb_req { |
639 | struct bfi_msgq_mhdr mh; |
640 | u8 rsvd[2]; |
641 | u8 mode; /* cable or Serdes */ |
642 | u8 enable; /* 1 = enable; 0 = disable */ |
643 | } __packed; |
644 | |
645 | /* enum for Loopback opmodes */ |
646 | enum { |
647 | BFI_ENET_DIAG_LB_OPMODE_EXT = 0, |
648 | BFI_ENET_DIAG_LB_OPMODE_CBL = 1, |
649 | }; |
650 | |
651 | /* STATISTICS |
652 | * |
653 | * bfi_enet_stats_req is used by: |
654 | * BFI_ENET_H2I_STATS_GET_REQ |
655 | * BFI_ENET_I2H_STATS_CLR_REQ |
656 | */ |
657 | struct bfi_enet_stats_req { |
658 | struct bfi_msgq_mhdr mh; |
659 | u16 stats_mask; |
660 | u8 rsvd[2]; |
661 | u32 rx_enet_mask; |
662 | u32 tx_enet_mask; |
663 | union bfi_addr_u host_buffer; |
664 | } __packed; |
665 | |
666 | /* defines for "stats_mask" above. */ |
667 | #define BFI_ENET_STATS_MAC BIT(0) /* !< MAC Statistics */ |
668 | #define BFI_ENET_STATS_BPC BIT(1) /* !< Pause Stats from BPC */ |
669 | #define BFI_ENET_STATS_RAD BIT(2) /* !< Rx Admission Statistics */ |
670 | #define BFI_ENET_STATS_RX_FC BIT(3) /* !< Rx FC Stats from RxA */ |
671 | #define BFI_ENET_STATS_TX_FC BIT(4) /* !< Tx FC Stats from TxA */ |
672 | |
673 | #define BFI_ENET_STATS_ALL 0x1f |
674 | |
675 | /* TxF Frame Statistics */ |
676 | struct bfi_enet_stats_txf { |
677 | u64 ucast_octets; |
678 | u64 ucast; |
679 | u64 ucast_vlan; |
680 | |
681 | u64 mcast_octets; |
682 | u64 mcast; |
683 | u64 mcast_vlan; |
684 | |
685 | u64 bcast_octets; |
686 | u64 bcast; |
687 | u64 bcast_vlan; |
688 | |
689 | u64 errors; |
690 | u64 filter_vlan; /* frames filtered due to VLAN */ |
691 | u64 filter_mac_sa; /* frames filtered due to SA check */ |
692 | } __packed; |
693 | |
694 | /* RxF Frame Statistics */ |
695 | struct bfi_enet_stats_rxf { |
696 | u64 ucast_octets; |
697 | u64 ucast; |
698 | u64 ucast_vlan; |
699 | |
700 | u64 mcast_octets; |
701 | u64 mcast; |
702 | u64 mcast_vlan; |
703 | |
704 | u64 bcast_octets; |
705 | u64 bcast; |
706 | u64 bcast_vlan; |
707 | u64 frame_drops; |
708 | } __packed; |
709 | |
710 | /* FC Tx Frame Statistics */ |
711 | struct bfi_enet_stats_fc_tx { |
712 | u64 txf_ucast_octets; |
713 | u64 txf_ucast; |
714 | u64 txf_ucast_vlan; |
715 | |
716 | u64 txf_mcast_octets; |
717 | u64 txf_mcast; |
718 | u64 txf_mcast_vlan; |
719 | |
720 | u64 txf_bcast_octets; |
721 | u64 txf_bcast; |
722 | u64 txf_bcast_vlan; |
723 | |
724 | u64 txf_parity_errors; |
725 | u64 txf_timeout; |
726 | u64 txf_fid_parity_errors; |
727 | } __packed; |
728 | |
729 | /* FC Rx Frame Statistics */ |
730 | struct bfi_enet_stats_fc_rx { |
731 | u64 rxf_ucast_octets; |
732 | u64 rxf_ucast; |
733 | u64 rxf_ucast_vlan; |
734 | |
735 | u64 rxf_mcast_octets; |
736 | u64 rxf_mcast; |
737 | u64 rxf_mcast_vlan; |
738 | |
739 | u64 rxf_bcast_octets; |
740 | u64 rxf_bcast; |
741 | u64 rxf_bcast_vlan; |
742 | } __packed; |
743 | |
744 | /* RAD Frame Statistics */ |
745 | struct bfi_enet_stats_rad { |
746 | u64 rx_frames; |
747 | u64 rx_octets; |
748 | u64 rx_vlan_frames; |
749 | |
750 | u64 rx_ucast; |
751 | u64 rx_ucast_octets; |
752 | u64 rx_ucast_vlan; |
753 | |
754 | u64 rx_mcast; |
755 | u64 rx_mcast_octets; |
756 | u64 rx_mcast_vlan; |
757 | |
758 | u64 rx_bcast; |
759 | u64 rx_bcast_octets; |
760 | u64 rx_bcast_vlan; |
761 | |
762 | u64 rx_drops; |
763 | } __packed; |
764 | |
765 | /* BPC Tx Registers */ |
766 | struct bfi_enet_stats_bpc { |
767 | /* transmit stats */ |
768 | u64 tx_pause[8]; |
769 | u64 tx_zero_pause[8]; /*!< Pause cancellation */ |
770 | /*!<Pause initiation rather than retention */ |
771 | u64 tx_first_pause[8]; |
772 | |
773 | /* receive stats */ |
774 | u64 rx_pause[8]; |
775 | u64 rx_zero_pause[8]; /*!< Pause cancellation */ |
776 | /*!<Pause initiation rather than retention */ |
777 | u64 rx_first_pause[8]; |
778 | } __packed; |
779 | |
780 | /* MAC Rx Statistics */ |
781 | struct bfi_enet_stats_mac { |
782 | u64 stats_clr_cnt; /* times this stats cleared */ |
783 | u64 frame_64; /* both rx and tx counter */ |
784 | u64 frame_65_127; /* both rx and tx counter */ |
785 | u64 frame_128_255; /* both rx and tx counter */ |
786 | u64 frame_256_511; /* both rx and tx counter */ |
787 | u64 frame_512_1023; /* both rx and tx counter */ |
788 | u64 frame_1024_1518; /* both rx and tx counter */ |
789 | u64 frame_1519_1522; /* both rx and tx counter */ |
790 | |
791 | /* receive stats */ |
792 | u64 rx_bytes; |
793 | u64 rx_packets; |
794 | u64 rx_fcs_error; |
795 | u64 rx_multicast; |
796 | u64 rx_broadcast; |
797 | u64 rx_control_frames; |
798 | u64 rx_pause; |
799 | u64 rx_unknown_opcode; |
800 | u64 rx_alignment_error; |
801 | u64 rx_frame_length_error; |
802 | u64 rx_code_error; |
803 | u64 rx_carrier_sense_error; |
804 | u64 rx_undersize; |
805 | u64 rx_oversize; |
806 | u64 rx_fragments; |
807 | u64 rx_jabber; |
808 | u64 rx_drop; |
809 | |
810 | /* transmit stats */ |
811 | u64 tx_bytes; |
812 | u64 tx_packets; |
813 | u64 tx_multicast; |
814 | u64 tx_broadcast; |
815 | u64 tx_pause; |
816 | u64 tx_deferral; |
817 | u64 tx_excessive_deferral; |
818 | u64 tx_single_collision; |
819 | u64 tx_muliple_collision; |
820 | u64 tx_late_collision; |
821 | u64 tx_excessive_collision; |
822 | u64 tx_total_collision; |
823 | u64 tx_pause_honored; |
824 | u64 tx_drop; |
825 | u64 tx_jabber; |
826 | u64 tx_fcs_error; |
827 | u64 tx_control_frame; |
828 | u64 tx_oversize; |
829 | u64 tx_undersize; |
830 | u64 tx_fragments; |
831 | } __packed; |
832 | |
833 | /* Complete statistics, DMAed from fw to host followed by |
834 | * BFI_ENET_I2H_STATS_GET_RSP |
835 | */ |
836 | struct bfi_enet_stats { |
837 | struct bfi_enet_stats_mac mac_stats; |
838 | struct bfi_enet_stats_bpc bpc_stats; |
839 | struct bfi_enet_stats_rad rad_stats; |
840 | struct bfi_enet_stats_rad rlb_stats; |
841 | struct bfi_enet_stats_fc_rx fc_rx_stats; |
842 | struct bfi_enet_stats_fc_tx fc_tx_stats; |
843 | struct bfi_enet_stats_rxf rxf_stats[BFI_ENET_CFG_MAX]; |
844 | struct bfi_enet_stats_txf txf_stats[BFI_ENET_CFG_MAX]; |
845 | } __packed; |
846 | |
847 | #endif /* __BFI_ENET_H__ */ |
848 | |