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