1d14abf15SRobert Mustacchi /*******************************************************************************
2d14abf15SRobert Mustacchi * CDDL HEADER START
3d14abf15SRobert Mustacchi *
4d14abf15SRobert Mustacchi * The contents of this file are subject to the terms of the
5d14abf15SRobert Mustacchi * Common Development and Distribution License (the "License").
6d14abf15SRobert Mustacchi * You may not use this file except in compliance with the License.
7d14abf15SRobert Mustacchi *
8d14abf15SRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9d14abf15SRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
10d14abf15SRobert Mustacchi * See the License for the specific language governing permissions
11d14abf15SRobert Mustacchi * and limitations under the License.
12d14abf15SRobert Mustacchi *
13d14abf15SRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
14d14abf15SRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d14abf15SRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
16d14abf15SRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
17d14abf15SRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
18d14abf15SRobert Mustacchi *
19d14abf15SRobert Mustacchi * CDDL HEADER END
20d14abf15SRobert Mustacchi *
21d14abf15SRobert Mustacchi * Copyright 2014 QLogic Corporation
22d14abf15SRobert Mustacchi * The contents of this file are subject to the terms of the
23d14abf15SRobert Mustacchi * QLogic End User License (the "License").
24d14abf15SRobert Mustacchi * You may not use this file except in compliance with the License.
25d14abf15SRobert Mustacchi *
26d14abf15SRobert Mustacchi * You can obtain a copy of the License at
27d14abf15SRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
28d14abf15SRobert Mustacchi * QLogic_End_User_Software_License.txt
29d14abf15SRobert Mustacchi * See the License for the specific language governing permissions
30d14abf15SRobert Mustacchi * and limitations under the License.
31d14abf15SRobert Mustacchi *
32d14abf15SRobert Mustacchi *
33d14abf15SRobert Mustacchi * Module Description:
34d14abf15SRobert Mustacchi *
35d14abf15SRobert Mustacchi *
36d14abf15SRobert Mustacchi * History:
37d14abf15SRobert Mustacchi * 10/10/01 Hav Khauv Inception.
38d14abf15SRobert Mustacchi ******************************************************************************/
39d14abf15SRobert Mustacchi
40d14abf15SRobert Mustacchi #ifndef _LM5710_H
41d14abf15SRobert Mustacchi #define _LM5710_H
42d14abf15SRobert Mustacchi
43d14abf15SRobert Mustacchi //migrated from 5706_reg.h
44d14abf15SRobert Mustacchi #ifndef __BIG_ENDIAN
45d14abf15SRobert Mustacchi #ifndef LITTLE_ENDIAN
46d14abf15SRobert Mustacchi #define LITTLE_ENDIAN
47d14abf15SRobert Mustacchi #endif
48d14abf15SRobert Mustacchi #else
49d14abf15SRobert Mustacchi #undef LITTLE_ENDIAN
50d14abf15SRobert Mustacchi #ifndef BIG_ENDIAN
51d14abf15SRobert Mustacchi #define BIG_ENDIAN
52d14abf15SRobert Mustacchi #endif
53d14abf15SRobert Mustacchi #ifndef BIG_ENDIAN_HOST
54d14abf15SRobert Mustacchi #define BIG_ENDIAN_HOST
55d14abf15SRobert Mustacchi #endif
56d14abf15SRobert Mustacchi #endif
57d14abf15SRobert Mustacchi
58d14abf15SRobert Mustacchi #ifndef INLINE
59d14abf15SRobert Mustacchi #if DBG
60d14abf15SRobert Mustacchi #define INLINE
61d14abf15SRobert Mustacchi #else
62d14abf15SRobert Mustacchi #define INLINE __inline
63d14abf15SRobert Mustacchi #endif
64d14abf15SRobert Mustacchi #endif
65d14abf15SRobert Mustacchi
66d14abf15SRobert Mustacchi #if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
67d14abf15SRobert Mustacchi #error "Missing either LITTLE_ENDIAN or BIG_ENDIAN definition."
68d14abf15SRobert Mustacchi #endif
69d14abf15SRobert Mustacchi
70d14abf15SRobert Mustacchi #define ECORE_NIV
71d14abf15SRobert Mustacchi
72d14abf15SRobert Mustacchi #ifdef __LINUX
73d14abf15SRobert Mustacchi #include <linux/types.h>
74d14abf15SRobert Mustacchi #endif
75d14abf15SRobert Mustacchi #include "bcmtype.h"
76d14abf15SRobert Mustacchi #include "debug.h"
77d14abf15SRobert Mustacchi #include "igu_def.h"
78d14abf15SRobert Mustacchi #include "microcode_constants.h"
79d14abf15SRobert Mustacchi #include "fcoe_constants.h"
80d14abf15SRobert Mustacchi #include "toe_constants.h"
81d14abf15SRobert Mustacchi #include "tcp_constants.h"
82d14abf15SRobert Mustacchi #include "eth_constants.h"
83d14abf15SRobert Mustacchi //this is the included HSI
84d14abf15SRobert Mustacchi #include "5710_hsi.h"
85d14abf15SRobert Mustacchi #include "lm5710_hsi.h"
86d14abf15SRobert Mustacchi #include "pcics_reg_driver.h"
87d14abf15SRobert Mustacchi #include "bigmac_addresses.h"
88d14abf15SRobert Mustacchi #include "misc_bits.h"
89d14abf15SRobert Mustacchi #include "emac_reg_driver.h"
90d14abf15SRobert Mustacchi #include "dmae_clients.h"
91d14abf15SRobert Mustacchi #include "prs_flags.h"
92d14abf15SRobert Mustacchi #include "57712_reg.h"
93d14abf15SRobert Mustacchi #include "grc_addr.h"
94d14abf15SRobert Mustacchi #include "bd_chain_st.h"
95d14abf15SRobert Mustacchi #include "lm_sp_req_mgr.h"
96d14abf15SRobert Mustacchi #include "license.h"
97d14abf15SRobert Mustacchi #include "mcp_shmem.h"
98d14abf15SRobert Mustacchi #include "lm_dcbx_mp.h"
99d14abf15SRobert Mustacchi
100d14abf15SRobert Mustacchi #ifndef elink_dev
101d14abf15SRobert Mustacchi #define elink_dev _lm_device_t
102d14abf15SRobert Mustacchi #endif
103d14abf15SRobert Mustacchi #include "clc.h"
104d14abf15SRobert Mustacchi //#include "status_code.h"
105d14abf15SRobert Mustacchi // TODO - we will add ou rown shmem
106d14abf15SRobert Mustacchi //#include "shmem.h"
107d14abf15SRobert Mustacchi //
108d14abf15SRobert Mustacchi #define DEVICE_TYPE_PF 0
109d14abf15SRobert Mustacchi #define DEVICE_TYPE_VF 1
110d14abf15SRobert Mustacchi
111d14abf15SRobert Mustacchi /* Virtualization types (vt) */
112d14abf15SRobert Mustacchi #define VT_NONE 0
113d14abf15SRobert Mustacchi #define VT_BASIC_VF 1
114d14abf15SRobert Mustacchi #define VT_CHANNEL_VF 2
115d14abf15SRobert Mustacchi #define VT_ASSIGNED_TO_VM_PF 3
116d14abf15SRobert Mustacchi
117d14abf15SRobert Mustacchi #define VT_HW_CHANNEL_TYPE 0
118d14abf15SRobert Mustacchi #define VT_SW_CHANNEL_TYPE 1
119d14abf15SRobert Mustacchi
120d14abf15SRobert Mustacchi
121d14abf15SRobert Mustacchi #define IS_CHANNEL_VFDEV(pdev) (((pdev)->params.device_type == DEVICE_TYPE_VF) && ((pdev)->params.virtualization_type == VT_CHANNEL_VF))
122d14abf15SRobert Mustacchi
123d14abf15SRobert Mustacchi #define IS_BASIC_VIRT_MODE_MASTER_PFDEV(pdev) (((pdev)->params.device_type == DEVICE_TYPE_PF) && ((pdev)->params.virtualization_type == VT_BASIC_VF))
124d14abf15SRobert Mustacchi #define IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev) (((pdev)->params.device_type == DEVICE_TYPE_PF) && ((pdev)->params.virtualization_type == VT_CHANNEL_VF))
125d14abf15SRobert Mustacchi #define IS_ASSIGNED_TO_VM_PFDEV(pdev) (((pdev)->params.device_type == DEVICE_TYPE_PF) && ((pdev)->params.virtualization_type == VT_ASSIGNED_TO_VM_PF))
126d14abf15SRobert Mustacchi #define DBG_DMP_IS_ONLINE(pdev) IS_ASSIGNED_TO_VM_PFDEV(pdev)
127d14abf15SRobert Mustacchi
128d14abf15SRobert Mustacchi #define IS_HW_CHANNEL_VIRT_MODE(pdev) (((pdev)->params.virtualization_type == VT_CHANNEL_VF) && ((pdev)->params.channel_type == VT_HW_CHANNEL_TYPE))
129d14abf15SRobert Mustacchi #define IS_SW_CHANNEL_VIRT_MODE(pdev) (((pdev)->params.virtualization_type == VT_CHANNEL_VF) && ((pdev)->params.channel_type == VT_SW_CHANNEL_TYPE))
130d14abf15SRobert Mustacchi
131d14abf15SRobert Mustacchi #define IS_PFDEV(pdev) (((pdev)->pf_dev == NULL) && ((pdev)->params.device_type == DEVICE_TYPE_PF))
132d14abf15SRobert Mustacchi #define IS_VFDEV(pdev) (((pdev)->pf_dev != NULL) || ((pdev)->params.device_type == DEVICE_TYPE_VF))
133d14abf15SRobert Mustacchi #define PFDEV(pdev) (pdev)
134d14abf15SRobert Mustacchi
135d14abf15SRobert Mustacchi
136d14abf15SRobert Mustacchi
137d14abf15SRobert Mustacchi #define LM_VF_MAX_RVFID_SIZE 6
138d14abf15SRobert Mustacchi
139d14abf15SRobert Mustacchi #define LM_MAX_VF_CID_WND_SIZE 4
140d14abf15SRobert Mustacchi #define LM_MAX_VF_CHAINS_PER_PF (1 << LM_MAX_VF_CID_WND_SIZE)
141d14abf15SRobert Mustacchi
142d14abf15SRobert Mustacchi #define LM_VF_CID_WND_SIZE(_pdev) (((_pdev)->hw_info.sriov_info.max_chains_per_vf) ? (_pdev)->hw_info.sriov_info.vf_cid_wnd_size : LM_MAX_VF_CID_WND_SIZE)
143d14abf15SRobert Mustacchi #define LM_VF_CHAINS_PER_PF(_pdev) (((_pdev)->hw_info.sriov_info.max_chains_per_vf) ? (_pdev)->hw_info.sriov_info.max_chains_per_vf : LM_MAX_VF_CHAINS_PER_PF)
144d14abf15SRobert Mustacchi
145d14abf15SRobert Mustacchi #define LM_VF_NUM_CIDS_MASK(_pdev) ((1 << LM_VF_CID_WND_SIZE(_pdev)) - 1)
146d14abf15SRobert Mustacchi
147d14abf15SRobert Mustacchi #define LM_VF_CID_BASE(_pdev) (1 << (LM_VF_MAX_RVFID_SIZE + LM_VF_CID_WND_SIZE(_pdev)))
148d14abf15SRobert Mustacchi
149d14abf15SRobert Mustacchi #define LM_VF_MAX_RVFID_MASK ((1 << LM_VF_MAX_RVFID_SIZE) - 1)
150d14abf15SRobert Mustacchi
151d14abf15SRobert Mustacchi
152d14abf15SRobert Mustacchi #define VF_TO_PF_CID(pdev,cid) (cid)
153d14abf15SRobert Mustacchi #define PF_TO_VF_CID(pdev,cid) (cid)
154d14abf15SRobert Mustacchi
155d14abf15SRobert Mustacchi #define GET_VF_Q_ID_FROM_PF_CID(cid) (cid & LM_VF_NUM_CIDS_MASK(pdev))
156d14abf15SRobert Mustacchi #define GET_ABS_VF_ID_FROM_PF_CID(cid) ((cid >> LM_VF_CID_WND_SIZE(pdev)) & LM_VF_MAX_RVFID_MASK)
157d14abf15SRobert Mustacchi
158d14abf15SRobert Mustacchi #define VF_BAR0_IGU_OFFSET 0x0000 /*0x0000-0x3000: (12KB)*/
159d14abf15SRobert Mustacchi #define VF_BAR0_USDM_QUEUES_OFFSET 0x3000 /*-0x4100: (ZoneA) (4352B)*/
160d14abf15SRobert Mustacchi #define VF_BAR0_CSDM_QUEUES_OFFSET 0x4100 /*-0x5200: (ZoneA) (4352B)*/
161d14abf15SRobert Mustacchi #define VF_BAR0_XSDM_QUEUES_OFFSET 0x5200 /*-0x6300: (ZoneA) (4352B)*/
162d14abf15SRobert Mustacchi #define VF_BAR0_TSDM_QUEUES_OFFSET 0x6300 /*-0x7400: (ZoneA) (4352B)*/
163d14abf15SRobert Mustacchi #define VF_BAR0_USDM_GLOBAL_OFFSET 0x7400 /*-0x7600: (ZoneB) (512B)*/
164d14abf15SRobert Mustacchi #define VF_BAR0_CSDM_GLOBAL_OFFSET 0x7600 /*-0x7800: (ZoneB) (512B)*/
165d14abf15SRobert Mustacchi #define VF_BAR0_XSDM_GLOBAL_OFFSET 0x7800 /*-0x7A00: (ZoneB) (512B)*/
166d14abf15SRobert Mustacchi #define VF_BAR0_TSDM_GLOBAL_OFFSET 0x7A00 /*-0x7C00: (ZoneB) (512B)*/
167d14abf15SRobert Mustacchi #define VF_BAR0_DB_OFFSET 0x7C00 /*-0x7E00: (512B)*/
168d14abf15SRobert Mustacchi #define VF_BAR0_DB_SIZE 512
169d14abf15SRobert Mustacchi #define VF_BAR0_GRC_OFFSET 0x7E00 /*-0x8000:(512B) */
170d14abf15SRobert Mustacchi
171d14abf15SRobert Mustacchi /* multi function mode is supported on (5711+5711E FPGA+EMUL) and on (5711E ASIC) and on 5712E and 5713E */
172d14abf15SRobert Mustacchi #define IS_MF_MODE_CAPABLE(pdev) ((CHIP_NUM(pdev) == CHIP_NUM_5711E) || \
173d14abf15SRobert Mustacchi (CHIP_NUM(pdev) == CHIP_NUM_5712E) || \
174d14abf15SRobert Mustacchi (CHIP_IS_E3(pdev)))
175d14abf15SRobert Mustacchi
176d14abf15SRobert Mustacchi /* Macro for triggering PCIE analyzer: write to 0x2000 */
177d14abf15SRobert Mustacchi #define LM_TRIGGER_PCIE(_pdev) \
178d14abf15SRobert Mustacchi { \
179d14abf15SRobert Mustacchi u32_t kuku = 0xcafecafe; \
180d14abf15SRobert Mustacchi REG_WR((_pdev), 0x2000, kuku); \
181d14abf15SRobert Mustacchi }
182d14abf15SRobert Mustacchi
183d14abf15SRobert Mustacchi // Send an attention on this Function.
184d14abf15SRobert Mustacchi #define LM_GENERAL_ATTN_INTERRUPT_SET(_pdev,_func) REG_WR((_pdev),MISC_REG_AEU_GENERAL_ATTN_12 + 4*(_func),0x1)
185d14abf15SRobert Mustacchi /*******************************************************************************
186d14abf15SRobert Mustacchi * Constants.
187d14abf15SRobert Mustacchi ******************************************************************************/
188d14abf15SRobert Mustacchi #define MAX_PATH_NUM 2
189d14abf15SRobert Mustacchi #define E2_MAX_NUM_OF_VFS 64
190d14abf15SRobert Mustacchi #define E1H_FUNC_MAX 8
191d14abf15SRobert Mustacchi #define E2_FUNC_MAX 4 /* per path */
192d14abf15SRobert Mustacchi #define MAX_VNIC_NUM 4
193d14abf15SRobert Mustacchi #define MAX_FUNC_NUM 8 /* Common to all chips */
194d14abf15SRobert Mustacchi #define MAX_NDSB HC_SB_MAX_SB_E2
195d14abf15SRobert Mustacchi #define MAX_RSS_CHAINS (16) /* a constatnt for _HW_ limit */
196d14abf15SRobert Mustacchi #define MAX_HW_CHAINS (64) /* real E2/E3 HW limit of IGU blocks configured for function*/
197d14abf15SRobert Mustacchi
198d14abf15SRobert Mustacchi
199d14abf15SRobert Mustacchi typedef enum
200d14abf15SRobert Mustacchi {
201d14abf15SRobert Mustacchi LM_CLI_IDX_NDIS = 0,
202d14abf15SRobert Mustacchi //LM_CLI_IDX_RDMA = 1,
203d14abf15SRobert Mustacchi LM_CLI_IDX_ISCSI, /* iSCSI idx must be after ndis+rdma */
204d14abf15SRobert Mustacchi LM_CLI_IDX_FCOE, /* FCOE idx must be after ndis+rdma */
205d14abf15SRobert Mustacchi LM_CLI_IDX_FWD,
206d14abf15SRobert Mustacchi LM_CLI_IDX_OOO,
207d14abf15SRobert Mustacchi LM_CLI_IDX_MAX
208d14abf15SRobert Mustacchi } lm_cli_idx_t;
209d14abf15SRobert Mustacchi
210d14abf15SRobert Mustacchi typedef enum
211d14abf15SRobert Mustacchi {
212d14abf15SRobert Mustacchi LM_RESOURCE_NDIS = LM_CLI_IDX_NDIS,
213d14abf15SRobert Mustacchi // LM_RESOURCE_RDMA = LM_CLI_IDX_RDMA,
214d14abf15SRobert Mustacchi LM_RESOURCE_ISCSI = LM_CLI_IDX_ISCSI, /* iSCSI idx must be after ndis+rdma */
215d14abf15SRobert Mustacchi LM_RESOURCE_FCOE = LM_CLI_IDX_FCOE, /* FCOE idx must be after ndis+rdma */
216d14abf15SRobert Mustacchi LM_RESOURCE_FWD = LM_CLI_IDX_FWD,
217d14abf15SRobert Mustacchi LM_RESOURCE_OOO = LM_CLI_IDX_OOO,
218d14abf15SRobert Mustacchi LM_RESOURCE_COMMON = LM_CLI_IDX_MAX,
219d14abf15SRobert Mustacchi } lm_resource_idx_t;
220d14abf15SRobert Mustacchi
221d14abf15SRobert Mustacchi struct sq_pending_command
222d14abf15SRobert Mustacchi {
223d14abf15SRobert Mustacchi d_list_entry_t list;
224d14abf15SRobert Mustacchi u32_t cid;
225d14abf15SRobert Mustacchi u16_t type;
226d14abf15SRobert Mustacchi u8_t cmd;
227d14abf15SRobert Mustacchi u8_t flags;
228d14abf15SRobert Mustacchi #define SQ_PEND_RELEASE_MEM 0x1
229d14abf15SRobert Mustacchi #define SQ_PEND_COMP_CALLED 0x2
230d14abf15SRobert Mustacchi
231d14abf15SRobert Mustacchi struct slow_path_element command;
232d14abf15SRobert Mustacchi };
233d14abf15SRobert Mustacchi
234d14abf15SRobert Mustacchi #include "lm_desc.h"
235d14abf15SRobert Mustacchi #include "listq.h"
236d14abf15SRobert Mustacchi #include "lm.h"
237d14abf15SRobert Mustacchi #include "mm.h"
238d14abf15SRobert Mustacchi #include "ecore_sp_verbs.h"
239d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
240d14abf15SRobert Mustacchi #include "lm_vf.h"
241d14abf15SRobert Mustacchi #endif
242d14abf15SRobert Mustacchi #include "lm_stats.h"
243d14abf15SRobert Mustacchi #include "lm_dmae.h"
244d14abf15SRobert Mustacchi #if !defined(_B10KD_EXT)
245d14abf15SRobert Mustacchi #include "bcm_utils.h"
246d14abf15SRobert Mustacchi #endif
247d14abf15SRobert Mustacchi
248d14abf15SRobert Mustacchi #define EVEREST 1
249d14abf15SRobert Mustacchi
250d14abf15SRobert Mustacchi /* non rss chains - ISCSI, FCOE, FWD, ISCSI OOO */
251d14abf15SRobert Mustacchi #define MAX_NON_RSS_CHAINS (4)
252d14abf15SRobert Mustacchi
253d14abf15SRobert Mustacchi /* which of the non-rss chains need fw clients - ISCSI, FCOE*/
254d14abf15SRobert Mustacchi #define MAX_NON_RSS_FW_CLIENTS (4)
255d14abf15SRobert Mustacchi
256d14abf15SRobert Mustacchi #define MAX_ETH_REG_CONS (MAX_RSS_CHAINS + MAX_NON_RSS_CHAINS)
257d14abf15SRobert Mustacchi #define MAX_ETH_REG_CHAINS (MAX_HW_CHAINS + MAX_NON_RSS_CHAINS)
258d14abf15SRobert Mustacchi
259d14abf15SRobert Mustacchi #define MAX_ETH_CONS (MAX_ETH_REG_CONS + MAX_ETH_TX_ONLY_CONS)
260d14abf15SRobert Mustacchi #define MAX_ETH_CHAINS (MAX_ETH_REG_CHAINS + MAX_ETH_TX_ONLY_CONS)
261d14abf15SRobert Mustacchi
262d14abf15SRobert Mustacchi #ifndef VF_INVOLVED
263d14abf15SRobert Mustacchi #define MAX_VF_ETH_CONS 0
264d14abf15SRobert Mustacchi #endif
265d14abf15SRobert Mustacchi
266d14abf15SRobert Mustacchi #if defined(_VBD_) || defined (_VBD_CMD_)
267d14abf15SRobert Mustacchi #define MAX_TX_CHAIN(_pdev) (3U*LM_SB_CNT(_pdev) + MAX_NON_RSS_CHAINS)
268d14abf15SRobert Mustacchi #define MAX_RX_CHAIN(_pdev) (1U*LM_SB_CNT(_pdev) + MAX_NON_RSS_CHAINS)
269d14abf15SRobert Mustacchi #else
270d14abf15SRobert Mustacchi #define MAX_TX_CHAIN(_pdev) (MAX_ETH_CONS)
271d14abf15SRobert Mustacchi #define MAX_RX_CHAIN(_pdev) (MAX_ETH_REG_CONS)
272d14abf15SRobert Mustacchi #endif
273d14abf15SRobert Mustacchi
274d14abf15SRobert Mustacchi
275d14abf15SRobert Mustacchi #define ILT_NUM_PAGE_ENTRIES 3072
276d14abf15SRobert Mustacchi #define ILT_NUM_PAGE_ENTRIES_PER_FUNC 384
277d14abf15SRobert Mustacchi
278d14abf15SRobert Mustacchi /* According to the PCI-E Init document */
279d14abf15SRobert Mustacchi #define SEARCHER_TOTAL_MEM_REQUIRED_PER_CON 64
280d14abf15SRobert Mustacchi #define TIMERS_TOTAL_MEM_REQUIRED_PER_CON 8
281d14abf15SRobert Mustacchi #define QM_TOTAL_MEM_REQUIRED_PER_CON (32*4)
282d14abf15SRobert Mustacchi
283d14abf15SRobert Mustacchi
284d14abf15SRobert Mustacchi /* Number of bits must be 10 to 25. */
285d14abf15SRobert Mustacchi #ifndef LM_PAGE_BITS
286d14abf15SRobert Mustacchi #define LM_PAGE_BITS 12 /* 4K page. */
287d14abf15SRobert Mustacchi #endif
288d14abf15SRobert Mustacchi
289d14abf15SRobert Mustacchi #define LM_PAGE_SIZE (1 << LM_PAGE_BITS)
290d14abf15SRobert Mustacchi #define LM_PAGE_MASK (LM_PAGE_SIZE - 1)
291d14abf15SRobert Mustacchi
292d14abf15SRobert Mustacchi
293d14abf15SRobert Mustacchi /* Number of bits must be 10 to 25. */
294d14abf15SRobert Mustacchi #define LM_DQ_CID_BITS 7 /* 128 Byte page. */
295d14abf15SRobert Mustacchi
296d14abf15SRobert Mustacchi #define LM_DQ_CID_SIZE (1 << LM_DQ_CID_BITS)
297d14abf15SRobert Mustacchi #define LM_DQ_CID_MASK (LM_DQ_CID_SIZE - 1)
298d14abf15SRobert Mustacchi
299d14abf15SRobert Mustacchi #define LM_VF_DQ_CID_BITS 3 /* 8 Byte page. */
300d14abf15SRobert Mustacchi
301d14abf15SRobert Mustacchi #define LM_VF_DQ_CID_SIZE (1 << LM_VF_DQ_CID_BITS)
302d14abf15SRobert Mustacchi #define LM_VF_DQ_CID_MASK (LM_VF_DQ_CID_SIZE - 1)
303d14abf15SRobert Mustacchi
304d14abf15SRobert Mustacchi #define LM_ILT_ALIGNMENT 0x1000 /* ILT assumes pages aligned to 4K NOTE: E1 has a bug,
305d14abf15SRobert Mustacchi * in which page needs to be aligned to page-size
306d14abf15SRobert Mustacchi */
307d14abf15SRobert Mustacchi
308d14abf15SRobert Mustacchi #define LM_ILT_ALIGNMENT_MASK (LM_ILT_ALIGNMENT - 1)
309d14abf15SRobert Mustacchi
310d14abf15SRobert Mustacchi #define LM_TIMERS_SCAN_POLL 20000 /* 20 sec */
311d14abf15SRobert Mustacchi #define LM_TIMERS_SCAN_TIME 1000 /*1m*/
312d14abf15SRobert Mustacchi #define LM_UNLOAD_TIME 100000 /*100m in micros */
313d14abf15SRobert Mustacchi #if !defined(_VBD_CMD_)
314d14abf15SRobert Mustacchi #define LM_CID_RETURN_TIME 2000 /*2 sec on emulation*/
315d14abf15SRobert Mustacchi #define LM_CID_RETURN_TIME_EMUL 10000 /*10 sec on emulation*/
316d14abf15SRobert Mustacchi
317d14abf15SRobert Mustacchi #else
318d14abf15SRobert Mustacchi #define LM_CID_RETURN_TIME 0
319d14abf15SRobert Mustacchi #define LM_CID_RETURN_TIME_EMUL 0
320d14abf15SRobert Mustacchi #endif
321d14abf15SRobert Mustacchi
322d14abf15SRobert Mustacchi // TODO add for ASIC
323d14abf15SRobert Mustacchi #define LM_FREE_CID_DELAY_TIME(pdev) ((pdev)->params.l4_free_cid_delay_time)
324d14abf15SRobert Mustacchi /*
325d14abf15SRobert Mustacchi #define LM_FREE_CID_DELAY_TIME(pdev) (CHIP_REV(pdev) == CHIP_REV_FPGA || CHIP_REV(pdev) == CHIP_REV_EMUL) ? LM_CID_RETURN_TIME_EMUL : LM_CID_RETURN_TIME;
326d14abf15SRobert Mustacchi */
327d14abf15SRobert Mustacchi
328d14abf15SRobert Mustacchi #define LM_EMUL_FACTOR 2000
329d14abf15SRobert Mustacchi #define LM_FPGA_FACTOR 200
330d14abf15SRobert Mustacchi
331d14abf15SRobert Mustacchi #ifndef CACHE_LINE_SIZE_MASK
332d14abf15SRobert Mustacchi #define CACHE_LINE_SIZE_MASK 0x3f
333d14abf15SRobert Mustacchi #define CACHE_LINE_SIZE (CACHE_LINE_SIZE_MASK + 1)
334d14abf15SRobert Mustacchi #endif
335d14abf15SRobert Mustacchi
336d14abf15SRobert Mustacchi /*need to know from where can I take these values */
337d14abf15SRobert Mustacchi #define NVRAM_1MB_SIZE 0x20000 // 1M bit in bytes
338d14abf15SRobert Mustacchi #define NVRAM_PAGE_SIZE 256
339d14abf15SRobert Mustacchi
340d14abf15SRobert Mustacchi /* Number of packets per indication in calls to mm_indicate_rx/tx. */
341d14abf15SRobert Mustacchi #ifndef MAX_PACKETS_PER_INDICATION
342d14abf15SRobert Mustacchi #define MAX_PACKETS_PER_INDICATION 50
343d14abf15SRobert Mustacchi #endif
344d14abf15SRobert Mustacchi
345d14abf15SRobert Mustacchi // TODO - adjust to our needs - the limitation of the PBF
346d14abf15SRobert Mustacchi #ifndef MAX_FRAG_CNT
347d14abf15SRobert Mustacchi #define MAX_FRAG_CNT 33
348d14abf15SRobert Mustacchi #endif
349d14abf15SRobert Mustacchi #ifndef MAX_FRAG_CNT_PER_TB
350d14abf15SRobert Mustacchi /* MichalS TODO - do we want to leave it like this or calculate it according to connection params. */
351d14abf15SRobert Mustacchi #define MAX_FRAG_CNT_PER_TB 33 /* arbitrary(?) */
352d14abf15SRobert Mustacchi #endif
353d14abf15SRobert Mustacchi
354d14abf15SRobert Mustacchi /* The maximum is actually 0xffff which can be described by a BD. */
355d14abf15SRobert Mustacchi // TODO - adjust to our needs
356d14abf15SRobert Mustacchi #define MAX_FRAGMENT_SIZE 0xf000
357d14abf15SRobert Mustacchi
358d14abf15SRobert Mustacchi /* Maximum Packet Size: max jumbo frame: 9600 + ethernet-header+llc-snap+vlan+crc32 */
359d14abf15SRobert Mustacchi #define MAXIMUM_PACKET_SIZE 9632
360d14abf15SRobert Mustacchi
361d14abf15SRobert Mustacchi // TODO - adjust to our needs
362d14abf15SRobert Mustacchi /* Buffer size of the statistics block. */
363d14abf15SRobert Mustacchi #define CHIP_STATS_BUFFER_SIZE ((sizeof(statistics_block_t) + \
364d14abf15SRobert Mustacchi CACHE_LINE_SIZE_MASK) & \
365d14abf15SRobert Mustacchi ~CACHE_LINE_SIZE_MASK)
366d14abf15SRobert Mustacchi
367d14abf15SRobert Mustacchi // Status blocks type per storm - used for initialization
368d14abf15SRobert Mustacchi #define STATUS_BLOCK_INVALID_TYPE 0
369d14abf15SRobert Mustacchi #define STATUS_BLOCK_SP_SL_TYPE 1
370d14abf15SRobert Mustacchi #define STATUS_BLOCK_NORMAL_TYPE 2
371d14abf15SRobert Mustacchi #define STATUS_BLOCK_NORMAL_SL_TYPE 3
372d14abf15SRobert Mustacchi
373d14abf15SRobert Mustacchi #define LM_DEF_NO_EVENT_ACTIVE 0x00000000
374d14abf15SRobert Mustacchi #define LM_DEF_ATTN_ACTIVE (1L<<0)
375d14abf15SRobert Mustacchi #define LM_SP_ACTIVE (LM_DEF_USTORM_ACTIVE | LM_DEF_CSTORM_ACTIVE | LM_DEF_XSTORM_ACTIVE | LM_DEF_TSTORM_ACTIVE)
376d14abf15SRobert Mustacchi
377d14abf15SRobert Mustacchi #define LM_DEF_USTORM_ACTIVE (1L<<1)
378d14abf15SRobert Mustacchi #define LM_DEF_CSTORM_ACTIVE (1L<<2)
379d14abf15SRobert Mustacchi #define LM_DEF_XSTORM_ACTIVE (1L<<3)
380d14abf15SRobert Mustacchi #define LM_DEF_TSTORM_ACTIVE (1L<<4)
381d14abf15SRobert Mustacchi
382d14abf15SRobert Mustacchi #define LM_DEF_EVENT_MASK 0xffff
383d14abf15SRobert Mustacchi
384d14abf15SRobert Mustacchi #define LM_NON_DEF_USTORM_ACTIVE (1L<<16)
385d14abf15SRobert Mustacchi #define LM_NON_DEF_CSTORM_ACTIVE (1L<<17)
386d14abf15SRobert Mustacchi #define LM_NON_DEF_EVENT_MASK 0xffff0000
387d14abf15SRobert Mustacchi
388d14abf15SRobert Mustacchi #define ATTN_NIG_FOR_FUNC (1L << 8)
389d14abf15SRobert Mustacchi #define ATTN_SW_TIMER_4_FUNC (1L << 9)
390d14abf15SRobert Mustacchi #define GPIO_2_FUNC (1L << 10)
391d14abf15SRobert Mustacchi #define GPIO_3_FUNC (1L << 11)
392d14abf15SRobert Mustacchi #define GPIO_4_FUNC (1L << 12)
393d14abf15SRobert Mustacchi #define ATTN_GENERAL_ATTN_1 (1L << 13)
394d14abf15SRobert Mustacchi #define ATTN_GENERAL_ATTN_2 (1L << 14)
395d14abf15SRobert Mustacchi #define ATTN_GENERAL_ATTN_3 (1L << 15)
396d14abf15SRobert Mustacchi
397d14abf15SRobert Mustacchi #define ATTN_NIG_FOR_FUNC1 (1L << 8)
398d14abf15SRobert Mustacchi #define ATTN_SW_TIMER_4_FUNC1 (1L << 9)
399d14abf15SRobert Mustacchi #define GPIO_2_FUNC1 (1L << 10)
400d14abf15SRobert Mustacchi #define GPIO_3_FUNC1 (1L << 11)
401d14abf15SRobert Mustacchi #define GPIO_4_FUNC1 (1L << 12)
402d14abf15SRobert Mustacchi #define ATTN_GENERAL_ATTN_4 (1L << 13)
403d14abf15SRobert Mustacchi #define ATTN_GENERAL_ATTN_5 (1L << 14)
404d14abf15SRobert Mustacchi #define ATTN_GENERAL_ATTN_6 (1L << 15)
405d14abf15SRobert Mustacchi
406d14abf15SRobert Mustacchi #define ATTN_HARD_WIRED_MASK 0xff00
407d14abf15SRobert Mustacchi
408d14abf15SRobert Mustacchi #define HC_SEG_ACCESS_DEF 0 /*Driver decision 0-3*/
409d14abf15SRobert Mustacchi #define HC_SEG_ACCESS_ATTN 4
410d14abf15SRobert Mustacchi
411d14abf15SRobert Mustacchi #define HC_SEG_ACCESS_NORM 0 /*Driver decision 0-1*/
412d14abf15SRobert Mustacchi
413d14abf15SRobert Mustacchi //Buffer size of the status block. This is the same for host_def_status_block, they are the same size.
414d14abf15SRobert Mustacchi //TODO: check the cache line issue! do we need it as in Teton?
415d14abf15SRobert Mustacchi #define E2_STATUS_BLOCK_BUFFER_SIZE ((sizeof(struct host_hc_status_block_e2) + \
416d14abf15SRobert Mustacchi CACHE_LINE_SIZE_MASK) & \
417d14abf15SRobert Mustacchi ~CACHE_LINE_SIZE_MASK)
418d14abf15SRobert Mustacchi
419d14abf15SRobert Mustacchi #define E1X_STATUS_BLOCK_BUFFER_SIZE ((sizeof(struct host_hc_status_block_e1x) + \
420d14abf15SRobert Mustacchi CACHE_LINE_SIZE_MASK) & \
421d14abf15SRobert Mustacchi ~CACHE_LINE_SIZE_MASK)
422d14abf15SRobert Mustacchi
423d14abf15SRobert Mustacchi #define DEF_STATUS_BLOCK_BUFFER_SIZE ((sizeof(struct host_sp_status_block) + \
424d14abf15SRobert Mustacchi CACHE_LINE_SIZE_MASK) & \
425d14abf15SRobert Mustacchi ~CACHE_LINE_SIZE_MASK)
426d14abf15SRobert Mustacchi
427d14abf15SRobert Mustacchi /* This is the def and non-def status block ID format according to spec --> used for debugging purpose only */
428d14abf15SRobert Mustacchi #define DBG_SB_ID(port,stormID,cpuID) (((port) << 7) | ((stormID) << 5) | (cpuID))
429d14abf15SRobert Mustacchi #define DBG_DEF_SB_ID(port,stormID,vnicID) (((port) << 7) | ((stormID) << 5) | (0x10+vnicID)) /* the ID is for debugging purposes, it's not looked at by hw/fw*/
430d14abf15SRobert Mustacchi
431d14abf15SRobert Mustacchi #define SB_RX_INDEX(pdev, index) ((pdev)->vars.u_hc_ack[index])
432d14abf15SRobert Mustacchi #define SB_TX_INDEX(pdev, index) ((pdev)->vars.c_hc_ack[index])
433d14abf15SRobert Mustacchi
434d14abf15SRobert Mustacchi #define SB_INDEX_OF_USTORM(pdev, index) ((pdev)->vars.u_hc_ack[index])
435d14abf15SRobert Mustacchi //#define SB_INDEX_OF_CSTORM(pdev, index) ((pdev)->vars.c_hc_ack[index])
436d14abf15SRobert Mustacchi
437d14abf15SRobert Mustacchi #define DEF_SB_INDEX(pdev) ((pdev)->vars.hc_def_ack)
438d14abf15SRobert Mustacchi #define DEF_SB_INDEX_OF_ATTN(pdev) ((pdev)->vars.attn_def_ack)
439d14abf15SRobert Mustacchi
440d14abf15SRobert Mustacchi //_________________________________________________________________________________________________--
441d14abf15SRobert Mustacchi
442d14abf15SRobert Mustacchi #define NUM_OF_ELT_PAGES 16 // this is the size of the elt in the hw
443d14abf15SRobert Mustacchi #define DEF_STATUS_BLOCK_IGU_INDEX 16 //MAX_NDSB //this is where the default status block lies (that is VBD's static index of default status block)
444d14abf15SRobert Mustacchi #define DEF_STATUS_BLOCK_INDEX HC_SP_SB_ID //this is where the default status block lies (that is VBD's static index of default status block)
445d14abf15SRobert Mustacchi #define MAX_DYNAMIC_ATTN_GRPS 8 //this is the 8 non hard-wired groups configured by the driver (exc. PXP,NIG)
446d14abf15SRobert Mustacchi #define MAX_NUM_BAR 3 // number of bars suported by the hw 1 bar in first phase emulation
447d14abf15SRobert Mustacchi #define MAX_NUM_VF_BAR 3
448d14abf15SRobert Mustacchi
449d14abf15SRobert Mustacchi #define BAR_0 0 //index for BAR0
450d14abf15SRobert Mustacchi #define BAR_1 1 //index for BAR1
451d14abf15SRobert Mustacchi #define BAR_2 2 //index for BAR2
452d14abf15SRobert Mustacchi
453d14abf15SRobert Mustacchi /* HW RSS configuration */
454d14abf15SRobert Mustacchi #define RSS_INDIRECTION_TABLE_SIZE 0x80 /* Maximum indirection table. */
455d14abf15SRobert Mustacchi #define RSS_HASH_KEY_SIZE 0x28 /* Maximum key size. */
456d14abf15SRobert Mustacchi
457d14abf15SRobert Mustacchi /* RX BD to RX CQE size ratio */
458d14abf15SRobert Mustacchi #define LM_RX_BD_CQ_SIZE_RATIO (sizeof(union eth_rx_cqe) / sizeof(struct eth_rx_bd))
459d14abf15SRobert Mustacchi
460d14abf15SRobert Mustacchi /*******************************************************************************
461d14abf15SRobert Mustacchi * Macros.
462d14abf15SRobert Mustacchi ******************************************************************************/
463d14abf15SRobert Mustacchi #ifndef OFFSETOF
464d14abf15SRobert Mustacchi #define OFFSETOF(_s, _m) ((u32_t) PTR_SUB(&((_s *) 0)->_m, (u8_t *) 0))
465d14abf15SRobert Mustacchi #endif
466d14abf15SRobert Mustacchi #define WORD_ALIGNED_OFFSETOF(_s, _m) (OFFSETOF(_s, _m) & ~0x03)
467d14abf15SRobert Mustacchi
468d14abf15SRobert Mustacchi /* warning NOT side effect safe dont use this with CEIL_DIV( a++,b) */
469d14abf15SRobert Mustacchi #define CEIL_DIV( a, b ) ((a / b) + ( (a % b) ? 1 : 0))
470d14abf15SRobert Mustacchi
471d14abf15SRobert Mustacchi /**
472d14abf15SRobert Mustacchi * @description
473d14abf15SRobert Mustacchi * Should be moved to a common place.
474d14abf15SRobert Mustacchi * Find the next power of 2 that is larger than "num".
475d14abf15SRobert Mustacchi * @param num - The variable to find a power of 2 that is
476d14abf15SRobert Mustacchi * larger.
477d14abf15SRobert Mustacchi * @param num_bits_supported - The largest number of bits
478d14abf15SRobert Mustacchi * supported
479d14abf15SRobert Mustacchi *
480d14abf15SRobert Mustacchi * @return u32_t - The next power of 2 that is larger than
481d14abf15SRobert Mustacchi * "num".
482d14abf15SRobert Mustacchi */
483d14abf15SRobert Mustacchi u32_t upper_align_power_of_2(IN const u16_t num, IN const u8_t num_bits_supported);
484d14abf15SRobert Mustacchi
485d14abf15SRobert Mustacchi
486d14abf15SRobert Mustacchi /*
487d14abf15SRobert Mustacchi The attention lines works with the state machine below for parallel computation:
488d14abf15SRobert Mustacchi
489d14abf15SRobert Mustacchi cols: 0 1 2 3 4 5 6 7
490d14abf15SRobert Mustacchi _________________________
491d14abf15SRobert Mustacchi Attn_bits 0 0 1 1 0 0 1 1
492d14abf15SRobert Mustacchi Attn_ack 0 1 0 1 0 1 0 1
493d14abf15SRobert Mustacchi State 0 0 0 0 1 1 1 1
494d14abf15SRobert Mustacchi
495d14abf15SRobert Mustacchi cols: 0,1,6,7 - NOP
496d14abf15SRobert Mustacchi cols: 3,4 - ASSERT
497d14abf15SRobert Mustacchi cols: 2 - Assertion procedure
498d14abf15SRobert Mustacchi cols: 5 - Deassertion procedure
499d14abf15SRobert Mustacchi */
500d14abf15SRobert Mustacchi #define GET_ATTN_CHNG_GROUPS(_pdev, _attn_bits, _attn_ack, _asserted_grps_ptr, _deasserted_grps_ptr) \
501d14abf15SRobert Mustacchi { \
502d14abf15SRobert Mustacchi u16_t _state = (_pdev)->vars.attn_state; \
503d14abf15SRobert Mustacchi \
504d14abf15SRobert Mustacchi DbgBreakIf(~(_attn_bits ^ _attn_ack) & (_attn_bits ^ _state)); \
505d14abf15SRobert Mustacchi \
506d14abf15SRobert Mustacchi *(_asserted_grps_ptr) = _attn_bits & ~_attn_ack & ~_state; \
507d14abf15SRobert Mustacchi *(_deasserted_grps_ptr) = ~_attn_bits & _attn_ack & _state; \
508d14abf15SRobert Mustacchi }
509d14abf15SRobert Mustacchi
510d14abf15SRobert Mustacchi /* Finds out whether a specific unicore interrupt has caused the NIG attn to get asserted.
511d14abf15SRobert Mustacchi * If this is the case, need to adjust the portion of bits of the NIG config status interrupt register
512d14abf15SRobert Mustacchi * to the value read from the unicore interrupt register.
513d14abf15SRobert Mustacchi * We use here a "bit overwrite" instead of just a "bit flip" since the value read from the
514d14abf15SRobert Mustacchi * unicore interrupt register might be spread over more than a single bit!
515d14abf15SRobert Mustacchi */
516d14abf15SRobert Mustacchi #define HANDLE_UNICORE_INT_ASSERTED(_pdev, _nig_reg_name, _unicore_intr_val_ptr, _unicore_intr_name, _nig_status_port_ptr, _is_unicore_assrtd_ptr, _unicore_intr_size) \
517d14abf15SRobert Mustacchi { \
518d14abf15SRobert Mustacchi *(_unicore_intr_val_ptr) = REG_RD(_pdev, _nig_reg_name); \
519d14abf15SRobert Mustacchi *(_is_unicore_assrtd_ptr) = ( ( *(_unicore_intr_val_ptr) << _unicore_intr_size) ^ (*(_nig_status_port_ptr) & _unicore_intr_name)); \
520d14abf15SRobert Mustacchi \
521d14abf15SRobert Mustacchi if (*(_is_unicore_assrtd_ptr)) \
522d14abf15SRobert Mustacchi { \
523d14abf15SRobert Mustacchi DbgMessage(_pdev, WARN, "lm_handle_assertion_processing(): " #_unicore_intr_name " asserted!\n"); \
524d14abf15SRobert Mustacchi *(_nig_status_port_ptr) = (*(_nig_status_port_ptr) & ~(_unicore_intr_name)) | (*(_unicore_intr_val_ptr) << _unicore_intr_size); \
525d14abf15SRobert Mustacchi } \
526d14abf15SRobert Mustacchi }
527d14abf15SRobert Mustacchi // *(_nig_status_port_ptr) ^= ( 0x1 << _unicore_intr_size);
528d14abf15SRobert Mustacchi
529d14abf15SRobert Mustacchi
530d14abf15SRobert Mustacchi /*******************************************************************************
531d14abf15SRobert Mustacchi * Statistics.
532d14abf15SRobert Mustacchi ******************************************************************************/
533d14abf15SRobert Mustacchi typedef struct _lm_rx_statistics_t
534d14abf15SRobert Mustacchi {
535d14abf15SRobert Mustacchi u32_t aborted;
536d14abf15SRobert Mustacchi } lm_rx_stats_t;
537d14abf15SRobert Mustacchi
538d14abf15SRobert Mustacchi /*******************************************************************************
539d14abf15SRobert Mustacchi * Packet descriptor.
540d14abf15SRobert Mustacchi ******************************************************************************/
541d14abf15SRobert Mustacchi
542d14abf15SRobert Mustacchi typedef struct _lm_coalesce_buffer_t
543d14abf15SRobert Mustacchi {
544d14abf15SRobert Mustacchi s_list_entry_t link;
545d14abf15SRobert Mustacchi
546d14abf15SRobert Mustacchi u8_t *mem_virt;
547d14abf15SRobert Mustacchi u32_t buf_size;
548d14abf15SRobert Mustacchi lm_frag_list_t frags; /* coalesce buf is a frag list with 1 frag */
549d14abf15SRobert Mustacchi } lm_coalesce_buffer_t;
550d14abf15SRobert Mustacchi
551d14abf15SRobert Mustacchi typedef struct _lm_client_con_params_t
552d14abf15SRobert Mustacchi {
553d14abf15SRobert Mustacchi u32_t mtu;
554d14abf15SRobert Mustacchi u32_t lah_size;
555d14abf15SRobert Mustacchi u32_t num_rx_desc;
556d14abf15SRobert Mustacchi u32_t num_tx_desc;
557d14abf15SRobert Mustacchi u8_t attributes;
558d14abf15SRobert Mustacchi #define LM_CLIENT_ATTRIBUTES_RX (0x1)
559d14abf15SRobert Mustacchi #define LM_CLIENT_ATTRIBUTES_TPA (0x2)
560d14abf15SRobert Mustacchi #define LM_CLIENT_ATTRIBUTES_TX (0x4)
561d14abf15SRobert Mustacchi #define LM_CLIENT_ATTRIBUTES_REG_CLI (0x8)
562d14abf15SRobert Mustacchi } lm_client_con_params_t;
563d14abf15SRobert Mustacchi
564d14abf15SRobert Mustacchi typedef struct _lm_packet_t
565d14abf15SRobert Mustacchi {
566d14abf15SRobert Mustacchi /* Must be the first entry in this structure. */
567d14abf15SRobert Mustacchi s_list_entry_t link;
568d14abf15SRobert Mustacchi
569d14abf15SRobert Mustacchi lm_status_t status;
570d14abf15SRobert Mustacchi u32_t size;
571d14abf15SRobert Mustacchi
572d14abf15SRobert Mustacchi union _lm_pkt_info_t
573d14abf15SRobert Mustacchi {
574d14abf15SRobert Mustacchi struct _lm_tx_pkt_info_t
575d14abf15SRobert Mustacchi {
576d14abf15SRobert Mustacchi lm_coalesce_buffer_t *coalesce_buf;
577d14abf15SRobert Mustacchi u16_t next_bd_idx;
578d14abf15SRobert Mustacchi
579d14abf15SRobert Mustacchi u16_t bd_used;
580d14abf15SRobert Mustacchi u8_t span_pages;
581d14abf15SRobert Mustacchi u8_t _pad1;
582d14abf15SRobert Mustacchi u8_t hdr_nbds;
583d14abf15SRobert Mustacchi
584d14abf15SRobert Mustacchi u16_t reserve;
585d14abf15SRobert Mustacchi
586d14abf15SRobert Mustacchi // TODO - Do we want this stuff ????
587d14abf15SRobert Mustacchi #if DBG
588d14abf15SRobert Mustacchi struct eth_tx_bd *dbg_start_bd;
589d14abf15SRobert Mustacchi u16_t dbg_start_bd_idx;
590d14abf15SRobert Mustacchi u16_t dbg_frag_cnt;
591d14abf15SRobert Mustacchi #endif
592d14abf15SRobert Mustacchi } tx;
593d14abf15SRobert Mustacchi
594d14abf15SRobert Mustacchi struct _lm_rx_pkt_info_t
595d14abf15SRobert Mustacchi {
596d14abf15SRobert Mustacchi u16_t next_bd_idx;
597d14abf15SRobert Mustacchi u8_t qidx; // VBD mapping to RSS queue.
598d14abf15SRobert Mustacchi #define LM_MAX_SGES_FOR_PACKET 1 // TODO_QG rename to LM_MAX_FW_SGES_FOR_PACKET
599d14abf15SRobert Mustacchi lm_address_t mem_phys[1+LM_MAX_SGES_FOR_PACKET]; // arrays content:
600d14abf15SRobert Mustacchi // bd ring address[0] + sge addresses[1] (optional)
601d14abf15SRobert Mustacchi // (currently one)
602d14abf15SRobert Mustacchi u32_t* hash_val_ptr;
603d14abf15SRobert Mustacchi
604d14abf15SRobert Mustacchi #if DBG
605d14abf15SRobert Mustacchi struct eth_rx_sge *dbg_sge;
606d14abf15SRobert Mustacchi struct eth_rx_bd *dbg_bd;
607d14abf15SRobert Mustacchi #endif
608d14abf15SRobert Mustacchi union eth_sgl_or_raw_data sgl_or_raw_data; // currently used by OOO_CID. upper layer should handle endianity!
609d14abf15SRobert Mustacchi } rx;
610d14abf15SRobert Mustacchi } u1; // _lm_pkt_info_t
611d14abf15SRobert Mustacchi
612d14abf15SRobert Mustacchi lm_pkt_tx_info_t* l2pkt_tx_info;
613d14abf15SRobert Mustacchi lm_pkt_rx_info_t* l2pkt_rx_info;
614d14abf15SRobert Mustacchi
615d14abf15SRobert Mustacchi } lm_packet_t;
616d14abf15SRobert Mustacchi
617d14abf15SRobert Mustacchi DECLARE_FRAG_LIST_BUFFER_TYPE(lm_packet_frag_list_t, MAX_FRAG_CNT);
618d14abf15SRobert Mustacchi
619d14abf15SRobert Mustacchi /*******************************************************************************
620d14abf15SRobert Mustacchi * Configurable parameters for the hardware dependent module.
621d14abf15SRobert Mustacchi ******************************************************************************/
622d14abf15SRobert Mustacchi
623d14abf15SRobert Mustacchi // I only want this enum for LLFC_TRAFFIC_TYPE_MAX value (should be HSI and fixed by FW)
624d14abf15SRobert Mustacchi typedef enum _driver_traafic_type_t
625d14abf15SRobert Mustacchi {
626d14abf15SRobert Mustacchi LLFC_DRIVER_TRAFFIC_TYPE_NW = 0,
627d14abf15SRobert Mustacchi LLFC_DRIVER_TRAFFIC_TYPE_FCOE,
628d14abf15SRobert Mustacchi LLFC_DRIVER_TRAFFIC_TYPE_ISCSI,
629d14abf15SRobert Mustacchi LLFC_DRIVER_TRAFFIC_TYPE_MAX
630d14abf15SRobert Mustacchi }driver_traafic_type_t;
631d14abf15SRobert Mustacchi typedef struct _app_params_t
632d14abf15SRobert Mustacchi {
633d14abf15SRobert Mustacchi u32_t enabled;
634d14abf15SRobert Mustacchi u32_t traffic_type_priority[LLFC_DRIVER_TRAFFIC_TYPE_MAX];
635d14abf15SRobert Mustacchi }app_params_t;
636d14abf15SRobert Mustacchi //Cos DCBX params
637d14abf15SRobert Mustacchi #define DCBX_COS_MAX_NUM_E2E3A0 (ELINK_DCBX_E2E3_MAX_NUM_COS)
638d14abf15SRobert Mustacchi // This define is different than CLC, because CLC currently supports the Max number of COS
639d14abf15SRobert Mustacchi #define DCBX_COS_MAX_NUM_E3B0 (min(3,ELINK_DCBX_E3B0_MAX_NUM_COS))
640d14abf15SRobert Mustacchi #define DCBX_COS_MAX_NUM 3 //(max(DCBX_COS_MAX_NUM_E2,DCBX_COS_MAX_NUM_E3B0))
641d14abf15SRobert Mustacchi
642d14abf15SRobert Mustacchi
643d14abf15SRobert Mustacchi typedef struct _dcbx_cos_params_t
644d14abf15SRobert Mustacchi {
645d14abf15SRobert Mustacchi u32_t bw_tbl;
646d14abf15SRobert Mustacchi u32_t pri_bitmask;
647d14abf15SRobert Mustacchi u8_t s_pri;
648d14abf15SRobert Mustacchi /**
649d14abf15SRobert Mustacchi * valid values are 0 - 5. 0 is highest strict priority.
650d14abf15SRobert Mustacchi * There can't be two COS's with the same pri. *
651d14abf15SRobert Mustacchi */
652d14abf15SRobert Mustacchi #define DCBX_S_PRI_INVALID (DCBX_COS_MAX_NUM)
653d14abf15SRobert Mustacchi #define DCBX_S_PRI_COS_HIGHEST (0)
654d14abf15SRobert Mustacchi #define DCBX_S_PRI_COS_NEXT_LOWER_PRI(_sp) ((_sp) + 1)
655d14abf15SRobert Mustacchi u8_t pauseable; // This value is obsolete in CHIP_IS_E3B0
656d14abf15SRobert Mustacchi // (pdev) and is only for debugging CHIP_IS_E2E3(pdev)
657d14abf15SRobert Mustacchi }dcbx_cos_params_t;
658d14abf15SRobert Mustacchi
659d14abf15SRobert Mustacchi typedef struct _pg_params_t
660d14abf15SRobert Mustacchi {
661d14abf15SRobert Mustacchi u32_t enabled;
662d14abf15SRobert Mustacchi #define LM_DCBX_ETS_IS_ENABLED(_pdev) ((TRUE == IS_DCB_ENABLED(pdev)) && \
663d14abf15SRobert Mustacchi (TRUE == ((_pdev)->params.dcbx_port_params.ets.enabled)))
664d14abf15SRobert Mustacchi u8_t num_of_cos; //valid COS entries
665d14abf15SRobert Mustacchi dcbx_cos_params_t cos_params[DCBX_COS_MAX_NUM];
666d14abf15SRobert Mustacchi }pg_params_t;
667d14abf15SRobert Mustacchi
668d14abf15SRobert Mustacchi typedef struct _pfc_params_t
669d14abf15SRobert Mustacchi {
670d14abf15SRobert Mustacchi u32_t enabled;
671d14abf15SRobert Mustacchi u32_t priority_non_pauseable_mask;
672d14abf15SRobert Mustacchi #define LM_DCBX_PFC_PRI_NON_PAUSE_MASK(_pdev) (_pdev->params.dcbx_port_params.pfc.priority_non_pauseable_mask)
673d14abf15SRobert Mustacchi #define LM_DCBX_PFC_PRI_PAUSE_MASK(_pdev) ((u8_t)(~LM_DCBX_PFC_PRI_NON_PAUSE_MASK(_pdev)))
674d14abf15SRobert Mustacchi #define LM_DCBX_PFC_PRI_MASK (0xFF)
675d14abf15SRobert Mustacchi #define LM_DCBX_PFC_PRI_GET_PAUSE(_pdev,_pg_pri) (_pg_pri & LM_DCBX_PFC_PRI_PAUSE_MASK(_pdev))
676d14abf15SRobert Mustacchi #define LM_DCBX_PFC_PRI_GET_NON_PAUSE(_pdev,_pg_pri) (LM_DCBX_PFC_PRI_NON_PAUSE_MASK(_pdev) & _pg_pri)
677d14abf15SRobert Mustacchi #define LM_DCBX_IS_PFC_PRI_SOME_PAUSE(_pdev,_pg_pri) (0 != LM_DCBX_PFC_PRI_GET_PAUSE(_pdev,_pg_pri))
678d14abf15SRobert Mustacchi #define LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(_pdev,_pg_pri) (_pg_pri == LM_DCBX_PFC_PRI_GET_PAUSE(_pdev,_pg_pri))
679d14abf15SRobert Mustacchi #define LM_DCBX_IS_PFC_PRI_ONLY_NON_PAUSE(_pdev,_pg_pri) (_pg_pri == LM_DCBX_PFC_PRI_GET_NON_PAUSE(_pdev,_pg_pri))
680d14abf15SRobert Mustacchi #define LM_DCBX_IS_PFC_PRI_MIX_PAUSE(_pdev,_pg_pri) (!(LM_DCBX_IS_PFC_PRI_ONLY_NON_PAUSE(_pdev,_pg_pri) || \
681d14abf15SRobert Mustacchi LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(_pdev,_pg_pri)))
682d14abf15SRobert Mustacchi }pfc_params_t;
683d14abf15SRobert Mustacchi
684d14abf15SRobert Mustacchi typedef struct _dcbx_port_params_t
685d14abf15SRobert Mustacchi {
686d14abf15SRobert Mustacchi u32_t dcbx_enabled;
687d14abf15SRobert Mustacchi pfc_params_t pfc;
688d14abf15SRobert Mustacchi pg_params_t ets;
689d14abf15SRobert Mustacchi app_params_t app;
690d14abf15SRobert Mustacchi }dcbx_port_params_t;
691d14abf15SRobert Mustacchi
692d14abf15SRobert Mustacchi
693d14abf15SRobert Mustacchi typedef enum
694d14abf15SRobert Mustacchi {
695d14abf15SRobert Mustacchi DCBX_READ_LOCAL_MIB,
696d14abf15SRobert Mustacchi DCBX_READ_REMOTE_MIB
697d14abf15SRobert Mustacchi }dcbx_read_mib_type;
698d14abf15SRobert Mustacchi
699d14abf15SRobert Mustacchi typedef enum
700d14abf15SRobert Mustacchi {
701d14abf15SRobert Mustacchi DCBX_UPDATE_TASK_STATE_FREE,
702d14abf15SRobert Mustacchi DCBX_UPDATE_TASK_STATE_SCHEDULE,
703d14abf15SRobert Mustacchi DCBX_UPDATE_TASK_STATE_HANDLED
704d14abf15SRobert Mustacchi } dcbx_update_task_state;
705d14abf15SRobert Mustacchi
706d14abf15SRobert Mustacchi typedef enum
707d14abf15SRobert Mustacchi {
708d14abf15SRobert Mustacchi LM_SINGLE_SM = 0, /* default */
709d14abf15SRobert Mustacchi LM_DOUBLE_SM_SINGLE_IGU = 1,
710d14abf15SRobert Mustacchi LM_DOUBLE_SM_DOUBLE_IGU = 2
711d14abf15SRobert Mustacchi } fw_ndsb_type;
712d14abf15SRobert Mustacchi
713d14abf15SRobert Mustacchi typedef enum
714d14abf15SRobert Mustacchi {
715d14abf15SRobert Mustacchi LM_COS_MODE_COS3 = 0,
716d14abf15SRobert Mustacchi LM_COS_MODE_COS6 = 1
717d14abf15SRobert Mustacchi } lm_cos_modes ;
718d14abf15SRobert Mustacchi
719d14abf15SRobert Mustacchi typedef enum
720d14abf15SRobert Mustacchi {
721d14abf15SRobert Mustacchi LM_COS_MODE_OVERRIDE = 0,
722d14abf15SRobert Mustacchi LM_COS_MODE_STATIC = 1
723d14abf15SRobert Mustacchi } lm_network_cos_modes ;
724d14abf15SRobert Mustacchi
725d14abf15SRobert Mustacchi
726d14abf15SRobert Mustacchi typedef enum
727d14abf15SRobert Mustacchi {
728d14abf15SRobert Mustacchi LM_AUTOGREEEN_DISABLED = 0,
729d14abf15SRobert Mustacchi LM_AUTOGREEEN_ENABLED = 1,
730d14abf15SRobert Mustacchi LM_AUTOGREEEN_NVRAM = 2
731d14abf15SRobert Mustacchi } lm_autogreeen_t ;
732d14abf15SRobert Mustacchi
733d14abf15SRobert Mustacchi /*** This i2c section should be in common .h file with EMC... ***/
734d14abf15SRobert Mustacchi
735d14abf15SRobert Mustacchi #define I2C_BINARY_SIZE 256
736d14abf15SRobert Mustacchi #define I2C_A2_DYNAMIC_OFFSET 0
737d14abf15SRobert Mustacchi #define I2C_A2_DYNAMIC_SIZE 128
738d14abf15SRobert Mustacchi
739d14abf15SRobert Mustacchi #define I2C_A2_STATIC_OFFSET 128
740d14abf15SRobert Mustacchi #define I2C_A2_STATIC_SIZE 128
741d14abf15SRobert Mustacchi
742d14abf15SRobert Mustacchi typedef enum
743d14abf15SRobert Mustacchi {
744d14abf15SRobert Mustacchi I2C_SECTION_A0 = 0,
745d14abf15SRobert Mustacchi I2C_SECTION_A2 = 1,
746d14abf15SRobert Mustacchi I2C_SECTION_MAX = 2
747d14abf15SRobert Mustacchi } i2c_section_t;
748d14abf15SRobert Mustacchi
749d14abf15SRobert Mustacchi typedef struct _i2c_binary_info_t
750d14abf15SRobert Mustacchi {
751d14abf15SRobert Mustacchi u32_t last_query_status[I2C_SECTION_MAX];
752d14abf15SRobert Mustacchi u64_t last_query_ts;
753d14abf15SRobert Mustacchi u32_t reserved[10];
754d14abf15SRobert Mustacchi u8_t ax_data[I2C_SECTION_MAX][I2C_BINARY_SIZE];
755d14abf15SRobert Mustacchi } i2c_binary_info_t;
756d14abf15SRobert Mustacchi
757d14abf15SRobert Mustacchi /*** This i2c section should be in common .h file with EMC... ***/
758d14abf15SRobert Mustacchi
759d14abf15SRobert Mustacchi typedef struct _lm_params_t
760d14abf15SRobert Mustacchi {
761d14abf15SRobert Mustacchi /* This value is used by the upper module to inform the protocol
762d14abf15SRobert Mustacchi * of the maximum transmit/receive packet size. Packet size
763d14abf15SRobert Mustacchi * ranges from 1500-9600 bytes. This value does not include ETH_PACKET_LEN, LLC-SNAP, VLAN tag, CRC32
764d14abf15SRobert Mustacchi */
765d14abf15SRobert Mustacchi u32_t mtu[LM_CLI_IDX_MAX];
766d14abf15SRobert Mustacchi #define LM_MTU_INVALID_VALUE (0xFFFFFFFF)
767d14abf15SRobert Mustacchi u32_t mtu_max;
768d14abf15SRobert Mustacchi
769d14abf15SRobert Mustacchi #define MAX_CLI_PACKET_SIZE(pdev, chain_idx) ((u16_t)(pdev)->params.l2_cli_con_params[(chain_idx)].mtu + (pdev)->params.rcv_buffer_offset + ETHERNET_PACKET_HEADER_SIZE+ ETHERNET_VLAN_TAG_SIZE + ETHERNET_LLC_SNAP_SIZE + CACHE_LINE_SIZE)
770d14abf15SRobert Mustacchi #define CLI_MTU_WITH_ETH_HDR_SIZE(pdev, chain_idx) ((u16_t)(pdev)->params.l2_cli_con_params[(chain_idx)].mtu + ETHERNET_PACKET_HEADER_SIZE)
771d14abf15SRobert Mustacchi #define MAX_L2_CLI_BUFFER_SIZE(pdev, chain_idx) ((MAX_CLI_PACKET_SIZE(pdev, chain_idx) + CACHE_LINE_SIZE_MASK) & \
772d14abf15SRobert Mustacchi ~CACHE_LINE_SIZE_MASK)
773d14abf15SRobert Mustacchi
774d14abf15SRobert Mustacchi #define LM_MTU_NDIS_DEFAULT (1500)
775d14abf15SRobert Mustacchi #define LM_MTU_ISCSI_DEFAULT (1500)
776d14abf15SRobert Mustacchi #define LM_MTU_FCOE_DEFAULT (2500)
777d14abf15SRobert Mustacchi #define LM_MTU_FWD_DEFAULT (LM_MTU_NDIS_DEFAULT)
778d14abf15SRobert Mustacchi
779d14abf15SRobert Mustacchi #define LM_MTU_FLOW_CTRL_TX_THR (5000)
780d14abf15SRobert Mustacchi #define LM_MTU_MAX_DEFAULT (1500)
781d14abf15SRobert Mustacchi #define LM_MTU_MAX (9600)
782d14abf15SRobert Mustacchi /* Current node address. The MAC address is initially set to the
783d14abf15SRobert Mustacchi * hardware address. This entry can be modified to allow the driver
784d14abf15SRobert Mustacchi * to override the default MAC address. The new MAC address takes
785d14abf15SRobert Mustacchi * effect after a driver reset. */
786d14abf15SRobert Mustacchi u8_t mac_addr[8];
787d14abf15SRobert Mustacchi
788d14abf15SRobert Mustacchi /* parameters for tx/rx chians.
789d14abf15SRobert Mustacchi 1 for all rss chains, and 1 more for each non-rss chain */
790d14abf15SRobert Mustacchi u32_t l2_rx_desc_cnt[1+MAX_NON_RSS_CHAINS];
791d14abf15SRobert Mustacchi u32_t l2_tx_bd_page_cnt[1+MAX_NON_RSS_CHAINS];
792d14abf15SRobert Mustacchi u32_t l2_tx_coal_buf_cnt[1+MAX_NON_RSS_CHAINS];
793d14abf15SRobert Mustacchi lm_client_con_params_t l2_cli_con_params[3*MAX_HW_CHAINS + MAX_NON_RSS_CHAINS];
794d14abf15SRobert Mustacchi
795d14abf15SRobert Mustacchi /* All the L2 receive buffers start at a cache line size aligned
796d14abf15SRobert Mustacchi * address. This value determines the location of the L2 frame header
797d14abf15SRobert Mustacchi * from the beginning of the receive buffer. */
798d14abf15SRobert Mustacchi u32_t rcv_buffer_offset;
799d14abf15SRobert Mustacchi
800d14abf15SRobert Mustacchi /* network type for defintion of max cwnd */
801d14abf15SRobert Mustacchi u32_t network_type;
802d14abf15SRobert Mustacchi #define LM_NETOWRK_TYPE_LAN 0
803d14abf15SRobert Mustacchi #define LM_NETOWRK_TYPE_WAN 1
804d14abf15SRobert Mustacchi #define LM_NETOWRK_TYPE_AUTO 2 /* Linux only */
805d14abf15SRobert Mustacchi u32_t max_cwnd_wan;
806d14abf15SRobert Mustacchi u32_t max_cwnd_lan;
807d14abf15SRobert Mustacchi
808d14abf15SRobert Mustacchi u32_t cid_allocation_mode;
809d14abf15SRobert Mustacchi #define LM_CID_ALLOC_REGULAR 1
810d14abf15SRobert Mustacchi #define LM_CID_ALLOC_DELAY 2 /* delay cid allocation when there are no free cids but there are
811d14abf15SRobert Mustacchi * cids pending allocation */
812d14abf15SRobert Mustacchi #define LM_CID_ALLOC_NUM_MODES 2
813d14abf15SRobert Mustacchi
814d14abf15SRobert Mustacchi
815d14abf15SRobert Mustacchi u32_t ndsb_type;
816d14abf15SRobert Mustacchi
817d14abf15SRobert Mustacchi u32_t int_coalesing_mode;
818d14abf15SRobert Mustacchi #define LM_INT_COAL_NONE 0
819d14abf15SRobert Mustacchi #define LM_INT_COAL_PERIODIC_SYNC 1 /* default */
820d14abf15SRobert Mustacchi #define LM_INT_COAL_NUM_MODES 2
821d14abf15SRobert Mustacchi u32_t int_per_sec_rx_override;
822d14abf15SRobert Mustacchi u32_t int_per_sec_rx[HC_USTORM_SB_NUM_INDICES];
823d14abf15SRobert Mustacchi u32_t int_per_sec_tx_override;
824d14abf15SRobert Mustacchi u32_t int_per_sec_tx[HC_CSTORM_SB_NUM_INDICES];
825d14abf15SRobert Mustacchi
826d14abf15SRobert Mustacchi /* VF interrupt moderation (Low, Medium, High) parameters */
827d14abf15SRobert Mustacchi u32_t vf_int_per_sec_rx[3];
828d14abf15SRobert Mustacchi u32_t vf_int_per_sec_tx[3];
829d14abf15SRobert Mustacchi #define LM_VF_INT_LOW_IDX 0
830d14abf15SRobert Mustacchi #define LM_VF_INT_MEDIUM_IDX 1
831d14abf15SRobert Mustacchi #define LM_VF_INT_HIGH_IDX 2
832d14abf15SRobert Mustacchi /* all protocols dynamic coalescing params */
833d14abf15SRobert Mustacchi u32_t enable_dynamic_hc[HC_DHC_SB_NUM_INDICES];
834d14abf15SRobert Mustacchi u32_t hc_timeout0[2][HC_DHC_SB_NUM_INDICES];
835d14abf15SRobert Mustacchi u32_t hc_timeout1[2][HC_DHC_SB_NUM_INDICES];
836d14abf15SRobert Mustacchi u32_t hc_timeout2[2][HC_DHC_SB_NUM_INDICES];
837d14abf15SRobert Mustacchi u32_t hc_timeout3[2][HC_DHC_SB_NUM_INDICES];
838d14abf15SRobert Mustacchi u32_t hc_threshold0[2];
839d14abf15SRobert Mustacchi u32_t hc_threshold1[2];
840d14abf15SRobert Mustacchi u32_t hc_threshold2[2];
841d14abf15SRobert Mustacchi u32_t l2_dynamic_hc_min_bytes_per_packet;
842d14abf15SRobert Mustacchi u32_t l4_hc_scaling_factor;
843d14abf15SRobert Mustacchi
844d14abf15SRobert Mustacchi u32_t l4_hc_ustorm_thresh;
845d14abf15SRobert Mustacchi u32_t l4_scq_page_cnt;
846d14abf15SRobert Mustacchi u32_t l4_rcq_page_cnt;
847d14abf15SRobert Mustacchi u32_t l4_grq_page_cnt;
848d14abf15SRobert Mustacchi u32_t l4_preallocate_cnt;
849d14abf15SRobert Mustacchi u32_t l4_preallocate_blk_size;
850d14abf15SRobert Mustacchi u32_t l4_preallocate_retry_cnt;
851d14abf15SRobert Mustacchi
852d14abf15SRobert Mustacchi #if defined(_VBD_) || defined(_VBD_CMD_)
853d14abf15SRobert Mustacchi #define NUM_BUFS_FOR_GRQS(pdev) \
854d14abf15SRobert Mustacchi (pdev)->params.l4_grq_page_cnt*512*(LM_TOE_RSS_CHAIN_CNT(pdev))
855d14abf15SRobert Mustacchi #else
856d14abf15SRobert Mustacchi #define NUM_BUFS_FOR_GRQS(pdev) \
857d14abf15SRobert Mustacchi (pdev)->params.l4_grq_page_cnt*512*1
858d14abf15SRobert Mustacchi #endif
859d14abf15SRobert Mustacchi // #define NUM_BUFS_FOR_GRQS(pdev)
860d14abf15SRobert Mustacchi // (pdev)->params.l4_grq_page_cnt*512*(LM_TOE_RSS_CHAIN_CNT(pdev))
861d14abf15SRobert Mustacchi
862d14abf15SRobert Mustacchi u32_t l4_tx_chain_page_cnt;
863d14abf15SRobert Mustacchi u32_t l4_rx_chain_page_cnt;
864d14abf15SRobert Mustacchi u32_t l4_gen_buf_size; /* minimum size of generic buffer */
865d14abf15SRobert Mustacchi u32_t l4_history_cqe_cnt; /* how much history to save */
866d14abf15SRobert Mustacchi
867d14abf15SRobert Mustacchi /* DCA Related params */
868d14abf15SRobert Mustacchi u32_t l4_ignore_grq_push_enabled; /* Configuration passed to fw whether to ignore push on grq or not */
869d14abf15SRobert Mustacchi
870d14abf15SRobert Mustacchi u32_t l4cli_flags; /* such as LLC_SNAP*/
871d14abf15SRobert Mustacchi u32_t l4cli_ticks_per_second;
872d14abf15SRobert Mustacchi u32_t l4cli_ack_frequency;
873d14abf15SRobert Mustacchi u32_t l4cli_delayed_ack_ticks;
874d14abf15SRobert Mustacchi u32_t l4cli_max_retx;
875d14abf15SRobert Mustacchi u32_t l4cli_doubt_reachability_retx;
876d14abf15SRobert Mustacchi u32_t l4cli_sws_prevention_ticks;
877d14abf15SRobert Mustacchi u32_t l4cli_dup_ack_threshold;
878d14abf15SRobert Mustacchi u32_t l4cli_push_ticks;
879d14abf15SRobert Mustacchi u32_t l4cli_nce_stale_ticks;
880d14abf15SRobert Mustacchi u32_t l4cli_starting_ip_id;
881d14abf15SRobert Mustacchi
882d14abf15SRobert Mustacchi /* Various test/debug modes. Any validation failure will cause the
883d14abf15SRobert Mustacchi * driver to write to misc.swap_diag0 with the corresponding flag.
884d14abf15SRobert Mustacchi * The intention is to trigger the bus analyzer. */
885d14abf15SRobert Mustacchi // TODO - adjust to our needs
886d14abf15SRobert Mustacchi u32_t test_mode;
887d14abf15SRobert Mustacchi #define TEST_MODE_DISABLED 0x00
888d14abf15SRobert Mustacchi #define TEST_MODE_OBSOLETE_0 0x01 /* was TEST_MODE_IKOS */
889d14abf15SRobert Mustacchi #define TEST_MODE_OBSOLETE_1 0x02 /* was TEST_MODE_FPGA */
890d14abf15SRobert Mustacchi #define TEST_MODE_VERIFY_RX_CRC 0x10
891d14abf15SRobert Mustacchi #define TEST_MODE_RX_BD_TAGGING 0x20
892d14abf15SRobert Mustacchi #define TEST_MODE_TX_BD_TAGGING 0x40
893d14abf15SRobert Mustacchi #define TEST_MODE_LOG_REG_ACCESS 0x80
894d14abf15SRobert Mustacchi #define TEST_MODE_SAVE_DUMMY_DMA_DATA 0x0100
895d14abf15SRobert Mustacchi #define TEST_MODE_INIT_GEN_BUF_DATA 0x0200
896d14abf15SRobert Mustacchi #define TEST_MODE_DRIVER_PULSE_ALWAYS_ALIVE 0x0400
897d14abf15SRobert Mustacchi #define TEST_MODE_IGNORE_SHMEM_SIGNATURE 0x0800
898d14abf15SRobert Mustacchi #define TEST_MODE_NO_MCP 0x1000
899d14abf15SRobert Mustacchi
900d14abf15SRobert Mustacchi lm_offload_t ofld_cap;
901d14abf15SRobert Mustacchi lm_offload_t ofld_cap_to_ndis;
902d14abf15SRobert Mustacchi
903d14abf15SRobert Mustacchi lm_wake_up_mode_t wol_cap;
904d14abf15SRobert Mustacchi
905d14abf15SRobert Mustacchi lm_flow_control_t flow_ctrl_cap;
906d14abf15SRobert Mustacchi lm_eee_policy_t eee_policy;
907d14abf15SRobert Mustacchi lm_medium_t req_medium;
908d14abf15SRobert Mustacchi
909d14abf15SRobert Mustacchi u32_t selective_autoneg;
910d14abf15SRobert Mustacchi #define SELECTIVE_AUTONEG_OFF 0
911d14abf15SRobert Mustacchi #define SELECTIVE_AUTONEG_SINGLE_SPEED 1
912d14abf15SRobert Mustacchi #define SELECTIVE_AUTONEG_ENABLE_SLOWER_SPEEDS 2
913d14abf15SRobert Mustacchi
914d14abf15SRobert Mustacchi u32_t wire_speed; /* Not valid on SERDES. */
915d14abf15SRobert Mustacchi
916d14abf15SRobert Mustacchi /* Ways for the MAC to determine a link change. */
917d14abf15SRobert Mustacchi u32_t phy_int_mode;
918d14abf15SRobert Mustacchi #define PHY_INT_MODE_AUTO 0
919d14abf15SRobert Mustacchi #define PHY_INT_MODE_MI_INTERRUPT 1
920d14abf15SRobert Mustacchi #define PHY_INT_MODE_LINK_READY 2
921d14abf15SRobert Mustacchi #define PHY_INT_MODE_AUTO_POLLING 3
922d14abf15SRobert Mustacchi
923d14abf15SRobert Mustacchi /* Ways for the driver to get the link change event. */
924d14abf15SRobert Mustacchi u32_t link_chng_mode;
925d14abf15SRobert Mustacchi #define LINK_CHNG_MODE_AUTO 0
926d14abf15SRobert Mustacchi #define LINK_CHNG_MODE_USE_STATUS_REG 1
927d14abf15SRobert Mustacchi #define LINK_CHNG_MODE_USE_STATUS_BLOCK 2
928d14abf15SRobert Mustacchi
929d14abf15SRobert Mustacchi /* Ways for the driver to determine which phy to prefer in case of dual media. */
930d14abf15SRobert Mustacchi u32_t phy_priority_mode;
931d14abf15SRobert Mustacchi #define PHY_PRIORITY_MODE_HW_DEF 0
932d14abf15SRobert Mustacchi #define PHY_PRIORITY_MODE_10GBASET 1
933d14abf15SRobert Mustacchi #define PHY_PRIORITY_MODE_SERDES 2
934d14abf15SRobert Mustacchi #define PHY_PRIORITY_MODE_HW_PIN 3
935d14abf15SRobert Mustacchi
936d14abf15SRobert Mustacchi u32_t interrupt_mode; /* initialized by um to state whether we are using MSI-X or not, determined after we receive resources from OS */
937d14abf15SRobert Mustacchi #define LM_INT_MODE_INTA 0
938d14abf15SRobert Mustacchi #define LM_INT_MODE_SIMD 1 /* Single ISR / Multiple DPC */
939d14abf15SRobert Mustacchi #define LM_INT_MODE_MIMD 2 /* Multiple ISR / Multple DPC */
940d14abf15SRobert Mustacchi
941d14abf15SRobert Mustacchi /* Relevant only for E2, and defines how the igu will be worked with (via GRC / BAR). Default will be set to BAR,
942d14abf15SRobert Mustacchi * the defines for this are INTR_BLK_ACCESS_GRC, INTR_BLK_ACCESS_IGUMEM */
943d14abf15SRobert Mustacchi u32_t igu_access_mode;
944d14abf15SRobert Mustacchi
945d14abf15SRobert Mustacchi u32_t sw_config;
946d14abf15SRobert Mustacchi #define LM_SWCFG_1G 0
947d14abf15SRobert Mustacchi #define LM_SWCFG_10G 1
948d14abf15SRobert Mustacchi #define LM_SWCFG_AD 2
949d14abf15SRobert Mustacchi #define LM_SWCFG_OT_AD 3
950d14abf15SRobert Mustacchi #define LM_SWCFG_HW_DEF 4
951d14abf15SRobert Mustacchi
952d14abf15SRobert Mustacchi u8_t mf_mode; //use enum mf_mode
953d14abf15SRobert Mustacchi u8_t sd_mode;
954d14abf15SRobert Mustacchi u8_t pad[2];
955*9b622488SToomas Soome
956d14abf15SRobert Mustacchi #define IS_MF_AFEX(_pdev) IS_MF_AFEX_MODE(_pdev)
957d14abf15SRobert Mustacchi #define IS_MF_AFEX_MODE(_pdev) (IS_MULTI_VNIC(_pdev) && ((_pdev)->params.mf_mode == MULTI_FUNCTION_AFEX))
958d14abf15SRobert Mustacchi #define IS_MF_SI_MODE(_pdev) (IS_MULTI_VNIC(_pdev) && ((_pdev)->params.mf_mode == MULTI_FUNCTION_SI))
959d14abf15SRobert Mustacchi #define IS_MF_SD_MODE(_pdev) (IS_MULTI_VNIC(_pdev) && ((_pdev)->params.mf_mode == MULTI_FUNCTION_SD))
960d14abf15SRobert Mustacchi #define IS_SD_REGULAR_MODE(_pdev) (IS_MF_SD_MODE(_pdev) && ((_pdev)->params.sd_mode == SD_REGULAR_MODE))
961d14abf15SRobert Mustacchi #define IS_SD_UFP_MODE(_pdev) (IS_MF_SD_MODE(_pdev) && ((_pdev)->params.sd_mode == SD_UFP_MODE))
962d14abf15SRobert Mustacchi #define IS_SD_BD_MODE(_pdev) (IS_MF_SD_MODE(_pdev) && ((_pdev)->params.sd_mode == SD_BD_MODE))
963d14abf15SRobert Mustacchi
964d14abf15SRobert Mustacchi lm_autogreeen_t autogreeen; // autogrEEEn support
965d14abf15SRobert Mustacchi
966d14abf15SRobert Mustacchi u32_t tmr_reload_value1;
967d14abf15SRobert Mustacchi
968d14abf15SRobert Mustacchi u32_t max_func_connections; // Number of connection supported by this function.
969d14abf15SRobert Mustacchi /* TODO: init max_toe/max_rdma from somewhere else should come from licence info */
970d14abf15SRobert Mustacchi u32_t max_supported_toe_cons;
971d14abf15SRobert Mustacchi u32_t max_func_toe_cons; // Number of TOE connections supported
972d14abf15SRobert Mustacchi u32_t max_func_rdma_cons; // Number of RDMA connections supported
973d14abf15SRobert Mustacchi u32_t max_func_iscsi_cons; // Number of iSCSI connections supported
974d14abf15SRobert Mustacchi u32_t max_func_fcoe_cons; // Number of FCoE connections supported
975d14abf15SRobert Mustacchi u32_t max_fcoe_task; // Number of FCoE max_fcoe_exchanges
976d14abf15SRobert Mustacchi u32_t max_eth_including_vfs_conns;
977d14abf15SRobert Mustacchi u32_t context_line_size; //Size of the context as configured in the CDU.
978d14abf15SRobert Mustacchi u32_t context_waste_size; // Waste size as configured in the CDU.
979d14abf15SRobert Mustacchi u32_t num_context_in_page;
980d14abf15SRobert Mustacchi u32_t client_page_size; // Client memory page size.
981d14abf15SRobert Mustacchi u32_t elt_page_size; // ELT page size.
982d14abf15SRobert Mustacchi u32_t ilt_client_page_size; // ILT clients page size. We will give all client same page size. All ports as well.
983d14abf15SRobert Mustacchi u32_t cfc_last_lcid; // number of supported connections in CFC - 1
984d14abf15SRobert Mustacchi u32_t bandwidth_min; //The last value of min CMNG bandwidth configured by BACS
985d14abf15SRobert Mustacchi u32_t bandwidth_max; //The last value of max CMNG bandwidth configured by BACS
986d14abf15SRobert Mustacchi
987d14abf15SRobert Mustacchi /* vnic parameters */
988d14abf15SRobert Mustacchi /* Relative Function Number */
989d14abf15SRobert Mustacchi u8_t pfunc_rel;
990d14abf15SRobert Mustacchi #define PORT_ID_PARAM_FUNC_REL(_pfunc_rel) ((_pfunc_rel) & 1) //0 or 1
991d14abf15SRobert Mustacchi #define PORT_ID_PARAM_FUNC_ABS(_chip_num, _port_mode, _pfunc_abs) (lm_get_port_id_from_func_abs(_chip_num, _port_mode, _pfunc_abs)) //0 or 1
992d14abf15SRobert Mustacchi #define PORT_ID(pdev) (PORT_ID_PARAM_FUNC_REL(PFDEV(pdev)->params.pfunc_rel)) //0 or 1
993d14abf15SRobert Mustacchi #define FUNC_ID(pdev) (PFDEV(pdev)->params.pfunc_rel) //0-7
994d14abf15SRobert Mustacchi #define VNIC_ID_PARAM_FUNC_REL(_pfunc_rel) ((_pfunc_rel) >> 1) //0, 1, 2 or 3
995d14abf15SRobert Mustacchi #define VNIC_ID(pdev) (VNIC_ID_PARAM_FUNC_REL(PFDEV(pdev)->params.pfunc_rel)) //0, 1, 2 or 3
996d14abf15SRobert Mustacchi #define LM_FOREACH_FUNC_IN_PORT(pdev, func) \
997d14abf15SRobert Mustacchi for ((func) = PORT_ID(pdev); (func) < E1H_FUNC_MAX; (func)+=2)
998d14abf15SRobert Mustacchi
999d14abf15SRobert Mustacchi #define LM_PFS_PER_PORT(pdev) \
1000d14abf15SRobert Mustacchi ((LM_CHIP_PORT_MODE_4 == CHIP_PORT_MODE(pdev)) ? 2 : 4 )
1001d14abf15SRobert Mustacchi
1002d14abf15SRobert Mustacchi #define LM_FIRST_ABS_FUNC_IN_PORT(pdev) \
1003d14abf15SRobert Mustacchi ((LM_CHIP_PORT_MODE_NONE == CHIP_PORT_MODE(pdev))? PORT_ID(pdev) : (PATH_ID(pdev)+2*PORT_ID(pdev)))
1004d14abf15SRobert Mustacchi
1005d14abf15SRobert Mustacchi #define LM_FOREACH_ABS_FUNC_IN_PORT(pdev, func) \
1006d14abf15SRobert Mustacchi for ( (func) = LM_FIRST_ABS_FUNC_IN_PORT(pdev) ; (func) < MAX_FUNC_NUM; (func) += (MAX_FUNC_NUM/LM_PFS_PER_PORT(pdev)) )
1007d14abf15SRobert Mustacchi
1008d14abf15SRobert Mustacchi
1009d14abf15SRobert Mustacchi #define FUNC_MAILBOX_ID_PARAM(_port,_vnic,_chip_num, _port_mode) ((_port) + (_vnic) * ((CHIP_IS_E1x_PARAM(_chip_num) || (_port_mode == LM_CHIP_PORT_MODE_4))? 2 : 1))
1010d14abf15SRobert Mustacchi #define FUNC_MAILBOX_ID(pdev) (FUNC_MAILBOX_ID_PARAM(PORT_ID(pdev) ,VNIC_ID(pdev),CHIP_NUM(pdev), CHIP_PORT_MODE(pdev)))
1011d14abf15SRobert Mustacchi /* Absolute Function Number */
1012d14abf15SRobert Mustacchi u8_t pfunc_abs;
1013d14abf15SRobert Mustacchi #define ABS_FUNC_ID(pdev) (PFDEV(pdev)->params.pfunc_abs)
1014d14abf15SRobert Mustacchi #define LM_FOREACH_FUNC_MAILBOX_IN_PORT(pdev, func) \
1015d14abf15SRobert Mustacchi for ((func) = PORT_ID(pdev); (func) < (CHIP_IS_E1x(pdev) ? E1H_FUNC_MAX : E2_FUNC_MAX); (func)+= (CHIP_IS_E1x(pdev) ? 2 : 1))
1016d14abf15SRobert Mustacchi u8_t path_id;
1017d14abf15SRobert Mustacchi #define PATH_ID(pdev) (PFDEV(pdev)->params.path_id)
1018d14abf15SRobert Mustacchi
1019d14abf15SRobert Mustacchi #define SHMEM_BASE(pdev) (pdev->hw_info.shmem_base)
1020d14abf15SRobert Mustacchi
1021d14abf15SRobert Mustacchi u8_t vnics_per_port; //1, 2 or 4
1022d14abf15SRobert Mustacchi u8_t multi_vnics_mode; //flag for multi function mode (can be set even if vnics_per_port==1)
1023d14abf15SRobert Mustacchi u8_t path_has_ovlan; // The multi function mode in the path (can be different than the mutli-function-mode of the function (4-port MF / SF mode E3 only)
1024d14abf15SRobert Mustacchi u8_t pfunc_mb_id; // this is for shmem mail box id and currently doesn't support flows which are not mcp send/recv command
1025d14abf15SRobert Mustacchi u8_t _pad;
1026d14abf15SRobert Mustacchi
1027d14abf15SRobert Mustacchi #define IS_MULTI_VNIC(pdev) (PFDEV(pdev)->params.multi_vnics_mode)
1028d14abf15SRobert Mustacchi #define VNICS_PER_PORT(pdev) (PFDEV(pdev)->params.vnics_per_port)
1029d14abf15SRobert Mustacchi #define VNICS_PER_PATH(pdev) (PFDEV(pdev)->params.vnics_per_port * ((LM_CHIP_PORT_MODE_4 == CHIP_PORT_MODE(pdev))? 2 : 1 ))
1030d14abf15SRobert Mustacchi
1031d14abf15SRobert Mustacchi u16_t ovlan; //vnic outer vlan
1032d14abf15SRobert Mustacchi u16_t sd_vlan_eth_type;
1033d14abf15SRobert Mustacchi
1034d14abf15SRobert Mustacchi /** 32-bit aligned **/
1035d14abf15SRobert Mustacchi // min max bw
1036d14abf15SRobert Mustacchi u8_t min_bw[MAX_VNIC_NUM];
1037d14abf15SRobert Mustacchi u8_t max_bw[MAX_VNIC_NUM];
1038d14abf15SRobert Mustacchi
1039d14abf15SRobert Mustacchi /* 32 bit aligned. */
1040d14abf15SRobert Mustacchi
1041d14abf15SRobert Mustacchi /* Status-Block-Related. Status blocks */
1042d14abf15SRobert Mustacchi u8_t sb_cnt; //number of vnic's non-default status blocks (16, 8 or 4)
1043d14abf15SRobert Mustacchi #define LM_SB_CNT(pdev) ((pdev)->params.sb_cnt)
1044d14abf15SRobert Mustacchi #ifdef _VBD_
1045d14abf15SRobert Mustacchi #define LM_NON_RSS_SB(pdev) (LM_SB_CNT(pdev) - 1)
1046d14abf15SRobert Mustacchi #else
1047d14abf15SRobert Mustacchi #define LM_NON_RSS_SB(pdev) (LM_MAX_RSS_CHAINS(pdev) - 1)
1048d14abf15SRobert Mustacchi #endif
1049d14abf15SRobert Mustacchi #define LM_NON_RSS_CHAIN(pdev) (LM_MAX_RSS_CHAINS(pdev) - 1)
1050d14abf15SRobert Mustacchi #define LM_OOO_SB(pdev) (LM_NON_RSS_SB(pdev))
1051d14abf15SRobert Mustacchi
1052d14abf15SRobert Mustacchi #define LM_SB_ID_VALID(pdev, sb_id) ((sb_id) < LM_SB_CNT(pdev))
1053d14abf15SRobert Mustacchi #define LM_FOREACH_SB_ID(pdev, sb_id) \
1054d14abf15SRobert Mustacchi for ((sb_id) = 0; (sb_id) < LM_SB_CNT(pdev); (sb_id)++)
1055d14abf15SRobert Mustacchi /*
1056d14abf15SRobert Mustacchi #define LM_REST_OF_SB_ID(pdev, sb_id) \
1057d14abf15SRobert Mustacchi for ((sb_id) = LM_SB_CNT(pdev); (sb_id) < MAX_RSS_CHAINS / pdev->params.vnics_per_port; (sb_id)++)
1058d14abf15SRobert Mustacchi */
1059d14abf15SRobert Mustacchi u8_t max_pf_sb_cnt;
1060d14abf15SRobert Mustacchi u8_t fw_sb_cnt;
1061d14abf15SRobert Mustacchi
1062d14abf15SRobert Mustacchi u8_t fw_base_qzone_cnt;
1063d14abf15SRobert Mustacchi u8_t fw_qzone_id[PXP_REG_HST_ZONE_PERMISSION_TABLE_SIZE]; /* Which qzone-id in the qzone-table is used for updating producers + dhc counters
1064d14abf15SRobert Mustacchi * relevant from E2. For qzone_id from base area offset in permission table is guaranted */
1065d14abf15SRobert Mustacchi u8_t fw_aux_qzone_cnt;
1066d14abf15SRobert Mustacchi u8_t aux_fw_qzone_id; /* Which qzone-id in the qzone-table is used for updating producers + dhc counters
1067d14abf15SRobert Mustacchi * relevant from E2*/
1068d14abf15SRobert Mustacchi
1069d14abf15SRobert Mustacchi u8_t max_pf_fw_client_cnt;
1070d14abf15SRobert Mustacchi u8_t fw_client_cnt;
1071d14abf15SRobert Mustacchi u8_t base_fw_client_id;
1072d14abf15SRobert Mustacchi u8_t base_fw_ndsb;
1073d14abf15SRobert Mustacchi
1074d14abf15SRobert Mustacchi u8_t base_fw_stats_id; /* Where to collect statistics to */
1075d14abf15SRobert Mustacchi
1076d14abf15SRobert Mustacchi u8_t base_cam_offset; /* Relevant only for VFs (FIXME: revisit... ) */
1077d14abf15SRobert Mustacchi
1078d14abf15SRobert Mustacchi u8_t vf_num_in_pf;
1079d14abf15SRobert Mustacchi u8_t vf_num_in_path;
1080d14abf15SRobert Mustacchi u8_t _cnt_pad[2];
1081d14abf15SRobert Mustacchi #define REL_VFID(_pdev) ((_pdev)->params.vf_num_in_pf)
1082d14abf15SRobert Mustacchi #define ABS_VFID(_pdev) ((_pdev)->params.vf_num_in_path)
1083d14abf15SRobert Mustacchi #define FW_VFID(_pdev) (8 + ABS_VFID((_pdev)))
1084d14abf15SRobert Mustacchi /* 32 bit aligned. */
1085d14abf15SRobert Mustacchi u32_t debug_me_register;
1086d14abf15SRobert Mustacchi
1087d14abf15SRobert Mustacchi /* cam/mac parameters (see lm_init_cam_params) */
1088d14abf15SRobert Mustacchi u16_t base_offset_in_cam_table;
1089d14abf15SRobert Mustacchi #define BASE_OFFSET_IN_CAM_TABLE(_pdev) (_pdev)->params.base_offset_in_cam_table
1090d14abf15SRobert Mustacchi
1091d14abf15SRobert Mustacchi u16_t cam_size;
1092d14abf15SRobert Mustacchi #define LM_CAM_SIZE(pdev) ((pdev)->params.cam_size)
1093d14abf15SRobert Mustacchi
1094d14abf15SRobert Mustacchi u16_t mc_table_size[LM_CLI_IDX_MAX];
1095d14abf15SRobert Mustacchi #define LM_MC_TABLE_SIZE(pdev,lm_client_idx) ((pdev)->params.mc_table_size[lm_client_idx])
1096d14abf15SRobert Mustacchi
1097d14abf15SRobert Mustacchi u16_t uc_table_size[LM_CLI_IDX_MAX];
1098d14abf15SRobert Mustacchi #define LM_UC_TABLE_SIZE(pdev,lm_client_idx) ((pdev)->params.uc_table_size[lm_client_idx])
1099d14abf15SRobert Mustacchi
1100d14abf15SRobert Mustacchi #define LM_MC_NDIS_TABLE_SIZE (64)
1101d14abf15SRobert Mustacchi #define LM_MC_FCOE_TABLE_SIZE (2)
1102d14abf15SRobert Mustacchi
1103d14abf15SRobert Mustacchi #define LM_MAX_MC_TABLE_SIZE (LM_MC_NDIS_TABLE_SIZE + LM_MC_FCOE_TABLE_SIZE)
1104d14abf15SRobert Mustacchi #define LM_KEEP_CURRENT_CAM_VALUE (0xFFFF)
1105d14abf15SRobert Mustacchi #define LM_INVALID_CAM_BASE_IDX (0xFF)
1106d14abf15SRobert Mustacchi
1107d14abf15SRobert Mustacchi u8_t rss_caps; /* rss hash calculation types supported */
1108d14abf15SRobert Mustacchi #define LM_RSS_CAP_IPV4 1
1109d14abf15SRobert Mustacchi #define LM_RSS_CAP_IPV6 2
1110d14abf15SRobert Mustacchi
1111d14abf15SRobert Mustacchi u8_t rss_chain_cnt; /* number of rss chains. lm wise, if rss_chain_cnt==1 then rss is disabled */
1112d14abf15SRobert Mustacchi u8_t tss_chain_cnt; /* number of tss chains. should be identical to rss_chain_cnt. */
1113d14abf15SRobert Mustacchi
1114d14abf15SRobert Mustacchi /* TODO FIX MAX RSS Chains with new HC SB management*/
1115d14abf15SRobert Mustacchi u8_t max_rss_chains;
1116d14abf15SRobert Mustacchi #define LM_MAX_RSS_CHAINS(pdev) (pdev)->params.max_rss_chains
1117d14abf15SRobert Mustacchi
1118d14abf15SRobert Mustacchi /** 32-bit aligned * */
1119d14abf15SRobert Mustacchi /* for registry */
1120d14abf15SRobert Mustacchi u32_t override_rss_chain_cnt; /* value for overriding configured rss_chain_cnt */
1121d14abf15SRobert Mustacchi
1122d14abf15SRobert Mustacchi #define RSS_ID_TO_SB_ID(_rss_id) (_rss_id) /* Mapping between rss-id to sb-id */
1123d14abf15SRobert Mustacchi #define RSS_ID_TO_CID(_rss_id) (_rss_id) /* Mapping between rss-id to cid */
1124d14abf15SRobert Mustacchi #define TSS_ID_TO_CID(_tss_id) (_tss_id) /* Mapping between rss-id to cid */
1125d14abf15SRobert Mustacchi #define CHAIN_TO_RSS_ID(_pdev, _chain) (lm_mp_get_reg_chain_from_chain(_pdev, _chain)) /* Mapping between rss-id to cid */
1126d14abf15SRobert Mustacchi
1127d14abf15SRobert Mustacchi #define LM_CLI_RX_FILTER_MASK(pdev, cid) (1 << LM_FW_CLI_ID(pdev, cid))
1128d14abf15SRobert Mustacchi
1129d14abf15SRobert Mustacchi #define LM_RX_FILTER_ALL_MASK(pdev, ret_val) \
1130d14abf15SRobert Mustacchi { \
1131d14abf15SRobert Mustacchi ret_val |= LM_CLI_RX_FILTER_MASK((pdev), NDIS_CID(pdev)); \
1132d14abf15SRobert Mustacchi ret_val |= LM_CLI_RX_FILTER_MASK((pdev), ISCSI_CID(pdev));\
1133d14abf15SRobert Mustacchi ret_val |= LM_CLI_RX_FILTER_MASK((pdev), RDMA_CID(pdev)); \
1134d14abf15SRobert Mustacchi ret_val |= LM_CLI_RX_FILTER_MASK((pdev), FCOE_CID(pdev)); \
1135d14abf15SRobert Mustacchi }
1136d14abf15SRobert Mustacchi
1137d14abf15SRobert Mustacchi #define LM_SW_LEADING_SB_ID 0
1138d14abf15SRobert Mustacchi #define LM_SW_LEADING_RSS_CID(pdev) 0
1139d14abf15SRobert Mustacchi
1140d14abf15SRobert Mustacchi #define LM_INVALID_ETH_CID (0xFF)
1141d14abf15SRobert Mustacchi
1142d14abf15SRobert Mustacchi u8_t map_client_to_cid[LM_CLI_IDX_MAX];
1143d14abf15SRobert Mustacchi #define NDIS_CID(_pdev) (_pdev)->params.map_client_to_cid[LM_CLI_IDX_NDIS]
1144d14abf15SRobert Mustacchi #define ISCSI_CID(_pdev) (_pdev)->params.map_client_to_cid[LM_CLI_IDX_ISCSI]
1145d14abf15SRobert Mustacchi #define FCOE_CID(_pdev) (_pdev)->params.map_client_to_cid[LM_CLI_IDX_FCOE]
1146d14abf15SRobert Mustacchi #define RDMA_CID(_pdev) (_pdev)->params.map_client_to_cid[LM_CLI_IDX_RDMA]
1147d14abf15SRobert Mustacchi #define FWD_CID(_pdev) (_pdev)->params.map_client_to_cid[LM_CLI_IDX_FWD]
1148d14abf15SRobert Mustacchi #define OOO_CID(_pdev) (_pdev)->params.map_client_to_cid[LM_CLI_IDX_OOO]
1149d14abf15SRobert Mustacchi
1150d14abf15SRobert Mustacchi #define LM_CLI_CID(_pdev, lm_cli_idx) ((_pdev)->params.map_client_to_cid[lm_cli_idx])
1151d14abf15SRobert Mustacchi
1152d14abf15SRobert Mustacchi #define LM_CHAIN_IDX_CLI(pdev, cid) ((lm_chain_type_not_cos != lm_mp_get_chain_type(pdev, cid)) ? LM_CLI_IDX_NDIS : \
1153d14abf15SRobert Mustacchi ((cid == ISCSI_CID(pdev) ? LM_CLI_IDX_ISCSI : \
1154d14abf15SRobert Mustacchi ((cid == FCOE_CID(pdev) ? LM_CLI_IDX_FCOE : \
1155d14abf15SRobert Mustacchi ((cid == FWD_CID(pdev) ? LM_CLI_IDX_FWD : \
1156d14abf15SRobert Mustacchi ((cid == OOO_CID(pdev) ? LM_CLI_IDX_OOO : \
1157d14abf15SRobert Mustacchi (((cid >= (pdev)->params.max_pf_fw_client_cnt) && (cid < (pdev)->params.fw_client_cnt)) ? LM_CLI_IDX_NDIS : \
1158d14abf15SRobert Mustacchi LM_CLI_IDX_MAX))))))))))
1159d14abf15SRobert Mustacchi
1160d14abf15SRobert Mustacchi
1161d14abf15SRobert Mustacchi #define LM_CHAIN_IDX_TRAFFIC_TYPE(pdev, cid) ((lm_chain_type_not_cos != lm_mp_get_chain_type(pdev, cid)) ? LLFC_TRAFFIC_TYPE_NW : \
1162d14abf15SRobert Mustacchi ((cid == ISCSI_CID(pdev) ? LLFC_TRAFFIC_TYPE_ISCSI : \
1163d14abf15SRobert Mustacchi ((cid == FCOE_CID(pdev) ? LLFC_TRAFFIC_TYPE_FCOE : \
1164d14abf15SRobert Mustacchi ((cid == FWD_CID(pdev) ? LLFC_TRAFFIC_TYPE_NW : \
1165d14abf15SRobert Mustacchi ((cid == OOO_CID(pdev) ? LLFC_TRAFFIC_TYPE_ISCSI : \
1166d14abf15SRobert Mustacchi (((cid >= (pdev)->params.max_pf_fw_client_cnt) && (cid < (pdev)->params.fw_client_cnt)) ? LLFC_TRAFFIC_TYPE_NW : \
1167d14abf15SRobert Mustacchi MAX_TRAFFIC_TYPE))))))))))
1168d14abf15SRobert Mustacchi
1169d14abf15SRobert Mustacchi #define LM_FW_CLI_ID(pdev, cid) (pdev->params.base_fw_client_id + cid)
1170d14abf15SRobert Mustacchi
1171d14abf15SRobert Mustacchi /* A bit about E2 Qzone-IDs: qzone is a new area in internal memory where the FW stores producers + dynamic-host-coalesing (dhc) values.
1172d14abf15SRobert Mustacchi * It is a separate area than areas the have arrays for clients / status-blocks. Technically, the driver can decide to have separate entries
1173d14abf15SRobert Mustacchi * for producers + dhc entries (it has to do with permissions in PXP for VFs..., for now there is no reason to do this. And we'll use the same
1174d14abf15SRobert Mustacchi * id, but note that QZONE_ID is intended for fp ring producers. DHC_QZONE_ID is intended for status-block, and thus the parameter they receive.
1175d14abf15SRobert Mustacchi */
1176d14abf15SRobert Mustacchi #define LM_FW_QZONE_ID(pdev, cid) (pdev->params.fw_qzone_id[cid])
1177d14abf15SRobert Mustacchi #define LM_FW_AUX_QZONE_ID(pdev, rel_non_rss_cid) (pdev->params.aux_fw_qzone_id + rel_non_rss_cid)
1178d14abf15SRobert Mustacchi #define LM_FW_DHC_QZONE_ID(pdev, sb_id) (pdev->params.fw_qzone_id[sb_id])
1179d14abf15SRobert Mustacchi #define LM_FW_SB_ID(pdev, sb_id) ((sb_id == DEF_STATUS_BLOCK_INDEX)? DEF_STATUS_BLOCK_INDEX: pdev->params.base_fw_ndsb + sb_id)
1180d14abf15SRobert Mustacchi #define LM_FW_STATS_ID(pdev,cid) (pdev->params.base_fw_stats_id + cid)
1181d14abf15SRobert Mustacchi #define LM_CLIENT_BIT_VECTOR(pdev, lm_cli_idx) (1 << (LM_FW_CLI_ID(pdev, LM_CLI_CID(pdev, lm_cli_idx))))
1182d14abf15SRobert Mustacchi #define LM_CID_BIT_VECTOR(pdev, cid) (1 << (LM_FW_CLI_ID(pdev, cid)))
1183d14abf15SRobert Mustacchi
1184d14abf15SRobert Mustacchi
1185d14abf15SRobert Mustacchi /* 'for loop' macros on rss/tss chains */
1186d14abf15SRobert Mustacchi #define LM_FOREACH_RSS_IDX(pdev, rss_idx) \
1187d14abf15SRobert Mustacchi for ((rss_idx) = 0; (rss_idx) < (pdev)->params.rss_chain_cnt; (rss_idx)++)
1188d14abf15SRobert Mustacchi #define LM_FOREACH_TSS_IDX(pdev, tss_idx) \
1189d14abf15SRobert Mustacchi for ((tss_idx) = 0; (tss_idx) < (pdev)->params.tss_chain_cnt; (tss_idx)++)
1190d14abf15SRobert Mustacchi #define LM_FOREACH_RSS_IDX_SKIP_LEADING(pdev, rss_idx) \
1191d14abf15SRobert Mustacchi for ((rss_idx) = 1; (u8_t)(rss_idx) < (pdev)->params.rss_chain_cnt; (rss_idx)++)
1192d14abf15SRobert Mustacchi #define LM_FOREACH_TSS_IDX_SKIP_LEADING(pdev, tss_idx) \
1193d14abf15SRobert Mustacchi for ((tss_idx) = 1; (u8_t)(tss_idx) < (pdev)->params.tss_chain_cnt; (tss_idx)++)
1194d14abf15SRobert Mustacchi
1195d14abf15SRobert Mustacchi
1196d14abf15SRobert Mustacchi /* L4 RSS */
1197d14abf15SRobert Mustacchi u8_t l4_rss_chain_cnt; /* number of L4 rss chains. lm wise, if rss_chain_cnt==1 then rss is disabled */
1198d14abf15SRobert Mustacchi u8_t l4_tss_chain_cnt; /* number of L4 tss chains. */
1199d14abf15SRobert Mustacchi u8_t l4_rss_base_chain_idx; /* L4 rss base chain Where do the L4 status block start */
1200d14abf15SRobert Mustacchi u8_t l4_base_fw_rss_id; /* L4 rss base chain Where do the L4 status block start */
1201d14abf15SRobert Mustacchi
1202d14abf15SRobert Mustacchi #define LM_TOE_BASE_RSS_ID(pdev) ((pdev)->params.l4_rss_base_chain_idx) /* that is first L4 SB */
1203d14abf15SRobert Mustacchi #define LM_TOE_FW_RSS_ID(pdev, rss_id) ((pdev)->params.l4_base_fw_rss_id + (IS_MULTI_VNIC(pdev) ? (CHIP_IS_E1x(pdev) ? rss_id : 0) : rss_id)) /* that is first L4 SB */
1204d14abf15SRobert Mustacchi #define LM_TOE_RSS_CHAIN_CNT(pdev) ((pdev)->params.l4_rss_chain_cnt)
1205d14abf15SRobert Mustacchi #define LM_TOE_TSS_CHAIN_CNT(pdev) ((pdev)->params.l4_tss_chain_cnt)
1206d14abf15SRobert Mustacchi
1207d14abf15SRobert Mustacchi
1208d14abf15SRobert Mustacchi /* 'for loop' macros on L4 rss/tss chains */
1209d14abf15SRobert Mustacchi #define LM_TOE_FOREACH_RSS_IDX(pdev, rss_idx) \
1210d14abf15SRobert Mustacchi for ((rss_idx) = (pdev)->params.l4_rss_base_chain_idx; (rss_idx) < (pdev)->params.l4_rss_base_chain_idx + (pdev)->params.l4_rss_chain_cnt; (rss_idx)++)
1211d14abf15SRobert Mustacchi #define LM_TOE_FOREACH_TSS_IDX(pdev, tss_idx) \
1212d14abf15SRobert Mustacchi for ((tss_idx) = (pdev)->params.l4_rss_base_chain_idx; (tss_idx) < (pdev)->params.l4_rss_base_chain_idx + (pdev)->params.l4_tss_chain_cnt; (tss_idx)++)
1213d14abf15SRobert Mustacchi
1214d14abf15SRobert Mustacchi /* for multi function mode, when 'rss_base_chain_idx' != 0 */
1215d14abf15SRobert Mustacchi // In new VBD dsign chain doesn't equal client and
1216d14abf15SRobert Mustacchi // we must add client offset
1217d14abf15SRobert Mustacchi //((pdev)->params.base_fw_client_id + (val))
1218d14abf15SRobert Mustacchi #define LM_CHAIN_TO_FW_CLIENT(_pdev, _chain) ((_pdev)->params.base_fw_client_id + (_chain))
1219d14abf15SRobert Mustacchi
1220d14abf15SRobert Mustacchi // eth configuration.
1221d14abf15SRobert Mustacchi u32_t keep_vlan_tag;
1222d14abf15SRobert Mustacchi
1223d14abf15SRobert Mustacchi u16_t eth_align_enable;
1224d14abf15SRobert Mustacchi
1225d14abf15SRobert Mustacchi // TODO: encapsulate in a connection object
1226d14abf15SRobert Mustacchi u32_t update_comp_cnt;
1227d14abf15SRobert Mustacchi u32_t update_suspend_cnt;
1228d14abf15SRobert Mustacchi u32_t update_toe_comp_cnt;
1229d14abf15SRobert Mustacchi
1230d14abf15SRobert Mustacchi lm_address_t dmae_copy_scratchpad_phys;
1231d14abf15SRobert Mustacchi
1232d14abf15SRobert Mustacchi // congestion managment parameters
1233d14abf15SRobert Mustacchi u32_t cmng_enable;
1234d14abf15SRobert Mustacchi u32_t cmng_rate_shaping_enable;
1235d14abf15SRobert Mustacchi u32_t cmng_fairness_enable;
1236d14abf15SRobert Mustacchi // safc
1237d14abf15SRobert Mustacchi u32_t cmng_safc_rate_thresh;
1238d14abf15SRobert Mustacchi u32_t cmng_activate_safc;
1239d14abf15SRobert Mustacchi // fairness
1240d14abf15SRobert Mustacchi u32_t cmng_fair_port0_rate;
1241d14abf15SRobert Mustacchi u32_t cmng_eth_weight;
1242d14abf15SRobert Mustacchi u32_t cmng_toe_weight;
1243d14abf15SRobert Mustacchi u32_t cmng_rdma_weight;
1244d14abf15SRobert Mustacchi u32_t cmng_iscsi_weight;
1245d14abf15SRobert Mustacchi // rate shaping
1246d14abf15SRobert Mustacchi u32_t cmng_eth_rate;
1247d14abf15SRobert Mustacchi u32_t cmng_toe_rate;
1248d14abf15SRobert Mustacchi u32_t cmng_rdma_rate;
1249d14abf15SRobert Mustacchi u32_t cmng_iscsi_rate;
1250d14abf15SRobert Mustacchi // Demo will be removed later
1251d14abf15SRobert Mustacchi u32_t cmng_toe_con_number;
1252d14abf15SRobert Mustacchi u32_t cmng_rdma_con_number;
1253d14abf15SRobert Mustacchi u32_t cmng_iscsi_con_number;
1254d14abf15SRobert Mustacchi // iscsi
1255d14abf15SRobert Mustacchi u32_t l5sc_max_pending_tasks;
1256d14abf15SRobert Mustacchi
1257d14abf15SRobert Mustacchi // cls_params
1258d14abf15SRobert Mustacchi struct elink_params link;
1259d14abf15SRobert Mustacchi
1260d14abf15SRobert Mustacchi // fw flow control
1261d14abf15SRobert Mustacchi u32_t l2_fw_flow_ctrl;
1262d14abf15SRobert Mustacchi u32_t l4_fw_flow_ctrl;
1263d14abf15SRobert Mustacchi
1264d14abf15SRobert Mustacchi // preemphasis rx/tx configuration
1265d14abf15SRobert Mustacchi u32_t preemphasis_enable;
1266d14abf15SRobert Mustacchi
1267d14abf15SRobert Mustacchi u32_t preemphasis_rx_0;
1268d14abf15SRobert Mustacchi u32_t preemphasis_rx_1;
1269d14abf15SRobert Mustacchi u32_t preemphasis_rx_2;
1270d14abf15SRobert Mustacchi u32_t preemphasis_rx_3;
1271d14abf15SRobert Mustacchi
1272d14abf15SRobert Mustacchi u32_t preemphasis_tx_0;
1273d14abf15SRobert Mustacchi u32_t preemphasis_tx_1;
1274d14abf15SRobert Mustacchi u32_t preemphasis_tx_2;
1275d14abf15SRobert Mustacchi u32_t preemphasis_tx_3;
1276d14abf15SRobert Mustacchi u32_t l4_rss_enabled_by_os;
1277d14abf15SRobert Mustacchi u32_t disable_patent_using;
1278d14abf15SRobert Mustacchi u32_t l4_grq_filling_threshold_divider;
1279d14abf15SRobert Mustacchi u32_t l4_free_cid_delay_time;
1280d14abf15SRobert Mustacchi u32_t l4_enable_rss;
1281d14abf15SRobert Mustacchi u32_t l4_rss_is_possible;
1282d14abf15SRobert Mustacchi #define L4_RSS_DISABLED 0 /* shmulikr: l4_enable_rss is more then a flag. The various values represent the possible flavors */
1283d14abf15SRobert Mustacchi #define L4_RSS_DYNAMIC 1 /* Full support including support for indirection table update */
1284d14abf15SRobert Mustacchi u32_t l4_max_rcv_wnd_size;
1285d14abf15SRobert Mustacchi /* disable PCIe non-FATAL error reporting */
1286d14abf15SRobert Mustacchi u32_t disable_pcie_nfr;
1287d14abf15SRobert Mustacchi
1288d14abf15SRobert Mustacchi u32_t mf_proto_support_flags; /* For multi-function: which protocols are supported */
1289d14abf15SRobert Mustacchi #define LM_PROTO_SUPPORT_ETHERNET 0x1
1290d14abf15SRobert Mustacchi #define LM_PROTO_SUPPORT_ISCSI 0x2
1291d14abf15SRobert Mustacchi #define LM_PROTO_SUPPORT_FCOE 0x4
1292d14abf15SRobert Mustacchi
1293d14abf15SRobert Mustacchi /* In release this flag will prevent us from crashing in customer site */
1294d14abf15SRobert Mustacchi u32_t debug_cap_flags;
1295d14abf15SRobert Mustacchi #if DBG
1296d14abf15SRobert Mustacchi #define DEFAULT_DEBUG_CAP_FLAGS_VAL 0xffffffff
1297d14abf15SRobert Mustacchi #else
1298d14abf15SRobert Mustacchi #define DEFAULT_DEBUG_CAP_FLAGS_VAL 0x0
1299d14abf15SRobert Mustacchi #endif
1300d14abf15SRobert Mustacchi
1301d14abf15SRobert Mustacchi #define DEBUG_CAP_FLAGS_STATS_FW 0x1
1302d14abf15SRobert Mustacchi //#define DEBUG_CAP_FLAGS_XXX 0x2
1303d14abf15SRobert Mustacchi
1304d14abf15SRobert Mustacchi u32_t l4_limit_isles;
1305d14abf15SRobert Mustacchi #define L4_LI_NOTIFY 0x0001
1306d14abf15SRobert Mustacchi #define L4_LI_MAX_GEN_BUFS_IN_ISLE 0x0002
1307d14abf15SRobert Mustacchi #define L4_LI_MAX_GEN_BUFS_IN_ARCHIPELAGO 0x0004
1308d14abf15SRobert Mustacchi
1309d14abf15SRobert Mustacchi u32_t l4_max_gen_bufs_in_isle;
1310d14abf15SRobert Mustacchi u32_t l4_max_gen_bufs_in_archipelago;
1311d14abf15SRobert Mustacchi u32_t l4_valid_gen_bufs_in_archipelago;
1312d14abf15SRobert Mustacchi u32_t l4_max_gen_buf_cnt; /* maximum number of generic buffers the system can allocate, duplicated from UM*/
1313d14abf15SRobert Mustacchi
1314d14abf15SRobert Mustacchi u32_t l4_isles_pool_size;
1315d14abf15SRobert Mustacchi
1316d14abf15SRobert Mustacchi u32_t i2c_interval_sec;
1317d14abf15SRobert Mustacchi elink_status_t i2c_elink_status[I2C_SECTION_MAX]; // represents last elink res per section
1318d14abf15SRobert Mustacchi
1319d14abf15SRobert Mustacchi u8_t l4_num_of_blocks_per_connection;
1320d14abf15SRobert Mustacchi // PF_FLR
1321d14abf15SRobert Mustacchi u8_t is_flr;
1322d14abf15SRobert Mustacchi u8_t __nmb_pad[2];
1323d14abf15SRobert Mustacchi //LLFC should be moved to vars
1324d14abf15SRobert Mustacchi dcbx_port_params_t dcbx_port_params;
1325d14abf15SRobert Mustacchi u32_t lm_dcb_dont_break_bad_oid;
1326d14abf15SRobert Mustacchi
1327d14abf15SRobert Mustacchi config_lldp_params_t lldp_config_params;
1328d14abf15SRobert Mustacchi config_dcbx_params_t dcbx_config_params;
1329d14abf15SRobert Mustacchi u32_t try_not_align_page_multiplied_memory;
1330d14abf15SRobert Mustacchi
1331d14abf15SRobert Mustacchi u32_t l4_dominance_threshold; /*for firmware debug.*/
1332d14abf15SRobert Mustacchi u32_t l4_max_dominance_value; /* set to 0 to disable dominant connection, set to 20 (default) to enable */
1333d14abf15SRobert Mustacchi
1334d14abf15SRobert Mustacchi u32_t l4_data_integrity;
1335d14abf15SRobert Mustacchi u32_t l4_start_port;
1336d14abf15SRobert Mustacchi u32_t l4_num_of_ports;
1337d14abf15SRobert Mustacchi u32_t l4_skip_start_bytes;
1338d14abf15SRobert Mustacchi
1339d14abf15SRobert Mustacchi u32_t l4_support_pending_sp_req_complete;
1340d14abf15SRobert Mustacchi u32_t l4_support_upload_req_on_abortive_disconnect;
1341d14abf15SRobert Mustacchi
1342d14abf15SRobert Mustacchi u32_t grc_timeout_max_ignore ;
1343d14abf15SRobert Mustacchi u32_t tpa_desc_cnt_per_chain;//Number of RSC pages descriptor required per-queue.
1344d14abf15SRobert Mustacchi u32_t b_dcb_indicate_event;//DCB indicates event towards upper layer.
1345d14abf15SRobert Mustacchi u32_t sriov_inc_mac;
1346d14abf15SRobert Mustacchi /* Virtualization related */
1347d14abf15SRobert Mustacchi u8_t device_type;
1348d14abf15SRobert Mustacchi u8_t virtualization_type;
1349d14abf15SRobert Mustacchi u8_t channel_type;
1350d14abf15SRobert Mustacchi u8_t pf_acquire_status;
1351d14abf15SRobert Mustacchi
1352d14abf15SRobert Mustacchi u8_t fw_stats_init_value;
1353d14abf15SRobert Mustacchi u8_t int_coalesing_mode_disabled_by_ndis;
1354d14abf15SRobert Mustacchi u8_t mac_spoof_test;
1355d14abf15SRobert Mustacchi
1356d14abf15SRobert Mustacchi u8_t run_driver_pulse;
1357d14abf15SRobert Mustacchi #define IS_DRIVER_PULSE_ALWAYS_ALIVE(_pdev) (!(_pdev)->params.run_driver_pulse)
1358d14abf15SRobert Mustacchi u8_t ___pad;
1359d14abf15SRobert Mustacchi
1360d14abf15SRobert Mustacchi /* Error Recovery supported only on E2 and above. Can be controlled via registry */
1361d14abf15SRobert Mustacchi u32_t enable_error_recovery;
1362d14abf15SRobert Mustacchi #define IS_ERROR_RECOVERY_ENABLED(_pdev) ((_pdev)->params.enable_error_recovery && !CHIP_IS_E1x(_pdev))
1363d14abf15SRobert Mustacchi u32_t validate_sq_complete;
1364d14abf15SRobert Mustacchi
1365d14abf15SRobert Mustacchi u32_t e3_cos_modes; // enum lm_cos_modes
1366d14abf15SRobert Mustacchi u32_t e3_network_cos_mode; // enum lm_network_cos_modes
1367d14abf15SRobert Mustacchi
1368d14abf15SRobert Mustacchi /* Enables switching between non-enlighted vms under npar configuration.
1369d14abf15SRobert Mustacchi * vm's that don't have their mac in the tx cam can't be 'switched' between pfs
1370d14abf15SRobert Mustacchi * this mode actually means that all traffic will be passed on loopback channel if
1371d14abf15SRobert Mustacchi * there is a pf in promiscuous/accept unmatched (which is set when there are vms)
1372d14abf15SRobert Mustacchi * this feature hurts performance and therefore can be disabled */
1373d14abf15SRobert Mustacchi u32_t npar_vm_switching_enable;
1374d14abf15SRobert Mustacchi
1375d14abf15SRobert Mustacchi u32_t flow_control_reporting_mode;
1376d14abf15SRobert Mustacchi #define LM_FLOW_CONTROL_REPORTING_MODE_DISABLED 0
1377d14abf15SRobert Mustacchi #define LM_FLOW_CONTROL_REPORTING_MODE_ENABLED 1
1378d14abf15SRobert Mustacchi
1379d14abf15SRobert Mustacchi u32_t fw_valid_mask; // 0xeeRRnnMM
1380d14abf15SRobert Mustacchi u32_t vf_promiscuous_mode_restricted;
1381d14abf15SRobert Mustacchi u32_t max_chains_per_vf_override;
1382d14abf15SRobert Mustacchi u32_t record_sp;
1383d14abf15SRobert Mustacchi #define XSTORM_RECORD_SLOW_PATH 0x01
1384d14abf15SRobert Mustacchi #define CSTORM_RECORD_SLOW_PATH 0x02
1385d14abf15SRobert Mustacchi #define TSTORM_RECORD_SLOW_PATH 0x04
1386d14abf15SRobert Mustacchi #define USTORM_RECORD_SLOW_PATH 0x08
1387d14abf15SRobert Mustacchi u32_t start_mp_chain;
1388d14abf15SRobert Mustacchi u32_t debug_sriov;
1389d14abf15SRobert Mustacchi u32_t debug_sriov_vfs;
1390d14abf15SRobert Mustacchi u8_t b_inta_mode_prvided_by_os;
1391d14abf15SRobert Mustacchi } lm_params_t;
1392d14abf15SRobert Mustacchi
1393d14abf15SRobert Mustacchi
1394d14abf15SRobert Mustacchi
1395d14abf15SRobert Mustacchi /*******************************************************************************
1396d14abf15SRobert Mustacchi * Device NVM info -- The native strapping does not support the new parts, the
1397d14abf15SRobert Mustacchi * software needs to reconfigure for them.
1398d14abf15SRobert Mustacchi ******************************************************************************/
1399d14abf15SRobert Mustacchi //TODO we need check
1400d14abf15SRobert Mustacchi typedef struct _flash_spec_t
1401d14abf15SRobert Mustacchi {
1402d14abf15SRobert Mustacchi u32_t page_size;
1403d14abf15SRobert Mustacchi u32_t total_size;
1404d14abf15SRobert Mustacchi } flash_spec_t;
1405d14abf15SRobert Mustacchi
1406d14abf15SRobert Mustacchi //TODO resolve big endian issues
1407d14abf15SRobert Mustacchi typedef struct _lm_cam_entry_t
1408d14abf15SRobert Mustacchi {
1409d14abf15SRobert Mustacchi u8_t cam_addr[ETHERNET_ADDRESS_SIZE];
1410d14abf15SRobert Mustacchi u16_t ref_cnt;
1411d14abf15SRobert Mustacchi } lm_cam_entry_t;
1412d14abf15SRobert Mustacchi
1413d14abf15SRobert Mustacchi
1414d14abf15SRobert Mustacchi #define MAX_MAC_OFFSET_IN_NIG 16
1415d14abf15SRobert Mustacchi
1416d14abf15SRobert Mustacchi typedef struct _lm_nig_mirror_entry_t
1417d14abf15SRobert Mustacchi {
1418d14abf15SRobert Mustacchi s32_t refcnt; //signed to detect underflow.
1419d14abf15SRobert Mustacchi
1420d14abf15SRobert Mustacchi //atomic access is not needed because this struct is modified under TOE_LOCK.
1421d14abf15SRobert Mustacchi #define NIG_ENTRY_INC_REFCNT(_entry) ++(_entry)->refcnt
1422d14abf15SRobert Mustacchi #define NIG_ENTRY_DEC_REFCNT(_entry) {--(_entry)->refcnt; DbgBreakIf((_entry)->refcnt < 0);}
1423d14abf15SRobert Mustacchi
1424d14abf15SRobert Mustacchi u8_t addr[ETHERNET_ADDRESS_SIZE]; //MAC address of this entry.
1425d14abf15SRobert Mustacchi }lm_nig_mirror_entry_t;
1426d14abf15SRobert Mustacchi
1427d14abf15SRobert Mustacchi typedef struct _lm_nig_mirror_t
1428d14abf15SRobert Mustacchi {
1429d14abf15SRobert Mustacchi lm_nig_mirror_entry_t entries[MAX_MAC_OFFSET_IN_NIG];
1430d14abf15SRobert Mustacchi }lm_nig_mirror_t;
1431d14abf15SRobert Mustacchi
1432d14abf15SRobert Mustacchi
1433d14abf15SRobert Mustacchi /*******************************************************************************
1434d14abf15SRobert Mustacchi * Device info.
1435d14abf15SRobert Mustacchi ******************************************************************************/
1436d14abf15SRobert Mustacchi
1437d14abf15SRobert Mustacchi /* multi function specific */
1438d14abf15SRobert Mustacchi typedef struct _lm_hardware_mf_info_t
1439d14abf15SRobert Mustacchi {
1440d14abf15SRobert Mustacchi u32_t func_mf_cfg;
1441d14abf15SRobert Mustacchi #define NIV_FUNCTION_ENABLED(_pdev) (GET_FLAGS((_pdev)->hw_info.mf_info.func_mf_cfg, FUNC_MF_CFG_FUNC_DISABLED|FUNC_MF_CFG_FUNC_DELETED)==0)
1442d14abf15SRobert Mustacchi
1443d14abf15SRobert Mustacchi u8_t vnics_per_port; //1, 2 or 4
1444d14abf15SRobert Mustacchi u8_t multi_vnics_mode;
1445d14abf15SRobert Mustacchi u8_t path_has_ovlan; /* the multi function mode of the path... */
1446d14abf15SRobert Mustacchi u8_t _pad;
1447d14abf15SRobert Mustacchi
1448d14abf15SRobert Mustacchi u8_t min_bw[MAX_VNIC_NUM];
1449d14abf15SRobert Mustacchi u8_t max_bw[MAX_VNIC_NUM];
1450d14abf15SRobert Mustacchi
1451d14abf15SRobert Mustacchi u16_t ext_id; //vnic outer vlan or VIF ID
1452d14abf15SRobert Mustacchi #define VALID_OVLAN(ovlan) ((ovlan) <= 4096)
1453d14abf15SRobert Mustacchi #define INVALID_VIF_ID 0xFFFF
1454d14abf15SRobert Mustacchi #define OVLAN(_pdev) ((_pdev)->hw_info.mf_info.ext_id)
1455d14abf15SRobert Mustacchi #define VIF_ID(_pdev) ((_pdev)->hw_info.mf_info.ext_id)
1456d14abf15SRobert Mustacchi
1457d14abf15SRobert Mustacchi u16_t default_vlan;
1458d14abf15SRobert Mustacchi #define NIV_DEFAULT_VLAN(_pdev) ((_pdev)->hw_info.mf_info.default_vlan)
1459d14abf15SRobert Mustacchi
1460d14abf15SRobert Mustacchi u8_t niv_allowed_priorities;
1461d14abf15SRobert Mustacchi #define NIV_ALLOWED_PRIORITIES(_pdev) ((_pdev)->hw_info.mf_info.niv_allowed_priorities)
1462d14abf15SRobert Mustacchi
1463d14abf15SRobert Mustacchi u8_t niv_default_cos;
1464d14abf15SRobert Mustacchi #define NIV_DEFAULT_COS(_pdev) ((_pdev)->hw_info.mf_info.niv_default_cos)
1465d14abf15SRobert Mustacchi
1466d14abf15SRobert Mustacchi u8_t niv_mba_enabled;
1467d14abf15SRobert Mustacchi u8_t _pad1;
1468d14abf15SRobert Mustacchi
1469d14abf15SRobert Mustacchi enum mf_cfg_afex_vlan_mode afex_vlan_mode;
1470d14abf15SRobert Mustacchi #define AFEX_VLAN_MODE(_pdev) ((_pdev)->hw_info.mf_info.afex_vlan_mode)
1471d14abf15SRobert Mustacchi
1472d14abf15SRobert Mustacchi u16_t flags;
1473d14abf15SRobert Mustacchi #define MF_INFO_VALID_MAC 0x0001
1474d14abf15SRobert Mustacchi
1475d14abf15SRobert Mustacchi u8_t mf_mode; /* Switch-dependent / Switch-Independent */
1476d14abf15SRobert Mustacchi u8_t sd_mode;
1477d14abf15SRobert Mustacchi #define SD_REGULAR_MODE 0
1478d14abf15SRobert Mustacchi #define SD_UFP_MODE 1
1479d14abf15SRobert Mustacchi #define SD_BD_MODE 2
1480d14abf15SRobert Mustacchi } lm_hardware_mf_info_t;
1481d14abf15SRobert Mustacchi
1482d14abf15SRobert Mustacchi
1483d14abf15SRobert Mustacchi /* IGU related params for status-blocks */
1484d14abf15SRobert Mustacchi typedef struct _lm_vf_igu_info_t
1485d14abf15SRobert Mustacchi {
1486d14abf15SRobert Mustacchi u8_t igu_base_sb; /* base for all ndsb u + c */
1487d14abf15SRobert Mustacchi u8_t igu_sb_cnt;
1488d14abf15SRobert Mustacchi u8_t igu_test_sb_cnt;
1489d14abf15SRobert Mustacchi u8_t igu_test_mode;
1490d14abf15SRobert Mustacchi } lm_vf_igu_info_t;
1491d14abf15SRobert Mustacchi
1492d14abf15SRobert Mustacchi typedef struct _lm_igu_block_t
1493d14abf15SRobert Mustacchi {
1494d14abf15SRobert Mustacchi u8_t status;
1495d14abf15SRobert Mustacchi #define LM_IGU_STATUS_AVAILABLE 0x01
1496d14abf15SRobert Mustacchi #define LM_IGU_STATUS_VALID 0x02
1497d14abf15SRobert Mustacchi #define LM_IGU_STATUS_BUSY 0x04
1498d14abf15SRobert Mustacchi #define LM_IGU_STATUS_PF 0x08
1499d14abf15SRobert Mustacchi
1500d14abf15SRobert Mustacchi u8_t vector_number;
1501d14abf15SRobert Mustacchi u8_t pf_number;
1502d14abf15SRobert Mustacchi u8_t vf_number;
1503d14abf15SRobert Mustacchi u32_t block_dump;
1504d14abf15SRobert Mustacchi } lm_igu_block_t;
1505d14abf15SRobert Mustacchi
1506d14abf15SRobert Mustacchi typedef struct _lm_igu_map_t
1507d14abf15SRobert Mustacchi {
1508d14abf15SRobert Mustacchi lm_igu_block_t igu_blocks_set[IGU_REG_MAPPING_MEMORY_SIZE];
1509d14abf15SRobert Mustacchi
1510d14abf15SRobert Mustacchi } lm_igu_map_t;
1511d14abf15SRobert Mustacchi
1512d14abf15SRobert Mustacchi typedef struct _lm_igu_info_t {
1513d14abf15SRobert Mustacchi u8_t igu_base_sb; /* base for all ndsb u + c */
1514d14abf15SRobert Mustacchi #define IGU_BASE_NDSB(pdev) ((pdev)->hw_info.intr_blk_info.igu_info.igu_base_sb)
1515d14abf15SRobert Mustacchi #define IGU_PF_NDSB(pdev, sb_id) (IGU_BASE_NDSB(pdev) + sb_id)
1516d14abf15SRobert Mustacchi u8_t igu_sb_cnt;
1517d14abf15SRobert Mustacchi #define LM_IGU_SB_CNT(pdev) ((pdev)->hw_info.intr_blk_info.igu_info.igu_sb_cnt)
1518d14abf15SRobert Mustacchi u8_t igu_dsb_id;
1519d14abf15SRobert Mustacchi #define IGU_DSB_ID(pdev) ((pdev)->hw_info.intr_blk_info.igu_info.igu_dsb_id)
1520d14abf15SRobert Mustacchi u8_t igu_u_sb_offset;
1521d14abf15SRobert Mustacchi #define IGU_U_NDSB_OFFSET(pdev) ((pdev)->hw_info.intr_blk_info.igu_info.igu_u_sb_offset)
1522d14abf15SRobert Mustacchi u8_t igu_func_id;
1523d14abf15SRobert Mustacchi #define IGU_FUNC_ID(pdev) ((pdev)->hw_info.intr_blk_info.igu_info.igu_func_id)
1524d14abf15SRobert Mustacchi u8_t igu_test_sb_cnt;
1525d14abf15SRobert Mustacchi lm_vf_igu_info_t vf_igu_info[E2_MAX_NUM_OF_VFS];
1526d14abf15SRobert Mustacchi u8_t igu_sb[IGU_REG_MAPPING_MEMORY_SIZE];
1527d14abf15SRobert Mustacchi #define IGU_VF_NDSB(pdev, sb_id) ((pdev)->hw_info.intr_blk_info.igu_info.igu_sb[sb_id])
1528d14abf15SRobert Mustacchi lm_igu_map_t igu_map;
1529d14abf15SRobert Mustacchi #define IGU_SB(pdev, sb_id) ((pdev)->hw_info.intr_blk_info.igu_info.igu_map.igu_blocks_set[sb_id])
1530d14abf15SRobert Mustacchi } lm_igu_info_t;
1531d14abf15SRobert Mustacchi
1532d14abf15SRobert Mustacchi typedef struct _lm_intr_blk_info_t
1533d14abf15SRobert Mustacchi {
1534d14abf15SRobert Mustacchi u8_t blk_type;
1535d14abf15SRobert Mustacchi #define INTR_BLK_HC 0
1536d14abf15SRobert Mustacchi #define INTR_BLK_IGU 1
1537d14abf15SRobert Mustacchi #define INTR_BLK_TYPE(_pdev) ((_pdev)->hw_info.intr_blk_info.blk_type)
1538d14abf15SRobert Mustacchi
1539d14abf15SRobert Mustacchi u8_t blk_mode;
1540d14abf15SRobert Mustacchi #define INTR_BLK_MODE_BC 0
1541d14abf15SRobert Mustacchi #define INTR_BLK_MODE_NORM 1
1542d14abf15SRobert Mustacchi #define INTR_BLK_MODE(_pdev) ((_pdev)->hw_info.intr_blk_info.blk_mode)
1543d14abf15SRobert Mustacchi
1544d14abf15SRobert Mustacchi u8_t access_type;
1545d14abf15SRobert Mustacchi #define INTR_BLK_ACCESS_GRC 1
1546d14abf15SRobert Mustacchi #define INTR_BLK_ACCESS_IGUMEM 0
1547d14abf15SRobert Mustacchi #define INTR_BLK_ACCESS(_pdev) ((_pdev)->hw_info.intr_blk_info.access_type)
1548d14abf15SRobert Mustacchi
1549d14abf15SRobert Mustacchi u32_t simd_addr_wmask;
1550d14abf15SRobert Mustacchi #define INTR_BLK_SIMD_ADDR_WMASK(_pdev) ((_pdev)->hw_info.intr_blk_info.simd_addr_wmask)
1551d14abf15SRobert Mustacchi
1552d14abf15SRobert Mustacchi u32_t simd_addr_womask;
1553d14abf15SRobert Mustacchi #define INTR_BLK_SIMD_ADDR_WOMASK(_pdev) ((_pdev)->hw_info.intr_blk_info.simd_addr_womask)
1554d14abf15SRobert Mustacchi
1555d14abf15SRobert Mustacchi u32_t cmd_ctrl_rd_wmask;
1556d14abf15SRobert Mustacchi u32_t cmd_ctrl_rd_womask;
1557d14abf15SRobert Mustacchi #define INTR_BLK_CMD_CTRL_INVALID 0
1558d14abf15SRobert Mustacchi #define INTR_BLK_REQUIRE_CMD_CTRL(_pdev) ((_pdev)->hw_info.intr_blk_info.cmd_ctrl_rd_wmask != INTR_BLK_CMD_CTRL_INVALID)
1559d14abf15SRobert Mustacchi #define INTR_BLK_CMD_CTRL_RD_WMASK(_pdev) ((_pdev)->hw_info.intr_blk_info.cmd_ctrl_rd_wmask)
1560d14abf15SRobert Mustacchi #define INTR_BLK_CMD_CTRL_RD_WOMASK(_pdev) ((_pdev)->hw_info.intr_blk_info.cmd_ctrl_rd_womask)
1561d14abf15SRobert Mustacchi
1562d14abf15SRobert Mustacchi /* IGU specific data */
1563d14abf15SRobert Mustacchi lm_igu_info_t igu_info;
1564d14abf15SRobert Mustacchi
1565d14abf15SRobert Mustacchi } lm_intr_blk_info_t;
1566d14abf15SRobert Mustacchi
1567d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
1568d14abf15SRobert Mustacchi #define GET_NUM_VFS_PER_PF(_pdev) ((_pdev)->hw_info.sriov_info.total_vfs)
1569*9b622488SToomas Soome #define GET_NUM_VFS_PER_PATH(_pdev) (64)
1570d14abf15SRobert Mustacchi #else
1571*9b622488SToomas Soome #define GET_NUM_VFS_PER_PF(_pdev) (0)
1572*9b622488SToomas Soome #define GET_NUM_VFS_PER_PATH(_pdev) (0)
1573d14abf15SRobert Mustacchi #endif
1574d14abf15SRobert Mustacchi typedef struct _lm_sriov_info_t {
1575d14abf15SRobert Mustacchi // #define MAX_VF_BAR 3 Fix it when emulation supports 3 bars
1576d14abf15SRobert Mustacchi #define MAX_VF_BAR 2
1577d14abf15SRobert Mustacchi u16_t sriov_control;
1578d14abf15SRobert Mustacchi u16_t total_vfs; /* maximum allowed vfs */
1579d14abf15SRobert Mustacchi u16_t num_vfs;
1580d14abf15SRobert Mustacchi u16_t vf_device_id;
1581d14abf15SRobert Mustacchi u8_t max_chains_per_vf;
1582d14abf15SRobert Mustacchi u8_t vf_cid_wnd_size;
1583d14abf15SRobert Mustacchi u8_t vf_pool_size;
1584d14abf15SRobert Mustacchi u8_t pf_nd_pool_size;
1585d14abf15SRobert Mustacchi u32_t first_vf_in_pf;
1586d14abf15SRobert Mustacchi u32_t vf_bar_size[MAX_VF_BAR];
1587d14abf15SRobert Mustacchi lm_address_t vf_bars[MAX_VF_BAR];
1588d14abf15SRobert Mustacchi
1589d14abf15SRobert Mustacchi u32_t shmem_num_vfs_in_pf;
1590d14abf15SRobert Mustacchi u8_t b_pf_asymetric_configuration;
1591d14abf15SRobert Mustacchi
1592d14abf15SRobert Mustacchi } lm_sriov_info_t;
1593d14abf15SRobert Mustacchi
1594d14abf15SRobert Mustacchi
1595d14abf15SRobert Mustacchi typedef enum
1596d14abf15SRobert Mustacchi {
1597d14abf15SRobert Mustacchi LM_CHIP_PORT_MODE_NONE = 0x0,
1598d14abf15SRobert Mustacchi LM_CHIP_PORT_MODE_2 = 0x1,
1599d14abf15SRobert Mustacchi LM_CHIP_PORT_MODE_4 = 0x2
1600d14abf15SRobert Mustacchi } lm_chip_port_mode_t ;
1601d14abf15SRobert Mustacchi
1602d14abf15SRobert Mustacchi typedef struct _lm_hardware_info_t
1603d14abf15SRobert Mustacchi {
1604d14abf15SRobert Mustacchi /* PCI info. */
1605d14abf15SRobert Mustacchi u16_t vid;
1606d14abf15SRobert Mustacchi u16_t did;
1607d14abf15SRobert Mustacchi u16_t ssid;
1608d14abf15SRobert Mustacchi u16_t svid;
1609d14abf15SRobert Mustacchi
1610d14abf15SRobert Mustacchi u8_t irq;
1611d14abf15SRobert Mustacchi u8_t int_pin;
1612d14abf15SRobert Mustacchi u8_t latency_timer;
1613d14abf15SRobert Mustacchi u8_t cache_line_size;
1614d14abf15SRobert Mustacchi u8_t rev_id;
1615d14abf15SRobert Mustacchi u8_t _pad[3];
1616d14abf15SRobert Mustacchi
1617d14abf15SRobert Mustacchi lm_address_t mem_base[MAX_NUM_BAR];
1618d14abf15SRobert Mustacchi u32_t bar_size[MAX_NUM_BAR];
1619d14abf15SRobert Mustacchi
1620d14abf15SRobert Mustacchi lm_address_t mem_base1;
1621d14abf15SRobert Mustacchi u32_t bar_size1;
1622d14abf15SRobert Mustacchi
1623d14abf15SRobert Mustacchi /* Device info. */
1624d14abf15SRobert Mustacchi u8_t mac_addr[8]; /* Hardware MAC address. */
1625d14abf15SRobert Mustacchi u8_t iscsi_mac_addr[8]; /* Hardware MAC address for iSCSI. */
1626d14abf15SRobert Mustacchi u8_t fcoe_mac_addr[8]; /* Hardware MAC address for FCoE. */
1627d14abf15SRobert Mustacchi u8_t fcoe_wwn_port_name[8]; /* Hardware MAC address for FCoE WWPN. */
1628d14abf15SRobert Mustacchi u8_t fcoe_wwn_node_name[8]; /* Hardware MAC address for FCoE WWNN. */
1629d14abf15SRobert Mustacchi
1630d14abf15SRobert Mustacchi u32_t shmem_base; /* Firmware share memory base addr. */
1631d14abf15SRobert Mustacchi u32_t mf_cfg_base; /* MF cfg offset in shmem_base */
1632d14abf15SRobert Mustacchi u32_t shmem_base2; /* Firmware share memory 2 base addr. */
1633d14abf15SRobert Mustacchi
1634d14abf15SRobert Mustacchi u32_t chip_id; /* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */
1635d14abf15SRobert Mustacchi #define CHIP_NUM_SET(_chip_id,_p) ((_chip_id) = (((_p) & 0xffff) << 16))
1636d14abf15SRobert Mustacchi #define CHIP_NUM(_p) (((_p)->hw_info.chip_id) & 0xffff0000)
1637d14abf15SRobert Mustacchi #define CHIP_NUM_5710 0x164e0000
1638d14abf15SRobert Mustacchi #define CHIP_NUM_5711 0x164f0000
1639d14abf15SRobert Mustacchi #define CHIP_NUM_5711E 0x16500000
1640d14abf15SRobert Mustacchi #define CHIP_NUM_5712 0x16620000
1641d14abf15SRobert Mustacchi #define CHIP_NUM_5712E 0x16630000
1642d14abf15SRobert Mustacchi #define CHIP_NUM_5713 0x16510000
1643d14abf15SRobert Mustacchi #define CHIP_NUM_5713E 0x16520000
1644d14abf15SRobert Mustacchi #define CHIP_NUM_57800 0x168a0000
1645d14abf15SRobert Mustacchi #define CHIP_NUM_57840_OBSOLETE 0x168d0000
1646d14abf15SRobert Mustacchi #define CHIP_NUM_57810 0x168e0000
1647d14abf15SRobert Mustacchi #define CHIP_NUM_57800_MF 0x16a50000
1648d14abf15SRobert Mustacchi #define CHIP_NUM_57840_MF_OBSOLETE 0x16ae0000
1649d14abf15SRobert Mustacchi #define CHIP_NUM_57810_MF 0x16ab0000
1650d14abf15SRobert Mustacchi #define CHIP_NUM_57811 0x163d0000
1651d14abf15SRobert Mustacchi #define CHIP_NUM_57811_MF 0x163e0000
1652d14abf15SRobert Mustacchi #define CHIP_NUM_57811_VF 0x163f0000
1653d14abf15SRobert Mustacchi #define CHIP_NUM_57840_4_10 0x16a10000
1654d14abf15SRobert Mustacchi #define CHIP_NUM_57840_2_20 0x16a20000
1655d14abf15SRobert Mustacchi #define CHIP_NUM_57840_MF 0x16a40000
1656d14abf15SRobert Mustacchi #define CHIP_NUM_57840_VF 0x16ad0000
1657d14abf15SRobert Mustacchi
1658d14abf15SRobert Mustacchi
1659d14abf15SRobert Mustacchi #define CHIP_IS_E1_PARAM(_chip_num) ((_chip_num) == CHIP_NUM_5710)
1660d14abf15SRobert Mustacchi #define CHIP_IS_E1(_p) (CHIP_IS_E1_PARAM(CHIP_NUM(_p)))
1661d14abf15SRobert Mustacchi
1662d14abf15SRobert Mustacchi #define CHIP_IS_E1H_PARAM(_chip_num) (((_chip_num) == CHIP_NUM_5711) || ((_chip_num) == CHIP_NUM_5711E))
1663d14abf15SRobert Mustacchi #define CHIP_IS_E1H(_p) (CHIP_IS_E1H_PARAM(CHIP_NUM(_p)))
1664d14abf15SRobert Mustacchi
1665d14abf15SRobert Mustacchi #define CHIP_IS_E1x_PARAM(_chip_num) (CHIP_IS_E1_PARAM(((_chip_num))) || CHIP_IS_E1H_PARAM(((_chip_num))))
1666d14abf15SRobert Mustacchi #define CHIP_IS_E1x(_p) (CHIP_IS_E1x_PARAM(CHIP_NUM(_p)))
1667d14abf15SRobert Mustacchi
1668d14abf15SRobert Mustacchi #define CHIP_IS_E2_PARAM(_chip_num) (((_chip_num) == CHIP_NUM_5712) || ((_chip_num) == CHIP_NUM_5713) || \
1669d14abf15SRobert Mustacchi ((_chip_num) == CHIP_NUM_5712E) || ((_chip_num) == CHIP_NUM_5713E))
1670d14abf15SRobert Mustacchi
1671d14abf15SRobert Mustacchi #define CHIP_IS_E2(_p) (CHIP_IS_E2_PARAM(CHIP_NUM(_p)))
1672d14abf15SRobert Mustacchi
1673d14abf15SRobert Mustacchi #define CHIP_IS_E3_PARAM(_chip_num) ((_chip_num == CHIP_NUM_57800) || (_chip_num == CHIP_NUM_57810) || \
1674d14abf15SRobert Mustacchi (_chip_num == CHIP_NUM_57840_4_10) || (_chip_num == CHIP_NUM_57840_2_20) || (_chip_num == CHIP_NUM_57800_MF) || \
1675d14abf15SRobert Mustacchi (_chip_num == CHIP_NUM_57810_MF) || (_chip_num == CHIP_NUM_57840_MF) || \
1676d14abf15SRobert Mustacchi (_chip_num == CHIP_NUM_57840_OBSOLETE) || (_chip_num == CHIP_NUM_57840_MF_OBSOLETE) || \
1677d14abf15SRobert Mustacchi (_chip_num == CHIP_NUM_57811) || (_chip_num == CHIP_NUM_57811_MF) || \
1678d14abf15SRobert Mustacchi (_chip_num == CHIP_NUM_57811_VF))
1679d14abf15SRobert Mustacchi
1680d14abf15SRobert Mustacchi #define CHIP_IS_E3(_p) (CHIP_IS_E3_PARAM(CHIP_NUM(_p)))
1681d14abf15SRobert Mustacchi
1682d14abf15SRobert Mustacchi #define CHIP_IS_E2E3(_p) (CHIP_IS_E2(_p) || (CHIP_IS_E3(_p)))
1683d14abf15SRobert Mustacchi
1684d14abf15SRobert Mustacchi
1685d14abf15SRobert Mustacchi #define CHIP_IS_E2E3A0(_p) (CHIP_IS_E2(_p) || (CHIP_IS_E3A0(_p)))
1686d14abf15SRobert Mustacchi
1687d14abf15SRobert Mustacchi #define CHIP_REV_SHIFT 12
1688d14abf15SRobert Mustacchi #define CHIP_REV_MASK (0xF<<CHIP_REV_SHIFT)
1689d14abf15SRobert Mustacchi #define CHIP_REV(_p) (((_p)->hw_info.chip_id) & CHIP_REV_MASK)
1690d14abf15SRobert Mustacchi #define CHIP_REV_Ax (0x0<<CHIP_REV_SHIFT)
1691d14abf15SRobert Mustacchi #define CHIP_REV_Bx (0x1<<CHIP_REV_SHIFT)
1692d14abf15SRobert Mustacchi #define CHIP_REV_Cx (0x2<<CHIP_REV_SHIFT)
1693d14abf15SRobert Mustacchi #define CHIP_REV_SIM_IS_FPGA (0x1<<CHIP_REV_SHIFT)
1694d14abf15SRobert Mustacchi
1695d14abf15SRobert Mustacchi #define CHIP_REV_ASIC_MAX (0x5<<CHIP_REV_SHIFT)
1696d14abf15SRobert Mustacchi #define CHIP_REV_IS_SLOW(_p) (CHIP_REV(_p) > CHIP_REV_ASIC_MAX)
1697d14abf15SRobert Mustacchi #define CHIP_REV_IS_FPGA(_p) (CHIP_REV_IS_SLOW(_p) && (CHIP_REV(_p) & CHIP_REV_SIM_IS_FPGA))
1698d14abf15SRobert Mustacchi #define CHIP_REV_IS_EMUL(_p) (CHIP_REV_IS_SLOW(_p) && !(CHIP_REV(_p)& CHIP_REV_SIM_IS_FPGA)) //if it's simulated, and not FPGA, it's EMUL.
1699d14abf15SRobert Mustacchi #define CHIP_REV_IS_ASIC(_p) (!CHIP_REV_IS_SLOW(_p))
1700d14abf15SRobert Mustacchi #define CHIP_REV_SIM(_p) ((0xF - (CHIP_REV(_p)>>CHIP_REV_SHIFT))>>1)<<CHIP_REV_SHIFT //For EMUL: Ax=0xE, Bx=0xC, Cx=0xA. For FPGA: Ax=0xF, Bx=0xD, Cx=0xB.
1701d14abf15SRobert Mustacchi
1702d14abf15SRobert Mustacchi #define CHIP_IS_E3B0(_p) (CHIP_IS_E3(_p)&&( (CHIP_REV(_p) == CHIP_REV_Bx)||(CHIP_REV_SIM(_p) == CHIP_REV_Bx)))
1703d14abf15SRobert Mustacchi
1704d14abf15SRobert Mustacchi #define CHIP_IS_E3A0(_p) (CHIP_IS_E3(_p)&&( (CHIP_REV(_p) == CHIP_REV_Ax)||(CHIP_REV_SIM(_p) == CHIP_REV_Ax)))
1705d14abf15SRobert Mustacchi
1706d14abf15SRobert Mustacchi #define CHIP_METAL(_p) (((_p)->hw_info.chip_id) & 0x00000ff0)
1707d14abf15SRobert Mustacchi #define CHIP_BONDING(_p) (((_p)->hw_info.chip_id) & 0x0000000f)
1708d14abf15SRobert Mustacchi
1709d14abf15SRobert Mustacchi #define CHIP_ID(_p) (((_p)->hw_info.chip_id) & 0xfffffff0)
1710d14abf15SRobert Mustacchi #define CHIP_ID_5706_A0 0x57060000
1711d14abf15SRobert Mustacchi #define CHIP_ID_5706_A1 0x57060010
1712d14abf15SRobert Mustacchi #define CHIP_ID_5706_FPGA 0x5706f000
1713d14abf15SRobert Mustacchi #define CHIP_ID_5706_IKOS 0x5706e000
1714d14abf15SRobert Mustacchi #define CHIP_ID_5708_A0 0x57080000
1715d14abf15SRobert Mustacchi #define CHIP_ID_5708_B0 0x57081000
1716d14abf15SRobert Mustacchi #define CHIP_ID_5708_FPGA 0x5708f000
1717d14abf15SRobert Mustacchi #define CHIP_ID_5708_IKOS 0x5708e000
1718d14abf15SRobert Mustacchi #define CHIP_ID_5710_EMUL 0X164ed000
1719d14abf15SRobert Mustacchi #define CHIP_ID_5710_A0 0x164e0000
1720d14abf15SRobert Mustacchi #define CHIP_ID_5710_A1 0x164e0010
1721d14abf15SRobert Mustacchi
1722d14abf15SRobert Mustacchi #define IS_CHIP_REV_A0(_p) (CHIP_ID(_p) == CHIP_ID_5710_A0)
1723d14abf15SRobert Mustacchi #define IS_CHIP_REV_A1(_p) (CHIP_ID(_p) == CHIP_ID_5710_A1)
1724d14abf15SRobert Mustacchi
1725d14abf15SRobert Mustacchi #define CHIP_BOND_ID(_p) (((_p)->hw_info.chip_id) & 0xf)
1726d14abf15SRobert Mustacchi
1727d14abf15SRobert Mustacchi /* A serdes chip will have the first bit of the bond id set. */
1728d14abf15SRobert Mustacchi #define CHIP_BOND_ID_SERDES_BIT 0x01
1729d14abf15SRobert Mustacchi
1730d14abf15SRobert Mustacchi /* This bit defines if OTP process was done on chip */
1731d14abf15SRobert Mustacchi #define CHIP_OPT_MISC_DO_BIT 0x02
1732d14abf15SRobert Mustacchi
1733d14abf15SRobert Mustacchi u8_t silent_chip_rev; /* silent chip rev:
1734d14abf15SRobert Mustacchi For 57711 0-A0, 1-A1 2-A2
1735d14abf15SRobert Mustacchi For 57710 0-A1 1-A2 */
1736d14abf15SRobert Mustacchi #define SILENT_CHIP_REV(_p) ((_p)->hw_info.silent_chip_rev)
1737d14abf15SRobert Mustacchi #define SILENT_REV_E1_A0 0xFF
1738d14abf15SRobert Mustacchi #define SILENT_REV_E1_A1 0x00
1739d14abf15SRobert Mustacchi #define SILENT_REV_E1_A2 0x01
1740d14abf15SRobert Mustacchi
1741d14abf15SRobert Mustacchi #define SILENT_REV_E1H_A0 0x00
1742d14abf15SRobert Mustacchi #define SILENT_REV_E1H_A1 0x01
1743d14abf15SRobert Mustacchi #define SILENT_REV_E1H_A2 0x02
1744d14abf15SRobert Mustacchi
1745d14abf15SRobert Mustacchi #define SILENT_REV_E3_B0 0x00
1746d14abf15SRobert Mustacchi #define SILENT_REV_E3_B1 0x01
1747d14abf15SRobert Mustacchi
1748d14abf15SRobert Mustacchi /* In E2, the chip can be configured in 2-port mode (i.e. 1 port per path) or 4-port mode (i.e. 2 port per path)
1749d14abf15SRobert Mustacchi * the driver needs this information since it needs to configure several blocks accordingly */
1750d14abf15SRobert Mustacchi lm_chip_port_mode_t chip_port_mode;
1751d14abf15SRobert Mustacchi #define CHIP_PORT_MODE(_p) ((_p)->hw_info.chip_port_mode)
1752d14abf15SRobert Mustacchi
1753d14abf15SRobert Mustacchi /* HW config from nvram. */
1754d14abf15SRobert Mustacchi u32_t nvm_hw_config;
1755d14abf15SRobert Mustacchi u32_t nvm_hw_config2;
1756d14abf15SRobert Mustacchi
1757d14abf15SRobert Mustacchi /* board sn*/
1758d14abf15SRobert Mustacchi u8_t board_num[16];
1759d14abf15SRobert Mustacchi
1760d14abf15SRobert Mustacchi /* Flash info. */
1761d14abf15SRobert Mustacchi flash_spec_t flash_spec;
1762d14abf15SRobert Mustacchi
1763d14abf15SRobert Mustacchi /* Needed for pxp config should be done by the MCP*/
1764d14abf15SRobert Mustacchi u8_t max_payload_size;
1765d14abf15SRobert Mustacchi u8_t max_read_req_size;
1766d14abf15SRobert Mustacchi
1767d14abf15SRobert Mustacchi u8_t mcp_detected;
1768d14abf15SRobert Mustacchi
1769d14abf15SRobert Mustacchi // external phy fw version
1770d14abf15SRobert Mustacchi u8_t sz_ext_phy_fw_ver[16];// NULL terminated string populated only after a call to get ext phy fw version
1771d14abf15SRobert Mustacchi
1772d14abf15SRobert Mustacchi // link config
1773d14abf15SRobert Mustacchi u32_t link_config[ELINK_LINK_CONFIG_SIZE];
1774d14abf15SRobert Mustacchi
1775d14abf15SRobert Mustacchi // initial dual phy priority config
1776d14abf15SRobert Mustacchi u32_t multi_phy_config;
1777d14abf15SRobert Mustacchi
1778d14abf15SRobert Mustacchi u32_t phy_force_kr_enabler; // read from shmem
1779d14abf15SRobert Mustacchi
1780d14abf15SRobert Mustacchi u8_t no_10g_kr; // TRUE if the KR enforcer is active on this session
1781d14abf15SRobert Mustacchi
1782d14abf15SRobert Mustacchi // pcie info
1783d14abf15SRobert Mustacchi u8_t pcie_lane_width;
1784d14abf15SRobert Mustacchi #define PCIE_WIDTH_1 1
1785d14abf15SRobert Mustacchi #define PCIE_WIDTH_2 2
1786d14abf15SRobert Mustacchi #define PCIE_WIDTH_4 4
1787d14abf15SRobert Mustacchi #define PCIE_WIDTH_8 8
1788d14abf15SRobert Mustacchi #define PCIE_WIDTH_16 16
1789d14abf15SRobert Mustacchi #define PCIE_WIDTH_32 32
1790d14abf15SRobert Mustacchi
1791d14abf15SRobert Mustacchi u8_t pcie_lane_speed;
1792d14abf15SRobert Mustacchi #define PCIE_LANE_SPEED_2_5G 1
1793d14abf15SRobert Mustacchi #define PCIE_LANE_SPEED_5G 2
1794d14abf15SRobert Mustacchi #define PCIE_LANE_SPEED_8G 3
1795d14abf15SRobert Mustacchi
1796d14abf15SRobert Mustacchi // In E2 chip rev A0 the PCI LANE speed are different (ERR 8)
1797d14abf15SRobert Mustacchi #define PCIE_LANE_SPEED_2_5G_E2_A0 0
1798d14abf15SRobert Mustacchi #define PCIE_LANE_SPEED_5G_E2_A0 1
1799d14abf15SRobert Mustacchi
1800d14abf15SRobert Mustacchi // We need to save PF0's MPS before going to D3 and restore it when
1801d14abf15SRobert Mustacchi // returning to D0 to compensate for a Windows bug. See CQ57271.
1802d14abf15SRobert Mustacchi u32_t saved_pf0_pcie_mps;
1803d14abf15SRobert Mustacchi #define INVALID_MPS 0xEEEEEEEE //this will never be a valid value since MPS occupies only bits 5-7.
1804d14abf15SRobert Mustacchi
1805d14abf15SRobert Mustacchi // mba features
1806d14abf15SRobert Mustacchi u8_t mba_features;
1807d14abf15SRobert Mustacchi
1808d14abf15SRobert Mustacchi // port_feature_config bits
1809d14abf15SRobert Mustacchi u32_t port_feature_config;
1810d14abf15SRobert Mustacchi
1811d14abf15SRobert Mustacchi // mba vlan enable bits
1812d14abf15SRobert Mustacchi u32_t mba_vlan_cfg ;
1813d14abf15SRobert Mustacchi
1814d14abf15SRobert Mustacchi // TRUE if dcc is active
1815d14abf15SRobert Mustacchi u8_t is_dcc_active;
1816d14abf15SRobert Mustacchi
1817d14abf15SRobert Mustacchi // bc rev
1818d14abf15SRobert Mustacchi u32_t bc_rev;
1819d14abf15SRobert Mustacchi // ther driver should not load with bc less then the following
1820d14abf15SRobert Mustacchi #define BC_REV_SUPPORTED 0x040200 //4.2.0
1821d14abf15SRobert Mustacchi #define BC_REV_IE_DCB_SUPPORTED 0x070200 //7.2.0
1822d14abf15SRobert Mustacchi #define BC_REV_IE_SRIOV_SUPPORTED 0x070400 //7.4.0
1823d14abf15SRobert Mustacchi
1824d14abf15SRobert Mustacchi #define LM_GET_BC_REV_MAJOR(_p) (_p->hw_info.bc_rev>>8)
1825d14abf15SRobert Mustacchi
1826d14abf15SRobert Mustacchi /* HW Licensing of Max #connections for each protocol, takes into account bar-size, licensing is 'per-port' and not 'per functions' */
1827d14abf15SRobert Mustacchi u32_t max_port_toe_conn;
1828d14abf15SRobert Mustacchi u32_t max_port_rdma_conn;
1829d14abf15SRobert Mustacchi u32_t max_port_iscsi_conn;
1830d14abf15SRobert Mustacchi u32_t max_port_fcoe_conn;
1831d14abf15SRobert Mustacchi u32_t max_port_conns; /* the maximum number of connections support for this port, used to configure PORT registers */
1832d14abf15SRobert Mustacchi u32_t max_common_conns; /* the maximum number of connections support for ALL ports, used to configure COMMON registers, only used by PORT-MASTER */
1833d14abf15SRobert Mustacchi
1834d14abf15SRobert Mustacchi lm_hardware_mf_info_t mf_info;
1835d14abf15SRobert Mustacchi
1836d14abf15SRobert Mustacchi /* Information on interrupt block are we working with - HC or IGU (E1/E1H or E2 and above) */
1837d14abf15SRobert Mustacchi lm_intr_blk_info_t intr_blk_info;
1838d14abf15SRobert Mustacchi
1839d14abf15SRobert Mustacchi lm_sriov_info_t sriov_info;
1840d14abf15SRobert Mustacchi
1841d14abf15SRobert Mustacchi u8_t flr_capable;
1842d14abf15SRobert Mustacchi u8_t pci_cfg_trust;
1843d14abf15SRobert Mustacchi #define PCI_CFG_NOT_TESTED_FOR_TRUST 0x00
1844d14abf15SRobert Mustacchi #define PCI_CFG_NOT_TRUSTED 0x01
1845d14abf15SRobert Mustacchi #define PCI_CFG_TRUSTED 0x02
1846d14abf15SRobert Mustacchi
1847d14abf15SRobert Mustacchi u8_t pda_pm_reset_in_progress;
1848d14abf15SRobert Mustacchi #define SET_PDA_PM_RESET_IN_PROGRESS(_pdev) ((_pdev)->hw_info.pda_pm_reset_in_progress = TRUE)
1849d14abf15SRobert Mustacchi #define CLEAR_PDA_PM_RESET_IN_PROGRESS(_pdev) ((_pdev)->hw_info.pda_pm_reset_in_progress = FALSE)
1850d14abf15SRobert Mustacchi #define IS_PDA_PM_RESET_IN_PROGRESS(_pdev) ((_pdev)->hw_info.pda_pm_reset_in_progress)
1851d14abf15SRobert Mustacchi
1852d14abf15SRobert Mustacchi u8_t ___pad;
1853d14abf15SRobert Mustacchi u32_t grc_didvid;
1854d14abf15SRobert Mustacchi u32_t pci_cfg_didvid;
1855d14abf15SRobert Mustacchi u32_t pcie_caps_offset;
1856d14abf15SRobert Mustacchi u32_t pcie_dev_capabilities;
1857d14abf15SRobert Mustacchi } lm_hardware_info_t;
1858d14abf15SRobert Mustacchi
1859d14abf15SRobert Mustacchi
1860d14abf15SRobert Mustacchi
1861d14abf15SRobert Mustacchi //this struct encapsulates both the default status block as well as the RSS status blocks.
1862d14abf15SRobert Mustacchi typedef struct _gen_sp_status_block_t
1863d14abf15SRobert Mustacchi {
1864d14abf15SRobert Mustacchi /*physical address of the status block.*/
1865d14abf15SRobert Mustacchi lm_address_t blk_phy_address;
1866d14abf15SRobert Mustacchi struct hc_sp_status_block_data sb_data;
1867d14abf15SRobert Mustacchi volatile struct host_sp_status_block * hc_sp_status_blk;
1868d14abf15SRobert Mustacchi } gen_sp_status_block_t;
1869d14abf15SRobert Mustacchi
1870d14abf15SRobert Mustacchi //this struct encapsulates both the default status block as well as the RSS status blocks.
1871d14abf15SRobert Mustacchi typedef struct _gen_status_block_t
1872d14abf15SRobert Mustacchi {
1873d14abf15SRobert Mustacchi union {
1874d14abf15SRobert Mustacchi struct hc_status_block_data_e1x e1x_sb_data;
1875d14abf15SRobert Mustacchi struct hc_status_block_data_e2 e2_sb_data;
1876d14abf15SRobert Mustacchi lm_address_t vf_sb_phy_address;
1877d14abf15SRobert Mustacchi } hc_status_block_data;
1878d14abf15SRobert Mustacchi
1879d14abf15SRobert Mustacchi union {
1880d14abf15SRobert Mustacchi /*pointer to default status block */
1881d14abf15SRobert Mustacchi volatile struct host_hc_status_block_e1x * e1x_sb;
1882d14abf15SRobert Mustacchi /*pointer to RSS status block */
1883d14abf15SRobert Mustacchi volatile struct host_hc_status_block_e2 * e2_sb;
1884d14abf15SRobert Mustacchi volatile u16_t * vf_sb;
1885d14abf15SRobert Mustacchi } host_hc_status_block;
1886d14abf15SRobert Mustacchi
1887d14abf15SRobert Mustacchi /*physical address of the status block.*/
1888d14abf15SRobert Mustacchi } gen_status_block_t;
1889d14abf15SRobert Mustacchi
1890d14abf15SRobert Mustacchi //attn group wiring
1891d14abf15SRobert Mustacchi typedef struct _route_cfg_sig_output
1892d14abf15SRobert Mustacchi {
1893d14abf15SRobert Mustacchi #define NUM_ATTN_REGS_E1X 4
1894d14abf15SRobert Mustacchi #define NUM_ATTN_REGS_E2 5
1895d14abf15SRobert Mustacchi #define MAX_ATTN_REGS 5
1896d14abf15SRobert Mustacchi
1897d14abf15SRobert Mustacchi u32_t attn_sig_dword[MAX_ATTN_REGS];
1898d14abf15SRobert Mustacchi
1899d14abf15SRobert Mustacchi } route_cfg_sig_output;
1900d14abf15SRobert Mustacchi
1901d14abf15SRobert Mustacchi /* interrupt/host coalesing configuration info */
1902d14abf15SRobert Mustacchi #define HC_TIMEOUT_RESOLUTION_IN_US 4
1903d14abf15SRobert Mustacchi typedef struct _lm_int_coalesing_info {
1904d14abf15SRobert Mustacchi struct dynamic_hc_config eth_dynamic_hc_cfg;
1905d14abf15SRobert Mustacchi
1906d14abf15SRobert Mustacchi u32_t hc_usec_c_sb[HC_CSTORM_SB_NUM_INDICES]; /* static host coalescing period for cstorm sb indexes */
1907d14abf15SRobert Mustacchi u32_t hc_usec_u_sb[HC_USTORM_SB_NUM_INDICES]; /* static host coalescing period for ustorm sb indexes */
1908d14abf15SRobert Mustacchi } lm_int_coalesing_info;
1909d14abf15SRobert Mustacchi
1910d14abf15SRobert Mustacchi /*******************************************************************************
1911d14abf15SRobert Mustacchi * Device state variables.
1912d14abf15SRobert Mustacchi ******************************************************************************/
1913d14abf15SRobert Mustacchi // Driver increase/decrease/set macros for L2/L4
1914d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_INC(_pdev, layer_type, field_name) \
1915d14abf15SRobert Mustacchi mm_atomic_inc(&((_pdev->vars.stats.stats_mirror.stats_drv.drv_##layer_type.field_name)));
1916d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_DEC(_pdev, layer_type, field_name) \
1917d14abf15SRobert Mustacchi mm_atomic_dec(&((_pdev->vars.stats.stats_mirror.stats_drv.drv_##layer_type.field_name)));
1918d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_INC(_pdev, layer_type, field_name) \
1919d14abf15SRobert Mustacchi ((_pdev->vars.stats.stats_mirror.stats_drv.drv_##layer_type.field_name)++);
1920d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_DEC(_pdev, layer_type, field_name) \
1921d14abf15SRobert Mustacchi ((_pdev->vars.stats.stats_mirror.stats_drv.drv_##layer_type.field_name)--);
1922d14abf15SRobert Mustacchi
1923d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_INC_TOE(_pdev, field_name) LM_COMMON_DRV_STATS_ATOMIC_INC(_pdev, toe, field_name)
1924d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_DEC_TOE(_pdev, field_name) LM_COMMON_DRV_STATS_ATOMIC_DEC(_pdev, toe, field_name)
1925d14abf15SRobert Mustacchi
1926d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_INC_ETH(_pdev, field_name) LM_COMMON_DRV_STATS_INC(_pdev, eth, field_name)
1927d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_DEC_ETH(_pdev, field_name) LM_COMMON_DRV_STATS_DEC(_pdev, eth, field_name)
1928d14abf15SRobert Mustacchi
1929d14abf15SRobert Mustacchi /* currently driver ETH stats that use ATOMIC_INC are not required for NDIS or BACS, therefore they are disabled in release version */
1930d14abf15SRobert Mustacchi #if DBG
1931d14abf15SRobert Mustacchi
1932d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(_pdev, field_name) LM_COMMON_DRV_STATS_ATOMIC_INC(_pdev, eth, field_name)
1933d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_DEC_ETH(_pdev, field_name) LM_COMMON_DRV_STATS_ATOMIC_DEC(_pdev, eth, field_name)
1934d14abf15SRobert Mustacchi #else
1935d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(_pdev, field_name)
1936d14abf15SRobert Mustacchi #define LM_COMMON_DRV_STATS_ATOMIC_DEC_ETH(_pdev, field_name)
1937d14abf15SRobert Mustacchi #endif /* DBG */
1938d14abf15SRobert Mustacchi
1939d14abf15SRobert Mustacchi /* this is a wrapper structure for a vf to pf message, it contains the message itself,
1940d14abf15SRobert Mustacchi * we use a void pointer to the actual message to enable compiling the vbd with out the vf/pf interface
1941d14abf15SRobert Mustacchi */
1942d14abf15SRobert Mustacchi typedef struct _lm_vf_pf_message_t
1943d14abf15SRobert Mustacchi {
1944d14abf15SRobert Mustacchi u32_t state;
1945d14abf15SRobert Mustacchi u32_t message_size;
1946d14abf15SRobert Mustacchi void * message_virt_addr;
1947d14abf15SRobert Mustacchi lm_address_t message_phys_addr;
1948d14abf15SRobert Mustacchi void * bulletin_virt_addr;
1949d14abf15SRobert Mustacchi lm_address_t bulletin_phys_addr;
1950d14abf15SRobert Mustacchi volatile u16 * done;
1951d14abf15SRobert Mustacchi void * cookie;
1952d14abf15SRobert Mustacchi u16_t do_not_arm_trigger;
1953d14abf15SRobert Mustacchi u16_t old_version;
1954d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
1955*9b622488SToomas Soome union
1956d14abf15SRobert Mustacchi {
1957d14abf15SRobert Mustacchi struct pf_vf_msg_hdr sw_channel_hdr;
1958d14abf15SRobert Mustacchi struct pfvf_tlv hw_channel_hdr;
1959d14abf15SRobert Mustacchi } bad_response;
1960d14abf15SRobert Mustacchi #endif
1961d14abf15SRobert Mustacchi }
1962d14abf15SRobert Mustacchi lm_vf_pf_message_t;
1963d14abf15SRobert Mustacchi
1964d14abf15SRobert Mustacchi
1965d14abf15SRobert Mustacchi ////////////////////// Start DCBX define /////////////////////////////////////////////////////
1966d14abf15SRobert Mustacchi #define LM_DCBX_IE_IS_ETS_DISABLE(_num_traffic_classes) (0 == (_num_traffic_classes))
1967d14abf15SRobert Mustacchi #define LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(_entries) ((_entries) * sizeof(dcb_classif_elem_t))
1968d14abf15SRobert Mustacchi
1969d14abf15SRobert Mustacchi // regular + extension
1970d14abf15SRobert Mustacchi #define LM_DCBX_IE_CHIP_CLASSIF_NUM_ENTRIES_LOCAL (DCBX_MAX_APP_LOCAL)
1971d14abf15SRobert Mustacchi #define LM_DCBX_IE_CHIP_CLASSIF_NUM_ENTRIES_REMOTE (DCBX_MAX_APP_PROTOCOL)
1972d14abf15SRobert Mustacchi // 2 = 1 for default + 1 for ISCSI
1973d14abf15SRobert Mustacchi #define LM_DCBX_IE_CLASSIF_NUM_ENTRIES_LOCAL (LM_DCBX_IE_CHIP_CLASSIF_NUM_ENTRIES_LOCAL + 2)
1974d14abf15SRobert Mustacchi #define LM_DCBX_IE_CLASSIF_NUM_ENTRIES_REMOTE (LM_DCBX_IE_CHIP_CLASSIF_NUM_ENTRIES_REMOTE)
1975d14abf15SRobert Mustacchi
1976d14abf15SRobert Mustacchi #define LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_LOCAL (LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(LM_DCBX_IE_CLASSIF_NUM_ENTRIES_LOCAL))
1977d14abf15SRobert Mustacchi #define LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_REMOTE (LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(LM_DCBX_IE_CLASSIF_NUM_ENTRIES_REMOTE))
1978d14abf15SRobert Mustacchi // For debbuging purpose only This size has no arbitrary.
1979d14abf15SRobert Mustacchi #define LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_DBG (LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(16))
1980d14abf15SRobert Mustacchi
1981d14abf15SRobert Mustacchi #define LM_DCBX_MAX_TRAFFIC_TYPES (8)
1982d14abf15SRobert Mustacchi #define LM_DCBX_ILLEGAL_PRI (MAX_PFC_PRIORITIES)
1983d14abf15SRobert Mustacchi
1984d14abf15SRobert Mustacchi #define IS_DCB_SUPPORTED_BY_CHIP(_pdev) (!(CHIP_IS_E1x(_pdev)))
1985d14abf15SRobert Mustacchi
1986d14abf15SRobert Mustacchi #define IS_DCB_SUPPORTED(_pdev) (((_pdev)->params.dcbx_config_params.dcb_enable) && \
1987d14abf15SRobert Mustacchi IS_DCB_SUPPORTED_BY_CHIP(_pdev))
1988d14abf15SRobert Mustacchi
1989d14abf15SRobert Mustacchi #define IS_DCB_ENABLED(_pdev) ((_pdev)->dcbx_info.is_enabled)
1990d14abf15SRobert Mustacchi
1991d14abf15SRobert Mustacchi #define LM_DCBX_ADMIN_MIB_OFFSET(_pdev ,_mf_cfg_offfset) (_mf_cfg_offfset + \
1992d14abf15SRobert Mustacchi PORT_MAX * sizeof(lldp_params_t) + \
1993d14abf15SRobert Mustacchi PORT_ID(_pdev) * sizeof(lldp_admin_mib_t))
1994d14abf15SRobert Mustacchi
1995d14abf15SRobert Mustacchi
1996d14abf15SRobert Mustacchi typedef struct _lm_dcbx_stat
1997d14abf15SRobert Mustacchi {
1998d14abf15SRobert Mustacchi u64_t pfc_frames_sent;
1999d14abf15SRobert Mustacchi u64_t pfc_frames_received;
2000d14abf15SRobert Mustacchi }lm_dcbx_stat;
2001d14abf15SRobert Mustacchi
2002d14abf15SRobert Mustacchi typedef enum
2003d14abf15SRobert Mustacchi {
2004d14abf15SRobert Mustacchi FUNCTION_DCBX_START_POSTED = 0,
2005d14abf15SRobert Mustacchi FUNCTION_DCBX_START_COMPLETED = 1,
2006d14abf15SRobert Mustacchi FUNCTION_DCBX_STOP_POSTED = 2,
2007d14abf15SRobert Mustacchi FUNCTION_DCBX_STOP_COMPLETED = 3,
2008d14abf15SRobert Mustacchi } lm_dcbx_function_state_t;
2009d14abf15SRobert Mustacchi
2010d14abf15SRobert Mustacchi typedef enum
2011d14abf15SRobert Mustacchi {
2012d14abf15SRobert Mustacchi lm_dcbx_drv_flags_set_bit = 0,
2013d14abf15SRobert Mustacchi lm_dcbx_drv_flags_reset_bit = 1,
2014d14abf15SRobert Mustacchi lm_dcbx_drv_flags_reset_flags = 2,
2015d14abf15SRobert Mustacchi }lm_dcbx_drv_flags_cmd_t;
2016d14abf15SRobert Mustacchi
2017d14abf15SRobert Mustacchi typedef enum {
2018d14abf15SRobert Mustacchi lm_dcbx_ets_config_state_cee,
2019d14abf15SRobert Mustacchi lm_dcbx_ets_config_state_ieee,
2020d14abf15SRobert Mustacchi }lm_dcbx_ets_config_state;
2021d14abf15SRobert Mustacchi
2022d14abf15SRobert Mustacchi typedef enum {
2023d14abf15SRobert Mustacchi lm_dcbx_ets_ieee_config_not_valid,
2024d14abf15SRobert Mustacchi lm_dcbx_ets_ieee_config_en,
2025d14abf15SRobert Mustacchi lm_dcbx_ets_ieee_config_di,
2026d14abf15SRobert Mustacchi }lm_dcbx_ie_ets_ieee_config_state;
2027d14abf15SRobert Mustacchi
2028d14abf15SRobert Mustacchi typedef struct _lm_dcbx_indicate_event_t
2029d14abf15SRobert Mustacchi {
2030d14abf15SRobert Mustacchi // This design supports only one client bounded
2031d14abf15SRobert Mustacchi u8_t lm_cli_idx;
2032d14abf15SRobert Mustacchi
2033d14abf15SRobert Mustacchi u32_t dcb_current_oper_state_bitmap;
2034d14abf15SRobert Mustacchi #define DCB_STATE_CONFIGURED_BY_OS_QOS (1 << 0)
2035d14abf15SRobert Mustacchi #define DCB_STATE_CONFIGURED_BY_OS_QOS_TO_WILLING (1 << 1)
2036d14abf15SRobert Mustacchi
2037d14abf15SRobert Mustacchi lm_dcbx_ets_config_state ets_config_state;
2038d14abf15SRobert Mustacchi
2039d14abf15SRobert Mustacchi u8_t is_ets_ieee_params_os_valid;
2040d14abf15SRobert Mustacchi dcb_ets_tsa_param_t ets_ieee_params_os;
2041d14abf15SRobert Mustacchi
2042d14abf15SRobert Mustacchi // Configuration parameters
2043d14abf15SRobert Mustacchi lm_dcbx_ie_ets_ieee_config_state ets_ieee_config_state;
2044d14abf15SRobert Mustacchi dcb_ets_tsa_param_t ets_ieee_params_config;
2045d14abf15SRobert Mustacchi
2046d14abf15SRobert Mustacchi // CEE doesn't support CONDITION_TCP_PORT.
2047d14abf15SRobert Mustacchi // If an ISCSI entry with CONDITION_TCP_PORT will be accepted (and enforced), but kept locally in the driver
2048d14abf15SRobert Mustacchi // and not passed to MCP. This entry will be used when determining iSCSI priority:
2049d14abf15SRobert Mustacchi // If the operational configuration from MCP contains an entry with 'TCP or UDP port' = 3260 use that entry,
2050d14abf15SRobert Mustacchi // Else if OS configuration contained an entry with 'TCP port' = 3260 use that entry,
2051d14abf15SRobert Mustacchi // Else use the default configuration.
2052d14abf15SRobert Mustacchi u16_t iscsi_tcp_pri;
2053d14abf15SRobert Mustacchi // Only for debug use
2054d14abf15SRobert Mustacchi dcb_indicate_event_params_t dcb_params_given_dbg;
2055d14abf15SRobert Mustacchi
2056d14abf15SRobert Mustacchi dcb_indicate_event_params_t local_params;
2057d14abf15SRobert Mustacchi dcb_indicate_event_params_t remote_params;
2058d14abf15SRobert Mustacchi }lm_dcbx_indicate_event_t;
2059d14abf15SRobert Mustacchi
2060d14abf15SRobert Mustacchi typedef struct _lm_dcbx_info_t
2061d14abf15SRobert Mustacchi {
2062d14abf15SRobert Mustacchi dcbx_update_task_state dcbx_update_lpme_task_state;
2063d14abf15SRobert Mustacchi // The dcbx ramrod state
2064d14abf15SRobert Mustacchi volatile u32_t dcbx_ramrod_state;
2065d14abf15SRobert Mustacchi // Flow control configuration
2066d14abf15SRobert Mustacchi void *pfc_fw_cfg_virt;
2067d14abf15SRobert Mustacchi lm_address_t pfc_fw_cfg_phys;
2068d14abf15SRobert Mustacchi
2069d14abf15SRobert Mustacchi u32_t dcbx_error;
2070d14abf15SRobert Mustacchi #define DCBX_ERROR_NO_ERROR (0)
2071d14abf15SRobert Mustacchi #define DCBX_ERROR_MCP_CMD_FAILED (1 << 0)
2072d14abf15SRobert Mustacchi #define DCBX_ERROR_SET_TIMER (1 << 1)
2073d14abf15SRobert Mustacchi #define DCBX_ERROR_REGISTER_LPME (1 << 2)
2074d14abf15SRobert Mustacchi #define DCBX_ERROR_WRONG_PORT (1 << 3)
2075d14abf15SRobert Mustacchi #define DCBX_ERROR_RESOURCE (1 << 4)
2076d14abf15SRobert Mustacchi
2077d14abf15SRobert Mustacchi // This parameter can only be changed in is_dcbx_neg_received and is a one-shut parameter
2078d14abf15SRobert Mustacchi u8_t is_dcbx_neg_received;
2079d14abf15SRobert Mustacchi u8_t is_enabled;
2080d14abf15SRobert Mustacchi u8_t _pad[2];
2081d14abf15SRobert Mustacchi lm_dcbx_indicate_event_t indicate_event;
2082d14abf15SRobert Mustacchi
2083d14abf15SRobert Mustacchi // saved the original admin MIB
2084d14abf15SRobert Mustacchi // Should not be used in MF this is only a pach until MCP will know how to return to default
2085d14abf15SRobert Mustacchi lldp_admin_mib_t admin_mib_org;
2086d14abf15SRobert Mustacchi
2087d14abf15SRobert Mustacchi // Indicate event to upper layer.
2088d14abf15SRobert Mustacchi volatile u32_t is_indicate_event_en;
2089d14abf15SRobert Mustacchi /*
2090d14abf15SRobert Mustacchi 1. This array will serve in order to find the correct COS in Fast path in O (1).(Instead of O(num_of_opr_cos))
2091d14abf15SRobert Mustacchi 2. All entries must always contain a valid COS value that will be between "num_of_opr_cos -1".
2092d14abf15SRobert Mustacchi 3. This array will be filled in slow path.
2093d14abf15SRobert Mustacchi 4. Any Array change or access will not require any lock.
2094d14abf15SRobert Mustacchi */
2095d14abf15SRobert Mustacchi u8_t pri_to_cos[LM_DCBX_MAX_TRAFFIC_TYPES];
2096d14abf15SRobert Mustacchi
2097d14abf15SRobert Mustacchi // For debugging
2098d14abf15SRobert Mustacchi u32_t lpme_failed_cnt;
2099d14abf15SRobert Mustacchi
2100d14abf15SRobert Mustacchi /******************************start Debbuging code not to submit**************************************/
2101d14abf15SRobert Mustacchi lldp_local_mib_t local_mib_last;
2102d14abf15SRobert Mustacchi /******************************end Debbuging code not to submit****************************************/
2103d14abf15SRobert Mustacchi }lm_dcbx_info_t;
2104d14abf15SRobert Mustacchi
2105d14abf15SRobert Mustacchi /**
2106d14abf15SRobert Mustacchi * @description
2107d14abf15SRobert Mustacchi * Set in a shared port memory place if DCBX completion was
2108d14abf15SRobert Mustacchi * received. Function is needed for PMF migration in order to
2109d14abf15SRobert Mustacchi * synchronize the new PMF that DCBX results has ended.
2110d14abf15SRobert Mustacchi * @param pdev
2111d14abf15SRobert Mustacchi * @param is_completion_recv
2112d14abf15SRobert Mustacchi */
2113d14abf15SRobert Mustacchi void
2114d14abf15SRobert Mustacchi lm_dcbx_config_drv_flags(
2115d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev,
2116d14abf15SRobert Mustacchi IN const lm_dcbx_drv_flags_cmd_t drv_flags_cmd,
2117d14abf15SRobert Mustacchi IN const u32_t bit_drv_flags);
2118d14abf15SRobert Mustacchi
2119d14abf15SRobert Mustacchi ////////////////////// End DCBX define /////////////////////////////////////////////////////
2120d14abf15SRobert Mustacchi
2121d14abf15SRobert Mustacchi typedef enum
2122d14abf15SRobert Mustacchi {
2123d14abf15SRobert Mustacchi NOT_PMF = 0,
2124d14abf15SRobert Mustacchi PMF_ORIGINAL = 1,
2125d14abf15SRobert Mustacchi PMF_MIGRATION = 2,
2126d14abf15SRobert Mustacchi }pmf_type_t;
2127d14abf15SRobert Mustacchi
2128d14abf15SRobert Mustacchi typedef enum
2129d14abf15SRobert Mustacchi {
2130d14abf15SRobert Mustacchi MAC_TYPE_NONE = 0,
2131d14abf15SRobert Mustacchi MAC_TYPE_EMAC = 1,
2132d14abf15SRobert Mustacchi MAC_TYPE_BMAC = 2,
2133d14abf15SRobert Mustacchi MAC_TYPE_UMAC = 3,
2134d14abf15SRobert Mustacchi MAC_TYPE_XMAC = 4,
2135d14abf15SRobert Mustacchi MAC_TYPE_MAX = 5
2136d14abf15SRobert Mustacchi } mac_type_t;
2137d14abf15SRobert Mustacchi
2138d14abf15SRobert Mustacchi // this is based on bdrv_if.h "l2_ioc_link_settings_t"
2139d14abf15SRobert Mustacchi typedef struct _lm_reported_link_params_t
2140d14abf15SRobert Mustacchi {
2141d14abf15SRobert Mustacchi lm_status_t link;
2142d14abf15SRobert Mustacchi lm_medium_t medium;
2143d14abf15SRobert Mustacchi lm_flow_control_t flow_ctrl;
2144d14abf15SRobert Mustacchi u8_t cable_is_attached;
2145d14abf15SRobert Mustacchi u8_t eee_policy;
2146d14abf15SRobert Mustacchi
2147d14abf15SRobert Mustacchi } lm_reported_link_params_t;
2148d14abf15SRobert Mustacchi
2149d14abf15SRobert Mustacchi typedef struct _lm_variables_t
2150d14abf15SRobert Mustacchi {
2151d14abf15SRobert Mustacchi #if defined(__SunOS)
2152d14abf15SRobert Mustacchi ddi_acc_handle_t reg_handle[MAX_NUM_BAR]; /* Holds the DMA registration handle */
2153d14abf15SRobert Mustacchi #endif
2154d14abf15SRobert Mustacchi volatile void * mapped_bar_addr[MAX_NUM_BAR]; /* Holds the mapped BAR address.*/
2155d14abf15SRobert Mustacchi
2156d14abf15SRobert Mustacchi gen_sp_status_block_t gen_sp_status_block;
2157d14abf15SRobert Mustacchi gen_status_block_t status_blocks_arr[MAX_NDSB]; /* at index 16 the the default status block lies */
2158d14abf15SRobert Mustacchi // Host Coalescing acknowledge numbers - this is the local copy to compare against the status index of each of the status blocks.
2159d14abf15SRobert Mustacchi u16_t u_hc_ack[MAX_NDSB]; //local copy of non-default USTORM consumer
2160d14abf15SRobert Mustacchi u16_t c_hc_ack[MAX_NDSB]; //local copy of non-default CSTORM consumer
2161d14abf15SRobert Mustacchi u16_t hc_def_ack; //local copy of SP consumer
2162d14abf15SRobert Mustacchi u16_t _hc_pad;
2163d14abf15SRobert Mustacchi u16_t attn_def_ack; //local copy of attention bits consumer
2164d14abf15SRobert Mustacchi u16_t attn_state; //states for all 16 attn lines (per func) 0=ready for assertion 1=ready for deassertion
2165d14abf15SRobert Mustacchi route_cfg_sig_output attn_groups_output[MAX_DYNAMIC_ATTN_GRPS]; //dynamic attn groups wiring definitions
2166d14abf15SRobert Mustacchi u32_t attn_sig_af_inv_reg_addr[MAX_ATTN_REGS]; // addresses of the AEU_AFTER_INVERT registers
2167d14abf15SRobert Mustacchi u8_t num_attn_sig_regs;
2168d14abf15SRobert Mustacchi u32_t aeu_mask_attn_func; //mask the relevant AEU line from config register
2169d14abf15SRobert Mustacchi lm_status_t link_status;
2170d14abf15SRobert Mustacchi
2171d14abf15SRobert Mustacchi lm_int_coalesing_info int_coal;
2172d14abf15SRobert Mustacchi
2173d14abf15SRobert Mustacchi u8_t eth_init_state; /* deprecated. used only to mark if eth is already init or not. */
2174d14abf15SRobert Mustacchi #define PORT_STATE_CLOSE 0
2175d14abf15SRobert Mustacchi #define PORT_STATE_OPEN 1
2176d14abf15SRobert Mustacchi #define PORT_STATE_CLOSING 2
2177d14abf15SRobert Mustacchi
2178d14abf15SRobert Mustacchi lm_medium_t medium;
2179d14abf15SRobert Mustacchi lm_flow_control_t flow_control;
2180d14abf15SRobert Mustacchi lm_eee_policy_t eee_policy;
2181d14abf15SRobert Mustacchi u32_t autogreeen; // autogrEEEn status
2182d14abf15SRobert Mustacchi
2183d14abf15SRobert Mustacchi // lm statistics
2184d14abf15SRobert Mustacchi lm_stats_all_t stats ;
2185d14abf15SRobert Mustacchi
2186d14abf15SRobert Mustacchi // TRUE if read/write DMAE operations can be done (DMAE block + PXP initialized)
2187d14abf15SRobert Mustacchi #define DMAE_READY(pdev) (pdev->vars.b_is_dmae_ready)
2188d14abf15SRobert Mustacchi u8_t b_is_dmae_ready ;
2189d14abf15SRobert Mustacchi
2190d14abf15SRobert Mustacchi // mirrored NIG MAC table - used in MF/SI mode to support VMChimney.
2191d14abf15SRobert Mustacchi lm_nig_mirror_t nig_mirror;
2192d14abf15SRobert Mustacchi
2193d14abf15SRobert Mustacchi //TODO MCP interface ready
2194d14abf15SRobert Mustacchi u16_t fw_wr_seq;
2195d14abf15SRobert Mustacchi u8_t fw_timed_out;
2196d14abf15SRobert Mustacchi u32_t fw_port_stats_ptr; // pointer to mcp scratch pad for statistics saving (host_func_stats_t)
2197d14abf15SRobert Mustacchi u32_t fw_func_stats_ptr; // pointer to Managment statistics (host_port_stats_t)
2198d14abf15SRobert Mustacchi
2199d14abf15SRobert Mustacchi
2200d14abf15SRobert Mustacchi /* Serdes autonegotiation fallback. For a serdes medium,
2201d14abf15SRobert Mustacchi * if we cannot get link via autonegotiation, we'll force
2202d14abf15SRobert Mustacchi * the speed to get link. */
2203d14abf15SRobert Mustacchi //TODO after specs of serdes
2204d14abf15SRobert Mustacchi mac_type_t mac_type;
2205d14abf15SRobert Mustacchi
2206d14abf15SRobert Mustacchi /*Target phy address used with mread and mwrite*/
2207d14abf15SRobert Mustacchi u8_t phy_addr;
2208d14abf15SRobert Mustacchi
2209d14abf15SRobert Mustacchi /* This flag is set if the cable is attached when there
2210d14abf15SRobert Mustacchi * is no link. The upper module could check this flag to
2211d14abf15SRobert Mustacchi * determine if there is a need to wait for link. */
2212d14abf15SRobert Mustacchi u8_t cable_is_attached;
2213d14abf15SRobert Mustacchi
2214d14abf15SRobert Mustacchi /* Write sequence for driver pulse. */
2215d14abf15SRobert Mustacchi u16_t drv_pulse_wr_seq;
2216d14abf15SRobert Mustacchi
2217d14abf15SRobert Mustacchi // the page tables
2218d14abf15SRobert Mustacchi u32_t searcher_t1_num_pages;
2219d14abf15SRobert Mustacchi void **searcher_t1_virt_addr_table;
2220d14abf15SRobert Mustacchi lm_address_t *searcher_t1_phys_addr_table;
2221d14abf15SRobert Mustacchi
2222d14abf15SRobert Mustacchi u32_t searcher_t2_num_pages;
2223d14abf15SRobert Mustacchi void **searcher_t2_virt_addr_table;
2224d14abf15SRobert Mustacchi lm_address_t *searcher_t2_phys_addr_table;
2225d14abf15SRobert Mustacchi
2226d14abf15SRobert Mustacchi u32_t timers_linear_num_pages;
2227d14abf15SRobert Mustacchi void **timers_linear_virt_addr_table;
2228d14abf15SRobert Mustacchi lm_address_t *timers_linear_phys_addr_table;
2229d14abf15SRobert Mustacchi
2230d14abf15SRobert Mustacchi u32_t qm_queues_num_pages;
2231d14abf15SRobert Mustacchi void** qm_queues_virt_addr_table;
2232d14abf15SRobert Mustacchi lm_address_t *qm_queues_phys_addr_table;
2233d14abf15SRobert Mustacchi
2234d14abf15SRobert Mustacchi u32_t context_cdu_num_pages;
2235d14abf15SRobert Mustacchi void **context_cdu_virt_addr_table;
2236d14abf15SRobert Mustacchi lm_address_t *context_cdu_phys_addr_table;
2237d14abf15SRobert Mustacchi
2238d14abf15SRobert Mustacchi u32_t elt_num_pages; // must be less then 16
2239d14abf15SRobert Mustacchi void * elt_virt_addr_table[NUM_OF_ELT_PAGES];
2240d14abf15SRobert Mustacchi lm_address_t elt_phys_addr_table[NUM_OF_ELT_PAGES];
2241d14abf15SRobert Mustacchi
2242d14abf15SRobert Mustacchi // Zeroed buffer to use in WB zero memory
2243d14abf15SRobert Mustacchi u32_t zero_buffer[DMAE_MAX_RW_SIZE_STATIC] ;
2244d14abf15SRobert Mustacchi
2245d14abf15SRobert Mustacchi u32_t clk_factor ; // clock factor to multiple timeouts in non ASIC (EMUL/FPGA) cases (value is 1 for ASIC)
2246d14abf15SRobert Mustacchi
2247d14abf15SRobert Mustacchi u32_t inst_id; // represents Bus & Device numbers
2248d14abf15SRobert Mustacchi // 0x0000ff00 - Bus
2249d14abf15SRobert Mustacchi // 0x000000ff - Device
2250d14abf15SRobert Mustacchi #ifndef INST_ID_TO_BUS_NUM
2251d14abf15SRobert Mustacchi #define INST_ID_TO_BUS_NUM(_inst_id) (((_inst_id) >> 8)& 0xFF)
2252d14abf15SRobert Mustacchi #define MAX_PCI_BUS_NUM (256)
2253d14abf15SRobert Mustacchi #endif // INST_ID_TO_BUS_NUM
2254d14abf15SRobert Mustacchi
2255d14abf15SRobert Mustacchi /* Emulation/FPAG doorbell full workaround is enabled.
2256d14abf15SRobert Mustacchi * The only impact on ASIC is an extra "if" command to check chip rev */
2257d14abf15SRobert Mustacchi #ifndef USER_LINUX
2258d14abf15SRobert Mustacchi #define EMULATION_DOORBELL_FULL_WORKAROUND
2259d14abf15SRobert Mustacchi #endif // USER_LINUX
2260d14abf15SRobert Mustacchi
2261d14abf15SRobert Mustacchi #if defined(EMULATION_DOORBELL_FULL_WORKAROUND)
2262d14abf15SRobert Mustacchi u32_t doorbells_cnt;
2263d14abf15SRobert Mustacchi #define DOORBELL_CHECK_FREQUENCY 500
2264d14abf15SRobert Mustacchi
2265d14abf15SRobert Mustacchi #define ALLOWED_DOORBELLS_HIGH_WM 1000
2266d14abf15SRobert Mustacchi #define ALLOWED_DOORBELLS_LOW_WM 700
2267d14abf15SRobert Mustacchi u8_t doorbells_blocked;
2268d14abf15SRobert Mustacchi u32_t doorbells_high_wm_reached; /* for statistics */
2269d14abf15SRobert Mustacchi #endif // EMULATION_DOORBELL_FULL_WORKAROUND
2270d14abf15SRobert Mustacchi u8_t enable_intr; /* When this flag is set process interrupt */
2271d14abf15SRobert Mustacchi u8_t dbg_intr_in_wrong_state;
2272d14abf15SRobert Mustacchi u8_t dbg_intr_in_disabled;
2273d14abf15SRobert Mustacchi u8_t dbg_intr_zero_status;
2274d14abf15SRobert Mustacchi
2275d14abf15SRobert Mustacchi // is this device in charge on link support.
2276d14abf15SRobert Mustacchi pmf_type_t is_pmf;
2277d14abf15SRobert Mustacchi
2278d14abf15SRobert Mustacchi #define IS_PMF(_pdev) (( PMF_ORIGINAL == (_pdev)->vars.is_pmf) || ( PMF_MIGRATION == (_pdev)->vars.is_pmf))
2279d14abf15SRobert Mustacchi #define IS_PMF_ORIGINAL(_pdev) ( PMF_ORIGINAL == (_pdev)->vars.is_pmf)
2280d14abf15SRobert Mustacchi #define IS_PMF_MIGRATION(_pdev) ( PMF_MIGRATION == (_pdev)->vars.is_pmf)
2281d14abf15SRobert Mustacchi
2282d14abf15SRobert Mustacchi // The load-response we received from MCP when loading... need for elink calls and convenient
2283d14abf15SRobert Mustacchi // for debugging.
2284d14abf15SRobert Mustacchi lm_loader_response load_code;
2285d14abf15SRobert Mustacchi
2286d14abf15SRobert Mustacchi u8_t b_in_init_reset_flow;
2287d14abf15SRobert Mustacchi u8_t _pad[3];
2288d14abf15SRobert Mustacchi lm_reported_link_params_t last_reported_link_params;
2289d14abf15SRobert Mustacchi
2290d14abf15SRobert Mustacchi // cls_vars
2291d14abf15SRobert Mustacchi struct elink_vars link;
2292d14abf15SRobert Mustacchi u32_t link_chng_cnt;
2293d14abf15SRobert Mustacchi #define LM_LINK_CHNG_CNT(pdev) ((pdev)->vars.link_chng_cnt)
2294d14abf15SRobert Mustacchi
2295d14abf15SRobert Mustacchi u32_t shared_l5_mac_client_id;
2296d14abf15SRobert Mustacchi u64_t last_recycling_timestamp;
2297d14abf15SRobert Mustacchi
2298d14abf15SRobert Mustacchi /* sriov-related */
2299d14abf15SRobert Mustacchi //u8_t num_vfs_enabled; /* number of vfs that were enabled, need this for disabling them */
2300d14abf15SRobert Mustacchi u8_t is_igu_test_mode;
2301d14abf15SRobert Mustacchi u8_t is_pf_restricts_lamac;
2302d14abf15SRobert Mustacchi u8_t is_pf_rejected_lamac;
2303d14abf15SRobert Mustacchi u8_t is_pf_provides_mac;
2304d14abf15SRobert Mustacchi u16_t pf_link_speed;
2305d14abf15SRobert Mustacchi u16_t __pad;
2306d14abf15SRobert Mustacchi u32_t vf_pf_channel_lock;
2307d14abf15SRobert Mustacchi lm_vf_pf_message_t vf_pf_mess;
2308d14abf15SRobert Mustacchi
2309d14abf15SRobert Mustacchi u32_t pxp_hw_interrupts_cnt;
2310d14abf15SRobert Mustacchi u32_t dq_int_status_cnt;
2311d14abf15SRobert Mustacchi u32_t dq_int_status_discard_cnt;
2312d14abf15SRobert Mustacchi u32_t dq_int_status_vf_val_err_cnt;
2313d14abf15SRobert Mustacchi u32_t dq_vf_type_val_err_fid;
2314d14abf15SRobert Mustacchi u32_t dq_vf_type_val_err_mcid;
2315d14abf15SRobert Mustacchi u32_t cfc_int_status_cnt;
2316d14abf15SRobert Mustacchi } lm_variables_t;
2317d14abf15SRobert Mustacchi
2318d14abf15SRobert Mustacchi typedef struct _eth_tx_prod_t
2319d14abf15SRobert Mustacchi {
2320d14abf15SRobert Mustacchi u32_t packets_prod;
2321d14abf15SRobert Mustacchi u16_t bds_prod;
2322d14abf15SRobert Mustacchi u16_t reserved;
2323d14abf15SRobert Mustacchi }eth_tx_prod_t;
2324d14abf15SRobert Mustacchi
2325d14abf15SRobert Mustacchi /*******************************************************************************
2326d14abf15SRobert Mustacchi * global chip info
2327d14abf15SRobert Mustacchi ******************************************************************************/
2328d14abf15SRobert Mustacchi
2329d14abf15SRobert Mustacchi typedef struct _lm_chip_global_t
2330d14abf15SRobert Mustacchi {
2331d14abf15SRobert Mustacchi u8_t flags;
2332d14abf15SRobert Mustacchi #define LM_CHIP_GLOBAL_FLAG_RESET_IN_PROGRESS 0x1 // The flag indicates whether
2333d14abf15SRobert Mustacchi
2334d14abf15SRobert Mustacchi #define LM_CHIP_GLOBAL_FLAG_NIG_RESET_CALLED 0x2 // the flag will be set when lm_reset_path() will do nig reset
2335d14abf15SRobert Mustacchi // the flag will be reset after grc timeout occured and the cause is NIG access OR after another "no nig" reset
2336d14abf15SRobert Mustacchi
2337d14abf15SRobert Mustacchi u32_t cnt_grc_timeout_ignored;
2338d14abf15SRobert Mustacchi u32_t grc_timeout_val[E1H_FUNC_MAX*2]; // we give each function 2 grc timeouts before we ASSERT...
2339d14abf15SRobert Mustacchi u8_t func_en[E1H_FUNC_MAX]; /* Used for WOL: each function needs to mark itself: whether it should be enabled when reseting nig with wol enabled */
2340d14abf15SRobert Mustacchi } lm_chip_global_t;
2341d14abf15SRobert Mustacchi
2342d14abf15SRobert Mustacchi extern lm_chip_global_t g_lm_chip_global[MAX_PCI_BUS_NUM];
2343d14abf15SRobert Mustacchi
2344d14abf15SRobert Mustacchi /*******************************************************************************
2345d14abf15SRobert Mustacchi * bd chain
2346d14abf15SRobert Mustacchi ******************************************************************************/
2347d14abf15SRobert Mustacchi
2348d14abf15SRobert Mustacchi
2349d14abf15SRobert Mustacchi /*******************************************************************************
2350d14abf15SRobert Mustacchi * Transmit info.
2351d14abf15SRobert Mustacchi ******************************************************************************/
2352d14abf15SRobert Mustacchi
2353d14abf15SRobert Mustacchi typedef struct _lm_tx_chain_t
2354d14abf15SRobert Mustacchi {
2355d14abf15SRobert Mustacchi u32_t idx;
2356d14abf15SRobert Mustacchi
2357d14abf15SRobert Mustacchi lm_bd_chain_t bd_chain;
2358d14abf15SRobert Mustacchi
2359d14abf15SRobert Mustacchi
2360d14abf15SRobert Mustacchi eth_tx_prod_t eth_tx_prods;
2361d14abf15SRobert Mustacchi
2362d14abf15SRobert Mustacchi
2363d14abf15SRobert Mustacchi u32_t prod_bseq;
2364d14abf15SRobert Mustacchi u16_t pkt_idx;
2365d14abf15SRobert Mustacchi u16_t volatile *hw_con_idx_ptr;
2366d14abf15SRobert Mustacchi
2367d14abf15SRobert Mustacchi u16_t coalesce_buf_cnt;
2368d14abf15SRobert Mustacchi u16_t _reserved;
2369d14abf15SRobert Mustacchi
2370d14abf15SRobert Mustacchi /* debug stats */
2371d14abf15SRobert Mustacchi u32_t coalesce_buf_used;
2372d14abf15SRobert Mustacchi u32_t lso_split_used;
2373d14abf15SRobert Mustacchi
2374d14abf15SRobert Mustacchi lm_hc_sb_info_t hc_sb_info;
2375d14abf15SRobert Mustacchi
2376d14abf15SRobert Mustacchi s_list_t active_descq;
2377d14abf15SRobert Mustacchi s_list_t coalesce_buf_list;
2378d14abf15SRobert Mustacchi } lm_tx_chain_t;
2379d14abf15SRobert Mustacchi
2380d14abf15SRobert Mustacchi
2381d14abf15SRobert Mustacchi typedef struct _lm_tx_info_t
2382d14abf15SRobert Mustacchi {
2383d14abf15SRobert Mustacchi lm_tx_chain_t chain[3*MAX_HW_CHAINS + MAX_NON_RSS_CHAINS];
2384d14abf15SRobert Mustacchi #define LM_TXQ(_pdev, _idx) (_pdev)->tx_info.chain[_idx]
2385d14abf15SRobert Mustacchi
2386d14abf15SRobert Mustacchi u32_t max_chain_idx;
2387d14abf15SRobert Mustacchi u32_t catchup_chain_idx;
2388d14abf15SRobert Mustacchi
2389d14abf15SRobert Mustacchi u32_t forward_packets;
2390d14abf15SRobert Mustacchi u32_t lso_forward_packets;
2391d14abf15SRobert Mustacchi
2392d14abf15SRobert Mustacchi } lm_tx_info_t;
2393d14abf15SRobert Mustacchi
2394d14abf15SRobert Mustacchi /*******************************************************************************
2395d14abf15SRobert Mustacchi * Receive info.
2396d14abf15SRobert Mustacchi ******************************************************************************/
2397d14abf15SRobert Mustacchi typedef struct _lm_rx_chain_common_t
2398d14abf15SRobert Mustacchi {
2399d14abf15SRobert Mustacchi u16_t bd_prod_without_next; // bd prod without next BD taken into account
2400d14abf15SRobert Mustacchi u32_t prod_bseq;
2401d14abf15SRobert Mustacchi u32_t desc_cnt;
2402d14abf15SRobert Mustacchi s_list_t free_descq;
2403d14abf15SRobert Mustacchi } lm_rx_chain_common_t;
2404d14abf15SRobert Mustacchi
2405d14abf15SRobert Mustacchi /*******************************************************/
2406d14abf15SRobert Mustacchi /*******************************************************************************
2407d14abf15SRobert Mustacchi * TPA start info.
2408d14abf15SRobert Mustacchi ******************************************************************************/
2409d14abf15SRobert Mustacchi #define LM_TPA_MAX_AGGS (max(ETH_MAX_AGGREGATION_QUEUES_E1H_E2,ETH_MAX_AGGREGATION_QUEUES_E1))
2410d14abf15SRobert Mustacchi #define LM_TPA_MAX_AGG_SIZE (8)
2411d14abf15SRobert Mustacchi #define LM_TPA_MIN_DESC (LM_TPA_MAX_AGGS * LM_TPA_MAX_AGG_SIZE * 2) // TODO_RSC fine tuning Minimum TPA must be 64 for mask_array.
2412d14abf15SRobert Mustacchi #define LM_TPA_BD_ELEN_SIZE (sizeof(struct eth_rx_sge))
2413d14abf15SRobert Mustacchi
2414d14abf15SRobert Mustacchi #define LM_TPA_PAGE_BITS (LM_PAGE_BITS) /* 4K page. */
2415d14abf15SRobert Mustacchi #define LM_TPA_PAGE_SIZE (1 << LM_TPA_PAGE_BITS)
2416d14abf15SRobert Mustacchi
2417d14abf15SRobert Mustacchi //Ramrod defines
2418d14abf15SRobert Mustacchi #define LM_TPA_SGE_PAUSE_THR_LOW (150)
2419d14abf15SRobert Mustacchi #define LM_TPA_SGE_PAUSE_THR_HIGH (250)
2420d14abf15SRobert Mustacchi typedef struct _lm_tpa_cahin_dbg_params
2421d14abf15SRobert Mustacchi {
2422d14abf15SRobert Mustacchi u64_t pck_received;
2423d14abf15SRobert Mustacchi u64_t pck_received_ind;
2424d14abf15SRobert Mustacchi u64_t pck_ret_from_chip;
2425d14abf15SRobert Mustacchi u64_t pck_ret_abort_active;
2426d14abf15SRobert Mustacchi u64_t pck_ret_abort;
2427d14abf15SRobert Mustacchi }lm_tpa_cahin_dbg_params;
2428d14abf15SRobert Mustacchi typedef enum
2429d14abf15SRobert Mustacchi {
2430d14abf15SRobert Mustacchi lm_tpa_state_disable = 0, // VBD changes to the state only under RX lock.
2431d14abf15SRobert Mustacchi // In this state VBD won't accept RSC packet descriptors.
2432d14abf15SRobert Mustacchi lm_tpa_state_wait_packets = 1, // VBD is waiting to receive number of "tpa_info:: tpa_desc_cnt_per_chain
2433d14abf15SRobert Mustacchi // " multiply "RSS queues" RSC l2packet. After first enable.
2434d14abf15SRobert Mustacchi lm_tpa_state_enable = 2, // RSC is enabled.
2435d14abf15SRobert Mustacchi lm_tpa_state_invalid = 3,
2436d14abf15SRobert Mustacchi }lm_tpa_state_t;
2437d14abf15SRobert Mustacchi
2438d14abf15SRobert Mustacchi typedef struct _lm_tpa_sge_chain_t
2439d14abf15SRobert Mustacchi {
2440d14abf15SRobert Mustacchi lm_bd_chain_t bd_chain; // The RSC BD chain.
2441d14abf15SRobert Mustacchi
2442d14abf15SRobert Mustacchi #define LM_TPA_CHAIN_BD(_pdev, _idx) ((_pdev)->rx_info.rxq_chain[_idx].tpa_chain.sge_chain.bd_chain)
2443d14abf15SRobert Mustacchi #define LM_TPA_CHAIN_BD_NUM_ELEM(_pdev, _idx) ((_pdev)->rx_info.rxq_chain[_idx].tpa_chain.sge_chain.size)
2444d14abf15SRobert Mustacchi #define LM_TPA_CHAIN_BD_MASK(_pdev, _idx) (LM_TPA_CHAIN_BD_NUM_ELEM(_pdev,_idx) - 1)
2445d14abf15SRobert Mustacchi
2446d14abf15SRobert Mustacchi lm_packet_t** active_descq_array; // Array of pointers for OOO quick access of packet descriptors.
2447d14abf15SRobert Mustacchi
2448d14abf15SRobert Mustacchi #define LM_TPA_ACTIVE_DESCQ_ARRAY_ELEM(_pdev,_idx) (LM_TPA_CHAIN_BD_NUM_ELEM(_pdev,_idx))
2449d14abf15SRobert Mustacchi #define LM_TPA_ACTIVE_ENTRY_BOUNDARIES_VERIFY(_pdev,_idx,_entry) DbgBreakIf((LM_TPA_ACTIVE_DESCQ_ARRAY_ELEM(_pdev,_idx) <= (_entry)))
2450d14abf15SRobert Mustacchi #define LM_TPA_BD_ENTRY_TO_ACTIVE_ENTRY(_pdev,_idx,_x) ((_x) & LM_TPA_CHAIN_BD_MASK(_pdev,_idx))
2451d14abf15SRobert Mustacchi
2452d14abf15SRobert Mustacchi u64_t* mask_array; // Will have exactly a bit for each entry in the tpa_chain::sge_chain:: active_descq_array.
2453d14abf15SRobert Mustacchi // Each bit represent if the RSC bd is free or used.1 is used. 0 is free.
2454d14abf15SRobert Mustacchi
2455d14abf15SRobert Mustacchi /* Number of u64 elements in SGE mask array */
2456d14abf15SRobert Mustacchi #define LM_TPA_MASK_LEN(_pdev,_idx) ((LM_TPA_CHAIN_BD_NUM_ELEM(_pdev,_idx)) / \
2457d14abf15SRobert Mustacchi BIT_VEC64_ELEM_SZ)
2458d14abf15SRobert Mustacchi #define LM_TPA_MASK_MASK(_pdev, _idx) (LM_TPA_MASK_LEN(_pdev, _idx) - 1)
2459d14abf15SRobert Mustacchi #define LM_TPA_MASK_NEXT_ELEM(_pdev, _idx, el) (((el) + 1) & LM_TPA_MASK_MASK(_pdev, _idx))
2460d14abf15SRobert Mustacchi
2461d14abf15SRobert Mustacchi
2462d14abf15SRobert Mustacchi #define LM_TPA_BD_ENTRY_TO_MASK_ENTRY(_pdev,_idx,_x) (LM_TPA_BD_ENTRY_TO_ACTIVE_ENTRY(_pdev,_idx,_x) >> BIT_VEC64_ELEM_SHIFT)
2463d14abf15SRobert Mustacchi
2464d14abf15SRobert Mustacchi #define LM_TPA_MASK_SET_ACTIVE_BIT(_pdev,_idx,_active_entry) LM_TPA_ACTIVE_ENTRY_BOUNDARIES_VERIFY(_pdev,_idx,_active_entry); \
2465d14abf15SRobert Mustacchi BIT_VEC64_SET_BIT((&LM_SGE_TPA_CHAIN(_pdev,_idx))->mask_array,_active_entry)
2466d14abf15SRobert Mustacchi
2467d14abf15SRobert Mustacchi #define LM_TPA_MASK_CLEAR_ACTIVE_BIT(_pdev,_idx,_active_entry) DbgBreakIf(0 == LM_TPA_MASK_TEST_ACTIVE_BIT(_pdev,_idx,_active_entry)); \
2468d14abf15SRobert Mustacchi LM_TPA_ACTIVE_ENTRY_BOUNDARIES_VERIFY(_pdev,_idx,_active_entry); \
2469d14abf15SRobert Mustacchi BIT_VEC64_CLEAR_BIT((&LM_SGE_TPA_CHAIN(_pdev,_idx))->mask_array,_active_entry)
2470d14abf15SRobert Mustacchi
2471d14abf15SRobert Mustacchi #define LM_TPA_MASK_TEST_ACTIVE_BIT(_pdev,_idx,_active_entry) (BIT_VEC64_TEST_BIT((&LM_SGE_TPA_CHAIN(_pdev,_idx))->mask_array,_active_entry))
2472d14abf15SRobert Mustacchi
2473d14abf15SRobert Mustacchi u16_t size; // Limitation: number of SGE must be a multiple of 64 and a power of 2.
2474d14abf15SRobert Mustacchi // This is derived from the implementation that we will check in resolution of 64 for optimization.
2475d14abf15SRobert Mustacchi // sge_chain::size should be larger from tpa_desc_cnt_per_chain
2476d14abf15SRobert Mustacchi
2477d14abf15SRobert Mustacchi u32_t last_max_con; // The highest SGE consumer.
2478d14abf15SRobert Mustacchi }lm_tpa_sge_chain_t;
2479d14abf15SRobert Mustacchi
2480d14abf15SRobert Mustacchi typedef struct _lm_tpa_start_coales_bd_t
2481d14abf15SRobert Mustacchi {
2482d14abf15SRobert Mustacchi lm_packet_t* packet; // Represents an open coalescing, and save the first packet descriptor.
2483d14abf15SRobert Mustacchi u8_t is_entry_used; // The entry state for debugging.
2484d14abf15SRobert Mustacchi }lm_tpa_start_coales_bd_t;
2485d14abf15SRobert Mustacchi
2486d14abf15SRobert Mustacchi typedef struct _lm_tpa_chain_t
2487d14abf15SRobert Mustacchi {
2488d14abf15SRobert Mustacchi lm_rx_chain_common_t common;
2489d14abf15SRobert Mustacchi lm_tpa_start_coales_bd_t start_coales_bd[LM_TPA_MAX_AGGS]; //Each entry represents an open coalescing,
2490d14abf15SRobert Mustacchi // and save the first packet descriptor.
2491d14abf15SRobert Mustacchi // all the state are suppose to be synchronized we keep them per chain and not in TPA info for reason of lock.
2492d14abf15SRobert Mustacchi // The lock in lw_recv_packets is taken per chain
2493d14abf15SRobert Mustacchi // The RSC state. The state is initialized to tpa_state_disable.
2494d14abf15SRobert Mustacchi lm_tpa_state_t state;
2495d14abf15SRobert Mustacchi lm_tpa_sge_chain_t sge_chain;
2496d14abf15SRobert Mustacchi
2497d14abf15SRobert Mustacchi struct tpa_update_ramrod_data* ramrod_data_virt;
2498d14abf15SRobert Mustacchi lm_address_t ramrod_data_phys;
2499d14abf15SRobert Mustacchi
2500d14abf15SRobert Mustacchi // Debug information
2501d14abf15SRobert Mustacchi lm_tpa_cahin_dbg_params dbg_params;
2502d14abf15SRobert Mustacchi }lm_tpa_chain_t;
2503d14abf15SRobert Mustacchi
2504d14abf15SRobert Mustacchi typedef struct _lm_tpa_info_t
2505d14abf15SRobert Mustacchi {
2506d14abf15SRobert Mustacchi struct tpa_update_ramrod_data* ramrod_data_virt;
2507d14abf15SRobert Mustacchi lm_address_t ramrod_data_phys;
2508d14abf15SRobert Mustacchi
2509d14abf15SRobert Mustacchi volatile void * update_cookie;
2510d14abf15SRobert Mustacchi volatile u32_t ramrod_recv_cnt; // Number of ramrods received.Decrement by using Interlockeddecrement.
2511d14abf15SRobert Mustacchi volatile u32_t state;
2512*9b622488SToomas Soome #define TPA_STATE_NONE 0
2513d14abf15SRobert Mustacchi #define TPA_STATE_RAMROD_SENT 1
2514*9b622488SToomas Soome
2515d14abf15SRobert Mustacchi u8_t ipvx_enabled_required;
2516d14abf15SRobert Mustacchi u8_t ipvx_enabled_current;
2517d14abf15SRobert Mustacchi #define TPA_IPVX_DISABLED (0)
2518d14abf15SRobert Mustacchi #define TPA_IPV4_ENABLED (1<<0)
2519d14abf15SRobert Mustacchi #define TPA_IPV6_ENABLED (1<<1)
2520d14abf15SRobert Mustacchi }lm_tpa_info_t;
2521d14abf15SRobert Mustacchi
2522d14abf15SRobert Mustacchi
2523d14abf15SRobert Mustacchi /*******************************************************************************
2524d14abf15SRobert Mustacchi * RSC end info.
2525d14abf15SRobert Mustacchi ******************************************************************************/
2526d14abf15SRobert Mustacchi typedef enum
2527d14abf15SRobert Mustacchi {
2528d14abf15SRobert Mustacchi LM_RXQ_CHAIN_IDX_BD = 0,
2529d14abf15SRobert Mustacchi LM_RXQ_CHAIN_IDX_SGE = 1,
2530d14abf15SRobert Mustacchi LM_RXQ_CHAIN_IDX_MAX = 2,
2531d14abf15SRobert Mustacchi } lm_rxq_chain_idx_t ;
2532d14abf15SRobert Mustacchi
2533d14abf15SRobert Mustacchi
2534d14abf15SRobert Mustacchi typedef struct _lm_rx_chain_t
2535d14abf15SRobert Mustacchi {
2536d14abf15SRobert Mustacchi lm_rx_chain_common_t common;
2537d14abf15SRobert Mustacchi u32_t idx;
2538d14abf15SRobert Mustacchi lm_bd_chain_t chain_arr[LM_RXQ_CHAIN_IDX_MAX];
2539d14abf15SRobert Mustacchi lm_tpa_chain_t tpa_chain;
2540d14abf15SRobert Mustacchi u32_t lah_size; // if 0 - only LM_RXQ_CHAIN_IDX_BD chain is valid
2541d14abf15SRobert Mustacchi u32_t ret_bytes;
2542d14abf15SRobert Mustacchi u32_t ret_bytes_last_fw_update;
2543d14abf15SRobert Mustacchi u16_t volatile *hw_con_idx_ptr; // TODO - remove - check non NDIS clients
2544d14abf15SRobert Mustacchi
2545d14abf15SRobert Mustacchi lm_hc_sb_info_t hc_sb_info;
2546d14abf15SRobert Mustacchi
2547d14abf15SRobert Mustacchi s_list_t active_descq;
2548d14abf15SRobert Mustacchi } lm_rx_chain_t;
2549d14abf15SRobert Mustacchi
2550d14abf15SRobert Mustacchi /*******************************************************************************
2551d14abf15SRobert Mustacchi * send queue info.
2552d14abf15SRobert Mustacchi ******************************************************************************/
2553d14abf15SRobert Mustacchi
2554d14abf15SRobert Mustacchi typedef struct _lm_sq_chain_t
2555d14abf15SRobert Mustacchi {
2556d14abf15SRobert Mustacchi /* This is a contiguous memory block of params.l2_sq_bd_page_cnt pages
2557d14abf15SRobert Mustacchi * used for rx completion. The BD chain is arranged as a circular
2558d14abf15SRobert Mustacchi * chain where the last BD entry of a page points to the next page,
2559d14abf15SRobert Mustacchi * and the last BD entry of the last page points to the first. */
2560d14abf15SRobert Mustacchi struct slow_path_element *sq_chain_virt;
2561d14abf15SRobert Mustacchi lm_address_t bd_chain_phy;
2562d14abf15SRobert Mustacchi
2563d14abf15SRobert Mustacchi u16_t prod_idx;
2564d14abf15SRobert Mustacchi u16_t con_idx;
2565d14abf15SRobert Mustacchi
2566d14abf15SRobert Mustacchi struct slow_path_element *prod_bd;
2567d14abf15SRobert Mustacchi struct slow_path_element *last_bd;
2568d14abf15SRobert Mustacchi u16_t bd_left;
2569d14abf15SRobert Mustacchi
2570d14abf15SRobert Mustacchi } lm_sq_chain_t;
2571d14abf15SRobert Mustacchi
2572d14abf15SRobert Mustacchi
2573d14abf15SRobert Mustacchi /**
2574d14abf15SRobert Mustacchi * Event Queue Structure. Used for the main event-queue, and
2575d14abf15SRobert Mustacchi * also event queues used by iscsi + fcoe
2576d14abf15SRobert Mustacchi */
2577d14abf15SRobert Mustacchi typedef struct _lm_eq_chain_t
2578d14abf15SRobert Mustacchi {
2579d14abf15SRobert Mustacchi lm_bd_chain_t bd_chain;
2580d14abf15SRobert Mustacchi u16_t volatile *hw_con_idx_ptr;
2581d14abf15SRobert Mustacchi u16_t iro_prod_offset; /* The producer offset inside internal RAM */
2582d14abf15SRobert Mustacchi lm_hc_sb_info_t hc_sb_info;
2583d14abf15SRobert Mustacchi
2584d14abf15SRobert Mustacchi } lm_eq_chain_t;
2585d14abf15SRobert Mustacchi
2586d14abf15SRobert Mustacchi
2587d14abf15SRobert Mustacchi /* the rcq chain now holds the real HSI eth_rx_cqe */
2588d14abf15SRobert Mustacchi typedef struct _lm_rcq_chain_t
2589d14abf15SRobert Mustacchi {
2590d14abf15SRobert Mustacchi u32_t idx; //this is the symmetric index of the corresponding Rx
2591d14abf15SRobert Mustacchi
2592d14abf15SRobert Mustacchi lm_bd_chain_t bd_chain;
2593d14abf15SRobert Mustacchi
2594d14abf15SRobert Mustacchi u32_t prod_bseq;
2595d14abf15SRobert Mustacchi u16_t volatile *hw_con_idx_ptr;
2596d14abf15SRobert Mustacchi u16_t iro_prod_offset; /* The producer offset inside internal RAM */
2597d14abf15SRobert Mustacchi
2598d14abf15SRobert Mustacchi lm_hc_sb_info_t hc_sb_info;
2599d14abf15SRobert Mustacchi
2600d14abf15SRobert Mustacchi } lm_rcq_chain_t;
2601d14abf15SRobert Mustacchi
2602d14abf15SRobert Mustacchi typedef struct _lm_rx_info_t
2603d14abf15SRobert Mustacchi {
2604d14abf15SRobert Mustacchi lm_rx_chain_t rxq_chain[MAX_HW_CHAINS + MAX_NON_RSS_CHAINS];
2605d14abf15SRobert Mustacchi lm_rcq_chain_t rcq_chain[MAX_HW_CHAINS + MAX_NON_RSS_CHAINS];
2606d14abf15SRobert Mustacchi #define LM_RXQ(_pdev, _idx) (_pdev)->rx_info.rxq_chain[_idx]
2607d14abf15SRobert Mustacchi #define LM_RXQ_COMMON(_pdev, _idx) ((_pdev)->rx_info.rxq_chain[_idx].common)
2608d14abf15SRobert Mustacchi #define LM_RXQ_CHAIN(_pdev, _idx, _rxq_chain_idx) (_pdev)->rx_info.rxq_chain[_idx].chain_arr[_rxq_chain_idx]
2609d14abf15SRobert Mustacchi #define LM_RXQ_CHAIN_BD(_pdev, _idx) LM_RXQ_CHAIN(_pdev, _idx, LM_RXQ_CHAIN_IDX_BD )
2610d14abf15SRobert Mustacchi #define LM_RXQ_CHAIN_SGE(_pdev, _idx) LM_RXQ_CHAIN(_pdev, _idx, LM_RXQ_CHAIN_IDX_SGE )
2611d14abf15SRobert Mustacchi #define LM_RXQ_IS_CHAIN_SGE_VALID(_pdev, _idx) (0 != (_pdev)->rx_info.rxq_chain[_idx].lah_size)
2612d14abf15SRobert Mustacchi #define LM_RXQ_SGE_PTR_IF_VALID(_pdev, _idx) LM_RXQ_IS_CHAIN_SGE_VALID(_pdev, _idx) ? &LM_RXQ_CHAIN_SGE(_pdev, _idx ) : NULL
2613d14abf15SRobert Mustacchi
2614d14abf15SRobert Mustacchi #define LM_RCQ(_pdev, _idx) (_pdev)->rx_info.rcq_chain[_idx]
2615d14abf15SRobert Mustacchi
2616d14abf15SRobert Mustacchi
2617d14abf15SRobert Mustacchi #define LM_TPA(_pdev, _idx) ((_pdev)->rx_info.rxq_chain[_idx].tpa_chain)
2618d14abf15SRobert Mustacchi #define LM_TPA_COMMON(_pdev, _idx) ((_pdev)->rx_info.rxq_chain[_idx].tpa_chain.common)
2619d14abf15SRobert Mustacchi #define LM_SGE_TPA_CHAIN(_pdev, _idx) ((_pdev)->rx_info.rxq_chain[_idx].tpa_chain.sge_chain)
2620d14abf15SRobert Mustacchi lm_tpa_info_t tpa_info;
2621d14abf15SRobert Mustacchi #define LM_TPA_INFO(_pdev) ((_pdev)->rx_info.tpa_info)
2622d14abf15SRobert Mustacchi struct tstorm_eth_approximate_match_multicast_filtering appr_mc;
2623d14abf15SRobert Mustacchi
2624d14abf15SRobert Mustacchi } lm_rx_info_t;
2625d14abf15SRobert Mustacchi
2626d14abf15SRobert Mustacchi #define MAX_RAMRODS_OUTSTANDING 2
2627d14abf15SRobert Mustacchi
2628d14abf15SRobert Mustacchi typedef struct _lm_request_sp
2629d14abf15SRobert Mustacchi {
2630d14abf15SRobert Mustacchi u8_t req_type;
2631d14abf15SRobert Mustacchi #define REQ_SET_INFORMATION 0x1
2632d14abf15SRobert Mustacchi #define REQ_QUERY_INFORMATION 0x2
2633d14abf15SRobert Mustacchi
2634d14abf15SRobert Mustacchi u32_t ioc; //IOCTL number of the request
2635d14abf15SRobert Mustacchi u8_t ok_to_indicate; //should the request be indicated up to NDIS or not
2636d14abf15SRobert Mustacchi void *clnt_blk; //L2/L4 client block
2637d14abf15SRobert Mustacchi u8_t ramrod_priority; //ramrod priority (this priority is for the 'common sq' and not for the 'per CID one outstanding' mechnism)
2638d14abf15SRobert Mustacchi struct sq_pending_command sp_list_command;
2639d14abf15SRobert Mustacchi } lm_request_sp;
2640d14abf15SRobert Mustacchi
2641d14abf15SRobert Mustacchi typedef union _client_init_data_t{
2642d14abf15SRobert Mustacchi struct client_init_ramrod_data init_data;
2643d14abf15SRobert Mustacchi struct tx_queue_init_ramrod_data tx_queue;
2644d14abf15SRobert Mustacchi } client_init_data_t;
2645d14abf15SRobert Mustacchi
2646d14abf15SRobert Mustacchi typedef struct _lm_client_info_update
2647d14abf15SRobert Mustacchi {
2648d14abf15SRobert Mustacchi struct client_update_ramrod_data *data_virt;
2649d14abf15SRobert Mustacchi lm_address_t data_phys;
2650d14abf15SRobert Mustacchi volatile u32_t state;
2651d14abf15SRobert Mustacchi #define LM_CLI_UPDATE_NOT_USED 0
2652d14abf15SRobert Mustacchi #define LM_CLI_UPDATE_USED 1
2653d14abf15SRobert Mustacchi #define LM_CLI_UPDATE_RECV 2
2654d14abf15SRobert Mustacchi }lm_client_info_update;
2655d14abf15SRobert Mustacchi
2656d14abf15SRobert Mustacchi typedef struct _lm_client_info_t
2657d14abf15SRobert Mustacchi {
2658d14abf15SRobert Mustacchi client_init_data_t * client_init_data_virt;
2659d14abf15SRobert Mustacchi lm_address_t client_init_data_phys;
2660d14abf15SRobert Mustacchi
2661d14abf15SRobert Mustacchi lm_client_info_update update;
2662d14abf15SRobert Mustacchi
2663d14abf15SRobert Mustacchi /* Classification objects used in ecore-sp-verbs */
2664d14abf15SRobert Mustacchi struct ecore_vlan_mac_obj mac_obj;
2665d14abf15SRobert Mustacchi struct ecore_vlan_mac_obj mac_vlan_obj;
2666d14abf15SRobert Mustacchi struct ecore_vlan_mac_obj vlan_obj; /* 9/21/11 MichalS :used only for default, but placed here as a preparation for
2667d14abf15SRobert Mustacchi * future enhancement to support per client if needed */
2668d14abf15SRobert Mustacchi u16_t current_set_vlan;
2669d14abf15SRobert Mustacchi
2670d14abf15SRobert Mustacchi void * volatile set_mac_cookie;
2671d14abf15SRobert Mustacchi volatile u32_t sp_mac_state;
2672d14abf15SRobert Mustacchi
2673d14abf15SRobert Mustacchi /* RX_MODE related */
2674d14abf15SRobert Mustacchi void * volatile set_rx_mode_cookie;
2675d14abf15SRobert Mustacchi volatile unsigned long sp_rxmode_state;
2676d14abf15SRobert Mustacchi
2677d14abf15SRobert Mustacchi u32_t last_set_rx_mask;
2678d14abf15SRobert Mustacchi u8_t b_any_vlan_on;
2679d14abf15SRobert Mustacchi u8_t b_vlan_only_in_process;
2680d14abf15SRobert Mustacchi } lm_client_info_t ;
2681d14abf15SRobert Mustacchi
2682d14abf15SRobert Mustacchi /*************** SlowPath Queue Information: should be modified under SQ_LOCK ************/
2683d14abf15SRobert Mustacchi typedef void(*lm_sq_comp_cb_t)(struct _lm_device_t *pdev, struct sq_pending_command *pending);
2684d14abf15SRobert Mustacchi
2685d14abf15SRobert Mustacchi typedef enum {
2686d14abf15SRobert Mustacchi SQ_STATE_NORMAL = 0,
2687d14abf15SRobert Mustacchi SQ_STATE_PENDING = 1, /* In this state slowpath will be posted but not to HW.
2688d14abf15SRobert Mustacchi * completed by vbd work-item (Error Recovery) */
2689d14abf15SRobert Mustacchi SQ_STATE_BLOCKED = 2
2690d14abf15SRobert Mustacchi } lm_sq_state_t;
2691d14abf15SRobert Mustacchi
2692d14abf15SRobert Mustacchi typedef struct _lm_sq_info_t
2693d14abf15SRobert Mustacchi {
2694d14abf15SRobert Mustacchi lm_sq_chain_t sq_chain;
2695d14abf15SRobert Mustacchi u8_t num_pending_normal;
2696d14abf15SRobert Mustacchi u8_t num_pending_high;
2697d14abf15SRobert Mustacchi
2698d14abf15SRobert Mustacchi d_list_t pending_normal;
2699d14abf15SRobert Mustacchi d_list_t pending_high;
2700d14abf15SRobert Mustacchi
2701d14abf15SRobert Mustacchi /* This list contains the elements that have been posted to the SQ
2702d14abf15SRobert Mustacchi * but not completed by FW yet. Maximum list size is MAX_NUM_SPE anyway */
2703d14abf15SRobert Mustacchi d_list_t pending_complete;
2704d14abf15SRobert Mustacchi
2705d14abf15SRobert Mustacchi lm_sq_state_t sq_state;
2706d14abf15SRobert Mustacchi lm_sq_comp_cb_t sq_comp_cb[MAX_CONNECTION_TYPE];
2707d14abf15SRobert Mustacchi u8_t sq_comp_scheduled;
2708d14abf15SRobert Mustacchi
2709d14abf15SRobert Mustacchi } lm_sq_info_t;
2710d14abf15SRobert Mustacchi
2711d14abf15SRobert Mustacchi typedef enum {
2712d14abf15SRobert Mustacchi FUNCTION_START_POSTED = 0,
2713d14abf15SRobert Mustacchi FUNCTION_START_COMPLETED = 1,
2714d14abf15SRobert Mustacchi FUNCTION_STOP_POSTED = 2,
2715d14abf15SRobert Mustacchi FUNCTION_STOP_COMPLETED = 3
2716d14abf15SRobert Mustacchi } lm_function_state_t;
2717d14abf15SRobert Mustacchi
2718d14abf15SRobert Mustacchi typedef struct _lm_eq_info_t
2719d14abf15SRobert Mustacchi {
2720d14abf15SRobert Mustacchi lm_eq_chain_t eq_chain;
2721d14abf15SRobert Mustacchi
2722d14abf15SRobert Mustacchi volatile u32_t function_state;
2723d14abf15SRobert Mustacchi
2724d14abf15SRobert Mustacchi } lm_eq_info_t;
2725d14abf15SRobert Mustacchi
2726d14abf15SRobert Mustacchi /* for now */
2727d14abf15SRobert Mustacchi //TODO : need to change according to hsi enum
2728d14abf15SRobert Mustacchi #define MAX_PROTO (FCOE_CONNECTION_TYPE + 1)
2729d14abf15SRobert Mustacchi #if 0
2730d14abf15SRobert Mustacchi #define LM_PROTO_NIC 0
2731d14abf15SRobert Mustacchi #define LM_PROTO_TOE 1
2732d14abf15SRobert Mustacchi #endif //0
2733d14abf15SRobert Mustacchi
2734d14abf15SRobert Mustacchi /*******************************************************************************
2735d14abf15SRobert Mustacchi * cid resources
2736d14abf15SRobert Mustacchi ******************************************************************************/
2737d14abf15SRobert Mustacchi
2738d14abf15SRobert Mustacchi typedef struct _lm_cid_resc_t
2739d14abf15SRobert Mustacchi {
2740d14abf15SRobert Mustacchi lm_sp_req_manager_t sp_req_mgr;
2741d14abf15SRobert Mustacchi void *cookies[MAX_PROTO];
2742d14abf15SRobert Mustacchi u8_t cid_pending;
2743d14abf15SRobert Mustacchi #if defined(__SunOS)
2744d14abf15SRobert Mustacchi ddi_acc_handle_t reg_handle; /* Holds the DMA registration handle */
2745d14abf15SRobert Mustacchi #endif
2746d14abf15SRobert Mustacchi volatile void *mapped_cid_bar_addr;/* Holds the mapped BAR address.*/
2747d14abf15SRobert Mustacchi
2748d14abf15SRobert Mustacchi volatile u32_t con_state;
2749d14abf15SRobert Mustacchi #define LM_CON_STATE_CLOSE 0
2750d14abf15SRobert Mustacchi #define LM_CON_STATE_OPEN_SENT 1
2751d14abf15SRobert Mustacchi #define LM_CON_STATE_OPEN 2
2752d14abf15SRobert Mustacchi #define LM_CON_STATE_HALT_SENT 3
2753d14abf15SRobert Mustacchi #define LM_CON_STATE_HALT 4
2754d14abf15SRobert Mustacchi #define LM_CON_STATE_TERMINATE 5
2755d14abf15SRobert Mustacchi
2756d14abf15SRobert Mustacchi } lm_cid_resc_t;
2757d14abf15SRobert Mustacchi
2758d14abf15SRobert Mustacchi struct lm_context_cookie{
2759d14abf15SRobert Mustacchi lm_cid_resc_t cid_resc;
2760d14abf15SRobert Mustacchi u32_t next;
2761d14abf15SRobert Mustacchi u32_t prev; /* for enabling extraction */
2762d14abf15SRobert Mustacchi u8_t invalid;
2763d14abf15SRobert Mustacchi u8_t ip_type; /* for searcher mirror hash management */
2764d14abf15SRobert Mustacchi u8_t cfc_delete_cnt;
2765d14abf15SRobert Mustacchi u8_t _pad;
2766d14abf15SRobert Mustacchi u32_t h_val; /* for searcher mirror hash management */
2767d14abf15SRobert Mustacchi };
2768d14abf15SRobert Mustacchi #define LM_MAX_VALID_CFC_DELETIONS 3
2769d14abf15SRobert Mustacchi
2770d14abf15SRobert Mustacchi #define LM_CONTEXT_VALID 0
2771d14abf15SRobert Mustacchi #define LM_CONTEXT_INVALID_WAIT 1
2772d14abf15SRobert Mustacchi #define LM_CONTEXT_INVALID_DELETE 2
2773d14abf15SRobert Mustacchi
2774d14abf15SRobert Mustacchi /* The size of the context is currently 1K... this can change in the future*/
2775d14abf15SRobert Mustacchi #define LM_CONTEXT_SIZE 1024
2776d14abf15SRobert Mustacchi
2777d14abf15SRobert Mustacchi /* structures to support searcher hash table entries */
2778d14abf15SRobert Mustacchi typedef struct _lm_searcher_hash_entry {
2779d14abf15SRobert Mustacchi u8_t num_ipv4;
2780d14abf15SRobert Mustacchi u8_t num_ipv6;
2781d14abf15SRobert Mustacchi u8_t depth_ipv4;
2782d14abf15SRobert Mustacchi } lm_searcher_hash_entry_t;
2783d14abf15SRobert Mustacchi
2784d14abf15SRobert Mustacchi typedef struct _lm_searcher_hash_info {
2785d14abf15SRobert Mustacchi #define SEARCHER_KEY_LEN 40
2786d14abf15SRobert Mustacchi u8_t searcher_key[SEARCHER_KEY_LEN];
2787d14abf15SRobert Mustacchi u8_t searcher_key_bits[SEARCHER_KEY_LEN*8];
2788d14abf15SRobert Mustacchi
2789d14abf15SRobert Mustacchi /* length in bytes of IPV6 "4 tuple" */
2790d14abf15SRobert Mustacchi #define MAX_SEARCHER_IN_STR 36
2791d14abf15SRobert Mustacchi u8_t searcher_in_str_bits[MAX_SEARCHER_IN_STR*8];
2792d14abf15SRobert Mustacchi
2793d14abf15SRobert Mustacchi lm_searcher_hash_entry_t *searcher_table;
2794d14abf15SRobert Mustacchi u32_t num_tuples; /* for debug */
2795d14abf15SRobert Mustacchi u8_t hash_depth_reached; /* for debug */
2796d14abf15SRobert Mustacchi u8_t num_hash_bits;
2797d14abf15SRobert Mustacchi } lm_searcher_hash_info_t;
2798d14abf15SRobert Mustacchi
2799d14abf15SRobert Mustacchi /* per-function context data */
2800d14abf15SRobert Mustacchi typedef struct _lm_context_info {
2801d14abf15SRobert Mustacchi struct lm_context_cookie * array;
2802d14abf15SRobert Mustacchi /* spinlock_t lock; lock was moved to the UM */
2803d14abf15SRobert Mustacchi u32_t proto_start[MAX_PROTO];
2804d14abf15SRobert Mustacchi u32_t proto_end[MAX_PROTO];
2805d14abf15SRobert Mustacchi u32_t proto_ffree[MAX_PROTO];
2806d14abf15SRobert Mustacchi u32_t proto_pending[MAX_PROTO]; /* list of cids that are pending for cfc-delete */
2807d14abf15SRobert Mustacchi
2808d14abf15SRobert Mustacchi /* field added for searcher mirror hash management.
2809d14abf15SRobert Mustacchi * it is part of the context info because this hash management
2810d14abf15SRobert Mustacchi * is done as part of cid allocation/de-allocating */
2811d14abf15SRobert Mustacchi lm_searcher_hash_info_t searcher_hash;
2812d14abf15SRobert Mustacchi } lm_context_info_t;
2813d14abf15SRobert Mustacchi
2814d14abf15SRobert Mustacchi //#endif /* 0 */
2815d14abf15SRobert Mustacchi
2816d14abf15SRobert Mustacchi /*******************************************************************************
2817d14abf15SRobert Mustacchi * Include the l4 header file.
2818d14abf15SRobert Mustacchi ******************************************************************************/
2819d14abf15SRobert Mustacchi #include "lm_l4st.h"
2820d14abf15SRobert Mustacchi #include "lm_l4if.h"
2821d14abf15SRobert Mustacchi
2822d14abf15SRobert Mustacchi #include "lm_l5st.h"
2823d14abf15SRobert Mustacchi #include "lm_l5if.h"
2824d14abf15SRobert Mustacchi
2825d14abf15SRobert Mustacchi /* lm device offload info that is common to all offloaded protocols */
2826d14abf15SRobert Mustacchi typedef struct _lm_offload_info_t
2827d14abf15SRobert Mustacchi {
2828d14abf15SRobert Mustacchi struct _lm_device_t *pdev;
2829d14abf15SRobert Mustacchi
2830d14abf15SRobert Mustacchi l4_ofld_params_t l4_params;
2831d14abf15SRobert Mustacchi
2832d14abf15SRobert Mustacchi /* Per stack offload state info. Each index correspond to a stack. */
2833d14abf15SRobert Mustacchi #define STATE_BLOCK_IDX0 0
2834d14abf15SRobert Mustacchi #define STATE_BLOCK_TOE STATE_BLOCK_IDX0
2835d14abf15SRobert Mustacchi #define STATE_BLOCK_IDX1 1
2836d14abf15SRobert Mustacchi #define STATE_BLOCK_IDX2 2
2837d14abf15SRobert Mustacchi #define STATE_BLOCK_ISCSI STATE_BLOCK_IDX2
2838d14abf15SRobert Mustacchi #define STATE_BLOCK_IDX3 3
2839d14abf15SRobert Mustacchi #define STATE_BLOCK_RDMA STATE_BLOCK_IDX3
2840d14abf15SRobert Mustacchi #define STATE_BLOCK_IDX4 4
2841d14abf15SRobert Mustacchi #define STATE_BLOCK_FCOE STATE_BLOCK_IDX4
2842d14abf15SRobert Mustacchi #define STATE_BLOCK_CNT 5
2843d14abf15SRobert Mustacchi lm_state_block_t *state_blks[STATE_BLOCK_CNT];
2844d14abf15SRobert Mustacchi } lm_offload_info_t;
2845d14abf15SRobert Mustacchi
2846d14abf15SRobert Mustacchi typedef void(*lm_cid_recycled_cb_t)(struct _lm_device_t *pdev, void *cookie, s32_t cid);
2847d14abf15SRobert Mustacchi
2848d14abf15SRobert Mustacchi struct iro {
2849d14abf15SRobert Mustacchi u32_t base;
2850d14abf15SRobert Mustacchi u16_t m1;
2851d14abf15SRobert Mustacchi u16_t m2;
2852d14abf15SRobert Mustacchi u16_t m3;
2853d14abf15SRobert Mustacchi u16_t size;
2854d14abf15SRobert Mustacchi } ;
2855d14abf15SRobert Mustacchi
2856d14abf15SRobert Mustacchi /* ecore info. Variables that are accessed from the common init code need using the defines below */
2857d14abf15SRobert Mustacchi typedef struct _ecore_info_t
2858d14abf15SRobert Mustacchi {
2859d14abf15SRobert Mustacchi void * gunzip_buf; /* used for unzipping data */
2860d14abf15SRobert Mustacchi u32_t gunzip_outlen;
2861d14abf15SRobert Mustacchi lm_address_t gunzip_phys; /* physical address of buffer */
2862d14abf15SRobert Mustacchi #define FW_BUF_SIZE 0x8000
2863d14abf15SRobert Mustacchi #define GUNZIP_BUF(_pdev) (_pdev)->ecore_info.gunzip_buf
2864d14abf15SRobert Mustacchi #define GUNZIP_OUTLEN(_pdev) (_pdev)->ecore_info.gunzip_outlen
2865d14abf15SRobert Mustacchi #define GUNZIP_PHYS(_pdev) (_pdev)->ecore_info.gunzip_phys
2866d14abf15SRobert Mustacchi const struct raw_op *init_ops;
2867d14abf15SRobert Mustacchi /* Init blocks offsets inside init_ops */
2868d14abf15SRobert Mustacchi const u16_t *init_ops_offsets;
2869d14abf15SRobert Mustacchi /* Data blob - has 32 bit granularity */
2870d14abf15SRobert Mustacchi const u32_t *init_data;
2871d14abf15SRobert Mustacchi u32_t init_mode_flags;
2872d14abf15SRobert Mustacchi #define INIT_MODE_FLAGS(_pdev) (_pdev)->ecore_info.init_mode_flags
2873d14abf15SRobert Mustacchi /* Zipped PRAM blobs - raw data */
2874d14abf15SRobert Mustacchi const u8_t *tsem_int_table_data;
2875d14abf15SRobert Mustacchi const u8_t *tsem_pram_data;
2876d14abf15SRobert Mustacchi const u8_t *usem_int_table_data;
2877d14abf15SRobert Mustacchi const u8_t *usem_pram_data;
2878d14abf15SRobert Mustacchi const u8_t *xsem_int_table_data;
2879d14abf15SRobert Mustacchi const u8_t *xsem_pram_data;
2880d14abf15SRobert Mustacchi const u8_t *csem_int_table_data;
2881d14abf15SRobert Mustacchi const u8_t *csem_pram_data;
2882d14abf15SRobert Mustacchi #define INIT_OPS(_pdev) (_pdev)->ecore_info.init_ops
2883d14abf15SRobert Mustacchi #define INIT_DATA(_pdev) (_pdev)->ecore_info.init_data
2884d14abf15SRobert Mustacchi #define INIT_OPS_OFFSETS(_pdev) (_pdev)->ecore_info.init_ops_offsets
2885d14abf15SRobert Mustacchi #define INIT_TSEM_PRAM_DATA(_pdev) (_pdev)->ecore_info.tsem_pram_data
2886d14abf15SRobert Mustacchi #define INIT_XSEM_PRAM_DATA(_pdev) (_pdev)->ecore_info.xsem_pram_data
2887d14abf15SRobert Mustacchi #define INIT_USEM_PRAM_DATA(_pdev) (_pdev)->ecore_info.usem_pram_data
2888d14abf15SRobert Mustacchi #define INIT_CSEM_PRAM_DATA(_pdev) (_pdev)->ecore_info.csem_pram_data
2889d14abf15SRobert Mustacchi #define INIT_TSEM_INT_TABLE_DATA(_pdev) (_pdev)->ecore_info.tsem_int_table_data
2890d14abf15SRobert Mustacchi #define INIT_XSEM_INT_TABLE_DATA(_pdev) (_pdev)->ecore_info.xsem_int_table_data
2891d14abf15SRobert Mustacchi #define INIT_USEM_INT_TABLE_DATA(_pdev) (_pdev)->ecore_info.usem_int_table_data
2892d14abf15SRobert Mustacchi #define INIT_CSEM_INT_TABLE_DATA(_pdev) (_pdev)->ecore_info.csem_int_table_data
2893d14abf15SRobert Mustacchi const struct iro *iro_arr;
2894d14abf15SRobert Mustacchi #define INIT_IRO_ARRAY(_pdev) (_pdev)->ecore_info.iro_arr
2895d14abf15SRobert Mustacchi #define IRO (PFDEV(pdev))->ecore_info.iro_arr
2896d14abf15SRobert Mustacchi
2897d14abf15SRobert Mustacchi } ecore_info_t;
2898d14abf15SRobert Mustacchi
2899d14abf15SRobert Mustacchi typedef struct _flr_stats_t {
2900d14abf15SRobert Mustacchi u32_t is_pf;
2901d14abf15SRobert Mustacchi u32_t default_wait_interval_ms;
2902d14abf15SRobert Mustacchi u32_t cfc_usage_counter;
2903d14abf15SRobert Mustacchi u32_t qm_usage_counter;
2904d14abf15SRobert Mustacchi u32_t tm_vnic_usage_counter;
2905d14abf15SRobert Mustacchi u32_t tm_num_scans_usage_counter;
2906d14abf15SRobert Mustacchi u32_t dq_usage_counter;
2907d14abf15SRobert Mustacchi u32_t final_cleanup_complete;
2908d14abf15SRobert Mustacchi u32_t dmae_cx;
2909d14abf15SRobert Mustacchi u32_t pbf_queue[3];
2910d14abf15SRobert Mustacchi u32_t pbf_transmit_buffer[3];
2911d14abf15SRobert Mustacchi } flr_stats_t;
2912d14abf15SRobert Mustacchi
2913d14abf15SRobert Mustacchi
2914d14abf15SRobert Mustacchi typedef struct _lm_slowpath_data_t {
2915d14abf15SRobert Mustacchi /* Function Start Data */
2916d14abf15SRobert Mustacchi struct function_start_data * func_start_data;
2917d14abf15SRobert Mustacchi lm_address_t func_start_data_phys;
2918d14abf15SRobert Mustacchi
2919d14abf15SRobert Mustacchi /* Classification */
2920d14abf15SRobert Mustacchi union {
2921d14abf15SRobert Mustacchi struct mac_configuration_cmd e1x;
2922d14abf15SRobert Mustacchi struct eth_classify_rules_ramrod_data e2;
2923d14abf15SRobert Mustacchi } * mac_rdata[LM_CLI_IDX_MAX];
2924d14abf15SRobert Mustacchi lm_address_t mac_rdata_phys[LM_CLI_IDX_MAX];
2925d14abf15SRobert Mustacchi
2926d14abf15SRobert Mustacchi /* TODO: MAC-VLAN PAIR!!! */
2927d14abf15SRobert Mustacchi
2928d14abf15SRobert Mustacchi union {
2929d14abf15SRobert Mustacchi struct tstorm_eth_mac_filter_config e1x;
2930d14abf15SRobert Mustacchi struct eth_filter_rules_ramrod_data e2;
2931d14abf15SRobert Mustacchi } * rx_mode_rdata[LM_CLI_IDX_MAX];
2932d14abf15SRobert Mustacchi lm_address_t rx_mode_rdata_phys[LM_CLI_IDX_MAX]; // FIXME: multi-client...
2933d14abf15SRobert Mustacchi
2934d14abf15SRobert Mustacchi union {
2935d14abf15SRobert Mustacchi struct mac_configuration_cmd e1;
2936d14abf15SRobert Mustacchi struct eth_multicast_rules_ramrod_data e2;
2937d14abf15SRobert Mustacchi } * mcast_rdata[LM_CLI_IDX_MAX];
2938d14abf15SRobert Mustacchi lm_address_t mcast_rdata_phys[LM_CLI_IDX_MAX];
2939d14abf15SRobert Mustacchi
2940d14abf15SRobert Mustacchi union {
2941d14abf15SRobert Mustacchi //struct eth_rss_update_ramrod_data_e1x e1x;
2942d14abf15SRobert Mustacchi struct eth_rss_update_ramrod_data e2;
2943d14abf15SRobert Mustacchi } * rss_rdata;
2944d14abf15SRobert Mustacchi lm_address_t rss_rdata_phys;
2945d14abf15SRobert Mustacchi
2946d14abf15SRobert Mustacchi struct function_update_data* niv_function_update_data;
2947d14abf15SRobert Mustacchi lm_address_t niv_function_update_data_phys;
2948d14abf15SRobert Mustacchi
2949d14abf15SRobert Mustacchi struct function_update_data* l2mp_func_update_data;
2950d14abf15SRobert Mustacchi lm_address_t l2mp_func_update_data_phys;
2951d14abf15SRobert Mustacchi
2952d14abf15SRobert Mustacchi struct function_update_data* encap_function_update_data;
2953d14abf15SRobert Mustacchi lm_address_t encap_function_update_data_phys;
2954d14abf15SRobert Mustacchi
2955d14abf15SRobert Mustacchi struct function_update_data* ufp_function_update_data;
2956d14abf15SRobert Mustacchi lm_address_t ufp_function_update_data_phys;
2957d14abf15SRobert Mustacchi
2958d14abf15SRobert Mustacchi } lm_slowpath_data_t ;
2959d14abf15SRobert Mustacchi
2960d14abf15SRobert Mustacchi typedef enum _niv_ramrod_state_t
2961d14abf15SRobert Mustacchi {
2962d14abf15SRobert Mustacchi NIV_RAMROD_NOT_POSTED,
2963d14abf15SRobert Mustacchi NIV_RAMROD_VIF_UPDATE_POSTED,
2964d14abf15SRobert Mustacchi NIV_RAMROD_VIF_LISTS_POSTED,
2965d14abf15SRobert Mustacchi NIV_RAMROD_SET_LOOPBACK_POSTED,
2966d14abf15SRobert Mustacchi NIV_RAMROD_CLEAR_LOOPBACK_POSTED,
2967d14abf15SRobert Mustacchi NIV_RAMROD_COMPLETED
2968d14abf15SRobert Mustacchi }niv_ramrod_state_t;
2969d14abf15SRobert Mustacchi
2970d14abf15SRobert Mustacchi
2971d14abf15SRobert Mustacchi typedef enum _ufp_ramrod_state_t
2972d14abf15SRobert Mustacchi {
2973d14abf15SRobert Mustacchi UFP_RAMROD_NOT_POSTED,
2974d14abf15SRobert Mustacchi UFP_RAMROD_PF_LINK_UPDATE_POSTED,
2975d14abf15SRobert Mustacchi UFP_RAMROD_PF_UPDATE_POSTED,
2976d14abf15SRobert Mustacchi UFP_RAMROD_COMPLETED
2977d14abf15SRobert Mustacchi }ufp_ramrod_state_t;
2978d14abf15SRobert Mustacchi
2979d14abf15SRobert Mustacchi typedef struct _lm_slowpath_info_t {
2980d14abf15SRobert Mustacchi lm_slowpath_data_t slowpath_data;
2981d14abf15SRobert Mustacchi
2982d14abf15SRobert Mustacchi #define LM_SLOWPATH(pdev, var) (pdev->slowpath_info.slowpath_data.var)
2983d14abf15SRobert Mustacchi #define LM_SLOWPATH_PHYS(pdev, var) (pdev->slowpath_info.slowpath_data.var##_phys)
2984d14abf15SRobert Mustacchi
2985d14abf15SRobert Mustacchi
2986d14abf15SRobert Mustacchi /* CAM credit pools */
2987d14abf15SRobert Mustacchi struct ecore_credit_pool_obj vlans_pool;
2988d14abf15SRobert Mustacchi struct ecore_credit_pool_obj macs_pool;
2989d14abf15SRobert Mustacchi
2990d14abf15SRobert Mustacchi /* Rx-Mode Object */
2991d14abf15SRobert Mustacchi struct ecore_rx_mode_obj rx_mode_obj;
2992d14abf15SRobert Mustacchi
2993d14abf15SRobert Mustacchi /* Multi-Cast */
2994d14abf15SRobert Mustacchi struct ecore_mcast_obj mcast_obj[LM_CLI_IDX_MAX];
2995d14abf15SRobert Mustacchi volatile void * set_mcast_cookie[LM_CLI_IDX_MAX];
2996d14abf15SRobert Mustacchi volatile u32_t sp_mcast_state[LM_CLI_IDX_MAX];
2997d14abf15SRobert Mustacchi
2998d14abf15SRobert Mustacchi /* RSS - Only support for NDIS client ! */
2999d14abf15SRobert Mustacchi struct ecore_rss_config_obj rss_conf_obj;
3000d14abf15SRobert Mustacchi volatile void * set_rss_cookie;
3001d14abf15SRobert Mustacchi volatile u32_t sp_rss_state;
3002d14abf15SRobert Mustacchi
3003d14abf15SRobert Mustacchi u32_t rss_hash_key[RSS_HASH_KEY_SIZE/4];
3004d14abf15SRobert Mustacchi u32_t last_set_rss_flags;
3005d14abf15SRobert Mustacchi u32_t last_set_rss_result_mask;
3006d14abf15SRobert Mustacchi u8 last_set_indirection_table[T_ETH_INDIRECTION_TABLE_SIZE];
3007d14abf15SRobert Mustacchi
3008d14abf15SRobert Mustacchi // possible values of the echo field
3009d14abf15SRobert Mustacchi #define FUNC_UPDATE_RAMROD_NO_SOURCE 0
3010d14abf15SRobert Mustacchi #define FUNC_UPDATE_RAMROD_SOURCE_NIV 1
3011d14abf15SRobert Mustacchi #define FUNC_UPDATE_RAMROD_SOURCE_L2MP 2
3012d14abf15SRobert Mustacchi #define FUNC_UPDATE_RAMROD_SOURCE_ENCAP 3
3013d14abf15SRobert Mustacchi #define FUNC_UPDATE_RAMROD_SOURCE_UFP 4
3014d14abf15SRobert Mustacchi
3015d14abf15SRobert Mustacchi volatile u32_t niv_ramrod_state; //use enum niv_ramrod_state_t
3016d14abf15SRobert Mustacchi
3017d14abf15SRobert Mustacchi volatile u32_t l2mp_func_update_ramrod_state;
3018d14abf15SRobert Mustacchi #define L2MP_FUNC_UPDATE_RAMROD_NOT_POSTED 0
3019d14abf15SRobert Mustacchi #define L2MP_FUNC_UPDATE_RAMROD_POSTED 1
3020d14abf15SRobert Mustacchi #define L2MP_FUNC_UPDATE_RAMROD_COMPLETED 2
3021d14abf15SRobert Mustacchi
3022d14abf15SRobert Mustacchi volatile u8_t last_vif_list_bitmap;
3023d14abf15SRobert Mustacchi volatile u32_t ufp_func_ramrod_state; //use enum ufp_ramrod_state_t
3024d14abf15SRobert Mustacchi } lm_slowpath_info_t;
3025d14abf15SRobert Mustacchi
3026d14abf15SRobert Mustacchi #define MAX_ER_DEBUG_ENTRIES 10
3027d14abf15SRobert Mustacchi
3028d14abf15SRobert Mustacchi typedef struct _lm_er_debug_info_t
3029d14abf15SRobert Mustacchi {
3030d14abf15SRobert Mustacchi u32_t attn_sig[MAX_ATTN_REGS];
3031d14abf15SRobert Mustacchi } lm_er_debug_info_t;
3032d14abf15SRobert Mustacchi
3033d14abf15SRobert Mustacchi typedef enum _encap_ofld_state_t
3034d14abf15SRobert Mustacchi {
3035d14abf15SRobert Mustacchi ENCAP_OFFLOAD_DISABLED,
3036d14abf15SRobert Mustacchi ENCAP_OFFLOAD_ENABLED
3037d14abf15SRobert Mustacchi } encap_ofld_state_t;
3038d14abf15SRobert Mustacchi
3039d14abf15SRobert Mustacchi typedef struct _lm_encap_info_t
3040d14abf15SRobert Mustacchi {
3041d14abf15SRobert Mustacchi u8_t new_encap_offload_state;
3042d14abf15SRobert Mustacchi u8_t current_encap_offload_state;
3043d14abf15SRobert Mustacchi
3044d14abf15SRobert Mustacchi volatile void * update_cookie;
3045d14abf15SRobert Mustacchi }lm_encap_info_t;
3046d14abf15SRobert Mustacchi
3047d14abf15SRobert Mustacchi typedef struct _lm_debug_info_t
3048d14abf15SRobert Mustacchi {
3049d14abf15SRobert Mustacchi u32_t ack_dis[MAX_HW_CHAINS];
3050d14abf15SRobert Mustacchi u32_t ack_en[MAX_HW_CHAINS];
3051d14abf15SRobert Mustacchi u32_t ack_def_dis;
3052d14abf15SRobert Mustacchi u32_t ack_def_en;
3053d14abf15SRobert Mustacchi u32_t rx_only_int[MAX_HW_CHAINS];
3054d14abf15SRobert Mustacchi u32_t tx_only_int[MAX_HW_CHAINS];
3055d14abf15SRobert Mustacchi u32_t both_int[MAX_HW_CHAINS];
3056d14abf15SRobert Mustacchi u32_t empty_int[MAX_HW_CHAINS];
3057d14abf15SRobert Mustacchi u32_t false_int[MAX_HW_CHAINS];
3058d14abf15SRobert Mustacchi u32_t not_porocessed_int[MAX_HW_CHAINS];
3059d14abf15SRobert Mustacchi
3060d14abf15SRobert Mustacchi /* Debug information for error recovery. */
3061d14abf15SRobert Mustacchi /* Data for last MAX_ER_DEBUG_ENTRIES recoveries */
3062d14abf15SRobert Mustacchi lm_er_debug_info_t er_debug_info[MAX_ER_DEBUG_ENTRIES];
3063d14abf15SRobert Mustacchi u8_t curr_er_debug_idx; /* Index into array above */
3064d14abf15SRobert Mustacchi u8_t er_bit_is_set_already;
3065d14abf15SRobert Mustacchi u8_t er_bit_from_previous_sessions;
3066d14abf15SRobert Mustacchi u8_t _pad;
3067d14abf15SRobert Mustacchi
3068d14abf15SRobert Mustacchi /* Some temporary statistics for removed sanity checks */
3069d14abf15SRobert Mustacchi u32_t number_of_long_LSO_headers; /* for LSO processing of packets with headers more than 120 B */
3070d14abf15SRobert Mustacchi u32_t pending_tx_packets_on_fwd; /* There were pending tx packets on forward channel at time of abort
3071d14abf15SRobert Mustacchi * CQ57879 : evbda!um_abort_tx_packets while running Super Stress with Error Recovery */
3072d14abf15SRobert Mustacchi
3073d14abf15SRobert Mustacchi /* OS bugs worked-around in eVBD */
3074d14abf15SRobert Mustacchi u32_t pf0_mps_overwrite;
3075d14abf15SRobert Mustacchi
3076d14abf15SRobert Mustacchi /* TOE Rx/Tx half-complete upon ER */
3077d14abf15SRobert Mustacchi u32_t toe_rx_comp_upon_er;
3078d14abf15SRobert Mustacchi u32_t toe_tx_comp_upon_er;
3079d14abf15SRobert Mustacchi
3080d14abf15SRobert Mustacchi u32_t toe_prealloc_alloc_fail;
3081*9b622488SToomas Soome
3082d14abf15SRobert Mustacchi } lm_debug_info_t;
3083d14abf15SRobert Mustacchi
3084*9b622488SToomas Soome /*
3085*9b622488SToomas Soome * CQ 70040
3086*9b622488SToomas Soome * Support for NSCI get OS driver version
3087*9b622488SToomas Soome */
3088d14abf15SRobert Mustacchi typedef struct _lm_cli_drv_ver_to_shmem_t
3089d14abf15SRobert Mustacchi {
3090d14abf15SRobert Mustacchi struct os_drv_ver cli_drv_ver;
3091d14abf15SRobert Mustacchi }lm_cli_drv_ver_to_shmem_t;
3092d14abf15SRobert Mustacchi
3093d14abf15SRobert Mustacchi /*******************************************************************************
3094d14abf15SRobert Mustacchi * Main device block.
3095d14abf15SRobert Mustacchi ******************************************************************************/
3096d14abf15SRobert Mustacchi typedef struct _lm_device_t
3097d14abf15SRobert Mustacchi {
3098d14abf15SRobert Mustacchi d_list_entry_t link; /* Link for the device list. */
3099d14abf15SRobert Mustacchi
3100d14abf15SRobert Mustacchi u32_t ver_num; /* major:8 minor:8 fix:16 */
3101d14abf15SRobert Mustacchi u8_t ver_str[16]; /* null terminated version string. */
3102d14abf15SRobert Mustacchi u32_t ver_num_fw; /* major:8 minor:8 fix:16 */
3103d14abf15SRobert Mustacchi u8_t product_version[4]; /* OEM product version 0xffffffff means invalid/not exists*/
3104d14abf15SRobert Mustacchi
3105d14abf15SRobert Mustacchi lm_variables_t vars;
3106d14abf15SRobert Mustacchi lm_tx_info_t tx_info;
3107d14abf15SRobert Mustacchi lm_rx_info_t rx_info;
3108d14abf15SRobert Mustacchi lm_sq_info_t sq_info;
3109d14abf15SRobert Mustacchi lm_eq_info_t eq_info;
3110d14abf15SRobert Mustacchi lm_client_info_t client_info[ETH_MAX_RX_CLIENTS_E2];
3111d14abf15SRobert Mustacchi lm_offload_info_t ofld_info;
3112d14abf15SRobert Mustacchi lm_toe_info_t toe_info;
3113d14abf15SRobert Mustacchi lm_dcbx_info_t dcbx_info;
3114d14abf15SRobert Mustacchi lm_hardware_info_t hw_info;
3115d14abf15SRobert Mustacchi lm_slowpath_info_t slowpath_info;
3116d14abf15SRobert Mustacchi lm_dmae_info_t dmae_info;
3117d14abf15SRobert Mustacchi lm_params_t params;
3118d14abf15SRobert Mustacchi lm_context_info_t* context_info;
3119d14abf15SRobert Mustacchi //lm_mc_table_t mc_table;
3120d14abf15SRobert Mustacchi lm_nwuf_list_t nwuf_list;
3121d14abf15SRobert Mustacchi
3122d14abf15SRobert Mustacchi i2c_binary_info_t i2c_binary_info;
3123d14abf15SRobert Mustacchi
3124d14abf15SRobert Mustacchi /* Statistics. */
3125d14abf15SRobert Mustacchi u32_t chip_reset_cnt;
3126d14abf15SRobert Mustacchi u32_t fw_timed_out_cnt;
3127d14abf15SRobert Mustacchi
3128d14abf15SRobert Mustacchi lm_cid_recycled_cb_t cid_recycled_callbacks[MAX_PROTO];
3129d14abf15SRobert Mustacchi
3130d14abf15SRobert Mustacchi lm_iscsi_info_t iscsi_info;
3131d14abf15SRobert Mustacchi
3132d14abf15SRobert Mustacchi lm_fcoe_info_t fcoe_info;
3133d14abf15SRobert Mustacchi
3134d14abf15SRobert Mustacchi ecore_info_t ecore_info;
3135d14abf15SRobert Mustacchi struct _lm_device_t* pf_dev;
3136d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3137d14abf15SRobert Mustacchi pf_resources_set_t pf_resources;
3138d14abf15SRobert Mustacchi u8_t vf_idx;
3139d14abf15SRobert Mustacchi u8_t _vf_pad[2];
3140d14abf15SRobert Mustacchi //PF master params
3141d14abf15SRobert Mustacchi lm_vfs_set_t vfs_set;
3142d14abf15SRobert Mustacchi //VF PF Channel params
3143d14abf15SRobert Mustacchi void * pf_vf_acquiring_resp;
3144d14abf15SRobert Mustacchi #endif
3145d14abf15SRobert Mustacchi flr_stats_t flr_stats;
3146d14abf15SRobert Mustacchi
3147d14abf15SRobert Mustacchi lm_encap_info_t encap_info;
3148d14abf15SRobert Mustacchi
3149d14abf15SRobert Mustacchi lm_debug_info_t debug_info;
3150d14abf15SRobert Mustacchi
3151*9b622488SToomas Soome /*
3152*9b622488SToomas Soome * 08/01/2014
3153*9b622488SToomas Soome * CQ 70040
3154*9b622488SToomas Soome * Support for NSCI get OS driver version
3155*9b622488SToomas Soome */
3156d14abf15SRobert Mustacchi lm_cli_drv_ver_to_shmem_t lm_cli_drv_ver_to_shmem;
3157d14abf15SRobert Mustacchi
3158d14abf15SRobert Mustacchi /* Turned on if a panic occured in the device... (viewed by functions that wait and get a timeout... - do not assert... )
3159d14abf15SRobert Mustacchi * not turned on yet, prep for the future...
3160d14abf15SRobert Mustacchi */
3161d14abf15SRobert Mustacchi u8_t panic;
3162d14abf15SRobert Mustacchi } lm_device_t;
3163d14abf15SRobert Mustacchi
3164d14abf15SRobert Mustacchi
3165d14abf15SRobert Mustacchi // driver pulse interval calculation
3166d14abf15SRobert Mustacchi #define DRV_PULSE_PERIOD_MS_FACTOR(_p) CHIP_REV_IS_ASIC(_p) ? DRV_PULSE_PERIOD_MS : (DRV_PULSE_PERIOD_MS*10)
3167d14abf15SRobert Mustacchi
3168d14abf15SRobert Mustacchi // dropless mode definitions
3169d14abf15SRobert Mustacchi #define BRB_SIZE(_pdev) (CHIP_IS_E3(_pdev) ? 1024 : 512)
3170d14abf15SRobert Mustacchi #define MAX_AGG_QS(_pdev) (CHIP_IS_E1(_pdev) ? \
3171d14abf15SRobert Mustacchi ETH_MAX_AGGREGATION_QUEUES_E1 :\
3172d14abf15SRobert Mustacchi ETH_MAX_AGGREGATION_QUEUES_E1H_E2)
3173d14abf15SRobert Mustacchi #define FW_DROP_LEVEL(_pdev) (ETH_MIN_RX_CQES_WITHOUT_TPA + MAX_AGG_QS(_pdev))
3174d14abf15SRobert Mustacchi #define FW_PREFETCH_CNT 16
3175d14abf15SRobert Mustacchi #define DROPLESS_FC_HEADROOM 150
3176d14abf15SRobert Mustacchi
3177d14abf15SRobert Mustacchi /*******************************************************************************
3178d14abf15SRobert Mustacchi * Functions exported between file modules.
3179d14abf15SRobert Mustacchi ******************************************************************************/
3180d14abf15SRobert Mustacchi /* Prints the entire information of all status blocks
3181d14abf15SRobert Mustacchi * Parameters:
3182d14abf15SRobert Mustacchi * pdev - LM device which holds the status blocks within
3183d14abf15SRobert Mustacchi */
3184d14abf15SRobert Mustacchi void print_sb_info(lm_device_t *pdev);
3185d14abf15SRobert Mustacchi
3186d14abf15SRobert Mustacchi //__________________________________________________________________________________
3187d14abf15SRobert Mustacchi
3188d14abf15SRobert Mustacchi lm_status_t lm_pretend_func( struct _lm_device_t *pdev, u16_t pretend_func_num );
3189d14abf15SRobert Mustacchi
3190d14abf15SRobert Mustacchi /* returns a non-default status block according to rss ID
3191d14abf15SRobert Mustacchi * Parameters:
3192d14abf15SRobert Mustacchi * pdev - LM device which holds the status blocks within
3193d14abf15SRobert Mustacchi * rss_id - RSS ID for which we return the specific status block
3194d14abf15SRobert Mustacchi */
3195d14abf15SRobert Mustacchi volatile struct host_status_block * lm_get_status_block(lm_device_t *pdev, u8_t rss_id);
3196d14abf15SRobert Mustacchi
3197d14abf15SRobert Mustacchi /* returns the default status block. It is unique per function.
3198d14abf15SRobert Mustacchi * Parameters:
3199d14abf15SRobert Mustacchi * pdev - LM device which holds the status blocks within
3200d14abf15SRobert Mustacchi */
3201d14abf15SRobert Mustacchi volatile struct hc_sp_status_block * lm_get_default_status_block(lm_device_t *pdev);
3202d14abf15SRobert Mustacchi
3203d14abf15SRobert Mustacchi /* returns the attention status block. It is unique per function.
3204d14abf15SRobert Mustacchi * Parameters:
3205d14abf15SRobert Mustacchi * pdev - LM device which holds the status blocks within
3206d14abf15SRobert Mustacchi */
3207d14abf15SRobert Mustacchi volatile struct atten_sp_status_block * lm_get_attention_status_block(lm_device_t *pdev);
3208d14abf15SRobert Mustacchi
3209d14abf15SRobert Mustacchi /**
3210d14abf15SRobert Mustacchi * @Description
3211d14abf15SRobert Mustacchi * Prepares for MCP reset: takes care of CLP
3212d14abf15SRobert Mustacchi * configurations.
3213d14abf15SRobert Mustacchi *
3214d14abf15SRobert Mustacchi * @param pdev
3215d14abf15SRobert Mustacchi * @param magic_val Old value of 'magic' bit.
3216d14abf15SRobert Mustacchi */
3217d14abf15SRobert Mustacchi lm_status_t lm_reset_mcp_prep(lm_device_t *pde, u32_t * magic_val);
3218d14abf15SRobert Mustacchi lm_status_t lm_reset_mcp_comp(lm_device_t *pdev, u32_t magic_val);
3219d14abf15SRobert Mustacchi
3220d14abf15SRobert Mustacchi
3221*9b622488SToomas Soome /* Initialize the whole status blocks per port - overall: 1 default sb, 16 non-default sbs
3222d14abf15SRobert Mustacchi *
3223d14abf15SRobert Mustacchi * Parameters:
3224d14abf15SRobert Mustacchi * pdev - the LM device which holds the sbs
3225d14abf15SRobert Mustacchi * port - the port number
3226d14abf15SRobert Mustacchi */
3227d14abf15SRobert Mustacchi void init_status_blocks(struct _lm_device_t *pdev);
3228d14abf15SRobert Mustacchi
3229d14abf15SRobert Mustacchi void lm_setup_ndsb_index(struct _lm_device_t *pdev, u8_t sb_id, u8_t idx, u8_t sm_idx, u8_t timeout, u8_t dhc_enable);
3230d14abf15SRobert Mustacchi
3231d14abf15SRobert Mustacchi /**
3232d14abf15SRobert Mustacchi * This function sets all the status-block ack values back to
3233d14abf15SRobert Mustacchi * zero. Must be called BEFORE initializing the igu + before
3234d14abf15SRobert Mustacchi * initializing status-blocks.
3235d14abf15SRobert Mustacchi *
3236d14abf15SRobert Mustacchi * @param pdev
3237d14abf15SRobert Mustacchi */
3238d14abf15SRobert Mustacchi void lm_reset_sb_ack_values(struct _lm_device_t *pdev);
3239d14abf15SRobert Mustacchi
3240d14abf15SRobert Mustacchi /* set interrupt coalesing parameters.
3241d14abf15SRobert Mustacchi - these settings are derived from user configured interrupt coalesing mode and tx/rx interrupts rate (lm params).
3242d14abf15SRobert Mustacchi - these settings are used for status blocks initialization */
3243d14abf15SRobert Mustacchi void lm_set_int_coal_info(struct _lm_device_t *pdev);
3244d14abf15SRobert Mustacchi
3245d14abf15SRobert Mustacchi void lm_int_igu_sb_cleanup(lm_device_t *pdev, u8 igu_sb_id);
3246d14abf15SRobert Mustacchi
3247d14abf15SRobert Mustacchi /**
3248d14abf15SRobert Mustacchi * @description
3249d14abf15SRobert Mustacchi * Get the HC_INDEX_ETH_TX_CQ_CONS_COSX index from chain.
3250d14abf15SRobert Mustacchi * @param pdev
3251d14abf15SRobert Mustacchi * @param chain
3252d14abf15SRobert Mustacchi *
3253d14abf15SRobert Mustacchi * @return STATIC u8_t
3254d14abf15SRobert Mustacchi */
3255d14abf15SRobert Mustacchi u8_t
3256d14abf15SRobert Mustacchi lm_eth_tx_hc_cq_cons_cosx_from_chain(IN lm_device_t *pdev,
3257d14abf15SRobert Mustacchi IN const u32_t chain);
3258d14abf15SRobert Mustacchi
3259d14abf15SRobert Mustacchi /**
3260d14abf15SRobert Mustacchi * This function sets all the status-block ack values back to
3261d14abf15SRobert Mustacchi * zero. Must be called BEFORE initializing the igu + before
3262d14abf15SRobert Mustacchi * initializing status-blocks.
3263d14abf15SRobert Mustacchi *
3264d14abf15SRobert Mustacchi * @param pdev
3265d14abf15SRobert Mustacchi */
3266d14abf15SRobert Mustacchi void lm_reset_sb_ack_values(struct _lm_device_t *pdev);
3267d14abf15SRobert Mustacchi
3268d14abf15SRobert Mustacchi /* Driver calls this function in order to ACK the default/non-default status block index(consumer) toward the chip.
3269d14abf15SRobert Mustacchi * This is needed by the hw in order to decide whether an interrupt should be generated by the IGU.
3270d14abf15SRobert Mustacchi * This is achieved via write into the INT ACK register.
3271d14abf15SRobert Mustacchi * This function is also controls whether to enable/disable the interrupt line
3272d14abf15SRobert Mustacchi *
3273d14abf15SRobert Mustacchi * Parameters:
3274d14abf15SRobert Mustacchi * rss_id - the RSS/CPU number we are running on
3275d14abf15SRobert Mustacchi * pdev - this is the LM device
3276d14abf15SRobert Mustacchi */
3277d14abf15SRobert Mustacchi void lm_int_ack_sb_enable(lm_device_t *pdev, u8_t rss_id);
3278d14abf15SRobert Mustacchi void lm_int_ack_sb_disable(lm_device_t *pdev, u8_t rss_id);
3279d14abf15SRobert Mustacchi void lm_int_ack_def_sb_enable(lm_device_t *pdev);
3280d14abf15SRobert Mustacchi void lm_int_ack_def_sb_disable(lm_device_t *pdev);
3281d14abf15SRobert Mustacchi
3282d14abf15SRobert Mustacchi #define USTORM_INTR_FLAG 1
3283d14abf15SRobert Mustacchi #define CSTORM_INTR_FLAG 2
3284d14abf15SRobert Mustacchi #define SERV_RX_INTR_FLAG 4
3285d14abf15SRobert Mustacchi #define SERV_TX_INTR_FLAG 8
3286d14abf15SRobert Mustacchi
3287d14abf15SRobert Mustacchi #ifndef USER_LINUX
lm_get_sb_number_indexes(lm_device_t * pdev)3288d14abf15SRobert Mustacchi static __inline u16_t lm_get_sb_number_indexes(lm_device_t *pdev)
3289d14abf15SRobert Mustacchi {
3290d14abf15SRobert Mustacchi if (CHIP_IS_E1x(pdev))
3291d14abf15SRobert Mustacchi {
3292d14abf15SRobert Mustacchi return HC_SB_MAX_INDICES_E1X;
3293d14abf15SRobert Mustacchi }
3294d14abf15SRobert Mustacchi else
3295d14abf15SRobert Mustacchi {
3296d14abf15SRobert Mustacchi return HC_SB_MAX_INDICES_E2;
3297d14abf15SRobert Mustacchi }
3298d14abf15SRobert Mustacchi }
3299d14abf15SRobert Mustacchi
lm_get_sb_running_index(lm_device_t * pdev,u8_t sb_id,u8_t sm_idx)3300d14abf15SRobert Mustacchi static __inline u16_t lm_get_sb_running_index(lm_device_t *pdev, u8_t sb_id, u8_t sm_idx)
3301d14abf15SRobert Mustacchi {
3302d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3303d14abf15SRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev)) {
3304d14abf15SRobert Mustacchi return lm_vf_pf_get_sb_running_index(pdev, sb_id, sm_idx);
3305d14abf15SRobert Mustacchi }
3306d14abf15SRobert Mustacchi #endif
3307d14abf15SRobert Mustacchi if (CHIP_IS_E1x(pdev))
3308d14abf15SRobert Mustacchi {
3309d14abf15SRobert Mustacchi return mm_le16_to_cpu(pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e1x_sb->sb.running_index[sm_idx]);
3310d14abf15SRobert Mustacchi }
3311d14abf15SRobert Mustacchi else
3312d14abf15SRobert Mustacchi {
3313d14abf15SRobert Mustacchi return mm_le16_to_cpu(pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e2_sb->sb.running_index[sm_idx]);
3314d14abf15SRobert Mustacchi }
3315d14abf15SRobert Mustacchi }
lm_get_sb_index(lm_device_t * pdev,u8_t sb_id,u8_t idx)3316d14abf15SRobert Mustacchi static __inline u16_t lm_get_sb_index(lm_device_t *pdev, u8_t sb_id, u8_t idx)
3317d14abf15SRobert Mustacchi {
3318d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3319d14abf15SRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev)) {
3320d14abf15SRobert Mustacchi return lm_vf_pf_get_sb_index(pdev, sb_id, idx);
3321d14abf15SRobert Mustacchi }
3322d14abf15SRobert Mustacchi #endif
3323d14abf15SRobert Mustacchi if (CHIP_IS_E1x(pdev))
3324d14abf15SRobert Mustacchi {
3325d14abf15SRobert Mustacchi return mm_le16_to_cpu(pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e1x_sb->sb.index_values[idx]);
3326d14abf15SRobert Mustacchi }
3327d14abf15SRobert Mustacchi else
3328d14abf15SRobert Mustacchi {
3329d14abf15SRobert Mustacchi return mm_le16_to_cpu(pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e2_sb->sb.index_values[idx]);
3330d14abf15SRobert Mustacchi }
3331d14abf15SRobert Mustacchi }
3332d14abf15SRobert Mustacchi
3333d14abf15SRobert Mustacchi
lm_get_sb_running_indexes(lm_device_t * pdev,u8_t sb_idx)3334d14abf15SRobert Mustacchi static __inline u16_t volatile * lm_get_sb_running_indexes(lm_device_t *pdev, u8_t sb_idx)
3335d14abf15SRobert Mustacchi {
3336d14abf15SRobert Mustacchi u16_t volatile * running_indexes_ptr;
3337d14abf15SRobert Mustacchi if (CHIP_IS_E1x(pdev))
3338d14abf15SRobert Mustacchi {
3339d14abf15SRobert Mustacchi running_indexes_ptr = &pdev->vars.status_blocks_arr[sb_idx].host_hc_status_block.e1x_sb->sb.running_index[0];
3340d14abf15SRobert Mustacchi }
3341d14abf15SRobert Mustacchi else
3342d14abf15SRobert Mustacchi {
3343d14abf15SRobert Mustacchi running_indexes_ptr = &pdev->vars.status_blocks_arr[sb_idx].host_hc_status_block.e2_sb->sb.running_index[0];
3344d14abf15SRobert Mustacchi }
3345d14abf15SRobert Mustacchi return running_indexes_ptr;
3346d14abf15SRobert Mustacchi }
lm_get_sb_indexes(lm_device_t * pdev,u8_t sb_idx)3347d14abf15SRobert Mustacchi static __inline u16_t volatile * lm_get_sb_indexes(lm_device_t *pdev, u8_t sb_idx)
3348d14abf15SRobert Mustacchi {
3349d14abf15SRobert Mustacchi u16_t volatile * indexes_ptr;
3350d14abf15SRobert Mustacchi
3351d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3352d14abf15SRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev)) {
3353d14abf15SRobert Mustacchi return pdev->vars.status_blocks_arr[sb_idx].host_hc_status_block.vf_sb;
3354d14abf15SRobert Mustacchi }
3355d14abf15SRobert Mustacchi #endif
3356d14abf15SRobert Mustacchi
3357d14abf15SRobert Mustacchi if (CHIP_IS_E1x(pdev))
3358d14abf15SRobert Mustacchi {
3359d14abf15SRobert Mustacchi indexes_ptr = &pdev->vars.status_blocks_arr[sb_idx].host_hc_status_block.e1x_sb->sb.index_values[0];
3360d14abf15SRobert Mustacchi }
3361d14abf15SRobert Mustacchi else
3362d14abf15SRobert Mustacchi {
3363d14abf15SRobert Mustacchi indexes_ptr = &pdev->vars.status_blocks_arr[sb_idx].host_hc_status_block.e2_sb->sb.index_values[0];
3364d14abf15SRobert Mustacchi }
3365d14abf15SRobert Mustacchi return indexes_ptr;
3366d14abf15SRobert Mustacchi }
3367d14abf15SRobert Mustacchi
3368d14abf15SRobert Mustacchi
lm_map_igu_sb_id_to_drv_rss(lm_device_t * pdev,u8_t igu_sb_id)3369d14abf15SRobert Mustacchi static __inline u8_t lm_map_igu_sb_id_to_drv_rss(lm_device_t *pdev, u8_t igu_sb_id)
3370d14abf15SRobert Mustacchi {
3371d14abf15SRobert Mustacchi u8_t drv_sb_id = igu_sb_id;
3372d14abf15SRobert Mustacchi if (INTR_BLK_TYPE(pdev) == INTR_BLK_IGU)
3373d14abf15SRobert Mustacchi {
3374d14abf15SRobert Mustacchi if (drv_sb_id >= IGU_U_NDSB_OFFSET(pdev))
3375d14abf15SRobert Mustacchi {
3376d14abf15SRobert Mustacchi drv_sb_id -= IGU_U_NDSB_OFFSET(pdev);
3377d14abf15SRobert Mustacchi }
3378d14abf15SRobert Mustacchi }
3379d14abf15SRobert Mustacchi /* FIXME: this doesn't have to be right - drv rss id can differ from sb-id */
3380d14abf15SRobert Mustacchi return drv_sb_id;
3381d14abf15SRobert Mustacchi }
lm_query_storm_intr(lm_device_t * pdev,u8_t igu_sb_id,u8_t * drv_sb_id)3382d14abf15SRobert Mustacchi static __inline u8_t lm_query_storm_intr(lm_device_t *pdev, u8_t igu_sb_id, u8_t * drv_sb_id)
3383d14abf15SRobert Mustacchi {
3384d14abf15SRobert Mustacchi u8_t flags = 0;
3385d14abf15SRobert Mustacchi
3386d14abf15SRobert Mustacchi *drv_sb_id = igu_sb_id;
3387d14abf15SRobert Mustacchi
3388d14abf15SRobert Mustacchi switch(pdev->params.ndsb_type)
3389d14abf15SRobert Mustacchi {
3390d14abf15SRobert Mustacchi case LM_SINGLE_SM:
3391d14abf15SRobert Mustacchi /* One Segment Per u/c */
3392d14abf15SRobert Mustacchi SET_FLAGS(flags, USTORM_INTR_FLAG);
3393d14abf15SRobert Mustacchi break;
3394d14abf15SRobert Mustacchi
3395d14abf15SRobert Mustacchi case LM_DOUBLE_SM_SINGLE_IGU:
3396d14abf15SRobert Mustacchi /* One Segment Per u/c */
3397d14abf15SRobert Mustacchi SET_FLAGS(flags, USTORM_INTR_FLAG);
3398d14abf15SRobert Mustacchi break;
3399d14abf15SRobert Mustacchi
3400d14abf15SRobert Mustacchi default:
3401d14abf15SRobert Mustacchi {
3402d14abf15SRobert Mustacchi if (igu_sb_id >= IGU_U_NDSB_OFFSET(pdev))
3403d14abf15SRobert Mustacchi {
3404d14abf15SRobert Mustacchi *drv_sb_id -= IGU_U_NDSB_OFFSET(pdev);
3405d14abf15SRobert Mustacchi SET_FLAGS(flags, USTORM_INTR_FLAG);
3406d14abf15SRobert Mustacchi }
3407d14abf15SRobert Mustacchi else
3408d14abf15SRobert Mustacchi {
3409d14abf15SRobert Mustacchi SET_FLAGS(flags, CSTORM_INTR_FLAG);
3410d14abf15SRobert Mustacchi }
3411d14abf15SRobert Mustacchi }
3412d14abf15SRobert Mustacchi break;
3413d14abf15SRobert Mustacchi }
3414d14abf15SRobert Mustacchi return flags;
3415d14abf15SRobert Mustacchi }
3416d14abf15SRobert Mustacchi
3417d14abf15SRobert Mustacchi /* Check whether a non-default status block has changed, that is,
3418d14abf15SRobert Mustacchi * the hw has written a new prod_idx for on or more of its storm parts.
3419d14abf15SRobert Mustacchi *
3420d14abf15SRobert Mustacchi * Parameters:
3421d14abf15SRobert Mustacchi * pdev - this is the LM device
3422d14abf15SRobert Mustacchi * sb_idx - this is the index where the status block lies in the array under the lm_device
3423d14abf15SRobert Mustacchi *
3424d14abf15SRobert Mustacchi * Return Value:
3425d14abf15SRobert Mustacchi * result - TRUE in case the specific status block is considered as changed.
3426d14abf15SRobert Mustacchi * FALSE otherwise.
3427d14abf15SRobert Mustacchi *
3428d14abf15SRobert Mustacchi * Nots:
3429d14abf15SRobert Mustacchi * For performance optimization, this function is static inline.
3430d14abf15SRobert Mustacchi */
lm_is_sb_updated(lm_device_t * pdev,u8_t igu_sb_id)3431d14abf15SRobert Mustacchi static __inline u8_t lm_is_sb_updated(lm_device_t *pdev, u8_t igu_sb_id)
3432d14abf15SRobert Mustacchi {
3433d14abf15SRobert Mustacchi u8_t result = FALSE;
3434d14abf15SRobert Mustacchi u16_t hw_sb_idx = 0;
3435d14abf15SRobert Mustacchi u8_t flags = 0;
3436d14abf15SRobert Mustacchi u8_t drv_sb_id = 0;
3437d14abf15SRobert Mustacchi
3438d14abf15SRobert Mustacchi DbgBreakIfFastPath(!pdev);
3439d14abf15SRobert Mustacchi if (!pdev)
3440d14abf15SRobert Mustacchi {
3441d14abf15SRobert Mustacchi return FALSE;
3442d14abf15SRobert Mustacchi }
3443d14abf15SRobert Mustacchi
3444d14abf15SRobert Mustacchi flags = lm_query_storm_intr(pdev, igu_sb_id, &drv_sb_id);
3445d14abf15SRobert Mustacchi
3446d14abf15SRobert Mustacchi if (GET_FLAGS(flags, USTORM_INTR_FLAG))
3447d14abf15SRobert Mustacchi {
3448d14abf15SRobert Mustacchi hw_sb_idx = lm_get_sb_running_index(pdev, drv_sb_id, SM_RX_ID);
3449d14abf15SRobert Mustacchi if (hw_sb_idx != pdev->vars.u_hc_ack[drv_sb_id])
3450d14abf15SRobert Mustacchi {
3451d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "lm_is_sb_updated():u_sb.status_block_index:%d u_hc_ack:%d\n",
3452d14abf15SRobert Mustacchi hw_sb_idx, pdev->vars.u_hc_ack[drv_sb_id]);
3453d14abf15SRobert Mustacchi
3454d14abf15SRobert Mustacchi result = TRUE;
3455d14abf15SRobert Mustacchi }
3456d14abf15SRobert Mustacchi }
3457d14abf15SRobert Mustacchi
3458d14abf15SRobert Mustacchi if (GET_FLAGS(flags, CSTORM_INTR_FLAG))
3459d14abf15SRobert Mustacchi {
3460d14abf15SRobert Mustacchi hw_sb_idx = lm_get_sb_running_index(pdev, drv_sb_id, SM_TX_ID);
3461d14abf15SRobert Mustacchi if (hw_sb_idx != pdev->vars.c_hc_ack[drv_sb_id])
3462d14abf15SRobert Mustacchi {
3463d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "lm_is_sb_updated():c_sb.status_block_index:%d c_hc_ack:%d\n",
3464d14abf15SRobert Mustacchi hw_sb_idx, pdev->vars.u_hc_ack[drv_sb_id]);
3465d14abf15SRobert Mustacchi
3466d14abf15SRobert Mustacchi result = TRUE;
3467d14abf15SRobert Mustacchi }
3468d14abf15SRobert Mustacchi }
3469d14abf15SRobert Mustacchi
3470d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "lm_is_sb_updated(): result:%s\n", result? "TRUE" : "FALSE");
3471d14abf15SRobert Mustacchi
3472d14abf15SRobert Mustacchi return result;
3473d14abf15SRobert Mustacchi }
3474d14abf15SRobert Mustacchi #endif // !USER_LINUX
3475d14abf15SRobert Mustacchi
3476d14abf15SRobert Mustacchi /* Check if the default statu blocks has changed, that is,
3477d14abf15SRobert Mustacchi * the hw has written a new prod_idx for on or more of its storm parts.
3478d14abf15SRobert Mustacchi *
3479d14abf15SRobert Mustacchi * Parameters:
3480d14abf15SRobert Mustacchi * pdev - this is the LM device
3481d14abf15SRobert Mustacchi *
3482d14abf15SRobert Mustacchi * Return Value:
3483d14abf15SRobert Mustacchi * result - TRUE in case the status block is considered as changed.
3484d14abf15SRobert Mustacchi * FALSE otherwise.
3485d14abf15SRobert Mustacchi */
3486d14abf15SRobert Mustacchi u8_t lm_is_def_sb_updated(lm_device_t *pdev);
3487d14abf15SRobert Mustacchi
3488d14abf15SRobert Mustacchi
3489d14abf15SRobert Mustacchi /* Check if the status block has outstanding completed Rx requests
3490d14abf15SRobert Mustacchi *
3491d14abf15SRobert Mustacchi * Parameters:
3492d14abf15SRobert Mustacchi * pdev - this is the LM device
3493d14abf15SRobert Mustacchi * sb_idx - this is the index where the status block lies in the array under the lm_device
3494d14abf15SRobert Mustacchi *
3495d14abf15SRobert Mustacchi * Return Value:
3496d14abf15SRobert Mustacchi * result - TRUE in case the status block has new update regarding Rx completion
3497d14abf15SRobert Mustacchi * FALSE otherwise.
3498d14abf15SRobert Mustacchi */
3499d14abf15SRobert Mustacchi u8_t lm_is_rx_completion(lm_device_t *pdev, u8_t chain_idx);
3500d14abf15SRobert Mustacchi
3501d14abf15SRobert Mustacchi /* Check if the status block has outstanding completed Tx requests
3502d14abf15SRobert Mustacchi *
3503d14abf15SRobert Mustacchi * Parameters:
3504d14abf15SRobert Mustacchi * pdev - this is the LM device
3505d14abf15SRobert Mustacchi * sb_idx - this is the index where the status block lies in the array under the lm_device
3506d14abf15SRobert Mustacchi *
3507d14abf15SRobert Mustacchi * Return Value:
3508d14abf15SRobert Mustacchi * result - TRUE in case the status block has new update regarding Tx completion
3509d14abf15SRobert Mustacchi * FALSE otherwise.
3510d14abf15SRobert Mustacchi */
3511d14abf15SRobert Mustacchi u8_t lm_is_tx_completion(lm_device_t *pdev, u8_t chain_idx);
3512d14abf15SRobert Mustacchi
3513d14abf15SRobert Mustacchi /*
3514d14abf15SRobert Mustacchi * Handle an IGU status-block update.
3515d14abf15SRobert Mustacchi * Parameters:
3516d14abf15SRobert Mustacchi * pdev - the LM device
3517d14abf15SRobert Mustacchi * igu_sb_id - the igu sb id that got the interrupt / MSI-X message
3518d14abf15SRobert Mustacchi * rx_rss_id / tx_rss_id - matching driver chains
3519d14abf15SRobert Mustacchi * flags: service_rx / service_tx to know which activity occured
3520d14abf15SRobert Mustacchi */
3521d14abf15SRobert Mustacchi u8_t lm_handle_igu_sb_id(lm_device_t *pdev, u8_t igu_sb_id, OUT u8_t *rx_rss_id, OUT u8_t *tx_rss_id);
3522d14abf15SRobert Mustacchi
3523d14abf15SRobert Mustacchi lm_status_t lm_update_eth_client(IN struct _lm_device_t *pdev,
3524d14abf15SRobert Mustacchi IN const u8_t cid,
3525d14abf15SRobert Mustacchi IN const u16_t silent_vlan_value,
3526d14abf15SRobert Mustacchi IN const u16_t silent_vlan_mask,
3527d14abf15SRobert Mustacchi IN const u8_t silent_vlan_removal_flg,
3528d14abf15SRobert Mustacchi IN const u8_t silent_vlan_change_flg
3529d14abf15SRobert Mustacchi );
3530d14abf15SRobert Mustacchi lm_status_t lm_establish_eth_con(struct _lm_device_t *pdev, u8_t const cid, u8_t sb_id, u8_t attributes_bitmap);
3531d14abf15SRobert Mustacchi lm_status_t lm_establish_forward_con(struct _lm_device_t *pdev);
3532d14abf15SRobert Mustacchi lm_status_t lm_close_forward_con(struct _lm_device_t *pdev);
3533d14abf15SRobert Mustacchi lm_status_t lm_close_eth_con(struct _lm_device_t *pdev, u32_t const cid,
3534d14abf15SRobert Mustacchi const u8_t send_halt_ramrod);
3535d14abf15SRobert Mustacchi lm_status_t lm_terminate_eth_con(struct _lm_device_t *pdev, u32_t const cid);
3536d14abf15SRobert Mustacchi lm_status_t lm_chip_stop(struct _lm_device_t *pdev);
3537d14abf15SRobert Mustacchi
3538d14abf15SRobert Mustacchi int lm_set_init_arrs(lm_device_t *pdev);
3539d14abf15SRobert Mustacchi
3540d14abf15SRobert Mustacchi lm_status_t
3541d14abf15SRobert Mustacchi lm_empty_ramrod_eth(IN struct _lm_device_t *pdev,
3542d14abf15SRobert Mustacchi IN const u32_t cid,
3543d14abf15SRobert Mustacchi IN u32_t data_cid,
3544d14abf15SRobert Mustacchi IN volatile u32_t *curr_state,
3545d14abf15SRobert Mustacchi IN u32_t new_state);
3546d14abf15SRobert Mustacchi /*
3547d14abf15SRobert Mustacchi * save client connection parameters for a given L2 client
3548d14abf15SRobert Mustacchi */
3549d14abf15SRobert Mustacchi lm_status_t
3550d14abf15SRobert Mustacchi lm_setup_client_con_params( IN struct _lm_device_t *pdev,
3551d14abf15SRobert Mustacchi IN u8_t const chain_idx,
3552d14abf15SRobert Mustacchi IN struct _lm_client_con_params_t *cli_params );
3553d14abf15SRobert Mustacchi
3554d14abf15SRobert Mustacchi lm_status_t
3555d14abf15SRobert Mustacchi lm_eq_ramrod_post_sync( IN struct _lm_device_t *pdev,
3556d14abf15SRobert Mustacchi IN u8_t cmd_id,
3557d14abf15SRobert Mustacchi IN u64_t data,
3558d14abf15SRobert Mustacchi IN u8_t ramrod_priority,
3559d14abf15SRobert Mustacchi IN volatile u32_t *p_curr_state,
3560d14abf15SRobert Mustacchi IN u32_t curr_state,
3561d14abf15SRobert Mustacchi IN u32_t new_state);
3562d14abf15SRobert Mustacchi
3563d14abf15SRobert Mustacchi //L2 Client conn, used for iscsi/rdma
3564d14abf15SRobert Mustacchi /*
3565d14abf15SRobert Mustacchi * allocate and setup txq, rxq, rcq and set tstrom ram values for L2 client connection of a given client index
3566d14abf15SRobert Mustacchi */
3567d14abf15SRobert Mustacchi lm_status_t
3568d14abf15SRobert Mustacchi lm_init_chain_con( IN struct _lm_device_t *pdev,
3569d14abf15SRobert Mustacchi IN u8_t const chain_idx,
3570d14abf15SRobert Mustacchi IN u8_t const b_alloc );
3571d14abf15SRobert Mustacchi
3572d14abf15SRobert Mustacchi /*
3573d14abf15SRobert Mustacchi * reset txq, rxq, rcq counters for L2 client connection
3574d14abf15SRobert Mustacchi */
3575d14abf15SRobert Mustacchi lm_status_t
3576d14abf15SRobert Mustacchi lm_clear_eth_con_resc(
3577d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev,
3578d14abf15SRobert Mustacchi IN u8_t const cid
3579d14abf15SRobert Mustacchi );
3580d14abf15SRobert Mustacchi
3581d14abf15SRobert Mustacchi /*
3582d14abf15SRobert Mustacchi * clear the status block consumer index in the internal ram for a given status block index
3583d14abf15SRobert Mustacchi */
3584d14abf15SRobert Mustacchi lm_status_t
3585d14abf15SRobert Mustacchi lm_clear_chain_sb_cons_idx(
3586d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev,
3587d14abf15SRobert Mustacchi IN u8_t sb_idx,
3588d14abf15SRobert Mustacchi IN struct _lm_hc_sb_info_t *hc_sb_info,
3589d14abf15SRobert Mustacchi IN volatile u16_t ** hw_con_idx_ptr
3590d14abf15SRobert Mustacchi );
3591d14abf15SRobert Mustacchi
3592d14abf15SRobert Mustacchi
3593d14abf15SRobert Mustacchi u8_t lm_is_eq_completion(lm_device_t *pdev);
3594d14abf15SRobert Mustacchi
3595d14abf15SRobert Mustacchi /* Does relevant processing in case of attn signals assertion.
3596d14abf15SRobert Mustacchi * 1)Write '1' into attn_ack to chip(IGU) (do this in parallel for _all_ bits including the fixed 8 hard-wired via the
3597d14abf15SRobert Mustacchi * set_ack_bit_register
3598d14abf15SRobert Mustacchi * 2)MASK AEU lines via the mask_attn_func_x register (also in parallel) via GRC - for AEU lower lines 0-7 only!
3599d14abf15SRobert Mustacchi * 3)Only for the 8 upper fixed hard-wired AEU lines: do their relevant processing, if any.
3600d14abf15SRobert Mustacchi Finally, drv needs to "clean the attn in the hw block"(e.g. INT_STS_CLR) for them.
3601d14abf15SRobert Mustacchi *
3602d14abf15SRobert Mustacchi * Parameters:
3603d14abf15SRobert Mustacchi * pdev - this is the LM device
3604d14abf15SRobert Mustacchi * assertion_proc_flgs - attn lines which got asserted
3605d14abf15SRobert Mustacchi */
3606d14abf15SRobert Mustacchi void lm_handle_assertion_processing(lm_device_t *pdev, u16_t assertion_proc_flgs);
3607d14abf15SRobert Mustacchi
3608d14abf15SRobert Mustacchi /* Does relevant processing in case of attn signals deassertion.
3609d14abf15SRobert Mustacchi * 1) Grab split access lock register of MCP (instead of SW arbiter)
3610d14abf15SRobert Mustacchi * 2) Read 128bit after inverter via the 4*32regs via GRC.
3611d14abf15SRobert Mustacchi * 3) For each dynamic group (8 lower bits only!), read the masks which were set aside to find for each group which attn bit is a member and
3612d14abf15SRobert Mustacchi * needs to be handled. pass all over atten bits belonged to this group and treat them accordingly.
3613d14abf15SRobert Mustacchi * After an attn signal was handled, drv needs to "clean the attn in the hw block"(e.g. INT_STS_CLR) for that attn bit.
3614d14abf15SRobert Mustacchi * 4) Release split access lock register of MCP
3615d14abf15SRobert Mustacchi * 5) Write '0' into attn_ack to chip(IGU) (do this in parallel for _all_ bits, including the fixed 8 hard-wired, via the set_ack_bit_register)
3616d14abf15SRobert Mustacchi * 6) UNMASK AEU lines via the mask_attn_func_x register (also in parallel) via GRC - for AEU lower lines 0-7 only!
3617d14abf15SRobert Mustacchi *
3618d14abf15SRobert Mustacchi * Parameters:
3619d14abf15SRobert Mustacchi * pdev - this is the LM device
3620d14abf15SRobert Mustacchi * deassertion_proc_flgs - attn lines which got deasserted
3621d14abf15SRobert Mustacchi */
3622d14abf15SRobert Mustacchi void lm_handle_deassertion_processing(lm_device_t *pdev, u16_t deassertion_proc_flgs);
3623d14abf15SRobert Mustacchi
3624d14abf15SRobert Mustacchi /* Returns the attn_bits and attn_ack fields from the default status block
3625d14abf15SRobert Mustacchi *
3626d14abf15SRobert Mustacchi * Parameters:
3627d14abf15SRobert Mustacchi * pdev - this is the LM device
3628d14abf15SRobert Mustacchi * attn_bits - OUT param which receives the attn_bits from the atten part of the def sb
3629d14abf15SRobert Mustacchi * attn_ack - OUT param which receives the attn_ack from the atten part of the def sb
3630d14abf15SRobert Mustacchi */
3631d14abf15SRobert Mustacchi void lm_get_attn_info(lm_device_t *pdev, u16_t *attn_bits, u16_t *attn_ack);
3632d14abf15SRobert Mustacchi
3633d14abf15SRobert Mustacchi /**Genrate a general attention on all functions but this one,
3634d14abf15SRobert Mustacchi * which causes them to update their link status and CMNG state
3635d14abf15SRobert Mustacchi * from SHMEM.
3636d14abf15SRobert Mustacchi *
3637d14abf15SRobert Mustacchi * @param pdev the LM device
3638d14abf15SRobert Mustacchi */
3639d14abf15SRobert Mustacchi void sync_link_status(lm_device_t *pdev);
3640d14abf15SRobert Mustacchi /**
3641d14abf15SRobert Mustacchi * @description
3642d14abf15SRobert Mustacchi * Calculates BW according to current linespeed and MF
3643d14abf15SRobert Mustacchi * configuration of the function in Mbps.
3644d14abf15SRobert Mustacchi * @param pdev
3645d14abf15SRobert Mustacchi * @param link_speed - Port rate in Mbps.
3646d14abf15SRobert Mustacchi * @param vnic
3647d14abf15SRobert Mustacchi *
3648d14abf15SRobert Mustacchi * @return u16
3649d14abf15SRobert Mustacchi * Return the max BW of the function in Mbps.
3650d14abf15SRobert Mustacchi */
3651d14abf15SRobert Mustacchi u16_t
3652d14abf15SRobert Mustacchi lm_get_max_bw(IN const lm_device_t *pdev,
3653d14abf15SRobert Mustacchi IN const u32_t link_speed,
3654d14abf15SRobert Mustacchi IN const u8_t vnic);
3655d14abf15SRobert Mustacchi
3656d14abf15SRobert Mustacchi /**Update CMNG and link info from SHMEM and configure the
3657d14abf15SRobert Mustacchi * firmware to the right CMNG values if this device is the PMF.
3658d14abf15SRobert Mustacchi *
3659d14abf15SRobert Mustacchi * @note This function must be called under PHY_LOCK
3660d14abf15SRobert Mustacchi *
3661d14abf15SRobert Mustacchi * @param pdev the LM device
3662d14abf15SRobert Mustacchi */
3663d14abf15SRobert Mustacchi void lm_reload_link_and_cmng(lm_device_t *pdev);
3664d14abf15SRobert Mustacchi
3665d14abf15SRobert Mustacchi /* Returns the number of toggled bits in a 32 bit integer
3666d14abf15SRobert Mustacchi * n - integer to count its '1' bits
3667d14abf15SRobert Mustacchi */
3668d14abf15SRobert Mustacchi u32_t count_bits(u32_t n);
3669d14abf15SRobert Mustacchi
3670d14abf15SRobert Mustacchi u32_t LOG2(u32_t v);
3671d14abf15SRobert Mustacchi
3672d14abf15SRobert Mustacchi /**
3673d14abf15SRobert Mustacchi * General function that waits for a certain state to change,
3674d14abf15SRobert Mustacchi * not protocol specific. It takes into account vbd-commander
3675d14abf15SRobert Mustacchi * and reset-is-in-progress
3676d14abf15SRobert Mustacchi *
3677d14abf15SRobert Mustacchi * @param pdev
3678d14abf15SRobert Mustacchi * @param curr_state -> what to poll on
3679d14abf15SRobert Mustacchi * @param new_state -> what we're waiting for
3680d14abf15SRobert Mustacchi *
3681d14abf15SRobert Mustacchi * @return lm_status_t TIMEOUT if state didn't change, SUCCESS
3682d14abf15SRobert Mustacchi * otherwise
3683d14abf15SRobert Mustacchi */
3684d14abf15SRobert Mustacchi lm_status_t lm_wait_state_change(struct _lm_device_t *pdev, volatile u32_t * curr_state, u32_t new_state);
3685d14abf15SRobert Mustacchi
3686d14abf15SRobert Mustacchi /* copy the new values of the status block prod_index for each strom into the local copy we hold in the lm_device
3687d14abf15SRobert Mustacchi *
3688d14abf15SRobert Mustacchi * Parameters:
3689d14abf15SRobert Mustacchi * pdev - this is the LM device
3690d14abf15SRobert Mustacchi * sb_idx - this is the index where the status block lies in the array under the lm_device
3691d14abf15SRobert Mustacchi */
3692d14abf15SRobert Mustacchi void lm_update_fp_hc_indices(lm_device_t *pdev, u8_t igu_sb_id, u32_t *activity_flg, u8_t *drv_rss_id);
3693d14abf15SRobert Mustacchi void lm_update_def_hc_indices(lm_device_t *pdev, u8_t sb_id, u32_t *activity_flg);
3694d14abf15SRobert Mustacchi
3695d14abf15SRobert Mustacchi void lm_57710A0_dbg_intr( struct _lm_device_t * pdev );
3696d14abf15SRobert Mustacchi
3697d14abf15SRobert Mustacchi /* mdio access functions*/
3698d14abf15SRobert Mustacchi lm_status_t
3699d14abf15SRobert Mustacchi lm_mwrite(
3700d14abf15SRobert Mustacchi lm_device_t *pdev,
3701d14abf15SRobert Mustacchi u32_t reg,
3702d14abf15SRobert Mustacchi u32_t val);
3703d14abf15SRobert Mustacchi
3704d14abf15SRobert Mustacchi lm_status_t
3705d14abf15SRobert Mustacchi lm_mread(
3706d14abf15SRobert Mustacchi lm_device_t *pdev,
3707d14abf15SRobert Mustacchi u32_t reg,
3708d14abf15SRobert Mustacchi u32_t *ret_val);
3709d14abf15SRobert Mustacchi
3710d14abf15SRobert Mustacchi lm_status_t
3711d14abf15SRobert Mustacchi lm_m45write(
3712d14abf15SRobert Mustacchi lm_device_t *pdev,
3713d14abf15SRobert Mustacchi u32_t reg,
3714d14abf15SRobert Mustacchi u32_t addr,
3715d14abf15SRobert Mustacchi u32_t val);
3716d14abf15SRobert Mustacchi
3717d14abf15SRobert Mustacchi lm_status_t
3718d14abf15SRobert Mustacchi lm_m45read(
3719d14abf15SRobert Mustacchi lm_device_t *pdev,
3720d14abf15SRobert Mustacchi u32_t reg,
3721d14abf15SRobert Mustacchi u32_t addr,
3722d14abf15SRobert Mustacchi u32_t *ret_val);
3723d14abf15SRobert Mustacchi
3724d14abf15SRobert Mustacchi lm_status_t
3725d14abf15SRobert Mustacchi lm_phy45_read(
3726d14abf15SRobert Mustacchi lm_device_t *pdev,
3727d14abf15SRobert Mustacchi u8_t phy_addr,
3728d14abf15SRobert Mustacchi u8_t dev_addr,
3729d14abf15SRobert Mustacchi u16_t reg, // offset
3730d14abf15SRobert Mustacchi u16_t *ret_val);
3731d14abf15SRobert Mustacchi
3732d14abf15SRobert Mustacchi lm_status_t
3733d14abf15SRobert Mustacchi lm_phy45_write(
3734d14abf15SRobert Mustacchi lm_device_t *pdev,
3735d14abf15SRobert Mustacchi u8_t phy_addr,
3736d14abf15SRobert Mustacchi u8_t dev_addr,
3737d14abf15SRobert Mustacchi u16_t reg, // offset
3738d14abf15SRobert Mustacchi u16_t val);
3739d14abf15SRobert Mustacchi
3740d14abf15SRobert Mustacchi lm_status_t
3741d14abf15SRobert Mustacchi lm_set_phy_addr(
3742d14abf15SRobert Mustacchi lm_device_t *pdev,
3743d14abf15SRobert Mustacchi u8_t addr);
3744d14abf15SRobert Mustacchi
3745d14abf15SRobert Mustacchi void
3746d14abf15SRobert Mustacchi lm_reset_link(lm_device_t *pdev);
3747d14abf15SRobert Mustacchi
3748d14abf15SRobert Mustacchi u32_t
3749d14abf15SRobert Mustacchi lm_nvram_query(
3750d14abf15SRobert Mustacchi lm_device_t *pdev,
3751d14abf15SRobert Mustacchi u8_t reset_flash_block,
3752d14abf15SRobert Mustacchi u8_t no_hw_mod);
3753d14abf15SRobert Mustacchi
3754d14abf15SRobert Mustacchi void
3755d14abf15SRobert Mustacchi lm_nvram_init(
3756d14abf15SRobert Mustacchi lm_device_t *pdev,
3757d14abf15SRobert Mustacchi u8_t reset_flash_block);
3758d14abf15SRobert Mustacchi
3759d14abf15SRobert Mustacchi lm_status_t
3760d14abf15SRobert Mustacchi lm_nvram_read(
3761d14abf15SRobert Mustacchi lm_device_t *pdev,
3762d14abf15SRobert Mustacchi u32_t offset,
3763d14abf15SRobert Mustacchi u32_t *ret_buf,
3764d14abf15SRobert Mustacchi u32_t buf_size); /* Must be a multiple of 4. */
3765d14abf15SRobert Mustacchi
3766d14abf15SRobert Mustacchi lm_status_t
3767d14abf15SRobert Mustacchi lm_nvram_write(
3768d14abf15SRobert Mustacchi lm_device_t *pdev,
3769d14abf15SRobert Mustacchi u32_t offset,
3770d14abf15SRobert Mustacchi u32_t *data_buf,
3771d14abf15SRobert Mustacchi u32_t buf_size); /* Must be a multiple of 4. */
3772d14abf15SRobert Mustacchi
3773d14abf15SRobert Mustacchi void
3774d14abf15SRobert Mustacchi lm_reg_rd_ind(
3775d14abf15SRobert Mustacchi lm_device_t *pdev,
3776d14abf15SRobert Mustacchi u32_t offset,
3777d14abf15SRobert Mustacchi u32_t *ret);
3778d14abf15SRobert Mustacchi
3779d14abf15SRobert Mustacchi void
3780d14abf15SRobert Mustacchi lm_reg_wr_ind(
3781d14abf15SRobert Mustacchi lm_device_t *pdev,
3782d14abf15SRobert Mustacchi u32_t offset,
3783d14abf15SRobert Mustacchi u32_t val);
3784d14abf15SRobert Mustacchi
3785d14abf15SRobert Mustacchi void
3786d14abf15SRobert Mustacchi lm_reg_rd_ind_imp(
3787d14abf15SRobert Mustacchi lm_device_t *pdev,
3788d14abf15SRobert Mustacchi u32_t offset,
3789d14abf15SRobert Mustacchi u32_t *ret);
3790d14abf15SRobert Mustacchi
3791d14abf15SRobert Mustacchi void
3792d14abf15SRobert Mustacchi lm_reg_wr_ind_imp(
3793d14abf15SRobert Mustacchi lm_device_t *pdev,
3794d14abf15SRobert Mustacchi u32_t offset,
3795d14abf15SRobert Mustacchi u32_t val);
3796d14abf15SRobert Mustacchi
3797d14abf15SRobert Mustacchi lm_status_t
3798d14abf15SRobert Mustacchi lm_init_mac_link(
3799d14abf15SRobert Mustacchi lm_device_t *pdev);
3800d14abf15SRobert Mustacchi
3801d14abf15SRobert Mustacchi //TODO check if we need that when MCP ready
3802d14abf15SRobert Mustacchi u8_t
3803d14abf15SRobert Mustacchi fw_reset_sync(
3804d14abf15SRobert Mustacchi lm_device_t *pdev,
3805d14abf15SRobert Mustacchi lm_reason_t reason,
3806d14abf15SRobert Mustacchi u32_t msg_data,
3807d14abf15SRobert Mustacchi u32_t fw_ack_timeout_us); /* timeout in microseconds. */
3808d14abf15SRobert Mustacchi
3809d14abf15SRobert Mustacchi // mcp interface
3810d14abf15SRobert Mustacchi lm_status_t
3811d14abf15SRobert Mustacchi lm_mcp_submit_cmd(
3812d14abf15SRobert Mustacchi lm_device_t *pdev,
3813d14abf15SRobert Mustacchi u32_t drv_msg);
3814d14abf15SRobert Mustacchi
3815d14abf15SRobert Mustacchi lm_status_t
3816d14abf15SRobert Mustacchi lm_mcp_get_resp(
3817d14abf15SRobert Mustacchi lm_device_t *pdev);
3818d14abf15SRobert Mustacchi
3819d14abf15SRobert Mustacchi
3820d14abf15SRobert Mustacchi lm_coalesce_buffer_t *
3821d14abf15SRobert Mustacchi lm_get_coalesce_buffer(
3822d14abf15SRobert Mustacchi IN lm_device_t *pdev,
3823d14abf15SRobert Mustacchi IN lm_tx_chain_t *txq,
3824d14abf15SRobert Mustacchi IN u32_t buf_size);
3825d14abf15SRobert Mustacchi
3826d14abf15SRobert Mustacchi
3827d14abf15SRobert Mustacchi void
3828d14abf15SRobert Mustacchi lm_put_coalesce_buffer(
3829d14abf15SRobert Mustacchi IN lm_device_t *pdev,
3830d14abf15SRobert Mustacchi IN lm_tx_chain_t *txq,
3831d14abf15SRobert Mustacchi IN lm_coalesce_buffer_t *coalesce_buf);
3832d14abf15SRobert Mustacchi
3833d14abf15SRobert Mustacchi void lm_reset_device_if_undi_active(
3834d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev);
3835d14abf15SRobert Mustacchi
3836d14abf15SRobert Mustacchi void
3837d14abf15SRobert Mustacchi lm_cmng_init(
3838d14abf15SRobert Mustacchi struct _lm_device_t *pdev,
3839d14abf15SRobert Mustacchi u32_t port_rate);
3840d14abf15SRobert Mustacchi
3841d14abf15SRobert Mustacchi lm_status_t lm_get_pcicfg_mps_mrrs(lm_device_t * pdev);
3842d14abf15SRobert Mustacchi
3843d14abf15SRobert Mustacchi void lm_set_pcie_nfe_report( lm_device_t *pdev);
3844d14abf15SRobert Mustacchi
3845d14abf15SRobert Mustacchi
3846d14abf15SRobert Mustacchi void lm_clear_non_def_status_block(struct _lm_device_t *pdev,
3847d14abf15SRobert Mustacchi u8_t sb_id);
3848d14abf15SRobert Mustacchi
3849d14abf15SRobert Mustacchi void lm_init_non_def_status_block(struct _lm_device_t *pdev,
3850d14abf15SRobert Mustacchi u8_t sb_id,
3851d14abf15SRobert Mustacchi u8_t port);
3852d14abf15SRobert Mustacchi
3853d14abf15SRobert Mustacchi void lm_eth_init_command_comp(struct _lm_device_t *pdev, struct common_ramrod_eth_rx_cqe *cqe);
3854d14abf15SRobert Mustacchi
3855d14abf15SRobert Mustacchi u8_t lm_is_nig_reset_called(struct _lm_device_t *pdev);
3856d14abf15SRobert Mustacchi void lm_clear_nig_reset_called(struct _lm_device_t *pdev);
3857d14abf15SRobert Mustacchi
3858d14abf15SRobert Mustacchi void lm_setup_fan_failure_detection(struct _lm_device_t *pdev);
3859d14abf15SRobert Mustacchi void enable_blocks_attention(struct _lm_device_t *pdev);
3860d14abf15SRobert Mustacchi u32_t lm_inc_cnt_grc_timeout_ignore(struct _lm_device_t *pdev, u32_t val);
3861d14abf15SRobert Mustacchi
3862d14abf15SRobert Mustacchi //acquire split MCP access lock register
3863d14abf15SRobert Mustacchi lm_status_t acquire_split_alr(lm_device_t *pdev);
3864d14abf15SRobert Mustacchi //Release split MCP access lock register
3865d14abf15SRobert Mustacchi void release_split_alr(lm_device_t *pdev);
3866d14abf15SRobert Mustacchi
3867d14abf15SRobert Mustacchi /*******************************************************************************
3868d14abf15SRobert Mustacchi * Description:
3869d14abf15SRobert Mustacchi *
3870d14abf15SRobert Mustacchi * Return:
3871d14abf15SRobert Mustacchi ******************************************************************************/
3872d14abf15SRobert Mustacchi
3873d14abf15SRobert Mustacchi #ifdef __BIG_ENDIAN
3874d14abf15SRobert Mustacchi #define CHANGE_ENDIANITY TRUE
3875d14abf15SRobert Mustacchi #else
3876d14abf15SRobert Mustacchi #define CHANGE_ENDIANITY FALSE
3877d14abf15SRobert Mustacchi #endif
3878d14abf15SRobert Mustacchi
3879d14abf15SRobert Mustacchi // do not call this macro directly from the code!
3880d14abf15SRobert Mustacchi #define REG_WR_DMAE_LEN_IMP(_pdev,_reg_offset, _addr_src, _b_src_is_zeroed, _len, le32_swap) lm_dmae_reg_wr(_pdev, \
3881d14abf15SRobert Mustacchi lm_dmae_get(_pdev, LM_DMAE_DEFAULT)->context, \
3882d14abf15SRobert Mustacchi (void*)_addr_src, \
3883d14abf15SRobert Mustacchi _reg_offset,\
3884d14abf15SRobert Mustacchi (u16_t)_len,\
3885d14abf15SRobert Mustacchi _b_src_is_zeroed,\
3886d14abf15SRobert Mustacchi le32_swap)
3887d14abf15SRobert Mustacchi
3888d14abf15SRobert Mustacchi // do not call this macro directly from the code!
3889d14abf15SRobert Mustacchi #define REG_RD_DMAE_LEN_IMP(_pdev,_reg_offset, _addr_dst, _len) lm_dmae_reg_rd( _pdev, \
3890d14abf15SRobert Mustacchi lm_dmae_get(_pdev, LM_DMAE_DEFAULT)->context, \
3891d14abf15SRobert Mustacchi _reg_offset, \
3892d14abf15SRobert Mustacchi _addr_dst,\
3893d14abf15SRobert Mustacchi _len,\
3894d14abf15SRobert Mustacchi FALSE)
3895d14abf15SRobert Mustacchi
3896d14abf15SRobert Mustacchi // Macro for writing a buffer to destination address using DMAE when data given is in VIRTUAL ADDRESS,
3897d14abf15SRobert Mustacchi #define VIRT_WR_DMAE_LEN(_pdev, _src_addr, _dst_addr, _len, le32_swap) REG_WR_DMAE_LEN_IMP(_pdev, _dst_addr, _src_addr, FALSE, _len, le32_swap)
3898d14abf15SRobert Mustacchi
3899d14abf15SRobert Mustacchi // Macro for writing a buffer to destination address using DMAE when data given is in PHYSICAL ADDRESS,
3900d14abf15SRobert Mustacchi #define PHYS_WR_DMAE_LEN(_pdev, _src_addr, _dst_addr, _len) lm_dmae_reg_wr_phys( _pdev, \
3901d14abf15SRobert Mustacchi lm_dmae_get(_pdev, LM_DMAE_DEFAULT)->context, \
3902d14abf15SRobert Mustacchi _src_addr, \
3903d14abf15SRobert Mustacchi _dst_addr,\
3904d14abf15SRobert Mustacchi (u16_t)_len)
3905d14abf15SRobert Mustacchi
3906d14abf15SRobert Mustacchi // Macro for copying physical buffer using DMAE,
3907d14abf15SRobert Mustacchi #define PHYS_COPY_DMAE_LEN(_pdev, _src_addr, _dst_addr, _len) lm_dmae_copy_phys_buffer_unsafe( _pdev,\
3908d14abf15SRobert Mustacchi lm_dmae_get(_pdev, LM_DMAE_TOE)->context,\
3909d14abf15SRobert Mustacchi _src_addr,\
3910d14abf15SRobert Mustacchi _dst_addr,\
3911d14abf15SRobert Mustacchi (u16_t)_len)
3912d14abf15SRobert Mustacchi // write a buffer to destination address using DMAE
3913d14abf15SRobert Mustacchi #define REG_WR_DMAE_LEN(_pdev,_reg_offset, _addr_src, _len) REG_WR_DMAE_LEN_IMP(_pdev, _reg_offset, _addr_src, FALSE, _len, FALSE)
3914d14abf15SRobert Mustacchi
3915d14abf15SRobert Mustacchi // read from a buffer to destination address using DMAE
3916d14abf15SRobert Mustacchi #define REG_RD_DMAE_LEN(_pdev,_reg_offset, _addr_dst, _len) REG_RD_DMAE_LEN_IMP(_pdev,_reg_offset, _addr_dst, _len)
3917d14abf15SRobert Mustacchi
3918d14abf15SRobert Mustacchi // write a zeroed buffer to destination address using DMAE
3919d14abf15SRobert Mustacchi #define REG_WR_DMAE_LEN_ZERO(_pdev,_reg_offset, _len) REG_WR_DMAE_LEN_IMP(_pdev,_reg_offset, pdev->vars.zero_buffer, TRUE, _len, FALSE)
3920d14abf15SRobert Mustacchi
3921d14abf15SRobert Mustacchi // Write to regiters, value of length 64 bit
3922d14abf15SRobert Mustacchi #define REG_WR_DMAE(_pdev,_reg_offset, _addr_src ) REG_WR_DMAE_LEN(_pdev,_reg_offset, _addr_src, 2)
3923d14abf15SRobert Mustacchi
3924d14abf15SRobert Mustacchi // Read from regiters, value of length 64 bit
3925d14abf15SRobert Mustacchi #define REG_RD_DMAE(_pdev,_reg_offset, _addr_dst ) REG_RD_DMAE_LEN(_pdev,_reg_offset, _addr_dst, 2)
3926d14abf15SRobert Mustacchi
3927d14abf15SRobert Mustacchi
3928d14abf15SRobert Mustacchi
3929d14abf15SRobert Mustacchi
3930d14abf15SRobert Mustacchi /* Indirect register access. */
3931d14abf15SRobert Mustacchi #define REG_RD_IND(_pdev, _reg_offset, _ret) lm_reg_rd_ind(_pdev, (_reg_offset), _ret)
3932d14abf15SRobert Mustacchi #define REG_WR_IND(_pdev, _reg_offset, _val) lm_reg_wr_ind(_pdev, (_reg_offset), _val)
3933d14abf15SRobert Mustacchi
3934d14abf15SRobert Mustacchi #ifndef __LINUX
3935d14abf15SRobert Mustacchi /* BAR write32 via register address */
3936d14abf15SRobert Mustacchi #define LM_BAR_WR32_ADDRESS(_pdev, _address, _val) \
3937d14abf15SRobert Mustacchi *((u32_t volatile *) (_address))=(_val); \
3938d14abf15SRobert Mustacchi mm_write_barrier()
3939d14abf15SRobert Mustacchi #else
3940d14abf15SRobert Mustacchi /* BAR write32 via register address */
3941d14abf15SRobert Mustacchi #define LM_BAR_WR32_ADDRESS(_pdev, _address, _val) \
3942d14abf15SRobert Mustacchi mm_io_write_dword(_pdev, _address, _val)
3943d14abf15SRobert Mustacchi #endif
3944d14abf15SRobert Mustacchi
3945d14abf15SRobert Mustacchi
3946d14abf15SRobert Mustacchi #if !(defined(UEFI) || defined(__SunOS) || defined(__LINUX)) || defined(__SunOS_MDB)
3947d14abf15SRobert Mustacchi
3948d14abf15SRobert Mustacchi #ifdef _VBD_CMD_
3949d14abf15SRobert Mustacchi void vbd_cmd_on_bar_access(lm_device_t* pdev, u8_t bar, u32_t offset);
3950d14abf15SRobert Mustacchi #define VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset) vbd_cmd_on_bar_access(_pdev, _bar, _offset);
3951d14abf15SRobert Mustacchi #else
3952d14abf15SRobert Mustacchi #define VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)
3953d14abf15SRobert Mustacchi #endif
3954d14abf15SRobert Mustacchi
3955d14abf15SRobert Mustacchi
3956d14abf15SRobert Mustacchi /* BAR read8 via register offset and specific bar */
3957d14abf15SRobert Mustacchi #define LM_BAR_RD8_OFFSET(_pdev, _bar, _offset, _ret) \
3958d14abf15SRobert Mustacchi do { \
3959d14abf15SRobert Mustacchi mm_read_barrier(); \
3960d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
3961d14abf15SRobert Mustacchi *(_ret) = *((u8_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)] + (_offset))); \
3962d14abf15SRobert Mustacchi } while (0)
3963d14abf15SRobert Mustacchi /* BAR read16 via register offset and specific bar */
3964d14abf15SRobert Mustacchi #define LM_BAR_RD16_OFFSET(_pdev, _bar, _offset, _ret) \
3965d14abf15SRobert Mustacchi do { \
3966d14abf15SRobert Mustacchi mm_read_barrier(); \
3967d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
3968d14abf15SRobert Mustacchi *(_ret) = *((u16_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset))); \
3969d14abf15SRobert Mustacchi } while (0)
3970d14abf15SRobert Mustacchi
3971d14abf15SRobert Mustacchi /* BAR read32 via register offset and specific bar */
3972d14abf15SRobert Mustacchi #define LM_BAR_RD32_OFFSET(_pdev, _bar, _offset, _ret) \
3973d14abf15SRobert Mustacchi do { \
3974d14abf15SRobert Mustacchi mm_read_barrier(); \
3975d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
3976d14abf15SRobert Mustacchi *(_ret) = *((u32_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset))); \
3977d14abf15SRobert Mustacchi } while (0)
3978d14abf15SRobert Mustacchi
3979d14abf15SRobert Mustacchi /* BAR read64 via register offset and specific bar */
3980d14abf15SRobert Mustacchi #define LM_BAR_RD64_OFFSET(_pdev, _bar, _offset, _ret) \
3981d14abf15SRobert Mustacchi do { \
3982d14abf15SRobert Mustacchi mm_read_barrier(); \
3983d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
3984d14abf15SRobert Mustacchi *(_ret) = *((u64_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset))); \
3985d14abf15SRobert Mustacchi } while (0)
3986d14abf15SRobert Mustacchi
3987d14abf15SRobert Mustacchi /* BAR write8 via register offset and specific bar */
3988d14abf15SRobert Mustacchi #define LM_BAR_WR8_OFFSET(_pdev, _bar, _offset, _val) \
3989d14abf15SRobert Mustacchi do { \
3990d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
3991d14abf15SRobert Mustacchi *((u8_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset)))=(_val); \
3992d14abf15SRobert Mustacchi mm_write_barrier(); \
3993d14abf15SRobert Mustacchi } while (0)
3994d14abf15SRobert Mustacchi
3995d14abf15SRobert Mustacchi /* BAR write16 via register offset and specific bar */
3996d14abf15SRobert Mustacchi #define LM_BAR_WR16_OFFSET(_pdev, _bar, _offset, _val) \
3997d14abf15SRobert Mustacchi do { \
3998d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
3999d14abf15SRobert Mustacchi *((u16_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset)))=(_val); \
4000d14abf15SRobert Mustacchi mm_write_barrier(); \
4001d14abf15SRobert Mustacchi } while (0)
4002d14abf15SRobert Mustacchi
4003d14abf15SRobert Mustacchi /* BAR write32 via register offset and specific bar */
4004d14abf15SRobert Mustacchi #define LM_BAR_WR32_OFFSET(_pdev, _bar, _offset, _val) \
4005d14abf15SRobert Mustacchi do { \
4006d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
4007d14abf15SRobert Mustacchi *((u32_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset)))=(_val); \
4008d14abf15SRobert Mustacchi mm_write_barrier(); \
4009d14abf15SRobert Mustacchi } while (0)
4010d14abf15SRobert Mustacchi
4011d14abf15SRobert Mustacchi /* BAR write64 via register offset and specific bar */
4012d14abf15SRobert Mustacchi #define LM_BAR_WR64_OFFSET(_pdev, _bar, _offset, _val) \
4013d14abf15SRobert Mustacchi do { \
4014d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, _offset)\
4015d14abf15SRobert Mustacchi *((u64_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset)))=(_val); \
4016d14abf15SRobert Mustacchi mm_write_barrier(); \
4017d14abf15SRobert Mustacchi } while (0)
4018d14abf15SRobert Mustacchi
4019d14abf15SRobert Mustacchi /* BAR copy buffer to specific bar address */
4020d14abf15SRobert Mustacchi #define LM_BAR_COPY_BUFFER(_pdev, _bar, _offset, _size_, _buf_ptr) \
4021d14abf15SRobert Mustacchi do { \
4022d14abf15SRobert Mustacchi u32_t i; \
4023d14abf15SRobert Mustacchi for (i=0; i<size; i++) { \
4024d14abf15SRobert Mustacchi VBD_CMD_VERIFY_BAR_ACCESS(_pdev, _bar, (_offset+i*4) )\
4025d14abf15SRobert Mustacchi *((u32_t volatile *) ((u8_t *) (_pdev)->vars.mapped_bar_addr[(_bar)]+(_offset)+i*4))=*(buf_ptr+i); \
4026d14abf15SRobert Mustacchi } \
4027d14abf15SRobert Mustacchi } while (0)
4028d14abf15SRobert Mustacchi
4029d14abf15SRobert Mustacchi #else
4030d14abf15SRobert Mustacchi #define LM_BAR_RD8_OFFSET(_pdev, _bar, _offset, _ret) \
4031d14abf15SRobert Mustacchi mm_bar_read_byte(_pdev, _bar, _offset, _ret)
4032d14abf15SRobert Mustacchi #define LM_BAR_RD16_OFFSET(_pdev, _bar, _offset, _ret) \
4033d14abf15SRobert Mustacchi mm_bar_read_word(_pdev, _bar, _offset, _ret)
4034d14abf15SRobert Mustacchi #define LM_BAR_RD32_OFFSET(_pdev, _bar, _offset, _ret) \
4035d14abf15SRobert Mustacchi mm_bar_read_dword(_pdev, _bar, _offset, _ret)
4036d14abf15SRobert Mustacchi #define LM_BAR_RD64_OFFSET(_pdev, _bar, _offset, _ret) \
4037d14abf15SRobert Mustacchi mm_bar_read_ddword(_pdev, _bar, _offset, _ret)
4038d14abf15SRobert Mustacchi #define LM_BAR_WR8_OFFSET(_pdev, _bar, _offset, _val) \
4039d14abf15SRobert Mustacchi mm_bar_write_byte(_pdev, _bar, _offset, _val)
4040d14abf15SRobert Mustacchi #define LM_BAR_WR16_OFFSET(_pdev, _bar, _offset, _val) \
4041d14abf15SRobert Mustacchi mm_bar_write_word(_pdev, _bar, _offset, _val)
4042d14abf15SRobert Mustacchi #define LM_BAR_WR32_OFFSET(_pdev, _bar, _offset, _val) \
4043d14abf15SRobert Mustacchi mm_bar_write_dword(_pdev, _bar, _offset, _val)
4044d14abf15SRobert Mustacchi #define LM_BAR_WR64_OFFSET(_pdev, _bar, _offset, _val) \
4045d14abf15SRobert Mustacchi mm_bar_write_ddword(_pdev, _bar, _offset, _val)
4046d14abf15SRobert Mustacchi #define LM_BAR_COPY_BUFFER(_pdev, _bar, _offset, _size, _buf_ptr) \
4047d14abf15SRobert Mustacchi mm_bar_copy_buffer(_pdev, _bar, _offset, _size, _buf_ptr)
4048d14abf15SRobert Mustacchi #endif
4049d14abf15SRobert Mustacchi
4050d14abf15SRobert Mustacchi #ifndef USER_LINUX
4051d14abf15SRobert Mustacchi
4052d14abf15SRobert Mustacchi #if DBG && LOG_REG_ACCESS
4053d14abf15SRobert Mustacchi
4054d14abf15SRobert Mustacchi #define LOG_REG_RD(_pdev, _offset, _val) \
4055d14abf15SRobert Mustacchi if((_pdev)->params.test_mode & TEST_MODE_LOG_REG_ACCESS) \
4056d14abf15SRobert Mustacchi { \
4057d14abf15SRobert Mustacchi DbgMessage(_pdev, INFORM, "rd 0x%04x = 0x%08x\n", _offset, _val); \
4058d14abf15SRobert Mustacchi }
4059d14abf15SRobert Mustacchi
4060d14abf15SRobert Mustacchi #define LOG_REG_WR(_pdev, _offset, _val) \
4061d14abf15SRobert Mustacchi if((_pdev)->params.test_mode & TEST_MODE_LOG_REG_ACCESS) \
4062d14abf15SRobert Mustacchi { \
4063d14abf15SRobert Mustacchi DbgMessage(_pdev, INFORM, "wr 0x%04x 0x%08x\n", _offset, _val); \
4064d14abf15SRobert Mustacchi }
4065d14abf15SRobert Mustacchi
4066d14abf15SRobert Mustacchi #else
4067d14abf15SRobert Mustacchi
4068d14abf15SRobert Mustacchi #define LOG_REG_RD(_pdev, _offset, _val)
4069d14abf15SRobert Mustacchi #define LOG_REG_WR(_pdev, _offset, _val)
4070d14abf15SRobert Mustacchi
4071d14abf15SRobert Mustacchi #endif /* DBG */
4072d14abf15SRobert Mustacchi
4073d14abf15SRobert Mustacchi #endif /* USER_LINUX */
4074d14abf15SRobert Mustacchi
4075d14abf15SRobert Mustacchi #if defined(__SunOS)
4076d14abf15SRobert Mustacchi
4077d14abf15SRobert Mustacchi #ifdef __SunOS_MDB
4078d14abf15SRobert Mustacchi
4079d14abf15SRobert Mustacchi /* Solaris debugger (MDB) doesn't have access to ddi_get/put routines */
4080d14abf15SRobert Mustacchi
_reg_rd(struct _lm_device_t * pdev,u32_t reg_offset)4081d14abf15SRobert Mustacchi static __inline u32_t _reg_rd(struct _lm_device_t * pdev, u32_t reg_offset)
4082d14abf15SRobert Mustacchi {
4083d14abf15SRobert Mustacchi u32_t val;
4084d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(pdev, BAR_0, reg_offset, &val);
4085d14abf15SRobert Mustacchi return val;
4086d14abf15SRobert Mustacchi }
4087d14abf15SRobert Mustacchi
4088d14abf15SRobert Mustacchi #define REG_RD(_pdev, _reg_offset) _reg_rd(_pdev, _reg_offset)
4089d14abf15SRobert Mustacchi #define VF_REG_RD(_pdev, _reg_offset) _reg_rd(_pdev, _reg_offset)
4090d14abf15SRobert Mustacchi
4091d14abf15SRobert Mustacchi #define REG_WR(_pdev, _reg_offset, _val) \
4092d14abf15SRobert Mustacchi do { \
4093d14abf15SRobert Mustacchi LOG_REG_WR(_pdev, (u32_t)(_reg_offset), _val); \
4094d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(_pdev, BAR_0, _reg_offset, _val); \
4095d14abf15SRobert Mustacchi } while (0)
4096d14abf15SRobert Mustacchi
4097d14abf15SRobert Mustacchi #define VF_REG_WR(_pdev, _reg_offset, _val) REG_WR(_pdev, _reg_offset, _val)
4098d14abf15SRobert Mustacchi
4099d14abf15SRobert Mustacchi #else /* __SunOS && !__SunOS_MDB */
4100d14abf15SRobert Mustacchi
4101d14abf15SRobert Mustacchi #define REG_RD(_pdev, _reg_offset) \
4102d14abf15SRobert Mustacchi ddi_get32((_pdev)->vars.reg_handle[BAR_0], \
4103d14abf15SRobert Mustacchi (uint32_t *)((caddr_t)(_pdev)->vars.mapped_bar_addr[BAR_0] + \
4104d14abf15SRobert Mustacchi (_reg_offset)))
4105d14abf15SRobert Mustacchi
4106d14abf15SRobert Mustacchi #define REG_WR(_pdev, _reg_offset, _val) \
4107d14abf15SRobert Mustacchi ddi_put32((_pdev)->vars.reg_handle[BAR_0], \
4108d14abf15SRobert Mustacchi (uint32_t *)((caddr_t)(_pdev)->vars.mapped_bar_addr[BAR_0] + \
4109d14abf15SRobert Mustacchi (_reg_offset)), \
4110d14abf15SRobert Mustacchi (_val)) \
4111d14abf15SRobert Mustacchi
4112d14abf15SRobert Mustacchi #define VF_REG_RD(_pdev, _reg_offset) \
4113d14abf15SRobert Mustacchi ddi_get32((_pdev)->vars.reg_handle[BAR_0], \
4114d14abf15SRobert Mustacchi (uint32_t *)((caddr_t)(_pdev)->vars.mapped_bar_addr[BAR_0] + \
4115d14abf15SRobert Mustacchi (_reg_offset)))
4116d14abf15SRobert Mustacchi
4117d14abf15SRobert Mustacchi #define VF_REG_WR(_pdev, _reg_offset, _val) \
4118d14abf15SRobert Mustacchi ddi_put32((_pdev)->vars.reg_handle[BAR_0], \
4119d14abf15SRobert Mustacchi (uint32_t *)((caddr_t)(_pdev)->vars.mapped_bar_addr[BAR_0] + \
4120d14abf15SRobert Mustacchi (_reg_offset)), \
4121d14abf15SRobert Mustacchi (_val))
4122d14abf15SRobert Mustacchi
4123d14abf15SRobert Mustacchi #endif /* __SunOS_MDB */
4124d14abf15SRobert Mustacchi
4125d14abf15SRobert Mustacchi #elif defined (_VBD_CMD_)
4126d14abf15SRobert Mustacchi
4127d14abf15SRobert Mustacchi //we repeat this function's signature here because including everest_sim.h leads to a circular dependency.
4128d14abf15SRobert Mustacchi void vbd_cmd_on_reg_write(lm_device_t* pdev, u32_t offset);
4129d14abf15SRobert Mustacchi
_reg_rd(struct _lm_device_t * pdev,u32_t reg_offset)4130d14abf15SRobert Mustacchi static __inline u32_t _reg_rd(struct _lm_device_t * pdev, u32_t reg_offset)
4131d14abf15SRobert Mustacchi {
4132d14abf15SRobert Mustacchi u32_t val;
4133d14abf15SRobert Mustacchi DbgBreakIf(IS_VFDEV(pdev));
4134d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(pdev, BAR_0, reg_offset, &val);
4135d14abf15SRobert Mustacchi LOG_REG_RD(pdev, (reg_offset), val);
4136d14abf15SRobert Mustacchi return val;
4137d14abf15SRobert Mustacchi }
4138d14abf15SRobert Mustacchi
4139d14abf15SRobert Mustacchi /* Register access via register name. Macro returns a value */
4140d14abf15SRobert Mustacchi #define REG_RD(_pdev, _reg_offset) _reg_rd(_pdev, _reg_offset)
4141d14abf15SRobert Mustacchi
_vf_reg_rd(struct _lm_device_t * pdev,u32_t reg_offset)4142d14abf15SRobert Mustacchi static __inline u32_t _vf_reg_rd(struct _lm_device_t * pdev, u32_t reg_offset)
4143d14abf15SRobert Mustacchi {
4144d14abf15SRobert Mustacchi u32_t val;
4145d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(pdev, BAR_0, reg_offset, &val);
4146d14abf15SRobert Mustacchi LOG_REG_RD(pdev, (reg_offset), val);
4147d14abf15SRobert Mustacchi return val;
4148d14abf15SRobert Mustacchi }
4149d14abf15SRobert Mustacchi
4150d14abf15SRobert Mustacchi #define VF_REG_RD(_pdev, _reg_offset) _reg_rd(_pdev, _reg_offset)
4151d14abf15SRobert Mustacchi
4152d14abf15SRobert Mustacchi // Offset passed to LOG_REG_WR is now without the bar address!
4153d14abf15SRobert Mustacchi #define REG_WR(_pdev, _reg_offset, _val) \
4154d14abf15SRobert Mustacchi do { \
4155d14abf15SRobert Mustacchi DbgBreakIf(IS_VFDEV(_pdev)); \
4156d14abf15SRobert Mustacchi LOG_REG_WR(_pdev, (u32_t)(_reg_offset), _val); \
4157d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(_pdev, BAR_0, _reg_offset, _val); \
4158d14abf15SRobert Mustacchi vbd_cmd_on_reg_write(_pdev, _reg_offset);\
4159d14abf15SRobert Mustacchi } while (0)
4160d14abf15SRobert Mustacchi
4161d14abf15SRobert Mustacchi #define VF_REG_WR(_pdev, _reg_offset, _val) \
4162d14abf15SRobert Mustacchi do { \
4163d14abf15SRobert Mustacchi LOG_REG_WR(_pdev, (u32_t)(_reg_offset), _val); \
4164d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(_pdev, BAR_0, _reg_offset, _val); \
4165d14abf15SRobert Mustacchi vbd_cmd_on_reg_write(_pdev, _reg_offset);\
4166d14abf15SRobert Mustacchi } while (0)
4167d14abf15SRobert Mustacchi
4168d14abf15SRobert Mustacchi
4169d14abf15SRobert Mustacchi #elif !defined(USER_LINUX)
4170d14abf15SRobert Mustacchi
_reg_rd(struct _lm_device_t * pdev,u32_t reg_offset)4171d14abf15SRobert Mustacchi static __inline u32_t _reg_rd(struct _lm_device_t * pdev, u32_t reg_offset)
4172d14abf15SRobert Mustacchi {
4173d14abf15SRobert Mustacchi u32_t val;
4174d14abf15SRobert Mustacchi DbgBreakIf(IS_VFDEV(pdev));
4175d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(pdev, BAR_0, reg_offset, &val);
4176d14abf15SRobert Mustacchi LOG_REG_RD(pdev, (reg_offset), val);
4177d14abf15SRobert Mustacchi return val;
4178d14abf15SRobert Mustacchi }
4179d14abf15SRobert Mustacchi
4180d14abf15SRobert Mustacchi /* Register access via register name. Macro returns a value */
4181d14abf15SRobert Mustacchi #define REG_RD(_pdev, _reg_offset) _reg_rd(_pdev, _reg_offset)
4182d14abf15SRobert Mustacchi
_vf_reg_rd(struct _lm_device_t * pdev,u32_t reg_offset)4183d14abf15SRobert Mustacchi static __inline u32_t _vf_reg_rd(struct _lm_device_t * pdev, u32_t reg_offset)
4184d14abf15SRobert Mustacchi {
4185d14abf15SRobert Mustacchi u32_t val;
4186d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(pdev, BAR_0, reg_offset, &val);
4187d14abf15SRobert Mustacchi LOG_REG_RD(pdev, (reg_offset), val);
4188d14abf15SRobert Mustacchi return val;
4189d14abf15SRobert Mustacchi }
4190d14abf15SRobert Mustacchi
4191d14abf15SRobert Mustacchi #define VF_REG_RD(_pdev, _reg_offset) _reg_rd(_pdev, _reg_offset)
4192d14abf15SRobert Mustacchi
4193d14abf15SRobert Mustacchi // Offset passed to LOG_REG_WR is now without the bar address!
4194d14abf15SRobert Mustacchi #define REG_WR(_pdev, _reg_offset, _val) \
4195d14abf15SRobert Mustacchi do { \
4196d14abf15SRobert Mustacchi DbgBreakIf(IS_VFDEV(_pdev)); \
4197d14abf15SRobert Mustacchi LOG_REG_WR(_pdev, (u32_t)(_reg_offset), _val); \
4198d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(_pdev, BAR_0, _reg_offset, _val); \
4199d14abf15SRobert Mustacchi } while (0)
4200d14abf15SRobert Mustacchi
4201d14abf15SRobert Mustacchi #define VF_REG_WR(_pdev, _reg_offset, _val) \
4202d14abf15SRobert Mustacchi do { \
4203d14abf15SRobert Mustacchi LOG_REG_WR(_pdev, (u32_t)(_reg_offset), _val); \
4204d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(_pdev, BAR_0, _reg_offset, _val); \
4205d14abf15SRobert Mustacchi } while (0)
4206d14abf15SRobert Mustacchi
4207d14abf15SRobert Mustacchi #endif /* USER_LINUX */
4208d14abf15SRobert Mustacchi
4209d14abf15SRobert Mustacchi /* TBA: optionally add LOG_REG_WR as in Teton to write 8/16/32*/
4210d14abf15SRobert Mustacchi
4211d14abf15SRobert Mustacchi // special macros for reading from shared memory
4212d14abf15SRobert Mustacchi
4213d14abf15SRobert Mustacchi /* TBD - E1H: all shmen read/write operations currenly use FUNC_ID for offset calculatio. This may not be right! MCP TBD*/
4214d14abf15SRobert Mustacchi #define LM_SHMEM_READ_IMP(_pdev,_offset,_ret,_shmem_base_name) \
4215d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET((_pdev),BAR_0,(_pdev)->hw_info._shmem_base_name + _offset,(_ret));
4216d14abf15SRobert Mustacchi
4217d14abf15SRobert Mustacchi #define LM_SHMEM_READ(_pdev,_offset,_ret) LM_SHMEM_READ_IMP(_pdev,_offset,_ret, shmem_base );
4218d14abf15SRobert Mustacchi #define LM_SHMEM2_READ(_pdev,_offset,_ret) LM_SHMEM_READ_IMP(_pdev,_offset,_ret, shmem_base2 );
4219d14abf15SRobert Mustacchi #define LM_MFCFG_READ(_pdev,_offset,_ret) LM_SHMEM_READ_IMP(_pdev,_offset,_ret, mf_cfg_base );
4220d14abf15SRobert Mustacchi
4221d14abf15SRobert Mustacchi #define LM_SHMEM_WRITE_IMP(_pdev,_offset,_val,_shmem_base_name) \
4222d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET((_pdev),BAR_0,(_pdev)->hw_info._shmem_base_name + _offset,(_val));
4223d14abf15SRobert Mustacchi
4224d14abf15SRobert Mustacchi #define LM_SHMEM_WRITE(_pdev,_offset,_val) LM_SHMEM_WRITE_IMP(_pdev,_offset,_val,shmem_base);
4225d14abf15SRobert Mustacchi #define LM_SHMEM2_WRITE(_pdev,_offset,_val) LM_SHMEM_WRITE_IMP(_pdev,_offset,_val,shmem_base2);
4226d14abf15SRobert Mustacchi #define LM_MFCFG_WRITE(_pdev,_offset,_val) LM_SHMEM_WRITE_IMP(_pdev,_offset,_val,mf_cfg_base);
4227d14abf15SRobert Mustacchi
4228d14abf15SRobert Mustacchi #define LM_SHMEM2_ADDR(_pdev, field) (_pdev->hw_info.shmem_base2 + OFFSETOF(struct shmem2_region, field))
4229d14abf15SRobert Mustacchi #define LM_SHMEM2_HAS(_pdev, field) ((_pdev)->hw_info.shmem_base2 && \
4230d14abf15SRobert Mustacchi (REG_RD(_pdev, LM_SHMEM2_ADDR(_pdev, size)) > OFFSETOF(struct shmem2_region, field)))
4231d14abf15SRobert Mustacchi
4232d14abf15SRobert Mustacchi
4233d14abf15SRobert Mustacchi /* Macros for read/write to internal memory of storms */
4234d14abf15SRobert Mustacchi #define LM_INTMEM_READ8(_pdev,_offset,_ret,_type) \
4235d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_READ8() inside! storm:%s address:0x%x\n",#_type,_type); \
4236d14abf15SRobert Mustacchi LM_BAR_RD8_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_ret));
4237d14abf15SRobert Mustacchi
4238d14abf15SRobert Mustacchi #define LM_INTMEM_WRITE8(_pdev,_offset,_val,_type) \
4239d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_WRITE8() inside! storm:%s address:0x%x\n",#_type,_type); \
4240d14abf15SRobert Mustacchi LM_BAR_WR8_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_val));
4241d14abf15SRobert Mustacchi
4242d14abf15SRobert Mustacchi #define LM_INTMEM_READ16(_pdev,_offset,_ret,_type) \
4243d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_READ16() inside! storm:%s address:0x%x\n",#_type,_type); \
4244d14abf15SRobert Mustacchi LM_BAR_RD16_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_ret));
4245d14abf15SRobert Mustacchi
4246d14abf15SRobert Mustacchi #define LM_INTMEM_WRITE16(_pdev,_offset,_val,_type) \
4247d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_WRITE16() inside! storm:%s address:0x%x offset=%x val=%x\n",#_type,_type, _offset, _val); \
4248d14abf15SRobert Mustacchi LM_BAR_WR16_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_val));
4249d14abf15SRobert Mustacchi
4250d14abf15SRobert Mustacchi #define LM_INTMEM_READ32(_pdev,_offset,_ret,_type) \
4251d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_READ32() inside! storm:%s address:0x%x\n",#_type,_type); \
4252d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_ret));
4253d14abf15SRobert Mustacchi
4254d14abf15SRobert Mustacchi #define LM_INTMEM_WRITE32(_pdev,_offset,_val,_type) \
4255d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_WRITE32() inside! storm:%s address:0x%x\n",#_type,_type); \
4256d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_val));
4257d14abf15SRobert Mustacchi
4258d14abf15SRobert Mustacchi #define LM_INTMEM_READ64(_pdev,_offset,_ret,_type) \
4259d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_READ64() inside! storm:%s address:0x%x\n",#_type,_type); \
4260d14abf15SRobert Mustacchi LM_BAR_RD64_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_ret));
4261d14abf15SRobert Mustacchi
4262d14abf15SRobert Mustacchi #define LM_INTMEM_WRITE64(_pdev,_offset,_val,_type) \
4263d14abf15SRobert Mustacchi DbgMessage(pdev, INFORMi, "LM_INTMEM_WRITE64() inside! storm:%s address:0x%x\n",#_type,_type); \
4264d14abf15SRobert Mustacchi LM_BAR_WR64_OFFSET((_pdev),BAR_0,((_type)+(_offset)),(_val));
4265d14abf15SRobert Mustacchi //________________________________________________________________________________
4266d14abf15SRobert Mustacchi
4267d14abf15SRobert Mustacchi
4268d14abf15SRobert Mustacchi #define DEFAULT_WAIT_INTERVAL_MICSEC 30 // wait interval microseconds
4269d14abf15SRobert Mustacchi
4270d14abf15SRobert Mustacchi u32_t reg_wait_verify_val(struct _lm_device_t * pdev, u32_t reg_offset, u32_t excpected_val, u32_t total_wait_time_ms );
4271d14abf15SRobert Mustacchi #if !defined(_VBD_CMD_)
4272d14abf15SRobert Mustacchi #define REG_WAIT_VERIFY_VAL(_pdev, _reg_offset, _excpected_val, _total_wait_time_ms ) \
4273d14abf15SRobert Mustacchi reg_wait_verify_val(_pdev, _reg_offset, _excpected_val, _total_wait_time_ms );
4274d14abf15SRobert Mustacchi #else
4275d14abf15SRobert Mustacchi /* For VBD_CMD: we don't verify values written... */
4276d14abf15SRobert Mustacchi #define REG_WAIT_VERIFY_VAL(_pdev, _reg_offset, _excpected_val, _total_wait_time_ms ) 0
4277d14abf15SRobert Mustacchi #endif
4278d14abf15SRobert Mustacchi
4279d14abf15SRobert Mustacchi #define DPM_TRIGER_TYPE 0x40
4280d14abf15SRobert Mustacchi
4281d14abf15SRobert Mustacchi #if defined(EMULATION_DOORBELL_FULL_WORKAROUND)
4282d14abf15SRobert Mustacchi #define _DOORBELL(PDEV,CID,VAL) do{\
4283d14abf15SRobert Mustacchi MM_WRITE_DOORBELL(PDEV,BAR_1,CID,VAL);\
4284d14abf15SRobert Mustacchi } while(0)
4285d14abf15SRobert Mustacchi
DOORBELL(lm_device_t * pdev,u32_t cid,u32_t val)4286d14abf15SRobert Mustacchi static __inline void DOORBELL(lm_device_t *pdev, u32_t cid, u32_t val)
4287d14abf15SRobert Mustacchi {
4288d14abf15SRobert Mustacchi u32_t db_fill;
4289d14abf15SRobert Mustacchi u32_t wait_cnt = 0;
4290d14abf15SRobert Mustacchi
4291d14abf15SRobert Mustacchi if (CHIP_REV_IS_EMUL(pdev) || CHIP_REV_IS_FPGA(pdev)) {
4292d14abf15SRobert Mustacchi lm_device_t *pf_dev = pdev->pf_dev;
4293d14abf15SRobert Mustacchi if (!pf_dev) {
4294d14abf15SRobert Mustacchi pf_dev = pdev;
4295d14abf15SRobert Mustacchi }
4296d14abf15SRobert Mustacchi /* wait while doorbells are blocked */
4297d14abf15SRobert Mustacchi while(pdev->vars.doorbells_blocked) {
4298d14abf15SRobert Mustacchi wait_cnt++; /* counter required to avoid Watcom warning */
4299d14abf15SRobert Mustacchi }
4300d14abf15SRobert Mustacchi
4301d14abf15SRobert Mustacchi if(mm_atomic_dec(&pdev->vars.doorbells_cnt) == 0) {
4302d14abf15SRobert Mustacchi
4303d14abf15SRobert Mustacchi mm_atomic_set(&pdev->vars.doorbells_cnt, DOORBELL_CHECK_FREQUENCY);
4304d14abf15SRobert Mustacchi
4305d14abf15SRobert Mustacchi db_fill=REG_RD(pf_dev,DORQ_REG_DQ_FILL_LVLF);
4306d14abf15SRobert Mustacchi
4307d14abf15SRobert Mustacchi if (db_fill > ALLOWED_DOORBELLS_HIGH_WM) {
4308d14abf15SRobert Mustacchi
4309d14abf15SRobert Mustacchi DbgMessage(pdev, WARN,
4310d14abf15SRobert Mustacchi "EMULATION_DOORBELL_FULL_WORKAROUND: db_fill=%d, doorbell in busy wait!\n",
4311d14abf15SRobert Mustacchi db_fill);
4312d14abf15SRobert Mustacchi
4313d14abf15SRobert Mustacchi /* block additional doorbells */
4314d14abf15SRobert Mustacchi pdev->vars.doorbells_blocked = 1;
4315d14abf15SRobert Mustacchi
4316d14abf15SRobert Mustacchi /* busy wait for doorbell capacity */
4317d14abf15SRobert Mustacchi
4318d14abf15SRobert Mustacchi do {
4319d14abf15SRobert Mustacchi db_fill=REG_RD(pf_dev,DORQ_REG_DQ_FILL_LVLF);
4320d14abf15SRobert Mustacchi if (db_fill == 0xffffffff) {
4321d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "DOORBELL: fill level 0xffffffff\n");
4322d14abf15SRobert Mustacchi break;
4323d14abf15SRobert Mustacchi }
4324d14abf15SRobert Mustacchi } while (db_fill > ALLOWED_DOORBELLS_LOW_WM);
4325d14abf15SRobert Mustacchi
4326d14abf15SRobert Mustacchi /* incr statistics */
4327d14abf15SRobert Mustacchi pdev->vars.doorbells_high_wm_reached++;
4328d14abf15SRobert Mustacchi
4329d14abf15SRobert Mustacchi /* unblock additional doorbells */
4330d14abf15SRobert Mustacchi pdev->vars.doorbells_blocked = 0;
4331d14abf15SRobert Mustacchi }
4332d14abf15SRobert Mustacchi }
4333d14abf15SRobert Mustacchi }
4334d14abf15SRobert Mustacchi
4335d14abf15SRobert Mustacchi _DOORBELL(pdev,cid,val);
4336d14abf15SRobert Mustacchi }
4337d14abf15SRobert Mustacchi
4338d14abf15SRobert Mustacchi #else
4339d14abf15SRobert Mustacchi
4340d14abf15SRobert Mustacchi // need to change LM_PAGE_SIZE to OS page size + when we will have 2 bars BAR_DOORBELL_OFFSET is not needed.
4341d14abf15SRobert Mustacchi #define DOORBELL(PDEV,CID,VAL) do{\
4342d14abf15SRobert Mustacchi MM_WRITE_DOORBELL(PDEV,BAR_1,CID,VAL);\
4343d14abf15SRobert Mustacchi } while(0)
4344d14abf15SRobert Mustacchi
4345d14abf15SRobert Mustacchi #endif /* defined(EMULATION_DOORBELL_FULL_WORKAROUND) */
4346d14abf15SRobert Mustacchi
4347d14abf15SRobert Mustacchi
4348d14abf15SRobert Mustacchi #define HW_CID(pdev,x) (x |(PORT_ID(pdev) << 23 | VNIC_ID(pdev) << 17))
4349d14abf15SRobert Mustacchi // used on a CID received from the HW - ignore bits 17, 18 and 23 (though 19-22 can be ignored as well)
4350d14abf15SRobert Mustacchi #define SW_CID(x) (x & COMMON_RAMROD_ETH_RX_CQE_CID & ~0x860000)
4351d14abf15SRobert Mustacchi
4352d14abf15SRobert Mustacchi
4353d14abf15SRobert Mustacchi u64_t lm_get_timestamp_of_recent_cid_recycling(struct _lm_device_t *pdev);
4354d14abf15SRobert Mustacchi
lm_sb_id_from_chain(struct _lm_device_t * pdev,u32_t chain_idx)4355d14abf15SRobert Mustacchi static u8_t __inline lm_sb_id_from_chain(struct _lm_device_t *pdev, u32_t chain_idx)
4356d14abf15SRobert Mustacchi {
4357d14abf15SRobert Mustacchi u8_t sb_id = 0 ;
4358d14abf15SRobert Mustacchi
4359d14abf15SRobert Mustacchi if (CHAIN_TO_RSS_ID(pdev,(u32_t)chain_idx) >= LM_SB_CNT(pdev)) //LM_MAX_RSS_CHAINS(pdev))
4360d14abf15SRobert Mustacchi {
4361d14abf15SRobert Mustacchi /* mapping iscsi / fcoe cids to the default status block */
4362d14abf15SRobert Mustacchi sb_id = DEF_STATUS_BLOCK_INDEX;
4363d14abf15SRobert Mustacchi }
4364d14abf15SRobert Mustacchi else
4365d14abf15SRobert Mustacchi {
4366d14abf15SRobert Mustacchi sb_id = (u8_t)RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,(u32_t)chain_idx));
4367d14abf15SRobert Mustacchi }
4368d14abf15SRobert Mustacchi return sb_id;
4369d14abf15SRobert Mustacchi }
lm_set_virt_mode(struct _lm_device_t * pdev,u8_t device_type,u8_t virtualization_type)4370d14abf15SRobert Mustacchi static void __inline lm_set_virt_mode(struct _lm_device_t *pdev, u8_t device_type, u8_t virtualization_type)
4371d14abf15SRobert Mustacchi {
4372d14abf15SRobert Mustacchi if (CHK_NULL(pdev))
4373d14abf15SRobert Mustacchi {
4374d14abf15SRobert Mustacchi DbgBreakMsg("lm_set_virt_mode pdev is null");
4375d14abf15SRobert Mustacchi return;
4376d14abf15SRobert Mustacchi }
4377d14abf15SRobert Mustacchi
4378d14abf15SRobert Mustacchi if ((pdev->params.device_type == DEVICE_TYPE_PF) && (pdev->params.virtualization_type == VT_NONE)) {
4379d14abf15SRobert Mustacchi switch (device_type) {
4380d14abf15SRobert Mustacchi case DEVICE_TYPE_PF:
4381d14abf15SRobert Mustacchi pdev->params.device_type = device_type;
4382d14abf15SRobert Mustacchi switch (virtualization_type) {
4383d14abf15SRobert Mustacchi case VT_NONE:
4384d14abf15SRobert Mustacchi break;
4385d14abf15SRobert Mustacchi case VT_BASIC_VF:
4386d14abf15SRobert Mustacchi case VT_CHANNEL_VF:
4387d14abf15SRobert Mustacchi case VT_ASSIGNED_TO_VM_PF:
4388d14abf15SRobert Mustacchi pdev->params.virtualization_type = virtualization_type;
4389d14abf15SRobert Mustacchi break;
4390d14abf15SRobert Mustacchi default:
4391d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "Master PF mode %d is not supported in virt.mode\n",virtualization_type);
4392d14abf15SRobert Mustacchi DbgBreak();
4393d14abf15SRobert Mustacchi break;
4394d14abf15SRobert Mustacchi }
4395d14abf15SRobert Mustacchi break;
4396d14abf15SRobert Mustacchi case DEVICE_TYPE_VF:
4397d14abf15SRobert Mustacchi pdev->params.device_type = device_type;
4398d14abf15SRobert Mustacchi switch (virtualization_type) {
4399d14abf15SRobert Mustacchi case VT_BASIC_VF:
4400d14abf15SRobert Mustacchi case VT_CHANNEL_VF:
4401d14abf15SRobert Mustacchi pdev->params.virtualization_type = virtualization_type;
4402d14abf15SRobert Mustacchi break;
4403d14abf15SRobert Mustacchi case VT_NONE:
4404d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "VF mode is mandatory parameter\n");
4405d14abf15SRobert Mustacchi DbgBreak();
4406d14abf15SRobert Mustacchi break;
4407d14abf15SRobert Mustacchi default:
4408d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "VF mode %d is not supported\n",virtualization_type);
4409d14abf15SRobert Mustacchi DbgBreak();
4410d14abf15SRobert Mustacchi break;
4411d14abf15SRobert Mustacchi }
4412d14abf15SRobert Mustacchi break;
4413d14abf15SRobert Mustacchi default:
4414d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "Device type %d is not supported in virt.mode\n",device_type);
4415d14abf15SRobert Mustacchi DbgBreak();
4416d14abf15SRobert Mustacchi }
4417d14abf15SRobert Mustacchi } else {
4418d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "Virt.mode is set already (%d,%d)\n",device_type,virtualization_type);
4419d14abf15SRobert Mustacchi }
4420d14abf15SRobert Mustacchi DbgMessage(pdev, WARN, "Virt.mode is set as (%d,%d)\n", pdev->params.device_type, pdev->params.virtualization_type);
4421d14abf15SRobert Mustacchi }
4422d14abf15SRobert Mustacchi
lm_set_virt_channel_type(struct _lm_device_t * pdev,u8_t channel_type)4423d14abf15SRobert Mustacchi static void __inline lm_set_virt_channel_type(struct _lm_device_t *pdev, u8_t channel_type)
4424d14abf15SRobert Mustacchi {
4425d14abf15SRobert Mustacchi if (CHK_NULL(pdev))
4426d14abf15SRobert Mustacchi {
4427d14abf15SRobert Mustacchi DbgBreakMsg("lm_set_virt_channel_type pdev is null");
4428d14abf15SRobert Mustacchi return;
4429d14abf15SRobert Mustacchi }
4430d14abf15SRobert Mustacchi switch (channel_type) {
4431d14abf15SRobert Mustacchi case VT_HW_CHANNEL_TYPE:
4432d14abf15SRobert Mustacchi case VT_SW_CHANNEL_TYPE:
4433d14abf15SRobert Mustacchi break;
4434d14abf15SRobert Mustacchi default:
4435d14abf15SRobert Mustacchi DbgMessage(pdev, WARN, "Unknown channel type (%d)\n", channel_type);
4436d14abf15SRobert Mustacchi DbgBreak();
4437d14abf15SRobert Mustacchi channel_type = VT_HW_CHANNEL_TYPE;
4438d14abf15SRobert Mustacchi }
4439d14abf15SRobert Mustacchi pdev->params.channel_type = channel_type;
4440d14abf15SRobert Mustacchi DbgMessage(pdev, WARN, "Channel type is set as (%d)\n", pdev->params.channel_type);
4441d14abf15SRobert Mustacchi }
4442d14abf15SRobert Mustacchi
lm_reset_virt_mode(struct _lm_device_t * pdev)4443d14abf15SRobert Mustacchi static void __inline lm_reset_virt_mode(struct _lm_device_t *pdev)
4444d14abf15SRobert Mustacchi {
4445d14abf15SRobert Mustacchi if (CHK_NULL(pdev))
4446d14abf15SRobert Mustacchi {
4447d14abf15SRobert Mustacchi DbgBreakMsg("lm_reset_virt_mode pdev is null");
4448d14abf15SRobert Mustacchi return;
4449d14abf15SRobert Mustacchi }
4450d14abf15SRobert Mustacchi if (pdev->params.device_type == DEVICE_TYPE_PF) {
4451d14abf15SRobert Mustacchi pdev->params.device_type = DEVICE_TYPE_PF;
4452d14abf15SRobert Mustacchi pdev->params.virtualization_type = VT_NONE;
4453d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "Vrtualization mode is reset to simple PF\n");
4454d14abf15SRobert Mustacchi } else {
4455d14abf15SRobert Mustacchi DbgMessage(pdev, FATAL, "Virtualization mode reset is is valid only for PF\n");
4456d14abf15SRobert Mustacchi }
4457d14abf15SRobert Mustacchi }
4458d14abf15SRobert Mustacchi
4459d14abf15SRobert Mustacchi u32_t lm_get_num_of_cashed_grq_bds(struct _lm_device_t *pdev);
4460d14abf15SRobert Mustacchi void lm_set_waitp(lm_device_t *pdev);
4461d14abf15SRobert Mustacchi u8_t lm_get_port_id_from_func_abs( const u32_t chip_num, const lm_chip_port_mode_t lm_chip_port_mode, const u8_t abs_func );
4462d14abf15SRobert Mustacchi u8_t lm_get_abs_func_vector( const u32_t chip_num, const lm_chip_port_mode_t chip_port_mode, const u8_t b_multi_vnics_mode, const u8_t path_id );
4463d14abf15SRobert Mustacchi u8_t lm_check_if_pf_assigned_to_vm(struct _lm_device_t *pdev);
4464d14abf15SRobert Mustacchi u8_t lm_is_fw_version_valid(struct _lm_device_t *pdev);
4465d14abf15SRobert Mustacchi lm_status_t lm_set_cli_drv_ver_to_shmem(struct _lm_device_t *lmdev);
4466d14abf15SRobert Mustacchi
4467d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
4468d14abf15SRobert Mustacchi lm_vf_info_t * lm_pf_find_vf_info_by_rel_id(struct _lm_device_t *pdev, u16_t relative_vf_id);
4469d14abf15SRobert Mustacchi lm_vf_info_t * lm_pf_find_vf_info_by_abs_id(struct _lm_device_t *pdev, u8_t abs_vf_id);
4470d14abf15SRobert Mustacchi lm_status_t lm_pf_download_standard_request(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, void* virt_buffer, u32_t length);
4471d14abf15SRobert Mustacchi lm_status_t lm_pf_upload_standard_response(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, void* virt_buffer, u32_t length);
4472d14abf15SRobert Mustacchi
4473d14abf15SRobert Mustacchi lm_status_t lm_pf_upload_standard_request(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, lm_address_t * phys_buffer, u32_t length);
4474d14abf15SRobert Mustacchi lm_status_t lm_pf_download_standard_response(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, lm_address_t * phys_buffer, u32_t length);
4475d14abf15SRobert Mustacchi lm_status_t lm_pf_allocate_vfs(struct _lm_device_t *pdev);
4476d14abf15SRobert Mustacchi lm_status_t lm_pf_init_vfs(struct _lm_device_t *pdev, u16_t num_vfs);
4477d14abf15SRobert Mustacchi lm_status_t lm_pf_clear_vfs(struct _lm_device_t * pdev);
4478d14abf15SRobert Mustacchi lm_status_t lm_pf_set_vf_ctx(struct _lm_device_t *pdev, u16_t vf_id, void* ctx);
4479d14abf15SRobert Mustacchi #if 0
4480d14abf15SRobert Mustacchi lm_status_t lm_pf_set_vf_client_id(struct _lm_device_t *pdev,
4481d14abf15SRobert Mustacchi u16_t vf_id,
4482d14abf15SRobert Mustacchi u8_t base_fw_client_id,
4483d14abf15SRobert Mustacchi u8_t base_sw_client_id);
4484d14abf15SRobert Mustacchi lm_status_t lm_pf_set_vf_ndsb(struct _lm_device_t *pdev,
4485d14abf15SRobert Mustacchi u16_t vf_id,
4486d14abf15SRobert Mustacchi u8_t base_fw_ndsb,
4487d14abf15SRobert Mustacchi u8_t base_sw_ndsb,
4488d14abf15SRobert Mustacchi u8_t base_fw_dhc_qzone_id);
4489d14abf15SRobert Mustacchi lm_status_t lm_pf_set_vf_qzone_id(struct _lm_device_t *pdev,
4490d14abf15SRobert Mustacchi u16_t vf_id,
4491d14abf15SRobert Mustacchi u8_t base_fw_qzone_id);
4492d14abf15SRobert Mustacchi #endif
4493d14abf15SRobert Mustacchi
4494d14abf15SRobert Mustacchi lm_status_t lm_pf_set_vf_stat_id(struct _lm_device_t *pdev,
4495d14abf15SRobert Mustacchi u16_t vf_id,
4496d14abf15SRobert Mustacchi u8_t base_fw_stats_id);
4497d14abf15SRobert Mustacchi
4498d14abf15SRobert Mustacchi u8_t lm_pf_is_vf_mac_set(struct _lm_device_t *pdev, u16_t vf_id);
4499d14abf15SRobert Mustacchi
4500d14abf15SRobert Mustacchi lm_status_t lm_pf_set_vf_base_cam_idx(struct _lm_device_t *pdev, u16_t vf_id, u32_t base_cam_idx);
4501d14abf15SRobert Mustacchi
4502d14abf15SRobert Mustacchi u32_t lm_pf_get_sw_client_idx_from_cid(struct _lm_device_t *pdev, u32_t cid);
4503d14abf15SRobert Mustacchi u32_t lm_pf_get_fw_client_idx_from_cid(struct _lm_device_t *pdev, u32_t cid);
4504d14abf15SRobert Mustacchi
4505d14abf15SRobert Mustacchi u8_t lm_pf_acquire_vf_chains_resources(struct _lm_device_t *pdev, u16_t vf_id, u32_t num_chains);
4506d14abf15SRobert Mustacchi void lm_pf_release_vf_chains_resources(struct _lm_device_t *pdev, u16_t vf_id);
4507d14abf15SRobert Mustacchi void lm_pf_release_separate_vf_chain_resources(struct _lm_device_t *pdev, u16_t vf_id, u8_t chain_num);
4508d14abf15SRobert Mustacchi u8_t lm_pf_is_sriov_valid(struct _lm_device_t *pdev);
4509d14abf15SRobert Mustacchi u8_t lm_pf_allocate_vf_igu_sbs(struct _lm_device_t *pdev, struct _lm_vf_info_t *vf_info, u8_t num_of_igu_sbs);
4510d14abf15SRobert Mustacchi void lm_pf_release_vf_igu_sbs(struct _lm_device_t *pdev, struct _lm_vf_info_t *vf_info);
4511d14abf15SRobert Mustacchi u8_t lm_pf_get_max_number_of_vf_igu_sbs(struct _lm_device_t *pdev);
4512d14abf15SRobert Mustacchi u8_t lm_pf_get_next_free_igu_block_id(struct _lm_device_t *pdev, u8_t starting_from);
4513d14abf15SRobert Mustacchi void lm_pf_clear_vf_igu_blocks(struct _lm_device_t *pdev);
4514d14abf15SRobert Mustacchi u8_t lm_pf_release_vf_igu_block(struct _lm_device_t *pdev, u8_t igu_sb_idx);
4515d14abf15SRobert Mustacchi u8_t lm_pf_acquire_vf_igu_block(struct _lm_device_t *pdev, u8_t igu_sb_idx, u8_t abs_vf_id, u8_t vector_number);
4516d14abf15SRobert Mustacchi u8_t lm_pf_get_vf_available_igu_blocks(struct _lm_device_t *pdev);
4517d14abf15SRobert Mustacchi lm_status_t lm_pf_update_vf_default_vlan(IN struct _lm_device_t *pdev, IN struct _lm_vf_info_t * vf_info,
4518d14abf15SRobert Mustacchi IN const u16_t silent_vlan_value,
4519d14abf15SRobert Mustacchi IN const u16_t silent_vlan_mask,
4520d14abf15SRobert Mustacchi IN const u8_t silent_vlan_removal_flg,
4521d14abf15SRobert Mustacchi IN const u8_t silent_vlan_change_flg,
4522d14abf15SRobert Mustacchi IN const u16_t default_vlan,
4523d14abf15SRobert Mustacchi IN const u8_t default_vlan_enable_flg,
4524d14abf15SRobert Mustacchi IN const u8_t default_vlan_change_flg);
4525d14abf15SRobert Mustacchi
4526d14abf15SRobert Mustacchi lm_status_t lm_pf_update_vf_ndsb(IN struct _lm_device_t *pdev,
4527d14abf15SRobert Mustacchi IN struct _lm_vf_info_t *vf_info,
4528d14abf15SRobert Mustacchi IN u8_t relative_in_vf_ndsb,
4529d14abf15SRobert Mustacchi IN u16_t interrupt_mod_level);
4530d14abf15SRobert Mustacchi
4531d14abf15SRobert Mustacchi lm_status_t lm_pf_update_vf_ndsbs(IN struct _lm_device_t *pdev,
4532d14abf15SRobert Mustacchi IN struct _lm_vf_info_t *vf_info,
4533d14abf15SRobert Mustacchi IN u16_t interrupt_mod_level);
4534d14abf15SRobert Mustacchi
4535d14abf15SRobert Mustacchi #endif
4536d14abf15SRobert Mustacchi
4537d14abf15SRobert Mustacchi #endif /* _LM5710_H */
4538