1 /*
2 * BSD LICENSE
3 *
4 * Copyright(c) 2017 Cavium, Inc.. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name of Cavium, Inc. nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33 /*$FreeBSD$*/
34
35 /* \file lio_common.h
36 * \brief Common: Structures and macros used in PCI-NIC package by core and
37 * host driver.
38 */
39
40 #ifndef __LIO_COMMON_H__
41 #define __LIO_COMMON_H__
42
43 #include "lio_config.h"
44
45 #define LIO_STR_HELPER(x) #x
46 #define LIO_STR(x) LIO_STR_HELPER(x)
47 #define LIO_BASE_MAJOR_VERSION 1
48 #define LIO_BASE_MINOR_VERSION 6
49 #define LIO_BASE_MICRO_VERSION 1
50 #define LIO_BASE_VERSION LIO_STR(LIO_BASE_MAJOR_VERSION) "." \
51 LIO_STR(LIO_BASE_MINOR_VERSION)
52 #define LIO_VERSION LIO_STR(LIO_BASE_MAJOR_VERSION) "." \
53 LIO_STR(LIO_BASE_MINOR_VERSION) \
54 "." LIO_STR(LIO_BASE_MICRO_VERSION)
55
56 struct lio_version {
57 uint16_t major;
58 uint16_t minor;
59 uint16_t micro;
60 uint16_t reserved;
61 };
62
63 /* Tag types used by Octeon cores in its work. */
64 enum lio_tag_type {
65 LIO_ORDERED_TAG = 0,
66 LIO_ATOMIC_TAG = 1,
67 LIO_NULL_TAG = 2,
68 LIO_NULL_NULL_TAG = 3
69 };
70
71 /* pre-defined host->NIC tag values */
72 #define LIO_CONTROL (0x11111110)
73 #define LIO_DATA(i) (0x11111111 + (i))
74
75 /*
76 * Opcodes used by host driver/apps to perform operations on the core.
77 * These are used to identify the major subsystem that the operation
78 * is for.
79 */
80 #define LIO_OPCODE_NIC 1 /* used for NIC operations */
81
82 /*
83 * Subcodes are used by host driver/apps to identify the sub-operation
84 * for the core. They only need to by unique for a given subsystem.
85 */
86 #define LIO_OPCODE_SUBCODE(op, sub) ((((op) & 0x0f) << 8) | ((sub) & 0x7f))
87
88 /* OPCODE_CORE subcodes. For future use. */
89
90 /* OPCODE_NIC subcodes */
91
92 /* This subcode is sent by core PCI driver to indicate cores are ready. */
93 #define LIO_OPCODE_NIC_CORE_DRV_ACTIVE 0x01
94 #define LIO_OPCODE_NIC_NW_DATA 0x02 /* network packet data */
95 #define LIO_OPCODE_NIC_CMD 0x03
96 #define LIO_OPCODE_NIC_INFO 0x04
97 #define LIO_OPCODE_NIC_PORT_STATS 0x05
98 #define LIO_OPCODE_NIC_INTRMOD_CFG 0x08
99 #define LIO_OPCODE_NIC_IF_CFG 0x09
100 #define LIO_OPCODE_NIC_INTRMOD_PARAMS 0x0B
101
102 /* Application codes advertised by the core driver initialization packet. */
103 #define LIO_DRV_APP_START 0x0
104 #define LIO_DRV_APP_COUNT 0x2
105 #define LIO_DRV_NIC_APP (LIO_DRV_APP_START + 0x1)
106 #define LIO_DRV_INVALID_APP (LIO_DRV_APP_START + 0x2)
107 #define LIO_DRV_APP_END (LIO_DRV_INVALID_APP - 1)
108
109 #define BYTES_PER_DHLEN_UNIT 8
110
111 #define SCR2_BIT_FW_LOADED 63
112 #define SCR2_BIT_FW_RELOADED 62
113
114 static inline uint32_t
115 lio_incr_index(uint32_t index, uint32_t count, uint32_t max)
116 {
117 if ((index + count) >= max)
118 index = index + count - max;
119 else
120 index += count;
121
122 return (index);
123 }
124
125 #define LIO_BOARD_NAME 32
126 #define LIO_SERIAL_NUM_LEN 64
127
128 /*
129 * Structure used by core driver to send indication that the Octeon
130 * application is ready.
131 */
132 struct lio_core_setup {
133 uint64_t corefreq;
134
135 char boardname[LIO_BOARD_NAME];
136
137 char board_serial_number[LIO_SERIAL_NUM_LEN];
138
139 uint64_t board_rev_major;
140
141 uint64_t board_rev_minor;
142
143 };
144
145 /*--------------------------- SCATTER GATHER ENTRY -----------------------*/
146
147 /*
148 * The Scatter-Gather List Entry. The scatter or gather component used with
149 * a Octeon input instruction has this format.
150 */
151 struct lio_sg_entry {
152 /* The first 64 bit gives the size of data in each dptr. */
153 union {
154 uint16_t size[4];
155 uint64_t size64;
156 } u;
157
158 /* The 4 dptr pointers for this entry. */
159 uint64_t ptr[4];
160
161 };
162
163 #define LIO_SG_ENTRY_SIZE (sizeof(struct lio_sg_entry))
164
165 /*
166 * \brief Add size to gather list
167 * @param sg_entry scatter/gather entry
168 * @param size size to add
169 * @param pos position to add it.
170 */
171 static inline void
172 lio_add_sg_size(struct lio_sg_entry *sg_entry, uint16_t size, uint32_t pos)
173 {
174
175 #if BYTE_ORDER == BIG_ENDIAN
176 sg_entry->u.size[pos] = size;
177 #else /* BYTE_ORDER != BIG_ENDIAN */
178 sg_entry->u.size[3 - pos] = size;
179 #endif /* BYTE_ORDER == BIG_ENDIAN */
180 }
181
182 /*------------------------- End Scatter/Gather ---------------------------*/
183
184 #define LIO_FRM_HEADER_SIZE 22 /* VLAN + Ethernet */
185
186 #define LIO_MAX_FRM_SIZE (16000 + LIO_FRM_HEADER_SIZE)
187
188 #define LIO_DEFAULT_FRM_SIZE (1500 + LIO_FRM_HEADER_SIZE)
189
190 /* NIC Command types */
191 #define LIO_CMD_CHANGE_MTU 0x1
192 #define LIO_CMD_CHANGE_MACADDR 0x2
193 #define LIO_CMD_CHANGE_DEVFLAGS 0x3
194 #define LIO_CMD_RX_CTL 0x4
195 #define LIO_CMD_SET_MULTI_LIST 0x5
196
197 /* command for setting the speed, duplex & autoneg */
198 #define LIO_CMD_SET_SETTINGS 0x7
199 #define LIO_CMD_SET_FLOW_CTL 0x8
200
201 #define LIO_CMD_GPIO_ACCESS 0xA
202 #define LIO_CMD_LRO_ENABLE 0xB
203 #define LIO_CMD_LRO_DISABLE 0xC
204 #define LIO_CMD_SET_RSS 0xD
205
206 #define LIO_CMD_TNL_RX_CSUM_CTL 0x10
207 #define LIO_CMD_TNL_TX_CSUM_CTL 0x11
208 #define LIO_CMD_VERBOSE_ENABLE 0x14
209 #define LIO_CMD_VERBOSE_DISABLE 0x15
210
211 #define LIO_CMD_VLAN_FILTER_CTL 0x16
212 #define LIO_CMD_ADD_VLAN_FILTER 0x17
213 #define LIO_CMD_DEL_VLAN_FILTER 0x18
214 #define LIO_CMD_VXLAN_PORT_CONFIG 0x19
215
216 #define LIO_CMD_ID_ACTIVE 0x1a
217
218 #define LIO_CMD_SET_FNV 0x1d
219
220 #define LIO_CMD_PKT_STEERING_CTL 0x1e
221
222 #define LIO_CMD_QUEUE_COUNT_CTL 0x1f
223
224 #define LIO_CMD_VXLAN_PORT_ADD 0x0
225 #define LIO_CMD_VXLAN_PORT_DEL 0x1
226 #define LIO_CMD_RXCSUM_ENABLE 0x0
227 #define LIO_CMD_RXCSUM_DISABLE 0x1
228 #define LIO_CMD_TXCSUM_ENABLE 0x0
229 #define LIO_CMD_TXCSUM_DISABLE 0x1
230 #define LIO_CMD_FNV_ENABLE 0x1
231 #define LIO_CMD_FNV_DISABLE 0x0
232 #define LIO_CMD_PKT_STEERING_ENABLE 0x0
233 #define LIO_CMD_PKT_STEERING_DISABLE 0x1
234
235 /* RX(packets coming from wire) Checksum verification flags */
236 /* TCP/UDP csum */
237 #define LIO_L4SUM_VERIFIED 0x1
238 #define LIO_IPSUM_VERIFIED 0x2
239
240 /*LROIPV4 and LROIPV6 Flags*/
241 #define LIO_LROIPV4 0x1
242 #define LIO_LROIPV6 0x2
243
244 /* Interface flags communicated between host driver and core app. */
245 enum lio_ifflags {
246 LIO_IFFLAG_PROMISC = 0x01,
247 LIO_IFFLAG_ALLMULTI = 0x02,
248 LIO_IFFLAG_MULTICAST = 0x04,
249 LIO_IFFLAG_BROADCAST = 0x08,
250 LIO_IFFLAG_UNICAST = 0x10
251 };
252
253 /*
254 * wqe
255 * --------------- 0
256 * | wqe word0-3 |
257 * --------------- 32
258 * | PCI IH |
259 * --------------- 40
260 * | RPTR |
261 * --------------- 48
262 * | PCI IRH |
263 * --------------- 56
264 * | OCT_NET_CMD |
265 * --------------- 64
266 * | Addtl 8-BData |
267 * | |
268 * ---------------
269 */
270 union octeon_cmd {
271 uint64_t cmd64;
272
273 struct {
274 #if BYTE_ORDER == BIG_ENDIAN
275 uint64_t cmd:5;
276
277 uint64_t more:6; /* How many udd words follow the command */
278
279 uint64_t reserved:29;
280
281 uint64_t param1:16;
282
283 uint64_t param2:8;
284
285 #else /* BYTE_ORDER != BIG_ENDIAN */
286
287 uint64_t param2:8;
288
289 uint64_t param1:16;
290
291 uint64_t reserved:29;
292
293 uint64_t more:6;
294
295 uint64_t cmd:5;
296
297 #endif /* BYTE_ORDER == BIG_ENDIAN */
298 } s;
299
300 };
301
302 #define OCTEON_CMD_SIZE (sizeof(union octeon_cmd))
303
304 /* pkiih3 + irh + ossp[0] + ossp[1] + rdp + rptr = 40 bytes */
305 #define LIO_SOFTCMDRESP_IH3 (40 + 8)
306
307 #define LIO_PCICMD_O3 (24 + 8)
308
309 /* Instruction Header(DPI) - for OCTEON-III models */
310 struct octeon_instr_ih3 {
311 #if BYTE_ORDER == BIG_ENDIAN
312
313 /* Reserved3 */
314 uint64_t reserved3:1;
315
316 /* Gather indicator 1=gather */
317 uint64_t gather:1;
318
319 /* Data length OR no. of entries in gather list */
320 uint64_t dlengsz:14;
321
322 /* Front Data size */
323 uint64_t fsz:6;
324
325 /* Reserved2 */
326 uint64_t reserved2:4;
327
328 /* PKI port kind - PKIND */
329 uint64_t pkind:6;
330
331 /* Reserved1 */
332 uint64_t reserved1:32;
333
334 #else /* BYTE_ORDER != BIG_ENDIAN */
335
336 /* Reserved1 */
337 uint64_t reserved1:32;
338
339 /* PKI port kind - PKIND */
340 uint64_t pkind:6;
341
342 /* Reserved2 */
343 uint64_t reserved2:4;
344
345 /* Front Data size */
346 uint64_t fsz:6;
347
348 /* Data length OR no. of entries in gather list */
349 uint64_t dlengsz:14;
350
351 /* Gather indicator 1=gather */
352 uint64_t gather:1;
353
354 /* Reserved3 */
355 uint64_t reserved3:1;
356
357 #endif /* BYTE_ORDER == BIG_ENDIAN */
358 };
359
360 /* Optional PKI Instruction Header(PKI IH) - for OCTEON-III models */
361 /* BIG ENDIAN format. */
362 struct octeon_instr_pki_ih3 {
363 #if BYTE_ORDER == BIG_ENDIAN
364
365 /* Wider bit */
366 uint64_t w:1;
367
368 /* Raw mode indicator 1 = RAW */
369 uint64_t raw:1;
370
371 /* Use Tag */
372 uint64_t utag:1;
373
374 /* Use QPG */
375 uint64_t uqpg:1;
376
377 /* Reserved2 */
378 uint64_t reserved2:1;
379
380 /* Parse Mode */
381 uint64_t pm:3;
382
383 /* Skip Length */
384 uint64_t sl:8;
385
386 /* Use Tag Type */
387 uint64_t utt:1;
388
389 /* Tag type */
390 uint64_t tagtype:2;
391
392 /* Reserved1 */
393 uint64_t reserved1:2;
394
395 /* QPG Value */
396 uint64_t qpg:11;
397
398 /* Tag Value */
399 uint64_t tag:32;
400
401 #else /* BYTE_ORDER != BIG_ENDIAN */
402
403 /* Tag Value */
404 uint64_t tag:32;
405
406 /* QPG Value */
407 uint64_t qpg:11;
408
409 /* Reserved1 */
410 uint64_t reserved1:2;
411
412 /* Tag type */
413 uint64_t tagtype:2;
414
415 /* Use Tag Type */
416 uint64_t utt:1;
417
418 /* Skip Length */
419 uint64_t sl:8;
420
421 /* Parse Mode */
422 uint64_t pm:3;
423
424 /* Reserved2 */
425 uint64_t reserved2:1;
426
427 /* Use QPG */
428 uint64_t uqpg:1;
429
430 /* Use Tag */
431 uint64_t utag:1;
432
433 /* Raw mode indicator 1 = RAW */
434 uint64_t raw:1;
435
436 /* Wider bit */
437 uint64_t w:1;
438 #endif /* BYTE_ORDER == BIG_ENDIAN */
439
440 };
441
442 /* Input Request Header */
443 struct octeon_instr_irh {
444 #if BYTE_ORDER == BIG_ENDIAN
445 uint64_t opcode:4;
446 uint64_t rflag:1;
447 uint64_t subcode:7;
448 uint64_t vlan:12;
449 uint64_t priority:3;
450 uint64_t reserved:5;
451 uint64_t ossp:32; /* opcode/subcode specific parameters */
452
453 #else /* BYTE_ORDER != BIG_ENDIAN */
454
455 uint64_t ossp:32; /* opcode/subcode specific parameters */
456 uint64_t reserved:5;
457 uint64_t priority:3;
458 uint64_t vlan:12;
459 uint64_t subcode:7;
460 uint64_t rflag:1;
461 uint64_t opcode:4;
462 #endif /* BYTE_ORDER == BIG_ENDIAN */
463 };
464
465 /* Return Data Parameters */
466 struct octeon_instr_rdp {
467 #if BYTE_ORDER == BIG_ENDIAN
468 uint64_t reserved:49;
469 uint64_t pcie_port:3;
470 uint64_t rlen:12;
471
472 #else /* BYTE_ORDER != BIG_ENDIAN */
473
474 uint64_t rlen:12;
475 uint64_t pcie_port:3;
476 uint64_t reserved:49;
477 #endif /* BYTE_ORDER == BIG_ENDIAN */
478 };
479
480 /* Receive Header */
481 union octeon_rh {
482 #if BYTE_ORDER == BIG_ENDIAN
483 uint64_t rh64;
484 struct {
485 uint64_t opcode:4;
486 uint64_t subcode:8;
487 uint64_t len:3; /* additional 64-bit words */
488 uint64_t reserved:17;
489 uint64_t ossp:32; /* opcode/subcode specific parameters */
490 } r;
491 struct {
492 uint64_t opcode:4;
493 uint64_t subcode:8;
494 uint64_t len:3; /* additional 64-bit words */
495 uint64_t extra:28;
496 uint64_t vlan:12;
497 uint64_t priority:3;
498 uint64_t csum_verified:3;/* checksum verified. */
499 uint64_t has_hwtstamp:1; /* Has hardware timestamp. 1 = yes. */
500 uint64_t encap_on:1;
501 uint64_t has_hash:1; /* Has hash (rth or rss). 1 = yes. */
502 } r_dh;
503 struct {
504 uint64_t opcode:4;
505 uint64_t subcode:8;
506 uint64_t len:3; /* additional 64-bit words */
507 uint64_t reserved:11;
508 uint64_t num_gmx_ports:8;
509 uint64_t max_nic_ports:10;
510 uint64_t app_cap_flags:4;
511 uint64_t app_mode:8;
512 uint64_t pkind:8;
513 } r_core_drv_init;
514 struct {
515 uint64_t opcode:4;
516 uint64_t subcode:8;
517 uint64_t len:3; /* additional 64-bit words */
518 uint64_t reserved:8;
519 uint64_t extra:25;
520 uint64_t gmxport:16;
521 } r_nic_info;
522 #else /* BYTE_ORDER != BIG_ENDIAN */
523 uint64_t rh64;
524 struct {
525 uint64_t ossp:32; /* opcode/subcode specific parameters */
526 uint64_t reserved:17;
527 uint64_t len:3; /* additional 64-bit words */
528 uint64_t subcode:8;
529 uint64_t opcode:4;
530 } r;
531 struct {
532 uint64_t has_hash:1; /* Has hash (rth or rss). 1 = yes. */
533 uint64_t encap_on:1;
534 uint64_t has_hwtstamp:1; /* 1 = has hwtstamp */
535 uint64_t csum_verified:3; /* checksum verified. */
536 uint64_t priority:3;
537 uint64_t vlan:12;
538 uint64_t extra:28;
539 uint64_t len:3; /* additional 64-bit words */
540 uint64_t subcode:8;
541 uint64_t opcode:4;
542 } r_dh;
543 struct {
544 uint64_t pkind:8;
545 uint64_t app_mode:8;
546 uint64_t app_cap_flags:4;
547 uint64_t max_nic_ports:10;
548 uint64_t num_gmx_ports:8;
549 uint64_t reserved:11;
550 uint64_t len:3; /* additional 64-bit words */
551 uint64_t subcode:8;
552 uint64_t opcode:4;
553 } r_core_drv_init;
554 struct {
555 uint64_t gmxport:16;
556 uint64_t extra:25;
557 uint64_t reserved:8;
558 uint64_t len:3; /* additional 64-bit words */
559 uint64_t subcode:8;
560 uint64_t opcode:4;
561 } r_nic_info;
562 #endif /* BYTE_ORDER == BIG_ENDIAN */
563 };
564
565 #define OCTEON_RH_SIZE (sizeof(union octeon_rh))
566
567 union octeon_packet_params {
568 uint32_t pkt_params32;
569 struct {
570 #if BYTE_ORDER == BIG_ENDIAN
571 uint32_t reserved:24;
572 uint32_t ip_csum:1; /* Perform IP header checksum(s) */
573 /* Perform Outer transport header checksum */
574 uint32_t transport_csum:1;
575 /* Find tunnel, and perform transport csum. */
576 uint32_t tnl_csum:1;
577 uint32_t tsflag:1; /* Timestamp this packet */
578 uint32_t ipsec_ops:4; /* IPsec operation */
579
580 #else /* BYTE_ORDER != BIG_ENDIAN */
581
582 uint32_t ipsec_ops:4;
583 uint32_t tsflag:1;
584 uint32_t tnl_csum:1;
585 uint32_t transport_csum:1;
586 uint32_t ip_csum:1;
587 uint32_t reserved:24;
588 #endif /* BYTE_ORDER == BIG_ENDIAN */
589 } s;
590 };
591
592 /* Status of a RGMII Link on Octeon as seen by core driver. */
593 union octeon_link_status {
594 uint64_t link_status64;
595
596 struct {
597 #if BYTE_ORDER == BIG_ENDIAN
598 uint64_t duplex:8;
599 uint64_t mtu:16;
600 uint64_t speed:16;
601 uint64_t link_up:1;
602 uint64_t autoneg:1;
603 uint64_t if_mode:5;
604 uint64_t pause:1;
605 uint64_t flashing:1;
606 uint64_t reserved:15;
607
608 #else /* BYTE_ORDER != BIG_ENDIAN */
609
610 uint64_t reserved:15;
611 uint64_t flashing:1;
612 uint64_t pause:1;
613 uint64_t if_mode:5;
614 uint64_t autoneg:1;
615 uint64_t link_up:1;
616 uint64_t speed:16;
617 uint64_t mtu:16;
618 uint64_t duplex:8;
619 #endif /* BYTE_ORDER == BIG_ENDIAN */
620 } s;
621 };
622
623 /* The txpciq info passed to host from the firmware */
624
625 union octeon_txpciq {
626 uint64_t txpciq64;
627
628 struct {
629 #if BYTE_ORDER == BIG_ENDIAN
630 uint64_t q_no:8;
631 uint64_t port:8;
632 uint64_t pkind:6;
633 uint64_t use_qpg:1;
634 uint64_t qpg:11;
635 uint64_t aura_num:10;
636 uint64_t reserved:20;
637
638 #else /* BYTE_ORDER != BIG_ENDIAN */
639
640 uint64_t reserved:20;
641 uint64_t aura_num:10;
642 uint64_t qpg:11;
643 uint64_t use_qpg:1;
644 uint64_t pkind:6;
645 uint64_t port:8;
646 uint64_t q_no:8;
647 #endif /* BYTE_ORDER == BIG_ENDIAN */
648 } s;
649 };
650
651 /* The rxpciq info passed to host from the firmware */
652
653 union octeon_rxpciq {
654 uint64_t rxpciq64;
655
656 struct {
657 #if BYTE_ORDER == BIG_ENDIAN
658 uint64_t q_no:8;
659 uint64_t reserved:56;
660
661 #else /* BYTE_ORDER != BIG_ENDIAN */
662
663 uint64_t reserved:56;
664 uint64_t q_no:8;
665 #endif /* BYTE_ORDER == BIG_ENDIAN */
666 } s;
667 };
668
669 /* Information for a OCTEON ethernet interface shared between core & host. */
670 struct octeon_link_info {
671 union octeon_link_status link;
672 uint64_t hw_addr;
673
674 #if BYTE_ORDER == BIG_ENDIAN
675 uint64_t gmxport:16;
676 uint64_t macaddr_is_admin_asgnd:1;
677 uint64_t vlan_is_admin_assigned:1;
678 uint64_t rsvd:30;
679 uint64_t num_txpciq:8;
680 uint64_t num_rxpciq:8;
681
682 #else /* BYTE_ORDER != BIG_ENDIAN */
683
684 uint64_t num_rxpciq:8;
685 uint64_t num_txpciq:8;
686 uint64_t rsvd:30;
687 uint64_t vlan_is_admin_assigned:1;
688 uint64_t macaddr_is_admin_asgnd:1;
689 uint64_t gmxport:16;
690 #endif /* BYTE_ORDER == BIG_ENDIAN */
691
692 union octeon_txpciq txpciq[LIO_MAX_IOQS_PER_NICIF];
693 union octeon_rxpciq rxpciq[LIO_MAX_IOQS_PER_NICIF];
694 };
695
696 struct octeon_if_cfg_info {
697 uint64_t iqmask; /* mask for IQs enabled for the port */
698 uint64_t oqmask; /* mask for OQs enabled for the port */
699 struct octeon_link_info linfo; /* initial link information */
700 char lio_firmware_version[32];
701 };
702
703 /* Stats for each NIC port in RX direction. */
704 struct octeon_rx_stats {
705 /* link-level stats */
706 uint64_t total_rcvd;
707 uint64_t bytes_rcvd;
708 uint64_t total_bcst;
709 uint64_t total_mcst;
710 uint64_t runts;
711 uint64_t ctl_rcvd;
712 uint64_t fifo_err; /* Accounts for over/under-run of buffers */
713 uint64_t dmac_drop;
714 uint64_t fcs_err;
715 uint64_t jabber_err;
716 uint64_t l2_err;
717 uint64_t frame_err;
718
719 /* firmware stats */
720 uint64_t fw_total_rcvd;
721 uint64_t fw_total_fwd;
722 uint64_t fw_total_fwd_bytes;
723 uint64_t fw_err_pko;
724 uint64_t fw_err_link;
725 uint64_t fw_err_drop;
726 uint64_t fw_rx_vxlan;
727 uint64_t fw_rx_vxlan_err;
728
729 /* LRO */
730 uint64_t fw_lro_pkts; /* Number of packets that are LROed */
731 uint64_t fw_lro_octs; /* Number of octets that are LROed */
732 uint64_t fw_total_lro; /* Number of LRO packets formed */
733 uint64_t fw_lro_aborts; /* Number of times lRO of packet aborted */
734 uint64_t fw_lro_aborts_port;
735 uint64_t fw_lro_aborts_seq;
736 uint64_t fw_lro_aborts_tsval;
737 uint64_t fw_lro_aborts_timer;
738 /* intrmod: packet forward rate */
739 uint64_t fwd_rate;
740 };
741
742 /* Stats for each NIC port in RX direction. */
743 struct octeon_tx_stats {
744 /* link-level stats */
745 uint64_t total_pkts_sent;
746 uint64_t total_bytes_sent;
747 uint64_t mcast_pkts_sent;
748 uint64_t bcast_pkts_sent;
749 uint64_t ctl_sent;
750 uint64_t one_collision_sent; /* Packets sent after one collision */
751 uint64_t multi_collision_sent; /* Packets sent after multiple collision */
752 uint64_t max_collision_fail; /* Packets not sent due to max collisions */
753 uint64_t max_deferral_fail; /* Packets not sent due to max deferrals */
754 uint64_t fifo_err; /* Accounts for over/under-run of buffers */
755 uint64_t runts;
756 uint64_t total_collisions; /* Total number of collisions detected */
757
758 /* firmware stats */
759 uint64_t fw_total_sent;
760 uint64_t fw_total_fwd;
761 uint64_t fw_total_fwd_bytes;
762 uint64_t fw_err_pko;
763 uint64_t fw_err_link;
764 uint64_t fw_err_drop;
765 uint64_t fw_err_tso;
766 uint64_t fw_tso; /* number of tso requests */
767 uint64_t fw_tso_fwd; /* number of packets segmented in tso */
768 uint64_t fw_tx_vxlan;
769 uint64_t fw_err_pki;
770 };
771
772 struct octeon_link_stats {
773 struct octeon_rx_stats fromwire;
774 struct octeon_tx_stats fromhost;
775
776 };
777
778 static inline int
779 lio_opcode_slow_path(union octeon_rh *rh)
780 {
781 uint16_t subcode1, subcode2;
782
783 subcode1 = LIO_OPCODE_SUBCODE((rh)->r.opcode, (rh)->r.subcode);
784 subcode2 = LIO_OPCODE_SUBCODE(LIO_OPCODE_NIC, LIO_OPCODE_NIC_NW_DATA);
785
786 return (subcode2 != subcode1);
787 }
788
789 struct octeon_mdio_cmd {
790 uint64_t op;
791 uint64_t mdio_addr;
792 uint64_t value1;
793 uint64_t value2;
794 uint64_t value3;
795 };
796
797 struct octeon_intrmod_cfg {
798 uint64_t rx_enable;
799 uint64_t tx_enable;
800 uint64_t check_intrvl;
801 uint64_t maxpkt_ratethr;
802 uint64_t minpkt_ratethr;
803 uint64_t rx_maxcnt_trigger;
804 uint64_t rx_mincnt_trigger;
805 uint64_t rx_maxtmr_trigger;
806 uint64_t rx_mintmr_trigger;
807 uint64_t tx_mincnt_trigger;
808 uint64_t tx_maxcnt_trigger;
809 uint64_t rx_frames;
810 uint64_t tx_frames;
811 uint64_t rx_usecs;
812 };
813
814 #define LIO_BASE_QUEUE_NOT_REQUESTED 65535
815
816 union octeon_if_cfg {
817 uint64_t if_cfg64;
818 struct {
819 #if BYTE_ORDER == BIG_ENDIAN
820 uint64_t base_queue:16;
821 uint64_t num_iqueues:16;
822 uint64_t num_oqueues:16;
823 uint64_t gmx_port_id:8;
824 uint64_t vf_id:8;
825
826 #else /* BYTE_ORDER != BIG_ENDIAN */
827
828 uint64_t vf_id:8;
829 uint64_t gmx_port_id:8;
830 uint64_t num_oqueues:16;
831 uint64_t num_iqueues:16;
832 uint64_t base_queue:16;
833 #endif /* BYTE_ORDER == BIG_ENDIAN */
834 } s;
835 };
836
837 #endif /* __LIO_COMMON_H__ */
Cache object: 2b714e555c9e4ebd63ab2f411fbdf7f7
|