qls_dump.c revision 261455
1/*
2 * Copyright (c) 2013-2014 Qlogic Corporation
3 * All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions
7 *  are met:
8 *
9 *  1. Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 *  2. Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 *  POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/*
29 * File: qls_dump.c
30 */
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD: stable/10/sys/dev/qlxge/qls_dump.c 261455 2014-02-04 03:36:42Z eadler $");
33
34
35#include "qls_os.h"
36#include "qls_hw.h"
37#include "qls_def.h"
38#include "qls_glbl.h"
39#include "qls_dump.h"
40
41qls_mpi_coredump_t ql_mpi_coredump;
42
43#define Q81_CORE_SEG_NUM              1
44#define Q81_TEST_LOGIC_SEG_NUM        2
45#define Q81_RMII_SEG_NUM              3
46#define Q81_FCMAC1_SEG_NUM            4
47#define Q81_FCMAC2_SEG_NUM            5
48#define Q81_FC1_MBOX_SEG_NUM          6
49#define Q81_IDE_SEG_NUM               7
50#define Q81_NIC1_MBOX_SEG_NUM         8
51#define Q81_SMBUS_SEG_NUM             9
52#define Q81_FC2_MBOX_SEG_NUM          10
53#define Q81_NIC2_MBOX_SEG_NUM         11
54#define Q81_I2C_SEG_NUM               12
55#define Q81_MEMC_SEG_NUM              13
56#define Q81_PBUS_SEG_NUM              14
57#define Q81_MDE_SEG_NUM               15
58#define Q81_NIC1_CONTROL_SEG_NUM      16
59#define Q81_NIC2_CONTROL_SEG_NUM      17
60#define Q81_NIC1_XGMAC_SEG_NUM        18
61#define Q81_NIC2_XGMAC_SEG_NUM        19
62#define Q81_WCS_RAM_SEG_NUM           20
63#define Q81_MEMC_RAM_SEG_NUM          21
64#define Q81_XAUI1_AN_SEG_NUM          22
65#define Q81_XAUI1_HSS_PCS_SEG_NUM     23
66#define Q81_XFI1_AN_SEG_NUM           24
67#define Q81_XFI1_TRAIN_SEG_NUM        25
68#define Q81_XFI1_HSS_PCS_SEG_NUM      26
69#define Q81_XFI1_HSS_TX_SEG_NUM       27
70#define Q81_XFI1_HSS_RX_SEG_NUM       28
71#define Q81_XFI1_HSS_PLL_SEG_NUM      29
72#define Q81_INTR_STATES_SEG_NUM       31
73#define Q81_ETS_SEG_NUM               34
74#define Q81_PROBE_DUMP_SEG_NUM        35
75#define Q81_ROUTING_INDEX_SEG_NUM     36
76#define Q81_MAC_PROTOCOL_SEG_NUM      37
77#define Q81_XAUI2_AN_SEG_NUM          38
78#define Q81_XAUI2_HSS_PCS_SEG_NUM     39
79#define Q81_XFI2_AN_SEG_NUM           40
80#define Q81_XFI2_TRAIN_SEG_NUM        41
81#define Q81_XFI2_HSS_PCS_SEG_NUM      42
82#define Q81_XFI2_HSS_TX_SEG_NUM       43
83#define Q81_XFI2_HSS_RX_SEG_NUM       44
84#define Q81_XFI2_HSS_PLL_SEG_NUM      45
85#define Q81_WQC1_SEG_NUM              46
86#define Q81_CQC1_SEG_NUM              47
87#define Q81_WQC2_SEG_NUM              48
88#define Q81_CQC2_SEG_NUM              49
89#define Q81_SEM_REGS_SEG_NUM          50
90
91enum
92{
93	Q81_PAUSE_SRC_LO               = 0x00000100,
94	Q81_PAUSE_SRC_HI               = 0x00000104,
95	Q81_GLOBAL_CFG                 = 0x00000108,
96	Q81_GLOBAL_CFG_RESET           = (1 << 0),    /*Control*/
97	Q81_GLOBAL_CFG_JUMBO           = (1 << 6),    /*Control*/
98	Q81_GLOBAL_CFG_TX_STAT_EN      = (1 << 10),   /*Control*/
99	Q81_GLOBAL_CFG_RX_STAT_EN      = (1 << 11),   /*Control*/
100	Q81_TX_CFG                     = 0x0000010c,
101	Q81_TX_CFG_RESET               = (1 << 0),    /*Control*/
102	Q81_TX_CFG_EN                  = (1 << 1),    /*Control*/
103	Q81_TX_CFG_PREAM               = (1 << 2),    /*Control*/
104	Q81_RX_CFG                     = 0x00000110,
105	Q81_RX_CFG_RESET               = (1 << 0),    /*Control*/
106	Q81_RX_CFG_EN                  = (1 << 1),    /*Control*/
107	Q81_RX_CFG_PREAM               = (1 << 2),    /*Control*/
108	Q81_FLOW_CTL                   = 0x0000011c,
109	Q81_PAUSE_OPCODE               = 0x00000120,
110	Q81_PAUSE_TIMER                = 0x00000124,
111	Q81_PAUSE_FRM_DEST_LO          = 0x00000128,
112	Q81_PAUSE_FRM_DEST_HI          = 0x0000012c,
113	Q81_MAC_TX_PARAMS              = 0x00000134,
114	Q81_MAC_TX_PARAMS_JUMBO        = (1U << 31),   /*Control*/
115	Q81_MAC_TX_PARAMS_SIZE_SHIFT   = 16,          /*Control*/
116	Q81_MAC_RX_PARAMS              = 0x00000138,
117	Q81_MAC_SYS_INT                = 0x00000144,
118	Q81_MAC_SYS_INT_MASK           = 0x00000148,
119	Q81_MAC_MGMT_INT               = 0x0000014c,
120	Q81_MAC_MGMT_IN_MASK           = 0x00000150,
121	Q81_EXT_ARB_MODE               = 0x000001fc,
122	Q81_TX_PKTS                    = 0x00000200,
123	Q81_TX_PKTS_LO                 = 0x00000204,
124	Q81_TX_BYTES                   = 0x00000208,
125	Q81_TX_BYTES_LO                = 0x0000020C,
126	Q81_TX_MCAST_PKTS              = 0x00000210,
127	Q81_TX_MCAST_PKTS_LO           = 0x00000214,
128	Q81_TX_BCAST_PKTS              = 0x00000218,
129	Q81_TX_BCAST_PKTS_LO           = 0x0000021C,
130	Q81_TX_UCAST_PKTS              = 0x00000220,
131	Q81_TX_UCAST_PKTS_LO           = 0x00000224,
132	Q81_TX_CTL_PKTS                = 0x00000228,
133	Q81_TX_CTL_PKTS_LO             = 0x0000022c,
134	Q81_TX_PAUSE_PKTS              = 0x00000230,
135	Q81_TX_PAUSE_PKTS_LO           = 0x00000234,
136	Q81_TX_64_PKT                  = 0x00000238,
137	Q81_TX_64_PKT_LO               = 0x0000023c,
138	Q81_TX_65_TO_127_PKT           = 0x00000240,
139	Q81_TX_65_TO_127_PKT_LO        = 0x00000244,
140	Q81_TX_128_TO_255_PKT          = 0x00000248,
141	Q81_TX_128_TO_255_PKT_LO       = 0x0000024c,
142	Q81_TX_256_511_PKT             = 0x00000250,
143	Q81_TX_256_511_PKT_LO          = 0x00000254,
144	Q81_TX_512_TO_1023_PKT         = 0x00000258,
145	Q81_TX_512_TO_1023_PKT_LO      = 0x0000025c,
146	Q81_TX_1024_TO_1518_PKT        = 0x00000260,
147	Q81_TX_1024_TO_1518_PKT_LO     = 0x00000264,
148	Q81_TX_1519_TO_MAX_PKT         = 0x00000268,
149	Q81_TX_1519_TO_MAX_PKT_LO      = 0x0000026c,
150	Q81_TX_UNDERSIZE_PKT           = 0x00000270,
151	Q81_TX_UNDERSIZE_PKT_LO        = 0x00000274,
152	Q81_TX_OVERSIZE_PKT            = 0x00000278,
153	Q81_TX_OVERSIZE_PKT_LO         = 0x0000027c,
154	Q81_RX_HALF_FULL_DET           = 0x000002a0,
155	Q81_TX_HALF_FULL_DET_LO        = 0x000002a4,
156	Q81_RX_OVERFLOW_DET            = 0x000002a8,
157	Q81_TX_OVERFLOW_DET_LO         = 0x000002ac,
158	Q81_RX_HALF_FULL_MASK          = 0x000002b0,
159	Q81_TX_HALF_FULL_MASK_LO       = 0x000002b4,
160	Q81_RX_OVERFLOW_MASK           = 0x000002b8,
161	Q81_TX_OVERFLOW_MASK_LO        = 0x000002bc,
162	Q81_STAT_CNT_CTL               = 0x000002c0,
163	Q81_STAT_CNT_CTL_CLEAR_TX      = (1 << 0),   /*Control*/
164	Q81_STAT_CNT_CTL_CLEAR_RX      = (1 << 1),   /*Control*/
165	Q81_AUX_RX_HALF_FULL_DET       = 0x000002d0,
166	Q81_AUX_TX_HALF_FULL_DET       = 0x000002d4,
167	Q81_AUX_RX_OVERFLOW_DET        = 0x000002d8,
168	Q81_AUX_TX_OVERFLOW_DET        = 0x000002dc,
169	Q81_AUX_RX_HALF_FULL_MASK      = 0x000002f0,
170	Q81_AUX_TX_HALF_FULL_MASK      = 0x000002f4,
171	Q81_AUX_RX_OVERFLOW_MASK       = 0x000002f8,
172	Q81_AUX_TX_OVERFLOW_MASK       = 0x000002fc,
173	Q81_RX_BYTES                   = 0x00000300,
174	Q81_RX_BYTES_LO                = 0x00000304,
175	Q81_RX_BYTES_OK                = 0x00000308,
176	Q81_RX_BYTES_OK_LO             = 0x0000030c,
177	Q81_RX_PKTS                    = 0x00000310,
178	Q81_RX_PKTS_LO                 = 0x00000314,
179	Q81_RX_PKTS_OK                 = 0x00000318,
180	Q81_RX_PKTS_OK_LO              = 0x0000031c,
181	Q81_RX_BCAST_PKTS              = 0x00000320,
182	Q81_RX_BCAST_PKTS_LO           = 0x00000324,
183	Q81_RX_MCAST_PKTS              = 0x00000328,
184	Q81_RX_MCAST_PKTS_LO           = 0x0000032c,
185	Q81_RX_UCAST_PKTS              = 0x00000330,
186	Q81_RX_UCAST_PKTS_LO           = 0x00000334,
187	Q81_RX_UNDERSIZE_PKTS          = 0x00000338,
188	Q81_RX_UNDERSIZE_PKTS_LO       = 0x0000033c,
189	Q81_RX_OVERSIZE_PKTS           = 0x00000340,
190	Q81_RX_OVERSIZE_PKTS_LO        = 0x00000344,
191	Q81_RX_JABBER_PKTS             = 0x00000348,
192	Q81_RX_JABBER_PKTS_LO          = 0x0000034c,
193	Q81_RX_UNDERSIZE_FCERR_PKTS    = 0x00000350,
194	Q81_RX_UNDERSIZE_FCERR_PKTS_LO = 0x00000354,
195	Q81_RX_DROP_EVENTS             = 0x00000358,
196	Q81_RX_DROP_EVENTS_LO          = 0x0000035c,
197	Q81_RX_FCERR_PKTS              = 0x00000360,
198	Q81_RX_FCERR_PKTS_LO           = 0x00000364,
199	Q81_RX_ALIGN_ERR               = 0x00000368,
200	Q81_RX_ALIGN_ERR_LO            = 0x0000036c,
201	Q81_RX_SYMBOL_ERR              = 0x00000370,
202	Q81_RX_SYMBOL_ERR_LO           = 0x00000374,
203	Q81_RX_MAC_ERR                 = 0x00000378,
204	Q81_RX_MAC_ERR_LO              = 0x0000037c,
205	Q81_RX_CTL_PKTS                = 0x00000380,
206	Q81_RX_CTL_PKTS_LO             = 0x00000384,
207	Q81_RX_PAUSE_PKTS              = 0x00000388,
208	Q81_RX_PAUSE_PKTS_LO           = 0x0000038c,
209	Q81_RX_64_PKTS                 = 0x00000390,
210	Q81_RX_64_PKTS_LO              = 0x00000394,
211	Q81_RX_65_TO_127_PKTS          = 0x00000398,
212	Q81_RX_65_TO_127_PKTS_LO       = 0x0000039c,
213	Q81_RX_128_255_PKTS            = 0x000003a0,
214	Q81_RX_128_255_PKTS_LO         = 0x000003a4,
215	Q81_RX_256_511_PKTS            = 0x000003a8,
216	Q81_RX_256_511_PKTS_LO         = 0x000003ac,
217	Q81_RX_512_TO_1023_PKTS        = 0x000003b0,
218	Q81_RX_512_TO_1023_PKTS_LO     = 0x000003b4,
219	Q81_RX_1024_TO_1518_PKTS       = 0x000003b8,
220	Q81_RX_1024_TO_1518_PKTS_LO    = 0x000003bc,
221	Q81_RX_1519_TO_MAX_PKTS        = 0x000003c0,
222	Q81_RX_1519_TO_MAX_PKTS_LO     = 0x000003c4,
223	Q81_RX_LEN_ERR_PKTS            = 0x000003c8,
224	Q81_RX_LEN_ERR_PKTS_LO         = 0x000003cc,
225	Q81_MDIO_TX_DATA               = 0x00000400,
226	Q81_MDIO_RX_DATA               = 0x00000410,
227	Q81_MDIO_CMD                   = 0x00000420,
228	Q81_MDIO_PHY_ADDR              = 0x00000430,
229	Q81_MDIO_PORT                  = 0x00000440,
230	Q81_MDIO_STATUS                = 0x00000450,
231	Q81_TX_CBFC_PAUSE_FRAMES0      = 0x00000500,
232	Q81_TX_CBFC_PAUSE_FRAMES0_LO   = 0x00000504,
233	Q81_TX_CBFC_PAUSE_FRAMES1      = 0x00000508,
234	Q81_TX_CBFC_PAUSE_FRAMES1_LO   = 0x0000050C,
235	Q81_TX_CBFC_PAUSE_FRAMES2      = 0x00000510,
236	Q81_TX_CBFC_PAUSE_FRAMES2_LO   = 0x00000514,
237	Q81_TX_CBFC_PAUSE_FRAMES3      = 0x00000518,
238	Q81_TX_CBFC_PAUSE_FRAMES3_LO   = 0x0000051C,
239	Q81_TX_CBFC_PAUSE_FRAMES4      = 0x00000520,
240	Q81_TX_CBFC_PAUSE_FRAMES4_LO   = 0x00000524,
241	Q81_TX_CBFC_PAUSE_FRAMES5      = 0x00000528,
242	Q81_TX_CBFC_PAUSE_FRAMES5_LO   = 0x0000052C,
243	Q81_TX_CBFC_PAUSE_FRAMES6      = 0x00000530,
244	Q81_TX_CBFC_PAUSE_FRAMES6_LO   = 0x00000534,
245	Q81_TX_CBFC_PAUSE_FRAMES7      = 0x00000538,
246	Q81_TX_CBFC_PAUSE_FRAMES7_LO   = 0x0000053C,
247	Q81_TX_FCOE_PKTS               = 0x00000540,
248	Q81_TX_FCOE_PKTS_LO            = 0x00000544,
249	Q81_TX_MGMT_PKTS               = 0x00000548,
250	Q81_TX_MGMT_PKTS_LO            = 0x0000054C,
251	Q81_RX_CBFC_PAUSE_FRAMES0      = 0x00000568,
252	Q81_RX_CBFC_PAUSE_FRAMES0_LO   = 0x0000056C,
253	Q81_RX_CBFC_PAUSE_FRAMES1      = 0x00000570,
254	Q81_RX_CBFC_PAUSE_FRAMES1_LO   = 0x00000574,
255	Q81_RX_CBFC_PAUSE_FRAMES2      = 0x00000578,
256	Q81_RX_CBFC_PAUSE_FRAMES2_LO   = 0x0000057C,
257	Q81_RX_CBFC_PAUSE_FRAMES3      = 0x00000580,
258	Q81_RX_CBFC_PAUSE_FRAMES3_LO   = 0x00000584,
259	Q81_RX_CBFC_PAUSE_FRAMES4      = 0x00000588,
260	Q81_RX_CBFC_PAUSE_FRAMES4_LO   = 0x0000058C,
261	Q81_RX_CBFC_PAUSE_FRAMES5      = 0x00000590,
262	Q81_RX_CBFC_PAUSE_FRAMES5_LO   = 0x00000594,
263	Q81_RX_CBFC_PAUSE_FRAMES6      = 0x00000598,
264	Q81_RX_CBFC_PAUSE_FRAMES6_LO   = 0x0000059C,
265	Q81_RX_CBFC_PAUSE_FRAMES7      = 0x000005A0,
266	Q81_RX_CBFC_PAUSE_FRAMES7_LO   = 0x000005A4,
267	Q81_RX_FCOE_PKTS               = 0x000005A8,
268	Q81_RX_FCOE_PKTS_LO            = 0x000005AC,
269	Q81_RX_MGMT_PKTS               = 0x000005B0,
270	Q81_RX_MGMT_PKTS_LO            = 0x000005B4,
271	Q81_RX_NIC_FIFO_DROP           = 0x000005B8,
272	Q81_RX_NIC_FIFO_DROP_LO        = 0x000005BC,
273	Q81_RX_FCOE_FIFO_DROP          = 0x000005C0,
274	Q81_RX_FCOE_FIFO_DROP_LO       = 0x000005C4,
275	Q81_RX_MGMT_FIFO_DROP          = 0x000005C8,
276	Q81_RX_MGMT_FIFO_DROP_LO       = 0x000005CC,
277	Q81_RX_PKTS_PRIORITY0          = 0x00000600,
278	Q81_RX_PKTS_PRIORITY0_LO       = 0x00000604,
279	Q81_RX_PKTS_PRIORITY1          = 0x00000608,
280	Q81_RX_PKTS_PRIORITY1_LO       = 0x0000060C,
281	Q81_RX_PKTS_PRIORITY2          = 0x00000610,
282	Q81_RX_PKTS_PRIORITY2_LO       = 0x00000614,
283	Q81_RX_PKTS_PRIORITY3          = 0x00000618,
284	Q81_RX_PKTS_PRIORITY3_LO       = 0x0000061C,
285	Q81_RX_PKTS_PRIORITY4          = 0x00000620,
286	Q81_RX_PKTS_PRIORITY4_LO       = 0x00000624,
287	Q81_RX_PKTS_PRIORITY5          = 0x00000628,
288	Q81_RX_PKTS_PRIORITY5_LO       = 0x0000062C,
289	Q81_RX_PKTS_PRIORITY6          = 0x00000630,
290	Q81_RX_PKTS_PRIORITY6_LO       = 0x00000634,
291	Q81_RX_PKTS_PRIORITY7          = 0x00000638,
292	Q81_RX_PKTS_PRIORITY7_LO       = 0x0000063C,
293	Q81_RX_OCTETS_PRIORITY0        = 0x00000640,
294	Q81_RX_OCTETS_PRIORITY0_LO     = 0x00000644,
295	Q81_RX_OCTETS_PRIORITY1        = 0x00000648,
296	Q81_RX_OCTETS_PRIORITY1_LO     = 0x0000064C,
297	Q81_RX_OCTETS_PRIORITY2        = 0x00000650,
298	Q81_RX_OCTETS_PRIORITY2_LO     = 0x00000654,
299	Q81_RX_OCTETS_PRIORITY3        = 0x00000658,
300	Q81_RX_OCTETS_PRIORITY3_LO     = 0x0000065C,
301	Q81_RX_OCTETS_PRIORITY4        = 0x00000660,
302	Q81_RX_OCTETS_PRIORITY4_LO     = 0x00000664,
303	Q81_RX_OCTETS_PRIORITY5        = 0x00000668,
304	Q81_RX_OCTETS_PRIORITY5_LO     = 0x0000066C,
305	Q81_RX_OCTETS_PRIORITY6        = 0x00000670,
306	Q81_RX_OCTETS_PRIORITY6_LO     = 0x00000674,
307	Q81_RX_OCTETS_PRIORITY7        = 0x00000678,
308	Q81_RX_OCTETS_PRIORITY7_LO     = 0x0000067C,
309	Q81_TX_PKTS_PRIORITY0          = 0x00000680,
310	Q81_TX_PKTS_PRIORITY0_LO       = 0x00000684,
311	Q81_TX_PKTS_PRIORITY1          = 0x00000688,
312	Q81_TX_PKTS_PRIORITY1_LO       = 0x0000068C,
313	Q81_TX_PKTS_PRIORITY2          = 0x00000690,
314	Q81_TX_PKTS_PRIORITY2_LO       = 0x00000694,
315	Q81_TX_PKTS_PRIORITY3          = 0x00000698,
316	Q81_TX_PKTS_PRIORITY3_LO       = 0x0000069C,
317	Q81_TX_PKTS_PRIORITY4          = 0x000006A0,
318	Q81_TX_PKTS_PRIORITY4_LO       = 0x000006A4,
319	Q81_TX_PKTS_PRIORITY5          = 0x000006A8,
320	Q81_TX_PKTS_PRIORITY5_LO       = 0x000006AC,
321	Q81_TX_PKTS_PRIORITY6          = 0x000006B0,
322	Q81_TX_PKTS_PRIORITY6_LO       = 0x000006B4,
323	Q81_TX_PKTS_PRIORITY7          = 0x000006B8,
324	Q81_TX_PKTS_PRIORITY7_LO       = 0x000006BC,
325	Q81_TX_OCTETS_PRIORITY0        = 0x000006C0,
326	Q81_TX_OCTETS_PRIORITY0_LO     = 0x000006C4,
327	Q81_TX_OCTETS_PRIORITY1        = 0x000006C8,
328	Q81_TX_OCTETS_PRIORITY1_LO     = 0x000006CC,
329	Q81_TX_OCTETS_PRIORITY2        = 0x000006D0,
330	Q81_TX_OCTETS_PRIORITY2_LO     = 0x000006D4,
331	Q81_TX_OCTETS_PRIORITY3        = 0x000006D8,
332	Q81_TX_OCTETS_PRIORITY3_LO     = 0x000006DC,
333	Q81_TX_OCTETS_PRIORITY4        = 0x000006E0,
334	Q81_TX_OCTETS_PRIORITY4_LO     = 0x000006E4,
335	Q81_TX_OCTETS_PRIORITY5        = 0x000006E8,
336	Q81_TX_OCTETS_PRIORITY5_LO     = 0x000006EC,
337	Q81_TX_OCTETS_PRIORITY6        = 0x000006F0,
338	Q81_TX_OCTETS_PRIORITY6_LO     = 0x000006F4,
339	Q81_TX_OCTETS_PRIORITY7        = 0x000006F8,
340	Q81_TX_OCTETS_PRIORITY7_LO     = 0x000006FC,
341	Q81_RX_DISCARD_PRIORITY0       = 0x00000700,
342	Q81_RX_DISCARD_PRIORITY0_LO    = 0x00000704,
343	Q81_RX_DISCARD_PRIORITY1       = 0x00000708,
344	Q81_RX_DISCARD_PRIORITY1_LO    = 0x0000070C,
345	Q81_RX_DISCARD_PRIORITY2       = 0x00000710,
346	Q81_RX_DISCARD_PRIORITY2_LO    = 0x00000714,
347	Q81_RX_DISCARD_PRIORITY3       = 0x00000718,
348	Q81_RX_DISCARD_PRIORITY3_LO    = 0x0000071C,
349	Q81_RX_DISCARD_PRIORITY4       = 0x00000720,
350	Q81_RX_DISCARD_PRIORITY4_LO    = 0x00000724,
351	Q81_RX_DISCARD_PRIORITY5       = 0x00000728,
352	Q81_RX_DISCARD_PRIORITY5_LO    = 0x0000072C,
353	Q81_RX_DISCARD_PRIORITY6       = 0x00000730,
354	Q81_RX_DISCARD_PRIORITY6_LO    = 0x00000734,
355	Q81_RX_DISCARD_PRIORITY7       = 0x00000738,
356	Q81_RX_DISCARD_PRIORITY7_LO    = 0x0000073C
357};
358
359static void
360qls_mpid_seg_hdr(qls_mpid_seg_hdr_t *seg_hdr, uint32_t seg_num,
361	uint32_t seg_size, unsigned char *desc)
362{
363	memset(seg_hdr, 0, sizeof(qls_mpid_seg_hdr_t));
364
365	seg_hdr->cookie = Q81_MPID_COOKIE;
366	seg_hdr->seg_num = seg_num;
367	seg_hdr->seg_size = seg_size;
368
369	memcpy(seg_hdr->desc, desc, (sizeof(seg_hdr->desc))-1);
370
371	return;
372}
373
374static int
375qls_wait_reg_rdy(qla_host_t *ha , uint32_t reg, uint32_t bit, uint32_t err_bit)
376{
377	uint32_t data;
378	int count = 10;
379
380	while (count) {
381
382		data = READ_REG32(ha, reg);
383
384		if (data & err_bit)
385			return (-1);
386		else if (data & bit)
387			return (0);
388
389		qls_mdelay(__func__, 10);
390		count--;
391	}
392	return (-1);
393}
394
395static int
396qls_rd_mpi_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
397{
398        int ret;
399
400        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
401			Q81_CTL_PROC_ADDR_ERR);
402
403        if (ret)
404                goto exit_qls_rd_mpi_reg;
405
406        WRITE_REG32(ha, Q81_CTL_PROC_ADDR, reg | Q81_CTL_PROC_ADDR_READ);
407
408        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
409			Q81_CTL_PROC_ADDR_ERR);
410
411        if (ret)
412                goto exit_qls_rd_mpi_reg;
413
414        *data = READ_REG32(ha, Q81_CTL_PROC_DATA);
415
416exit_qls_rd_mpi_reg:
417        return (ret);
418}
419
420static int
421qls_wr_mpi_reg(qla_host_t *ha, uint32_t reg, uint32_t data)
422{
423        int ret = 0;
424
425        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
426			Q81_CTL_PROC_ADDR_ERR);
427        if (ret)
428                goto exit_qls_wr_mpi_reg;
429
430        WRITE_REG32(ha, Q81_CTL_PROC_DATA, data);
431
432        WRITE_REG32(ha, Q81_CTL_PROC_ADDR, reg);
433
434        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
435			Q81_CTL_PROC_ADDR_ERR);
436exit_qls_wr_mpi_reg:
437        return (ret);
438}
439
440
441#define Q81_TEST_LOGIC_FUNC_PORT_CONFIG 0x1002
442#define Q81_INVALID_NUM		0xFFFFFFFF
443
444#define Q81_NIC1_FUNC_ENABLE	0x00000001
445#define Q81_NIC1_FUNC_MASK	0x0000000e
446#define Q81_NIC1_FUNC_SHIFT	1
447#define Q81_NIC2_FUNC_ENABLE	0x00000010
448#define Q81_NIC2_FUNC_MASK	0x000000e0
449#define Q81_NIC2_FUNC_SHIFT	5
450#define Q81_FUNCTION_SHIFT	6
451
452static uint32_t
453qls_get_other_fnum(qla_host_t *ha)
454{
455	int		ret;
456	uint32_t	o_func;
457	uint32_t	test_logic;
458	uint32_t	nic1_fnum = Q81_INVALID_NUM;
459	uint32_t	nic2_fnum = Q81_INVALID_NUM;
460
461	ret = qls_rd_mpi_reg(ha, Q81_TEST_LOGIC_FUNC_PORT_CONFIG, &test_logic);
462	if (ret)
463		return(Q81_INVALID_NUM);
464
465	if (test_logic & Q81_NIC1_FUNC_ENABLE)
466		nic1_fnum = (test_logic & Q81_NIC1_FUNC_MASK) >>
467					Q81_NIC1_FUNC_SHIFT;
468
469	if (test_logic & Q81_NIC2_FUNC_ENABLE)
470		nic2_fnum = (test_logic & Q81_NIC2_FUNC_MASK) >>
471					Q81_NIC2_FUNC_SHIFT;
472
473	if (ha->pci_func == 0)
474		o_func = nic2_fnum;
475	else
476		o_func = nic1_fnum;
477
478	return(o_func);
479}
480
481static uint32_t
482qls_rd_ofunc_reg(qla_host_t *ha, uint32_t reg)
483{
484	uint32_t	ofunc;
485	uint32_t	data;
486	int		ret = 0;
487
488	ofunc = qls_get_other_fnum(ha);
489
490	if (ofunc == Q81_INVALID_NUM)
491		return(Q81_INVALID_NUM);
492
493	reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (ofunc << Q81_FUNCTION_SHIFT) | reg;
494
495	ret = qls_rd_mpi_reg(ha, reg, &data);
496
497	if (ret != 0)
498		return(Q81_INVALID_NUM);
499
500	return(data);
501}
502
503static void
504qls_wr_ofunc_reg(qla_host_t *ha, uint32_t reg, uint32_t value)
505{
506	uint32_t ofunc;
507	int ret = 0;
508
509	ofunc = qls_get_other_fnum(ha);
510
511	if (ofunc == Q81_INVALID_NUM)
512		return;
513
514	reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (ofunc << Q81_FUNCTION_SHIFT) | reg;
515
516	ret = qls_wr_mpi_reg(ha, reg, value);
517
518	return;
519}
520
521static int
522qls_wait_ofunc_reg_rdy(qla_host_t *ha , uint32_t reg, uint32_t bit,
523	uint32_t err_bit)
524{
525        uint32_t data;
526        int count = 10;
527
528        while (count) {
529
530                data = qls_rd_ofunc_reg(ha, reg);
531
532                if (data & err_bit)
533                        return (-1);
534                else if (data & bit)
535                        return (0);
536
537                qls_mdelay(__func__, 10);
538                count--;
539        }
540        return (-1);
541}
542
543#define Q81_XG_SERDES_ADDR_RDY	BIT_31
544#define Q81_XG_SERDES_ADDR_READ	BIT_30
545
546static int
547qls_rd_ofunc_serdes_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
548{
549	int ret;
550
551	/* wait for reg to come ready */
552	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XG_SERDES_ADDR >> 2),
553			Q81_XG_SERDES_ADDR_RDY, 0);
554	if (ret)
555		goto exit_qls_rd_ofunc_serdes_reg;
556
557	/* set up for reg read */
558	qls_wr_ofunc_reg(ha, (Q81_CTL_XG_SERDES_ADDR >> 2),
559		(reg | Q81_XG_SERDES_ADDR_READ));
560
561	/* wait for reg to come ready */
562	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XG_SERDES_ADDR >> 2),
563			Q81_XG_SERDES_ADDR_RDY, 0);
564	if (ret)
565		goto exit_qls_rd_ofunc_serdes_reg;
566
567	/* get the data */
568	*data = qls_rd_ofunc_reg(ha, (Q81_CTL_XG_SERDES_DATA >> 2));
569
570exit_qls_rd_ofunc_serdes_reg:
571	return ret;
572}
573
574#define Q81_XGMAC_ADDR_RDY	BIT_31
575#define Q81_XGMAC_ADDR_R	BIT_30
576#define Q81_XGMAC_ADDR_XME	BIT_29
577
578static int
579qls_rd_ofunc_xgmac_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
580{
581	int ret = 0;
582
583	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XGMAC_ADDR >> 2),
584			Q81_XGMAC_ADDR_RDY, Q81_XGMAC_ADDR_XME);
585
586	if (ret)
587		goto exit_qls_rd_ofunc_xgmac_reg;
588
589	qls_wr_ofunc_reg(ha, (Q81_XGMAC_ADDR_RDY >> 2),
590		(reg | Q81_XGMAC_ADDR_R));
591
592	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XGMAC_ADDR >> 2),
593			Q81_XGMAC_ADDR_RDY, Q81_XGMAC_ADDR_XME);
594	if (ret)
595		goto exit_qls_rd_ofunc_xgmac_reg;
596
597	*data = qls_rd_ofunc_reg(ha, Q81_CTL_XGMAC_DATA);
598
599exit_qls_rd_ofunc_xgmac_reg:
600	return ret;
601}
602
603static int
604qls_rd_serdes_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
605{
606	int ret;
607
608	ret = qls_wait_reg_rdy(ha, Q81_CTL_XG_SERDES_ADDR,
609			Q81_XG_SERDES_ADDR_RDY, 0);
610
611	if (ret)
612		goto exit_qls_rd_serdes_reg;
613
614	WRITE_REG32(ha, Q81_CTL_XG_SERDES_ADDR, \
615		(reg | Q81_XG_SERDES_ADDR_READ));
616
617	ret = qls_wait_reg_rdy(ha, Q81_CTL_XG_SERDES_ADDR,
618			Q81_XG_SERDES_ADDR_RDY, 0);
619
620	if (ret)
621		goto exit_qls_rd_serdes_reg;
622
623	*data = READ_REG32(ha, Q81_CTL_XG_SERDES_DATA);
624
625exit_qls_rd_serdes_reg:
626
627	return ret;
628}
629
630static void
631qls_get_both_serdes(qla_host_t *ha, uint32_t addr, uint32_t *dptr,
632	uint32_t *ind_ptr, uint32_t dvalid, uint32_t ind_valid)
633{
634	int ret = -1;
635
636	if (dvalid)
637		ret = qls_rd_serdes_reg(ha, addr, dptr);
638
639	if (ret)
640		*dptr = Q81_BAD_DATA;
641
642	ret = -1;
643
644	if(ind_valid)
645		ret = qls_rd_ofunc_serdes_reg(ha, addr, ind_ptr);
646
647	if (ret)
648		*ind_ptr = Q81_BAD_DATA;
649}
650
651#define Q81_XFI1_POWERED_UP 0x00000005
652#define Q81_XFI2_POWERED_UP 0x0000000A
653#define Q81_XAUI_POWERED_UP 0x00000001
654
655static int
656qls_rd_serdes_regs(qla_host_t *ha, qls_mpi_coredump_t *mpi_dump)
657{
658	int ret;
659	uint32_t xfi_d_valid, xfi_ind_valid, xaui_d_valid, xaui_ind_valid;
660	uint32_t temp, xaui_reg, i;
661	uint32_t *dptr, *indptr;
662
663	xfi_d_valid = xfi_ind_valid = xaui_d_valid = xaui_ind_valid = 0;
664
665	xaui_reg = 0x800;
666
667	ret = qls_rd_ofunc_serdes_reg(ha, xaui_reg, &temp);
668	if (ret)
669		temp = 0;
670
671	if ((temp & Q81_XAUI_POWERED_UP) == Q81_XAUI_POWERED_UP)
672		xaui_ind_valid = 1;
673
674	ret = qls_rd_serdes_reg(ha, xaui_reg, &temp);
675	if (ret)
676		temp = 0;
677
678	if ((temp & Q81_XAUI_POWERED_UP) == Q81_XAUI_POWERED_UP)
679		xaui_d_valid = 1;
680
681	ret = qls_rd_serdes_reg(ha, 0x1E06, &temp);
682	if (ret)
683		temp = 0;
684
685	if ((temp & Q81_XFI1_POWERED_UP) == Q81_XFI1_POWERED_UP) {
686
687		if (ha->pci_func & 1)
688         		xfi_ind_valid = 1; /* NIC 2, so the indirect
689						 (NIC1) xfi is up*/
690		else
691			xfi_d_valid = 1;
692	}
693
694	if((temp & Q81_XFI2_POWERED_UP) == Q81_XFI2_POWERED_UP) {
695
696		if(ha->pci_func & 1)
697			xfi_d_valid = 1; /* NIC 2, so the indirect (NIC1)
698						xfi is up */
699		else
700			xfi_ind_valid = 1;
701	}
702
703	if (ha->pci_func & 1) {
704		dptr = (uint32_t *)(&mpi_dump->serdes2_xaui_an);
705		indptr = (uint32_t *)(&mpi_dump->serdes1_xaui_an);
706	} else {
707		dptr = (uint32_t *)(&mpi_dump->serdes1_xaui_an);
708		indptr = (uint32_t *)(&mpi_dump->serdes2_xaui_an);
709	}
710
711	for (i = 0; i <= 0x000000034; i += 4, dptr ++, indptr ++) {
712		qls_get_both_serdes(ha, i, dptr, indptr,
713			xaui_d_valid, xaui_ind_valid);
714	}
715
716	if (ha->pci_func & 1) {
717		dptr = (uint32_t *)(&mpi_dump->serdes2_xaui_hss_pcs);
718		indptr = (uint32_t *)(&mpi_dump->serdes1_xaui_hss_pcs);
719	} else {
720		dptr = (uint32_t *)(&mpi_dump->serdes1_xaui_hss_pcs);
721		indptr = (uint32_t *)(&mpi_dump->serdes2_xaui_hss_pcs);
722	}
723
724	for (i = 0x800; i <= 0x880; i += 4, dptr ++, indptr ++) {
725		qls_get_both_serdes(ha, i, dptr, indptr,
726			xaui_d_valid, xaui_ind_valid);
727	}
728
729	if (ha->pci_func & 1) {
730		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_an);
731		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_an);
732	} else {
733		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_an);
734		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_an);
735	}
736
737	for (i = 0x1000; i <= 0x1034; i += 4, dptr ++, indptr ++) {
738		qls_get_both_serdes(ha, i, dptr, indptr,
739			xfi_d_valid, xfi_ind_valid);
740	}
741
742	if (ha->pci_func & 1) {
743		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_train);
744		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_train);
745	} else {
746		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_train);
747		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_train);
748	}
749
750	for (i = 0x1050; i <= 0x107c; i += 4, dptr ++, indptr ++) {
751		qls_get_both_serdes(ha, i, dptr, indptr,
752			xfi_d_valid, xfi_ind_valid);
753	}
754
755	if (ha->pci_func & 1) {
756		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pcs);
757		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pcs);
758	} else {
759		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pcs);
760		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pcs);
761	}
762
763	for (i = 0x1800; i <= 0x1838; i += 4, dptr++, indptr ++) {
764		qls_get_both_serdes(ha, i, dptr, indptr,
765			xfi_d_valid, xfi_ind_valid);
766	}
767
768	if (ha->pci_func & 1) {
769		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_tx);
770		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_tx);
771	} else {
772		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_tx);
773		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_tx);
774	}
775
776	for (i = 0x1c00; i <= 0x1c1f; i++, dptr ++, indptr ++) {
777		qls_get_both_serdes(ha, i, dptr, indptr,
778			xfi_d_valid, xfi_ind_valid);
779	}
780
781	if (ha->pci_func & 1) {
782		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_rx);
783		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_rx);
784	} else {
785		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_rx);
786		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_rx);
787	}
788
789	for (i = 0x1c40; i <= 0x1c5f; i++, dptr ++, indptr ++) {
790		qls_get_both_serdes(ha, i, dptr, indptr,
791			xfi_d_valid, xfi_ind_valid);
792	}
793
794	if (ha->pci_func & 1) {
795		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pll);
796		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pll);
797	} else {
798		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pll);
799		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pll);
800	}
801
802	for (i = 0x1e00; i <= 0x1e1f; i++, dptr ++, indptr ++) {
803		qls_get_both_serdes(ha, i, dptr, indptr,
804			xfi_d_valid, xfi_ind_valid);
805	}
806
807	return(0);
808}
809
810static int
811qls_unpause_mpi_risc(qla_host_t *ha)
812{
813	uint32_t data;
814
815	data = READ_REG32(ha, Q81_CTL_HOST_CMD_STATUS);
816
817	if (!(data & Q81_CTL_HCS_RISC_PAUSED))
818		return -1;
819
820	WRITE_REG32(ha, Q81_CTL_HOST_CMD_STATUS, \
821		Q81_CTL_HCS_CMD_CLR_RISC_PAUSE);
822
823	return 0;
824}
825
826static int
827qls_pause_mpi_risc(qla_host_t *ha)
828{
829	uint32_t data;
830	int count = 10;
831
832	WRITE_REG32(ha, Q81_CTL_HOST_CMD_STATUS, \
833		Q81_CTL_HCS_CMD_SET_RISC_PAUSE);
834
835	do {
836		data = READ_REG32(ha, Q81_CTL_HOST_CMD_STATUS);
837
838		if (data & Q81_CTL_HCS_RISC_PAUSED)
839			break;
840
841		qls_mdelay(__func__, 10);
842
843		count--;
844
845	} while (count);
846
847	return ((count == 0) ? -1 : 0);
848}
849
850static void
851qls_get_intr_states(qla_host_t *ha, uint32_t *buf)
852{
853	int i;
854
855	for (i = 0; i < MAX_RX_RINGS; i++, buf++) {
856
857		WRITE_REG32(ha, Q81_CTL_INTR_ENABLE, (0x037f0300 + i));
858
859		*buf = READ_REG32(ha, Q81_CTL_INTR_ENABLE);
860	}
861}
862
863static int
864qls_rd_xgmac_reg(qla_host_t *ha, uint32_t reg, uint32_t*data)
865{
866	int ret = 0;
867
868	ret = qls_wait_reg_rdy(ha, Q81_CTL_XGMAC_ADDR, Q81_XGMAC_ADDR_RDY,
869			Q81_XGMAC_ADDR_XME);
870	if (ret)
871		goto exit_qls_rd_xgmac_reg;
872
873	WRITE_REG32(ha, Q81_CTL_XGMAC_ADDR, (reg | Q81_XGMAC_ADDR_R));
874
875	ret = qls_wait_reg_rdy(ha, Q81_CTL_XGMAC_ADDR, Q81_XGMAC_ADDR_RDY,
876			Q81_XGMAC_ADDR_XME);
877	if (ret)
878		goto exit_qls_rd_xgmac_reg;
879
880	*data = READ_REG32(ha, Q81_CTL_XGMAC_DATA);
881
882exit_qls_rd_xgmac_reg:
883	return ret;
884}
885
886static int
887qls_rd_xgmac_regs(qla_host_t *ha, uint32_t *buf, uint32_t o_func)
888{
889	int ret = 0;
890	int i;
891
892	for (i = 0; i < Q81_XGMAC_REGISTER_END; i += 4, buf ++) {
893
894		switch (i) {
895		case  Q81_PAUSE_SRC_LO               :
896		case  Q81_PAUSE_SRC_HI               :
897		case  Q81_GLOBAL_CFG                 :
898		case  Q81_TX_CFG                     :
899		case  Q81_RX_CFG                     :
900		case  Q81_FLOW_CTL                   :
901		case  Q81_PAUSE_OPCODE               :
902		case  Q81_PAUSE_TIMER                :
903		case  Q81_PAUSE_FRM_DEST_LO          :
904		case  Q81_PAUSE_FRM_DEST_HI          :
905		case  Q81_MAC_TX_PARAMS              :
906		case  Q81_MAC_RX_PARAMS              :
907		case  Q81_MAC_SYS_INT                :
908		case  Q81_MAC_SYS_INT_MASK           :
909		case  Q81_MAC_MGMT_INT               :
910		case  Q81_MAC_MGMT_IN_MASK           :
911		case  Q81_EXT_ARB_MODE               :
912		case  Q81_TX_PKTS                    :
913		case  Q81_TX_PKTS_LO                 :
914		case  Q81_TX_BYTES                   :
915		case  Q81_TX_BYTES_LO                :
916		case  Q81_TX_MCAST_PKTS              :
917		case  Q81_TX_MCAST_PKTS_LO           :
918		case  Q81_TX_BCAST_PKTS              :
919		case  Q81_TX_BCAST_PKTS_LO           :
920		case  Q81_TX_UCAST_PKTS              :
921		case  Q81_TX_UCAST_PKTS_LO           :
922		case  Q81_TX_CTL_PKTS                :
923		case  Q81_TX_CTL_PKTS_LO             :
924		case  Q81_TX_PAUSE_PKTS              :
925		case  Q81_TX_PAUSE_PKTS_LO           :
926		case  Q81_TX_64_PKT                  :
927		case  Q81_TX_64_PKT_LO               :
928		case  Q81_TX_65_TO_127_PKT           :
929		case  Q81_TX_65_TO_127_PKT_LO        :
930		case  Q81_TX_128_TO_255_PKT          :
931		case  Q81_TX_128_TO_255_PKT_LO       :
932		case  Q81_TX_256_511_PKT             :
933		case  Q81_TX_256_511_PKT_LO          :
934		case  Q81_TX_512_TO_1023_PKT         :
935		case  Q81_TX_512_TO_1023_PKT_LO      :
936		case  Q81_TX_1024_TO_1518_PKT        :
937		case  Q81_TX_1024_TO_1518_PKT_LO     :
938		case  Q81_TX_1519_TO_MAX_PKT         :
939		case  Q81_TX_1519_TO_MAX_PKT_LO      :
940		case  Q81_TX_UNDERSIZE_PKT           :
941		case  Q81_TX_UNDERSIZE_PKT_LO        :
942		case  Q81_TX_OVERSIZE_PKT            :
943		case  Q81_TX_OVERSIZE_PKT_LO         :
944		case  Q81_RX_HALF_FULL_DET           :
945		case  Q81_TX_HALF_FULL_DET_LO        :
946		case  Q81_RX_OVERFLOW_DET            :
947		case  Q81_TX_OVERFLOW_DET_LO         :
948		case  Q81_RX_HALF_FULL_MASK          :
949		case  Q81_TX_HALF_FULL_MASK_LO       :
950		case  Q81_RX_OVERFLOW_MASK           :
951		case  Q81_TX_OVERFLOW_MASK_LO        :
952		case  Q81_STAT_CNT_CTL               :
953		case  Q81_AUX_RX_HALF_FULL_DET       :
954		case  Q81_AUX_TX_HALF_FULL_DET       :
955		case  Q81_AUX_RX_OVERFLOW_DET        :
956		case  Q81_AUX_TX_OVERFLOW_DET        :
957		case  Q81_AUX_RX_HALF_FULL_MASK      :
958		case  Q81_AUX_TX_HALF_FULL_MASK      :
959		case  Q81_AUX_RX_OVERFLOW_MASK       :
960		case  Q81_AUX_TX_OVERFLOW_MASK       :
961		case  Q81_RX_BYTES                   :
962		case  Q81_RX_BYTES_LO                :
963		case  Q81_RX_BYTES_OK                :
964		case  Q81_RX_BYTES_OK_LO             :
965		case  Q81_RX_PKTS                    :
966		case  Q81_RX_PKTS_LO                 :
967		case  Q81_RX_PKTS_OK                 :
968		case  Q81_RX_PKTS_OK_LO              :
969		case  Q81_RX_BCAST_PKTS              :
970		case  Q81_RX_BCAST_PKTS_LO           :
971		case  Q81_RX_MCAST_PKTS              :
972		case  Q81_RX_MCAST_PKTS_LO           :
973		case  Q81_RX_UCAST_PKTS              :
974		case  Q81_RX_UCAST_PKTS_LO           :
975		case  Q81_RX_UNDERSIZE_PKTS          :
976		case  Q81_RX_UNDERSIZE_PKTS_LO       :
977		case  Q81_RX_OVERSIZE_PKTS           :
978		case  Q81_RX_OVERSIZE_PKTS_LO        :
979		case  Q81_RX_JABBER_PKTS             :
980		case  Q81_RX_JABBER_PKTS_LO          :
981		case  Q81_RX_UNDERSIZE_FCERR_PKTS    :
982		case  Q81_RX_UNDERSIZE_FCERR_PKTS_LO :
983		case  Q81_RX_DROP_EVENTS             :
984		case  Q81_RX_DROP_EVENTS_LO          :
985		case  Q81_RX_FCERR_PKTS              :
986		case  Q81_RX_FCERR_PKTS_LO           :
987		case  Q81_RX_ALIGN_ERR               :
988		case  Q81_RX_ALIGN_ERR_LO            :
989		case  Q81_RX_SYMBOL_ERR              :
990		case  Q81_RX_SYMBOL_ERR_LO           :
991		case  Q81_RX_MAC_ERR                 :
992		case  Q81_RX_MAC_ERR_LO              :
993		case  Q81_RX_CTL_PKTS                :
994		case  Q81_RX_CTL_PKTS_LO             :
995		case  Q81_RX_PAUSE_PKTS              :
996		case  Q81_RX_PAUSE_PKTS_LO           :
997		case  Q81_RX_64_PKTS                 :
998		case  Q81_RX_64_PKTS_LO              :
999		case  Q81_RX_65_TO_127_PKTS          :
1000		case  Q81_RX_65_TO_127_PKTS_LO       :
1001		case  Q81_RX_128_255_PKTS            :
1002		case  Q81_RX_128_255_PKTS_LO         :
1003		case  Q81_RX_256_511_PKTS            :
1004		case  Q81_RX_256_511_PKTS_LO         :
1005		case  Q81_RX_512_TO_1023_PKTS        :
1006		case  Q81_RX_512_TO_1023_PKTS_LO     :
1007		case  Q81_RX_1024_TO_1518_PKTS       :
1008		case  Q81_RX_1024_TO_1518_PKTS_LO    :
1009		case  Q81_RX_1519_TO_MAX_PKTS        :
1010		case  Q81_RX_1519_TO_MAX_PKTS_LO     :
1011		case  Q81_RX_LEN_ERR_PKTS            :
1012		case  Q81_RX_LEN_ERR_PKTS_LO         :
1013		case  Q81_MDIO_TX_DATA               :
1014		case  Q81_MDIO_RX_DATA               :
1015		case  Q81_MDIO_CMD                   :
1016		case  Q81_MDIO_PHY_ADDR              :
1017		case  Q81_MDIO_PORT                  :
1018		case  Q81_MDIO_STATUS                :
1019		case  Q81_TX_CBFC_PAUSE_FRAMES0      :
1020		case  Q81_TX_CBFC_PAUSE_FRAMES0_LO   :
1021		case  Q81_TX_CBFC_PAUSE_FRAMES1      :
1022		case  Q81_TX_CBFC_PAUSE_FRAMES1_LO   :
1023		case  Q81_TX_CBFC_PAUSE_FRAMES2      :
1024		case  Q81_TX_CBFC_PAUSE_FRAMES2_LO   :
1025		case  Q81_TX_CBFC_PAUSE_FRAMES3      :
1026		case  Q81_TX_CBFC_PAUSE_FRAMES3_LO   :
1027		case  Q81_TX_CBFC_PAUSE_FRAMES4      :
1028		case  Q81_TX_CBFC_PAUSE_FRAMES4_LO   :
1029		case  Q81_TX_CBFC_PAUSE_FRAMES5      :
1030		case  Q81_TX_CBFC_PAUSE_FRAMES5_LO   :
1031		case  Q81_TX_CBFC_PAUSE_FRAMES6      :
1032		case  Q81_TX_CBFC_PAUSE_FRAMES6_LO   :
1033		case  Q81_TX_CBFC_PAUSE_FRAMES7      :
1034		case  Q81_TX_CBFC_PAUSE_FRAMES7_LO   :
1035		case  Q81_TX_FCOE_PKTS               :
1036		case  Q81_TX_FCOE_PKTS_LO            :
1037		case  Q81_TX_MGMT_PKTS               :
1038		case  Q81_TX_MGMT_PKTS_LO            :
1039		case  Q81_RX_CBFC_PAUSE_FRAMES0      :
1040		case  Q81_RX_CBFC_PAUSE_FRAMES0_LO   :
1041		case  Q81_RX_CBFC_PAUSE_FRAMES1      :
1042		case  Q81_RX_CBFC_PAUSE_FRAMES1_LO   :
1043		case  Q81_RX_CBFC_PAUSE_FRAMES2      :
1044		case  Q81_RX_CBFC_PAUSE_FRAMES2_LO   :
1045		case  Q81_RX_CBFC_PAUSE_FRAMES3      :
1046		case  Q81_RX_CBFC_PAUSE_FRAMES3_LO   :
1047		case  Q81_RX_CBFC_PAUSE_FRAMES4      :
1048		case  Q81_RX_CBFC_PAUSE_FRAMES4_LO   :
1049		case  Q81_RX_CBFC_PAUSE_FRAMES5      :
1050		case  Q81_RX_CBFC_PAUSE_FRAMES5_LO   :
1051		case  Q81_RX_CBFC_PAUSE_FRAMES6      :
1052		case  Q81_RX_CBFC_PAUSE_FRAMES6_LO   :
1053		case  Q81_RX_CBFC_PAUSE_FRAMES7      :
1054		case  Q81_RX_CBFC_PAUSE_FRAMES7_LO   :
1055		case  Q81_RX_FCOE_PKTS               :
1056		case  Q81_RX_FCOE_PKTS_LO            :
1057		case  Q81_RX_MGMT_PKTS               :
1058		case  Q81_RX_MGMT_PKTS_LO            :
1059		case  Q81_RX_NIC_FIFO_DROP           :
1060		case  Q81_RX_NIC_FIFO_DROP_LO        :
1061		case  Q81_RX_FCOE_FIFO_DROP          :
1062		case  Q81_RX_FCOE_FIFO_DROP_LO       :
1063		case  Q81_RX_MGMT_FIFO_DROP          :
1064		case  Q81_RX_MGMT_FIFO_DROP_LO       :
1065		case  Q81_RX_PKTS_PRIORITY0          :
1066		case  Q81_RX_PKTS_PRIORITY0_LO       :
1067		case  Q81_RX_PKTS_PRIORITY1          :
1068		case  Q81_RX_PKTS_PRIORITY1_LO       :
1069		case  Q81_RX_PKTS_PRIORITY2          :
1070		case  Q81_RX_PKTS_PRIORITY2_LO       :
1071		case  Q81_RX_PKTS_PRIORITY3          :
1072		case  Q81_RX_PKTS_PRIORITY3_LO       :
1073		case  Q81_RX_PKTS_PRIORITY4          :
1074		case  Q81_RX_PKTS_PRIORITY4_LO       :
1075		case  Q81_RX_PKTS_PRIORITY5          :
1076		case  Q81_RX_PKTS_PRIORITY5_LO       :
1077		case  Q81_RX_PKTS_PRIORITY6          :
1078		case  Q81_RX_PKTS_PRIORITY6_LO       :
1079		case  Q81_RX_PKTS_PRIORITY7          :
1080		case  Q81_RX_PKTS_PRIORITY7_LO       :
1081		case  Q81_RX_OCTETS_PRIORITY0        :
1082		case  Q81_RX_OCTETS_PRIORITY0_LO     :
1083		case  Q81_RX_OCTETS_PRIORITY1        :
1084		case  Q81_RX_OCTETS_PRIORITY1_LO     :
1085		case  Q81_RX_OCTETS_PRIORITY2        :
1086		case  Q81_RX_OCTETS_PRIORITY2_LO     :
1087		case  Q81_RX_OCTETS_PRIORITY3        :
1088		case  Q81_RX_OCTETS_PRIORITY3_LO     :
1089		case  Q81_RX_OCTETS_PRIORITY4        :
1090		case  Q81_RX_OCTETS_PRIORITY4_LO     :
1091		case  Q81_RX_OCTETS_PRIORITY5        :
1092		case  Q81_RX_OCTETS_PRIORITY5_LO     :
1093		case  Q81_RX_OCTETS_PRIORITY6        :
1094		case  Q81_RX_OCTETS_PRIORITY6_LO     :
1095		case  Q81_RX_OCTETS_PRIORITY7        :
1096		case  Q81_RX_OCTETS_PRIORITY7_LO     :
1097		case  Q81_TX_PKTS_PRIORITY0          :
1098		case  Q81_TX_PKTS_PRIORITY0_LO       :
1099		case  Q81_TX_PKTS_PRIORITY1          :
1100		case  Q81_TX_PKTS_PRIORITY1_LO       :
1101		case  Q81_TX_PKTS_PRIORITY2          :
1102		case  Q81_TX_PKTS_PRIORITY2_LO       :
1103		case  Q81_TX_PKTS_PRIORITY3          :
1104		case  Q81_TX_PKTS_PRIORITY3_LO       :
1105		case  Q81_TX_PKTS_PRIORITY4          :
1106		case  Q81_TX_PKTS_PRIORITY4_LO       :
1107		case  Q81_TX_PKTS_PRIORITY5          :
1108		case  Q81_TX_PKTS_PRIORITY5_LO       :
1109		case  Q81_TX_PKTS_PRIORITY6          :
1110		case  Q81_TX_PKTS_PRIORITY6_LO       :
1111		case  Q81_TX_PKTS_PRIORITY7          :
1112		case  Q81_TX_PKTS_PRIORITY7_LO       :
1113		case  Q81_TX_OCTETS_PRIORITY0        :
1114		case  Q81_TX_OCTETS_PRIORITY0_LO     :
1115		case  Q81_TX_OCTETS_PRIORITY1        :
1116		case  Q81_TX_OCTETS_PRIORITY1_LO     :
1117		case  Q81_TX_OCTETS_PRIORITY2        :
1118		case  Q81_TX_OCTETS_PRIORITY2_LO     :
1119		case  Q81_TX_OCTETS_PRIORITY3        :
1120		case  Q81_TX_OCTETS_PRIORITY3_LO     :
1121		case  Q81_TX_OCTETS_PRIORITY4        :
1122		case  Q81_TX_OCTETS_PRIORITY4_LO     :
1123		case  Q81_TX_OCTETS_PRIORITY5        :
1124		case  Q81_TX_OCTETS_PRIORITY5_LO     :
1125		case  Q81_TX_OCTETS_PRIORITY6        :
1126		case  Q81_TX_OCTETS_PRIORITY6_LO     :
1127		case  Q81_TX_OCTETS_PRIORITY7        :
1128		case  Q81_TX_OCTETS_PRIORITY7_LO     :
1129		case  Q81_RX_DISCARD_PRIORITY0       :
1130		case  Q81_RX_DISCARD_PRIORITY0_LO    :
1131		case  Q81_RX_DISCARD_PRIORITY1       :
1132		case  Q81_RX_DISCARD_PRIORITY1_LO    :
1133		case  Q81_RX_DISCARD_PRIORITY2       :
1134		case  Q81_RX_DISCARD_PRIORITY2_LO    :
1135		case  Q81_RX_DISCARD_PRIORITY3       :
1136		case  Q81_RX_DISCARD_PRIORITY3_LO    :
1137		case  Q81_RX_DISCARD_PRIORITY4       :
1138		case  Q81_RX_DISCARD_PRIORITY4_LO    :
1139		case  Q81_RX_DISCARD_PRIORITY5       :
1140		case  Q81_RX_DISCARD_PRIORITY5_LO    :
1141		case  Q81_RX_DISCARD_PRIORITY6       :
1142		case  Q81_RX_DISCARD_PRIORITY6_LO    :
1143		case  Q81_RX_DISCARD_PRIORITY7       :
1144		case  Q81_RX_DISCARD_PRIORITY7_LO    :
1145
1146			if (o_func)
1147				ret = qls_rd_ofunc_xgmac_reg(ha,
1148						i, buf);
1149			else
1150				ret = qls_rd_xgmac_reg(ha, i, buf);
1151
1152			if (ret)
1153				*buf = Q81_BAD_DATA;
1154
1155			break;
1156
1157		default:
1158			break;
1159
1160		}
1161	}
1162	return 0;
1163}
1164
1165static int
1166qls_get_mpi_regs(qla_host_t *ha, uint32_t *buf, uint32_t offset, uint32_t count)
1167{
1168	int i, ret = 0;
1169
1170	for (i = 0; i < count; i++, buf++) {
1171
1172		ret = qls_rd_mpi_reg(ha, (offset + i), buf);
1173
1174		if (ret)
1175			return ret;
1176	}
1177
1178	return (ret);
1179}
1180
1181static int
1182qls_get_mpi_shadow_regs(qla_host_t *ha, uint32_t *buf)
1183{
1184	uint32_t	i;
1185	int		ret;
1186
1187#define Q81_RISC_124 0x0000007c
1188#define Q81_RISC_127 0x0000007f
1189#define Q81_SHADOW_OFFSET 0xb0000000
1190
1191	for (i = 0; i < Q81_MPI_CORE_SH_REGS_CNT; i++, buf++) {
1192
1193		ret = qls_wr_mpi_reg(ha,
1194				(Q81_CTL_PROC_ADDR_RISC_INT_REG | Q81_RISC_124),
1195                                (Q81_SHADOW_OFFSET | i << 20));
1196		if (ret)
1197			goto exit_qls_get_mpi_shadow_regs;
1198
1199		ret = qls_mpi_risc_rd_reg(ha,
1200				(Q81_CTL_PROC_ADDR_RISC_INT_REG | Q81_RISC_127),
1201				 buf);
1202		if (ret)
1203			goto exit_qls_get_mpi_shadow_regs;
1204	}
1205
1206exit_qls_get_mpi_shadow_regs:
1207	return ret;
1208}
1209
1210#define SYS_CLOCK (0x00)
1211#define PCI_CLOCK (0x80)
1212#define FC_CLOCK  (0x140)
1213#define XGM_CLOCK (0x180)
1214
1215#define Q81_ADDRESS_REGISTER_ENABLE 0x00010000
1216#define Q81_UP                      0x00008000
1217#define Q81_MAX_MUX                 0x40
1218#define Q81_MAX_MODULES             0x1F
1219
1220static uint32_t *
1221qls_get_probe(qla_host_t *ha, uint32_t clock, uint8_t *valid, uint32_t *buf)
1222{
1223	uint32_t module, mux_sel, probe, lo_val, hi_val;
1224
1225	for (module = 0; module < Q81_MAX_MODULES; module ++) {
1226
1227		if (valid[module]) {
1228
1229			for (mux_sel = 0; mux_sel < Q81_MAX_MUX; mux_sel++) {
1230
1231				probe = clock | Q81_ADDRESS_REGISTER_ENABLE |
1232						mux_sel | (module << 9);
1233				WRITE_REG32(ha, Q81_CTL_XG_PROBE_MUX_ADDR,\
1234					probe);
1235
1236				lo_val = READ_REG32(ha,\
1237						Q81_CTL_XG_PROBE_MUX_DATA);
1238
1239				if (mux_sel == 0) {
1240					*buf = probe;
1241					buf ++;
1242				}
1243
1244				probe |= Q81_UP;
1245
1246				WRITE_REG32(ha, Q81_CTL_XG_PROBE_MUX_ADDR,\
1247					probe);
1248				hi_val = READ_REG32(ha,\
1249						Q81_CTL_XG_PROBE_MUX_DATA);
1250
1251				*buf = lo_val;
1252				buf++;
1253				*buf = hi_val;
1254				buf++;
1255			}
1256		}
1257	}
1258
1259	return(buf);
1260}
1261
1262static int
1263qls_get_probe_dump(qla_host_t *ha, uint32_t *buf)
1264{
1265
1266	uint8_t sys_clock_valid_modules[0x20] = {
1267		1,   // 0x00
1268		1,   // 0x01
1269		1,   // 0x02
1270		0,   // 0x03
1271		1,   // 0x04
1272		1,   // 0x05
1273		1,   // 0x06
1274		1,   // 0x07
1275		1,   // 0x08
1276		1,   // 0x09
1277		1,   // 0x0A
1278		1,   // 0x0B
1279		1,   // 0x0C
1280		1,   // 0x0D
1281		1,   // 0x0E
1282		0,   // 0x0F
1283		1,   // 0x10
1284		1,   // 0x11
1285		1,   // 0x12
1286		1,   // 0x13
1287		0,   // 0x14
1288		0,   // 0x15
1289		0,   // 0x16
1290		0,   // 0x17
1291		0,   // 0x18
1292		0,   // 0x19
1293		0,   // 0x1A
1294		0,   // 0x1B
1295		0,   // 0x1C
1296		0,   // 0x1D
1297		0,   // 0x1E
1298		0    // 0x1F
1299	};
1300
1301
1302	uint8_t pci_clock_valid_modules[0x20] = {
1303		1,   // 0x00
1304		0,   // 0x01
1305		0,   // 0x02
1306		0,   // 0x03
1307		0,   // 0x04
1308		0,   // 0x05
1309		1,   // 0x06
1310		1,   // 0x07
1311		0,   // 0x08
1312		0,   // 0x09
1313		0,   // 0x0A
1314		0,   // 0x0B
1315		0,   // 0x0C
1316		0,   // 0x0D
1317		1,   // 0x0E
1318		0,   // 0x0F
1319		0,   // 0x10
1320		0,   // 0x11
1321		0,   // 0x12
1322		0,   // 0x13
1323		0,   // 0x14
1324		0,   // 0x15
1325		0,   // 0x16
1326		0,   // 0x17
1327		0,   // 0x18
1328		0,   // 0x19
1329		0,   // 0x1A
1330		0,   // 0x1B
1331		0,   // 0x1C
1332		0,   // 0x1D
1333		0,   // 0x1E
1334		0    // 0x1F
1335	};
1336
1337
1338	uint8_t xgm_clock_valid_modules[0x20] = {
1339		1,   // 0x00
1340		0,   // 0x01
1341		0,   // 0x02
1342		1,   // 0x03
1343		0,   // 0x04
1344		0,   // 0x05
1345		0,   // 0x06
1346		0,   // 0x07
1347		1,   // 0x08
1348		1,   // 0x09
1349		0,   // 0x0A
1350		0,   // 0x0B
1351		1,   // 0x0C
1352		1,   // 0x0D
1353		1,   // 0x0E
1354		0,   // 0x0F
1355		1,   // 0x10
1356		1,   // 0x11
1357		0,   // 0x12
1358		0,   // 0x13
1359		0,   // 0x14
1360		0,   // 0x15
1361		0,   // 0x16
1362		0,   // 0x17
1363		0,   // 0x18
1364		0,   // 0x19
1365		0,   // 0x1A
1366		0,   // 0x1B
1367		0,   // 0x1C
1368		0,   // 0x1D
1369		0,   // 0x1E
1370		0    // 0x1F
1371	};
1372
1373	uint8_t fc_clock_valid_modules[0x20] = {
1374		1,   // 0x00
1375		0,   // 0x01
1376		0,   // 0x02
1377		0,   // 0x03
1378		0,   // 0x04
1379		0,   // 0x05
1380		0,   // 0x06
1381		0,   // 0x07
1382		0,   // 0x08
1383		0,   // 0x09
1384		0,   // 0x0A
1385		0,   // 0x0B
1386		1,   // 0x0C
1387		1,   // 0x0D
1388		0,   // 0x0E
1389		0,   // 0x0F
1390		0,   // 0x10
1391		0,   // 0x11
1392		0,   // 0x12
1393		0,   // 0x13
1394		0,   // 0x14
1395		0,   // 0x15
1396		0,   // 0x16
1397		0,   // 0x17
1398		0,   // 0x18
1399		0,   // 0x19
1400		0,   // 0x1A
1401		0,   // 0x1B
1402		0,   // 0x1C
1403		0,   // 0x1D
1404		0,   // 0x1E
1405		0    // 0x1F
1406	};
1407
1408	qls_wr_mpi_reg(ha, 0x100e, 0x18a20000);
1409
1410	buf = qls_get_probe(ha, SYS_CLOCK, sys_clock_valid_modules, buf);
1411
1412	buf = qls_get_probe(ha, PCI_CLOCK, pci_clock_valid_modules, buf);
1413
1414	buf = qls_get_probe(ha, XGM_CLOCK, xgm_clock_valid_modules, buf);
1415
1416	buf = qls_get_probe(ha, FC_CLOCK, fc_clock_valid_modules, buf);
1417
1418	return(0);
1419}
1420
1421static void
1422qls_get_ridx_registers(qla_host_t *ha, uint32_t *buf)
1423{
1424	uint32_t type, idx, idx_max;
1425	uint32_t r_idx;
1426	uint32_t r_data;
1427	uint32_t val;
1428
1429	for (type = 0; type < 4; type ++) {
1430		if (type < 2)
1431			idx_max = 8;
1432		else
1433			idx_max = 16;
1434
1435		for (idx = 0; idx < idx_max; idx ++) {
1436
1437			val = 0x04000000 | (type << 16) | (idx << 8);
1438			WRITE_REG32(ha, Q81_CTL_ROUTING_INDEX, val);
1439
1440			r_idx = 0;
1441			while ((r_idx & 0x40000000) == 0)
1442				r_idx = READ_REG32(ha, Q81_CTL_ROUTING_INDEX);
1443
1444			r_data = READ_REG32(ha, Q81_CTL_ROUTING_DATA);
1445
1446			*buf = type;
1447			buf ++;
1448			*buf = idx;
1449			buf ++;
1450			*buf = r_idx;
1451			buf ++;
1452			*buf = r_data;
1453			buf ++;
1454		}
1455	}
1456}
1457
1458static void
1459qls_get_mac_proto_regs(qla_host_t *ha, uint32_t* buf)
1460{
1461
1462#define Q81_RS_AND_ADR 0x06000000
1463#define Q81_RS_ONLY    0x04000000
1464#define Q81_NUM_TYPES  10
1465
1466	uint32_t result_index, result_data;
1467	uint32_t type;
1468	uint32_t index;
1469	uint32_t offset;
1470	uint32_t val;
1471	uint32_t initial_val;
1472	uint32_t max_index;
1473	uint32_t max_offset;
1474
1475	for (type = 0; type < Q81_NUM_TYPES; type ++) {
1476		switch (type) {
1477
1478		case 0: // CAM
1479			initial_val = Q81_RS_AND_ADR;
1480			max_index = 512;
1481			max_offset = 3;
1482			break;
1483
1484		case 1: // Multicast MAC Address
1485			initial_val = Q81_RS_ONLY;
1486			max_index = 32;
1487			max_offset = 2;
1488			break;
1489
1490		case 2: // VLAN filter mask
1491		case 3: // MC filter mask
1492			initial_val = Q81_RS_ONLY;
1493			max_index = 4096;
1494			max_offset = 1;
1495			break;
1496
1497		case 4: // FC MAC addresses
1498			initial_val = Q81_RS_ONLY;
1499			max_index = 4;
1500			max_offset = 2;
1501			break;
1502
1503		case 5: // Mgmt MAC addresses
1504			initial_val = Q81_RS_ONLY;
1505			max_index = 8;
1506			max_offset = 2;
1507			break;
1508
1509		case 6: // Mgmt VLAN addresses
1510			initial_val = Q81_RS_ONLY;
1511			max_index = 16;
1512			max_offset = 1;
1513			break;
1514
1515		case 7: // Mgmt IPv4 address
1516			initial_val = Q81_RS_ONLY;
1517			max_index = 4;
1518			max_offset = 1;
1519			break;
1520
1521		case 8: // Mgmt IPv6 address
1522			initial_val = Q81_RS_ONLY;
1523			max_index = 4;
1524			max_offset = 4;
1525			break;
1526
1527		case 9: // Mgmt TCP/UDP Dest port
1528			initial_val = Q81_RS_ONLY;
1529			max_index = 4;
1530			max_offset = 1;
1531			break;
1532
1533		default:
1534			printf("Bad type!!! 0x%08x\n", type);
1535			max_index = 0;
1536			max_offset = 0;
1537			break;
1538		}
1539
1540		for (index = 0; index < max_index; index ++) {
1541
1542			for (offset = 0; offset < max_offset; offset ++) {
1543
1544				val = initial_val | (type << 16) |
1545					(index << 4) | (offset);
1546
1547				WRITE_REG32(ha, Q81_CTL_MAC_PROTO_ADDR_INDEX,\
1548					val);
1549
1550				result_index = 0;
1551
1552				while ((result_index & 0x40000000) == 0)
1553					result_index =
1554						READ_REG32(ha, \
1555						Q81_CTL_MAC_PROTO_ADDR_INDEX);
1556
1557				result_data = READ_REG32(ha,\
1558						Q81_CTL_MAC_PROTO_ADDR_DATA);
1559
1560				*buf = result_index;
1561				buf ++;
1562
1563				*buf = result_data;
1564				buf ++;
1565			}
1566		}
1567	}
1568}
1569
1570static int
1571qls_get_ets_regs(qla_host_t *ha, uint32_t *buf)
1572{
1573	int ret = 0;
1574	int i;
1575
1576	for(i = 0; i < 8; i ++, buf ++) {
1577		WRITE_REG32(ha, Q81_CTL_NIC_ENH_TX_SCHD, \
1578			((i << 29) | 0x08000000));
1579		*buf = READ_REG32(ha, Q81_CTL_NIC_ENH_TX_SCHD);
1580	}
1581
1582	for(i = 0; i < 2; i ++, buf ++) {
1583		WRITE_REG32(ha, Q81_CTL_CNA_ENH_TX_SCHD, \
1584			((i << 29) | 0x08000000));
1585		*buf = READ_REG32(ha, Q81_CTL_CNA_ENH_TX_SCHD);
1586	}
1587
1588	return ret;
1589}
1590
1591int
1592qls_mpi_core_dump(qla_host_t *ha)
1593{
1594	int ret;
1595	int i;
1596	uint32_t reg, reg_val;
1597
1598	qls_mpi_coredump_t *mpi_dump = &ql_mpi_coredump;
1599
1600	ret = qls_pause_mpi_risc(ha);
1601	if (ret) {
1602		printf("Failed RISC pause. Status = 0x%.08x\n",ret);
1603		return(-1);
1604	}
1605
1606	memset(&(mpi_dump->mpi_global_header), 0,
1607			sizeof(qls_mpid_glbl_hdr_t));
1608
1609	mpi_dump->mpi_global_header.cookie = Q81_MPID_COOKIE;
1610	mpi_dump->mpi_global_header.hdr_size =
1611		sizeof(qls_mpid_glbl_hdr_t);
1612	mpi_dump->mpi_global_header.img_size =
1613		sizeof(qls_mpi_coredump_t);
1614
1615	memcpy(mpi_dump->mpi_global_header.id, "MPI Coredump",
1616		sizeof(mpi_dump->mpi_global_header.id));
1617
1618	qls_mpid_seg_hdr(&mpi_dump->nic1_regs_seg_hdr,
1619		Q81_NIC1_CONTROL_SEG_NUM,
1620		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic1_regs)),
1621		"NIC1 Registers");
1622
1623	qls_mpid_seg_hdr(&mpi_dump->nic2_regs_seg_hdr,
1624		Q81_NIC2_CONTROL_SEG_NUM,
1625		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic2_regs)),
1626		"NIC2 Registers");
1627
1628	qls_mpid_seg_hdr(&mpi_dump->xgmac1_seg_hdr,
1629		Q81_NIC1_XGMAC_SEG_NUM,
1630		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->xgmac1)),
1631		"NIC1 XGMac Registers");
1632
1633	qls_mpid_seg_hdr(&mpi_dump->xgmac2_seg_hdr,
1634		Q81_NIC2_XGMAC_SEG_NUM,
1635		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->xgmac2)),
1636		"NIC2 XGMac Registers");
1637
1638	if (ha->pci_func & 1) {
1639		for (i = 0; i < 64; i++)
1640			mpi_dump->nic2_regs[i] =
1641				READ_REG32(ha, i * sizeof(uint32_t));
1642
1643		for (i = 0; i < 64; i++)
1644			mpi_dump->nic1_regs[i] =
1645				qls_rd_ofunc_reg(ha,
1646					(i * sizeof(uint32_t)) / 4);
1647
1648		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac2[0], 0);
1649		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac1[0], 1);
1650	} else {
1651		for (i = 0; i < 64; i++)
1652			mpi_dump->nic1_regs[i] =
1653				READ_REG32(ha, i * sizeof(uint32_t));
1654
1655		for (i = 0; i < 64; i++)
1656			mpi_dump->nic2_regs[i] =
1657				qls_rd_ofunc_reg(ha,
1658					(i * sizeof(uint32_t)) / 4);
1659
1660		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac1[0], 0);
1661		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac2[0], 1);
1662	}
1663
1664
1665	qls_mpid_seg_hdr(&mpi_dump->xaui1_an_hdr,
1666		Q81_XAUI1_AN_SEG_NUM,
1667		(sizeof(qls_mpid_seg_hdr_t) +
1668			sizeof(mpi_dump->serdes1_xaui_an)),
1669		"XAUI1 AN Registers");
1670
1671	qls_mpid_seg_hdr(&mpi_dump->xaui1_hss_pcs_hdr,
1672		Q81_XAUI1_HSS_PCS_SEG_NUM,
1673		(sizeof(qls_mpid_seg_hdr_t) +
1674			sizeof(mpi_dump->serdes1_xaui_hss_pcs)),
1675		"XAUI1 HSS PCS Registers");
1676
1677	qls_mpid_seg_hdr(&mpi_dump->xfi1_an_hdr,
1678		Q81_XFI1_AN_SEG_NUM,
1679		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->serdes1_xfi_an)),
1680		"XFI1 AN Registers");
1681
1682	qls_mpid_seg_hdr(&mpi_dump->xfi1_train_hdr,
1683		Q81_XFI1_TRAIN_SEG_NUM,
1684		(sizeof(qls_mpid_seg_hdr_t) +
1685			sizeof(mpi_dump->serdes1_xfi_train)),
1686		"XFI1 TRAIN Registers");
1687
1688	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_pcs_hdr,
1689		Q81_XFI1_HSS_PCS_SEG_NUM,
1690		(sizeof(qls_mpid_seg_hdr_t) +
1691			sizeof(mpi_dump->serdes1_xfi_hss_pcs)),
1692		"XFI1 HSS PCS Registers");
1693
1694	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_tx_hdr,
1695		Q81_XFI1_HSS_TX_SEG_NUM,
1696		(sizeof(qls_mpid_seg_hdr_t) +
1697			sizeof(mpi_dump->serdes1_xfi_hss_tx)),
1698		"XFI1 HSS TX Registers");
1699
1700	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_rx_hdr,
1701		Q81_XFI1_HSS_RX_SEG_NUM,
1702		(sizeof(qls_mpid_seg_hdr_t) +
1703			sizeof(mpi_dump->serdes1_xfi_hss_rx)),
1704		"XFI1 HSS RX Registers");
1705
1706	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_pll_hdr,
1707		Q81_XFI1_HSS_PLL_SEG_NUM,
1708		(sizeof(qls_mpid_seg_hdr_t) +
1709			sizeof(mpi_dump->serdes1_xfi_hss_pll)),
1710		"XFI1 HSS PLL Registers");
1711
1712	qls_mpid_seg_hdr(&mpi_dump->xaui2_an_hdr,
1713		Q81_XAUI2_AN_SEG_NUM,
1714		(sizeof(qls_mpid_seg_hdr_t) +
1715			sizeof(mpi_dump->serdes2_xaui_an)),
1716		"XAUI2 AN Registers");
1717
1718	qls_mpid_seg_hdr(&mpi_dump->xaui2_hss_pcs_hdr,
1719		Q81_XAUI2_HSS_PCS_SEG_NUM,
1720		(sizeof(qls_mpid_seg_hdr_t) +
1721			sizeof(mpi_dump->serdes2_xaui_hss_pcs)),
1722		"XAUI2 HSS PCS Registers");
1723
1724	qls_mpid_seg_hdr(&mpi_dump->xfi2_an_hdr,
1725		Q81_XFI2_AN_SEG_NUM,
1726		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->serdes2_xfi_an)),
1727		"XFI2 AN Registers");
1728
1729	qls_mpid_seg_hdr(&mpi_dump->xfi2_train_hdr,
1730		Q81_XFI2_TRAIN_SEG_NUM,
1731		(sizeof(qls_mpid_seg_hdr_t) +
1732			sizeof(mpi_dump->serdes2_xfi_train)),
1733		"XFI2 TRAIN Registers");
1734
1735	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_pcs_hdr,
1736		Q81_XFI2_HSS_PCS_SEG_NUM,
1737		(sizeof(qls_mpid_seg_hdr_t) +
1738			sizeof(mpi_dump->serdes2_xfi_hss_pcs)),
1739		"XFI2 HSS PCS Registers");
1740
1741	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_tx_hdr,
1742		Q81_XFI2_HSS_TX_SEG_NUM,
1743		(sizeof(qls_mpid_seg_hdr_t) +
1744			sizeof(mpi_dump->serdes2_xfi_hss_tx)),
1745		"XFI2 HSS TX Registers");
1746
1747	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_rx_hdr,
1748		Q81_XFI2_HSS_RX_SEG_NUM,
1749		(sizeof(qls_mpid_seg_hdr_t) +
1750			sizeof(mpi_dump->serdes2_xfi_hss_rx)),
1751		"XFI2 HSS RX Registers");
1752
1753	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_pll_hdr,
1754		Q81_XFI2_HSS_PLL_SEG_NUM,
1755		(sizeof(qls_mpid_seg_hdr_t) +
1756			sizeof(mpi_dump->serdes2_xfi_hss_pll)),
1757		"XFI2 HSS PLL Registers");
1758
1759	qls_rd_serdes_regs(ha, mpi_dump);
1760
1761	qls_mpid_seg_hdr(&mpi_dump->core_regs_seg_hdr,
1762		Q81_CORE_SEG_NUM,
1763		(sizeof(mpi_dump->core_regs_seg_hdr) +
1764		 sizeof(mpi_dump->mpi_core_regs) +
1765		 sizeof(mpi_dump->mpi_core_sh_regs)),
1766		"Core Registers");
1767
1768	ret = qls_get_mpi_regs(ha, &mpi_dump->mpi_core_regs[0],
1769			Q81_MPI_CORE_REGS_ADDR, Q81_MPI_CORE_REGS_CNT);
1770
1771	ret = qls_get_mpi_shadow_regs(ha,
1772			&mpi_dump->mpi_core_sh_regs[0]);
1773
1774	qls_mpid_seg_hdr(&mpi_dump->test_logic_regs_seg_hdr,
1775		Q81_TEST_LOGIC_SEG_NUM,
1776		(sizeof(qls_mpid_seg_hdr_t) +
1777			sizeof(mpi_dump->test_logic_regs)),
1778		"Test Logic Regs");
1779
1780	ret = qls_get_mpi_regs(ha, &mpi_dump->test_logic_regs[0],
1781                            Q81_TEST_REGS_ADDR, Q81_TEST_REGS_CNT);
1782
1783	qls_mpid_seg_hdr(&mpi_dump->rmii_regs_seg_hdr,
1784		Q81_RMII_SEG_NUM,
1785		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->rmii_regs)),
1786		"RMII Registers");
1787
1788	ret = qls_get_mpi_regs(ha, &mpi_dump->rmii_regs[0],
1789                            Q81_RMII_REGS_ADDR, Q81_RMII_REGS_CNT);
1790
1791	qls_mpid_seg_hdr(&mpi_dump->fcmac1_regs_seg_hdr,
1792		Q81_FCMAC1_SEG_NUM,
1793		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fcmac1_regs)),
1794		"FCMAC1 Registers");
1795
1796	ret = qls_get_mpi_regs(ha, &mpi_dump->fcmac1_regs[0],
1797                            Q81_FCMAC1_REGS_ADDR, Q81_FCMAC_REGS_CNT);
1798
1799	qls_mpid_seg_hdr(&mpi_dump->fcmac2_regs_seg_hdr,
1800		Q81_FCMAC2_SEG_NUM,
1801		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fcmac2_regs)),
1802		"FCMAC2 Registers");
1803
1804	ret = qls_get_mpi_regs(ha, &mpi_dump->fcmac2_regs[0],
1805                            Q81_FCMAC2_REGS_ADDR, Q81_FCMAC_REGS_CNT);
1806
1807	qls_mpid_seg_hdr(&mpi_dump->fc1_mbx_regs_seg_hdr,
1808		Q81_FC1_MBOX_SEG_NUM,
1809		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fc1_mbx_regs)),
1810		"FC1 MBox Regs");
1811
1812	ret = qls_get_mpi_regs(ha, &mpi_dump->fc1_mbx_regs[0],
1813                            Q81_FC1_MBX_REGS_ADDR, Q81_FC_MBX_REGS_CNT);
1814
1815	qls_mpid_seg_hdr(&mpi_dump->ide_regs_seg_hdr,
1816		Q81_IDE_SEG_NUM,
1817		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->ide_regs)),
1818		"IDE Registers");
1819
1820	ret = qls_get_mpi_regs(ha, &mpi_dump->ide_regs[0],
1821                            Q81_IDE_REGS_ADDR, Q81_IDE_REGS_CNT);
1822
1823	qls_mpid_seg_hdr(&mpi_dump->nic1_mbx_regs_seg_hdr,
1824		Q81_NIC1_MBOX_SEG_NUM,
1825		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic1_mbx_regs)),
1826		"NIC1 MBox Regs");
1827
1828	ret = qls_get_mpi_regs(ha, &mpi_dump->nic1_mbx_regs[0],
1829                            Q81_NIC1_MBX_REGS_ADDR, Q81_NIC_MBX_REGS_CNT);
1830
1831	qls_mpid_seg_hdr(&mpi_dump->smbus_regs_seg_hdr,
1832		Q81_SMBUS_SEG_NUM,
1833		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->smbus_regs)),
1834		"SMBus Registers");
1835
1836	ret = qls_get_mpi_regs(ha, &mpi_dump->smbus_regs[0],
1837                            Q81_SMBUS_REGS_ADDR, Q81_SMBUS_REGS_CNT);
1838
1839	qls_mpid_seg_hdr(&mpi_dump->fc2_mbx_regs_seg_hdr,
1840		Q81_FC2_MBOX_SEG_NUM,
1841		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fc2_mbx_regs)),
1842		"FC2 MBox Regs");
1843
1844	ret = qls_get_mpi_regs(ha, &mpi_dump->fc2_mbx_regs[0],
1845                            Q81_FC2_MBX_REGS_ADDR, Q81_FC_MBX_REGS_CNT);
1846
1847	qls_mpid_seg_hdr(&mpi_dump->nic2_mbx_regs_seg_hdr,
1848		Q81_NIC2_MBOX_SEG_NUM,
1849		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic2_mbx_regs)),
1850		"NIC2 MBox Regs");
1851
1852	ret = qls_get_mpi_regs(ha, &mpi_dump->nic2_mbx_regs[0],
1853                            Q81_NIC2_MBX_REGS_ADDR, Q81_NIC_MBX_REGS_CNT);
1854
1855	qls_mpid_seg_hdr(&mpi_dump->i2c_regs_seg_hdr,
1856		Q81_I2C_SEG_NUM,
1857		(sizeof(qls_mpid_seg_hdr_t) +
1858			sizeof(mpi_dump->i2c_regs)),
1859		"I2C Registers");
1860
1861	ret = qls_get_mpi_regs(ha, &mpi_dump->i2c_regs[0],
1862                            Q81_I2C_REGS_ADDR, Q81_I2C_REGS_CNT);
1863
1864	qls_mpid_seg_hdr(&mpi_dump->memc_regs_seg_hdr,
1865		Q81_MEMC_SEG_NUM,
1866		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->memc_regs)),
1867		"MEMC Registers");
1868
1869	ret = qls_get_mpi_regs(ha, &mpi_dump->memc_regs[0],
1870                            Q81_MEMC_REGS_ADDR, Q81_MEMC_REGS_CNT);
1871
1872	qls_mpid_seg_hdr(&mpi_dump->pbus_regs_seg_hdr,
1873		Q81_PBUS_SEG_NUM,
1874		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->pbus_regs)),
1875		"PBUS Registers");
1876
1877	ret = qls_get_mpi_regs(ha, &mpi_dump->pbus_regs[0],
1878                            Q81_PBUS_REGS_ADDR, Q81_PBUS_REGS_CNT);
1879
1880	qls_mpid_seg_hdr(&mpi_dump->mde_regs_seg_hdr,
1881		Q81_MDE_SEG_NUM,
1882		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->mde_regs)),
1883		"MDE Registers");
1884
1885	ret = qls_get_mpi_regs(ha, &mpi_dump->mde_regs[0],
1886                            Q81_MDE_REGS_ADDR, Q81_MDE_REGS_CNT);
1887
1888	qls_mpid_seg_hdr(&mpi_dump->intr_states_seg_hdr,
1889		Q81_INTR_STATES_SEG_NUM,
1890		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->intr_states)),
1891		"INTR States");
1892
1893	qls_get_intr_states(ha, &mpi_dump->intr_states[0]);
1894
1895	qls_mpid_seg_hdr(&mpi_dump->probe_dump_seg_hdr,
1896		Q81_PROBE_DUMP_SEG_NUM,
1897		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->probe_dump)),
1898		"Probe Dump");
1899
1900	qls_get_probe_dump(ha, &mpi_dump->probe_dump[0]);
1901
1902	qls_mpid_seg_hdr(&mpi_dump->routing_reg_seg_hdr,
1903		Q81_ROUTING_INDEX_SEG_NUM,
1904		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->routing_regs)),
1905		"Routing Regs");
1906
1907	qls_get_ridx_registers(ha, &mpi_dump->routing_regs[0]);
1908
1909	qls_mpid_seg_hdr(&mpi_dump->mac_prot_reg_seg_hdr,
1910		Q81_MAC_PROTOCOL_SEG_NUM,
1911		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->mac_prot_regs)),
1912		"MAC Prot Regs");
1913
1914	qls_get_mac_proto_regs(ha, &mpi_dump->mac_prot_regs[0]);
1915
1916	qls_mpid_seg_hdr(&mpi_dump->ets_seg_hdr,
1917		Q81_ETS_SEG_NUM,
1918		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->ets)),
1919		"ETS Registers");
1920
1921	ret = qls_get_ets_regs(ha, &mpi_dump->ets[0]);
1922
1923	qls_mpid_seg_hdr(&mpi_dump->sem_regs_seg_hdr,
1924		Q81_SEM_REGS_SEG_NUM,
1925		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->sem_regs)),
1926		"Sem Registers");
1927
1928	for(i = 0; i < Q81_MAX_SEMAPHORE_FUNCTIONS ; i ++) {
1929
1930		reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (i << Q81_FUNCTION_SHIFT) |
1931				(Q81_CTL_SEMAPHORE >> 2);
1932
1933		ret = qls_mpi_risc_rd_reg(ha, reg, &reg_val);
1934		mpi_dump->sem_regs[i] = reg_val;
1935
1936		if (ret != 0)
1937			mpi_dump->sem_regs[i] = Q81_BAD_DATA;
1938	}
1939
1940	ret = qls_unpause_mpi_risc(ha);
1941	if (ret)
1942		printf("Failed RISC unpause. Status = 0x%.08x\n",ret);
1943
1944	ret = qls_mpi_reset(ha);
1945	if (ret)
1946		printf("Failed RISC reset. Status = 0x%.08x\n",ret);
1947
1948	WRITE_REG32(ha, Q81_CTL_FUNC_SPECIFIC, 0x80008000);
1949
1950	qls_mpid_seg_hdr(&mpi_dump->memc_ram_seg_hdr,
1951		Q81_MEMC_RAM_SEG_NUM,
1952		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->memc_ram)),
1953		"MEMC RAM");
1954
1955	ret = qls_mbx_dump_risc_ram(ha, &mpi_dump->memc_ram[0],
1956			Q81_MEMC_RAM_ADDR, Q81_MEMC_RAM_CNT);
1957	if (ret)
1958		printf("Failed Dump of MEMC RAM. Status = 0x%.08x\n",ret);
1959
1960	qls_mpid_seg_hdr(&mpi_dump->code_ram_seg_hdr,
1961		Q81_WCS_RAM_SEG_NUM,
1962		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->code_ram)),
1963		"WCS RAM");
1964
1965	ret = qls_mbx_dump_risc_ram(ha, &mpi_dump->memc_ram[0],
1966			Q81_CODE_RAM_ADDR, Q81_CODE_RAM_CNT);
1967	if (ret)
1968		printf("Failed Dump of CODE RAM. Status = 0x%.08x\n",ret);
1969
1970	qls_mpid_seg_hdr(&mpi_dump->wqc1_seg_hdr,
1971		Q81_WQC1_SEG_NUM,
1972		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->wqc1)),
1973		"WQC 1");
1974
1975	qls_mpid_seg_hdr(&mpi_dump->wqc2_seg_hdr,
1976		Q81_WQC2_SEG_NUM,
1977		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->wqc2)),
1978		"WQC 2");
1979
1980	qls_mpid_seg_hdr(&mpi_dump->cqc1_seg_hdr,
1981		Q81_CQC1_SEG_NUM,
1982		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->cqc1)),
1983		"CQC 1");
1984
1985	qls_mpid_seg_hdr(&mpi_dump->cqc2_seg_hdr,
1986		Q81_CQC2_SEG_NUM,
1987		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->cqc2)),
1988		"CQC 2");
1989
1990	return 0;
1991}
1992
1993