1688654bfSRasesh Mody /* SPDX-License-Identifier: BSD-3-Clause
2059113ccSRasesh Mody * Copyright (c) 2007-2013 Broadcom Corporation.
3540a2110SStephen Hemminger *
4540a2110SStephen Hemminger * Eric Davis <edavis@broadcom.com>
5540a2110SStephen Hemminger * David Christensen <davidch@broadcom.com>
6540a2110SStephen Hemminger * Gary Zambrano <zambrano@broadcom.com>
7540a2110SStephen Hemminger *
8540a2110SStephen Hemminger * Copyright (c) 2013-2015 Brocade Communications Systems, Inc.
9e3de5dadSRasesh Mody * Copyright (c) 2015-2018 Cavium Inc.
10540a2110SStephen Hemminger * All rights reserved.
11e3de5dadSRasesh Mody * www.cavium.com
12540a2110SStephen Hemminger */
13540a2110SStephen Hemminger
14540a2110SStephen Hemminger #ifndef __BNX2X_H__
15540a2110SStephen Hemminger #define __BNX2X_H__
16540a2110SStephen Hemminger
175a1d76f9SRasesh Mody #include <rte_byteorder.h>
18cf32c2e5SChas Williams #include <rte_spinlock.h>
19*1f37cb2bSDavid Marchand #include <bus_pci_driver.h>
20458a4a7aSSantosh Shukla #include <rte_io.h>
21540a2110SStephen Hemminger
2238dff79bSRasesh Mody #include "bnx2x_osal.h"
235a1d76f9SRasesh Mody #include "bnx2x_ethdev.h"
24540a2110SStephen Hemminger #include "ecore_mfw_req.h"
25540a2110SStephen Hemminger #include "ecore_fw_defs.h"
26540a2110SStephen Hemminger #include "ecore_hsi.h"
27540a2110SStephen Hemminger #include "ecore_reg.h"
28540a2110SStephen Hemminger #include "bnx2x_stats.h"
29540a2110SStephen Hemminger #include "bnx2x_vfpf.h"
30540a2110SStephen Hemminger
31540a2110SStephen Hemminger #include "elink.h"
32540a2110SStephen Hemminger
33540a2110SStephen Hemminger #define IFM_10G_CX4 20 /* 10GBase CX4 copper */
34540a2110SStephen Hemminger #define IFM_10G_TWINAX 22 /* 10GBase Twinax copper */
35540a2110SStephen Hemminger #define IFM_10G_T 26 /* 10GBase-T - RJ45 */
36540a2110SStephen Hemminger
37540a2110SStephen Hemminger #ifndef ARRAY_SIZE
38a3c9a11aSAndrew Boyer #define ARRAY_SIZE(arr) RTE_DIM(arr)
39540a2110SStephen Hemminger #endif
40540a2110SStephen Hemminger #ifndef DIV_ROUND_UP
41540a2110SStephen Hemminger #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
42540a2110SStephen Hemminger #endif
43540a2110SStephen Hemminger #ifndef roundup
44540a2110SStephen Hemminger #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
45540a2110SStephen Hemminger #endif
46540a2110SStephen Hemminger #ifndef ilog2
47540a2110SStephen Hemminger static inline
bnx2x_ilog2(int x)48540a2110SStephen Hemminger int bnx2x_ilog2(int x)
49540a2110SStephen Hemminger {
50540a2110SStephen Hemminger int log = 0;
51540a2110SStephen Hemminger x >>= 1;
52540a2110SStephen Hemminger
53540a2110SStephen Hemminger while(x) {
54540a2110SStephen Hemminger log++;
55540a2110SStephen Hemminger x >>= 1;
56540a2110SStephen Hemminger }
57540a2110SStephen Hemminger return log;
58540a2110SStephen Hemminger }
59540a2110SStephen Hemminger #define ilog2(x) bnx2x_ilog2(x)
60540a2110SStephen Hemminger #endif
61540a2110SStephen Hemminger
625a6af6baSRasesh Mody #define BNX2X_BC_VER 0x040200
635a6af6baSRasesh Mody
64540a2110SStephen Hemminger #include "ecore_sp.h"
65540a2110SStephen Hemminger
66540a2110SStephen Hemminger struct bnx2x_device_type {
67540a2110SStephen Hemminger uint16_t bnx2x_vid;
68540a2110SStephen Hemminger uint16_t bnx2x_did;
69540a2110SStephen Hemminger uint16_t bnx2x_svid;
70540a2110SStephen Hemminger uint16_t bnx2x_sdid;
71540a2110SStephen Hemminger char *bnx2x_name;
72540a2110SStephen Hemminger };
73540a2110SStephen Hemminger
74540a2110SStephen Hemminger #define BNX2X_PAGE_SHIFT 12
75540a2110SStephen Hemminger #define BNX2X_PAGE_SIZE (1 << BNX2X_PAGE_SHIFT)
76540a2110SStephen Hemminger #define BNX2X_PAGE_MASK (~(BNX2X_PAGE_SIZE - 1))
77540a2110SStephen Hemminger #define BNX2X_PAGE_ALIGN(addr) ((addr + BNX2X_PAGE_SIZE - 1) & BNX2X_PAGE_MASK)
78540a2110SStephen Hemminger
79540a2110SStephen Hemminger #if BNX2X_PAGE_SIZE != 4096
80540a2110SStephen Hemminger #error Page sizes other than 4KB are unsupported!
81540a2110SStephen Hemminger #endif
82540a2110SStephen Hemminger
83540a2110SStephen Hemminger #define U64_LO(addr) ((uint32_t)(((uint64_t)(addr)) & 0xFFFFFFFF))
84540a2110SStephen Hemminger #define U64_HI(addr) ((uint32_t)(((uint64_t)(addr)) >> 32))
85540a2110SStephen Hemminger #define HILO_U64(hi, lo) ((((uint64_t)(hi)) << 32) + (lo))
86540a2110SStephen Hemminger
87540a2110SStephen Hemminger /* dropless fc FW/HW related params */
88540a2110SStephen Hemminger #define BRB_SIZE(sc) (CHIP_IS_E3(sc) ? 1024 : 512)
89540a2110SStephen Hemminger #define MAX_AGG_QS(sc) ETH_MAX_AGGREGATION_QUEUES_E1H_E2
90540a2110SStephen Hemminger #define FW_DROP_LEVEL(sc) (3 + MAX_SPQ_PENDING + MAX_AGG_QS(sc))
91540a2110SStephen Hemminger #define FW_PREFETCH_CNT 16U
92540a2110SStephen Hemminger #define DROPLESS_FC_HEADROOM 100
93540a2110SStephen Hemminger
94540a2110SStephen Hemminger /*
95540a2110SStephen Hemminger * Transmit Buffer Descriptor (tx_bd) definitions*
96540a2110SStephen Hemminger */
97540a2110SStephen Hemminger /* NUM_TX_PAGES must be a power of 2. */
9865a45eccSShahed Shaikh #define NUM_TX_PAGES 16
99540a2110SStephen Hemminger #define TOTAL_TX_BD_PER_PAGE (BNX2X_PAGE_SIZE / sizeof(union eth_tx_bd_types)) /* 256 */
100540a2110SStephen Hemminger #define USABLE_TX_BD_PER_PAGE (TOTAL_TX_BD_PER_PAGE - 1) /* 255 */
101540a2110SStephen Hemminger
102540a2110SStephen Hemminger #define TOTAL_TX_BD(q) (TOTAL_TX_BD_PER_PAGE * q->nb_tx_pages) /* 512 */
103540a2110SStephen Hemminger #define USABLE_TX_BD(q) (USABLE_TX_BD_PER_PAGE * q->nb_tx_pages) /* 510 */
104540a2110SStephen Hemminger #define MAX_TX_BD(q) (TOTAL_TX_BD(q) - 1) /* 511 */
10565a45eccSShahed Shaikh #define MAX_TX_AVAIL (USABLE_TX_BD_PER_PAGE * NUM_TX_PAGES - 2)
106540a2110SStephen Hemminger #define NEXT_TX_BD(x) \
107540a2110SStephen Hemminger ((((x) & USABLE_TX_BD_PER_PAGE) == \
108540a2110SStephen Hemminger (USABLE_TX_BD_PER_PAGE - 1)) ? (x) + 2 : (x) + 1)
109540a2110SStephen Hemminger
110540a2110SStephen Hemminger #define TX_BD(x, q) ((x) & MAX_TX_BD(q))
111540a2110SStephen Hemminger #define TX_PAGE(x) (((x) & ~USABLE_TX_BD_PER_PAGE) >> 8)
112540a2110SStephen Hemminger #define TX_IDX(x) ((x) & USABLE_TX_BD_PER_PAGE)
113540a2110SStephen Hemminger
114827ed2a1SRasesh Mody #define BDS_PER_TX_PKT (3)
115827ed2a1SRasesh Mody
116540a2110SStephen Hemminger /*
117540a2110SStephen Hemminger * Trigger pending transmits when the number of available BDs is greater
118540a2110SStephen Hemminger * than 1/8 of the total number of usable BDs.
119540a2110SStephen Hemminger */
120540a2110SStephen Hemminger #define BNX2X_TX_CLEANUP_THRESHOLD(q) (USABLE_TX_BD(q) / 8)
121540a2110SStephen Hemminger #define BNX2X_TX_TIMEOUT 5
122540a2110SStephen Hemminger
123540a2110SStephen Hemminger /*
124540a2110SStephen Hemminger * Receive Buffer Descriptor (rx_bd) definitions*
125540a2110SStephen Hemminger */
12665a45eccSShahed Shaikh #define MAX_RX_PAGES 8
127540a2110SStephen Hemminger #define TOTAL_RX_BD_PER_PAGE (BNX2X_PAGE_SIZE / sizeof(struct eth_rx_bd)) /* 512 */
128540a2110SStephen Hemminger #define USABLE_RX_BD_PER_PAGE (TOTAL_RX_BD_PER_PAGE - 2) /* 510 */
129540a2110SStephen Hemminger #define RX_BD_PER_PAGE_MASK (TOTAL_RX_BD_PER_PAGE - 1) /* 511 */
130540a2110SStephen Hemminger #define TOTAL_RX_BD(q) (TOTAL_RX_BD_PER_PAGE * q->nb_rx_pages) /* 512 */
131540a2110SStephen Hemminger #define USABLE_RX_BD(q) (USABLE_RX_BD_PER_PAGE * q->nb_rx_pages) /* 510 */
132540a2110SStephen Hemminger #define MAX_RX_BD(q) (TOTAL_RX_BD(q) - 1) /* 511 */
13365a45eccSShahed Shaikh #define MAX_RX_AVAIL (USABLE_RX_BD_PER_PAGE * MAX_RX_PAGES - 2)
134540a2110SStephen Hemminger #define RX_BD_NEXT_PAGE_DESC_CNT 2
135540a2110SStephen Hemminger
136540a2110SStephen Hemminger #define NEXT_RX_BD(x) \
137540a2110SStephen Hemminger ((((x) & RX_BD_PER_PAGE_MASK) == \
138540a2110SStephen Hemminger (USABLE_RX_BD_PER_PAGE - 1)) ? (x) + 3 : (x) + 1)
139540a2110SStephen Hemminger
140540a2110SStephen Hemminger /* x & 0x3ff */
141540a2110SStephen Hemminger #define RX_BD(x, q) ((x) & MAX_RX_BD(q))
142540a2110SStephen Hemminger #define RX_PAGE(x) (((x) & ~RX_BD_PER_PAGE_MASK) >> 9)
143540a2110SStephen Hemminger #define RX_IDX(x) ((x) & RX_BD_PER_PAGE_MASK)
144540a2110SStephen Hemminger
145540a2110SStephen Hemminger /*
146540a2110SStephen Hemminger * Receive Completion Queue definitions*
147540a2110SStephen Hemminger */
148540a2110SStephen Hemminger //#define NUM_RCQ_PAGES (NUM_RX_PAGES * 4)
149540a2110SStephen Hemminger #define TOTAL_RCQ_ENTRIES_PER_PAGE (BNX2X_PAGE_SIZE / sizeof(union eth_rx_cqe)) /* 128 */
150540a2110SStephen Hemminger #define USABLE_RCQ_ENTRIES_PER_PAGE (TOTAL_RCQ_ENTRIES_PER_PAGE - 1) /* 127 */
151540a2110SStephen Hemminger #define TOTAL_RCQ_ENTRIES(q) (TOTAL_RCQ_ENTRIES_PER_PAGE * q->nb_cq_pages) /* 512 */
152540a2110SStephen Hemminger #define USABLE_RCQ_ENTRIES(q) (USABLE_RCQ_ENTRIES_PER_PAGE * q->nb_cq_pages) /* 508 */
153540a2110SStephen Hemminger #define MAX_RCQ_ENTRIES(q) (TOTAL_RCQ_ENTRIES(q) - 1) /* 511 */
154540a2110SStephen Hemminger #define RCQ_NEXT_PAGE_DESC_CNT 1
155540a2110SStephen Hemminger
156540a2110SStephen Hemminger #define NEXT_RCQ_IDX(x) \
157540a2110SStephen Hemminger ((((x) & USABLE_RCQ_ENTRIES_PER_PAGE) == \
158540a2110SStephen Hemminger (USABLE_RCQ_ENTRIES_PER_PAGE - 1)) ? (x) + 2 : (x) + 1)
159540a2110SStephen Hemminger
160540a2110SStephen Hemminger #define CQE_BD_REL \
161540a2110SStephen Hemminger (sizeof(union eth_rx_cqe) / sizeof(struct eth_rx_bd))
162540a2110SStephen Hemminger
163540a2110SStephen Hemminger #define RCQ_BD_PAGES(q) \
164540a2110SStephen Hemminger (q->nb_rx_pages * CQE_BD_REL)
165540a2110SStephen Hemminger
166540a2110SStephen Hemminger #define RCQ_ENTRY(x, q) ((x) & MAX_RCQ_ENTRIES(q))
167540a2110SStephen Hemminger #define RCQ_PAGE(x) (((x) & ~USABLE_RCQ_ENTRIES_PER_PAGE) >> 7)
168540a2110SStephen Hemminger #define RCQ_IDX(x) ((x) & USABLE_RCQ_ENTRIES_PER_PAGE)
169540a2110SStephen Hemminger
170540a2110SStephen Hemminger /*
171540a2110SStephen Hemminger * dropless fc calculations for BDs
172540a2110SStephen Hemminger * Number of BDs should be as number of buffers in BRB:
173540a2110SStephen Hemminger * Low threshold takes into account RX_BD_NEXT_PAGE_DESC_CNT
174540a2110SStephen Hemminger * "next" elements on each page
175540a2110SStephen Hemminger */
176540a2110SStephen Hemminger #define NUM_BD_REQ(sc) \
177540a2110SStephen Hemminger BRB_SIZE(sc)
178540a2110SStephen Hemminger #define NUM_BD_PG_REQ(sc) \
179540a2110SStephen Hemminger ((NUM_BD_REQ(sc) + USABLE_RX_BD_PER_PAGE - 1) / USABLE_RX_BD_PER_PAGE)
180540a2110SStephen Hemminger #define BD_TH_LO(sc) \
181540a2110SStephen Hemminger (NUM_BD_REQ(sc) + \
182540a2110SStephen Hemminger NUM_BD_PG_REQ(sc) * RX_BD_NEXT_PAGE_DESC_CNT + \
183540a2110SStephen Hemminger FW_DROP_LEVEL(sc))
184540a2110SStephen Hemminger #define BD_TH_HI(sc) \
185540a2110SStephen Hemminger (BD_TH_LO(sc) + DROPLESS_FC_HEADROOM)
186540a2110SStephen Hemminger #define MIN_RX_AVAIL(sc) \
187540a2110SStephen Hemminger ((sc)->dropless_fc ? BD_TH_HI(sc) + 128 : 128)
188540a2110SStephen Hemminger
18965a45eccSShahed Shaikh #define MIN_RX_SIZE_NONTPA_HW ETH_MIN_RX_CQES_WITHOUT_TPA
19065a45eccSShahed Shaikh #define MIN_RX_SIZE_NONTPA (RTE_MAX((uint32_t)MIN_RX_SIZE_NONTPA_HW,\
19165a45eccSShahed Shaikh (uint32_t)MIN_RX_AVAIL(sc)))
19265a45eccSShahed Shaikh
193540a2110SStephen Hemminger /*
194540a2110SStephen Hemminger * dropless fc calculations for RCQs
195540a2110SStephen Hemminger * Number of RCQs should be as number of buffers in BRB:
196540a2110SStephen Hemminger * Low threshold takes into account RCQ_NEXT_PAGE_DESC_CNT
197540a2110SStephen Hemminger * "next" elements on each page
198540a2110SStephen Hemminger */
199540a2110SStephen Hemminger #define NUM_RCQ_REQ(sc) \
200540a2110SStephen Hemminger BRB_SIZE(sc)
201540a2110SStephen Hemminger #define NUM_RCQ_PG_REQ(sc) \
202540a2110SStephen Hemminger ((NUM_RCQ_REQ(sc) + USABLE_RCQ_ENTRIES_PER_PAGE - 1) / USABLE_RCQ_ENTRIES_PER_PAGE)
203540a2110SStephen Hemminger #define RCQ_TH_LO(sc) \
204540a2110SStephen Hemminger (NUM_RCQ_REQ(sc) + \
205540a2110SStephen Hemminger NUM_RCQ_PG_REQ(sc) * RCQ_NEXT_PAGE_DESC_CNT + \
206540a2110SStephen Hemminger FW_DROP_LEVEL(sc))
207540a2110SStephen Hemminger #define RCQ_TH_HI(sc) \
208540a2110SStephen Hemminger (RCQ_TH_LO(sc) + DROPLESS_FC_HEADROOM)
209540a2110SStephen Hemminger
210540a2110SStephen Hemminger /* Load / Unload modes */
211540a2110SStephen Hemminger #define LOAD_NORMAL 0
212540a2110SStephen Hemminger #define LOAD_OPEN 1
213540a2110SStephen Hemminger #define LOAD_DIAG 2
214540a2110SStephen Hemminger #define LOAD_LOOPBACK_EXT 3
215540a2110SStephen Hemminger #define UNLOAD_NORMAL 0
216540a2110SStephen Hemminger #define UNLOAD_CLOSE 1
217540a2110SStephen Hemminger #define UNLOAD_RECOVERY 2
218540a2110SStephen Hemminger
219540a2110SStephen Hemminger /* Some constants... */
220540a2110SStephen Hemminger //#define MAX_PATH_NUM 2
221540a2110SStephen Hemminger //#define E2_MAX_NUM_OF_VFS 64
222540a2110SStephen Hemminger //#define E1H_FUNC_MAX 8
223540a2110SStephen Hemminger //#define E2_FUNC_MAX 4 /* per path */
224540a2110SStephen Hemminger #define MAX_VNIC_NUM 4
225540a2110SStephen Hemminger #define MAX_FUNC_NUM 8 /* common to all chips */
226540a2110SStephen Hemminger //#define MAX_NDSB HC_SB_MAX_SB_E2 /* max non-default status block */
227540a2110SStephen Hemminger #define MAX_RSS_CHAINS 16 /* a constant for HW limit */
228540a2110SStephen Hemminger #define MAX_MSI_VECTOR 8 /* a constant for HW limit */
229540a2110SStephen Hemminger
230540a2110SStephen Hemminger #define ILT_NUM_PAGE_ENTRIES 3072
231540a2110SStephen Hemminger /*
232540a2110SStephen Hemminger * 57711 we use whole table since we have 8 functions.
233540a2110SStephen Hemminger * 57712 we have only 4 functions, but use same size per func, so only half
234540a2110SStephen Hemminger * of the table is used.
235540a2110SStephen Hemminger */
236540a2110SStephen Hemminger #define ILT_PER_FUNC (ILT_NUM_PAGE_ENTRIES / 8)
237540a2110SStephen Hemminger #define FUNC_ILT_BASE(func) (func * ILT_PER_FUNC)
238540a2110SStephen Hemminger /*
239540a2110SStephen Hemminger * the phys address is shifted right 12 bits and has an added
240540a2110SStephen Hemminger * 1=valid bit added to the 53rd bit
241540a2110SStephen Hemminger * then since this is a wide register(TM)
242540a2110SStephen Hemminger * we split it into two 32 bit writes
243540a2110SStephen Hemminger */
244540a2110SStephen Hemminger #define ONCHIP_ADDR1(x) ((uint32_t)(((uint64_t)x >> 12) & 0xFFFFFFFF))
245540a2110SStephen Hemminger #define ONCHIP_ADDR2(x) ((uint32_t)((1 << 20) | ((uint64_t)x >> 44)))
246540a2110SStephen Hemminger
247540a2110SStephen Hemminger /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
248540a2110SStephen Hemminger #define ETH_HLEN 14
249540a2110SStephen Hemminger #define ETH_OVERHEAD (ETH_HLEN + 8 + 8)
250540a2110SStephen Hemminger #define ETH_MIN_PACKET_SIZE 60
251540a2110SStephen Hemminger #define ETH_MAX_PACKET_SIZE ETHERMTU /* 1500 */
252540a2110SStephen Hemminger #define ETH_MAX_JUMBO_PACKET_SIZE 9600
253540a2110SStephen Hemminger /* TCP with Timestamp Option (32) + IPv6 (40) */
254540a2110SStephen Hemminger
255540a2110SStephen Hemminger /* max supported alignment is 256 (8 shift) */
256a518584dSChas Williams #define BNX2X_RX_ALIGN_SHIFT RTE_MAX(6, min(8, RTE_CACHE_LINE_SIZE_LOG2))
257540a2110SStephen Hemminger
258540a2110SStephen Hemminger #define BNX2X_PXP_DRAM_ALIGN (BNX2X_RX_ALIGN_SHIFT - 5)
259540a2110SStephen Hemminger
260540a2110SStephen Hemminger struct bnx2x_bar {
261540a2110SStephen Hemminger void *base_addr;
262540a2110SStephen Hemminger };
263540a2110SStephen Hemminger
264540a2110SStephen Hemminger /* Used to manage DMA allocations. */
265540a2110SStephen Hemminger struct bnx2x_dma {
266540a2110SStephen Hemminger struct bnx2x_softc *sc;
267df6e0a06SSantosh Shukla rte_iova_t paddr;
268540a2110SStephen Hemminger void *vaddr;
269540a2110SStephen Hemminger int nseg;
27068ed0742SShahed Shaikh const void *mzone;
271540a2110SStephen Hemminger char msg[RTE_MEMZONE_NAMESIZE - 6];
272540a2110SStephen Hemminger };
273540a2110SStephen Hemminger
274540a2110SStephen Hemminger /* attn group wiring */
275540a2110SStephen Hemminger #define MAX_DYNAMIC_ATTN_GRPS 8
276540a2110SStephen Hemminger
277540a2110SStephen Hemminger struct attn_route {
278540a2110SStephen Hemminger uint32_t sig[5];
279540a2110SStephen Hemminger };
280540a2110SStephen Hemminger
281540a2110SStephen Hemminger struct iro {
282540a2110SStephen Hemminger uint32_t base;
283540a2110SStephen Hemminger uint16_t m1;
284540a2110SStephen Hemminger uint16_t m2;
285540a2110SStephen Hemminger uint16_t m3;
286540a2110SStephen Hemminger uint16_t size;
287540a2110SStephen Hemminger };
288540a2110SStephen Hemminger
289540a2110SStephen Hemminger union bnx2x_host_hc_status_block {
290540a2110SStephen Hemminger /* pointer to fp status block e2 */
291540a2110SStephen Hemminger struct host_hc_status_block_e2 *e2_sb;
292540a2110SStephen Hemminger /* pointer to fp status block e1x */
293540a2110SStephen Hemminger struct host_hc_status_block_e1x *e1x_sb;
294540a2110SStephen Hemminger };
295540a2110SStephen Hemminger
296540a2110SStephen Hemminger union bnx2x_db_prod {
297540a2110SStephen Hemminger struct doorbell_set_prod data;
298540a2110SStephen Hemminger uint32_t raw;
299540a2110SStephen Hemminger };
300540a2110SStephen Hemminger
301540a2110SStephen Hemminger struct bnx2x_sw_tx_bd {
302540a2110SStephen Hemminger struct mbuf *m;
303540a2110SStephen Hemminger uint16_t first_bd;
304540a2110SStephen Hemminger uint8_t flags;
305540a2110SStephen Hemminger /* set on the first BD descriptor when there is a split BD */
306540a2110SStephen Hemminger #define BNX2X_TSO_SPLIT_BD (1 << 0)
307540a2110SStephen Hemminger };
308540a2110SStephen Hemminger
309540a2110SStephen Hemminger /*
310540a2110SStephen Hemminger * This is the HSI fastpath data structure. There can be up to MAX_RSS_CHAIN
311540a2110SStephen Hemminger * instances of the fastpath structure when using multiple queues.
312540a2110SStephen Hemminger */
313540a2110SStephen Hemminger struct bnx2x_fastpath {
314540a2110SStephen Hemminger /* pointer back to parent structure */
315540a2110SStephen Hemminger struct bnx2x_softc *sc;
316540a2110SStephen Hemminger
317141c86f5SRasesh Mody /* Used to synchronize fastpath Rx access */
318141c86f5SRasesh Mody rte_spinlock_t rx_mtx;
319141c86f5SRasesh Mody
320540a2110SStephen Hemminger /* status block */
321540a2110SStephen Hemminger struct bnx2x_dma sb_dma;
322540a2110SStephen Hemminger union bnx2x_host_hc_status_block status_block;
323540a2110SStephen Hemminger
324df6e0a06SSantosh Shukla rte_iova_t tx_desc_mapping;
325540a2110SStephen Hemminger
326df6e0a06SSantosh Shukla rte_iova_t rx_desc_mapping;
327df6e0a06SSantosh Shukla rte_iova_t rx_comp_mapping;
328540a2110SStephen Hemminger
329540a2110SStephen Hemminger uint16_t *sb_index_values;
330540a2110SStephen Hemminger uint16_t *sb_running_index;
331540a2110SStephen Hemminger uint32_t ustorm_rx_prods_offset;
332540a2110SStephen Hemminger
333540a2110SStephen Hemminger uint8_t igu_sb_id; /* status block number in HW */
334540a2110SStephen Hemminger uint8_t fw_sb_id; /* status block number in FW */
335540a2110SStephen Hemminger
336540a2110SStephen Hemminger uint32_t rx_buf_size;
337540a2110SStephen Hemminger
338540a2110SStephen Hemminger int state;
339540a2110SStephen Hemminger #define BNX2X_FP_STATE_CLOSED 0x01
340540a2110SStephen Hemminger #define BNX2X_FP_STATE_IRQ 0x02
341540a2110SStephen Hemminger #define BNX2X_FP_STATE_OPENING 0x04
342540a2110SStephen Hemminger #define BNX2X_FP_STATE_OPEN 0x08
343540a2110SStephen Hemminger #define BNX2X_FP_STATE_HALTING 0x10
344540a2110SStephen Hemminger #define BNX2X_FP_STATE_HALTED 0x20
345540a2110SStephen Hemminger
346540a2110SStephen Hemminger /* reference back to this fastpath queue number */
347540a2110SStephen Hemminger uint8_t index; /* this is also the 'cid' */
348540a2110SStephen Hemminger #define FP_IDX(fp) (fp->index)
349540a2110SStephen Hemminger
350540a2110SStephen Hemminger /* ethernet client ID (each fastpath set of RX/TX/CQE is a client) */
351540a2110SStephen Hemminger uint8_t cl_id;
352540a2110SStephen Hemminger #define FP_CL_ID(fp) (fp->cl_id)
353540a2110SStephen Hemminger uint8_t cl_qzone_id;
354540a2110SStephen Hemminger
355540a2110SStephen Hemminger uint16_t fp_hc_idx;
356540a2110SStephen Hemminger
357540a2110SStephen Hemminger union bnx2x_db_prod tx_db;
358540a2110SStephen Hemminger
359540a2110SStephen Hemminger struct tstorm_per_queue_stats old_tclient;
360540a2110SStephen Hemminger struct ustorm_per_queue_stats old_uclient;
361540a2110SStephen Hemminger struct xstorm_per_queue_stats old_xclient;
362540a2110SStephen Hemminger struct bnx2x_eth_q_stats eth_q_stats;
363540a2110SStephen Hemminger struct bnx2x_eth_q_stats_old eth_q_stats_old;
364540a2110SStephen Hemminger
365540a2110SStephen Hemminger /* Pointer to the receive consumer in the status block */
366540a2110SStephen Hemminger uint16_t *rx_cq_cons_sb;
367540a2110SStephen Hemminger
368540a2110SStephen Hemminger /* Pointer to the transmit consumer in the status block */
369540a2110SStephen Hemminger uint16_t *tx_cons_sb;
370540a2110SStephen Hemminger
371540a2110SStephen Hemminger /* transmit timeout until chip reset */
372540a2110SStephen Hemminger int watchdog_timer;
373540a2110SStephen Hemminger
374540a2110SStephen Hemminger }; /* struct bnx2x_fastpath */
375540a2110SStephen Hemminger
376540a2110SStephen Hemminger #define BNX2X_MAX_NUM_OF_VFS 64
377540a2110SStephen Hemminger #define BNX2X_VF_ID_INVALID 0xFF
378540a2110SStephen Hemminger
379540a2110SStephen Hemminger /* maximum number of fast-path interrupt contexts */
380540a2110SStephen Hemminger #define FP_SB_MAX_E1x 16
381540a2110SStephen Hemminger #define FP_SB_MAX_E2 HC_SB_MAX_SB_E2
382540a2110SStephen Hemminger
383540a2110SStephen Hemminger union cdu_context {
384540a2110SStephen Hemminger struct eth_context eth;
385540a2110SStephen Hemminger char pad[1024];
386540a2110SStephen Hemminger };
387540a2110SStephen Hemminger
388540a2110SStephen Hemminger /* CDU host DB constants */
389540a2110SStephen Hemminger #define CDU_ILT_PAGE_SZ_HW 2
390540a2110SStephen Hemminger #define CDU_ILT_PAGE_SZ (8192 << CDU_ILT_PAGE_SZ_HW) /* 32K */
391540a2110SStephen Hemminger #define ILT_PAGE_CIDS (CDU_ILT_PAGE_SZ / sizeof(union cdu_context))
392540a2110SStephen Hemminger
393540a2110SStephen Hemminger #define CNIC_ISCSI_CID_MAX 256
394540a2110SStephen Hemminger #define CNIC_FCOE_CID_MAX 2048
395540a2110SStephen Hemminger #define CNIC_CID_MAX (CNIC_ISCSI_CID_MAX + CNIC_FCOE_CID_MAX)
396540a2110SStephen Hemminger #define CNIC_ILT_LINES DIV_ROUND_UP(CNIC_CID_MAX, ILT_PAGE_CIDS)
397540a2110SStephen Hemminger
398540a2110SStephen Hemminger #define QM_ILT_PAGE_SZ_HW 0
399540a2110SStephen Hemminger #define QM_ILT_PAGE_SZ (4096 << QM_ILT_PAGE_SZ_HW) /* 4K */
400540a2110SStephen Hemminger #define QM_CID_ROUND 1024
401540a2110SStephen Hemminger
402540a2110SStephen Hemminger /* TM (timers) host DB constants */
403540a2110SStephen Hemminger #define TM_ILT_PAGE_SZ_HW 0
404540a2110SStephen Hemminger #define TM_ILT_PAGE_SZ (4096 << TM_ILT_PAGE_SZ_HW) /* 4K */
405540a2110SStephen Hemminger /*#define TM_CONN_NUM (CNIC_STARTING_CID+CNIC_ISCSI_CXT_MAX) */
406540a2110SStephen Hemminger #define TM_CONN_NUM 1024
407540a2110SStephen Hemminger #define TM_ILT_SZ (8 * TM_CONN_NUM)
408540a2110SStephen Hemminger #define TM_ILT_LINES DIV_ROUND_UP(TM_ILT_SZ, TM_ILT_PAGE_SZ)
409540a2110SStephen Hemminger
410540a2110SStephen Hemminger /* SRC (Searcher) host DB constants */
411540a2110SStephen Hemminger #define SRC_ILT_PAGE_SZ_HW 0
412540a2110SStephen Hemminger #define SRC_ILT_PAGE_SZ (4096 << SRC_ILT_PAGE_SZ_HW) /* 4K */
413540a2110SStephen Hemminger #define SRC_HASH_BITS 10
414540a2110SStephen Hemminger #define SRC_CONN_NUM (1 << SRC_HASH_BITS) /* 1024 */
415540a2110SStephen Hemminger #define SRC_ILT_SZ (sizeof(struct src_ent) * SRC_CONN_NUM)
416540a2110SStephen Hemminger #define SRC_T2_SZ SRC_ILT_SZ
417540a2110SStephen Hemminger #define SRC_ILT_LINES DIV_ROUND_UP(SRC_ILT_SZ, SRC_ILT_PAGE_SZ)
418540a2110SStephen Hemminger
419540a2110SStephen Hemminger struct hw_context {
420540a2110SStephen Hemminger struct bnx2x_dma vcxt_dma;
421540a2110SStephen Hemminger union cdu_context *vcxt;
422df6e0a06SSantosh Shukla //rte_iova_t cxt_mapping;
423540a2110SStephen Hemminger size_t size;
424540a2110SStephen Hemminger };
425540a2110SStephen Hemminger
426540a2110SStephen Hemminger #define SM_RX_ID 0
427540a2110SStephen Hemminger #define SM_TX_ID 1
428540a2110SStephen Hemminger
429540a2110SStephen Hemminger /* defines for multiple tx priority indices */
430540a2110SStephen Hemminger #define FIRST_TX_ONLY_COS_INDEX 1
431540a2110SStephen Hemminger #define FIRST_TX_COS_INDEX 0
432540a2110SStephen Hemminger
433540a2110SStephen Hemminger #define CID_TO_FP(cid, sc) ((cid) % BNX2X_NUM_NON_CNIC_QUEUES(sc))
434540a2110SStephen Hemminger
435540a2110SStephen Hemminger #define HC_INDEX_ETH_RX_CQ_CONS 1
436540a2110SStephen Hemminger #define HC_INDEX_OOO_TX_CQ_CONS 4
437540a2110SStephen Hemminger #define HC_INDEX_ETH_TX_CQ_CONS_COS0 5
438540a2110SStephen Hemminger #define HC_INDEX_ETH_TX_CQ_CONS_COS1 6
439540a2110SStephen Hemminger #define HC_INDEX_ETH_TX_CQ_CONS_COS2 7
440540a2110SStephen Hemminger #define HC_INDEX_ETH_FIRST_TX_CQ_CONS HC_INDEX_ETH_TX_CQ_CONS_COS0
441540a2110SStephen Hemminger
442540a2110SStephen Hemminger /* congestion management fairness mode */
443540a2110SStephen Hemminger #define CMNG_FNS_NONE 0
444540a2110SStephen Hemminger #define CMNG_FNS_MINMAX 1
445540a2110SStephen Hemminger
446540a2110SStephen Hemminger /* CMNG constants, as derived from system spec calculations */
447540a2110SStephen Hemminger /* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */
448540a2110SStephen Hemminger #define DEF_MIN_RATE 100
449540a2110SStephen Hemminger /* resolution of the rate shaping timer - 400 usec */
450540a2110SStephen Hemminger #define RS_PERIODIC_TIMEOUT_USEC 400
451540a2110SStephen Hemminger /* number of bytes in single QM arbitration cycle -
452540a2110SStephen Hemminger * coefficient for calculating the fairness timer */
453540a2110SStephen Hemminger #define QM_ARB_BYTES 160000
454540a2110SStephen Hemminger /* resolution of Min algorithm 1:100 */
455540a2110SStephen Hemminger #define MIN_RES 100
456540a2110SStephen Hemminger /* how many bytes above threshold for the minimal credit of Min algorithm*/
457540a2110SStephen Hemminger #define MIN_ABOVE_THRESH 32768
458540a2110SStephen Hemminger /* fairness algorithm integration time coefficient -
459540a2110SStephen Hemminger * for calculating the actual Tfair */
460540a2110SStephen Hemminger #define T_FAIR_COEF ((MIN_ABOVE_THRESH + QM_ARB_BYTES) * 8 * MIN_RES)
461540a2110SStephen Hemminger /* memory of fairness algorithm - 2 cycles */
462540a2110SStephen Hemminger #define FAIR_MEM 2
463540a2110SStephen Hemminger
464540a2110SStephen Hemminger #define HC_SEG_ACCESS_DEF 0 /* Driver decision 0-3 */
465540a2110SStephen Hemminger #define HC_SEG_ACCESS_ATTN 4
466540a2110SStephen Hemminger #define HC_SEG_ACCESS_NORM 0 /* Driver decision 0-1 */
467540a2110SStephen Hemminger
468540a2110SStephen Hemminger /*
469540a2110SStephen Hemminger * The total number of L2 queues, MSIX vectors and HW contexts (CIDs) is
470540a2110SStephen Hemminger * control by the number of fast-path status blocks supported by the
471540a2110SStephen Hemminger * device (HW/FW). Each fast-path status block (FP-SB) aka non-default
472540a2110SStephen Hemminger * status block represents an independent interrupts context that can
473540a2110SStephen Hemminger * serve a regular L2 networking queue. However special L2 queues such
474540a2110SStephen Hemminger * as the FCoE queue do not require a FP-SB and other components like
475540a2110SStephen Hemminger * the CNIC may consume FP-SB reducing the number of possible L2 queues
476540a2110SStephen Hemminger *
477540a2110SStephen Hemminger * If the maximum number of FP-SB available is X then:
478540a2110SStephen Hemminger * a. If CNIC is supported it consumes 1 FP-SB thus the max number of
479540a2110SStephen Hemminger * regular L2 queues is Y=X-1
480540a2110SStephen Hemminger * b. in MF mode the actual number of L2 queues is Y= (X-1/MF_factor)
481540a2110SStephen Hemminger * c. If the FCoE L2 queue is supported the actual number of L2 queues
482540a2110SStephen Hemminger * is Y+1
483540a2110SStephen Hemminger * d. The number of irqs (MSIX vectors) is either Y+1 (one extra for
484540a2110SStephen Hemminger * slow-path interrupts) or Y+2 if CNIC is supported (one additional
485540a2110SStephen Hemminger * FP interrupt context for the CNIC).
486540a2110SStephen Hemminger * e. The number of HW context (CID count) is always X or X+1 if FCoE
487540a2110SStephen Hemminger * L2 queue is supported. the cid for the FCoE L2 queue is always X.
488540a2110SStephen Hemminger *
489540a2110SStephen Hemminger * So this is quite simple for now as no ULPs are supported yet. :-)
490540a2110SStephen Hemminger */
491540a2110SStephen Hemminger #define BNX2X_NUM_QUEUES(sc) ((sc)->num_queues)
492540a2110SStephen Hemminger #define BNX2X_NUM_ETH_QUEUES(sc) BNX2X_NUM_QUEUES(sc)
493540a2110SStephen Hemminger #define BNX2X_NUM_NON_CNIC_QUEUES(sc) BNX2X_NUM_QUEUES(sc)
494540a2110SStephen Hemminger #define BNX2X_NUM_RX_QUEUES(sc) BNX2X_NUM_QUEUES(sc)
495540a2110SStephen Hemminger
496540a2110SStephen Hemminger #define FOR_EACH_QUEUE(sc, var) \
497540a2110SStephen Hemminger for ((var) = 0; (var) < BNX2X_NUM_QUEUES(sc); (var)++)
498540a2110SStephen Hemminger
499540a2110SStephen Hemminger #define FOR_EACH_NONDEFAULT_QUEUE(sc, var) \
500540a2110SStephen Hemminger for ((var) = 1; (var) < BNX2X_NUM_QUEUES(sc); (var)++)
501540a2110SStephen Hemminger
502540a2110SStephen Hemminger #define FOR_EACH_ETH_QUEUE(sc, var) \
503540a2110SStephen Hemminger for ((var) = 0; (var) < BNX2X_NUM_ETH_QUEUES(sc); (var)++)
504540a2110SStephen Hemminger
505540a2110SStephen Hemminger #define FOR_EACH_NONDEFAULT_ETH_QUEUE(sc, var) \
506540a2110SStephen Hemminger for ((var) = 1; (var) < BNX2X_NUM_ETH_QUEUES(sc); (var)++)
507540a2110SStephen Hemminger
508540a2110SStephen Hemminger #define FOR_EACH_COS_IN_TX_QUEUE(sc, var) \
509540a2110SStephen Hemminger for ((var) = 0; (var) < (sc)->max_cos; (var)++)
510540a2110SStephen Hemminger
511540a2110SStephen Hemminger #define FOR_EACH_CNIC_QUEUE(sc, var) \
512540a2110SStephen Hemminger for ((var) = BNX2X_NUM_ETH_QUEUES(sc); \
513540a2110SStephen Hemminger (var) < BNX2X_NUM_QUEUES(sc); \
514540a2110SStephen Hemminger (var)++)
515540a2110SStephen Hemminger
516540a2110SStephen Hemminger enum {
517540a2110SStephen Hemminger OOO_IDX_OFFSET,
518540a2110SStephen Hemminger FCOE_IDX_OFFSET,
519540a2110SStephen Hemminger FWD_IDX_OFFSET,
520540a2110SStephen Hemminger };
521540a2110SStephen Hemminger
522540a2110SStephen Hemminger #define FCOE_IDX(sc) (BNX2X_NUM_NON_CNIC_QUEUES(sc) + FCOE_IDX_OFFSET)
523540a2110SStephen Hemminger #define bnx2x_fcoe_fp(sc) (&sc->fp[FCOE_IDX(sc)])
524540a2110SStephen Hemminger #define bnx2x_fcoe(sc, var) (bnx2x_fcoe_fp(sc)->var)
525540a2110SStephen Hemminger #define bnx2x_fcoe_inner_sp_obj(sc) (&sc->sp_objs[FCOE_IDX(sc)])
526540a2110SStephen Hemminger #define bnx2x_fcoe_sp_obj(sc, var) (bnx2x_fcoe_inner_sp_obj(sc)->var)
527540a2110SStephen Hemminger #define bnx2x_fcoe_tx(sc, var) (bnx2x_fcoe_fp(sc)->txdata_ptr[FIRST_TX_COS_INDEX]->var)
528540a2110SStephen Hemminger
529540a2110SStephen Hemminger #define OOO_IDX(sc) (BNX2X_NUM_NON_CNIC_QUEUES(sc) + OOO_IDX_OFFSET)
530540a2110SStephen Hemminger #define bnx2x_ooo_fp(sc) (&sc->fp[OOO_IDX(sc)])
531540a2110SStephen Hemminger #define bnx2x_ooo(sc, var) (bnx2x_ooo_fp(sc)->var)
532540a2110SStephen Hemminger #define bnx2x_ooo_inner_sp_obj(sc) (&sc->sp_objs[OOO_IDX(sc)])
533540a2110SStephen Hemminger #define bnx2x_ooo_sp_obj(sc, var) (bnx2x_ooo_inner_sp_obj(sc)->var)
534540a2110SStephen Hemminger
535540a2110SStephen Hemminger #define FWD_IDX(sc) (BNX2X_NUM_NON_CNIC_QUEUES(sc) + FWD_IDX_OFFSET)
536540a2110SStephen Hemminger #define bnx2x_fwd_fp(sc) (&sc->fp[FWD_IDX(sc)])
537540a2110SStephen Hemminger #define bnx2x_fwd(sc, var) (bnx2x_fwd_fp(sc)->var)
538540a2110SStephen Hemminger #define bnx2x_fwd_inner_sp_obj(sc) (&sc->sp_objs[FWD_IDX(sc)])
539540a2110SStephen Hemminger #define bnx2x_fwd_sp_obj(sc, var) (bnx2x_fwd_inner_sp_obj(sc)->var)
540540a2110SStephen Hemminger #define bnx2x_fwd_txdata(fp) (fp->txdata_ptr[FIRST_TX_COS_INDEX])
541540a2110SStephen Hemminger
542540a2110SStephen Hemminger #define IS_ETH_FP(fp) ((fp)->index < BNX2X_NUM_ETH_QUEUES((fp)->sc))
543540a2110SStephen Hemminger #define IS_FCOE_FP(fp) ((fp)->index == FCOE_IDX((fp)->sc))
544540a2110SStephen Hemminger #define IS_FCOE_IDX(idx) ((idx) == FCOE_IDX(sc))
545540a2110SStephen Hemminger #define IS_FWD_FP(fp) ((fp)->index == FWD_IDX((fp)->sc))
546540a2110SStephen Hemminger #define IS_FWD_IDX(idx) ((idx) == FWD_IDX(sc))
547540a2110SStephen Hemminger #define IS_OOO_FP(fp) ((fp)->index == OOO_IDX((fp)->sc))
548540a2110SStephen Hemminger #define IS_OOO_IDX(idx) ((idx) == OOO_IDX(sc))
549540a2110SStephen Hemminger
550540a2110SStephen Hemminger enum {
551540a2110SStephen Hemminger BNX2X_PORT_QUERY_IDX,
552540a2110SStephen Hemminger BNX2X_PF_QUERY_IDX,
553540a2110SStephen Hemminger BNX2X_FCOE_QUERY_IDX,
554540a2110SStephen Hemminger BNX2X_FIRST_QUEUE_QUERY_IDX,
555540a2110SStephen Hemminger };
556540a2110SStephen Hemminger
557540a2110SStephen Hemminger struct bnx2x_fw_stats_req {
558540a2110SStephen Hemminger struct stats_query_header hdr;
559540a2110SStephen Hemminger struct stats_query_entry query[FP_SB_MAX_E1x +
560540a2110SStephen Hemminger BNX2X_FIRST_QUEUE_QUERY_IDX];
561540a2110SStephen Hemminger };
562540a2110SStephen Hemminger
563540a2110SStephen Hemminger struct bnx2x_fw_stats_data {
564540a2110SStephen Hemminger struct stats_counter storm_counters;
565540a2110SStephen Hemminger struct per_port_stats port;
566540a2110SStephen Hemminger struct per_pf_stats pf;
567540a2110SStephen Hemminger struct per_queue_stats queue_stats[1];
568540a2110SStephen Hemminger };
569540a2110SStephen Hemminger
570540a2110SStephen Hemminger /* IGU MSIX STATISTICS on 57712: 64 for VFs; 4 for PFs; 4 for Attentions */
571540a2110SStephen Hemminger #define BNX2X_IGU_STAS_MSG_VF_CNT 64
572540a2110SStephen Hemminger #define BNX2X_IGU_STAS_MSG_PF_CNT 4
573540a2110SStephen Hemminger
574540a2110SStephen Hemminger #define MAX_DMAE_C 8
575540a2110SStephen Hemminger
576540a2110SStephen Hemminger /*
577540a2110SStephen Hemminger * This is the slowpath data structure. It is mapped into non-paged memory
578540a2110SStephen Hemminger * so that the hardware can access it's contents directly and must be page
579540a2110SStephen Hemminger * aligned.
580540a2110SStephen Hemminger */
581540a2110SStephen Hemminger struct bnx2x_slowpath {
582540a2110SStephen Hemminger
583540a2110SStephen Hemminger /* used by the DMAE command executer */
584540a2110SStephen Hemminger struct dmae_command dmae[MAX_DMAE_C];
585540a2110SStephen Hemminger
586540a2110SStephen Hemminger /* statistics completion */
587540a2110SStephen Hemminger uint32_t stats_comp;
588540a2110SStephen Hemminger
589540a2110SStephen Hemminger /* firmware defined statistics blocks */
590540a2110SStephen Hemminger union mac_stats mac_stats;
591540a2110SStephen Hemminger struct nig_stats nig_stats;
592540a2110SStephen Hemminger struct host_port_stats port_stats;
593540a2110SStephen Hemminger struct host_func_stats func_stats;
594540a2110SStephen Hemminger
595540a2110SStephen Hemminger /* DMAE completion value and data source/sink */
596540a2110SStephen Hemminger uint32_t wb_comp;
597540a2110SStephen Hemminger uint32_t wb_data[4];
598540a2110SStephen Hemminger
599540a2110SStephen Hemminger union {
600540a2110SStephen Hemminger struct mac_configuration_cmd e1x;
601540a2110SStephen Hemminger struct eth_classify_rules_ramrod_data e2;
602540a2110SStephen Hemminger } mac_rdata;
603540a2110SStephen Hemminger
604540a2110SStephen Hemminger union {
605540a2110SStephen Hemminger struct tstorm_eth_mac_filter_config e1x;
606540a2110SStephen Hemminger struct eth_filter_rules_ramrod_data e2;
607540a2110SStephen Hemminger } rx_mode_rdata;
608540a2110SStephen Hemminger
609540a2110SStephen Hemminger struct eth_rss_update_ramrod_data rss_rdata;
610540a2110SStephen Hemminger
611540a2110SStephen Hemminger union {
612540a2110SStephen Hemminger struct mac_configuration_cmd e1;
613540a2110SStephen Hemminger struct eth_multicast_rules_ramrod_data e2;
614540a2110SStephen Hemminger } mcast_rdata;
615540a2110SStephen Hemminger
616540a2110SStephen Hemminger union {
617540a2110SStephen Hemminger struct function_start_data func_start;
618540a2110SStephen Hemminger struct flow_control_configuration pfc_config; /* for DCBX ramrod */
619540a2110SStephen Hemminger } func_rdata;
620540a2110SStephen Hemminger
621540a2110SStephen Hemminger /* Queue State related ramrods */
622540a2110SStephen Hemminger union {
623540a2110SStephen Hemminger struct client_init_ramrod_data init_data;
624540a2110SStephen Hemminger struct client_update_ramrod_data update_data;
625540a2110SStephen Hemminger } q_rdata;
626540a2110SStephen Hemminger
627540a2110SStephen Hemminger /*
628540a2110SStephen Hemminger * AFEX ramrod can not be a part of func_rdata union because these
629540a2110SStephen Hemminger * events might arrive in parallel to other events from func_rdata.
630540a2110SStephen Hemminger * If they were defined in the same union the data can get corrupted.
631540a2110SStephen Hemminger */
632540a2110SStephen Hemminger struct afex_vif_list_ramrod_data func_afex_rdata;
633540a2110SStephen Hemminger
634540a2110SStephen Hemminger union drv_info_to_mcp drv_info_to_mcp;
635540a2110SStephen Hemminger }; /* struct bnx2x_slowpath */
636540a2110SStephen Hemminger
637540a2110SStephen Hemminger /*
6387be78d02SJosh Soref * Port specific data structure.
639540a2110SStephen Hemminger */
640540a2110SStephen Hemminger struct bnx2x_port {
641540a2110SStephen Hemminger /*
642540a2110SStephen Hemminger * Port Management Function (for 57711E only).
643540a2110SStephen Hemminger * When this field is set the driver instance is
6447be78d02SJosh Soref * responsible for managing port specific
645540a2110SStephen Hemminger * configurations such as handling link attentions.
646540a2110SStephen Hemminger */
647540a2110SStephen Hemminger uint32_t pmf;
648540a2110SStephen Hemminger
649540a2110SStephen Hemminger /* Ethernet maximum transmission unit. */
650540a2110SStephen Hemminger uint16_t ether_mtu;
651540a2110SStephen Hemminger
652540a2110SStephen Hemminger uint32_t link_config[ELINK_LINK_CONFIG_SIZE];
653540a2110SStephen Hemminger
654540a2110SStephen Hemminger uint32_t ext_phy_config;
655540a2110SStephen Hemminger
656540a2110SStephen Hemminger /* Port feature config.*/
657540a2110SStephen Hemminger uint32_t config;
658540a2110SStephen Hemminger
659540a2110SStephen Hemminger /* Defines the features supported by the PHY. */
660540a2110SStephen Hemminger uint32_t supported[ELINK_LINK_CONFIG_SIZE];
661540a2110SStephen Hemminger
662540a2110SStephen Hemminger /* Defines the features advertised by the PHY. */
663540a2110SStephen Hemminger uint32_t advertising[ELINK_LINK_CONFIG_SIZE];
664540a2110SStephen Hemminger #define ADVERTISED_10baseT_Half (1 << 1)
665540a2110SStephen Hemminger #define ADVERTISED_10baseT_Full (1 << 2)
666540a2110SStephen Hemminger #define ADVERTISED_100baseT_Half (1 << 3)
667540a2110SStephen Hemminger #define ADVERTISED_100baseT_Full (1 << 4)
668540a2110SStephen Hemminger #define ADVERTISED_1000baseT_Half (1 << 5)
669540a2110SStephen Hemminger #define ADVERTISED_1000baseT_Full (1 << 6)
670540a2110SStephen Hemminger #define ADVERTISED_TP (1 << 7)
671540a2110SStephen Hemminger #define ADVERTISED_FIBRE (1 << 8)
672540a2110SStephen Hemminger #define ADVERTISED_Autoneg (1 << 9)
673540a2110SStephen Hemminger #define ADVERTISED_Asym_Pause (1 << 10)
674540a2110SStephen Hemminger #define ADVERTISED_Pause (1 << 11)
675540a2110SStephen Hemminger #define ADVERTISED_2500baseX_Full (1 << 15)
676540a2110SStephen Hemminger #define ADVERTISED_10000baseT_Full (1 << 16)
677540a2110SStephen Hemminger
678540a2110SStephen Hemminger uint32_t phy_addr;
679540a2110SStephen Hemminger
680a9b58b15SRasesh Mody /* Used to synchronize phy accesses. */
681a9b58b15SRasesh Mody rte_spinlock_t phy_mtx;
682a9b58b15SRasesh Mody char phy_mtx_name[32];
683a9b58b15SRasesh Mody
684a9b58b15SRasesh Mody #define BNX2X_PHY_LOCK(sc) rte_spinlock_lock(&sc->port.phy_mtx)
685a9b58b15SRasesh Mody #define BNX2X_PHY_UNLOCK(sc) rte_spinlock_unlock(&sc->port.phy_mtx)
686a9b58b15SRasesh Mody
687540a2110SStephen Hemminger /*
688540a2110SStephen Hemminger * MCP scratchpad address for port specific statistics.
6897be78d02SJosh Soref * The device is responsible for writing statistics
690540a2110SStephen Hemminger * back to the MCP for use with management firmware such
691540a2110SStephen Hemminger * as UMP/NC-SI.
692540a2110SStephen Hemminger */
693540a2110SStephen Hemminger uint32_t port_stx;
694540a2110SStephen Hemminger
695540a2110SStephen Hemminger struct nig_stats old_nig_stats;
696540a2110SStephen Hemminger }; /* struct bnx2x_port */
697540a2110SStephen Hemminger
698540a2110SStephen Hemminger struct bnx2x_mf_info {
699540a2110SStephen Hemminger uint32_t mf_config[E1HVN_MAX];
700540a2110SStephen Hemminger
701540a2110SStephen Hemminger uint32_t vnics_per_port; /* 1, 2 or 4 */
702540a2110SStephen Hemminger uint32_t multi_vnics_mode; /* can be set even if vnics_per_port = 1 */
703540a2110SStephen Hemminger uint32_t path_has_ovlan; /* MF mode in the path (can be different than the MF mode of the function */
704540a2110SStephen Hemminger
705540a2110SStephen Hemminger #define IS_MULTI_VNIC(sc) ((sc)->devinfo.mf_info.multi_vnics_mode)
706540a2110SStephen Hemminger #define VNICS_PER_PORT(sc) ((sc)->devinfo.mf_info.vnics_per_port)
707540a2110SStephen Hemminger #define VNICS_PER_PATH(sc) \
708540a2110SStephen Hemminger ((sc)->devinfo.mf_info.vnics_per_port * \
709540a2110SStephen Hemminger ((CHIP_PORT_MODE(sc) == CHIP_4_PORT_MODE) ? 2 : 1 ))
710540a2110SStephen Hemminger
711540a2110SStephen Hemminger uint8_t min_bw[MAX_VNIC_NUM];
712540a2110SStephen Hemminger uint8_t max_bw[MAX_VNIC_NUM];
713540a2110SStephen Hemminger
714540a2110SStephen Hemminger uint16_t ext_id; /* vnic outer vlan or VIF ID */
715540a2110SStephen Hemminger #define VALID_OVLAN(ovlan) ((ovlan) <= 4096)
716540a2110SStephen Hemminger #define INVALID_VIF_ID 0xFFFF
717540a2110SStephen Hemminger #define OVLAN(sc) ((sc)->devinfo.mf_info.ext_id)
718540a2110SStephen Hemminger #define VIF_ID(sc) ((sc)->devinfo.mf_info.ext_id)
719540a2110SStephen Hemminger
720540a2110SStephen Hemminger uint16_t default_vlan;
721540a2110SStephen Hemminger #define NIV_DEFAULT_VLAN(sc) ((sc)->devinfo.mf_info.default_vlan)
722540a2110SStephen Hemminger
723540a2110SStephen Hemminger uint8_t niv_allowed_priorities;
724540a2110SStephen Hemminger #define NIV_ALLOWED_PRIORITIES(sc) ((sc)->devinfo.mf_info.niv_allowed_priorities)
725540a2110SStephen Hemminger
726540a2110SStephen Hemminger uint8_t niv_default_cos;
727540a2110SStephen Hemminger #define NIV_DEFAULT_COS(sc) ((sc)->devinfo.mf_info.niv_default_cos)
728540a2110SStephen Hemminger
729540a2110SStephen Hemminger uint8_t niv_mba_enabled;
730540a2110SStephen Hemminger
731540a2110SStephen Hemminger enum mf_cfg_afex_vlan_mode afex_vlan_mode;
732540a2110SStephen Hemminger #define AFEX_VLAN_MODE(sc) ((sc)->devinfo.mf_info.afex_vlan_mode)
733540a2110SStephen Hemminger int afex_def_vlan_tag;
734540a2110SStephen Hemminger uint32_t pending_max;
735540a2110SStephen Hemminger
736540a2110SStephen Hemminger uint16_t flags;
737540a2110SStephen Hemminger #define MF_INFO_VALID_MAC 0x0001
738540a2110SStephen Hemminger
739540a2110SStephen Hemminger uint16_t mf_ov;
740540a2110SStephen Hemminger uint8_t mf_mode; /* Switch-Dependent or Switch-Independent */
741540a2110SStephen Hemminger #define IS_MF(sc) \
742540a2110SStephen Hemminger (IS_MULTI_VNIC(sc) && \
743540a2110SStephen Hemminger ((sc)->devinfo.mf_info.mf_mode != 0))
744540a2110SStephen Hemminger #define IS_MF_SD(sc) \
745540a2110SStephen Hemminger (IS_MULTI_VNIC(sc) && \
746540a2110SStephen Hemminger ((sc)->devinfo.mf_info.mf_mode == MULTI_FUNCTION_SD))
747540a2110SStephen Hemminger #define IS_MF_SI(sc) \
748540a2110SStephen Hemminger (IS_MULTI_VNIC(sc) && \
749540a2110SStephen Hemminger ((sc)->devinfo.mf_info.mf_mode == MULTI_FUNCTION_SI))
750540a2110SStephen Hemminger #define IS_MF_AFEX(sc) \
751540a2110SStephen Hemminger (IS_MULTI_VNIC(sc) && \
752540a2110SStephen Hemminger ((sc)->devinfo.mf_info.mf_mode == MULTI_FUNCTION_AFEX))
753540a2110SStephen Hemminger #define IS_MF_SD_MODE(sc) IS_MF_SD(sc)
754540a2110SStephen Hemminger #define IS_MF_SI_MODE(sc) IS_MF_SI(sc)
755540a2110SStephen Hemminger #define IS_MF_AFEX_MODE(sc) IS_MF_AFEX(sc)
756540a2110SStephen Hemminger
757540a2110SStephen Hemminger uint32_t mf_protos_supported;
758540a2110SStephen Hemminger #define MF_PROTO_SUPPORT_ETHERNET 0x1
759540a2110SStephen Hemminger #define MF_PROTO_SUPPORT_ISCSI 0x2
760540a2110SStephen Hemminger #define MF_PROTO_SUPPORT_FCOE 0x4
761540a2110SStephen Hemminger }; /* struct bnx2x_mf_info */
762540a2110SStephen Hemminger
763540a2110SStephen Hemminger /* Device information data structure. */
764540a2110SStephen Hemminger struct bnx2x_devinfo {
765ba7eeb03SRasesh Mody #if 1
766ba7eeb03SRasesh Mody #define NAME_SIZE 128
767ba7eeb03SRasesh Mody char name[NAME_SIZE];
768ba7eeb03SRasesh Mody #endif
769540a2110SStephen Hemminger /* PCIe info */
770540a2110SStephen Hemminger uint16_t vendor_id;
771540a2110SStephen Hemminger uint16_t device_id;
772540a2110SStephen Hemminger uint16_t subvendor_id;
773540a2110SStephen Hemminger uint16_t subdevice_id;
774540a2110SStephen Hemminger
775540a2110SStephen Hemminger /*
776540a2110SStephen Hemminger * chip_id = 0b'CCCCCCCCCCCCCCCCRRRRMMMMMMMMBBBB'
777540a2110SStephen Hemminger * C = Chip Number (bits 16-31)
778540a2110SStephen Hemminger * R = Chip Revision (bits 12-15)
779540a2110SStephen Hemminger * M = Chip Metal (bits 4-11)
780540a2110SStephen Hemminger * B = Chip Bond ID (bits 0-3)
781540a2110SStephen Hemminger */
782540a2110SStephen Hemminger uint32_t chip_id;
783540a2110SStephen Hemminger #define CHIP_ID(sc) ((sc)->devinfo.chip_id & 0xffff0000)
784540a2110SStephen Hemminger #define CHIP_NUM(sc) ((sc)->devinfo.chip_id >> 16)
785540a2110SStephen Hemminger /* device ids */
786d5eb8edcSRasesh Mody #define CHIP_NUM_57710 0x164e
787540a2110SStephen Hemminger #define CHIP_NUM_57711 0x164f
788540a2110SStephen Hemminger #define CHIP_NUM_57711E 0x1650
789540a2110SStephen Hemminger #define CHIP_NUM_57712 0x1662
790540a2110SStephen Hemminger #define CHIP_NUM_57712_MF 0x1663
791540a2110SStephen Hemminger #define CHIP_NUM_57712_VF 0x166f
792540a2110SStephen Hemminger #define CHIP_NUM_57800 0x168a
793540a2110SStephen Hemminger #define CHIP_NUM_57800_MF 0x16a5
794540a2110SStephen Hemminger #define CHIP_NUM_57800_VF 0x16a9
795540a2110SStephen Hemminger #define CHIP_NUM_57810 0x168e
796540a2110SStephen Hemminger #define CHIP_NUM_57810_MF 0x16ae
797540a2110SStephen Hemminger #define CHIP_NUM_57810_VF 0x16af
798540a2110SStephen Hemminger #define CHIP_NUM_57811 0x163d
799540a2110SStephen Hemminger #define CHIP_NUM_57811_MF 0x163e
800540a2110SStephen Hemminger #define CHIP_NUM_57811_VF 0x163f
801540a2110SStephen Hemminger #define CHIP_NUM_57840_OBS 0x168d
802540a2110SStephen Hemminger #define CHIP_NUM_57840_OBS_MF 0x16ab
803540a2110SStephen Hemminger #define CHIP_NUM_57840_4_10 0x16a1
804540a2110SStephen Hemminger #define CHIP_NUM_57840_2_20 0x16a2
805540a2110SStephen Hemminger #define CHIP_NUM_57840_MF 0x16a4
806540a2110SStephen Hemminger #define CHIP_NUM_57840_VF 0x16ad
807540a2110SStephen Hemminger
808540a2110SStephen Hemminger #define CHIP_REV_SHIFT 12
809540a2110SStephen Hemminger #define CHIP_REV_MASK (0xF << CHIP_REV_SHIFT)
810540a2110SStephen Hemminger #define CHIP_REV(sc) ((sc)->devinfo.chip_id & CHIP_REV_MASK)
811540a2110SStephen Hemminger
812540a2110SStephen Hemminger #define CHIP_REV_Ax (0x0 << CHIP_REV_SHIFT)
813540a2110SStephen Hemminger #define CHIP_REV_Bx (0x1 << CHIP_REV_SHIFT)
814540a2110SStephen Hemminger #define CHIP_REV_Cx (0x2 << CHIP_REV_SHIFT)
815540a2110SStephen Hemminger
816540a2110SStephen Hemminger #define CHIP_REV_IS_SLOW(sc) \
817540a2110SStephen Hemminger (CHIP_REV(sc) > 0x00005000)
818540a2110SStephen Hemminger #define CHIP_REV_IS_FPGA(sc) \
819540a2110SStephen Hemminger (CHIP_REV_IS_SLOW(sc) && (CHIP_REV(sc) & 0x00001000))
820540a2110SStephen Hemminger #define CHIP_REV_IS_EMUL(sc) \
821540a2110SStephen Hemminger (CHIP_REV_IS_SLOW(sc) && !(CHIP_REV(sc) & 0x00001000))
822540a2110SStephen Hemminger #define CHIP_REV_IS_ASIC(sc) \
823540a2110SStephen Hemminger (!CHIP_REV_IS_SLOW(sc))
824540a2110SStephen Hemminger
825540a2110SStephen Hemminger #define CHIP_METAL(sc) ((sc->devinfo.chip_id) & 0x00000ff0)
826540a2110SStephen Hemminger #define CHIP_BOND_ID(sc) ((sc->devinfo.chip_id) & 0x0000000f)
827540a2110SStephen Hemminger
828d5eb8edcSRasesh Mody #define CHIP_IS_E1(sc) (CHIP_NUM(sc) == CHIP_NUM_57710)
829d5eb8edcSRasesh Mody #define CHIP_IS_57710(sc) (CHIP_NUM(sc) == CHIP_NUM_57710)
830540a2110SStephen Hemminger #define CHIP_IS_57711(sc) (CHIP_NUM(sc) == CHIP_NUM_57711)
831540a2110SStephen Hemminger #define CHIP_IS_57711E(sc) (CHIP_NUM(sc) == CHIP_NUM_57711E)
832540a2110SStephen Hemminger #define CHIP_IS_E1H(sc) ((CHIP_IS_57711(sc)) || \
833540a2110SStephen Hemminger (CHIP_IS_57711E(sc)))
834540a2110SStephen Hemminger #define CHIP_IS_E1x(sc) CHIP_IS_E1H(sc)
835540a2110SStephen Hemminger
836540a2110SStephen Hemminger #define CHIP_IS_57712(sc) (CHIP_NUM(sc) == CHIP_NUM_57712)
837540a2110SStephen Hemminger #define CHIP_IS_57712_MF(sc) (CHIP_NUM(sc) == CHIP_NUM_57712_MF)
838540a2110SStephen Hemminger #define CHIP_IS_57712_VF(sc) (CHIP_NUM(sc) == CHIP_NUM_57712_VF)
839540a2110SStephen Hemminger #define CHIP_IS_E2(sc) (CHIP_IS_57712(sc) || \
840540a2110SStephen Hemminger CHIP_IS_57712_MF(sc))
841540a2110SStephen Hemminger
842540a2110SStephen Hemminger #define CHIP_IS_57800(sc) (CHIP_NUM(sc) == CHIP_NUM_57800)
843540a2110SStephen Hemminger #define CHIP_IS_57800_MF(sc) (CHIP_NUM(sc) == CHIP_NUM_57800_MF)
844540a2110SStephen Hemminger #define CHIP_IS_57800_VF(sc) (CHIP_NUM(sc) == CHIP_NUM_57800_VF)
845540a2110SStephen Hemminger #define CHIP_IS_57810(sc) (CHIP_NUM(sc) == CHIP_NUM_57810)
846540a2110SStephen Hemminger #define CHIP_IS_57810_MF(sc) (CHIP_NUM(sc) == CHIP_NUM_57810_MF)
847540a2110SStephen Hemminger #define CHIP_IS_57810_VF(sc) (CHIP_NUM(sc) == CHIP_NUM_57810_VF)
848540a2110SStephen Hemminger #define CHIP_IS_57811(sc) (CHIP_NUM(sc) == CHIP_NUM_57811)
849540a2110SStephen Hemminger #define CHIP_IS_57811_MF(sc) (CHIP_NUM(sc) == CHIP_NUM_57811_MF)
850540a2110SStephen Hemminger #define CHIP_IS_57811_VF(sc) (CHIP_NUM(sc) == CHIP_NUM_57811_VF)
851540a2110SStephen Hemminger #define CHIP_IS_57840(sc) ((CHIP_NUM(sc) == CHIP_NUM_57840_OBS) || \
852540a2110SStephen Hemminger (CHIP_NUM(sc) == CHIP_NUM_57840_4_10) || \
853540a2110SStephen Hemminger (CHIP_NUM(sc) == CHIP_NUM_57840_2_20))
854540a2110SStephen Hemminger #define CHIP_IS_57840_MF(sc) ((CHIP_NUM(sc) == CHIP_NUM_57840_OBS_MF) || \
855540a2110SStephen Hemminger (CHIP_NUM(sc) == CHIP_NUM_57840_MF))
856540a2110SStephen Hemminger #define CHIP_IS_57840_VF(sc) (CHIP_NUM(sc) == CHIP_NUM_57840_VF)
857540a2110SStephen Hemminger
858540a2110SStephen Hemminger #define CHIP_IS_E3(sc) (CHIP_IS_57800(sc) || \
859540a2110SStephen Hemminger CHIP_IS_57800_MF(sc) || \
860540a2110SStephen Hemminger CHIP_IS_57800_VF(sc) || \
861540a2110SStephen Hemminger CHIP_IS_57810(sc) || \
862540a2110SStephen Hemminger CHIP_IS_57810_MF(sc) || \
863540a2110SStephen Hemminger CHIP_IS_57810_VF(sc) || \
864540a2110SStephen Hemminger CHIP_IS_57811(sc) || \
865540a2110SStephen Hemminger CHIP_IS_57811_MF(sc) || \
866540a2110SStephen Hemminger CHIP_IS_57811_VF(sc) || \
867540a2110SStephen Hemminger CHIP_IS_57840(sc) || \
868540a2110SStephen Hemminger CHIP_IS_57840_MF(sc) || \
869540a2110SStephen Hemminger CHIP_IS_57840_VF(sc))
870540a2110SStephen Hemminger #define CHIP_IS_E3A0(sc) (CHIP_IS_E3(sc) && \
871540a2110SStephen Hemminger (CHIP_REV(sc) == CHIP_REV_Ax))
872540a2110SStephen Hemminger #define CHIP_IS_E3B0(sc) (CHIP_IS_E3(sc) && \
873540a2110SStephen Hemminger (CHIP_REV(sc) == CHIP_REV_Bx))
874540a2110SStephen Hemminger
875540a2110SStephen Hemminger #define USES_WARPCORE(sc) (CHIP_IS_E3(sc))
876540a2110SStephen Hemminger #define CHIP_IS_E2E3(sc) (CHIP_IS_E2(sc) || \
877540a2110SStephen Hemminger CHIP_IS_E3(sc))
878540a2110SStephen Hemminger
879540a2110SStephen Hemminger #define CHIP_IS_MF_CAP(sc) (CHIP_IS_57711E(sc) || \
880540a2110SStephen Hemminger CHIP_IS_57712_MF(sc) || \
881540a2110SStephen Hemminger CHIP_IS_E3(sc))
882540a2110SStephen Hemminger
883540a2110SStephen Hemminger #define IS_VF(sc) ((sc)->flags & BNX2X_IS_VF_FLAG)
884540a2110SStephen Hemminger #define IS_PF(sc) (!IS_VF(sc))
885540a2110SStephen Hemminger
886540a2110SStephen Hemminger /*
887540a2110SStephen Hemminger * This define is used in two main places:
888540a2110SStephen Hemminger * 1. In the early stages of nic_load, to know if to configure Parser/Searcher
889540a2110SStephen Hemminger * to nic-only mode or to offload mode. Offload mode is configured if either
890540a2110SStephen Hemminger * the chip is E1x (where NIC_MODE register is not applicable), or if cnic
891540a2110SStephen Hemminger * already registered for this port (which means that the user wants storage
892540a2110SStephen Hemminger * services).
893540a2110SStephen Hemminger * 2. During cnic-related load, to know if offload mode is already configured
8947be78d02SJosh Soref * in the HW or needs to be configured. Since the transition from nic-mode to
8957be78d02SJosh Soref * offload-mode in HW causes traffic corruption, nic-mode is configured only
896540a2110SStephen Hemminger * in ports on which storage services where never requested.
897540a2110SStephen Hemminger */
898540a2110SStephen Hemminger #define CONFIGURE_NIC_MODE(sc) (!CHIP_IS_E1x(sc) && !CNIC_ENABLED(sc))
899540a2110SStephen Hemminger
900540a2110SStephen Hemminger uint8_t chip_port_mode;
901540a2110SStephen Hemminger #define CHIP_4_PORT_MODE 0x0
902540a2110SStephen Hemminger #define CHIP_2_PORT_MODE 0x1
903540a2110SStephen Hemminger #define CHIP_PORT_MODE_NONE 0x2
904540a2110SStephen Hemminger #define CHIP_PORT_MODE(sc) ((sc)->devinfo.chip_port_mode)
905540a2110SStephen Hemminger #define CHIP_IS_MODE_4_PORT(sc) (CHIP_PORT_MODE(sc) == CHIP_4_PORT_MODE)
906540a2110SStephen Hemminger
907540a2110SStephen Hemminger uint8_t int_block;
908540a2110SStephen Hemminger #define INT_BLOCK_HC 0
909540a2110SStephen Hemminger #define INT_BLOCK_IGU 1
910540a2110SStephen Hemminger #define INT_BLOCK_MODE_NORMAL 0
911540a2110SStephen Hemminger #define INT_BLOCK_MODE_BW_COMP 2
912540a2110SStephen Hemminger #define CHIP_INT_MODE_IS_NBC(sc) \
913540a2110SStephen Hemminger (!CHIP_IS_E1x(sc) && \
914540a2110SStephen Hemminger !((sc)->devinfo.int_block & INT_BLOCK_MODE_BW_COMP))
915540a2110SStephen Hemminger #define CHIP_INT_MODE_IS_BC(sc) (!CHIP_INT_MODE_IS_NBC(sc))
916540a2110SStephen Hemminger
917540a2110SStephen Hemminger uint32_t shmem_base;
918540a2110SStephen Hemminger uint32_t shmem2_base;
919540a2110SStephen Hemminger uint32_t bc_ver;
920540a2110SStephen Hemminger char bc_ver_str[32];
921540a2110SStephen Hemminger uint32_t mf_cfg_base; /* bootcode shmem address in BAR memory */
922540a2110SStephen Hemminger struct bnx2x_mf_info mf_info;
923540a2110SStephen Hemminger
924540a2110SStephen Hemminger uint32_t flash_size;
925540a2110SStephen Hemminger #define NVRAM_1MB_SIZE 0x20000
926540a2110SStephen Hemminger #define NVRAM_TIMEOUT_COUNT 30000
927540a2110SStephen Hemminger #define NVRAM_PAGE_SIZE 256
928540a2110SStephen Hemminger
929540a2110SStephen Hemminger /* PCIe capability information */
930540a2110SStephen Hemminger uint32_t pcie_cap_flags;
931540a2110SStephen Hemminger #define BNX2X_PM_CAPABLE_FLAG 0x00000001
932540a2110SStephen Hemminger #define BNX2X_PCIE_CAPABLE_FLAG 0x00000002
933540a2110SStephen Hemminger #define BNX2X_MSI_CAPABLE_FLAG 0x00000004
934540a2110SStephen Hemminger #define BNX2X_MSIX_CAPABLE_FLAG 0x00000008
935540a2110SStephen Hemminger uint16_t pcie_pm_cap_reg;
936540a2110SStephen Hemminger uint16_t pcie_link_width;
937540a2110SStephen Hemminger uint16_t pcie_link_speed;
938540a2110SStephen Hemminger uint16_t pcie_msi_cap_reg;
939540a2110SStephen Hemminger uint16_t pcie_msix_cap_reg;
940540a2110SStephen Hemminger
941540a2110SStephen Hemminger /* device configuration read from bootcode shared memory */
942540a2110SStephen Hemminger uint32_t hw_config;
943540a2110SStephen Hemminger uint32_t hw_config2;
944540a2110SStephen Hemminger }; /* struct bnx2x_devinfo */
945540a2110SStephen Hemminger
946540a2110SStephen Hemminger struct bnx2x_sp_objs {
947540a2110SStephen Hemminger struct ecore_vlan_mac_obj mac_obj; /* MACs object */
948540a2110SStephen Hemminger struct ecore_queue_sp_obj q_obj; /* Queue State object */
949540a2110SStephen Hemminger }; /* struct bnx2x_sp_objs */
950540a2110SStephen Hemminger
951540a2110SStephen Hemminger /*
952540a2110SStephen Hemminger * Data that will be used to create a link report message. We will keep the
953540a2110SStephen Hemminger * data used for the last link report in order to prevent reporting the same
954540a2110SStephen Hemminger * link parameters twice.
955540a2110SStephen Hemminger */
956540a2110SStephen Hemminger struct bnx2x_link_report_data {
957540a2110SStephen Hemminger uint16_t line_speed; /* Effective line speed */
958de6eab7cSJoyce Kong uint32_t link_report_flags; /* BNX2X_LINK_REPORT_XXX flags */
959540a2110SStephen Hemminger };
960540a2110SStephen Hemminger
961540a2110SStephen Hemminger enum {
962540a2110SStephen Hemminger BNX2X_LINK_REPORT_FULL_DUPLEX,
963540a2110SStephen Hemminger BNX2X_LINK_REPORT_LINK_DOWN,
964540a2110SStephen Hemminger BNX2X_LINK_REPORT_RX_FC_ON,
965540a2110SStephen Hemminger BNX2X_LINK_REPORT_TX_FC_ON
966540a2110SStephen Hemminger };
967540a2110SStephen Hemminger
968540a2110SStephen Hemminger #define BNX2X_RX_CHAIN_PAGE_SZ BNX2X_PAGE_SIZE
969540a2110SStephen Hemminger
970540a2110SStephen Hemminger struct bnx2x_pci_cap {
971540a2110SStephen Hemminger struct bnx2x_pci_cap *next;
972540a2110SStephen Hemminger uint16_t id;
973540a2110SStephen Hemminger uint16_t type;
974540a2110SStephen Hemminger uint16_t addr;
975540a2110SStephen Hemminger };
976540a2110SStephen Hemminger
9770cb4150fSRasesh Mody struct ecore_ilt;
9780cb4150fSRasesh Mody
979540a2110SStephen Hemminger struct bnx2x_vfdb;
980540a2110SStephen Hemminger
981540a2110SStephen Hemminger /* Top level device private data structure. */
982540a2110SStephen Hemminger struct bnx2x_softc {
983540a2110SStephen Hemminger
984540a2110SStephen Hemminger void **rx_queues;
985540a2110SStephen Hemminger void **tx_queues;
986540a2110SStephen Hemminger uint32_t max_tx_queues;
987540a2110SStephen Hemminger uint32_t max_rx_queues;
988540a2110SStephen Hemminger const struct rte_pci_device *pci_dev;
989540a2110SStephen Hemminger uint32_t pci_val;
990540a2110SStephen Hemminger struct bnx2x_pci_cap *pci_caps;
991540a2110SStephen Hemminger #define BNX2X_INTRS_POLL_PERIOD 1
992540a2110SStephen Hemminger
993540a2110SStephen Hemminger void *firmware;
994540a2110SStephen Hemminger uint64_t fw_len;
995540a2110SStephen Hemminger
996540a2110SStephen Hemminger /* MAC address operations */
997540a2110SStephen Hemminger struct bnx2x_mac_ops mac_ops;
998540a2110SStephen Hemminger
999540a2110SStephen Hemminger /* structures for VF mbox/response/bulletin */
1000540a2110SStephen Hemminger struct bnx2x_vf_mbx_msg *vf2pf_mbox;
1001540a2110SStephen Hemminger struct bnx2x_dma vf2pf_mbox_mapping;
1002540a2110SStephen Hemminger struct vf_acquire_resp_tlv acquire_resp;
1003540a2110SStephen Hemminger struct bnx2x_vf_bulletin *pf2vf_bulletin;
1004540a2110SStephen Hemminger struct bnx2x_dma pf2vf_bulletin_mapping;
1005540a2110SStephen Hemminger struct bnx2x_vf_bulletin old_bulletin;
1006cf32c2e5SChas Williams rte_spinlock_t vf2pf_lock;
1007540a2110SStephen Hemminger
1008540a2110SStephen Hemminger int media;
1009540a2110SStephen Hemminger
1010540a2110SStephen Hemminger int state; /* device state */
1011540a2110SStephen Hemminger #define BNX2X_STATE_CLOSED 0x0000
1012540a2110SStephen Hemminger #define BNX2X_STATE_OPENING_WAITING_LOAD 0x1000
1013540a2110SStephen Hemminger #define BNX2X_STATE_OPENING_WAITING_PORT 0x2000
1014540a2110SStephen Hemminger #define BNX2X_STATE_OPEN 0x3000
1015540a2110SStephen Hemminger #define BNX2X_STATE_CLOSING_WAITING_HALT 0x4000
1016540a2110SStephen Hemminger #define BNX2X_STATE_CLOSING_WAITING_DELETE 0x5000
1017540a2110SStephen Hemminger #define BNX2X_STATE_CLOSING_WAITING_UNLOAD 0x6000
1018540a2110SStephen Hemminger #define BNX2X_STATE_DISABLED 0xD000
1019540a2110SStephen Hemminger #define BNX2X_STATE_DIAG 0xE000
1020540a2110SStephen Hemminger #define BNX2X_STATE_ERROR 0xF000
1021540a2110SStephen Hemminger
1022540a2110SStephen Hemminger int flags;
1023540a2110SStephen Hemminger #define BNX2X_ONE_PORT_FLAG 0x1
1024540a2110SStephen Hemminger #define BNX2X_NO_FCOE_FLAG 0x2
1025540a2110SStephen Hemminger #define BNX2X_NO_WOL_FLAG 0x4
1026540a2110SStephen Hemminger #define BNX2X_NO_MCP_FLAG 0x8
1027540a2110SStephen Hemminger #define BNX2X_NO_ISCSI_OOO_FLAG 0x10
1028540a2110SStephen Hemminger #define BNX2X_NO_ISCSI_FLAG 0x20
1029540a2110SStephen Hemminger #define BNX2X_MF_FUNC_DIS 0x40
1030540a2110SStephen Hemminger #define BNX2X_TX_SWITCHING 0x80
1031540a2110SStephen Hemminger #define BNX2X_IS_VF_FLAG 0x100
1032540a2110SStephen Hemminger
1033540a2110SStephen Hemminger #define BNX2X_ONE_PORT(sc) (sc->flags & BNX2X_ONE_PORT_FLAG)
1034540a2110SStephen Hemminger #define BNX2X_NOFCOE(sc) (sc->flags & BNX2X_NO_FCOE_FLAG)
1035540a2110SStephen Hemminger #define BNX2X_NOMCP(sc) (sc->flags & BNX2X_NO_MCP_FLAG)
1036540a2110SStephen Hemminger
1037540a2110SStephen Hemminger #define MAX_BARS 5
1038540a2110SStephen Hemminger struct bnx2x_bar bar[MAX_BARS]; /* map BARs 0, 2, 4 */
1039540a2110SStephen Hemminger
1040540a2110SStephen Hemminger uint16_t doorbell_size;
1041540a2110SStephen Hemminger
1042540a2110SStephen Hemminger /* periodic timer callout */
1043540a2110SStephen Hemminger #define PERIODIC_STOP 0
1044540a2110SStephen Hemminger #define PERIODIC_GO 1
1045540a2110SStephen Hemminger volatile unsigned long periodic_flags;
10468bd31421SShahed Shaikh rte_atomic32_t scan_fp;
1047540a2110SStephen Hemminger struct bnx2x_fastpath fp[MAX_RSS_CHAINS];
1048540a2110SStephen Hemminger struct bnx2x_sp_objs sp_objs[MAX_RSS_CHAINS];
1049540a2110SStephen Hemminger
1050540a2110SStephen Hemminger uint8_t unit; /* driver instance number */
1051540a2110SStephen Hemminger
1052540a2110SStephen Hemminger int pcie_bus; /* PCIe bus number */
1053540a2110SStephen Hemminger int pcie_device; /* PCIe device/slot number */
1054540a2110SStephen Hemminger int pcie_func; /* PCIe function number */
1055540a2110SStephen Hemminger
1056540a2110SStephen Hemminger uint8_t pfunc_rel; /* function relative */
1057540a2110SStephen Hemminger uint8_t pfunc_abs; /* function absolute */
1058540a2110SStephen Hemminger uint8_t path_id; /* function absolute */
1059540a2110SStephen Hemminger #define SC_PATH(sc) (sc->path_id)
1060540a2110SStephen Hemminger #define SC_PORT(sc) (sc->pfunc_rel & 1)
1061540a2110SStephen Hemminger #define SC_FUNC(sc) (sc->pfunc_rel)
1062540a2110SStephen Hemminger #define SC_ABS_FUNC(sc) (sc->pfunc_abs)
1063540a2110SStephen Hemminger #define SC_VN(sc) (sc->pfunc_rel >> 1)
1064540a2110SStephen Hemminger #define SC_L_ID(sc) (SC_VN(sc) << 2)
1065540a2110SStephen Hemminger #define PORT_ID(sc) SC_PORT(sc)
1066540a2110SStephen Hemminger #define PATH_ID(sc) SC_PATH(sc)
1067540a2110SStephen Hemminger #define VNIC_ID(sc) SC_VN(sc)
1068540a2110SStephen Hemminger #define FUNC_ID(sc) SC_FUNC(sc)
1069540a2110SStephen Hemminger #define ABS_FUNC_ID(sc) SC_ABS_FUNC(sc)
1070540a2110SStephen Hemminger #define SC_FW_MB_IDX_VN(sc, vn) \
1071540a2110SStephen Hemminger (SC_PORT(sc) + (vn) * \
1072540a2110SStephen Hemminger ((CHIP_IS_E1x(sc) || (CHIP_IS_MODE_4_PORT(sc))) ? 2 : 1))
1073540a2110SStephen Hemminger #define SC_FW_MB_IDX(sc) SC_FW_MB_IDX_VN(sc, SC_VN(sc))
1074540a2110SStephen Hemminger
1075540a2110SStephen Hemminger int if_capen; /* enabled interface capabilities */
1076540a2110SStephen Hemminger
1077540a2110SStephen Hemminger struct bnx2x_devinfo devinfo;
1078540a2110SStephen Hemminger char fw_ver_str[32];
1079540a2110SStephen Hemminger char mf_mode_str[32];
1080540a2110SStephen Hemminger char pci_link_str[32];
1081540a2110SStephen Hemminger
1082540a2110SStephen Hemminger struct iro *iro_array;
1083540a2110SStephen Hemminger
1084540a2110SStephen Hemminger int dmae_ready;
1085540a2110SStephen Hemminger #define DMAE_READY(sc) (sc->dmae_ready)
1086540a2110SStephen Hemminger
1087540a2110SStephen Hemminger struct ecore_credit_pool_obj vlans_pool;
1088540a2110SStephen Hemminger struct ecore_credit_pool_obj macs_pool;
1089540a2110SStephen Hemminger struct ecore_rx_mode_obj rx_mode_obj;
1090540a2110SStephen Hemminger struct ecore_mcast_obj mcast_obj;
1091540a2110SStephen Hemminger struct ecore_rss_config_obj rss_conf_obj;
1092540a2110SStephen Hemminger struct ecore_func_sp_obj func_obj;
1093540a2110SStephen Hemminger
1094540a2110SStephen Hemminger uint16_t fw_seq;
1095540a2110SStephen Hemminger uint16_t fw_drv_pulse_wr_seq;
1096540a2110SStephen Hemminger uint32_t func_stx;
1097540a2110SStephen Hemminger
1098540a2110SStephen Hemminger struct elink_params link_params;
1099540a2110SStephen Hemminger struct elink_vars link_vars;
1100540a2110SStephen Hemminger uint32_t link_cnt;
1101540a2110SStephen Hemminger struct bnx2x_link_report_data last_reported_link;
1102540a2110SStephen Hemminger char mac_addr_str[32];
1103540a2110SStephen Hemminger
1104540a2110SStephen Hemminger uint32_t tx_ring_size;
1105540a2110SStephen Hemminger uint32_t rx_ring_size;
1106540a2110SStephen Hemminger int wol;
1107540a2110SStephen Hemminger
1108540a2110SStephen Hemminger int is_leader;
1109540a2110SStephen Hemminger int recovery_state;
1110540a2110SStephen Hemminger #define BNX2X_RECOVERY_DONE 1
1111540a2110SStephen Hemminger #define BNX2X_RECOVERY_INIT 2
1112540a2110SStephen Hemminger #define BNX2X_RECOVERY_WAIT 3
1113540a2110SStephen Hemminger #define BNX2X_RECOVERY_FAILED 4
1114540a2110SStephen Hemminger #define BNX2X_RECOVERY_NIC_LOADING 5
1115540a2110SStephen Hemminger
1116540a2110SStephen Hemminger uint32_t rx_mode;
1117540a2110SStephen Hemminger #define BNX2X_RX_MODE_NONE 0
1118540a2110SStephen Hemminger #define BNX2X_RX_MODE_NORMAL 1
1119540a2110SStephen Hemminger #define BNX2X_RX_MODE_ALLMULTI 2
112025ffc789SRasesh Mody #define BNX2X_RX_MODE_ALLMULTI_PROMISC 3
112125ffc789SRasesh Mody #define BNX2X_RX_MODE_PROMISC 4
1122540a2110SStephen Hemminger #define BNX2X_MAX_MULTICAST 64
1123540a2110SStephen Hemminger
1124540a2110SStephen Hemminger struct bnx2x_port port;
1125540a2110SStephen Hemminger
1126540a2110SStephen Hemminger struct cmng_init cmng;
1127540a2110SStephen Hemminger
1128540a2110SStephen Hemminger /* user configs */
1129540a2110SStephen Hemminger uint8_t num_queues;
1130540a2110SStephen Hemminger int hc_rx_ticks;
1131540a2110SStephen Hemminger int hc_tx_ticks;
1132540a2110SStephen Hemminger uint32_t rx_budget;
1133540a2110SStephen Hemminger int interrupt_mode;
1134540a2110SStephen Hemminger #define INTR_MODE_INTX 0
1135540a2110SStephen Hemminger #define INTR_MODE_MSI 1
1136540a2110SStephen Hemminger #define INTR_MODE_MSIX 2
1137540a2110SStephen Hemminger #define INTR_MODE_SINGLE_MSIX 3
1138540a2110SStephen Hemminger int udp_rss;
1139540a2110SStephen Hemminger
1140540a2110SStephen Hemminger uint8_t igu_dsb_id;
1141540a2110SStephen Hemminger uint8_t igu_base_sb;
1142540a2110SStephen Hemminger uint8_t igu_sb_cnt;
1143540a2110SStephen Hemminger uint32_t igu_base_addr;
1144540a2110SStephen Hemminger uint8_t base_fw_ndsb;
1145540a2110SStephen Hemminger #define DEF_SB_IGU_ID 16
1146540a2110SStephen Hemminger #define DEF_SB_ID HC_SP_SB_ID
1147540a2110SStephen Hemminger
1148540a2110SStephen Hemminger /* default status block */
1149540a2110SStephen Hemminger struct bnx2x_dma def_sb_dma;
1150540a2110SStephen Hemminger struct host_sp_status_block *def_sb;
1151540a2110SStephen Hemminger uint16_t def_idx;
1152540a2110SStephen Hemminger uint16_t def_att_idx;
1153540a2110SStephen Hemminger uint32_t attn_state;
1154540a2110SStephen Hemminger struct attn_route attn_group[MAX_DYNAMIC_ATTN_GRPS];
1155540a2110SStephen Hemminger
1156540a2110SStephen Hemminger /* general SP events - stats query, cfc delete, etc */
1157540a2110SStephen Hemminger #define HC_SP_INDEX_ETH_DEF_CONS 3
1158540a2110SStephen Hemminger /* EQ completions */
1159540a2110SStephen Hemminger #define HC_SP_INDEX_EQ_CONS 7
1160540a2110SStephen Hemminger /* FCoE L2 connection completions */
1161540a2110SStephen Hemminger #define HC_SP_INDEX_ETH_FCOE_TX_CQ_CONS 6
1162540a2110SStephen Hemminger #define HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS 4
1163540a2110SStephen Hemminger /* iSCSI L2 */
1164540a2110SStephen Hemminger #define HC_SP_INDEX_ETH_ISCSI_CQ_CONS 5
1165540a2110SStephen Hemminger #define HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS 1
1166540a2110SStephen Hemminger
1167540a2110SStephen Hemminger /* event queue */
1168540a2110SStephen Hemminger struct bnx2x_dma eq_dma;
1169540a2110SStephen Hemminger union event_ring_elem *eq;
1170540a2110SStephen Hemminger uint16_t eq_prod;
1171540a2110SStephen Hemminger uint16_t eq_cons;
1172540a2110SStephen Hemminger uint16_t *eq_cons_sb;
1173540a2110SStephen Hemminger #define NUM_EQ_PAGES 1 /* must be a power of 2 */
1174540a2110SStephen Hemminger #define EQ_DESC_CNT_PAGE (BNX2X_PAGE_SIZE / sizeof(union event_ring_elem))
1175540a2110SStephen Hemminger #define EQ_DESC_MAX_PAGE (EQ_DESC_CNT_PAGE - 1)
1176540a2110SStephen Hemminger #define NUM_EQ_DESC (EQ_DESC_CNT_PAGE * NUM_EQ_PAGES)
1177540a2110SStephen Hemminger #define EQ_DESC_MASK (NUM_EQ_DESC - 1)
1178540a2110SStephen Hemminger #define MAX_EQ_AVAIL (EQ_DESC_MAX_PAGE * NUM_EQ_PAGES - 2)
1179540a2110SStephen Hemminger /* depends on EQ_DESC_CNT_PAGE being a power of 2 */
1180540a2110SStephen Hemminger #define NEXT_EQ_IDX(x) \
1181540a2110SStephen Hemminger ((((x) & EQ_DESC_MAX_PAGE) == (EQ_DESC_MAX_PAGE - 1)) ? \
1182540a2110SStephen Hemminger ((x) + 2) : ((x) + 1))
1183540a2110SStephen Hemminger /* depends on the above and on NUM_EQ_PAGES being a power of 2 */
1184540a2110SStephen Hemminger #define EQ_DESC(x) ((x) & EQ_DESC_MASK)
1185540a2110SStephen Hemminger
1186540a2110SStephen Hemminger /* slow path */
1187540a2110SStephen Hemminger struct bnx2x_dma sp_dma;
1188540a2110SStephen Hemminger struct bnx2x_slowpath *sp;
1189de6eab7cSJoyce Kong uint32_t sp_state;
1190540a2110SStephen Hemminger
1191540a2110SStephen Hemminger /* slow path queue */
1192540a2110SStephen Hemminger struct bnx2x_dma spq_dma;
1193540a2110SStephen Hemminger struct eth_spe *spq;
1194540a2110SStephen Hemminger #define SP_DESC_CNT (BNX2X_PAGE_SIZE / sizeof(struct eth_spe))
1195540a2110SStephen Hemminger #define MAX_SP_DESC_CNT (SP_DESC_CNT - 1)
1196540a2110SStephen Hemminger #define MAX_SPQ_PENDING 8
1197540a2110SStephen Hemminger
1198540a2110SStephen Hemminger uint16_t spq_prod_idx;
1199540a2110SStephen Hemminger struct eth_spe *spq_prod_bd;
1200540a2110SStephen Hemminger struct eth_spe *spq_last_bd;
1201540a2110SStephen Hemminger uint16_t *dsb_sp_prod;
1202540a2110SStephen Hemminger
1203540a2110SStephen Hemminger volatile unsigned long eq_spq_left; /* COMMON_xxx ramrod credit */
1204540a2110SStephen Hemminger volatile unsigned long cq_spq_left; /* ETH_xxx ramrod credit */
1205540a2110SStephen Hemminger
1206540a2110SStephen Hemminger /* fw decompression buffer */
1207540a2110SStephen Hemminger struct bnx2x_dma gz_buf_dma;
1208540a2110SStephen Hemminger void *gz_buf;
1209540a2110SStephen Hemminger uint32_t gz_outlen;
1210540a2110SStephen Hemminger #define GUNZIP_BUF(sc) (sc->gz_buf)
1211540a2110SStephen Hemminger #define GUNZIP_OUTLEN(sc) (sc->gz_outlen)
1212df6e0a06SSantosh Shukla #define GUNZIP_PHYS(sc) (rte_iova_t)(sc->gz_buf_dma.paddr)
1213540a2110SStephen Hemminger #define FW_BUF_SIZE 0x40000
1214540a2110SStephen Hemminger
1215540a2110SStephen Hemminger struct raw_op *init_ops;
1216540a2110SStephen Hemminger uint16_t *init_ops_offsets; /* init block offsets inside init_ops */
1217540a2110SStephen Hemminger uint32_t *init_data; /* data blob, 32 bit granularity */
1218540a2110SStephen Hemminger uint32_t init_mode_flags;
1219540a2110SStephen Hemminger #define INIT_MODE_FLAGS(sc) (sc->init_mode_flags)
1220540a2110SStephen Hemminger /* PRAM blobs - raw data */
1221540a2110SStephen Hemminger const uint8_t *tsem_int_table_data;
1222540a2110SStephen Hemminger const uint8_t *tsem_pram_data;
1223540a2110SStephen Hemminger const uint8_t *usem_int_table_data;
1224540a2110SStephen Hemminger const uint8_t *usem_pram_data;
1225540a2110SStephen Hemminger const uint8_t *xsem_int_table_data;
1226540a2110SStephen Hemminger const uint8_t *xsem_pram_data;
1227540a2110SStephen Hemminger const uint8_t *csem_int_table_data;
1228540a2110SStephen Hemminger const uint8_t *csem_pram_data;
1229540a2110SStephen Hemminger #define INIT_OPS(sc) (sc->init_ops)
1230540a2110SStephen Hemminger #define INIT_OPS_OFFSETS(sc) (sc->init_ops_offsets)
1231540a2110SStephen Hemminger #define INIT_DATA(sc) (sc->init_data)
1232540a2110SStephen Hemminger #define INIT_TSEM_INT_TABLE_DATA(sc) (sc->tsem_int_table_data)
1233540a2110SStephen Hemminger #define INIT_TSEM_PRAM_DATA(sc) (sc->tsem_pram_data)
1234540a2110SStephen Hemminger #define INIT_USEM_INT_TABLE_DATA(sc) (sc->usem_int_table_data)
1235540a2110SStephen Hemminger #define INIT_USEM_PRAM_DATA(sc) (sc->usem_pram_data)
1236540a2110SStephen Hemminger #define INIT_XSEM_INT_TABLE_DATA(sc) (sc->xsem_int_table_data)
1237540a2110SStephen Hemminger #define INIT_XSEM_PRAM_DATA(sc) (sc->xsem_pram_data)
1238540a2110SStephen Hemminger #define INIT_CSEM_INT_TABLE_DATA(sc) (sc->csem_int_table_data)
1239540a2110SStephen Hemminger #define INIT_CSEM_PRAM_DATA(sc) (sc->csem_pram_data)
1240540a2110SStephen Hemminger
1241540a2110SStephen Hemminger #define PHY_FW_VER_LEN 20
1242540a2110SStephen Hemminger char fw_ver[32];
1243540a2110SStephen Hemminger
1244540a2110SStephen Hemminger /* ILT
1245540a2110SStephen Hemminger * For max 196 cids (64*3 + non-eth), 32KB ILT page size and 1KB
1246540a2110SStephen Hemminger * context size we need 8 ILT entries.
1247540a2110SStephen Hemminger */
1248540a2110SStephen Hemminger #define ILT_MAX_L2_LINES 8
1249540a2110SStephen Hemminger struct hw_context context[ILT_MAX_L2_LINES];
1250540a2110SStephen Hemminger struct ecore_ilt *ilt;
1251540a2110SStephen Hemminger #define ILT_MAX_LINES 256
1252540a2110SStephen Hemminger
1253540a2110SStephen Hemminger /* max supported number of RSS queues: IGU SBs minus one for CNIC */
1254540a2110SStephen Hemminger #define BNX2X_MAX_RSS_COUNT(sc) ((sc)->igu_sb_cnt - CNIC_SUPPORT(sc))
1255540a2110SStephen Hemminger /* max CID count: Max RSS * Max_Tx_Multi_Cos + FCoE + iSCSI */
1256540a2110SStephen Hemminger #define BNX2X_L2_MAX_CID(sc) \
1257540a2110SStephen Hemminger (BNX2X_MAX_RSS_COUNT(sc) * ECORE_MULTI_TX_COS + 2 * CNIC_SUPPORT(sc))
1258540a2110SStephen Hemminger #define BNX2X_L2_CID_COUNT(sc) \
1259540a2110SStephen Hemminger (BNX2X_NUM_ETH_QUEUES(sc) * ECORE_MULTI_TX_COS + 2 * CNIC_SUPPORT(sc))
1260540a2110SStephen Hemminger #define L2_ILT_LINES(sc) \
1261540a2110SStephen Hemminger (DIV_ROUND_UP(BNX2X_L2_CID_COUNT(sc), ILT_PAGE_CIDS))
1262540a2110SStephen Hemminger
1263540a2110SStephen Hemminger int qm_cid_count;
1264540a2110SStephen Hemminger
1265540a2110SStephen Hemminger uint8_t dropless_fc;
1266540a2110SStephen Hemminger
1267540a2110SStephen Hemminger /* total number of FW statistics requests */
1268540a2110SStephen Hemminger uint8_t fw_stats_num;
1269540a2110SStephen Hemminger /*
1270540a2110SStephen Hemminger * This is a memory buffer that will contain both statistics ramrod
1271540a2110SStephen Hemminger * request and data.
1272540a2110SStephen Hemminger */
1273540a2110SStephen Hemminger struct bnx2x_dma fw_stats_dma;
1274540a2110SStephen Hemminger /*
1275540a2110SStephen Hemminger * FW statistics request shortcut (points at the beginning of fw_stats
1276540a2110SStephen Hemminger * buffer).
1277540a2110SStephen Hemminger */
1278540a2110SStephen Hemminger int fw_stats_req_size;
1279540a2110SStephen Hemminger struct bnx2x_fw_stats_req *fw_stats_req;
1280df6e0a06SSantosh Shukla rte_iova_t fw_stats_req_mapping;
1281540a2110SStephen Hemminger /*
1282540a2110SStephen Hemminger * FW statistics data shortcut (points at the beginning of fw_stats
1283540a2110SStephen Hemminger * buffer + fw_stats_req_size).
1284540a2110SStephen Hemminger */
1285540a2110SStephen Hemminger int fw_stats_data_size;
1286540a2110SStephen Hemminger struct bnx2x_fw_stats_data *fw_stats_data;
1287df6e0a06SSantosh Shukla rte_iova_t fw_stats_data_mapping;
1288540a2110SStephen Hemminger
1289540a2110SStephen Hemminger /* tracking a pending STAT_QUERY ramrod */
1290540a2110SStephen Hemminger uint16_t stats_pending;
1291540a2110SStephen Hemminger /* number of completed statistics ramrods */
1292540a2110SStephen Hemminger uint16_t stats_comp;
1293540a2110SStephen Hemminger uint16_t stats_counter;
1294540a2110SStephen Hemminger uint8_t stats_init;
1295540a2110SStephen Hemminger int stats_state;
1296540a2110SStephen Hemminger
1297540a2110SStephen Hemminger struct bnx2x_eth_stats eth_stats;
1298540a2110SStephen Hemminger struct host_func_stats func_stats;
1299540a2110SStephen Hemminger struct bnx2x_eth_stats_old eth_stats_old;
1300540a2110SStephen Hemminger struct bnx2x_net_stats_old net_stats_old;
1301540a2110SStephen Hemminger struct bnx2x_fw_port_stats_old fw_stats_old;
1302540a2110SStephen Hemminger
1303540a2110SStephen Hemminger struct dmae_command stats_dmae; /* used by dmae command loader */
1304540a2110SStephen Hemminger int executer_idx;
1305540a2110SStephen Hemminger
1306540a2110SStephen Hemminger int mtu;
1307540a2110SStephen Hemminger
1308540a2110SStephen Hemminger /* DCB support on/off */
1309540a2110SStephen Hemminger int dcb_state;
1310540a2110SStephen Hemminger #define BNX2X_DCB_STATE_OFF 0
1311540a2110SStephen Hemminger #define BNX2X_DCB_STATE_ON 1
1312540a2110SStephen Hemminger /* DCBX engine mode */
1313540a2110SStephen Hemminger int dcbx_enabled;
1314540a2110SStephen Hemminger #define BNX2X_DCBX_ENABLED_OFF 0
1315540a2110SStephen Hemminger #define BNX2X_DCBX_ENABLED_ON_NEG_OFF 1
1316540a2110SStephen Hemminger #define BNX2X_DCBX_ENABLED_ON_NEG_ON 2
1317540a2110SStephen Hemminger #define BNX2X_DCBX_ENABLED_INVALID -1
1318540a2110SStephen Hemminger
1319540a2110SStephen Hemminger uint8_t cnic_support;
1320540a2110SStephen Hemminger uint8_t cnic_enabled;
1321540a2110SStephen Hemminger uint8_t cnic_loaded;
1322540a2110SStephen Hemminger #define CNIC_SUPPORT(sc) 0 /* ((sc)->cnic_support) */
1323540a2110SStephen Hemminger #define CNIC_ENABLED(sc) 0 /* ((sc)->cnic_enabled) */
1324540a2110SStephen Hemminger #define CNIC_LOADED(sc) 0 /* ((sc)->cnic_loaded) */
1325540a2110SStephen Hemminger
1326540a2110SStephen Hemminger /* multiple tx classes of service */
1327540a2110SStephen Hemminger uint8_t max_cos;
1328540a2110SStephen Hemminger #define BNX2X_MAX_PRIORITY 8
1329540a2110SStephen Hemminger /* priority to cos mapping */
1330540a2110SStephen Hemminger uint8_t prio_to_cos[BNX2X_MAX_PRIORITY];
1331540a2110SStephen Hemminger
1332540a2110SStephen Hemminger int panic;
13330d2870c4SSouvik Dey /* Array of Multicast addrs */
13340d2870c4SSouvik Dey struct rte_ether_addr mc_addrs[VF_MAX_MULTICAST_PER_VF];
13350d2870c4SSouvik Dey /* Multicast mac addresses number */
13360d2870c4SSouvik Dey uint16_t mc_addrs_num;
1337540a2110SStephen Hemminger }; /* struct bnx2x_softc */
1338540a2110SStephen Hemminger
1339540a2110SStephen Hemminger /* IOCTL sub-commands for edebug and firmware upgrade */
1340540a2110SStephen Hemminger #define BNX2X_IOC_RD_NVRAM 1
1341540a2110SStephen Hemminger #define BNX2X_IOC_WR_NVRAM 2
1342540a2110SStephen Hemminger #define BNX2X_IOC_STATS_SHOW_NUM 3
1343540a2110SStephen Hemminger #define BNX2X_IOC_STATS_SHOW_STR 4
1344540a2110SStephen Hemminger #define BNX2X_IOC_STATS_SHOW_CNT 5
1345540a2110SStephen Hemminger
1346540a2110SStephen Hemminger struct bnx2x_nvram_data {
1347540a2110SStephen Hemminger uint32_t op; /* ioctl sub-command */
1348540a2110SStephen Hemminger uint32_t offset;
1349540a2110SStephen Hemminger uint32_t len;
1350540a2110SStephen Hemminger uint32_t value[1]; /* variable */
1351540a2110SStephen Hemminger };
1352540a2110SStephen Hemminger
1353540a2110SStephen Hemminger union bnx2x_stats_show_data {
1354540a2110SStephen Hemminger uint32_t op; /* ioctl sub-command */
1355540a2110SStephen Hemminger
1356540a2110SStephen Hemminger struct {
1357540a2110SStephen Hemminger uint32_t num; /* return number of stats */
1358540a2110SStephen Hemminger uint32_t len; /* length of each string item */
1359540a2110SStephen Hemminger } desc;
1360540a2110SStephen Hemminger
1361540a2110SStephen Hemminger /* variable length... */
1362540a2110SStephen Hemminger char str[1]; /* holds names of desc.num stats, each desc.len in length */
1363540a2110SStephen Hemminger
1364540a2110SStephen Hemminger /* variable length... */
1365540a2110SStephen Hemminger uint64_t stats[1]; /* holds all stats */
1366540a2110SStephen Hemminger };
1367540a2110SStephen Hemminger
1368540a2110SStephen Hemminger /* function init flags */
1369540a2110SStephen Hemminger #define FUNC_FLG_RSS 0x0001
1370540a2110SStephen Hemminger #define FUNC_FLG_STATS 0x0002
1371540a2110SStephen Hemminger /* FUNC_FLG_UNMATCHED 0x0004 */
1372540a2110SStephen Hemminger #define FUNC_FLG_SPQ 0x0010
1373540a2110SStephen Hemminger #define FUNC_FLG_LEADING 0x0020 /* PF only */
1374540a2110SStephen Hemminger
1375540a2110SStephen Hemminger struct bnx2x_func_init_params {
1376df6e0a06SSantosh Shukla rte_iova_t fw_stat_map; /* (dma) valid if FUNC_FLG_STATS */
1377df6e0a06SSantosh Shukla rte_iova_t spq_map; /* (dma) valid if FUNC_FLG_SPQ */
1378540a2110SStephen Hemminger uint16_t func_flgs;
1379540a2110SStephen Hemminger uint16_t func_id; /* abs function id */
1380540a2110SStephen Hemminger uint16_t pf_id;
1381540a2110SStephen Hemminger uint16_t spq_prod; /* valid if FUNC_FLG_SPQ */
1382540a2110SStephen Hemminger };
1383540a2110SStephen Hemminger
1384540a2110SStephen Hemminger /* memory resources reside at BARs 0, 2, 4 */
1385540a2110SStephen Hemminger /* Run `pciconf -lb` to see mappings */
1386540a2110SStephen Hemminger #define BAR0 0
1387540a2110SStephen Hemminger #define BAR1 2
1388540a2110SStephen Hemminger #define BAR2 4
1389540a2110SStephen Hemminger
1390dc687592SChas Williams static inline void
bnx2x_reg_write8(struct bnx2x_softc * sc,size_t offset,uint8_t val)1391dc687592SChas Williams bnx2x_reg_write8(struct bnx2x_softc *sc, size_t offset, uint8_t val)
1392dc687592SChas Williams {
1393ba7eeb03SRasesh Mody PMD_DEBUG_PERIODIC_LOG(DEBUG, sc, "offset=0x%08lx val=0x%02x",
1394dc687592SChas Williams (unsigned long)offset, val);
1395458a4a7aSSantosh Shukla rte_write8(val, ((uint8_t *)sc->bar[BAR0].base_addr + offset));
1396dc687592SChas Williams }
1397dc687592SChas Williams
1398dc687592SChas Williams static inline void
bnx2x_reg_write16(struct bnx2x_softc * sc,size_t offset,uint16_t val)1399dc687592SChas Williams bnx2x_reg_write16(struct bnx2x_softc *sc, size_t offset, uint16_t val)
1400dc687592SChas Williams {
14018dc08a09SHarish Patil #ifdef RTE_LIBRTE_BNX2X_DEBUG_PERIODIC
1402dc687592SChas Williams if ((offset % 2) != 0)
1403ba7eeb03SRasesh Mody PMD_DRV_LOG(NOTICE, sc, "Unaligned 16-bit write to 0x%08lx",
1404dc687592SChas Williams (unsigned long)offset);
1405540a2110SStephen Hemminger #endif
1406ba7eeb03SRasesh Mody PMD_DEBUG_PERIODIC_LOG(DEBUG, sc, "offset=0x%08lx val=0x%04x",
1407dc687592SChas Williams (unsigned long)offset, val);
1408458a4a7aSSantosh Shukla rte_write16(val, ((uint8_t *)sc->bar[BAR0].base_addr + offset));
1409458a4a7aSSantosh Shukla
1410dc687592SChas Williams }
1411dc687592SChas Williams
1412dc687592SChas Williams static inline void
bnx2x_reg_write32(struct bnx2x_softc * sc,size_t offset,uint32_t val)1413dc687592SChas Williams bnx2x_reg_write32(struct bnx2x_softc *sc, size_t offset, uint32_t val)
1414dc687592SChas Williams {
1415dc687592SChas Williams #ifdef RTE_LIBRTE_BNX2X_DEBUG_PERIODIC
1416dc687592SChas Williams if ((offset % 4) != 0)
1417ba7eeb03SRasesh Mody PMD_DRV_LOG(NOTICE, sc, "Unaligned 32-bit write to 0x%08lx",
1418dc687592SChas Williams (unsigned long)offset);
1419dc687592SChas Williams #endif
1420dc687592SChas Williams
1421ba7eeb03SRasesh Mody PMD_DEBUG_PERIODIC_LOG(DEBUG, sc, "offset=0x%08lx val=0x%08x",
1422dc687592SChas Williams (unsigned long)offset, val);
1423458a4a7aSSantosh Shukla rte_write32(val, ((uint8_t *)sc->bar[BAR0].base_addr + offset));
1424dc687592SChas Williams }
1425dc687592SChas Williams
1426dc687592SChas Williams static inline uint8_t
bnx2x_reg_read8(struct bnx2x_softc * sc,size_t offset)1427dc687592SChas Williams bnx2x_reg_read8(struct bnx2x_softc *sc, size_t offset)
1428dc687592SChas Williams {
1429dc687592SChas Williams uint8_t val;
1430dc687592SChas Williams
1431458a4a7aSSantosh Shukla val = rte_read8((uint8_t *)sc->bar[BAR0].base_addr + offset);
1432ba7eeb03SRasesh Mody PMD_DEBUG_PERIODIC_LOG(DEBUG, sc, "offset=0x%08lx val=0x%02x",
1433dc687592SChas Williams (unsigned long)offset, val);
1434dc687592SChas Williams
1435dc687592SChas Williams return val;
1436dc687592SChas Williams }
1437dc687592SChas Williams
1438dc687592SChas Williams static inline uint16_t
bnx2x_reg_read16(struct bnx2x_softc * sc,size_t offset)1439dc687592SChas Williams bnx2x_reg_read16(struct bnx2x_softc *sc, size_t offset)
1440dc687592SChas Williams {
1441dc687592SChas Williams uint16_t val;
1442dc687592SChas Williams
1443dc687592SChas Williams #ifdef RTE_LIBRTE_BNX2X_DEBUG_PERIODIC
1444dc687592SChas Williams if ((offset % 2) != 0)
1445ba7eeb03SRasesh Mody PMD_DRV_LOG(NOTICE, sc, "Unaligned 16-bit read from 0x%08lx",
1446dc687592SChas Williams (unsigned long)offset);
1447dc687592SChas Williams #endif
1448dc687592SChas Williams
1449458a4a7aSSantosh Shukla val = rte_read16(((uint8_t *)sc->bar[BAR0].base_addr + offset));
1450ba7eeb03SRasesh Mody PMD_DEBUG_PERIODIC_LOG(DEBUG, sc, "offset=0x%08lx val=0x%08x",
1451dc687592SChas Williams (unsigned long)offset, val);
1452dc687592SChas Williams
1453dc687592SChas Williams return val;
1454dc687592SChas Williams }
1455dc687592SChas Williams
1456dc687592SChas Williams static inline uint32_t
bnx2x_reg_read32(struct bnx2x_softc * sc,size_t offset)1457dc687592SChas Williams bnx2x_reg_read32(struct bnx2x_softc *sc, size_t offset)
1458dc687592SChas Williams {
1459dc687592SChas Williams uint32_t val;
1460dc687592SChas Williams
1461dc687592SChas Williams #ifdef RTE_LIBRTE_BNX2X_DEBUG_PERIODIC
1462dc687592SChas Williams if ((offset % 4) != 0)
1463ba7eeb03SRasesh Mody PMD_DRV_LOG(NOTICE, sc, "Unaligned 32-bit read from 0x%08lx",
1464dc687592SChas Williams (unsigned long)offset);
1465dc687592SChas Williams #endif
1466dc687592SChas Williams
1467458a4a7aSSantosh Shukla val = rte_read32(((uint8_t *)sc->bar[BAR0].base_addr + offset));
1468ba7eeb03SRasesh Mody PMD_DEBUG_PERIODIC_LOG(DEBUG, sc, "offset=0x%08lx val=0x%08x",
1469dc687592SChas Williams (unsigned long)offset, val);
1470dc687592SChas Williams
1471dc687592SChas Williams return val;
1472dc687592SChas Williams }
1473540a2110SStephen Hemminger
1474540a2110SStephen Hemminger #define REG_ADDR(sc, offset) (((uint64_t)sc->bar[BAR0].base_addr) + (offset))
1475540a2110SStephen Hemminger
1476540a2110SStephen Hemminger #define REG_RD8(sc, offset) bnx2x_reg_read8(sc, (offset))
1477540a2110SStephen Hemminger #define REG_RD16(sc, offset) bnx2x_reg_read16(sc, (offset))
1478540a2110SStephen Hemminger #define REG_RD32(sc, offset) bnx2x_reg_read32(sc, (offset))
1479540a2110SStephen Hemminger
1480540a2110SStephen Hemminger #define REG_WR8(sc, offset, val) bnx2x_reg_write8(sc, (offset), val)
1481540a2110SStephen Hemminger #define REG_WR16(sc, offset, val) bnx2x_reg_write16(sc, (offset), val)
1482540a2110SStephen Hemminger #define REG_WR32(sc, offset, val) bnx2x_reg_write32(sc, (offset), val)
1483540a2110SStephen Hemminger
1484540a2110SStephen Hemminger #define REG_RD(sc, offset) REG_RD32(sc, offset)
1485540a2110SStephen Hemminger #define REG_WR(sc, offset, val) REG_WR32(sc, offset, val)
1486540a2110SStephen Hemminger
1487540a2110SStephen Hemminger #define BNX2X_SP(sc, var) (&(sc)->sp->var)
1488540a2110SStephen Hemminger #define BNX2X_SP_MAPPING(sc, var) \
1489540a2110SStephen Hemminger (sc->sp_dma.paddr + offsetof(struct bnx2x_slowpath, var))
1490540a2110SStephen Hemminger
1491540a2110SStephen Hemminger #define BNX2X_FP(sc, nr, var) ((sc)->fp[(nr)].var)
1492540a2110SStephen Hemminger #define BNX2X_SP_OBJ(sc, fp) ((sc)->sp_objs[(fp)->index])
1493540a2110SStephen Hemminger
1494540a2110SStephen Hemminger #define bnx2x_fp(sc, nr, var) ((sc)->fp[nr].var)
1495540a2110SStephen Hemminger
1496540a2110SStephen Hemminger #define REG_RD_DMAE(sc, offset, valp, len32) \
1497540a2110SStephen Hemminger do { \
1498540a2110SStephen Hemminger (void)bnx2x_read_dmae(sc, offset, len32); \
1499ea859a45SStephen Hemminger rte_memcpy(valp, BNX2X_SP(sc, wb_data[0]), (len32) * 4); \
1500540a2110SStephen Hemminger } while (0)
1501540a2110SStephen Hemminger
1502540a2110SStephen Hemminger #define REG_WR_DMAE(sc, offset, valp, len32) \
1503540a2110SStephen Hemminger do { \
1504ea859a45SStephen Hemminger rte_memcpy(BNX2X_SP(sc, wb_data[0]), valp, (len32) * 4); \
1505540a2110SStephen Hemminger (void)bnx2x_write_dmae(sc, BNX2X_SP_MAPPING(sc, wb_data), offset, len32); \
1506540a2110SStephen Hemminger } while (0)
1507540a2110SStephen Hemminger
1508540a2110SStephen Hemminger #define REG_WR_DMAE_LEN(sc, offset, valp, len32) \
1509540a2110SStephen Hemminger REG_WR_DMAE(sc, offset, valp, len32)
1510540a2110SStephen Hemminger
1511540a2110SStephen Hemminger #define REG_RD_DMAE_LEN(sc, offset, valp, len32) \
1512540a2110SStephen Hemminger REG_RD_DMAE(sc, offset, valp, len32)
1513540a2110SStephen Hemminger
1514540a2110SStephen Hemminger #define VIRT_WR_DMAE_LEN(sc, data, addr, len32, le32_swap) \
1515540a2110SStephen Hemminger do { \
1516540a2110SStephen Hemminger /* if (le32_swap) { */ \
1517540a2110SStephen Hemminger /* PMD_PWARN_LOG(sc, "VIRT_WR_DMAE_LEN with le32_swap=1"); */ \
1518540a2110SStephen Hemminger /* } */ \
1519540a2110SStephen Hemminger rte_memcpy(GUNZIP_BUF(sc), data, len32 * 4); \
1520540a2110SStephen Hemminger ecore_write_big_buf_wb(sc, addr, len32); \
1521540a2110SStephen Hemminger } while (0)
1522540a2110SStephen Hemminger
1523540a2110SStephen Hemminger #define BNX2X_DB_MIN_SHIFT 3 /* 8 bytes */
1524540a2110SStephen Hemminger #define BNX2X_DB_SHIFT 7 /* 128 bytes */
1525540a2110SStephen Hemminger #if (BNX2X_DB_SHIFT < BNX2X_DB_MIN_SHIFT)
1526540a2110SStephen Hemminger #error "Minimum DB doorbell stride is 8"
1527540a2110SStephen Hemminger #endif
1528540a2110SStephen Hemminger #define DPM_TRIGGER_TYPE 0x40
1529540a2110SStephen Hemminger
1530540a2110SStephen Hemminger /* Doorbell macro */
1531458a4a7aSSantosh Shukla #define BNX2X_DB_WRITE(db_bar, val) rte_write32_relaxed((val), (db_bar))
1532540a2110SStephen Hemminger
1533458a4a7aSSantosh Shukla #define BNX2X_DB_READ(db_bar) rte_read32_relaxed(db_bar)
1534540a2110SStephen Hemminger
1535540a2110SStephen Hemminger #define DOORBELL_ADDR(sc, offset) \
1536540a2110SStephen Hemminger (volatile uint32_t *)(((char *)(sc)->bar[BAR1].base_addr + (offset)))
1537540a2110SStephen Hemminger
1538540a2110SStephen Hemminger #define DOORBELL(sc, cid, val) \
1539540a2110SStephen Hemminger if (IS_PF(sc)) \
1540540a2110SStephen Hemminger BNX2X_DB_WRITE((DOORBELL_ADDR(sc, sc->doorbell_size * (cid) + DPM_TRIGGER_TYPE)), (val)); \
1541540a2110SStephen Hemminger else \
1542540a2110SStephen Hemminger BNX2X_DB_WRITE((DOORBELL_ADDR(sc, sc->doorbell_size * (cid))), (val)) \
1543540a2110SStephen Hemminger
1544540a2110SStephen Hemminger #define SHMEM_ADDR(sc, field) \
1545540a2110SStephen Hemminger (sc->devinfo.shmem_base + offsetof(struct shmem_region, field))
1546540a2110SStephen Hemminger #define SHMEM_RD(sc, field) REG_RD(sc, SHMEM_ADDR(sc, field))
1547540a2110SStephen Hemminger #define SHMEM_RD16(sc, field) REG_RD16(sc, SHMEM_ADDR(sc, field))
1548540a2110SStephen Hemminger #define SHMEM_WR(sc, field, val) REG_WR(sc, SHMEM_ADDR(sc, field), val)
1549540a2110SStephen Hemminger
1550540a2110SStephen Hemminger #define SHMEM2_ADDR(sc, field) \
1551540a2110SStephen Hemminger (sc->devinfo.shmem2_base + offsetof(struct shmem2_region, field))
1552540a2110SStephen Hemminger #define SHMEM2_HAS(sc, field) \
1553540a2110SStephen Hemminger (sc->devinfo.shmem2_base && (REG_RD(sc, SHMEM2_ADDR(sc, size)) > \
1554540a2110SStephen Hemminger offsetof(struct shmem2_region, field)))
1555540a2110SStephen Hemminger #define SHMEM2_RD(sc, field) REG_RD(sc, SHMEM2_ADDR(sc, field))
1556540a2110SStephen Hemminger #define SHMEM2_WR(sc, field, val) REG_WR(sc, SHMEM2_ADDR(sc, field), val)
1557540a2110SStephen Hemminger
1558540a2110SStephen Hemminger #define MFCFG_ADDR(sc, field) \
1559540a2110SStephen Hemminger (sc->devinfo.mf_cfg_base + offsetof(struct mf_cfg, field))
1560540a2110SStephen Hemminger #define MFCFG_RD(sc, field) REG_RD(sc, MFCFG_ADDR(sc, field))
1561540a2110SStephen Hemminger #define MFCFG_RD16(sc, field) REG_RD16(sc, MFCFG_ADDR(sc, field))
1562540a2110SStephen Hemminger #define MFCFG_WR(sc, field, val) REG_WR(sc, MFCFG_ADDR(sc, field), val)
1563540a2110SStephen Hemminger
1564540a2110SStephen Hemminger /* DMAE command defines */
1565540a2110SStephen Hemminger
1566540a2110SStephen Hemminger #define DMAE_TIMEOUT -1
1567540a2110SStephen Hemminger #define DMAE_PCI_ERROR -2 /* E2 and onward */
1568540a2110SStephen Hemminger #define DMAE_NOT_RDY -3
1569540a2110SStephen Hemminger #define DMAE_PCI_ERR_FLAG 0x80000000
1570540a2110SStephen Hemminger
1571540a2110SStephen Hemminger #define DMAE_SRC_PCI 0
1572540a2110SStephen Hemminger #define DMAE_SRC_GRC 1
1573540a2110SStephen Hemminger
1574540a2110SStephen Hemminger #define DMAE_DST_NONE 0
1575540a2110SStephen Hemminger #define DMAE_DST_PCI 1
1576540a2110SStephen Hemminger #define DMAE_DST_GRC 2
1577540a2110SStephen Hemminger
1578540a2110SStephen Hemminger #define DMAE_COMP_PCI 0
1579540a2110SStephen Hemminger #define DMAE_COMP_GRC 1
1580540a2110SStephen Hemminger
1581540a2110SStephen Hemminger #define DMAE_COMP_REGULAR 0
1582540a2110SStephen Hemminger #define DMAE_COM_SET_ERR 1
1583540a2110SStephen Hemminger
1584540a2110SStephen Hemminger #define DMAE_CMD_SRC_PCI (DMAE_SRC_PCI << DMAE_COMMAND_SRC_SHIFT)
1585540a2110SStephen Hemminger #define DMAE_CMD_SRC_GRC (DMAE_SRC_GRC << DMAE_COMMAND_SRC_SHIFT)
1586540a2110SStephen Hemminger #define DMAE_CMD_DST_PCI (DMAE_DST_PCI << DMAE_COMMAND_DST_SHIFT)
1587540a2110SStephen Hemminger #define DMAE_CMD_DST_GRC (DMAE_DST_GRC << DMAE_COMMAND_DST_SHIFT)
1588540a2110SStephen Hemminger
1589540a2110SStephen Hemminger #define DMAE_CMD_C_DST_PCI (DMAE_COMP_PCI << DMAE_COMMAND_C_DST_SHIFT)
1590540a2110SStephen Hemminger #define DMAE_CMD_C_DST_GRC (DMAE_COMP_GRC << DMAE_COMMAND_C_DST_SHIFT)
1591540a2110SStephen Hemminger
1592540a2110SStephen Hemminger #define DMAE_CMD_ENDIANITY_NO_SWAP (0 << DMAE_COMMAND_ENDIANITY_SHIFT)
1593540a2110SStephen Hemminger #define DMAE_CMD_ENDIANITY_B_SWAP (1 << DMAE_COMMAND_ENDIANITY_SHIFT)
1594540a2110SStephen Hemminger #define DMAE_CMD_ENDIANITY_DW_SWAP (2 << DMAE_COMMAND_ENDIANITY_SHIFT)
1595540a2110SStephen Hemminger #define DMAE_CMD_ENDIANITY_B_DW_SWAP (3 << DMAE_COMMAND_ENDIANITY_SHIFT)
1596540a2110SStephen Hemminger
1597540a2110SStephen Hemminger #define DMAE_CMD_PORT_0 0
1598540a2110SStephen Hemminger #define DMAE_CMD_PORT_1 DMAE_COMMAND_PORT
1599540a2110SStephen Hemminger
1600540a2110SStephen Hemminger #define DMAE_SRC_PF 0
1601540a2110SStephen Hemminger #define DMAE_SRC_VF 1
1602540a2110SStephen Hemminger
1603540a2110SStephen Hemminger #define DMAE_DST_PF 0
1604540a2110SStephen Hemminger #define DMAE_DST_VF 1
1605540a2110SStephen Hemminger
1606540a2110SStephen Hemminger #define DMAE_C_SRC 0
1607540a2110SStephen Hemminger #define DMAE_C_DST 1
1608540a2110SStephen Hemminger
1609540a2110SStephen Hemminger #define DMAE_LEN32_RD_MAX 0x80
1610540a2110SStephen Hemminger #define DMAE_LEN32_WR_MAX(sc) 0x2000
1611540a2110SStephen Hemminger
1612540a2110SStephen Hemminger #define DMAE_COMP_VAL 0x60d0d0ae /* E2 and beyond, upper bit indicates error */
1613540a2110SStephen Hemminger
1614540a2110SStephen Hemminger #define MAX_DMAE_C_PER_PORT 8
1615540a2110SStephen Hemminger #define INIT_DMAE_C(sc) ((SC_PORT(sc) * MAX_DMAE_C_PER_PORT) + SC_VN(sc))
1616540a2110SStephen Hemminger #define PMF_DMAE_C(sc) ((SC_PORT(sc) * MAX_DMAE_C_PER_PORT) + E1HVN_MAX)
1617540a2110SStephen Hemminger
1618540a2110SStephen Hemminger static const uint32_t dmae_reg_go_c[] = {
1619540a2110SStephen Hemminger DMAE_REG_GO_C0, DMAE_REG_GO_C1, DMAE_REG_GO_C2, DMAE_REG_GO_C3,
1620540a2110SStephen Hemminger DMAE_REG_GO_C4, DMAE_REG_GO_C5, DMAE_REG_GO_C6, DMAE_REG_GO_C7,
1621540a2110SStephen Hemminger DMAE_REG_GO_C8, DMAE_REG_GO_C9, DMAE_REG_GO_C10, DMAE_REG_GO_C11,
1622540a2110SStephen Hemminger DMAE_REG_GO_C12, DMAE_REG_GO_C13, DMAE_REG_GO_C14, DMAE_REG_GO_C15
1623540a2110SStephen Hemminger };
1624540a2110SStephen Hemminger
1625540a2110SStephen Hemminger #define ATTN_NIG_FOR_FUNC (1L << 8)
1626540a2110SStephen Hemminger #define ATTN_SW_TIMER_4_FUNC (1L << 9)
1627540a2110SStephen Hemminger #define GPIO_2_FUNC (1L << 10)
1628540a2110SStephen Hemminger #define GPIO_3_FUNC (1L << 11)
1629540a2110SStephen Hemminger #define GPIO_4_FUNC (1L << 12)
1630540a2110SStephen Hemminger #define ATTN_GENERAL_ATTN_1 (1L << 13)
1631540a2110SStephen Hemminger #define ATTN_GENERAL_ATTN_2 (1L << 14)
1632540a2110SStephen Hemminger #define ATTN_GENERAL_ATTN_3 (1L << 15)
1633540a2110SStephen Hemminger #define ATTN_GENERAL_ATTN_4 (1L << 13)
1634540a2110SStephen Hemminger #define ATTN_GENERAL_ATTN_5 (1L << 14)
1635540a2110SStephen Hemminger #define ATTN_GENERAL_ATTN_6 (1L << 15)
1636540a2110SStephen Hemminger #define ATTN_HARD_WIRED_MASK 0xff00
1637540a2110SStephen Hemminger #define ATTENTION_ID 4
1638540a2110SStephen Hemminger
1639540a2110SStephen Hemminger #define AEU_IN_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR \
1640540a2110SStephen Hemminger AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR
1641540a2110SStephen Hemminger
1642540a2110SStephen Hemminger #define MAX_IGU_ATTN_ACK_TO 100
1643540a2110SStephen Hemminger
1644540a2110SStephen Hemminger #define STORM_ASSERT_ARRAY_SIZE 50
1645540a2110SStephen Hemminger
1646540a2110SStephen Hemminger #define BNX2X_PMF_LINK_ASSERT(sc) \
1647540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(LINK_SYNC_ATTENTION_BIT_FUNC_0 + SC_FUNC(sc))
1648540a2110SStephen Hemminger
1649540a2110SStephen Hemminger #define BNX2X_MC_ASSERT_BITS \
1650540a2110SStephen Hemminger (GENERAL_ATTEN_OFFSET(TSTORM_FATAL_ASSERT_ATTENTION_BIT) | \
1651540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(USTORM_FATAL_ASSERT_ATTENTION_BIT) | \
1652540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(CSTORM_FATAL_ASSERT_ATTENTION_BIT) | \
1653540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(XSTORM_FATAL_ASSERT_ATTENTION_BIT))
1654540a2110SStephen Hemminger
1655540a2110SStephen Hemminger #define BNX2X_MCP_ASSERT \
1656540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(MCP_FATAL_ASSERT_ATTENTION_BIT)
1657540a2110SStephen Hemminger
1658540a2110SStephen Hemminger #define BNX2X_GRC_TIMEOUT GENERAL_ATTEN_OFFSET(LATCHED_ATTN_TIMEOUT_GRC)
1659540a2110SStephen Hemminger #define BNX2X_GRC_RSV (GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCR) | \
1660540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCT) | \
1661540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCN) | \
1662540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCU) | \
1663540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCP) | \
1664540a2110SStephen Hemminger GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RSVD_GRC))
1665540a2110SStephen Hemminger
1666da62a281SRasesh Mody #define HW_INTERRUT_ASSERT_SET_0 \
1667da62a281SRasesh Mody (AEU_INPUTS_ATTN_BITS_TSDM_HW_INTERRUPT | \
1668da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TCM_HW_INTERRUPT | \
1669da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TSEMI_HW_INTERRUPT | \
1670da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_BRB_HW_INTERRUPT | \
1671da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_PBCLIENT_HW_INTERRUPT)
1672da62a281SRasesh Mody #define HW_PRTY_ASSERT_SET_0 (AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR | \
1673da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR | \
1674da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TSDM_PARITY_ERROR | \
1675da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_SEARCHER_PARITY_ERROR |\
1676da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TSEMI_PARITY_ERROR |\
1677da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TCM_PARITY_ERROR |\
1678da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_PBCLIENT_PARITY_ERROR)
1679da62a281SRasesh Mody #define HW_INTERRUT_ASSERT_SET_1 \
1680da62a281SRasesh Mody (AEU_INPUTS_ATTN_BITS_QM_HW_INTERRUPT | \
1681da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TIMERS_HW_INTERRUPT | \
1682da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_XSDM_HW_INTERRUPT | \
1683da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_XCM_HW_INTERRUPT | \
1684da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_XSEMI_HW_INTERRUPT | \
1685da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_USDM_HW_INTERRUPT | \
1686da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_UCM_HW_INTERRUPT | \
1687da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_USEMI_HW_INTERRUPT | \
1688da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_UPB_HW_INTERRUPT | \
1689da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CSDM_HW_INTERRUPT | \
1690da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CCM_HW_INTERRUPT)
1691da62a281SRasesh Mody #define HW_PRTY_ASSERT_SET_1 (AEU_INPUTS_ATTN_BITS_PBF_PARITY_ERROR |\
1692da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_QM_PARITY_ERROR | \
1693da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_TIMERS_PARITY_ERROR |\
1694da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_XSDM_PARITY_ERROR | \
1695da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_XCM_PARITY_ERROR |\
1696da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_XSEMI_PARITY_ERROR | \
1697da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR |\
1698da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_NIG_PARITY_ERROR |\
1699da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR |\
1700da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_DEBUG_PARITY_ERROR | \
1701da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_USDM_PARITY_ERROR | \
1702da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_UCM_PARITY_ERROR |\
1703da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_USEMI_PARITY_ERROR | \
1704da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_UPB_PARITY_ERROR | \
1705da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CSDM_PARITY_ERROR |\
1706da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CCM_PARITY_ERROR)
1707da62a281SRasesh Mody #define HW_INTERRUT_ASSERT_SET_2 \
1708da62a281SRasesh Mody (AEU_INPUTS_ATTN_BITS_CSEMI_HW_INTERRUPT | \
1709da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CDU_HW_INTERRUPT | \
1710da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_DMAE_HW_INTERRUPT | \
1711da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_HW_INTERRUPT |\
1712da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_MISC_HW_INTERRUPT)
1713da62a281SRasesh Mody #define HW_PRTY_ASSERT_SET_2 (AEU_INPUTS_ATTN_BITS_CSEMI_PARITY_ERROR | \
1714da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_PXP_PARITY_ERROR | \
1715da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR |\
1716da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CFC_PARITY_ERROR | \
1717da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_CDU_PARITY_ERROR | \
1718da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_DMAE_PARITY_ERROR |\
1719da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR | \
1720da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_MISC_PARITY_ERROR)
1721da62a281SRasesh Mody
1722da62a281SRasesh Mody #define HW_PRTY_ASSERT_SET_3_WITHOUT_SCPAD \
1723da62a281SRasesh Mody (AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | \
1724da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | \
1725da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY)
1726da62a281SRasesh Mody
1727da62a281SRasesh Mody #define HW_PRTY_ASSERT_SET_3 (HW_PRTY_ASSERT_SET_3_WITHOUT_SCPAD | \
1728da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY)
1729da62a281SRasesh Mody
1730da62a281SRasesh Mody #define HW_PRTY_ASSERT_SET_4 (AEU_INPUTS_ATTN_BITS_PGLUE_PARITY_ERROR | \
1731da62a281SRasesh Mody AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR)
1732da62a281SRasesh Mody
1733540a2110SStephen Hemminger #define MULTI_MASK 0x7f
1734540a2110SStephen Hemminger
1735540a2110SStephen Hemminger #define PFS_PER_PORT(sc) \
1736540a2110SStephen Hemminger ((CHIP_PORT_MODE(sc) == CHIP_4_PORT_MODE) ? 2 : 4)
1737540a2110SStephen Hemminger #define SC_MAX_VN_NUM(sc) PFS_PER_PORT(sc)
1738540a2110SStephen Hemminger
1739540a2110SStephen Hemminger #define FIRST_ABS_FUNC_IN_PORT(sc) \
1740540a2110SStephen Hemminger ((CHIP_PORT_MODE(sc) == CHIP_PORT_MODE_NONE) ? \
1741540a2110SStephen Hemminger PORT_ID(sc) : (PATH_ID(sc) + (2 * PORT_ID(sc))))
1742540a2110SStephen Hemminger
1743540a2110SStephen Hemminger #define FOREACH_ABS_FUNC_IN_PORT(sc, i) \
1744540a2110SStephen Hemminger for ((i) = FIRST_ABS_FUNC_IN_PORT(sc); \
1745540a2110SStephen Hemminger (i) < MAX_FUNC_NUM; \
1746540a2110SStephen Hemminger (i) += (MAX_FUNC_NUM / PFS_PER_PORT(sc)))
1747540a2110SStephen Hemminger
1748540a2110SStephen Hemminger #define BNX2X_SWCID_SHIFT 17
1749540a2110SStephen Hemminger #define BNX2X_SWCID_MASK ((0x1 << BNX2X_SWCID_SHIFT) - 1)
1750540a2110SStephen Hemminger
1751540a2110SStephen Hemminger #define SW_CID(x) (le32toh(x) & BNX2X_SWCID_MASK)
1752540a2110SStephen Hemminger #define CQE_CMD(x) (le32toh(x) >> COMMON_RAMROD_ETH_RX_CQE_CMD_ID_SHIFT)
1753540a2110SStephen Hemminger
1754540a2110SStephen Hemminger #define CQE_TYPE(cqe_fp_flags) ((cqe_fp_flags) & ETH_FAST_PATH_RX_CQE_TYPE)
1755540a2110SStephen Hemminger #define CQE_TYPE_START(cqe_type) ((cqe_type) == RX_ETH_CQE_TYPE_ETH_START_AGG)
1756540a2110SStephen Hemminger #define CQE_TYPE_STOP(cqe_type) ((cqe_type) == RX_ETH_CQE_TYPE_ETH_STOP_AGG)
1757540a2110SStephen Hemminger #define CQE_TYPE_SLOW(cqe_type) ((cqe_type) == RX_ETH_CQE_TYPE_ETH_RAMROD)
1758540a2110SStephen Hemminger #define CQE_TYPE_FAST(cqe_type) ((cqe_type) == RX_ETH_CQE_TYPE_ETH_FASTPATH)
1759540a2110SStephen Hemminger
1760540a2110SStephen Hemminger /* must be used on a CID before placing it on a HW ring */
1761540a2110SStephen Hemminger #define HW_CID(sc, x) \
1762540a2110SStephen Hemminger ((SC_PORT(sc) << 23) | (SC_VN(sc) << BNX2X_SWCID_SHIFT) | (x))
1763540a2110SStephen Hemminger
1764540a2110SStephen Hemminger #define SPEED_10 10
1765540a2110SStephen Hemminger #define SPEED_100 100
1766540a2110SStephen Hemminger #define SPEED_1000 1000
1767540a2110SStephen Hemminger #define SPEED_2500 2500
1768540a2110SStephen Hemminger #define SPEED_10000 10000
1769540a2110SStephen Hemminger
1770540a2110SStephen Hemminger #define PCI_PM_D0 1
1771540a2110SStephen Hemminger #define PCI_PM_D3hot 2
1772540a2110SStephen Hemminger
1773540a2110SStephen Hemminger int bnx2x_cmpxchg(volatile int *addr, int old, int new);
1774540a2110SStephen Hemminger
1775540a2110SStephen Hemminger int bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size,
1776540a2110SStephen Hemminger struct bnx2x_dma *dma, const char *msg, uint32_t align);
177768ed0742SShahed Shaikh void bnx2x_dma_free(struct bnx2x_dma *dma);
1778540a2110SStephen Hemminger uint32_t bnx2x_dmae_opcode_add_comp(uint32_t opcode, uint8_t comp_type);
1779540a2110SStephen Hemminger uint32_t bnx2x_dmae_opcode_clr_src_reset(uint32_t opcode);
1780540a2110SStephen Hemminger uint32_t bnx2x_dmae_opcode(struct bnx2x_softc *sc, uint8_t src_type,
1781540a2110SStephen Hemminger uint8_t dst_type, uint8_t with_comp,
1782540a2110SStephen Hemminger uint8_t comp_type);
1783540a2110SStephen Hemminger void bnx2x_post_dmae(struct bnx2x_softc *sc, struct dmae_command *dmae, int idx);
1784540a2110SStephen Hemminger void bnx2x_read_dmae(struct bnx2x_softc *sc, uint32_t src_addr, uint32_t len32);
1785df6e0a06SSantosh Shukla void bnx2x_write_dmae(struct bnx2x_softc *sc, rte_iova_t dma_addr,
1786540a2110SStephen Hemminger uint32_t dst_addr, uint32_t len32);
1787540a2110SStephen Hemminger void bnx2x_set_ctx_validation(struct bnx2x_softc *sc, struct eth_context *cxt,
1788540a2110SStephen Hemminger uint32_t cid);
1789540a2110SStephen Hemminger void bnx2x_update_coalesce_sb_index(struct bnx2x_softc *sc, uint8_t fw_sb_id,
1790540a2110SStephen Hemminger uint8_t sb_index, uint8_t disable,
1791540a2110SStephen Hemminger uint16_t usec);
1792540a2110SStephen Hemminger
1793540a2110SStephen Hemminger int bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid,
1794540a2110SStephen Hemminger uint32_t data_hi, uint32_t data_lo, int cmd_type);
1795540a2110SStephen Hemminger
1796540a2110SStephen Hemminger void ecore_init_e1h_firmware(struct bnx2x_softc *sc);
1797540a2110SStephen Hemminger void ecore_init_e2_firmware(struct bnx2x_softc *sc);
1798540a2110SStephen Hemminger
1799540a2110SStephen Hemminger void ecore_storm_memset_struct(struct bnx2x_softc *sc, uint32_t addr,
1800540a2110SStephen Hemminger size_t size, uint32_t *data);
1801540a2110SStephen Hemminger
1802540a2110SStephen Hemminger #define CATC_TRIGGER(sc, data) REG_WR((sc), 0x2000, (data));
1803540a2110SStephen Hemminger #define CATC_TRIGGER_START(sc) CATC_TRIGGER((sc), 0xcafecafe)
1804540a2110SStephen Hemminger
1805540a2110SStephen Hemminger #define BNX2X_MAC_FMT "%pM"
1806540a2110SStephen Hemminger #define BNX2X_MAC_PRN_LIST(mac) (mac)
1807540a2110SStephen Hemminger
1808540a2110SStephen Hemminger /***********/
1809540a2110SStephen Hemminger /* INLINES */
1810540a2110SStephen Hemminger /***********/
1811540a2110SStephen Hemminger
1812540a2110SStephen Hemminger static inline uint32_t
reg_poll(struct bnx2x_softc * sc,uint32_t reg,uint32_t expected,int ms,int wait)1813540a2110SStephen Hemminger reg_poll(struct bnx2x_softc *sc, uint32_t reg, uint32_t expected, int ms, int wait)
1814540a2110SStephen Hemminger {
1815540a2110SStephen Hemminger uint32_t val;
1816540a2110SStephen Hemminger do {
1817540a2110SStephen Hemminger val = REG_RD(sc, reg);
1818540a2110SStephen Hemminger if (val == expected) {
1819540a2110SStephen Hemminger break;
1820540a2110SStephen Hemminger }
1821540a2110SStephen Hemminger ms -= wait;
1822540a2110SStephen Hemminger DELAY(wait * 1000);
1823540a2110SStephen Hemminger } while (ms > 0);
1824540a2110SStephen Hemminger
1825540a2110SStephen Hemminger return val;
1826540a2110SStephen Hemminger }
1827540a2110SStephen Hemminger
1828540a2110SStephen Hemminger static inline void
bnx2x_update_fp_sb_idx(struct bnx2x_fastpath * fp)1829540a2110SStephen Hemminger bnx2x_update_fp_sb_idx(struct bnx2x_fastpath *fp)
1830540a2110SStephen Hemminger {
1831540a2110SStephen Hemminger mb(); /* status block is written to by the chip */
1832540a2110SStephen Hemminger fp->fp_hc_idx = fp->sb_running_index[SM_RX_ID];
1833540a2110SStephen Hemminger }
1834540a2110SStephen Hemminger
1835540a2110SStephen Hemminger static inline void
bnx2x_igu_ack_sb_gen(struct bnx2x_softc * sc,uint8_t segment,uint16_t index,uint8_t op,uint8_t update,uint32_t igu_addr)1836540a2110SStephen Hemminger bnx2x_igu_ack_sb_gen(struct bnx2x_softc *sc, uint8_t segment,
1837540a2110SStephen Hemminger uint16_t index, uint8_t op, uint8_t update, uint32_t igu_addr)
1838540a2110SStephen Hemminger {
1839540a2110SStephen Hemminger struct igu_regular cmd_data = {0};
1840540a2110SStephen Hemminger
1841540a2110SStephen Hemminger cmd_data.sb_id_and_flags =
1842540a2110SStephen Hemminger ((index << IGU_REGULAR_SB_INDEX_SHIFT) |
1843540a2110SStephen Hemminger (segment << IGU_REGULAR_SEGMENT_ACCESS_SHIFT) |
1844540a2110SStephen Hemminger (update << IGU_REGULAR_BUPDATE_SHIFT) |
1845540a2110SStephen Hemminger (op << IGU_REGULAR_ENABLE_INT_SHIFT));
1846540a2110SStephen Hemminger
1847540a2110SStephen Hemminger REG_WR(sc, igu_addr, cmd_data.sb_id_and_flags);
1848540a2110SStephen Hemminger
1849540a2110SStephen Hemminger /* Make sure that ACK is written */
1850540a2110SStephen Hemminger mb();
1851540a2110SStephen Hemminger }
1852540a2110SStephen Hemminger
1853540a2110SStephen Hemminger static inline void
bnx2x_hc_ack_sb(struct bnx2x_softc * sc,uint8_t sb_id,uint8_t storm,uint16_t index,uint8_t op,uint8_t update)1854540a2110SStephen Hemminger bnx2x_hc_ack_sb(struct bnx2x_softc *sc, uint8_t sb_id, uint8_t storm,
1855540a2110SStephen Hemminger uint16_t index, uint8_t op, uint8_t update)
1856540a2110SStephen Hemminger {
1857540a2110SStephen Hemminger uint32_t hc_addr = (HC_REG_COMMAND_REG + SC_PORT(sc) * 32 +
1858540a2110SStephen Hemminger COMMAND_REG_INT_ACK);
1859ab70be7eSFerruh Yigit union {
186038dff79bSRasesh Mody struct igu_ack_register igu_ack;
1861ab70be7eSFerruh Yigit uint32_t val;
1862ab70be7eSFerruh Yigit } val;
1863540a2110SStephen Hemminger
1864ab70be7eSFerruh Yigit val.igu_ack.status_block_index = index;
1865ab70be7eSFerruh Yigit val.igu_ack.sb_id_and_flags =
1866540a2110SStephen Hemminger ((sb_id << IGU_ACK_REGISTER_STATUS_BLOCK_ID_SHIFT) |
1867540a2110SStephen Hemminger (storm << IGU_ACK_REGISTER_STORM_ID_SHIFT) |
1868540a2110SStephen Hemminger (update << IGU_ACK_REGISTER_UPDATE_INDEX_SHIFT) |
1869540a2110SStephen Hemminger (op << IGU_ACK_REGISTER_INTERRUPT_MODE_SHIFT));
1870540a2110SStephen Hemminger
1871ab70be7eSFerruh Yigit REG_WR(sc, hc_addr, val.val);
1872540a2110SStephen Hemminger
1873540a2110SStephen Hemminger /* Make sure that ACK is written */
1874540a2110SStephen Hemminger mb();
1875540a2110SStephen Hemminger }
1876540a2110SStephen Hemminger
1877540a2110SStephen Hemminger static inline uint32_t
bnx2x_hc_ack_int(struct bnx2x_softc * sc)1878540a2110SStephen Hemminger bnx2x_hc_ack_int(struct bnx2x_softc *sc)
1879540a2110SStephen Hemminger {
1880540a2110SStephen Hemminger uint32_t hc_addr = (HC_REG_COMMAND_REG + SC_PORT(sc) * 32 +
1881540a2110SStephen Hemminger COMMAND_REG_SIMD_MASK);
1882540a2110SStephen Hemminger uint32_t result = REG_RD(sc, hc_addr);
1883540a2110SStephen Hemminger
1884540a2110SStephen Hemminger mb();
1885540a2110SStephen Hemminger return result;
1886540a2110SStephen Hemminger }
1887540a2110SStephen Hemminger
1888540a2110SStephen Hemminger static inline uint32_t
bnx2x_igu_ack_int(struct bnx2x_softc * sc)1889540a2110SStephen Hemminger bnx2x_igu_ack_int(struct bnx2x_softc *sc)
1890540a2110SStephen Hemminger {
1891540a2110SStephen Hemminger uint32_t igu_addr = (BAR_IGU_INTMEM + IGU_REG_SISR_MDPC_WMASK_LSB_UPPER * 8);
1892540a2110SStephen Hemminger uint32_t result = REG_RD(sc, igu_addr);
1893540a2110SStephen Hemminger
1894540a2110SStephen Hemminger /* PMD_PDEBUG_LOG(sc, DBG_INTR, "read 0x%08x from IGU addr 0x%x",
1895540a2110SStephen Hemminger result, igu_addr); */
1896540a2110SStephen Hemminger
1897540a2110SStephen Hemminger mb();
1898540a2110SStephen Hemminger return result;
1899540a2110SStephen Hemminger }
1900540a2110SStephen Hemminger
1901540a2110SStephen Hemminger static inline uint32_t
bnx2x_ack_int(struct bnx2x_softc * sc)1902540a2110SStephen Hemminger bnx2x_ack_int(struct bnx2x_softc *sc)
1903540a2110SStephen Hemminger {
1904540a2110SStephen Hemminger mb();
1905540a2110SStephen Hemminger if (sc->devinfo.int_block == INT_BLOCK_HC) {
1906540a2110SStephen Hemminger return bnx2x_hc_ack_int(sc);
1907540a2110SStephen Hemminger } else {
1908540a2110SStephen Hemminger return bnx2x_igu_ack_int(sc);
1909540a2110SStephen Hemminger }
1910540a2110SStephen Hemminger }
1911540a2110SStephen Hemminger
1912540a2110SStephen Hemminger static inline int
func_by_vn(struct bnx2x_softc * sc,int vn)1913540a2110SStephen Hemminger func_by_vn(struct bnx2x_softc *sc, int vn)
1914540a2110SStephen Hemminger {
1915693f715dSHuawei Xie return 2 * vn + SC_PORT(sc);
1916540a2110SStephen Hemminger }
1917540a2110SStephen Hemminger
1918540a2110SStephen Hemminger /*
1919540a2110SStephen Hemminger * send notification to other functions.
1920540a2110SStephen Hemminger */
1921540a2110SStephen Hemminger static inline void
bnx2x_link_sync_notify(struct bnx2x_softc * sc)1922540a2110SStephen Hemminger bnx2x_link_sync_notify(struct bnx2x_softc *sc)
1923540a2110SStephen Hemminger {
1924540a2110SStephen Hemminger int func, vn;
1925540a2110SStephen Hemminger
1926540a2110SStephen Hemminger /* Set the attention towards other drivers on the same port */
1927540a2110SStephen Hemminger for (vn = VN_0; vn < SC_MAX_VN_NUM(sc); vn++) {
1928540a2110SStephen Hemminger if (vn == SC_VN(sc))
1929540a2110SStephen Hemminger continue;
1930540a2110SStephen Hemminger
1931540a2110SStephen Hemminger func = func_by_vn(sc, vn);
1932540a2110SStephen Hemminger REG_WR(sc, MISC_REG_AEU_GENERAL_ATTN_0 +
1933540a2110SStephen Hemminger (LINK_SYNC_ATTENTION_BIT_FUNC_0 + func) * 4, 1);
1934540a2110SStephen Hemminger }
1935540a2110SStephen Hemminger }
1936540a2110SStephen Hemminger
1937540a2110SStephen Hemminger /*
1938540a2110SStephen Hemminger * Statistics ID are global per chip/path, while Client IDs for E1x
1939540a2110SStephen Hemminger * are per port.
1940540a2110SStephen Hemminger */
1941540a2110SStephen Hemminger static inline uint8_t
bnx2x_stats_id(struct bnx2x_fastpath * fp)1942540a2110SStephen Hemminger bnx2x_stats_id(struct bnx2x_fastpath *fp)
1943540a2110SStephen Hemminger {
1944540a2110SStephen Hemminger struct bnx2x_softc *sc = fp->sc;
1945540a2110SStephen Hemminger
1946540a2110SStephen Hemminger if (!CHIP_IS_E1x(sc)) {
1947540a2110SStephen Hemminger return fp->cl_id;
1948540a2110SStephen Hemminger }
1949540a2110SStephen Hemminger
1950693f715dSHuawei Xie return fp->cl_id + SC_PORT(sc) * FP_SB_MAX_E1x;
1951540a2110SStephen Hemminger }
1952540a2110SStephen Hemminger
1953540a2110SStephen Hemminger int bnx2x_init(struct bnx2x_softc *sc);
1954540a2110SStephen Hemminger void bnx2x_load_firmware(struct bnx2x_softc *sc);
1955540a2110SStephen Hemminger int bnx2x_attach(struct bnx2x_softc *sc);
1956540a2110SStephen Hemminger int bnx2x_nic_unload(struct bnx2x_softc *sc, uint32_t unload_mode, uint8_t keep_link);
1957540a2110SStephen Hemminger int bnx2x_alloc_hsi_mem(struct bnx2x_softc *sc);
1958540a2110SStephen Hemminger int bnx2x_alloc_ilt_mem(struct bnx2x_softc *sc);
1959540a2110SStephen Hemminger void bnx2x_free_ilt_mem(struct bnx2x_softc *sc);
1960540a2110SStephen Hemminger void bnx2x_dump_tx_chain(struct bnx2x_fastpath * fp, int bd_prod, int count);
19613570f700SRasesh Mody int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0);
1962540a2110SStephen Hemminger uint8_t bnx2x_txeof(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp);
1963540a2110SStephen Hemminger void bnx2x_print_adapter_info(struct bnx2x_softc *sc);
19644dd60a7aSRasesh Mody void bnx2x_print_device_info(struct bnx2x_softc *sc);
19658bd31421SShahed Shaikh int bnx2x_intr_legacy(struct bnx2x_softc *sc);
1966540a2110SStephen Hemminger void bnx2x_link_status_update(struct bnx2x_softc *sc);
1967540a2110SStephen Hemminger int bnx2x_complete_sp(struct bnx2x_softc *sc);
1968540a2110SStephen Hemminger int bnx2x_set_storm_rx_mode(struct bnx2x_softc *sc);
1969540a2110SStephen Hemminger void bnx2x_periodic_callout(struct bnx2x_softc *sc);
19706041aa61SRasesh Mody void bnx2x_periodic_stop(void *param);
1971540a2110SStephen Hemminger
1972540a2110SStephen Hemminger int bnx2x_vf_get_resources(struct bnx2x_softc *sc, uint8_t tx_count, uint8_t rx_count);
1973540a2110SStephen Hemminger void bnx2x_vf_close(struct bnx2x_softc *sc);
1974540a2110SStephen Hemminger int bnx2x_vf_init(struct bnx2x_softc *sc);
1975540a2110SStephen Hemminger void bnx2x_vf_unload(struct bnx2x_softc *sc);
1976540a2110SStephen Hemminger int bnx2x_vf_setup_queue(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp,
1977540a2110SStephen Hemminger int leading);
1978540a2110SStephen Hemminger void bnx2x_free_hsi_mem(struct bnx2x_softc *sc);
1979540a2110SStephen Hemminger int bnx2x_vf_set_rx_mode(struct bnx2x_softc *sc);
1980540a2110SStephen Hemminger int bnx2x_check_bull(struct bnx2x_softc *sc);
1981540a2110SStephen Hemminger
1982540a2110SStephen Hemminger //#define BNX2X_PULSE
1983540a2110SStephen Hemminger
1984540a2110SStephen Hemminger #define BNX2X_PCI_CAP 1
1985540a2110SStephen Hemminger #define BNX2X_PCI_ECAP 2
1986540a2110SStephen Hemminger
1987540a2110SStephen Hemminger static inline struct bnx2x_pci_cap*
pci_find_cap(struct bnx2x_softc * sc,uint8_t id,uint8_t type)1988540a2110SStephen Hemminger pci_find_cap(struct bnx2x_softc *sc, uint8_t id, uint8_t type)
1989540a2110SStephen Hemminger {
1990540a2110SStephen Hemminger struct bnx2x_pci_cap *cap = sc->pci_caps;
1991540a2110SStephen Hemminger
1992540a2110SStephen Hemminger while (cap) {
1993540a2110SStephen Hemminger if (cap->id == id && cap->type == type)
1994540a2110SStephen Hemminger return cap;
1995540a2110SStephen Hemminger cap = cap->next;
1996540a2110SStephen Hemminger }
1997540a2110SStephen Hemminger
1998540a2110SStephen Hemminger return NULL;
1999540a2110SStephen Hemminger }
2000540a2110SStephen Hemminger
2001540a2110SStephen Hemminger static inline void
bnx2x_set_rx_mode(struct bnx2x_softc * sc)2002540a2110SStephen Hemminger bnx2x_set_rx_mode(struct bnx2x_softc *sc)
2003540a2110SStephen Hemminger {
2004540a2110SStephen Hemminger if (sc->state == BNX2X_STATE_OPEN) {
2005540a2110SStephen Hemminger if (IS_PF(sc)) {
2006540a2110SStephen Hemminger bnx2x_set_storm_rx_mode(sc);
2007540a2110SStephen Hemminger } else {
2008540a2110SStephen Hemminger sc->rx_mode = BNX2X_RX_MODE_PROMISC;
2009540a2110SStephen Hemminger bnx2x_vf_set_rx_mode(sc);
2010540a2110SStephen Hemminger }
2011540a2110SStephen Hemminger } else {
20124dd60a7aSRasesh Mody PMD_DRV_LOG(INFO, sc, "Card is not ready to change mode");
2013540a2110SStephen Hemminger }
2014540a2110SStephen Hemminger }
2015540a2110SStephen Hemminger
pci_read(struct bnx2x_softc * sc,size_t addr,void * val,uint8_t size)2016540a2110SStephen Hemminger static inline int pci_read(struct bnx2x_softc *sc, size_t addr,
2017540a2110SStephen Hemminger void *val, uint8_t size)
2018540a2110SStephen Hemminger {
20193dcfe039SThomas Monjalon if (rte_pci_read_config(sc->pci_dev, val, size, addr) <= 0) {
2020ba7eeb03SRasesh Mody PMD_DRV_LOG(ERR, sc, "Can't read from PCI config space");
2021540a2110SStephen Hemminger return ENXIO;
2022540a2110SStephen Hemminger }
2023540a2110SStephen Hemminger
2024540a2110SStephen Hemminger return 0;
2025540a2110SStephen Hemminger }
2026540a2110SStephen Hemminger
pci_write_word(struct bnx2x_softc * sc,size_t addr,off_t val)2027540a2110SStephen Hemminger static inline int pci_write_word(struct bnx2x_softc *sc, size_t addr, off_t val)
2028540a2110SStephen Hemminger {
2029540a2110SStephen Hemminger uint16_t val16 = val;
2030540a2110SStephen Hemminger
20313dcfe039SThomas Monjalon if (rte_pci_write_config(sc->pci_dev, &val16,
2032540a2110SStephen Hemminger sizeof(val16), addr) <= 0) {
2033ba7eeb03SRasesh Mody PMD_DRV_LOG(ERR, sc, "Can't write to PCI config space");
2034540a2110SStephen Hemminger return ENXIO;
2035540a2110SStephen Hemminger }
2036540a2110SStephen Hemminger
2037540a2110SStephen Hemminger return 0;
2038540a2110SStephen Hemminger }
2039540a2110SStephen Hemminger
pci_write_long(struct bnx2x_softc * sc,size_t addr,off_t val)2040540a2110SStephen Hemminger static inline int pci_write_long(struct bnx2x_softc *sc, size_t addr, off_t val)
2041540a2110SStephen Hemminger {
2042540a2110SStephen Hemminger uint32_t val32 = val;
20433dcfe039SThomas Monjalon if (rte_pci_write_config(sc->pci_dev, &val32,
2044540a2110SStephen Hemminger sizeof(val32), addr) <= 0) {
2045ba7eeb03SRasesh Mody PMD_DRV_LOG(ERR, sc, "Can't write to PCI config space");
2046540a2110SStephen Hemminger return ENXIO;
2047540a2110SStephen Hemminger }
2048540a2110SStephen Hemminger
2049540a2110SStephen Hemminger return 0;
2050540a2110SStephen Hemminger }
2051540a2110SStephen Hemminger
2052540a2110SStephen Hemminger #endif /* __BNX2X_H__ */
2053