xref: /illumos-gate/usr/src/uts/common/io/bnxe/bnxe.h (revision b01ab2de0c818b0ee650585b54613701d6e50349)
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 
22d14abf15SRobert Mustacchi /*
23d14abf15SRobert Mustacchi  * Copyright 2014 QLogic Corporation
24d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
25d14abf15SRobert Mustacchi  * QLogic End User License (the "License").
26d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
27d14abf15SRobert Mustacchi  *
28d14abf15SRobert Mustacchi  * You can obtain a copy of the License at
29d14abf15SRobert Mustacchi  * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
30d14abf15SRobert Mustacchi  * QLogic_End_User_Software_License.txt
31d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
32d14abf15SRobert Mustacchi  * and limitations under the License.
33d14abf15SRobert Mustacchi  */
34d14abf15SRobert Mustacchi 
35d14abf15SRobert Mustacchi /*
36d14abf15SRobert Mustacchi  * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
37d14abf15SRobert Mustacchi  */
38d14abf15SRobert Mustacchi 
39d14abf15SRobert Mustacchi #ifndef BNXE_H
40d14abf15SRobert Mustacchi #define BNXE_H
41d14abf15SRobert Mustacchi 
42d14abf15SRobert Mustacchi #include <sys/types.h>
43d14abf15SRobert Mustacchi #include <sys/stream.h>
44d14abf15SRobert Mustacchi #include <sys/stropts.h>
45d14abf15SRobert Mustacchi #include <sys/errno.h>
46d14abf15SRobert Mustacchi #include <sys/cred.h>
47d14abf15SRobert Mustacchi #include <sys/poll.h>
48d14abf15SRobert Mustacchi #include <sys/modctl.h>
49d14abf15SRobert Mustacchi #include <sys/mac.h>
50d14abf15SRobert Mustacchi #include <sys/mac_provider.h>
51d14abf15SRobert Mustacchi #include <sys/stat.h>
52d14abf15SRobert Mustacchi #include <sys/ddi.h>
53d14abf15SRobert Mustacchi #include <sys/sunddi.h>
54d14abf15SRobert Mustacchi #include <sys/sunndi.h>
55d14abf15SRobert Mustacchi #include <sys/ddifm.h>
56d14abf15SRobert Mustacchi #include <sys/fm/protocol.h>
57d14abf15SRobert Mustacchi #include <sys/fm/util.h>
58d14abf15SRobert Mustacchi #include <sys/fm/io/ddi.h>
59d14abf15SRobert Mustacchi #include <sys/pattr.h>
60d14abf15SRobert Mustacchi #include <sys/sysmacros.h>
61d14abf15SRobert Mustacchi #include <sys/ethernet.h>
62d14abf15SRobert Mustacchi //#include <sys/vlan.h>
63d14abf15SRobert Mustacchi #include <sys/strsun.h>
64d14abf15SRobert Mustacchi #include <sys/ksynch.h>
65d14abf15SRobert Mustacchi #include <sys/kstat.h>
66d14abf15SRobert Mustacchi #include <netinet/in.h>
67d14abf15SRobert Mustacchi #include <netinet/ip.h>
68d14abf15SRobert Mustacchi #include <netinet/udp.h>
69d14abf15SRobert Mustacchi #include <netinet/tcp.h>
70d14abf15SRobert Mustacchi #include <inet/common.h>
71d14abf15SRobert Mustacchi #include <inet/ip.h>
72d14abf15SRobert Mustacchi #include <inet/ip_if.h>
73d14abf15SRobert Mustacchi #include <sys/strsubr.h>
74d14abf15SRobert Mustacchi #include <sys/pci.h>
75d14abf15SRobert Mustacchi #include <sys/gld.h>
76*b01ab2deSRobert Mustacchi #include <sys/mac_ether.h>
77d14abf15SRobert Mustacchi 
78d14abf15SRobert Mustacchi /*
79d14abf15SRobert Mustacchi  * This really ticks me off!  We use 'u' for naming unions
80d14abf15SRobert Mustacchi  * within structures.  Why is 'u' a reserved word!?!?!?
81d14abf15SRobert Mustacchi  * http://bugs.opensolaris.org/view_bug.do?bug_id=4340073
82d14abf15SRobert Mustacchi  * This undef has been moved to bnxe_debug.h.
83d14abf15SRobert Mustacchi  */
84d14abf15SRobert Mustacchi //#undef u
85d14abf15SRobert Mustacchi 
86d14abf15SRobert Mustacchi #include "version.h"
87d14abf15SRobert Mustacchi #include "debug.h"
88d14abf15SRobert Mustacchi #include "bcmtype.h"
89d14abf15SRobert Mustacchi #include "lm_defs.h"
90d14abf15SRobert Mustacchi #include "listq.h"
91d14abf15SRobert Mustacchi #include "lm5710.h"
92d14abf15SRobert Mustacchi #include "lm.h"
93d14abf15SRobert Mustacchi #include "bd_chain.h"
94d14abf15SRobert Mustacchi #if !defined(__SunOS_MDB)
95d14abf15SRobert Mustacchi #include "command.h"
96d14abf15SRobert Mustacchi #endif
97d14abf15SRobert Mustacchi #include "bnxe_binding.h"
98d14abf15SRobert Mustacchi #if !defined(DBG) && !defined(__SunOS_MDB)
99d14abf15SRobert Mustacchi #include "bnxe_debug.h" /* wasn't included by debug.h */
100d14abf15SRobert Mustacchi #endif
101d14abf15SRobert Mustacchi 
102d14abf15SRobert Mustacchi #ifndef VLAN_TAGSZ
103d14abf15SRobert Mustacchi #define VLAN_TAGSZ 4
104d14abf15SRobert Mustacchi #endif
105d14abf15SRobert Mustacchi 
106d14abf15SRobert Mustacchi #define BNXE_RINGS
107d14abf15SRobert Mustacchi #define RSS_ID_NONE -1
108d14abf15SRobert Mustacchi 
109d14abf15SRobert Mustacchi #define USER_OPTION_CKSUM_NONE     0x0
110d14abf15SRobert Mustacchi #define USER_OPTION_CKSUM_L3       0x1
111d14abf15SRobert Mustacchi #define USER_OPTION_CKSUM_L3_L4    0x2
112d14abf15SRobert Mustacchi #define USER_OPTION_CKSUM_DEFAULT  USER_OPTION_CKSUM_L3_L4
113d14abf15SRobert Mustacchi 
114d14abf15SRobert Mustacchi #define USER_OPTION_MTU_MIN      60
115d14abf15SRobert Mustacchi #define USER_OPTION_MTU_MAX      9216
116d14abf15SRobert Mustacchi #define USER_OPTION_MTU_DEFAULT  1500
117d14abf15SRobert Mustacchi 
118d14abf15SRobert Mustacchi #define USER_OPTION_NUM_RINGS_MIN         0
119d14abf15SRobert Mustacchi #define USER_OPTION_NUM_RINGS_MAX         MAX_RSS_CHAINS
120d14abf15SRobert Mustacchi #define USER_OPTION_NUM_RINGS_DEFAULT_MF  1
121d14abf15SRobert Mustacchi #define USER_OPTION_NUM_RINGS_DEFAULT_SF  4
122d14abf15SRobert Mustacchi #define USER_OPTION_NUM_RINGS_DEFAULT     0
123d14abf15SRobert Mustacchi 
124d14abf15SRobert Mustacchi #define USER_OPTION_RX_RING_GROUPS_MIN      1
125d14abf15SRobert Mustacchi #define USER_OPTION_RX_RING_GROUPS_MAX      1
126d14abf15SRobert Mustacchi #define USER_OPTION_RX_RING_GROUPS_DEFAULT  1
127d14abf15SRobert Mustacchi 
128d14abf15SRobert Mustacchi #define USER_OPTION_BDS_MIN         1
129d14abf15SRobert Mustacchi #define USER_OPTION_BDS_MAX         32767
130d14abf15SRobert Mustacchi #define USER_OPTION_RX_BDS_DEFAULT  1024
131d14abf15SRobert Mustacchi #define USER_OPTION_TX_BDS_DEFAULT  1024
132d14abf15SRobert Mustacchi #define USER_OPTION_MF_BDS_DIVISOR  4
133d14abf15SRobert Mustacchi 
134d14abf15SRobert Mustacchi #define USER_OPTION_INTR_COALESCE_MIN         10    /* usecs */
135d14abf15SRobert Mustacchi #define USER_OPTION_INTR_COALESCE_MAX         1000
136d14abf15SRobert Mustacchi #define USER_OPTION_INTR_COALESCE_RX_DEFAULT  20
137d14abf15SRobert Mustacchi #define USER_OPTION_INTR_COALESCE_TX_DEFAULT  40
138d14abf15SRobert Mustacchi 
139d14abf15SRobert Mustacchi #define USER_OPTION_TX_MAX_FREE_DEFAULT  32
140d14abf15SRobert Mustacchi #define USER_OPTION_RX_MAX_FREE_DEFAULT  32
141d14abf15SRobert Mustacchi 
142d14abf15SRobert Mustacchi //#define USER_OPTION_RX_DCOPY_THRESH_DEFAULT  0xffffffff
143d14abf15SRobert Mustacchi #define USER_OPTION_RX_DCOPY_THRESH_DEFAULT  128
144d14abf15SRobert Mustacchi 
145d14abf15SRobert Mustacchi //#define USER_OPTION_TX_DCOPY_THRESH_DEFAULT  0
146d14abf15SRobert Mustacchi #define USER_OPTION_TX_DCOPY_THRESH_DEFAULT  512
147d14abf15SRobert Mustacchi 
148d14abf15SRobert Mustacchi //#define BNXE_IP_MAXLEN   65535
149d14abf15SRobert Mustacchi #define BNXE_IP_MAXLEN   32768 /* 32768 = PAGESIZE * (BNXE_MAX_DMA_FRAGS_PER_PKT - 2 ) */
150d14abf15SRobert Mustacchi #define BNXE_OPTION_LEN  80    /* room for IP/TCP options (max 40 bytes each) */
151d14abf15SRobert Mustacchi #define BNXE_PKTHDR_LEN  (sizeof(struct ether_vlan_header) + sizeof(struct ip) + sizeof(struct tcphdr) + BNXE_OPTION_LEN)
152d14abf15SRobert Mustacchi #define BNXE_LSO_MAXLEN  (BNXE_IP_MAXLEN + sizeof(struct ether_vlan_header) - BNXE_PKTHDR_LEN) /* maximum payload */
153d14abf15SRobert Mustacchi 
154d14abf15SRobert Mustacchi #define BNXE_MAGIC          0x0feedead
155d14abf15SRobert Mustacchi #define BNXE_MEM_CHECK_LEN  16
156d14abf15SRobert Mustacchi #define BNXE_STR_SIZE       32
157d14abf15SRobert Mustacchi 
158d14abf15SRobert Mustacchi #define BNXEF_NAME "bnxef"
159d14abf15SRobert Mustacchi 
160d14abf15SRobert Mustacchi #define BNXE_FCOE(dev) ((um_device_t *)(dev))->do_fcoe
161d14abf15SRobert Mustacchi 
162d14abf15SRobert Mustacchi #ifdef __sparc
163d14abf15SRobert Mustacchi #define BNXE_DMA_ALIGNMENT  0x2000UL
164d14abf15SRobert Mustacchi #else
165d14abf15SRobert Mustacchi #define BNXE_DMA_ALIGNMENT  0x1000UL
166d14abf15SRobert Mustacchi #endif
167d14abf15SRobert Mustacchi 
168d14abf15SRobert Mustacchi /*
169d14abf15SRobert Mustacchi  * Adding a two byte offset to the receive buffer aligns the IP header on a
170d14abf15SRobert Mustacchi  * 16 byte boundary and it would put the TCP payload (assuming a 20 byte IP
171d14abf15SRobert Mustacchi  * header and 20 byte TCP header) on an 8 byte boundary.
172d14abf15SRobert Mustacchi  */
173d14abf15SRobert Mustacchi #define BNXE_DMA_RX_OFFSET 2
174d14abf15SRobert Mustacchi 
175d14abf15SRobert Mustacchi /*
176d14abf15SRobert Mustacchi  * The following two defines are used for defining limits on Tx packets.
177d14abf15SRobert Mustacchi  * BNXE_MAX_DMA_HANDLES_PER_PKT is the maximum number of DMA handles that are
178d14abf15SRobert Mustacchi  * pre-allocated for every Tx buffer descriptor.  These DMA handles are used
179d14abf15SRobert Mustacchi  * for mapping each mblk in the chain when not double copying the packet data
180d14abf15SRobert Mustacchi  * into the copy buffer.  BNXE_MAX_DMA_FRAGS_PER_PKT is based on the hardware
181d14abf15SRobert Mustacchi  * and represents the maximum number of fragments an outgoing packet can have.
182d14abf15SRobert Mustacchi  * Note that a single DMA handle can be comprised of multiple fragments which
183d14abf15SRobert Mustacchi  * is very likely with LSO.
184d14abf15SRobert Mustacchi  *
185d14abf15SRobert Mustacchi  * As seen below BNXE_MAX_DMA_FRAGS_PER_PKT is set to 10.  The actual firmware
186d14abf15SRobert Mustacchi  * limit is 13 but 10 is chosen specifically for the case of LSO packets that
187d14abf15SRobert Mustacchi  * are broken up across a long mblk chain.  The firmware utilizes a sliding
188d14abf15SRobert Mustacchi  * window on a packet's assigned buffer descriptors for LSO.  The window is 10
189d14abf15SRobert Mustacchi  * bds and each window (i.e. bds 1-10, 2-11, 3-12, etc), except the window
190d14abf15SRobert Mustacchi  * containing the last bd, must contains at least MSS bytes.  There are 'rare'
191d14abf15SRobert Mustacchi  * cases where a packet sent down by the stack will not satisfy this window
192d14abf15SRobert Mustacchi  * size requirement.  Therefore, setting the frag limit to 10 results in any
193d14abf15SRobert Mustacchi  * long chained packet (i.e. greater than 10 mblks), the trailing mblks will
194d14abf15SRobert Mustacchi  * get double copied into a single copy buffer and will be pointed to by the
195d14abf15SRobert Mustacchi  * last bd.  This simple change will ensure the sliding window requirement is
196d14abf15SRobert Mustacchi  * always satisfied.  Note, LSO packets with long mblk chains are a rare
197d14abf15SRobert Mustacchi  * occurance (nicdrv test01 can trigger it).
198d14abf15SRobert Mustacchi  */
199d14abf15SRobert Mustacchi #define BNXE_MAX_DMA_HANDLES_PER_PKT 11 /* go easy on DMA resources */
200d14abf15SRobert Mustacchi #define BNXE_MAX_DMA_FRAGS_PER_PKT   10 /* set BNXE_IP_MAXLEN above accordingly */
201d14abf15SRobert Mustacchi #define BNXE_MAX_DMA_SGLLEN          20 /* for partial dma mapping */
202d14abf15SRobert Mustacchi 
203d14abf15SRobert Mustacchi #define BNXE_PDWM_THRESHOLD  8
204d14abf15SRobert Mustacchi 
205d14abf15SRobert Mustacchi #define BNXE_TX_RESOURCES_NO_CREDIT      0x01
206d14abf15SRobert Mustacchi #define BNXE_TX_RESOURCES_NO_DESC        0x02
207d14abf15SRobert Mustacchi #define BNXE_TX_RESOURCES_NO_DRV_DMA_RES 0x04 /* Out of Tx DMA handles */
208d14abf15SRobert Mustacchi #define BNXE_TX_RESOURCES_NO_OS_DMA_RES  0x08 /* Unable to allocate DMA resources. (e.g. bind error) */
209d14abf15SRobert Mustacchi #define BNXE_TX_RESOURCES_TOO_MANY_FRAGS 0x10
210d14abf15SRobert Mustacchi 
211d14abf15SRobert Mustacchi #define BNXE_TX_GOODXMIT  0
212d14abf15SRobert Mustacchi #define BNXE_TX_LINKDOWN  1
213d14abf15SRobert Mustacchi #define BNXE_TX_DEFERPKT  2
214d14abf15SRobert Mustacchi #define BNXE_TX_HDWRFULL  3
215d14abf15SRobert Mustacchi #define BNXE_TX_PKTERROR  4
216d14abf15SRobert Mustacchi 
217d14abf15SRobert Mustacchi #define BNXE_ROUTE_RING_NONE     0
218d14abf15SRobert Mustacchi #define BNXE_ROUTE_RING_TCPUDP   1
219d14abf15SRobert Mustacchi #define BNXE_ROUTE_RING_DEST_MAC 2
220d14abf15SRobert Mustacchi #define BNXE_ROUTE_RING_MSG_PRIO 3
221d14abf15SRobert Mustacchi 
222d14abf15SRobert Mustacchi #undef BNXE_DEBUG_DMA_LIST
223d14abf15SRobert Mustacchi 
224d14abf15SRobert Mustacchi extern ddi_device_acc_attr_t bnxeAccessAttribBAR;
225d14abf15SRobert Mustacchi extern ddi_device_acc_attr_t bnxeAccessAttribBUF;
226d14abf15SRobert Mustacchi 
227d14abf15SRobert Mustacchi typedef struct _BnxeDevParams
228d14abf15SRobert Mustacchi {
229d14abf15SRobert Mustacchi     u32_t        fw_ver;
230d14abf15SRobert Mustacchi 
231d14abf15SRobert Mustacchi     u32_t        mtu[LM_CLI_IDX_MAX];
232d14abf15SRobert Mustacchi 
233d14abf15SRobert Mustacchi     u32_t        routeTxRingPolicy;
234d14abf15SRobert Mustacchi     u32_t        numRings;   /* number of rings */
235d14abf15SRobert Mustacchi     u32_t        numRxDesc[LM_CLI_IDX_MAX]; /* number of RX descriptors */
236d14abf15SRobert Mustacchi     u32_t        numTxDesc[LM_CLI_IDX_MAX]; /* number of TX descriptors */
237d14abf15SRobert Mustacchi     u32_t        maxRxFree;  /* max free allowed before posting back */
238d14abf15SRobert Mustacchi     u32_t        maxTxFree;  /* max free allowed before posting back */
239d14abf15SRobert Mustacchi 
240d14abf15SRobert Mustacchi     boolean_t    intrCoalesce;
241d14abf15SRobert Mustacchi     u32_t        intrRxPerSec;
242d14abf15SRobert Mustacchi     u32_t        intrTxPerSec;
243d14abf15SRobert Mustacchi     boolean_t    disableMsix;
244d14abf15SRobert Mustacchi 
245d14abf15SRobert Mustacchi     boolean_t    l2_fw_flow_ctrl;
246d14abf15SRobert Mustacchi     boolean_t    autogreeenEnable;
247d14abf15SRobert Mustacchi 
248d14abf15SRobert Mustacchi     u32_t        rxCopyThreshold;
249d14abf15SRobert Mustacchi     u32_t        txCopyThreshold;
250d14abf15SRobert Mustacchi 
251d14abf15SRobert Mustacchi     lm_rx_mask_t rx_filter_mask[LM_CLI_IDX_MAX];
252d14abf15SRobert Mustacchi 
253d14abf15SRobert Mustacchi     int          checksum;
254d14abf15SRobert Mustacchi     lm_offload_t enabled_oflds;
255d14abf15SRobert Mustacchi 
256d14abf15SRobert Mustacchi     boolean_t    lsoEnable;
257d14abf15SRobert Mustacchi 
258d14abf15SRobert Mustacchi     boolean_t    logEnable;
259d14abf15SRobert Mustacchi 
260d14abf15SRobert Mustacchi     boolean_t    fcoeEnable;
261d14abf15SRobert Mustacchi 
262d14abf15SRobert Mustacchi     boolean_t    linkRemoteFaultDetect;
263d14abf15SRobert Mustacchi 
264d14abf15SRobert Mustacchi     lm_status_t  lastIndLink;
265d14abf15SRobert Mustacchi     lm_medium_t  lastIndMedium;
266d14abf15SRobert Mustacchi 
267d14abf15SRobert Mustacchi     uint32_t     debug_level;
268d14abf15SRobert Mustacchi } BnxeDevParams;
269d14abf15SRobert Mustacchi 
270d14abf15SRobert Mustacchi 
271d14abf15SRobert Mustacchi typedef struct _BnxeLinkCfg
272d14abf15SRobert Mustacchi {
273d14abf15SRobert Mustacchi     boolean_t link_autoneg;
274d14abf15SRobert Mustacchi     boolean_t param_20000fdx;
275d14abf15SRobert Mustacchi     boolean_t param_10000fdx;
276d14abf15SRobert Mustacchi     boolean_t param_2500fdx;
277d14abf15SRobert Mustacchi     boolean_t param_1000fdx;
278d14abf15SRobert Mustacchi     boolean_t param_100fdx;
279d14abf15SRobert Mustacchi     boolean_t param_100hdx;
280d14abf15SRobert Mustacchi     boolean_t param_10fdx;
281d14abf15SRobert Mustacchi     boolean_t param_10hdx;
282d14abf15SRobert Mustacchi     boolean_t param_txpause;
283d14abf15SRobert Mustacchi     boolean_t param_rxpause;
284d14abf15SRobert Mustacchi } BnxeLinkCfg;
285d14abf15SRobert Mustacchi 
286d14abf15SRobert Mustacchi 
287d14abf15SRobert Mustacchi typedef struct _BnxePhyCfg
288d14abf15SRobert Mustacchi {
289d14abf15SRobert Mustacchi     BnxeLinkCfg lnkcfg;
290d14abf15SRobert Mustacchi     boolean_t   flow_autoneg;
291d14abf15SRobert Mustacchi     u32_t       supported[ELINK_LINK_CONFIG_SIZE];
292d14abf15SRobert Mustacchi     u32_t       phy_cfg_size;
293d14abf15SRobert Mustacchi } BnxePhyCfg;
294d14abf15SRobert Mustacchi 
295d14abf15SRobert Mustacchi 
296d14abf15SRobert Mustacchi typedef struct _BnxeProps
297d14abf15SRobert Mustacchi {
298d14abf15SRobert Mustacchi     u32_t             link_speed;
299d14abf15SRobert Mustacchi     boolean_t         link_duplex;
300d14abf15SRobert Mustacchi     boolean_t         link_txpause;
301d14abf15SRobert Mustacchi     boolean_t         link_rxpause;
302d14abf15SRobert Mustacchi     time_t            uptime;
303d14abf15SRobert Mustacchi } BnxeProps;
304d14abf15SRobert Mustacchi 
305d14abf15SRobert Mustacchi 
306d14abf15SRobert Mustacchi typedef struct _BnxeMemBlock
307d14abf15SRobert Mustacchi {
308d14abf15SRobert Mustacchi     d_list_entry_t link;
309d14abf15SRobert Mustacchi     u32_t          size;
310d14abf15SRobert Mustacchi     void *         pBuf;
311d14abf15SRobert Mustacchi     char           fileName[128];
312d14abf15SRobert Mustacchi     u32_t          fileLine;
313d14abf15SRobert Mustacchi } BnxeMemBlock;
314d14abf15SRobert Mustacchi 
315d14abf15SRobert Mustacchi 
316d14abf15SRobert Mustacchi typedef struct _BnxeMemDma
317d14abf15SRobert Mustacchi {
318d14abf15SRobert Mustacchi     d_list_entry_t   link;
319d14abf15SRobert Mustacchi     u32_t            size;
320d14abf15SRobert Mustacchi     void *           pDmaVirt;
321d14abf15SRobert Mustacchi     ddi_dma_handle_t dmaHandle;
322d14abf15SRobert Mustacchi     ddi_acc_handle_t dmaAccHandle;
323d14abf15SRobert Mustacchi     lm_address_t     physAddr;
324d14abf15SRobert Mustacchi     char             fileName[128];
325d14abf15SRobert Mustacchi     u32_t            fileLine;
326d14abf15SRobert Mustacchi } BnxeMemDma;
327d14abf15SRobert Mustacchi 
328d14abf15SRobert Mustacchi 
329d14abf15SRobert Mustacchi typedef struct _BnxeMemRegion
330d14abf15SRobert Mustacchi {
331d14abf15SRobert Mustacchi     d_list_entry_t   link;
332d14abf15SRobert Mustacchi     lm_address_t     baseAddr;
333d14abf15SRobert Mustacchi     u32_t            regNumber;
334d14abf15SRobert Mustacchi     offset_t         offset;
335d14abf15SRobert Mustacchi     u32_t            size;
336d14abf15SRobert Mustacchi     ddi_acc_handle_t regAccess;
337d14abf15SRobert Mustacchi     caddr_t          pRegAddr;
338d14abf15SRobert Mustacchi } BnxeMemRegion;
339d14abf15SRobert Mustacchi 
340d14abf15SRobert Mustacchi 
341d14abf15SRobert Mustacchi typedef struct _um_txpacket_t
342d14abf15SRobert Mustacchi {
343d14abf15SRobert Mustacchi     lm_packet_t      lm_pkt; /* must be the first entry */
344d14abf15SRobert Mustacchi     lm_pkt_tx_info_t tx_info;
345d14abf15SRobert Mustacchi 
346d14abf15SRobert Mustacchi     mblk_t *         pMblk;
347d14abf15SRobert Mustacchi 
348d14abf15SRobert Mustacchi     ddi_dma_handle_t cbDmaHandle;    /* cb = copy buffer */
349d14abf15SRobert Mustacchi     ddi_acc_handle_t cbDmaAccHandle;
350d14abf15SRobert Mustacchi     caddr_t          pCbBuf;
351d14abf15SRobert Mustacchi     lm_address_t     cbPhysAddr;
352d14abf15SRobert Mustacchi 
353d14abf15SRobert Mustacchi     u32_t            cbLength;
354d14abf15SRobert Mustacchi     u32_t            num_handles; /* number of handles used for pkt */
355d14abf15SRobert Mustacchi     ddi_dma_handle_t dmaHandles[BNXE_MAX_DMA_HANDLES_PER_PKT];
356d14abf15SRobert Mustacchi 
357d14abf15SRobert Mustacchi     lm_frag_list_t   frag_list;
358d14abf15SRobert Mustacchi     lm_frag_t        frag_list_buffer[BNXE_MAX_DMA_FRAGS_PER_PKT];
359d14abf15SRobert Mustacchi } um_txpacket_t;
360d14abf15SRobert Mustacchi 
361d14abf15SRobert Mustacchi 
362d14abf15SRobert Mustacchi typedef struct _TxQueue
363d14abf15SRobert Mustacchi {
364d14abf15SRobert Mustacchi     void *            pUM; /* backpointer to um_device_t */
365d14abf15SRobert Mustacchi     u32_t             idx; /* this ring's index */
366d14abf15SRobert Mustacchi 
367d14abf15SRobert Mustacchi     mac_ring_handle_t ringHandle;
368d14abf15SRobert Mustacchi 
369d14abf15SRobert Mustacchi     u32_t             desc_cnt;     /* number of Tx descriptors */
370d14abf15SRobert Mustacchi 
371d14abf15SRobert Mustacchi     u32_t             txFailed;
372d14abf15SRobert Mustacchi     u32_t             txDiscards;
373d14abf15SRobert Mustacchi     u32_t             txRecycle;
374d14abf15SRobert Mustacchi     u32_t             txCopied;
375d14abf15SRobert Mustacchi     u32_t             txBlocked;
376d14abf15SRobert Mustacchi     u32_t             txWait;
377d14abf15SRobert Mustacchi     u32_t             txLowWater;
378d14abf15SRobert Mustacchi 
379d14abf15SRobert Mustacchi     u32_t             thresh_pdwm;  /* low resource water marks */
380d14abf15SRobert Mustacchi 
381d14abf15SRobert Mustacchi     kmutex_t          txMutex;
382d14abf15SRobert Mustacchi 
383d14abf15SRobert Mustacchi     s_list_t          sentTxQ;      /* bds that have been sent and are ready to be freed */
384d14abf15SRobert Mustacchi 
385d14abf15SRobert Mustacchi     kmutex_t          freeTxDescMutex;
386d14abf15SRobert Mustacchi     s_list_t          freeTxDescQ;  /* bds that are free for use */
387d14abf15SRobert Mustacchi 
388d14abf15SRobert Mustacchi     s_list_t          waitTxDescQ;  /* bds that are setup and waiting for tx (lock w/ tx mutex) */
389d14abf15SRobert Mustacchi 
390d14abf15SRobert Mustacchi     u32_t             noTxCredits;
391d14abf15SRobert Mustacchi } TxQueue;
392d14abf15SRobert Mustacchi 
393d14abf15SRobert Mustacchi 
394d14abf15SRobert Mustacchi typedef struct _um_rxpacket_t
395d14abf15SRobert Mustacchi {
396d14abf15SRobert Mustacchi     lm_packet_t      lm_pkt; /* must be first entry */
397d14abf15SRobert Mustacchi     lm_pkt_rx_info_t rx_info;
398d14abf15SRobert Mustacchi     u32_t            hash_value;
399d14abf15SRobert Mustacchi 
400d14abf15SRobert Mustacchi     frtn_t           freeRtn;
401d14abf15SRobert Mustacchi     void *           pUM; /* backpointer to um_device_t for free routine */
402d14abf15SRobert Mustacchi     int              idx; /* chain index used by the free routine */
403d14abf15SRobert Mustacchi 
404d14abf15SRobert Mustacchi     u32_t            signature;
405d14abf15SRobert Mustacchi 
406d14abf15SRobert Mustacchi     ddi_dma_handle_t dmaHandle;
407d14abf15SRobert Mustacchi     ddi_acc_handle_t dmaAccHandle;
408d14abf15SRobert Mustacchi } um_rxpacket_t;
409d14abf15SRobert Mustacchi 
410d14abf15SRobert Mustacchi 
411d14abf15SRobert Mustacchi typedef struct _RxQueue
412d14abf15SRobert Mustacchi {
413d14abf15SRobert Mustacchi     void *            pUM; /* backpointer to um_device_t */
414d14abf15SRobert Mustacchi     u32_t             idx; /* this ring's index */
415d14abf15SRobert Mustacchi 
416d14abf15SRobert Mustacchi     mac_ring_handle_t ringHandle;
417d14abf15SRobert Mustacchi     uint64_t          genNumber; /* set by mac and passed up in mac_ring_rx */
418d14abf15SRobert Mustacchi 
419d14abf15SRobert Mustacchi     volatile u32_t    inPollMode;
420d14abf15SRobert Mustacchi     u8_t              intrDisableCnt;
421d14abf15SRobert Mustacchi     u8_t              intrEnableCnt;
422d14abf15SRobert Mustacchi     u8_t              pollCnt;
423d14abf15SRobert Mustacchi 
424d14abf15SRobert Mustacchi     u32_t             rxDiscards;
425d14abf15SRobert Mustacchi     u32_t             rxCopied;
426d14abf15SRobert Mustacchi     u32_t             rxLowWater;
427d14abf15SRobert Mustacchi     u32_t             rxBufUpInStack;
428d14abf15SRobert Mustacchi 
429d14abf15SRobert Mustacchi     kmutex_t          rxMutex;
430d14abf15SRobert Mustacchi 
431d14abf15SRobert Mustacchi     kmutex_t          doneRxMutex;
432d14abf15SRobert Mustacchi     s_list_t          doneRxQ;  /* free bds that are ready to be posted */
433d14abf15SRobert Mustacchi 
434d14abf15SRobert Mustacchi     s_list_t          waitRxQ; /* packet waiting to be sent up */
435d14abf15SRobert Mustacchi } RxQueue;
436d14abf15SRobert Mustacchi 
437d14abf15SRobert Mustacchi 
438d14abf15SRobert Mustacchi typedef struct _RxQueueGroup
439d14abf15SRobert Mustacchi {
440d14abf15SRobert Mustacchi     void *             pUM; /* backpointer to um_device_t */
441d14abf15SRobert Mustacchi     u32_t              idx; /* this group's index */
442d14abf15SRobert Mustacchi     mac_group_handle_t groupHandle;
443d14abf15SRobert Mustacchi } RxQueueGroup;
444d14abf15SRobert Mustacchi 
445d14abf15SRobert Mustacchi 
446d14abf15SRobert Mustacchi typedef struct _KstatRingMap
447d14abf15SRobert Mustacchi {
448d14abf15SRobert Mustacchi     u32_t  idx;  /* ring index */
449d14abf15SRobert Mustacchi     void * pUM;  /* reference back to um_device_t */
450d14abf15SRobert Mustacchi } KstatRingMap;
451d14abf15SRobert Mustacchi 
452d14abf15SRobert Mustacchi 
453d14abf15SRobert Mustacchi typedef struct _BnxeFcoeState
454d14abf15SRobert Mustacchi {
455d14abf15SRobert Mustacchi     lm_fcoe_state_t lm_fcoe;
456d14abf15SRobert Mustacchi } BnxeFcoeState;
457d14abf15SRobert Mustacchi 
458d14abf15SRobert Mustacchi 
459d14abf15SRobert Mustacchi typedef struct _BnxeClientStats
460d14abf15SRobert Mustacchi {
461d14abf15SRobert Mustacchi     u32_t initWqeTx;
462d14abf15SRobert Mustacchi     u32_t initWqeTxErr;
463d14abf15SRobert Mustacchi     u32_t initCqeRx;
464d14abf15SRobert Mustacchi     u32_t initCqeRxErr;
465d14abf15SRobert Mustacchi     u32_t offloadConnWqeTx;
466d14abf15SRobert Mustacchi     u32_t offloadConnWqeTxErr;
467d14abf15SRobert Mustacchi     u32_t offloadConnCqeRx;
468d14abf15SRobert Mustacchi     u32_t offloadConnCqeRxErr;
469d14abf15SRobert Mustacchi     u32_t enableConnWqeTx;
470d14abf15SRobert Mustacchi     u32_t enableConnWqeTxErr;
471d14abf15SRobert Mustacchi     u32_t enableConnCqeRx;
472d14abf15SRobert Mustacchi     u32_t enableConnCqeRxErr;
473d14abf15SRobert Mustacchi     u32_t disableConnWqeTx;
474d14abf15SRobert Mustacchi     u32_t disableConnWqeTxErr;
475d14abf15SRobert Mustacchi     u32_t disableConnCqeRx;
476d14abf15SRobert Mustacchi     u32_t disableConnCqeRxErr;
477d14abf15SRobert Mustacchi     u32_t destroyConnWqeTx;
478d14abf15SRobert Mustacchi     u32_t destroyConnWqeTxErr;
479d14abf15SRobert Mustacchi     u32_t destroyConnCqeRx;
480d14abf15SRobert Mustacchi     u32_t destroyConnCqeRxErr;
481d14abf15SRobert Mustacchi     u32_t destroyWqeTx;
482d14abf15SRobert Mustacchi     u32_t destroyWqeTxErr;
483d14abf15SRobert Mustacchi     u32_t destroyCqeRx;
484d14abf15SRobert Mustacchi     u32_t destroyCqeRxErr;
485d14abf15SRobert Mustacchi     u32_t compRequestCqeRx;
486d14abf15SRobert Mustacchi     u32_t compRequestCqeRxErr;
487d14abf15SRobert Mustacchi     u32_t statWqeTx;
488d14abf15SRobert Mustacchi     u32_t statWqeTxErr;
489d14abf15SRobert Mustacchi     u32_t statCqeRx;
490d14abf15SRobert Mustacchi     u32_t statCqeRxErr;
491d14abf15SRobert Mustacchi } BnxeClientStats;
492d14abf15SRobert Mustacchi 
493d14abf15SRobert Mustacchi 
494d14abf15SRobert Mustacchi typedef struct _BnxeFcoeData
495d14abf15SRobert Mustacchi {
496d14abf15SRobert Mustacchi     dev_info_t *    pDev;
497d14abf15SRobert Mustacchi     BnxeBinding     bind;
498d14abf15SRobert Mustacchi     BnxeClientStats stats;
499d14abf15SRobert Mustacchi     BnxeWwnInfo     wwn;
500d14abf15SRobert Mustacchi } BnxeFcoeData;
501d14abf15SRobert Mustacchi 
502d14abf15SRobert Mustacchi 
503d14abf15SRobert Mustacchi typedef struct _BnxeIntrBlock
504d14abf15SRobert Mustacchi {
505d14abf15SRobert Mustacchi     int                 intrCount;
506d14abf15SRobert Mustacchi     int                 intrCapability;
507d14abf15SRobert Mustacchi     u32_t               intrPriority;
508d14abf15SRobert Mustacchi     u32_t               intrHandleBlockSize;
509d14abf15SRobert Mustacchi     ddi_intr_handle_t * pIntrHandleBlockAlloc;
510d14abf15SRobert Mustacchi     ddi_intr_handle_t * pIntrHandleBlock;
511d14abf15SRobert Mustacchi } BnxeIntrBlock;
512d14abf15SRobert Mustacchi 
513d14abf15SRobert Mustacchi 
514d14abf15SRobert Mustacchi typedef struct _BnxeWorkQueueInstance
515d14abf15SRobert Mustacchi {
516d14abf15SRobert Mustacchi     void *        pUM;
517d14abf15SRobert Mustacchi 
518d14abf15SRobert Mustacchi     char          taskqName[BNXE_STR_SIZE];
519d14abf15SRobert Mustacchi     ddi_taskq_t * pTaskq;
520d14abf15SRobert Mustacchi     kmutex_t      workQueueMutex;
521d14abf15SRobert Mustacchi     s_list_t      workQueue;
522d14abf15SRobert Mustacchi 
523d14abf15SRobert Mustacchi     u32_t         workItemQueued;
524d14abf15SRobert Mustacchi     u32_t         workItemError;
525d14abf15SRobert Mustacchi     u32_t         workItemComplete;
526d14abf15SRobert Mustacchi     u32_t         highWater;
527d14abf15SRobert Mustacchi } BnxeWorkQueueInstance;
528d14abf15SRobert Mustacchi 
529d14abf15SRobert Mustacchi 
530d14abf15SRobert Mustacchi typedef struct _BnxeWorkQueues
531d14abf15SRobert Mustacchi {
532d14abf15SRobert Mustacchi     BnxeWorkQueueInstance instq;  /* instant, single thread serialized */
533d14abf15SRobert Mustacchi     BnxeWorkQueueInstance delayq; /* delayed, multi thread not serialized */
534d14abf15SRobert Mustacchi } BnxeWorkQueues;
535d14abf15SRobert Mustacchi 
536d14abf15SRobert Mustacchi 
537d14abf15SRobert Mustacchi /* the following are used against the clientState variable in um_device_t */
538d14abf15SRobert Mustacchi 
539d14abf15SRobert Mustacchi #define CLIENT_FLG_DEVI  0x001
540d14abf15SRobert Mustacchi #define CLIENT_FLG_BIND  0x002
541d14abf15SRobert Mustacchi #define CLIENT_FLG_HW    0x004
542d14abf15SRobert Mustacchi 
543d14abf15SRobert Mustacchi #define CLIENT_DEVI(pUM, client) \
544d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] & CLIENT_FLG_DEVI)
545d14abf15SRobert Mustacchi 
546d14abf15SRobert Mustacchi #define CLIENT_HW(pUM, client) \
547d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] & CLIENT_FLG_HW)
548d14abf15SRobert Mustacchi 
549d14abf15SRobert Mustacchi #define CLIENT_BOUND(pUM, client) \
550d14abf15SRobert Mustacchi     (((client) == LM_CLI_IDX_NDIS)                      ? \
551d14abf15SRobert Mustacchi          ((pUM)->clientState[(client)] & CLIENT_FLG_HW) : \
552d14abf15SRobert Mustacchi          ((pUM)->clientState[(client)] & CLIENT_FLG_BIND))
553d14abf15SRobert Mustacchi 
554d14abf15SRobert Mustacchi #define CLIENT_DEVI_SET(pUM, client) \
555d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] |= CLIENT_FLG_DEVI)
556d14abf15SRobert Mustacchi 
557d14abf15SRobert Mustacchi #define CLIENT_DEVI_RESET(pUM, client) \
558d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] &= ~CLIENT_FLG_DEVI)
559d14abf15SRobert Mustacchi 
560d14abf15SRobert Mustacchi #define CLIENT_BIND_SET(pUM, client) \
561d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] |= CLIENT_FLG_BIND)
562d14abf15SRobert Mustacchi 
563d14abf15SRobert Mustacchi #define CLIENT_BIND_RESET(pUM, client) \
564d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] &= ~CLIENT_FLG_BIND)
565d14abf15SRobert Mustacchi 
566d14abf15SRobert Mustacchi #define CLIENT_HW_SET(pUM, client) \
567d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] |= CLIENT_FLG_HW)
568d14abf15SRobert Mustacchi 
569d14abf15SRobert Mustacchi #define CLIENT_HW_RESET(pUM, client) \
570d14abf15SRobert Mustacchi     ((pUM)->clientState[(client)] &= ~CLIENT_FLG_HW)
571d14abf15SRobert Mustacchi 
572d14abf15SRobert Mustacchi 
573d14abf15SRobert Mustacchi typedef struct _um_device
574d14abf15SRobert Mustacchi {
575d14abf15SRobert Mustacchi     lm_device_t           lm_dev;  /* must be the first element */
576d14abf15SRobert Mustacchi 
577d14abf15SRobert Mustacchi     u32_t                 magic;
578d14abf15SRobert Mustacchi     dev_info_t *          pDev;
579d14abf15SRobert Mustacchi 
580d14abf15SRobert Mustacchi     u32_t                 hwInitDone;
581d14abf15SRobert Mustacchi     u32_t                 chipStarted;
582d14abf15SRobert Mustacchi     u32_t                 clientState[LM_CLI_IDX_MAX];
583d14abf15SRobert Mustacchi 
584d14abf15SRobert Mustacchi     d_list_t              memBlockList;
585d14abf15SRobert Mustacchi     d_list_t              memDmaList;
586d14abf15SRobert Mustacchi     d_list_t              memRegionList;
587d14abf15SRobert Mustacchi #ifdef BNXE_DEBUG_DMA_LIST
588d14abf15SRobert Mustacchi     d_list_t              memDmaListSaved;
589d14abf15SRobert Mustacchi #endif
590d14abf15SRobert Mustacchi 
591d14abf15SRobert Mustacchi     int                   instance;
592d14abf15SRobert Mustacchi     char                  devName[BNXE_STR_SIZE];
593d14abf15SRobert Mustacchi     char                  version[BNXE_STR_SIZE];
594d14abf15SRobert Mustacchi     char                  versionLM[BNXE_STR_SIZE];
595d14abf15SRobert Mustacchi     char                  versionFW[BNXE_STR_SIZE];
596d14abf15SRobert Mustacchi     char                  versionBC[BNXE_STR_SIZE];
597d14abf15SRobert Mustacchi     char                  chipName[BNXE_STR_SIZE];
598d14abf15SRobert Mustacchi     char                  chipID[BNXE_STR_SIZE];
599d14abf15SRobert Mustacchi     char                  intrAlloc[BNXE_STR_SIZE];
600d14abf15SRobert Mustacchi     char                  bus_dev_func[BNXE_STR_SIZE];
601d14abf15SRobert Mustacchi     char                  vendor_device[BNXE_STR_SIZE];
602d14abf15SRobert Mustacchi 
603d14abf15SRobert Mustacchi     volatile u32_t        plumbed;
604d14abf15SRobert Mustacchi 
605d14abf15SRobert Mustacchi     ddi_acc_handle_t      pPciCfg;
606d14abf15SRobert Mustacchi 
607d14abf15SRobert Mustacchi     kmutex_t              intrMutex[MAX_RSS_CHAINS + 1];
608d14abf15SRobert Mustacchi     kmutex_t              intrFlipMutex[MAX_RSS_CHAINS + 1];
609d14abf15SRobert Mustacchi     kmutex_t              sbMutex[MAX_RSS_CHAINS + 1];
610d14abf15SRobert Mustacchi     kmutex_t              ethConMutex;
611d14abf15SRobert Mustacchi     kmutex_t              mcpMutex;
612d14abf15SRobert Mustacchi     kmutex_t              phyMutex;
613d14abf15SRobert Mustacchi     kmutex_t              indMutex;
614d14abf15SRobert Mustacchi     kmutex_t              cidMutex;
615d14abf15SRobert Mustacchi     kmutex_t              spqMutex;   /* slow path queue lock */
616d14abf15SRobert Mustacchi     kmutex_t              spReqMutex; /* slow path request manager lock */
617d14abf15SRobert Mustacchi     kmutex_t              rrReqMutex; /* ramrod request */
618d14abf15SRobert Mustacchi     kmutex_t              islesCtrlMutex;
619d14abf15SRobert Mustacchi     kmutex_t              toeMutex;
620d14abf15SRobert Mustacchi     kmutex_t              memMutex;
621d14abf15SRobert Mustacchi     kmutex_t              offloadMutex;
622d14abf15SRobert Mustacchi     kmutex_t              hwInitMutex;
623d14abf15SRobert Mustacchi     kmutex_t              gldMutex;
624d14abf15SRobert Mustacchi     krwlock_t             gldTxMutex;
625d14abf15SRobert Mustacchi 
626d14abf15SRobert Mustacchi     kmutex_t              timerMutex;
627d14abf15SRobert Mustacchi     volatile u32_t        timerEnabled;
628d14abf15SRobert Mustacchi     timeout_id_t          timerID;
629d14abf15SRobert Mustacchi 
630d14abf15SRobert Mustacchi     BnxeWorkQueues        workqs;
631d14abf15SRobert Mustacchi 
632d14abf15SRobert Mustacchi     BnxeMemDma *          statusBlocks[MAX_RSS_CHAINS + 1];
633d14abf15SRobert Mustacchi     volatile u32_t        intrEnabled;
634d14abf15SRobert Mustacchi     u64_t                 intrFired;
635d14abf15SRobert Mustacchi                           /* the arrays below = LM_SB_CNT() + 1 = 17 */
636d14abf15SRobert Mustacchi     u64_t                 intrSbCnt[MAX_RSS_CHAINS + 1];
637d14abf15SRobert Mustacchi     u64_t                 intrSbNoChangeCnt[MAX_RSS_CHAINS + 1];
638d14abf15SRobert Mustacchi     u64_t                 intrSbPollCnt[MAX_RSS_CHAINS + 1];
639d14abf15SRobert Mustacchi     u64_t                 intrSbPollNoChangeCnt[MAX_RSS_CHAINS + 1];
640d14abf15SRobert Mustacchi 
641d14abf15SRobert Mustacchi     int                   intrType;
642d14abf15SRobert Mustacchi     u32_t                 intrPriority;
643d14abf15SRobert Mustacchi     BnxeIntrBlock         defIntr;
644d14abf15SRobert Mustacchi     BnxeIntrBlock         rssIntr;
645d14abf15SRobert Mustacchi     BnxeIntrBlock         fcoeIntr;
646d14abf15SRobert Mustacchi 
647d14abf15SRobert Mustacchi     BnxeDevParams         devParams;
648d14abf15SRobert Mustacchi     mac_handle_t          pMac;
649d14abf15SRobert Mustacchi     mac_resource_handle_t macRxResourceHandles[MAX_ETH_REG_CONS];
650d14abf15SRobert Mustacchi     u8_t                  gldMac[ETHERNET_ADDRESS_SIZE];
651d14abf15SRobert Mustacchi 
652d14abf15SRobert Mustacchi     d_list_t              mcast_l2;
653d14abf15SRobert Mustacchi     d_list_t              mcast_fcoe;
654d14abf15SRobert Mustacchi 
655d14abf15SRobert Mustacchi     u32_t                 ucastTableLen; /* number of ucast addrs in the table */
656d14abf15SRobert Mustacchi #ifndef LM_MAX_UC_TABLE_SIZE
657d14abf15SRobert Mustacchi #define LM_MAX_UC_TABLE_SIZE 1 /* for now, fix needed to support multiple ucast addr */
658d14abf15SRobert Mustacchi #endif
659d14abf15SRobert Mustacchi 
660d14abf15SRobert Mustacchi     TxQueue               txq[MAX_ETH_CONS];
661d14abf15SRobert Mustacchi     RxQueue               rxq[MAX_ETH_CONS];
662d14abf15SRobert Mustacchi     RxQueueGroup          rxqGroup[USER_OPTION_RX_RING_GROUPS_MAX];
663d14abf15SRobert Mustacchi     u32_t                 rxBufSignature[LM_CLI_IDX_MAX];
664d14abf15SRobert Mustacchi     u32_t                 txMsgPullUp;
665d14abf15SRobert Mustacchi 
666d14abf15SRobert Mustacchi     BnxeProps             props;
667d14abf15SRobert Mustacchi     BnxePhyCfg            hwinit; /* gathered by BnxeCfgInit */
668d14abf15SRobert Mustacchi     BnxePhyCfg            curcfg; /* initialized from hwinit by BnxeCfgReset */
669d14abf15SRobert Mustacchi     BnxeLinkCfg           remote;
670d14abf15SRobert Mustacchi     u32_t                 phyInitialized;
671d14abf15SRobert Mustacchi 
672d14abf15SRobert Mustacchi     kstat_t *             kstats;
673d14abf15SRobert Mustacchi     kstat_t *             kstatsLink;
674d14abf15SRobert Mustacchi     kstat_t *             kstatsIntr;
675d14abf15SRobert Mustacchi     kstat_t *             kstatsL2Chip;
676d14abf15SRobert Mustacchi     kstat_t *             kstatsL2Driver;
677d14abf15SRobert Mustacchi     kstat_t *             kstatsL2Stats;
678d14abf15SRobert Mustacchi     kstat_t *             kstatsFcoe;
679d14abf15SRobert Mustacchi     kstat_t *             kstatsDcbx;
680d14abf15SRobert Mustacchi     kstat_t *             kstats_rxq[MAX_ETH_CONS];
681d14abf15SRobert Mustacchi     KstatRingMap          kstats_rxq_map[MAX_ETH_CONS];
682d14abf15SRobert Mustacchi     kstat_t *             kstats_txq[MAX_ETH_CONS];
683d14abf15SRobert Mustacchi     KstatRingMap          kstats_txq_map[MAX_ETH_CONS];
684d14abf15SRobert Mustacchi     kmutex_t              kstatMutex;
685d14abf15SRobert Mustacchi 
686d14abf15SRobert Mustacchi     int                   fmCapabilities; /* FMA capabilities */
687d14abf15SRobert Mustacchi 
688d14abf15SRobert Mustacchi     boolean_t              do_fcoe;
689d14abf15SRobert Mustacchi     BnxeFcoeData           fcoe;
690d14abf15SRobert Mustacchi     iscsi_info_block_hdr_t iscsiInfo;
691d14abf15SRobert Mustacchi 
692d14abf15SRobert Mustacchi } um_device_t;
693d14abf15SRobert Mustacchi 
694d14abf15SRobert Mustacchi 
695d14abf15SRobert Mustacchi /* mioc[ack|nak] return values from ioctl subroutines */
696d14abf15SRobert Mustacchi enum ioc_reply
697d14abf15SRobert Mustacchi {
698d14abf15SRobert Mustacchi     IOC_INVAL = -1,   /* bad, NAK with EINVAL */
699d14abf15SRobert Mustacchi     IOC_DONE,         /* OK, reply sent       */
700d14abf15SRobert Mustacchi     IOC_ACK,          /* OK, just send ACK    */
701d14abf15SRobert Mustacchi     IOC_REPLY,        /* OK, just send reply  */
702d14abf15SRobert Mustacchi     IOC_RESTART_ACK,  /* OK, restart & ACK    */
703d14abf15SRobert Mustacchi     IOC_RESTART_REPLY /* OK, restart & reply  */
704d14abf15SRobert Mustacchi };
705d14abf15SRobert Mustacchi 
706d14abf15SRobert Mustacchi 
707d14abf15SRobert Mustacchi #define BNXE_IOC_BASE ('X' << 8)
708d14abf15SRobert Mustacchi /* IOCTLs for get/set lldp and dcbx params */
709d14abf15SRobert Mustacchi #define GIOCBNXELLDP  (BNXE_IOC_BASE + 0)
710d14abf15SRobert Mustacchi #define GIOCBNXEDCBX  (BNXE_IOC_BASE + 1)
711d14abf15SRobert Mustacchi #define SIOCBNXEDCBX  (BNXE_IOC_BASE + 2)
712d14abf15SRobert Mustacchi /* IOCTLs for edebug and firmware upgrade */
713d14abf15SRobert Mustacchi #define GIOCBNXEREG   (BNXE_IOC_BASE + 3)
714d14abf15SRobert Mustacchi #define SIOCBNXEREG   (BNXE_IOC_BASE + 4)
715d14abf15SRobert Mustacchi #define GIOCBNXENVRM  (BNXE_IOC_BASE + 5)
716d14abf15SRobert Mustacchi #define SIOCBNXENVRM  (BNXE_IOC_BASE + 6)
717d14abf15SRobert Mustacchi #define GIOCBNXEPCI   (BNXE_IOC_BASE + 7)
718d14abf15SRobert Mustacchi #define GIOCBNXESTATS (BNXE_IOC_BASE + 8)
719d14abf15SRobert Mustacchi 
720d14abf15SRobert Mustacchi struct bnxe_reg_data
721d14abf15SRobert Mustacchi {
722d14abf15SRobert Mustacchi     u32_t offset;
723d14abf15SRobert Mustacchi     u32_t value;
724d14abf15SRobert Mustacchi };
725d14abf15SRobert Mustacchi 
726d14abf15SRobert Mustacchi struct bnxe_nvram_data
727d14abf15SRobert Mustacchi {
728d14abf15SRobert Mustacchi     u32_t offset;
729d14abf15SRobert Mustacchi     u32_t num_of_u32;
730d14abf15SRobert Mustacchi     u32_t value[1]; /* variable */
731d14abf15SRobert Mustacchi };
732d14abf15SRobert Mustacchi 
733d14abf15SRobert Mustacchi 
734d14abf15SRobert Mustacchi /* bnxe_cfg.c */
735d14abf15SRobert Mustacchi void BnxeCfgInit(um_device_t * pUM);
736d14abf15SRobert Mustacchi void BnxeCfgReset(um_device_t * pUM);
737d14abf15SRobert Mustacchi 
738d14abf15SRobert Mustacchi /* bnxe_mm.c */
739d14abf15SRobert Mustacchi void BnxeInitBdCnts(um_device_t * pUM,
740d14abf15SRobert Mustacchi                     int           cli_idx);
741d14abf15SRobert Mustacchi 
742d14abf15SRobert Mustacchi /* bnxe_gld.c */
743d14abf15SRobert Mustacchi boolean_t BnxeGldInit(um_device_t * pUM);
744d14abf15SRobert Mustacchi boolean_t BnxeGldFini(um_device_t * pUM);
745d14abf15SRobert Mustacchi void      BnxeGldLink(um_device_t * pUM,
746d14abf15SRobert Mustacchi                       link_state_t  state);
747d14abf15SRobert Mustacchi 
748d14abf15SRobert Mustacchi /* bnxe_hw.c */
749d14abf15SRobert Mustacchi boolean_t BnxeEstablishHwConn(um_device_t * pUM,
750d14abf15SRobert Mustacchi                               int           cid);
751d14abf15SRobert Mustacchi int       BnxeHwStartFCOE(um_device_t * pUM);
752d14abf15SRobert Mustacchi int       BnxeHwStartL2(um_device_t * pUM);
753d14abf15SRobert Mustacchi int       BnxeHwStartCore(um_device_t * pUM);
754d14abf15SRobert Mustacchi void      BnxeHwStopFCOE(um_device_t * pUM);
755d14abf15SRobert Mustacchi void      BnxeHwStopL2(um_device_t * pUM);
756d14abf15SRobert Mustacchi void      BnxeHwStopCore(um_device_t * pUM);
757d14abf15SRobert Mustacchi void      BnxeUpdatePhy(um_device_t * pUM);
758d14abf15SRobert Mustacchi int       BnxeMacAddress(um_device_t *   pUM,
759d14abf15SRobert Mustacchi                          int             cliIdx,
760d14abf15SRobert Mustacchi                          boolean_t       flag,
761d14abf15SRobert Mustacchi                          const uint8_t * pMacAddr);
762d14abf15SRobert Mustacchi int       BnxeMulticast(um_device_t *   pUM,
763d14abf15SRobert Mustacchi                         int             cliIdx,
764d14abf15SRobert Mustacchi                         boolean_t       flag,
765d14abf15SRobert Mustacchi                         const uint8_t * pMcastAddr,
766d14abf15SRobert Mustacchi                         boolean_t       hwSet);
767d14abf15SRobert Mustacchi int       BnxeRxMask(um_device_t * pUM,
768d14abf15SRobert Mustacchi                      int           cliIdx,
769d14abf15SRobert Mustacchi                      lm_rx_mask_t  mask);
770d14abf15SRobert Mustacchi int       BnxeHwResume(um_device_t * pUM);
771d14abf15SRobert Mustacchi int       BnxeHwSuspend(um_device_t * pUM);
772d14abf15SRobert Mustacchi #if (DEVO_REV > 3)
773d14abf15SRobert Mustacchi int       BnxeHwQuiesce(um_device_t * pUM);
774d14abf15SRobert Mustacchi #endif
775d14abf15SRobert Mustacchi 
776d14abf15SRobert Mustacchi /* bnxe_intr.c */
777d14abf15SRobert Mustacchi void      BnxeIntrIguSbEnable(um_device_t * pUM,
778d14abf15SRobert Mustacchi                               u32_t         idx,
779d14abf15SRobert Mustacchi                               boolean_t     fromISR);
780d14abf15SRobert Mustacchi void      BnxeIntrIguSbDisable(um_device_t * pUM,
781d14abf15SRobert Mustacchi                                u32_t         idx,
782d14abf15SRobert Mustacchi                                boolean_t     fromISR);
783d14abf15SRobert Mustacchi void      BnxePollRxRing(um_device_t * pUM,
784d14abf15SRobert Mustacchi                          u32_t         idx,
785d14abf15SRobert Mustacchi                          boolean_t *   pPktsRxed,
786d14abf15SRobert Mustacchi                          boolean_t *   pPktsTxed);
787d14abf15SRobert Mustacchi void      BnxePollRxRingFCOE(um_device_t * pUM);
788d14abf15SRobert Mustacchi int       BnxeIntrEnable(um_device_t * pUM);
789d14abf15SRobert Mustacchi void      BnxeIntrDisable(um_device_t * pUM);
790d14abf15SRobert Mustacchi boolean_t BnxeIntrInit(um_device_t * pUM);
791d14abf15SRobert Mustacchi void      BnxeIntrFini(um_device_t * pUM);
792d14abf15SRobert Mustacchi 
793d14abf15SRobert Mustacchi /* bnxe_kstat.c */
794d14abf15SRobert Mustacchi boolean_t BnxeKstatInit(um_device_t * pUM);
795d14abf15SRobert Mustacchi void      BnxeKstatFini(um_device_t * pUM);
796d14abf15SRobert Mustacchi 
797d14abf15SRobert Mustacchi /* bnxe_rr.c */
798d14abf15SRobert Mustacchi int BnxeRouteTxRing(um_device_t * pUM,
799d14abf15SRobert Mustacchi                     mblk_t *      pMblk);
800d14abf15SRobert Mustacchi 
801d14abf15SRobert Mustacchi /* bnxe_rx.c */
802d14abf15SRobert Mustacchi boolean_t BnxeWaitForPacketsFromClient(um_device_t * pUM,
803d14abf15SRobert Mustacchi                                       int            cliIdx);
804d14abf15SRobert Mustacchi mblk_t *  BnxeRxRingProcess(um_device_t * pUM,
805d14abf15SRobert Mustacchi                             int           idx,
806d14abf15SRobert Mustacchi                             boolean_t     polling,
807d14abf15SRobert Mustacchi                             int           numBytes);
808d14abf15SRobert Mustacchi void      BnxeRxPktsAbort(um_device_t * pUM,
809d14abf15SRobert Mustacchi                           int           cliIdx);
810d14abf15SRobert Mustacchi int       BnxeRxPktsInitPostBuffers(um_device_t * pUM,
811d14abf15SRobert Mustacchi                                     int           cliIdx);
812d14abf15SRobert Mustacchi int       BnxeRxPktsInit(um_device_t * pUM,
813d14abf15SRobert Mustacchi                          int           cliIdx);
814d14abf15SRobert Mustacchi void      BnxeRxPktsFini(um_device_t * pUM,
815d14abf15SRobert Mustacchi                          int           cliIdx);
816d14abf15SRobert Mustacchi 
817d14abf15SRobert Mustacchi /* bnxe_tx.c */
818d14abf15SRobert Mustacchi void BnxeTxPktsReclaim(um_device_t * pUM,
819d14abf15SRobert Mustacchi                        int           idx,
820d14abf15SRobert Mustacchi                        s_list_t *    pPktList);
821d14abf15SRobert Mustacchi void BnxeTxRingProcess(um_device_t * pUM,
822d14abf15SRobert Mustacchi                        int           idx);
823d14abf15SRobert Mustacchi int  BnxeTxSendMblk(um_device_t * pUM,
824d14abf15SRobert Mustacchi                     int           idx,
825d14abf15SRobert Mustacchi                     mblk_t *      pMblk,
826d14abf15SRobert Mustacchi                     u32_t         flags,
827d14abf15SRobert Mustacchi                     u16_t         vlan_tag);
828d14abf15SRobert Mustacchi void BnxeTxPktsAbort(um_device_t * pUM,
829d14abf15SRobert Mustacchi                      int           cliIdx);
830d14abf15SRobert Mustacchi int  BnxeTxPktsInit(um_device_t * pUM,
831d14abf15SRobert Mustacchi                     int           cliIdx);
832d14abf15SRobert Mustacchi void BnxeTxPktsFini(um_device_t * pUM,
833d14abf15SRobert Mustacchi                     int           cliIdx);
834d14abf15SRobert Mustacchi 
835d14abf15SRobert Mustacchi /* bnxe_timer.c */
836d14abf15SRobert Mustacchi void BnxeTimerStart(um_device_t * pUM);
837d14abf15SRobert Mustacchi void BnxeTimerStop(um_device_t * pUM);
838d14abf15SRobert Mustacchi 
839d14abf15SRobert Mustacchi /* bnxe_workq.c */
840d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueInit(um_device_t * pUM);
841d14abf15SRobert Mustacchi void      BnxeWorkQueueWaitAndDestroy(um_device_t * pUM);
842d14abf15SRobert Mustacchi void      BnxeWorkQueueStartPending(um_device_t * pUM);
843d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueAdd(um_device_t * pUM,
844d14abf15SRobert Mustacchi                            void (*pWorkCbk)(um_device_t *, void *, u32_t),
845d14abf15SRobert Mustacchi                            void * pWorkData,
846d14abf15SRobert Mustacchi                            u32_t  workDataLen);
847d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueAddNoCopy(um_device_t * pUM,
848d14abf15SRobert Mustacchi                                  void (*pWorkCbk)(um_device_t *, void *),
849d14abf15SRobert Mustacchi                                  void * pWorkData);
850d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueAddGeneric(um_device_t * pUM,
851d14abf15SRobert Mustacchi                                   void (*pWorkCbkGeneric)(um_device_t *));
852d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueAddDelay(um_device_t * pUM,
853d14abf15SRobert Mustacchi                                 void (*pWorkCbk)(um_device_t *, void *, u32_t),
854d14abf15SRobert Mustacchi                                 void * pWorkData,
855d14abf15SRobert Mustacchi                                 u32_t  workDataLen,
856d14abf15SRobert Mustacchi                                 u32_t  delayMs);
857d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueAddDelayNoCopy(um_device_t * pUM,
858d14abf15SRobert Mustacchi                                       void (*pWorkCbk)(um_device_t *, void *),
859d14abf15SRobert Mustacchi                                       void * pWorkData,
860d14abf15SRobert Mustacchi                                       u32_t  delayMs);
861d14abf15SRobert Mustacchi boolean_t BnxeWorkQueueAddDelayGeneric(um_device_t * pUM,
862d14abf15SRobert Mustacchi                                        void (*pWorkCbkGeneric)(um_device_t *),
863d14abf15SRobert Mustacchi                                        u32_t delayMs);
864d14abf15SRobert Mustacchi 
865d14abf15SRobert Mustacchi /* bnxe_fcoe.c */
866d14abf15SRobert Mustacchi boolean_t BnxeFcoeInitCqe(um_device_t *      pUM,
867d14abf15SRobert Mustacchi                           struct fcoe_kcqe * kcqe);
868d14abf15SRobert Mustacchi boolean_t BnxeFcoeOffloadConnCqe(um_device_t *      pUM,
869d14abf15SRobert Mustacchi                                  BnxeFcoeState *    pFcoeState,
870d14abf15SRobert Mustacchi                                  struct fcoe_kcqe * kcqe);
871d14abf15SRobert Mustacchi boolean_t BnxeFcoeEnableConnCqe(um_device_t *      pUM,
872d14abf15SRobert Mustacchi                                 BnxeFcoeState *    pFcoeState,
873d14abf15SRobert Mustacchi                                 struct fcoe_kcqe * kcqe);
874d14abf15SRobert Mustacchi boolean_t BnxeFcoeDisableConnCqe(um_device_t *      pUM,
875d14abf15SRobert Mustacchi                                  BnxeFcoeState *    pFcoeState,
876d14abf15SRobert Mustacchi                                  struct fcoe_kcqe * kcqe);
877d14abf15SRobert Mustacchi boolean_t BnxeFcoeDestroyConnCqe(um_device_t *      pUM,
878d14abf15SRobert Mustacchi                                  BnxeFcoeState *    pFcoeState,
879d14abf15SRobert Mustacchi                                  struct fcoe_kcqe * kcqe);
880d14abf15SRobert Mustacchi boolean_t BnxeFcoeDestroyCqe(um_device_t *      pUM,
881d14abf15SRobert Mustacchi                              struct fcoe_kcqe * kcqe);
882d14abf15SRobert Mustacchi boolean_t BnxeFcoeStatCqe(um_device_t *      pUM,
883d14abf15SRobert Mustacchi                           struct fcoe_kcqe * kcqe);
884d14abf15SRobert Mustacchi boolean_t BnxeFcoeCompRequestCqe(um_device_t *      pUM,
885d14abf15SRobert Mustacchi                                  struct fcoe_kcqe * kcqes,
886d14abf15SRobert Mustacchi                                  u32_t              num_kcqes);
887d14abf15SRobert Mustacchi boolean_t BnxeFcoePrvCtl(dev_info_t * pDev,
888d14abf15SRobert Mustacchi                          int          cmd,
889d14abf15SRobert Mustacchi                          void *       pData,
890d14abf15SRobert Mustacchi                          int          dataLen);
891d14abf15SRobert Mustacchi mblk_t *  BnxeFcoePrvTx(dev_info_t * pDev,
892d14abf15SRobert Mustacchi                         mblk_t *     pMblk,
893d14abf15SRobert Mustacchi                         u32_t        flags,
894d14abf15SRobert Mustacchi                         u16_t        vlan_tag);
895d14abf15SRobert Mustacchi boolean_t BnxeFcoePrvPoll(dev_info_t * pDev);
896d14abf15SRobert Mustacchi boolean_t BnxeFcoePrvSendWqes(dev_info_t * pDev,
897d14abf15SRobert Mustacchi                               void *       wqes[],
898d14abf15SRobert Mustacchi                               int          wqeCnt);
899d14abf15SRobert Mustacchi boolean_t BnxeFcoePrvMapMailboxq(dev_info_t *       pDev,
900d14abf15SRobert Mustacchi                                  u32_t              cid,
901d14abf15SRobert Mustacchi                                  void **            ppMap,
902d14abf15SRobert Mustacchi                                  ddi_acc_handle_t * pAccHandle);
903d14abf15SRobert Mustacchi boolean_t BnxeFcoePrvUnmapMailboxq(dev_info_t *     pDev,
904d14abf15SRobert Mustacchi                                    u32_t            cid,
905d14abf15SRobert Mustacchi                                    void *           pMap,
906d14abf15SRobert Mustacchi                                    ddi_acc_handle_t accHandle);
907d14abf15SRobert Mustacchi int       BnxeFcoeInit(um_device_t * pUM);
908d14abf15SRobert Mustacchi int       BnxeFcoeFini(um_device_t * pUM);
909d14abf15SRobert Mustacchi void      BnxeFcoeStartStop(um_device_t * pUM);
910d14abf15SRobert Mustacchi 
911d14abf15SRobert Mustacchi /* bnxe_main.c */
912d14abf15SRobert Mustacchi u8_t      BnxeInstance(void * pDev);
913d14abf15SRobert Mustacchi char *    BnxeDevName(void * pDev);
914d14abf15SRobert Mustacchi boolean_t BnxeProtoSupport(um_device_t * pUM, int proto);
915d14abf15SRobert Mustacchi boolean_t BnxeProtoFcoeAfex(um_device_t * pUM);
916d14abf15SRobert Mustacchi int       BnxeCheckAccHandle(ddi_acc_handle_t handle);
917d14abf15SRobert Mustacchi int       BnxeCheckDmaHandle(ddi_dma_handle_t handle);
918d14abf15SRobert Mustacchi void      BnxeFmErrorReport(um_device_t * pUM, char * detail);
919d14abf15SRobert Mustacchi 
920947eaaf6SRobert Mustacchi /* bnxe_illumos.c */
921947eaaf6SRobert Mustacchi extern boolean_t bnxe_fill_transceiver(um_device_t *, void *);
922*b01ab2deSRobert Mustacchi extern mac_ether_media_t bnxe_phy_to_media(um_device_t *);
923947eaaf6SRobert Mustacchi 
924d14abf15SRobert Mustacchi extern kmutex_t bnxeLoaderMutex;
925d14abf15SRobert Mustacchi extern u32_t    bnxeNumPlumbed;
926d14abf15SRobert Mustacchi 
927d14abf15SRobert Mustacchi extern BnxeLinkCfg bnxeLinkCfg;
928d14abf15SRobert Mustacchi 
929d14abf15SRobert Mustacchi /* undefine this to help with dtrace analysis */
930d14abf15SRobert Mustacchi #define BNXE_LOCKS_INLINE
931d14abf15SRobert Mustacchi 
932d14abf15SRobert Mustacchi #ifdef BNXE_LOCKS_INLINE
933d14abf15SRobert Mustacchi 
934d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_INTR(pUM, idx)      mutex_enter(&(pUM)->intrMutex[(idx)])
935d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_INTR(pUM, idx)       mutex_exit(&(pUM)->intrMutex[(idx)])
936d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_INTR_FLIP(pUM, idx) mutex_enter(&(pUM)->intrFlipMutex[(idx)])
937d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_INTR_FLIP(pUM, idx)  mutex_exit(&(pUM)->intrFlipMutex[(idx)])
938d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_TX(pUM, idx)        mutex_enter(&(pUM)->txq[(idx)].txMutex)
939d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_TX(pUM, idx)         mutex_exit(&(pUM)->txq[(idx)].txMutex)
940d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_FREETX(pUM, idx)    mutex_enter(&(pUM)->txq[(idx)].freeTxDescMutex)
941d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_FREETX(pUM, idx)     mutex_exit(&(pUM)->txq[(idx)].freeTxDescMutex)
942d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_RX(pUM, idx)        mutex_enter(&(pUM)->rxq[(idx)].rxMutex)
943d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_RX(pUM, idx)         mutex_exit(&(pUM)->rxq[(idx)].rxMutex)
944d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_DONERX(pUM, idx)    mutex_enter(&(pUM)->rxq[(idx)].doneRxMutex)
945d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_DONERX(pUM, idx)     mutex_exit(&(pUM)->rxq[(idx)].doneRxMutex)
946d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_SB(pUM, idx)        mutex_enter(&(pUM)->sbMutex[(idx)])
947d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_SB(pUM, idx)         mutex_exit(&(pUM)->sbMutex[(idx)])
948d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_ETH_CON(pUM)        mutex_enter(&(pUM)->ethConMutex)
949d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_ETH_CON(pUM)         mutex_exit(&(pUM)->ethConMutex)
950d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_MCP(pUM)            mutex_enter(&(pUM)->mcpMutex)
951d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_MCP(pUM)             mutex_exit(&(pUM)->mcpMutex)
952d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_PHY(pUM)            mutex_enter(&(pUM)->phyMutex)
953d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_PHY(pUM)             mutex_exit(&(pUM)->phyMutex)
954d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_IND(pUM)            mutex_enter(&(pUM)->indMutex)
955d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_IND(pUM)             mutex_exit(&(pUM)->indMutex)
956d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_CID(pUM)            mutex_enter(&(pUM)->cidMutex)
957d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_CID(pUM)             mutex_exit(&(pUM)->cidMutex)
958d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_SPQ(pUM)            mutex_enter(&(pUM)->spqMutex)
959d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_SPQ(pUM)             mutex_exit(&(pUM)->spqMutex)
960d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_SPREQ(pUM)          mutex_enter(&(pUM)->spReqMutex)
961d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_SPREQ(pUM)           mutex_exit(&(pUM)->spReqMutex)
962d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_RRREQ(pUM)          mutex_enter(&(pUM)->rrReqMutex)
963d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_RRREQ(pUM)           mutex_exit(&(pUM)->rrReqMutex)
964d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_ISLES_CONTROL(pUM)  mutex_enter(&(pUM)->islesCtrlMutex)
965d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_ISLES_CONTROL(pUM)   mutex_exit(&(pUM)->islesCtrlMutex)
966d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_TOE(pUM)            mutex_enter(&(pUM)->toeMutex)
967d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_TOE(pUM)             mutex_exit(&(pUM)->toeMutex)
968d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_MEM(pUM)            mutex_enter(&(pUM)->memMutex)
969d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_MEM(pUM)             mutex_exit(&(pUM)->memMutex)
970d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_OFFLOAD(pUM)        mutex_enter(&(pUM)->offloadMutex)
971d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_OFFLOAD(pUM)         mutex_exit(&(pUM)->offloadMutex)
972d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_HWINIT(pUM)         mutex_enter(&(pUM)->hwInitMutex)
973d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_HWINIT(pUM)          mutex_exit(&(pUM)->hwInitMutex)
974d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_GLD(pUM)            mutex_enter(&(pUM)->gldMutex)
975d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_GLD(pUM)             mutex_exit(&(pUM)->gldMutex)
976d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_GLDTX(pUM, rw)      rw_enter(&(pUM)->gldTxMutex, (rw))
977d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_GLDTX(pUM)           rw_exit(&(pUM)->gldTxMutex)
978d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_TIMER(pUM)          mutex_enter(&(pUM)->timerMutex)
979d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_TIMER(pUM)           mutex_exit(&(pUM)->timerMutex)
980d14abf15SRobert Mustacchi #define BNXE_LOCK_ENTER_STATS(pUM)          mutex_enter(&(pUM)->kstatMutex)
981d14abf15SRobert Mustacchi #define BNXE_LOCK_EXIT_STATS(pUM)           mutex_exit(&(pUM)->kstatMutex)
982d14abf15SRobert Mustacchi 
983d14abf15SRobert Mustacchi #else /* not BNXE_LOCKS_INLINE */
984d14abf15SRobert Mustacchi 
985d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_INTR(um_device_t * pUM, int idx);
986d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_INTR(um_device_t * pUM, int idx);
987d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_INTR_FLIP(um_device_t * pUM, int idx);
988d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_INTR_FLIP(um_device_t * pUM, int idx);
989d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_TX(um_device_t * pUM, int idx);
990d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_TX(um_device_t * pUM, int idx);
991d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_FREETX(um_device_t * pUM, int idx);
992d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_FREETX(um_device_t * pUM, int idx);
993d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_RX(um_device_t * pUM, int idx);
994d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_RX(um_device_t * pUM, int idx);
995d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_DONERX(um_device_t * pUM, int idx);
996d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_DONERX(um_device_t * pUM, int idx);
997d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_SB(um_device_t * pUM, int idx);
998d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_SB(um_device_t * pUM, int idx);
999d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_ETH_CON(um_device_t * pUM);
1000d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_ETH_CON(um_device_t * pUM);
1001d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_MCP(um_device_t * pUM);
1002d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_MCP(um_device_t * pUM);
1003d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_PHY(um_device_t * pUM);
1004d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_PHY(um_device_t * pUM);
1005d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_IND(um_device_t * pUM);
1006d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_IND(um_device_t * pUM);
1007d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_CID(um_device_t * pUM);
1008d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_CID(um_device_t * pUM);
1009d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_SPQ(um_device_t * pUM);
1010d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_SPQ(um_device_t * pUM);
1011d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_SPREQ(um_device_t * pUM);
1012d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_SPREQ(um_device_t * pUM);
1013d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_RRREQ(um_device_t * pUM);
1014d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_RRREQ(um_device_t * pUM);
1015d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_ISLES_CONTROL(um_device_t * pUM);
1016d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_ISLES_CONTROL(um_device_t * pUM);
1017d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_MEM(um_device_t * pUM);
1018d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_MEM(um_device_t * pUM);
1019d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_GLD(um_device_t * pUM);
1020d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_GLD(um_device_t * pUM);
1021d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_GLDTX(um_device_t * pUM, krw_t rw);
1022d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_GLDTX(um_device_t * pUM);
1023d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_TIMER(um_device_t * pUM);
1024d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_TIMER(um_device_t * pUM);
1025d14abf15SRobert Mustacchi void BNXE_LOCK_ENTER_STATS(um_device_t * pUM);
1026d14abf15SRobert Mustacchi void BNXE_LOCK_EXIT_STATS(um_device_t * pUM);
1027d14abf15SRobert Mustacchi 
1028d14abf15SRobert Mustacchi #endif /* BNXE_LOCKS_INLINE */
1029d14abf15SRobert Mustacchi 
1030d14abf15SRobert Mustacchi #define CATC_TRIGGER(lmdev, data) {            \
1031d14abf15SRobert Mustacchi               REG_WR((lmdev), 0x2000, (data)); \
1032d14abf15SRobert Mustacchi         }
1033d14abf15SRobert Mustacchi #define CATC_TRIGGER_START(lmdev) CATC_TRIGGER((lmdev), 0xcafecafe)
1034d14abf15SRobert Mustacchi 
1035d14abf15SRobert Mustacchi void BnxeDumpMem(um_device_t * pUM,
1036d14abf15SRobert Mustacchi                  char *        pTag,
1037d14abf15SRobert Mustacchi                  u8_t *        pMem,
1038d14abf15SRobert Mustacchi                  u32_t         len);
1039d14abf15SRobert Mustacchi void BnxeDumpPkt(um_device_t * pUM,
1040d14abf15SRobert Mustacchi                  char *        pTag,
1041d14abf15SRobert Mustacchi                  mblk_t *      pMblk,
1042d14abf15SRobert Mustacchi                  boolean_t     contents);
1043d14abf15SRobert Mustacchi 
1044d14abf15SRobert Mustacchi /* XXX yuck (beware return strings lengths with kstat and mdb) */
1045d14abf15SRobert Mustacchi 
BnxeIsClientBound(um_device_t * pUM)1046d14abf15SRobert Mustacchi inline boolean_t BnxeIsClientBound(um_device_t * pUM)
1047d14abf15SRobert Mustacchi {
1048d14abf15SRobert Mustacchi     return (CLIENT_HW(pUM, LM_CLI_IDX_NDIS) ||
1049d14abf15SRobert Mustacchi             CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE));
1050d14abf15SRobert Mustacchi }
1051d14abf15SRobert Mustacchi 
BnxeClientsHw(um_device_t * pUM)1052d14abf15SRobert Mustacchi inline char * BnxeClientsHw(um_device_t * pUM)
1053d14abf15SRobert Mustacchi {
1054d14abf15SRobert Mustacchi     if (CLIENT_HW(pUM, LM_CLI_IDX_NDIS) &&
1055d14abf15SRobert Mustacchi         CLIENT_HW(pUM, LM_CLI_IDX_FCOE))      { return "L2,FCoE"; }
1056d14abf15SRobert Mustacchi     else if (CLIENT_HW(pUM, LM_CLI_IDX_NDIS)) { return "L2"; }
1057d14abf15SRobert Mustacchi     else if (CLIENT_HW(pUM, LM_CLI_IDX_FCOE)) { return "FCoE"; }
1058d14abf15SRobert Mustacchi     else                                      { return "None"; }
1059d14abf15SRobert Mustacchi }
1060d14abf15SRobert Mustacchi 
BnxeClientsDevi(um_device_t * pUM)1061d14abf15SRobert Mustacchi inline char * BnxeClientsDevi(um_device_t * pUM)
1062d14abf15SRobert Mustacchi {
1063d14abf15SRobert Mustacchi     if (CLIENT_DEVI(pUM, LM_CLI_IDX_FCOE)) { return "FCoE"; }
1064d14abf15SRobert Mustacchi     else                                   { return "None"; }
1065d14abf15SRobert Mustacchi }
1066d14abf15SRobert Mustacchi 
BnxeClientsBound(um_device_t * pUM)1067d14abf15SRobert Mustacchi inline char * BnxeClientsBound(um_device_t * pUM)
1068d14abf15SRobert Mustacchi {
1069d14abf15SRobert Mustacchi     if (CLIENT_HW(pUM, LM_CLI_IDX_NDIS) &&
1070d14abf15SRobert Mustacchi         CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE))      { return "L2,FCoE"; }
1071d14abf15SRobert Mustacchi     else if (CLIENT_HW(pUM, LM_CLI_IDX_NDIS))    { return "L2"; }
1072d14abf15SRobert Mustacchi     else if (CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE)) { return "FCoE"; }
1073d14abf15SRobert Mustacchi     else                                         { return "None"; }
1074d14abf15SRobert Mustacchi }
1075d14abf15SRobert Mustacchi 
1076d14abf15SRobert Mustacchi #endif /* BNXE_H */
1077d14abf15SRobert Mustacchi 
1078