1252206Sdavidcs/*
2252206Sdavidcs * Copyright (c) 2013-2014 Qlogic Corporation
3252206Sdavidcs * All rights reserved.
4252206Sdavidcs *
5252206Sdavidcs *  Redistribution and use in source and binary forms, with or without
6252206Sdavidcs *  modification, are permitted provided that the following conditions
7252206Sdavidcs *  are met:
8252206Sdavidcs *
9252206Sdavidcs *  1. Redistributions of source code must retain the above copyright
10252206Sdavidcs *     notice, this list of conditions and the following disclaimer.
11252206Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12252206Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13252206Sdavidcs *     documentation and/or other materials provided with the distribution.
14252206Sdavidcs *
15252206Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16252206Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17252206Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18252206Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19252206Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20252206Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21252206Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22252206Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23252206Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24252206Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25252206Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26252206Sdavidcs */
27252206Sdavidcs
28252206Sdavidcs/*
29252206Sdavidcs * File: qls_dump.c
30252206Sdavidcs */
31252206Sdavidcs#include <sys/cdefs.h>
32252206Sdavidcs__FBSDID("$FreeBSD$");
33252206Sdavidcs
34252206Sdavidcs
35252206Sdavidcs#include "qls_os.h"
36252206Sdavidcs#include "qls_hw.h"
37252206Sdavidcs#include "qls_def.h"
38252206Sdavidcs#include "qls_glbl.h"
39252206Sdavidcs#include "qls_dump.h"
40252206Sdavidcs
41252206Sdavidcsqls_mpi_coredump_t ql_mpi_coredump;
42252206Sdavidcs
43252206Sdavidcs#define Q81_CORE_SEG_NUM              1
44252206Sdavidcs#define Q81_TEST_LOGIC_SEG_NUM        2
45252206Sdavidcs#define Q81_RMII_SEG_NUM              3
46252206Sdavidcs#define Q81_FCMAC1_SEG_NUM            4
47252206Sdavidcs#define Q81_FCMAC2_SEG_NUM            5
48252206Sdavidcs#define Q81_FC1_MBOX_SEG_NUM          6
49252206Sdavidcs#define Q81_IDE_SEG_NUM               7
50252206Sdavidcs#define Q81_NIC1_MBOX_SEG_NUM         8
51252206Sdavidcs#define Q81_SMBUS_SEG_NUM             9
52252206Sdavidcs#define Q81_FC2_MBOX_SEG_NUM          10
53252206Sdavidcs#define Q81_NIC2_MBOX_SEG_NUM         11
54252206Sdavidcs#define Q81_I2C_SEG_NUM               12
55252206Sdavidcs#define Q81_MEMC_SEG_NUM              13
56252206Sdavidcs#define Q81_PBUS_SEG_NUM              14
57252206Sdavidcs#define Q81_MDE_SEG_NUM               15
58252206Sdavidcs#define Q81_NIC1_CONTROL_SEG_NUM      16
59252206Sdavidcs#define Q81_NIC2_CONTROL_SEG_NUM      17
60252206Sdavidcs#define Q81_NIC1_XGMAC_SEG_NUM        18
61252206Sdavidcs#define Q81_NIC2_XGMAC_SEG_NUM        19
62252206Sdavidcs#define Q81_WCS_RAM_SEG_NUM           20
63252206Sdavidcs#define Q81_MEMC_RAM_SEG_NUM          21
64252206Sdavidcs#define Q81_XAUI1_AN_SEG_NUM          22
65252206Sdavidcs#define Q81_XAUI1_HSS_PCS_SEG_NUM     23
66252206Sdavidcs#define Q81_XFI1_AN_SEG_NUM           24
67252206Sdavidcs#define Q81_XFI1_TRAIN_SEG_NUM        25
68252206Sdavidcs#define Q81_XFI1_HSS_PCS_SEG_NUM      26
69252206Sdavidcs#define Q81_XFI1_HSS_TX_SEG_NUM       27
70252206Sdavidcs#define Q81_XFI1_HSS_RX_SEG_NUM       28
71252206Sdavidcs#define Q81_XFI1_HSS_PLL_SEG_NUM      29
72252206Sdavidcs#define Q81_INTR_STATES_SEG_NUM       31
73252206Sdavidcs#define Q81_ETS_SEG_NUM               34
74252206Sdavidcs#define Q81_PROBE_DUMP_SEG_NUM        35
75252206Sdavidcs#define Q81_ROUTING_INDEX_SEG_NUM     36
76252206Sdavidcs#define Q81_MAC_PROTOCOL_SEG_NUM      37
77252206Sdavidcs#define Q81_XAUI2_AN_SEG_NUM          38
78252206Sdavidcs#define Q81_XAUI2_HSS_PCS_SEG_NUM     39
79252206Sdavidcs#define Q81_XFI2_AN_SEG_NUM           40
80252206Sdavidcs#define Q81_XFI2_TRAIN_SEG_NUM        41
81252206Sdavidcs#define Q81_XFI2_HSS_PCS_SEG_NUM      42
82252206Sdavidcs#define Q81_XFI2_HSS_TX_SEG_NUM       43
83252206Sdavidcs#define Q81_XFI2_HSS_RX_SEG_NUM       44
84252206Sdavidcs#define Q81_XFI2_HSS_PLL_SEG_NUM      45
85252206Sdavidcs#define Q81_WQC1_SEG_NUM              46
86252206Sdavidcs#define Q81_CQC1_SEG_NUM              47
87252206Sdavidcs#define Q81_WQC2_SEG_NUM              48
88252206Sdavidcs#define Q81_CQC2_SEG_NUM              49
89252206Sdavidcs#define Q81_SEM_REGS_SEG_NUM          50
90252206Sdavidcs
91252206Sdavidcsenum
92252206Sdavidcs{
93252206Sdavidcs	Q81_PAUSE_SRC_LO               = 0x00000100,
94252206Sdavidcs	Q81_PAUSE_SRC_HI               = 0x00000104,
95252206Sdavidcs	Q81_GLOBAL_CFG                 = 0x00000108,
96252206Sdavidcs	Q81_GLOBAL_CFG_RESET           = (1 << 0),    /*Control*/
97252206Sdavidcs	Q81_GLOBAL_CFG_JUMBO           = (1 << 6),    /*Control*/
98252206Sdavidcs	Q81_GLOBAL_CFG_TX_STAT_EN      = (1 << 10),   /*Control*/
99252206Sdavidcs	Q81_GLOBAL_CFG_RX_STAT_EN      = (1 << 11),   /*Control*/
100252206Sdavidcs	Q81_TX_CFG                     = 0x0000010c,
101252206Sdavidcs	Q81_TX_CFG_RESET               = (1 << 0),    /*Control*/
102252206Sdavidcs	Q81_TX_CFG_EN                  = (1 << 1),    /*Control*/
103252206Sdavidcs	Q81_TX_CFG_PREAM               = (1 << 2),    /*Control*/
104252206Sdavidcs	Q81_RX_CFG                     = 0x00000110,
105252206Sdavidcs	Q81_RX_CFG_RESET               = (1 << 0),    /*Control*/
106252206Sdavidcs	Q81_RX_CFG_EN                  = (1 << 1),    /*Control*/
107252206Sdavidcs	Q81_RX_CFG_PREAM               = (1 << 2),    /*Control*/
108252206Sdavidcs	Q81_FLOW_CTL                   = 0x0000011c,
109252206Sdavidcs	Q81_PAUSE_OPCODE               = 0x00000120,
110252206Sdavidcs	Q81_PAUSE_TIMER                = 0x00000124,
111252206Sdavidcs	Q81_PAUSE_FRM_DEST_LO          = 0x00000128,
112252206Sdavidcs	Q81_PAUSE_FRM_DEST_HI          = 0x0000012c,
113252206Sdavidcs	Q81_MAC_TX_PARAMS              = 0x00000134,
114252206Sdavidcs	Q81_MAC_TX_PARAMS_JUMBO        = (1 << 31),   /*Control*/
115252206Sdavidcs	Q81_MAC_TX_PARAMS_SIZE_SHIFT   = 16,          /*Control*/
116252206Sdavidcs	Q81_MAC_RX_PARAMS              = 0x00000138,
117252206Sdavidcs	Q81_MAC_SYS_INT                = 0x00000144,
118252206Sdavidcs	Q81_MAC_SYS_INT_MASK           = 0x00000148,
119252206Sdavidcs	Q81_MAC_MGMT_INT               = 0x0000014c,
120252206Sdavidcs	Q81_MAC_MGMT_IN_MASK           = 0x00000150,
121252206Sdavidcs	Q81_EXT_ARB_MODE               = 0x000001fc,
122252206Sdavidcs	Q81_TX_PKTS                    = 0x00000200,
123252206Sdavidcs	Q81_TX_PKTS_LO                 = 0x00000204,
124252206Sdavidcs	Q81_TX_BYTES                   = 0x00000208,
125252206Sdavidcs	Q81_TX_BYTES_LO                = 0x0000020C,
126252206Sdavidcs	Q81_TX_MCAST_PKTS              = 0x00000210,
127252206Sdavidcs	Q81_TX_MCAST_PKTS_LO           = 0x00000214,
128252206Sdavidcs	Q81_TX_BCAST_PKTS              = 0x00000218,
129252206Sdavidcs	Q81_TX_BCAST_PKTS_LO           = 0x0000021C,
130252206Sdavidcs	Q81_TX_UCAST_PKTS              = 0x00000220,
131252206Sdavidcs	Q81_TX_UCAST_PKTS_LO           = 0x00000224,
132252206Sdavidcs	Q81_TX_CTL_PKTS                = 0x00000228,
133252206Sdavidcs	Q81_TX_CTL_PKTS_LO             = 0x0000022c,
134252206Sdavidcs	Q81_TX_PAUSE_PKTS              = 0x00000230,
135252206Sdavidcs	Q81_TX_PAUSE_PKTS_LO           = 0x00000234,
136252206Sdavidcs	Q81_TX_64_PKT                  = 0x00000238,
137252206Sdavidcs	Q81_TX_64_PKT_LO               = 0x0000023c,
138252206Sdavidcs	Q81_TX_65_TO_127_PKT           = 0x00000240,
139252206Sdavidcs	Q81_TX_65_TO_127_PKT_LO        = 0x00000244,
140252206Sdavidcs	Q81_TX_128_TO_255_PKT          = 0x00000248,
141252206Sdavidcs	Q81_TX_128_TO_255_PKT_LO       = 0x0000024c,
142252206Sdavidcs	Q81_TX_256_511_PKT             = 0x00000250,
143252206Sdavidcs	Q81_TX_256_511_PKT_LO          = 0x00000254,
144252206Sdavidcs	Q81_TX_512_TO_1023_PKT         = 0x00000258,
145252206Sdavidcs	Q81_TX_512_TO_1023_PKT_LO      = 0x0000025c,
146252206Sdavidcs	Q81_TX_1024_TO_1518_PKT        = 0x00000260,
147252206Sdavidcs	Q81_TX_1024_TO_1518_PKT_LO     = 0x00000264,
148252206Sdavidcs	Q81_TX_1519_TO_MAX_PKT         = 0x00000268,
149252206Sdavidcs	Q81_TX_1519_TO_MAX_PKT_LO      = 0x0000026c,
150252206Sdavidcs	Q81_TX_UNDERSIZE_PKT           = 0x00000270,
151252206Sdavidcs	Q81_TX_UNDERSIZE_PKT_LO        = 0x00000274,
152252206Sdavidcs	Q81_TX_OVERSIZE_PKT            = 0x00000278,
153252206Sdavidcs	Q81_TX_OVERSIZE_PKT_LO         = 0x0000027c,
154252206Sdavidcs	Q81_RX_HALF_FULL_DET           = 0x000002a0,
155252206Sdavidcs	Q81_TX_HALF_FULL_DET_LO        = 0x000002a4,
156252206Sdavidcs	Q81_RX_OVERFLOW_DET            = 0x000002a8,
157252206Sdavidcs	Q81_TX_OVERFLOW_DET_LO         = 0x000002ac,
158252206Sdavidcs	Q81_RX_HALF_FULL_MASK          = 0x000002b0,
159252206Sdavidcs	Q81_TX_HALF_FULL_MASK_LO       = 0x000002b4,
160252206Sdavidcs	Q81_RX_OVERFLOW_MASK           = 0x000002b8,
161252206Sdavidcs	Q81_TX_OVERFLOW_MASK_LO        = 0x000002bc,
162252206Sdavidcs	Q81_STAT_CNT_CTL               = 0x000002c0,
163252206Sdavidcs	Q81_STAT_CNT_CTL_CLEAR_TX      = (1 << 0),   /*Control*/
164252206Sdavidcs	Q81_STAT_CNT_CTL_CLEAR_RX      = (1 << 1),   /*Control*/
165252206Sdavidcs	Q81_AUX_RX_HALF_FULL_DET       = 0x000002d0,
166252206Sdavidcs	Q81_AUX_TX_HALF_FULL_DET       = 0x000002d4,
167252206Sdavidcs	Q81_AUX_RX_OVERFLOW_DET        = 0x000002d8,
168252206Sdavidcs	Q81_AUX_TX_OVERFLOW_DET        = 0x000002dc,
169252206Sdavidcs	Q81_AUX_RX_HALF_FULL_MASK      = 0x000002f0,
170252206Sdavidcs	Q81_AUX_TX_HALF_FULL_MASK      = 0x000002f4,
171252206Sdavidcs	Q81_AUX_RX_OVERFLOW_MASK       = 0x000002f8,
172252206Sdavidcs	Q81_AUX_TX_OVERFLOW_MASK       = 0x000002fc,
173252206Sdavidcs	Q81_RX_BYTES                   = 0x00000300,
174252206Sdavidcs	Q81_RX_BYTES_LO                = 0x00000304,
175252206Sdavidcs	Q81_RX_BYTES_OK                = 0x00000308,
176252206Sdavidcs	Q81_RX_BYTES_OK_LO             = 0x0000030c,
177252206Sdavidcs	Q81_RX_PKTS                    = 0x00000310,
178252206Sdavidcs	Q81_RX_PKTS_LO                 = 0x00000314,
179252206Sdavidcs	Q81_RX_PKTS_OK                 = 0x00000318,
180252206Sdavidcs	Q81_RX_PKTS_OK_LO              = 0x0000031c,
181252206Sdavidcs	Q81_RX_BCAST_PKTS              = 0x00000320,
182252206Sdavidcs	Q81_RX_BCAST_PKTS_LO           = 0x00000324,
183252206Sdavidcs	Q81_RX_MCAST_PKTS              = 0x00000328,
184252206Sdavidcs	Q81_RX_MCAST_PKTS_LO           = 0x0000032c,
185252206Sdavidcs	Q81_RX_UCAST_PKTS              = 0x00000330,
186252206Sdavidcs	Q81_RX_UCAST_PKTS_LO           = 0x00000334,
187252206Sdavidcs	Q81_RX_UNDERSIZE_PKTS          = 0x00000338,
188252206Sdavidcs	Q81_RX_UNDERSIZE_PKTS_LO       = 0x0000033c,
189252206Sdavidcs	Q81_RX_OVERSIZE_PKTS           = 0x00000340,
190252206Sdavidcs	Q81_RX_OVERSIZE_PKTS_LO        = 0x00000344,
191252206Sdavidcs	Q81_RX_JABBER_PKTS             = 0x00000348,
192252206Sdavidcs	Q81_RX_JABBER_PKTS_LO          = 0x0000034c,
193252206Sdavidcs	Q81_RX_UNDERSIZE_FCERR_PKTS    = 0x00000350,
194252206Sdavidcs	Q81_RX_UNDERSIZE_FCERR_PKTS_LO = 0x00000354,
195252206Sdavidcs	Q81_RX_DROP_EVENTS             = 0x00000358,
196252206Sdavidcs	Q81_RX_DROP_EVENTS_LO          = 0x0000035c,
197252206Sdavidcs	Q81_RX_FCERR_PKTS              = 0x00000360,
198252206Sdavidcs	Q81_RX_FCERR_PKTS_LO           = 0x00000364,
199252206Sdavidcs	Q81_RX_ALIGN_ERR               = 0x00000368,
200252206Sdavidcs	Q81_RX_ALIGN_ERR_LO            = 0x0000036c,
201252206Sdavidcs	Q81_RX_SYMBOL_ERR              = 0x00000370,
202252206Sdavidcs	Q81_RX_SYMBOL_ERR_LO           = 0x00000374,
203252206Sdavidcs	Q81_RX_MAC_ERR                 = 0x00000378,
204252206Sdavidcs	Q81_RX_MAC_ERR_LO              = 0x0000037c,
205252206Sdavidcs	Q81_RX_CTL_PKTS                = 0x00000380,
206252206Sdavidcs	Q81_RX_CTL_PKTS_LO             = 0x00000384,
207252206Sdavidcs	Q81_RX_PAUSE_PKTS              = 0x00000388,
208252206Sdavidcs	Q81_RX_PAUSE_PKTS_LO           = 0x0000038c,
209252206Sdavidcs	Q81_RX_64_PKTS                 = 0x00000390,
210252206Sdavidcs	Q81_RX_64_PKTS_LO              = 0x00000394,
211252206Sdavidcs	Q81_RX_65_TO_127_PKTS          = 0x00000398,
212252206Sdavidcs	Q81_RX_65_TO_127_PKTS_LO       = 0x0000039c,
213252206Sdavidcs	Q81_RX_128_255_PKTS            = 0x000003a0,
214252206Sdavidcs	Q81_RX_128_255_PKTS_LO         = 0x000003a4,
215252206Sdavidcs	Q81_RX_256_511_PKTS            = 0x000003a8,
216252206Sdavidcs	Q81_RX_256_511_PKTS_LO         = 0x000003ac,
217252206Sdavidcs	Q81_RX_512_TO_1023_PKTS        = 0x000003b0,
218252206Sdavidcs	Q81_RX_512_TO_1023_PKTS_LO     = 0x000003b4,
219252206Sdavidcs	Q81_RX_1024_TO_1518_PKTS       = 0x000003b8,
220252206Sdavidcs	Q81_RX_1024_TO_1518_PKTS_LO    = 0x000003bc,
221252206Sdavidcs	Q81_RX_1519_TO_MAX_PKTS        = 0x000003c0,
222252206Sdavidcs	Q81_RX_1519_TO_MAX_PKTS_LO     = 0x000003c4,
223252206Sdavidcs	Q81_RX_LEN_ERR_PKTS            = 0x000003c8,
224252206Sdavidcs	Q81_RX_LEN_ERR_PKTS_LO         = 0x000003cc,
225252206Sdavidcs	Q81_MDIO_TX_DATA               = 0x00000400,
226252206Sdavidcs	Q81_MDIO_RX_DATA               = 0x00000410,
227252206Sdavidcs	Q81_MDIO_CMD                   = 0x00000420,
228252206Sdavidcs	Q81_MDIO_PHY_ADDR              = 0x00000430,
229252206Sdavidcs	Q81_MDIO_PORT                  = 0x00000440,
230252206Sdavidcs	Q81_MDIO_STATUS                = 0x00000450,
231252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES0      = 0x00000500,
232252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES0_LO   = 0x00000504,
233252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES1      = 0x00000508,
234252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES1_LO   = 0x0000050C,
235252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES2      = 0x00000510,
236252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES2_LO   = 0x00000514,
237252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES3      = 0x00000518,
238252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES3_LO   = 0x0000051C,
239252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES4      = 0x00000520,
240252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES4_LO   = 0x00000524,
241252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES5      = 0x00000528,
242252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES5_LO   = 0x0000052C,
243252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES6      = 0x00000530,
244252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES6_LO   = 0x00000534,
245252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES7      = 0x00000538,
246252206Sdavidcs	Q81_TX_CBFC_PAUSE_FRAMES7_LO   = 0x0000053C,
247252206Sdavidcs	Q81_TX_FCOE_PKTS               = 0x00000540,
248252206Sdavidcs	Q81_TX_FCOE_PKTS_LO            = 0x00000544,
249252206Sdavidcs	Q81_TX_MGMT_PKTS               = 0x00000548,
250252206Sdavidcs	Q81_TX_MGMT_PKTS_LO            = 0x0000054C,
251252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES0      = 0x00000568,
252252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES0_LO   = 0x0000056C,
253252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES1      = 0x00000570,
254252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES1_LO   = 0x00000574,
255252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES2      = 0x00000578,
256252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES2_LO   = 0x0000057C,
257252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES3      = 0x00000580,
258252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES3_LO   = 0x00000584,
259252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES4      = 0x00000588,
260252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES4_LO   = 0x0000058C,
261252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES5      = 0x00000590,
262252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES5_LO   = 0x00000594,
263252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES6      = 0x00000598,
264252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES6_LO   = 0x0000059C,
265252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES7      = 0x000005A0,
266252206Sdavidcs	Q81_RX_CBFC_PAUSE_FRAMES7_LO   = 0x000005A4,
267252206Sdavidcs	Q81_RX_FCOE_PKTS               = 0x000005A8,
268252206Sdavidcs	Q81_RX_FCOE_PKTS_LO            = 0x000005AC,
269252206Sdavidcs	Q81_RX_MGMT_PKTS               = 0x000005B0,
270252206Sdavidcs	Q81_RX_MGMT_PKTS_LO            = 0x000005B4,
271252206Sdavidcs	Q81_RX_NIC_FIFO_DROP           = 0x000005B8,
272252206Sdavidcs	Q81_RX_NIC_FIFO_DROP_LO        = 0x000005BC,
273252206Sdavidcs	Q81_RX_FCOE_FIFO_DROP          = 0x000005C0,
274252206Sdavidcs	Q81_RX_FCOE_FIFO_DROP_LO       = 0x000005C4,
275252206Sdavidcs	Q81_RX_MGMT_FIFO_DROP          = 0x000005C8,
276252206Sdavidcs	Q81_RX_MGMT_FIFO_DROP_LO       = 0x000005CC,
277252206Sdavidcs	Q81_RX_PKTS_PRIORITY0          = 0x00000600,
278252206Sdavidcs	Q81_RX_PKTS_PRIORITY0_LO       = 0x00000604,
279252206Sdavidcs	Q81_RX_PKTS_PRIORITY1          = 0x00000608,
280252206Sdavidcs	Q81_RX_PKTS_PRIORITY1_LO       = 0x0000060C,
281252206Sdavidcs	Q81_RX_PKTS_PRIORITY2          = 0x00000610,
282252206Sdavidcs	Q81_RX_PKTS_PRIORITY2_LO       = 0x00000614,
283252206Sdavidcs	Q81_RX_PKTS_PRIORITY3          = 0x00000618,
284252206Sdavidcs	Q81_RX_PKTS_PRIORITY3_LO       = 0x0000061C,
285252206Sdavidcs	Q81_RX_PKTS_PRIORITY4          = 0x00000620,
286252206Sdavidcs	Q81_RX_PKTS_PRIORITY4_LO       = 0x00000624,
287252206Sdavidcs	Q81_RX_PKTS_PRIORITY5          = 0x00000628,
288252206Sdavidcs	Q81_RX_PKTS_PRIORITY5_LO       = 0x0000062C,
289252206Sdavidcs	Q81_RX_PKTS_PRIORITY6          = 0x00000630,
290252206Sdavidcs	Q81_RX_PKTS_PRIORITY6_LO       = 0x00000634,
291252206Sdavidcs	Q81_RX_PKTS_PRIORITY7          = 0x00000638,
292252206Sdavidcs	Q81_RX_PKTS_PRIORITY7_LO       = 0x0000063C,
293252206Sdavidcs	Q81_RX_OCTETS_PRIORITY0        = 0x00000640,
294252206Sdavidcs	Q81_RX_OCTETS_PRIORITY0_LO     = 0x00000644,
295252206Sdavidcs	Q81_RX_OCTETS_PRIORITY1        = 0x00000648,
296252206Sdavidcs	Q81_RX_OCTETS_PRIORITY1_LO     = 0x0000064C,
297252206Sdavidcs	Q81_RX_OCTETS_PRIORITY2        = 0x00000650,
298252206Sdavidcs	Q81_RX_OCTETS_PRIORITY2_LO     = 0x00000654,
299252206Sdavidcs	Q81_RX_OCTETS_PRIORITY3        = 0x00000658,
300252206Sdavidcs	Q81_RX_OCTETS_PRIORITY3_LO     = 0x0000065C,
301252206Sdavidcs	Q81_RX_OCTETS_PRIORITY4        = 0x00000660,
302252206Sdavidcs	Q81_RX_OCTETS_PRIORITY4_LO     = 0x00000664,
303252206Sdavidcs	Q81_RX_OCTETS_PRIORITY5        = 0x00000668,
304252206Sdavidcs	Q81_RX_OCTETS_PRIORITY5_LO     = 0x0000066C,
305252206Sdavidcs	Q81_RX_OCTETS_PRIORITY6        = 0x00000670,
306252206Sdavidcs	Q81_RX_OCTETS_PRIORITY6_LO     = 0x00000674,
307252206Sdavidcs	Q81_RX_OCTETS_PRIORITY7        = 0x00000678,
308252206Sdavidcs	Q81_RX_OCTETS_PRIORITY7_LO     = 0x0000067C,
309252206Sdavidcs	Q81_TX_PKTS_PRIORITY0          = 0x00000680,
310252206Sdavidcs	Q81_TX_PKTS_PRIORITY0_LO       = 0x00000684,
311252206Sdavidcs	Q81_TX_PKTS_PRIORITY1          = 0x00000688,
312252206Sdavidcs	Q81_TX_PKTS_PRIORITY1_LO       = 0x0000068C,
313252206Sdavidcs	Q81_TX_PKTS_PRIORITY2          = 0x00000690,
314252206Sdavidcs	Q81_TX_PKTS_PRIORITY2_LO       = 0x00000694,
315252206Sdavidcs	Q81_TX_PKTS_PRIORITY3          = 0x00000698,
316252206Sdavidcs	Q81_TX_PKTS_PRIORITY3_LO       = 0x0000069C,
317252206Sdavidcs	Q81_TX_PKTS_PRIORITY4          = 0x000006A0,
318252206Sdavidcs	Q81_TX_PKTS_PRIORITY4_LO       = 0x000006A4,
319252206Sdavidcs	Q81_TX_PKTS_PRIORITY5          = 0x000006A8,
320252206Sdavidcs	Q81_TX_PKTS_PRIORITY5_LO       = 0x000006AC,
321252206Sdavidcs	Q81_TX_PKTS_PRIORITY6          = 0x000006B0,
322252206Sdavidcs	Q81_TX_PKTS_PRIORITY6_LO       = 0x000006B4,
323252206Sdavidcs	Q81_TX_PKTS_PRIORITY7          = 0x000006B8,
324252206Sdavidcs	Q81_TX_PKTS_PRIORITY7_LO       = 0x000006BC,
325252206Sdavidcs	Q81_TX_OCTETS_PRIORITY0        = 0x000006C0,
326252206Sdavidcs	Q81_TX_OCTETS_PRIORITY0_LO     = 0x000006C4,
327252206Sdavidcs	Q81_TX_OCTETS_PRIORITY1        = 0x000006C8,
328252206Sdavidcs	Q81_TX_OCTETS_PRIORITY1_LO     = 0x000006CC,
329252206Sdavidcs	Q81_TX_OCTETS_PRIORITY2        = 0x000006D0,
330252206Sdavidcs	Q81_TX_OCTETS_PRIORITY2_LO     = 0x000006D4,
331252206Sdavidcs	Q81_TX_OCTETS_PRIORITY3        = 0x000006D8,
332252206Sdavidcs	Q81_TX_OCTETS_PRIORITY3_LO     = 0x000006DC,
333252206Sdavidcs	Q81_TX_OCTETS_PRIORITY4        = 0x000006E0,
334252206Sdavidcs	Q81_TX_OCTETS_PRIORITY4_LO     = 0x000006E4,
335252206Sdavidcs	Q81_TX_OCTETS_PRIORITY5        = 0x000006E8,
336252206Sdavidcs	Q81_TX_OCTETS_PRIORITY5_LO     = 0x000006EC,
337252206Sdavidcs	Q81_TX_OCTETS_PRIORITY6        = 0x000006F0,
338252206Sdavidcs	Q81_TX_OCTETS_PRIORITY6_LO     = 0x000006F4,
339252206Sdavidcs	Q81_TX_OCTETS_PRIORITY7        = 0x000006F8,
340252206Sdavidcs	Q81_TX_OCTETS_PRIORITY7_LO     = 0x000006FC,
341252206Sdavidcs	Q81_RX_DISCARD_PRIORITY0       = 0x00000700,
342252206Sdavidcs	Q81_RX_DISCARD_PRIORITY0_LO    = 0x00000704,
343252206Sdavidcs	Q81_RX_DISCARD_PRIORITY1       = 0x00000708,
344252206Sdavidcs	Q81_RX_DISCARD_PRIORITY1_LO    = 0x0000070C,
345252206Sdavidcs	Q81_RX_DISCARD_PRIORITY2       = 0x00000710,
346252206Sdavidcs	Q81_RX_DISCARD_PRIORITY2_LO    = 0x00000714,
347252206Sdavidcs	Q81_RX_DISCARD_PRIORITY3       = 0x00000718,
348252206Sdavidcs	Q81_RX_DISCARD_PRIORITY3_LO    = 0x0000071C,
349252206Sdavidcs	Q81_RX_DISCARD_PRIORITY4       = 0x00000720,
350252206Sdavidcs	Q81_RX_DISCARD_PRIORITY4_LO    = 0x00000724,
351252206Sdavidcs	Q81_RX_DISCARD_PRIORITY5       = 0x00000728,
352252206Sdavidcs	Q81_RX_DISCARD_PRIORITY5_LO    = 0x0000072C,
353252206Sdavidcs	Q81_RX_DISCARD_PRIORITY6       = 0x00000730,
354252206Sdavidcs	Q81_RX_DISCARD_PRIORITY6_LO    = 0x00000734,
355252206Sdavidcs	Q81_RX_DISCARD_PRIORITY7       = 0x00000738,
356252206Sdavidcs	Q81_RX_DISCARD_PRIORITY7_LO    = 0x0000073C
357252206Sdavidcs};
358252206Sdavidcs
359252206Sdavidcsstatic void
360252206Sdavidcsqls_mpid_seg_hdr(qls_mpid_seg_hdr_t *seg_hdr, uint32_t seg_num,
361252206Sdavidcs	uint32_t seg_size, unsigned char *desc)
362252206Sdavidcs{
363252206Sdavidcs	memset(seg_hdr, 0, sizeof(qls_mpid_seg_hdr_t));
364252206Sdavidcs
365252206Sdavidcs	seg_hdr->cookie = Q81_MPID_COOKIE;
366252206Sdavidcs	seg_hdr->seg_num = seg_num;
367252206Sdavidcs	seg_hdr->seg_size = seg_size;
368252206Sdavidcs
369252206Sdavidcs	memcpy(seg_hdr->desc, desc, (sizeof(seg_hdr->desc))-1);
370252206Sdavidcs
371252206Sdavidcs	return;
372252206Sdavidcs}
373252206Sdavidcs
374252206Sdavidcsstatic int
375252206Sdavidcsqls_wait_reg_rdy(qla_host_t *ha , uint32_t reg, uint32_t bit, uint32_t err_bit)
376252206Sdavidcs{
377252206Sdavidcs	uint32_t data;
378252206Sdavidcs	int count = 10;
379252206Sdavidcs
380252206Sdavidcs	while (count) {
381252206Sdavidcs
382252206Sdavidcs		data = READ_REG32(ha, reg);
383252206Sdavidcs
384252206Sdavidcs		if (data & err_bit)
385252206Sdavidcs			return (-1);
386252206Sdavidcs		else if (data & bit)
387252206Sdavidcs			return (0);
388252206Sdavidcs
389252206Sdavidcs		qls_mdelay(__func__, 10);
390252206Sdavidcs		count--;
391252206Sdavidcs	}
392252206Sdavidcs	return (-1);
393252206Sdavidcs}
394252206Sdavidcs
395252206Sdavidcsstatic int
396252206Sdavidcsqls_rd_mpi_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
397252206Sdavidcs{
398252206Sdavidcs        int ret;
399252206Sdavidcs
400252206Sdavidcs        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
401252206Sdavidcs			Q81_CTL_PROC_ADDR_ERR);
402252206Sdavidcs
403252206Sdavidcs        if (ret)
404252206Sdavidcs                goto exit_qls_rd_mpi_reg;
405252206Sdavidcs
406252206Sdavidcs        WRITE_REG32(ha, Q81_CTL_PROC_ADDR, reg | Q81_CTL_PROC_ADDR_READ);
407252206Sdavidcs
408252206Sdavidcs        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
409252206Sdavidcs			Q81_CTL_PROC_ADDR_ERR);
410252206Sdavidcs
411252206Sdavidcs        if (ret)
412252206Sdavidcs                goto exit_qls_rd_mpi_reg;
413252206Sdavidcs
414252206Sdavidcs        *data = READ_REG32(ha, Q81_CTL_PROC_DATA);
415252206Sdavidcs
416252206Sdavidcsexit_qls_rd_mpi_reg:
417252206Sdavidcs        return (ret);
418252206Sdavidcs}
419252206Sdavidcs
420252206Sdavidcsstatic int
421252206Sdavidcsqls_wr_mpi_reg(qla_host_t *ha, uint32_t reg, uint32_t data)
422252206Sdavidcs{
423252206Sdavidcs        int ret = 0;
424252206Sdavidcs
425252206Sdavidcs        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
426252206Sdavidcs			Q81_CTL_PROC_ADDR_ERR);
427252206Sdavidcs        if (ret)
428252206Sdavidcs                goto exit_qls_wr_mpi_reg;
429252206Sdavidcs
430252206Sdavidcs        WRITE_REG32(ha, Q81_CTL_PROC_DATA, data);
431252206Sdavidcs
432252206Sdavidcs        WRITE_REG32(ha, Q81_CTL_PROC_ADDR, reg);
433252206Sdavidcs
434252206Sdavidcs        ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY,
435252206Sdavidcs			Q81_CTL_PROC_ADDR_ERR);
436252206Sdavidcsexit_qls_wr_mpi_reg:
437252206Sdavidcs        return (ret);
438252206Sdavidcs}
439252206Sdavidcs
440252206Sdavidcs
441252206Sdavidcs#define Q81_TEST_LOGIC_FUNC_PORT_CONFIG 0x1002
442252206Sdavidcs#define Q81_INVALID_NUM		0xFFFFFFFF
443252206Sdavidcs
444252206Sdavidcs#define Q81_NIC1_FUNC_ENABLE	0x00000001
445252206Sdavidcs#define Q81_NIC1_FUNC_MASK	0x0000000e
446252206Sdavidcs#define Q81_NIC1_FUNC_SHIFT	1
447252206Sdavidcs#define Q81_NIC2_FUNC_ENABLE	0x00000010
448252206Sdavidcs#define Q81_NIC2_FUNC_MASK	0x000000e0
449252206Sdavidcs#define Q81_NIC2_FUNC_SHIFT	5
450252206Sdavidcs#define Q81_FUNCTION_SHIFT	6
451252206Sdavidcs
452252206Sdavidcsstatic uint32_t
453252206Sdavidcsqls_get_other_fnum(qla_host_t *ha)
454252206Sdavidcs{
455252206Sdavidcs	int		ret;
456252206Sdavidcs	uint32_t	o_func;
457252206Sdavidcs	uint32_t	test_logic;
458252206Sdavidcs	uint32_t	nic1_fnum = Q81_INVALID_NUM;
459252206Sdavidcs	uint32_t	nic2_fnum = Q81_INVALID_NUM;
460252206Sdavidcs
461252206Sdavidcs	ret = qls_rd_mpi_reg(ha, Q81_TEST_LOGIC_FUNC_PORT_CONFIG, &test_logic);
462252206Sdavidcs	if (ret)
463252206Sdavidcs		return(Q81_INVALID_NUM);
464252206Sdavidcs
465252206Sdavidcs	if (test_logic & Q81_NIC1_FUNC_ENABLE)
466252206Sdavidcs		nic1_fnum = (test_logic & Q81_NIC1_FUNC_MASK) >>
467252206Sdavidcs					Q81_NIC1_FUNC_SHIFT;
468252206Sdavidcs
469252206Sdavidcs	if (test_logic & Q81_NIC2_FUNC_ENABLE)
470252206Sdavidcs		nic2_fnum = (test_logic & Q81_NIC2_FUNC_MASK) >>
471252206Sdavidcs					Q81_NIC2_FUNC_SHIFT;
472252206Sdavidcs
473252206Sdavidcs	if (ha->pci_func == 0)
474252206Sdavidcs		o_func = nic2_fnum;
475252206Sdavidcs	else
476252206Sdavidcs		o_func = nic1_fnum;
477252206Sdavidcs
478252206Sdavidcs	return(o_func);
479252206Sdavidcs}
480252206Sdavidcs
481252206Sdavidcsstatic uint32_t
482252206Sdavidcsqls_rd_ofunc_reg(qla_host_t *ha, uint32_t reg)
483252206Sdavidcs{
484252206Sdavidcs	uint32_t	ofunc;
485252206Sdavidcs	uint32_t	data;
486252206Sdavidcs	int		ret = 0;
487252206Sdavidcs
488252206Sdavidcs	ofunc = qls_get_other_fnum(ha);
489252206Sdavidcs
490252206Sdavidcs	if (ofunc == Q81_INVALID_NUM)
491252206Sdavidcs		return(Q81_INVALID_NUM);
492252206Sdavidcs
493252206Sdavidcs	reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (ofunc << Q81_FUNCTION_SHIFT) | reg;
494252206Sdavidcs
495252206Sdavidcs	ret = qls_rd_mpi_reg(ha, reg, &data);
496252206Sdavidcs
497252206Sdavidcs	if (ret != 0)
498252206Sdavidcs		return(Q81_INVALID_NUM);
499252206Sdavidcs
500252206Sdavidcs	return(data);
501252206Sdavidcs}
502252206Sdavidcs
503252206Sdavidcsstatic void
504252206Sdavidcsqls_wr_ofunc_reg(qla_host_t *ha, uint32_t reg, uint32_t value)
505252206Sdavidcs{
506252206Sdavidcs	uint32_t ofunc;
507252206Sdavidcs	int ret = 0;
508252206Sdavidcs
509252206Sdavidcs	ofunc = qls_get_other_fnum(ha);
510252206Sdavidcs
511252206Sdavidcs	if (ofunc == Q81_INVALID_NUM)
512252206Sdavidcs		return;
513252206Sdavidcs
514252206Sdavidcs	reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (ofunc << Q81_FUNCTION_SHIFT) | reg;
515252206Sdavidcs
516252206Sdavidcs	ret = qls_wr_mpi_reg(ha, reg, value);
517252206Sdavidcs
518252206Sdavidcs	return;
519252206Sdavidcs}
520252206Sdavidcs
521252206Sdavidcsstatic int
522252206Sdavidcsqls_wait_ofunc_reg_rdy(qla_host_t *ha , uint32_t reg, uint32_t bit,
523252206Sdavidcs	uint32_t err_bit)
524252206Sdavidcs{
525252206Sdavidcs        uint32_t data;
526252206Sdavidcs        int count = 10;
527252206Sdavidcs
528252206Sdavidcs        while (count) {
529252206Sdavidcs
530252206Sdavidcs                data = qls_rd_ofunc_reg(ha, reg);
531252206Sdavidcs
532252206Sdavidcs                if (data & err_bit)
533252206Sdavidcs                        return (-1);
534252206Sdavidcs                else if (data & bit)
535252206Sdavidcs                        return (0);
536252206Sdavidcs
537252206Sdavidcs                qls_mdelay(__func__, 10);
538252206Sdavidcs                count--;
539252206Sdavidcs        }
540252206Sdavidcs        return (-1);
541252206Sdavidcs}
542252206Sdavidcs
543252206Sdavidcs#define Q81_XG_SERDES_ADDR_RDY	BIT_31
544252206Sdavidcs#define Q81_XG_SERDES_ADDR_READ	BIT_30
545252206Sdavidcs
546252206Sdavidcsstatic int
547252206Sdavidcsqls_rd_ofunc_serdes_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
548252206Sdavidcs{
549252206Sdavidcs	int ret;
550252206Sdavidcs
551252206Sdavidcs	/* wait for reg to come ready */
552252206Sdavidcs	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XG_SERDES_ADDR >> 2),
553252206Sdavidcs			Q81_XG_SERDES_ADDR_RDY, 0);
554252206Sdavidcs	if (ret)
555252206Sdavidcs		goto exit_qls_rd_ofunc_serdes_reg;
556252206Sdavidcs
557252206Sdavidcs	/* set up for reg read */
558252206Sdavidcs	qls_wr_ofunc_reg(ha, (Q81_CTL_XG_SERDES_ADDR >> 2),
559252206Sdavidcs		(reg | Q81_XG_SERDES_ADDR_READ));
560252206Sdavidcs
561252206Sdavidcs	/* wait for reg to come ready */
562252206Sdavidcs	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XG_SERDES_ADDR >> 2),
563252206Sdavidcs			Q81_XG_SERDES_ADDR_RDY, 0);
564252206Sdavidcs	if (ret)
565252206Sdavidcs		goto exit_qls_rd_ofunc_serdes_reg;
566252206Sdavidcs
567252206Sdavidcs	/* get the data */
568252206Sdavidcs	*data = qls_rd_ofunc_reg(ha, (Q81_CTL_XG_SERDES_DATA >> 2));
569252206Sdavidcs
570252206Sdavidcsexit_qls_rd_ofunc_serdes_reg:
571252206Sdavidcs	return ret;
572252206Sdavidcs}
573252206Sdavidcs
574252206Sdavidcs#define Q81_XGMAC_ADDR_RDY	BIT_31
575252206Sdavidcs#define Q81_XGMAC_ADDR_R	BIT_30
576252206Sdavidcs#define Q81_XGMAC_ADDR_XME	BIT_29
577252206Sdavidcs
578252206Sdavidcsstatic int
579252206Sdavidcsqls_rd_ofunc_xgmac_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
580252206Sdavidcs{
581252206Sdavidcs	int ret = 0;
582252206Sdavidcs
583252206Sdavidcs	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XGMAC_ADDR >> 2),
584252206Sdavidcs			Q81_XGMAC_ADDR_RDY, Q81_XGMAC_ADDR_XME);
585252206Sdavidcs
586252206Sdavidcs	if (ret)
587252206Sdavidcs		goto exit_qls_rd_ofunc_xgmac_reg;
588252206Sdavidcs
589252206Sdavidcs	qls_wr_ofunc_reg(ha, (Q81_XGMAC_ADDR_RDY >> 2),
590252206Sdavidcs		(reg | Q81_XGMAC_ADDR_R));
591252206Sdavidcs
592252206Sdavidcs	ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XGMAC_ADDR >> 2),
593252206Sdavidcs			Q81_XGMAC_ADDR_RDY, Q81_XGMAC_ADDR_XME);
594252206Sdavidcs	if (ret)
595252206Sdavidcs		goto exit_qls_rd_ofunc_xgmac_reg;
596252206Sdavidcs
597252206Sdavidcs	*data = qls_rd_ofunc_reg(ha, Q81_CTL_XGMAC_DATA);
598252206Sdavidcs
599252206Sdavidcsexit_qls_rd_ofunc_xgmac_reg:
600252206Sdavidcs	return ret;
601252206Sdavidcs}
602252206Sdavidcs
603252206Sdavidcsstatic int
604252206Sdavidcsqls_rd_serdes_reg(qla_host_t *ha, uint32_t reg, uint32_t *data)
605252206Sdavidcs{
606252206Sdavidcs	int ret;
607252206Sdavidcs
608252206Sdavidcs	ret = qls_wait_reg_rdy(ha, Q81_CTL_XG_SERDES_ADDR,
609252206Sdavidcs			Q81_XG_SERDES_ADDR_RDY, 0);
610252206Sdavidcs
611252206Sdavidcs	if (ret)
612252206Sdavidcs		goto exit_qls_rd_serdes_reg;
613252206Sdavidcs
614252206Sdavidcs	WRITE_REG32(ha, Q81_CTL_XG_SERDES_ADDR, \
615252206Sdavidcs		(reg | Q81_XG_SERDES_ADDR_READ));
616252206Sdavidcs
617252206Sdavidcs	ret = qls_wait_reg_rdy(ha, Q81_CTL_XG_SERDES_ADDR,
618252206Sdavidcs			Q81_XG_SERDES_ADDR_RDY, 0);
619252206Sdavidcs
620252206Sdavidcs	if (ret)
621252206Sdavidcs		goto exit_qls_rd_serdes_reg;
622252206Sdavidcs
623252206Sdavidcs	*data = READ_REG32(ha, Q81_CTL_XG_SERDES_DATA);
624252206Sdavidcs
625252206Sdavidcsexit_qls_rd_serdes_reg:
626252206Sdavidcs
627252206Sdavidcs	return ret;
628252206Sdavidcs}
629252206Sdavidcs
630252206Sdavidcsstatic void
631252206Sdavidcsqls_get_both_serdes(qla_host_t *ha, uint32_t addr, uint32_t *dptr,
632252206Sdavidcs	uint32_t *ind_ptr, uint32_t dvalid, uint32_t ind_valid)
633252206Sdavidcs{
634252206Sdavidcs	int ret = -1;
635252206Sdavidcs
636252206Sdavidcs	if (dvalid)
637252206Sdavidcs		ret = qls_rd_serdes_reg(ha, addr, dptr);
638252206Sdavidcs
639252206Sdavidcs	if (ret)
640252206Sdavidcs		*dptr = Q81_BAD_DATA;
641252206Sdavidcs
642252206Sdavidcs	ret = -1;
643252206Sdavidcs
644252206Sdavidcs	if(ind_valid)
645252206Sdavidcs		ret = qls_rd_ofunc_serdes_reg(ha, addr, ind_ptr);
646252206Sdavidcs
647252206Sdavidcs	if (ret)
648252206Sdavidcs		*ind_ptr = Q81_BAD_DATA;
649252206Sdavidcs}
650252206Sdavidcs
651252206Sdavidcs#define Q81_XFI1_POWERED_UP 0x00000005
652252206Sdavidcs#define Q81_XFI2_POWERED_UP 0x0000000A
653252206Sdavidcs#define Q81_XAUI_POWERED_UP 0x00000001
654252206Sdavidcs
655252206Sdavidcsstatic int
656252206Sdavidcsqls_rd_serdes_regs(qla_host_t *ha, qls_mpi_coredump_t *mpi_dump)
657252206Sdavidcs{
658252206Sdavidcs	int ret;
659252206Sdavidcs	uint32_t xfi_d_valid, xfi_ind_valid, xaui_d_valid, xaui_ind_valid;
660252206Sdavidcs	uint32_t temp, xaui_reg, i;
661252206Sdavidcs	uint32_t *dptr, *indptr;
662252206Sdavidcs
663252206Sdavidcs	xfi_d_valid = xfi_ind_valid = xaui_d_valid = xaui_ind_valid = 0;
664252206Sdavidcs
665252206Sdavidcs	xaui_reg = 0x800;
666252206Sdavidcs
667252206Sdavidcs	ret = qls_rd_ofunc_serdes_reg(ha, xaui_reg, &temp);
668252206Sdavidcs	if (ret)
669252206Sdavidcs		temp = 0;
670252206Sdavidcs
671252206Sdavidcs	if ((temp & Q81_XAUI_POWERED_UP) == Q81_XAUI_POWERED_UP)
672252206Sdavidcs		xaui_ind_valid = 1;
673252206Sdavidcs
674252206Sdavidcs	ret = qls_rd_serdes_reg(ha, xaui_reg, &temp);
675252206Sdavidcs	if (ret)
676252206Sdavidcs		temp = 0;
677252206Sdavidcs
678252206Sdavidcs	if ((temp & Q81_XAUI_POWERED_UP) == Q81_XAUI_POWERED_UP)
679252206Sdavidcs		xaui_d_valid = 1;
680252206Sdavidcs
681252206Sdavidcs	ret = qls_rd_serdes_reg(ha, 0x1E06, &temp);
682252206Sdavidcs	if (ret)
683252206Sdavidcs		temp = 0;
684252206Sdavidcs
685252206Sdavidcs	if ((temp & Q81_XFI1_POWERED_UP) == Q81_XFI1_POWERED_UP) {
686252206Sdavidcs
687252206Sdavidcs		if (ha->pci_func & 1)
688252206Sdavidcs         		xfi_ind_valid = 1; /* NIC 2, so the indirect
689252206Sdavidcs						 (NIC1) xfi is up*/
690252206Sdavidcs		else
691252206Sdavidcs			xfi_d_valid = 1;
692252206Sdavidcs	}
693252206Sdavidcs
694252206Sdavidcs	if((temp & Q81_XFI2_POWERED_UP) == Q81_XFI2_POWERED_UP) {
695252206Sdavidcs
696252206Sdavidcs		if(ha->pci_func & 1)
697252206Sdavidcs			xfi_d_valid = 1; /* NIC 2, so the indirect (NIC1)
698252206Sdavidcs						xfi is up */
699252206Sdavidcs		else
700252206Sdavidcs			xfi_ind_valid = 1;
701252206Sdavidcs	}
702252206Sdavidcs
703252206Sdavidcs	if (ha->pci_func & 1) {
704252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xaui_an);
705252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xaui_an);
706252206Sdavidcs	} else {
707252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xaui_an);
708252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xaui_an);
709252206Sdavidcs	}
710252206Sdavidcs
711252206Sdavidcs	for (i = 0; i <= 0x000000034; i += 4, dptr ++, indptr ++) {
712252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
713252206Sdavidcs			xaui_d_valid, xaui_ind_valid);
714252206Sdavidcs	}
715252206Sdavidcs
716252206Sdavidcs	if (ha->pci_func & 1) {
717252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xaui_hss_pcs);
718252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xaui_hss_pcs);
719252206Sdavidcs	} else {
720252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xaui_hss_pcs);
721252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xaui_hss_pcs);
722252206Sdavidcs	}
723252206Sdavidcs
724252206Sdavidcs	for (i = 0x800; i <= 0x880; i += 4, dptr ++, indptr ++) {
725252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
726252206Sdavidcs			xaui_d_valid, xaui_ind_valid);
727252206Sdavidcs	}
728252206Sdavidcs
729252206Sdavidcs	if (ha->pci_func & 1) {
730252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_an);
731252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_an);
732252206Sdavidcs	} else {
733252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_an);
734252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_an);
735252206Sdavidcs	}
736252206Sdavidcs
737252206Sdavidcs	for (i = 0x1000; i <= 0x1034; i += 4, dptr ++, indptr ++) {
738252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
739252206Sdavidcs			xfi_d_valid, xfi_ind_valid);
740252206Sdavidcs	}
741252206Sdavidcs
742252206Sdavidcs	if (ha->pci_func & 1) {
743252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_train);
744252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_train);
745252206Sdavidcs	} else {
746252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_train);
747252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_train);
748252206Sdavidcs	}
749252206Sdavidcs
750252206Sdavidcs	for (i = 0x1050; i <= 0x107c; i += 4, dptr ++, indptr ++) {
751252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
752252206Sdavidcs			xfi_d_valid, xfi_ind_valid);
753252206Sdavidcs	}
754252206Sdavidcs
755252206Sdavidcs	if (ha->pci_func & 1) {
756252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pcs);
757252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pcs);
758252206Sdavidcs	} else {
759252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pcs);
760252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pcs);
761252206Sdavidcs	}
762252206Sdavidcs
763252206Sdavidcs	for (i = 0x1800; i <= 0x1838; i += 4, dptr++, indptr ++) {
764252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
765252206Sdavidcs			xfi_d_valid, xfi_ind_valid);
766252206Sdavidcs	}
767252206Sdavidcs
768252206Sdavidcs	if (ha->pci_func & 1) {
769252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_tx);
770252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_tx);
771252206Sdavidcs	} else {
772252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_tx);
773252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_tx);
774252206Sdavidcs	}
775252206Sdavidcs
776252206Sdavidcs	for (i = 0x1c00; i <= 0x1c1f; i++, dptr ++, indptr ++) {
777252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
778252206Sdavidcs			xfi_d_valid, xfi_ind_valid);
779252206Sdavidcs	}
780252206Sdavidcs
781252206Sdavidcs	if (ha->pci_func & 1) {
782252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_rx);
783252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_rx);
784252206Sdavidcs	} else {
785252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_rx);
786252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_rx);
787252206Sdavidcs	}
788252206Sdavidcs
789252206Sdavidcs	for (i = 0x1c40; i <= 0x1c5f; i++, dptr ++, indptr ++) {
790252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
791252206Sdavidcs			xfi_d_valid, xfi_ind_valid);
792252206Sdavidcs	}
793252206Sdavidcs
794252206Sdavidcs	if (ha->pci_func & 1) {
795252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pll);
796252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pll);
797252206Sdavidcs	} else {
798252206Sdavidcs		dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pll);
799252206Sdavidcs		indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pll);
800252206Sdavidcs	}
801252206Sdavidcs
802252206Sdavidcs	for (i = 0x1e00; i <= 0x1e1f; i++, dptr ++, indptr ++) {
803252206Sdavidcs		qls_get_both_serdes(ha, i, dptr, indptr,
804252206Sdavidcs			xfi_d_valid, xfi_ind_valid);
805252206Sdavidcs	}
806252206Sdavidcs
807252206Sdavidcs	return(0);
808252206Sdavidcs}
809252206Sdavidcs
810252206Sdavidcsstatic int
811252206Sdavidcsqls_unpause_mpi_risc(qla_host_t *ha)
812252206Sdavidcs{
813252206Sdavidcs	uint32_t data;
814252206Sdavidcs
815252206Sdavidcs	data = READ_REG32(ha, Q81_CTL_HOST_CMD_STATUS);
816252206Sdavidcs
817252206Sdavidcs	if (!(data & Q81_CTL_HCS_RISC_PAUSED))
818252206Sdavidcs		return -1;
819252206Sdavidcs
820252206Sdavidcs	WRITE_REG32(ha, Q81_CTL_HOST_CMD_STATUS, \
821252206Sdavidcs		Q81_CTL_HCS_CMD_CLR_RISC_PAUSE);
822252206Sdavidcs
823252206Sdavidcs	return 0;
824252206Sdavidcs}
825252206Sdavidcs
826252206Sdavidcsstatic int
827252206Sdavidcsqls_pause_mpi_risc(qla_host_t *ha)
828252206Sdavidcs{
829252206Sdavidcs	uint32_t data;
830252206Sdavidcs	int count = 10;
831252206Sdavidcs
832252206Sdavidcs	WRITE_REG32(ha, Q81_CTL_HOST_CMD_STATUS, \
833252206Sdavidcs		Q81_CTL_HCS_CMD_SET_RISC_PAUSE);
834252206Sdavidcs
835252206Sdavidcs	do {
836252206Sdavidcs		data = READ_REG32(ha, Q81_CTL_HOST_CMD_STATUS);
837252206Sdavidcs
838252206Sdavidcs		if (data & Q81_CTL_HCS_RISC_PAUSED)
839252206Sdavidcs			break;
840252206Sdavidcs
841252206Sdavidcs		qls_mdelay(__func__, 10);
842252206Sdavidcs
843252206Sdavidcs		count--;
844252206Sdavidcs
845252206Sdavidcs	} while (count);
846252206Sdavidcs
847252206Sdavidcs	return ((count == 0) ? -1 : 0);
848252206Sdavidcs}
849252206Sdavidcs
850252206Sdavidcsstatic void
851252206Sdavidcsqls_get_intr_states(qla_host_t *ha, uint32_t *buf)
852252206Sdavidcs{
853252206Sdavidcs	int i;
854252206Sdavidcs
855252206Sdavidcs	for (i = 0; i < MAX_RX_RINGS; i++, buf++) {
856252206Sdavidcs
857252206Sdavidcs		WRITE_REG32(ha, Q81_CTL_INTR_ENABLE, (0x037f0300 + i));
858252206Sdavidcs
859252206Sdavidcs		*buf = READ_REG32(ha, Q81_CTL_INTR_ENABLE);
860252206Sdavidcs	}
861252206Sdavidcs}
862252206Sdavidcs
863252206Sdavidcsstatic int
864252206Sdavidcsqls_rd_xgmac_reg(qla_host_t *ha, uint32_t reg, uint32_t*data)
865252206Sdavidcs{
866252206Sdavidcs	int ret = 0;
867252206Sdavidcs
868252206Sdavidcs	ret = qls_wait_reg_rdy(ha, Q81_CTL_XGMAC_ADDR, Q81_XGMAC_ADDR_RDY,
869252206Sdavidcs			Q81_XGMAC_ADDR_XME);
870252206Sdavidcs	if (ret)
871252206Sdavidcs		goto exit_qls_rd_xgmac_reg;
872252206Sdavidcs
873252206Sdavidcs	WRITE_REG32(ha, Q81_CTL_XGMAC_ADDR, (reg | Q81_XGMAC_ADDR_R));
874252206Sdavidcs
875252206Sdavidcs	ret = qls_wait_reg_rdy(ha, Q81_CTL_XGMAC_ADDR, Q81_XGMAC_ADDR_RDY,
876252206Sdavidcs			Q81_XGMAC_ADDR_XME);
877252206Sdavidcs	if (ret)
878252206Sdavidcs		goto exit_qls_rd_xgmac_reg;
879252206Sdavidcs
880252206Sdavidcs	*data = READ_REG32(ha, Q81_CTL_XGMAC_DATA);
881252206Sdavidcs
882252206Sdavidcsexit_qls_rd_xgmac_reg:
883252206Sdavidcs	return ret;
884252206Sdavidcs}
885252206Sdavidcs
886252206Sdavidcsstatic int
887252206Sdavidcsqls_rd_xgmac_regs(qla_host_t *ha, uint32_t *buf, uint32_t o_func)
888252206Sdavidcs{
889252206Sdavidcs	int ret = 0;
890252206Sdavidcs	int i;
891252206Sdavidcs
892252206Sdavidcs	for (i = 0; i < Q81_XGMAC_REGISTER_END; i += 4, buf ++) {
893252206Sdavidcs
894252206Sdavidcs		switch (i) {
895252206Sdavidcs		case  Q81_PAUSE_SRC_LO               :
896252206Sdavidcs		case  Q81_PAUSE_SRC_HI               :
897252206Sdavidcs		case  Q81_GLOBAL_CFG                 :
898252206Sdavidcs		case  Q81_TX_CFG                     :
899252206Sdavidcs		case  Q81_RX_CFG                     :
900252206Sdavidcs		case  Q81_FLOW_CTL                   :
901252206Sdavidcs		case  Q81_PAUSE_OPCODE               :
902252206Sdavidcs		case  Q81_PAUSE_TIMER                :
903252206Sdavidcs		case  Q81_PAUSE_FRM_DEST_LO          :
904252206Sdavidcs		case  Q81_PAUSE_FRM_DEST_HI          :
905252206Sdavidcs		case  Q81_MAC_TX_PARAMS              :
906252206Sdavidcs		case  Q81_MAC_RX_PARAMS              :
907252206Sdavidcs		case  Q81_MAC_SYS_INT                :
908252206Sdavidcs		case  Q81_MAC_SYS_INT_MASK           :
909252206Sdavidcs		case  Q81_MAC_MGMT_INT               :
910252206Sdavidcs		case  Q81_MAC_MGMT_IN_MASK           :
911252206Sdavidcs		case  Q81_EXT_ARB_MODE               :
912252206Sdavidcs		case  Q81_TX_PKTS                    :
913252206Sdavidcs		case  Q81_TX_PKTS_LO                 :
914252206Sdavidcs		case  Q81_TX_BYTES                   :
915252206Sdavidcs		case  Q81_TX_BYTES_LO                :
916252206Sdavidcs		case  Q81_TX_MCAST_PKTS              :
917252206Sdavidcs		case  Q81_TX_MCAST_PKTS_LO           :
918252206Sdavidcs		case  Q81_TX_BCAST_PKTS              :
919252206Sdavidcs		case  Q81_TX_BCAST_PKTS_LO           :
920252206Sdavidcs		case  Q81_TX_UCAST_PKTS              :
921252206Sdavidcs		case  Q81_TX_UCAST_PKTS_LO           :
922252206Sdavidcs		case  Q81_TX_CTL_PKTS                :
923252206Sdavidcs		case  Q81_TX_CTL_PKTS_LO             :
924252206Sdavidcs		case  Q81_TX_PAUSE_PKTS              :
925252206Sdavidcs		case  Q81_TX_PAUSE_PKTS_LO           :
926252206Sdavidcs		case  Q81_TX_64_PKT                  :
927252206Sdavidcs		case  Q81_TX_64_PKT_LO               :
928252206Sdavidcs		case  Q81_TX_65_TO_127_PKT           :
929252206Sdavidcs		case  Q81_TX_65_TO_127_PKT_LO        :
930252206Sdavidcs		case  Q81_TX_128_TO_255_PKT          :
931252206Sdavidcs		case  Q81_TX_128_TO_255_PKT_LO       :
932252206Sdavidcs		case  Q81_TX_256_511_PKT             :
933252206Sdavidcs		case  Q81_TX_256_511_PKT_LO          :
934252206Sdavidcs		case  Q81_TX_512_TO_1023_PKT         :
935252206Sdavidcs		case  Q81_TX_512_TO_1023_PKT_LO      :
936252206Sdavidcs		case  Q81_TX_1024_TO_1518_PKT        :
937252206Sdavidcs		case  Q81_TX_1024_TO_1518_PKT_LO     :
938252206Sdavidcs		case  Q81_TX_1519_TO_MAX_PKT         :
939252206Sdavidcs		case  Q81_TX_1519_TO_MAX_PKT_LO      :
940252206Sdavidcs		case  Q81_TX_UNDERSIZE_PKT           :
941252206Sdavidcs		case  Q81_TX_UNDERSIZE_PKT_LO        :
942252206Sdavidcs		case  Q81_TX_OVERSIZE_PKT            :
943252206Sdavidcs		case  Q81_TX_OVERSIZE_PKT_LO         :
944252206Sdavidcs		case  Q81_RX_HALF_FULL_DET           :
945252206Sdavidcs		case  Q81_TX_HALF_FULL_DET_LO        :
946252206Sdavidcs		case  Q81_RX_OVERFLOW_DET            :
947252206Sdavidcs		case  Q81_TX_OVERFLOW_DET_LO         :
948252206Sdavidcs		case  Q81_RX_HALF_FULL_MASK          :
949252206Sdavidcs		case  Q81_TX_HALF_FULL_MASK_LO       :
950252206Sdavidcs		case  Q81_RX_OVERFLOW_MASK           :
951252206Sdavidcs		case  Q81_TX_OVERFLOW_MASK_LO        :
952252206Sdavidcs		case  Q81_STAT_CNT_CTL               :
953252206Sdavidcs		case  Q81_AUX_RX_HALF_FULL_DET       :
954252206Sdavidcs		case  Q81_AUX_TX_HALF_FULL_DET       :
955252206Sdavidcs		case  Q81_AUX_RX_OVERFLOW_DET        :
956252206Sdavidcs		case  Q81_AUX_TX_OVERFLOW_DET        :
957252206Sdavidcs		case  Q81_AUX_RX_HALF_FULL_MASK      :
958252206Sdavidcs		case  Q81_AUX_TX_HALF_FULL_MASK      :
959252206Sdavidcs		case  Q81_AUX_RX_OVERFLOW_MASK       :
960252206Sdavidcs		case  Q81_AUX_TX_OVERFLOW_MASK       :
961252206Sdavidcs		case  Q81_RX_BYTES                   :
962252206Sdavidcs		case  Q81_RX_BYTES_LO                :
963252206Sdavidcs		case  Q81_RX_BYTES_OK                :
964252206Sdavidcs		case  Q81_RX_BYTES_OK_LO             :
965252206Sdavidcs		case  Q81_RX_PKTS                    :
966252206Sdavidcs		case  Q81_RX_PKTS_LO                 :
967252206Sdavidcs		case  Q81_RX_PKTS_OK                 :
968252206Sdavidcs		case  Q81_RX_PKTS_OK_LO              :
969252206Sdavidcs		case  Q81_RX_BCAST_PKTS              :
970252206Sdavidcs		case  Q81_RX_BCAST_PKTS_LO           :
971252206Sdavidcs		case  Q81_RX_MCAST_PKTS              :
972252206Sdavidcs		case  Q81_RX_MCAST_PKTS_LO           :
973252206Sdavidcs		case  Q81_RX_UCAST_PKTS              :
974252206Sdavidcs		case  Q81_RX_UCAST_PKTS_LO           :
975252206Sdavidcs		case  Q81_RX_UNDERSIZE_PKTS          :
976252206Sdavidcs		case  Q81_RX_UNDERSIZE_PKTS_LO       :
977252206Sdavidcs		case  Q81_RX_OVERSIZE_PKTS           :
978252206Sdavidcs		case  Q81_RX_OVERSIZE_PKTS_LO        :
979252206Sdavidcs		case  Q81_RX_JABBER_PKTS             :
980252206Sdavidcs		case  Q81_RX_JABBER_PKTS_LO          :
981252206Sdavidcs		case  Q81_RX_UNDERSIZE_FCERR_PKTS    :
982252206Sdavidcs		case  Q81_RX_UNDERSIZE_FCERR_PKTS_LO :
983252206Sdavidcs		case  Q81_RX_DROP_EVENTS             :
984252206Sdavidcs		case  Q81_RX_DROP_EVENTS_LO          :
985252206Sdavidcs		case  Q81_RX_FCERR_PKTS              :
986252206Sdavidcs		case  Q81_RX_FCERR_PKTS_LO           :
987252206Sdavidcs		case  Q81_RX_ALIGN_ERR               :
988252206Sdavidcs		case  Q81_RX_ALIGN_ERR_LO            :
989252206Sdavidcs		case  Q81_RX_SYMBOL_ERR              :
990252206Sdavidcs		case  Q81_RX_SYMBOL_ERR_LO           :
991252206Sdavidcs		case  Q81_RX_MAC_ERR                 :
992252206Sdavidcs		case  Q81_RX_MAC_ERR_LO              :
993252206Sdavidcs		case  Q81_RX_CTL_PKTS                :
994252206Sdavidcs		case  Q81_RX_CTL_PKTS_LO             :
995252206Sdavidcs		case  Q81_RX_PAUSE_PKTS              :
996252206Sdavidcs		case  Q81_RX_PAUSE_PKTS_LO           :
997252206Sdavidcs		case  Q81_RX_64_PKTS                 :
998252206Sdavidcs		case  Q81_RX_64_PKTS_LO              :
999252206Sdavidcs		case  Q81_RX_65_TO_127_PKTS          :
1000252206Sdavidcs		case  Q81_RX_65_TO_127_PKTS_LO       :
1001252206Sdavidcs		case  Q81_RX_128_255_PKTS            :
1002252206Sdavidcs		case  Q81_RX_128_255_PKTS_LO         :
1003252206Sdavidcs		case  Q81_RX_256_511_PKTS            :
1004252206Sdavidcs		case  Q81_RX_256_511_PKTS_LO         :
1005252206Sdavidcs		case  Q81_RX_512_TO_1023_PKTS        :
1006252206Sdavidcs		case  Q81_RX_512_TO_1023_PKTS_LO     :
1007252206Sdavidcs		case  Q81_RX_1024_TO_1518_PKTS       :
1008252206Sdavidcs		case  Q81_RX_1024_TO_1518_PKTS_LO    :
1009252206Sdavidcs		case  Q81_RX_1519_TO_MAX_PKTS        :
1010252206Sdavidcs		case  Q81_RX_1519_TO_MAX_PKTS_LO     :
1011252206Sdavidcs		case  Q81_RX_LEN_ERR_PKTS            :
1012252206Sdavidcs		case  Q81_RX_LEN_ERR_PKTS_LO         :
1013252206Sdavidcs		case  Q81_MDIO_TX_DATA               :
1014252206Sdavidcs		case  Q81_MDIO_RX_DATA               :
1015252206Sdavidcs		case  Q81_MDIO_CMD                   :
1016252206Sdavidcs		case  Q81_MDIO_PHY_ADDR              :
1017252206Sdavidcs		case  Q81_MDIO_PORT                  :
1018252206Sdavidcs		case  Q81_MDIO_STATUS                :
1019252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES0      :
1020252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES0_LO   :
1021252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES1      :
1022252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES1_LO   :
1023252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES2      :
1024252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES2_LO   :
1025252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES3      :
1026252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES3_LO   :
1027252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES4      :
1028252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES4_LO   :
1029252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES5      :
1030252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES5_LO   :
1031252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES6      :
1032252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES6_LO   :
1033252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES7      :
1034252206Sdavidcs		case  Q81_TX_CBFC_PAUSE_FRAMES7_LO   :
1035252206Sdavidcs		case  Q81_TX_FCOE_PKTS               :
1036252206Sdavidcs		case  Q81_TX_FCOE_PKTS_LO            :
1037252206Sdavidcs		case  Q81_TX_MGMT_PKTS               :
1038252206Sdavidcs		case  Q81_TX_MGMT_PKTS_LO            :
1039252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES0      :
1040252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES0_LO   :
1041252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES1      :
1042252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES1_LO   :
1043252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES2      :
1044252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES2_LO   :
1045252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES3      :
1046252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES3_LO   :
1047252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES4      :
1048252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES4_LO   :
1049252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES5      :
1050252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES5_LO   :
1051252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES6      :
1052252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES6_LO   :
1053252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES7      :
1054252206Sdavidcs		case  Q81_RX_CBFC_PAUSE_FRAMES7_LO   :
1055252206Sdavidcs		case  Q81_RX_FCOE_PKTS               :
1056252206Sdavidcs		case  Q81_RX_FCOE_PKTS_LO            :
1057252206Sdavidcs		case  Q81_RX_MGMT_PKTS               :
1058252206Sdavidcs		case  Q81_RX_MGMT_PKTS_LO            :
1059252206Sdavidcs		case  Q81_RX_NIC_FIFO_DROP           :
1060252206Sdavidcs		case  Q81_RX_NIC_FIFO_DROP_LO        :
1061252206Sdavidcs		case  Q81_RX_FCOE_FIFO_DROP          :
1062252206Sdavidcs		case  Q81_RX_FCOE_FIFO_DROP_LO       :
1063252206Sdavidcs		case  Q81_RX_MGMT_FIFO_DROP          :
1064252206Sdavidcs		case  Q81_RX_MGMT_FIFO_DROP_LO       :
1065252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY0          :
1066252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY0_LO       :
1067252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY1          :
1068252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY1_LO       :
1069252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY2          :
1070252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY2_LO       :
1071252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY3          :
1072252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY3_LO       :
1073252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY4          :
1074252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY4_LO       :
1075252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY5          :
1076252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY5_LO       :
1077252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY6          :
1078252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY6_LO       :
1079252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY7          :
1080252206Sdavidcs		case  Q81_RX_PKTS_PRIORITY7_LO       :
1081252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY0        :
1082252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY0_LO     :
1083252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY1        :
1084252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY1_LO     :
1085252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY2        :
1086252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY2_LO     :
1087252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY3        :
1088252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY3_LO     :
1089252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY4        :
1090252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY4_LO     :
1091252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY5        :
1092252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY5_LO     :
1093252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY6        :
1094252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY6_LO     :
1095252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY7        :
1096252206Sdavidcs		case  Q81_RX_OCTETS_PRIORITY7_LO     :
1097252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY0          :
1098252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY0_LO       :
1099252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY1          :
1100252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY1_LO       :
1101252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY2          :
1102252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY2_LO       :
1103252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY3          :
1104252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY3_LO       :
1105252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY4          :
1106252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY4_LO       :
1107252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY5          :
1108252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY5_LO       :
1109252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY6          :
1110252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY6_LO       :
1111252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY7          :
1112252206Sdavidcs		case  Q81_TX_PKTS_PRIORITY7_LO       :
1113252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY0        :
1114252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY0_LO     :
1115252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY1        :
1116252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY1_LO     :
1117252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY2        :
1118252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY2_LO     :
1119252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY3        :
1120252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY3_LO     :
1121252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY4        :
1122252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY4_LO     :
1123252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY5        :
1124252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY5_LO     :
1125252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY6        :
1126252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY6_LO     :
1127252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY7        :
1128252206Sdavidcs		case  Q81_TX_OCTETS_PRIORITY7_LO     :
1129252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY0       :
1130252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY0_LO    :
1131252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY1       :
1132252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY1_LO    :
1133252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY2       :
1134252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY2_LO    :
1135252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY3       :
1136252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY3_LO    :
1137252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY4       :
1138252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY4_LO    :
1139252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY5       :
1140252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY5_LO    :
1141252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY6       :
1142252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY6_LO    :
1143252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY7       :
1144252206Sdavidcs		case  Q81_RX_DISCARD_PRIORITY7_LO    :
1145252206Sdavidcs
1146252206Sdavidcs			if (o_func)
1147252206Sdavidcs				ret = qls_rd_ofunc_xgmac_reg(ha,
1148252206Sdavidcs						i, buf);
1149252206Sdavidcs			else
1150252206Sdavidcs				ret = qls_rd_xgmac_reg(ha, i, buf);
1151252206Sdavidcs
1152252206Sdavidcs			if (ret)
1153252206Sdavidcs				*buf = Q81_BAD_DATA;
1154252206Sdavidcs
1155252206Sdavidcs			break;
1156252206Sdavidcs
1157252206Sdavidcs		default:
1158252206Sdavidcs			break;
1159252206Sdavidcs
1160252206Sdavidcs		}
1161252206Sdavidcs	}
1162252206Sdavidcs	return 0;
1163252206Sdavidcs}
1164252206Sdavidcs
1165252206Sdavidcsstatic int
1166252206Sdavidcsqls_get_mpi_regs(qla_host_t *ha, uint32_t *buf, uint32_t offset, uint32_t count)
1167252206Sdavidcs{
1168252206Sdavidcs	int i, ret = 0;
1169252206Sdavidcs
1170252206Sdavidcs	for (i = 0; i < count; i++, buf++) {
1171252206Sdavidcs
1172252206Sdavidcs		ret = qls_rd_mpi_reg(ha, (offset + i), buf);
1173252206Sdavidcs
1174252206Sdavidcs		if (ret)
1175252206Sdavidcs			return ret;
1176252206Sdavidcs	}
1177252206Sdavidcs
1178252206Sdavidcs	return (ret);
1179252206Sdavidcs}
1180252206Sdavidcs
1181252206Sdavidcsstatic int
1182252206Sdavidcsqls_get_mpi_shadow_regs(qla_host_t *ha, uint32_t *buf)
1183252206Sdavidcs{
1184252206Sdavidcs	uint32_t	i;
1185252206Sdavidcs	int		ret;
1186252206Sdavidcs
1187252206Sdavidcs#define Q81_RISC_124 0x0000007c
1188252206Sdavidcs#define Q81_RISC_127 0x0000007f
1189252206Sdavidcs#define Q81_SHADOW_OFFSET 0xb0000000
1190252206Sdavidcs
1191252206Sdavidcs	for (i = 0; i < Q81_MPI_CORE_SH_REGS_CNT; i++, buf++) {
1192252206Sdavidcs
1193252206Sdavidcs		ret = qls_wr_mpi_reg(ha,
1194252206Sdavidcs				(Q81_CTL_PROC_ADDR_RISC_INT_REG | Q81_RISC_124),
1195252206Sdavidcs                                (Q81_SHADOW_OFFSET | i << 20));
1196252206Sdavidcs		if (ret)
1197252206Sdavidcs			goto exit_qls_get_mpi_shadow_regs;
1198252206Sdavidcs
1199252206Sdavidcs		ret = qls_mpi_risc_rd_reg(ha,
1200252206Sdavidcs				(Q81_CTL_PROC_ADDR_RISC_INT_REG | Q81_RISC_127),
1201252206Sdavidcs				 buf);
1202252206Sdavidcs		if (ret)
1203252206Sdavidcs			goto exit_qls_get_mpi_shadow_regs;
1204252206Sdavidcs	}
1205252206Sdavidcs
1206252206Sdavidcsexit_qls_get_mpi_shadow_regs:
1207252206Sdavidcs	return ret;
1208252206Sdavidcs}
1209252206Sdavidcs
1210252206Sdavidcs#define SYS_CLOCK (0x00)
1211252206Sdavidcs#define PCI_CLOCK (0x80)
1212252206Sdavidcs#define FC_CLOCK  (0x140)
1213252206Sdavidcs#define XGM_CLOCK (0x180)
1214252206Sdavidcs
1215252206Sdavidcs#define Q81_ADDRESS_REGISTER_ENABLE 0x00010000
1216252206Sdavidcs#define Q81_UP                      0x00008000
1217252206Sdavidcs#define Q81_MAX_MUX                 0x40
1218252206Sdavidcs#define Q81_MAX_MODULES             0x1F
1219252206Sdavidcs
1220252206Sdavidcsstatic uint32_t *
1221252206Sdavidcsqls_get_probe(qla_host_t *ha, uint32_t clock, uint8_t *valid, uint32_t *buf)
1222252206Sdavidcs{
1223252206Sdavidcs	uint32_t module, mux_sel, probe, lo_val, hi_val;
1224252206Sdavidcs
1225252206Sdavidcs	for (module = 0; module < Q81_MAX_MODULES; module ++) {
1226252206Sdavidcs
1227252206Sdavidcs		if (valid[module]) {
1228252206Sdavidcs
1229252206Sdavidcs			for (mux_sel = 0; mux_sel < Q81_MAX_MUX; mux_sel++) {
1230252206Sdavidcs
1231252206Sdavidcs				probe = clock | Q81_ADDRESS_REGISTER_ENABLE |
1232252206Sdavidcs						mux_sel | (module << 9);
1233252206Sdavidcs				WRITE_REG32(ha, Q81_CTL_XG_PROBE_MUX_ADDR,\
1234252206Sdavidcs					probe);
1235252206Sdavidcs
1236252206Sdavidcs				lo_val = READ_REG32(ha,\
1237252206Sdavidcs						Q81_CTL_XG_PROBE_MUX_DATA);
1238252206Sdavidcs
1239252206Sdavidcs				if (mux_sel == 0) {
1240252206Sdavidcs					*buf = probe;
1241252206Sdavidcs					buf ++;
1242252206Sdavidcs				}
1243252206Sdavidcs
1244252206Sdavidcs				probe |= Q81_UP;
1245252206Sdavidcs
1246252206Sdavidcs				WRITE_REG32(ha, Q81_CTL_XG_PROBE_MUX_ADDR,\
1247252206Sdavidcs					probe);
1248252206Sdavidcs				hi_val = READ_REG32(ha,\
1249252206Sdavidcs						Q81_CTL_XG_PROBE_MUX_DATA);
1250252206Sdavidcs
1251252206Sdavidcs				*buf = lo_val;
1252252206Sdavidcs				buf++;
1253252206Sdavidcs				*buf = hi_val;
1254252206Sdavidcs				buf++;
1255252206Sdavidcs			}
1256252206Sdavidcs		}
1257252206Sdavidcs	}
1258252206Sdavidcs
1259252206Sdavidcs	return(buf);
1260252206Sdavidcs}
1261252206Sdavidcs
1262252206Sdavidcsstatic int
1263252206Sdavidcsqls_get_probe_dump(qla_host_t *ha, uint32_t *buf)
1264252206Sdavidcs{
1265252206Sdavidcs
1266252206Sdavidcs	uint8_t sys_clock_valid_modules[0x20] = {
1267252206Sdavidcs		1,   // 0x00
1268252206Sdavidcs		1,   // 0x01
1269252206Sdavidcs		1,   // 0x02
1270252206Sdavidcs		0,   // 0x03
1271252206Sdavidcs		1,   // 0x04
1272252206Sdavidcs		1,   // 0x05
1273252206Sdavidcs		1,   // 0x06
1274252206Sdavidcs		1,   // 0x07
1275252206Sdavidcs		1,   // 0x08
1276252206Sdavidcs		1,   // 0x09
1277252206Sdavidcs		1,   // 0x0A
1278252206Sdavidcs		1,   // 0x0B
1279252206Sdavidcs		1,   // 0x0C
1280252206Sdavidcs		1,   // 0x0D
1281252206Sdavidcs		1,   // 0x0E
1282252206Sdavidcs		0,   // 0x0F
1283252206Sdavidcs		1,   // 0x10
1284252206Sdavidcs		1,   // 0x11
1285252206Sdavidcs		1,   // 0x12
1286252206Sdavidcs		1,   // 0x13
1287252206Sdavidcs		0,   // 0x14
1288252206Sdavidcs		0,   // 0x15
1289252206Sdavidcs		0,   // 0x16
1290252206Sdavidcs		0,   // 0x17
1291252206Sdavidcs		0,   // 0x18
1292252206Sdavidcs		0,   // 0x19
1293252206Sdavidcs		0,   // 0x1A
1294252206Sdavidcs		0,   // 0x1B
1295252206Sdavidcs		0,   // 0x1C
1296252206Sdavidcs		0,   // 0x1D
1297252206Sdavidcs		0,   // 0x1E
1298252206Sdavidcs		0    // 0x1F
1299252206Sdavidcs	};
1300252206Sdavidcs
1301252206Sdavidcs
1302252206Sdavidcs	uint8_t pci_clock_valid_modules[0x20] = {
1303252206Sdavidcs		1,   // 0x00
1304252206Sdavidcs		0,   // 0x01
1305252206Sdavidcs		0,   // 0x02
1306252206Sdavidcs		0,   // 0x03
1307252206Sdavidcs		0,   // 0x04
1308252206Sdavidcs		0,   // 0x05
1309252206Sdavidcs		1,   // 0x06
1310252206Sdavidcs		1,   // 0x07
1311252206Sdavidcs		0,   // 0x08
1312252206Sdavidcs		0,   // 0x09
1313252206Sdavidcs		0,   // 0x0A
1314252206Sdavidcs		0,   // 0x0B
1315252206Sdavidcs		0,   // 0x0C
1316252206Sdavidcs		0,   // 0x0D
1317252206Sdavidcs		1,   // 0x0E
1318252206Sdavidcs		0,   // 0x0F
1319252206Sdavidcs		0,   // 0x10
1320252206Sdavidcs		0,   // 0x11
1321252206Sdavidcs		0,   // 0x12
1322252206Sdavidcs		0,   // 0x13
1323252206Sdavidcs		0,   // 0x14
1324252206Sdavidcs		0,   // 0x15
1325252206Sdavidcs		0,   // 0x16
1326252206Sdavidcs		0,   // 0x17
1327252206Sdavidcs		0,   // 0x18
1328252206Sdavidcs		0,   // 0x19
1329252206Sdavidcs		0,   // 0x1A
1330252206Sdavidcs		0,   // 0x1B
1331252206Sdavidcs		0,   // 0x1C
1332252206Sdavidcs		0,   // 0x1D
1333252206Sdavidcs		0,   // 0x1E
1334252206Sdavidcs		0    // 0x1F
1335252206Sdavidcs	};
1336252206Sdavidcs
1337252206Sdavidcs
1338252206Sdavidcs	uint8_t xgm_clock_valid_modules[0x20] = {
1339252206Sdavidcs		1,   // 0x00
1340252206Sdavidcs		0,   // 0x01
1341252206Sdavidcs		0,   // 0x02
1342252206Sdavidcs		1,   // 0x03
1343252206Sdavidcs		0,   // 0x04
1344252206Sdavidcs		0,   // 0x05
1345252206Sdavidcs		0,   // 0x06
1346252206Sdavidcs		0,   // 0x07
1347252206Sdavidcs		1,   // 0x08
1348252206Sdavidcs		1,   // 0x09
1349252206Sdavidcs		0,   // 0x0A
1350252206Sdavidcs		0,   // 0x0B
1351252206Sdavidcs		1,   // 0x0C
1352252206Sdavidcs		1,   // 0x0D
1353252206Sdavidcs		1,   // 0x0E
1354252206Sdavidcs		0,   // 0x0F
1355252206Sdavidcs		1,   // 0x10
1356252206Sdavidcs		1,   // 0x11
1357252206Sdavidcs		0,   // 0x12
1358252206Sdavidcs		0,   // 0x13
1359252206Sdavidcs		0,   // 0x14
1360252206Sdavidcs		0,   // 0x15
1361252206Sdavidcs		0,   // 0x16
1362252206Sdavidcs		0,   // 0x17
1363252206Sdavidcs		0,   // 0x18
1364252206Sdavidcs		0,   // 0x19
1365252206Sdavidcs		0,   // 0x1A
1366252206Sdavidcs		0,   // 0x1B
1367252206Sdavidcs		0,   // 0x1C
1368252206Sdavidcs		0,   // 0x1D
1369252206Sdavidcs		0,   // 0x1E
1370252206Sdavidcs		0    // 0x1F
1371252206Sdavidcs	};
1372252206Sdavidcs
1373252206Sdavidcs	uint8_t fc_clock_valid_modules[0x20] = {
1374252206Sdavidcs		1,   // 0x00
1375252206Sdavidcs		0,   // 0x01
1376252206Sdavidcs		0,   // 0x02
1377252206Sdavidcs		0,   // 0x03
1378252206Sdavidcs		0,   // 0x04
1379252206Sdavidcs		0,   // 0x05
1380252206Sdavidcs		0,   // 0x06
1381252206Sdavidcs		0,   // 0x07
1382252206Sdavidcs		0,   // 0x08
1383252206Sdavidcs		0,   // 0x09
1384252206Sdavidcs		0,   // 0x0A
1385252206Sdavidcs		0,   // 0x0B
1386252206Sdavidcs		1,   // 0x0C
1387252206Sdavidcs		1,   // 0x0D
1388252206Sdavidcs		0,   // 0x0E
1389252206Sdavidcs		0,   // 0x0F
1390252206Sdavidcs		0,   // 0x10
1391252206Sdavidcs		0,   // 0x11
1392252206Sdavidcs		0,   // 0x12
1393252206Sdavidcs		0,   // 0x13
1394252206Sdavidcs		0,   // 0x14
1395252206Sdavidcs		0,   // 0x15
1396252206Sdavidcs		0,   // 0x16
1397252206Sdavidcs		0,   // 0x17
1398252206Sdavidcs		0,   // 0x18
1399252206Sdavidcs		0,   // 0x19
1400252206Sdavidcs		0,   // 0x1A
1401252206Sdavidcs		0,   // 0x1B
1402252206Sdavidcs		0,   // 0x1C
1403252206Sdavidcs		0,   // 0x1D
1404252206Sdavidcs		0,   // 0x1E
1405252206Sdavidcs		0    // 0x1F
1406252206Sdavidcs	};
1407252206Sdavidcs
1408252206Sdavidcs	qls_wr_mpi_reg(ha, 0x100e, 0x18a20000);
1409252206Sdavidcs
1410252206Sdavidcs	buf = qls_get_probe(ha, SYS_CLOCK, sys_clock_valid_modules, buf);
1411252206Sdavidcs
1412252206Sdavidcs	buf = qls_get_probe(ha, PCI_CLOCK, pci_clock_valid_modules, buf);
1413252206Sdavidcs
1414252206Sdavidcs	buf = qls_get_probe(ha, XGM_CLOCK, xgm_clock_valid_modules, buf);
1415252206Sdavidcs
1416252206Sdavidcs	buf = qls_get_probe(ha, FC_CLOCK, fc_clock_valid_modules, buf);
1417252206Sdavidcs
1418252206Sdavidcs	return(0);
1419252206Sdavidcs}
1420252206Sdavidcs
1421252206Sdavidcsstatic void
1422252206Sdavidcsqls_get_ridx_registers(qla_host_t *ha, uint32_t *buf)
1423252206Sdavidcs{
1424252206Sdavidcs	uint32_t type, idx, idx_max;
1425252206Sdavidcs	uint32_t r_idx;
1426252206Sdavidcs	uint32_t r_data;
1427252206Sdavidcs	uint32_t val;
1428252206Sdavidcs
1429252206Sdavidcs	for (type = 0; type < 4; type ++) {
1430252206Sdavidcs		if (type < 2)
1431252206Sdavidcs			idx_max = 8;
1432252206Sdavidcs		else
1433252206Sdavidcs			idx_max = 16;
1434252206Sdavidcs
1435252206Sdavidcs		for (idx = 0; idx < idx_max; idx ++) {
1436252206Sdavidcs
1437252206Sdavidcs			val = 0x04000000 | (type << 16) | (idx << 8);
1438252206Sdavidcs			WRITE_REG32(ha, Q81_CTL_ROUTING_INDEX, val);
1439252206Sdavidcs
1440252206Sdavidcs			r_idx = 0;
1441252206Sdavidcs			while ((r_idx & 0x40000000) == 0)
1442252206Sdavidcs				r_idx = READ_REG32(ha, Q81_CTL_ROUTING_INDEX);
1443252206Sdavidcs
1444252206Sdavidcs			r_data = READ_REG32(ha, Q81_CTL_ROUTING_DATA);
1445252206Sdavidcs
1446252206Sdavidcs			*buf = type;
1447252206Sdavidcs			buf ++;
1448252206Sdavidcs			*buf = idx;
1449252206Sdavidcs			buf ++;
1450252206Sdavidcs			*buf = r_idx;
1451252206Sdavidcs			buf ++;
1452252206Sdavidcs			*buf = r_data;
1453252206Sdavidcs			buf ++;
1454252206Sdavidcs		}
1455252206Sdavidcs	}
1456252206Sdavidcs}
1457252206Sdavidcs
1458252206Sdavidcsstatic void
1459252206Sdavidcsqls_get_mac_proto_regs(qla_host_t *ha, uint32_t* buf)
1460252206Sdavidcs{
1461252206Sdavidcs
1462252206Sdavidcs#define Q81_RS_AND_ADR 0x06000000
1463252206Sdavidcs#define Q81_RS_ONLY    0x04000000
1464252206Sdavidcs#define Q81_NUM_TYPES  10
1465252206Sdavidcs
1466252206Sdavidcs	uint32_t result_index, result_data;
1467252206Sdavidcs	uint32_t type;
1468252206Sdavidcs	uint32_t index;
1469252206Sdavidcs	uint32_t offset;
1470252206Sdavidcs	uint32_t val;
1471252206Sdavidcs	uint32_t initial_val;
1472252206Sdavidcs	uint32_t max_index;
1473252206Sdavidcs	uint32_t max_offset;
1474252206Sdavidcs
1475252206Sdavidcs	for (type = 0; type < Q81_NUM_TYPES; type ++) {
1476252206Sdavidcs		switch (type) {
1477252206Sdavidcs
1478252206Sdavidcs		case 0: // CAM
1479252206Sdavidcs			initial_val = Q81_RS_AND_ADR;
1480252206Sdavidcs			max_index = 512;
1481252206Sdavidcs			max_offset = 3;
1482252206Sdavidcs			break;
1483252206Sdavidcs
1484252206Sdavidcs		case 1: // Multicast MAC Address
1485252206Sdavidcs			initial_val = Q81_RS_ONLY;
1486252206Sdavidcs			max_index = 32;
1487252206Sdavidcs			max_offset = 2;
1488252206Sdavidcs			break;
1489252206Sdavidcs
1490252206Sdavidcs		case 2: // VLAN filter mask
1491252206Sdavidcs		case 3: // MC filter mask
1492252206Sdavidcs			initial_val = Q81_RS_ONLY;
1493252206Sdavidcs			max_index = 4096;
1494252206Sdavidcs			max_offset = 1;
1495252206Sdavidcs			break;
1496252206Sdavidcs
1497252206Sdavidcs		case 4: // FC MAC addresses
1498252206Sdavidcs			initial_val = Q81_RS_ONLY;
1499252206Sdavidcs			max_index = 4;
1500252206Sdavidcs			max_offset = 2;
1501252206Sdavidcs			break;
1502252206Sdavidcs
1503252206Sdavidcs		case 5: // Mgmt MAC addresses
1504252206Sdavidcs			initial_val = Q81_RS_ONLY;
1505252206Sdavidcs			max_index = 8;
1506252206Sdavidcs			max_offset = 2;
1507252206Sdavidcs			break;
1508252206Sdavidcs
1509252206Sdavidcs		case 6: // Mgmt VLAN addresses
1510252206Sdavidcs			initial_val = Q81_RS_ONLY;
1511252206Sdavidcs			max_index = 16;
1512252206Sdavidcs			max_offset = 1;
1513252206Sdavidcs			break;
1514252206Sdavidcs
1515252206Sdavidcs		case 7: // Mgmt IPv4 address
1516252206Sdavidcs			initial_val = Q81_RS_ONLY;
1517252206Sdavidcs			max_index = 4;
1518252206Sdavidcs			max_offset = 1;
1519252206Sdavidcs			break;
1520252206Sdavidcs
1521252206Sdavidcs		case 8: // Mgmt IPv6 address
1522252206Sdavidcs			initial_val = Q81_RS_ONLY;
1523252206Sdavidcs			max_index = 4;
1524252206Sdavidcs			max_offset = 4;
1525252206Sdavidcs			break;
1526252206Sdavidcs
1527252206Sdavidcs		case 9: // Mgmt TCP/UDP Dest port
1528252206Sdavidcs			initial_val = Q81_RS_ONLY;
1529252206Sdavidcs			max_index = 4;
1530252206Sdavidcs			max_offset = 1;
1531252206Sdavidcs			break;
1532252206Sdavidcs
1533252206Sdavidcs		default:
1534252206Sdavidcs			printf("Bad type!!! 0x%08x\n", type);
1535252206Sdavidcs			max_index = 0;
1536252206Sdavidcs			max_offset = 0;
1537252206Sdavidcs			break;
1538252206Sdavidcs		}
1539252206Sdavidcs
1540252206Sdavidcs		for (index = 0; index < max_index; index ++) {
1541252206Sdavidcs
1542252206Sdavidcs			for (offset = 0; offset < max_offset; offset ++) {
1543252206Sdavidcs
1544252206Sdavidcs				val = initial_val | (type << 16) |
1545252206Sdavidcs					(index << 4) | (offset);
1546252206Sdavidcs
1547252206Sdavidcs				WRITE_REG32(ha, Q81_CTL_MAC_PROTO_ADDR_INDEX,\
1548252206Sdavidcs					val);
1549252206Sdavidcs
1550252206Sdavidcs				result_index = 0;
1551252206Sdavidcs
1552252206Sdavidcs				while ((result_index & 0x40000000) == 0)
1553252206Sdavidcs					result_index =
1554252206Sdavidcs						READ_REG32(ha, \
1555252206Sdavidcs						Q81_CTL_MAC_PROTO_ADDR_INDEX);
1556252206Sdavidcs
1557252206Sdavidcs				result_data = READ_REG32(ha,\
1558252206Sdavidcs						Q81_CTL_MAC_PROTO_ADDR_DATA);
1559252206Sdavidcs
1560252206Sdavidcs				*buf = result_index;
1561252206Sdavidcs				buf ++;
1562252206Sdavidcs
1563252206Sdavidcs				*buf = result_data;
1564252206Sdavidcs				buf ++;
1565252206Sdavidcs			}
1566252206Sdavidcs		}
1567252206Sdavidcs	}
1568252206Sdavidcs}
1569252206Sdavidcs
1570252206Sdavidcsstatic int
1571252206Sdavidcsqls_get_ets_regs(qla_host_t *ha, uint32_t *buf)
1572252206Sdavidcs{
1573252206Sdavidcs	int ret = 0;
1574252206Sdavidcs	int i;
1575252206Sdavidcs
1576252206Sdavidcs	for(i = 0; i < 8; i ++, buf ++) {
1577252206Sdavidcs		WRITE_REG32(ha, Q81_CTL_NIC_ENH_TX_SCHD, \
1578252206Sdavidcs			((i << 29) | 0x08000000));
1579252206Sdavidcs		*buf = READ_REG32(ha, Q81_CTL_NIC_ENH_TX_SCHD);
1580252206Sdavidcs	}
1581252206Sdavidcs
1582252206Sdavidcs	for(i = 0; i < 2; i ++, buf ++) {
1583252206Sdavidcs		WRITE_REG32(ha, Q81_CTL_CNA_ENH_TX_SCHD, \
1584252206Sdavidcs			((i << 29) | 0x08000000));
1585252206Sdavidcs		*buf = READ_REG32(ha, Q81_CTL_CNA_ENH_TX_SCHD);
1586252206Sdavidcs	}
1587252206Sdavidcs
1588252206Sdavidcs	return ret;
1589252206Sdavidcs}
1590252206Sdavidcs
1591252206Sdavidcsint
1592252206Sdavidcsqls_mpi_core_dump(qla_host_t *ha)
1593252206Sdavidcs{
1594252206Sdavidcs	int ret;
1595252206Sdavidcs	int i;
1596252206Sdavidcs	uint32_t reg, reg_val;
1597252206Sdavidcs
1598252206Sdavidcs	qls_mpi_coredump_t *mpi_dump = &ql_mpi_coredump;
1599252206Sdavidcs
1600252206Sdavidcs	ret = qls_pause_mpi_risc(ha);
1601252206Sdavidcs	if (ret) {
1602252206Sdavidcs		printf("Failed RISC pause. Status = 0x%.08x\n",ret);
1603252206Sdavidcs		return(-1);
1604252206Sdavidcs	}
1605252206Sdavidcs
1606252206Sdavidcs	memset(&(mpi_dump->mpi_global_header), 0,
1607252206Sdavidcs			sizeof(qls_mpid_glbl_hdr_t));
1608252206Sdavidcs
1609252206Sdavidcs	mpi_dump->mpi_global_header.cookie = Q81_MPID_COOKIE;
1610252206Sdavidcs	mpi_dump->mpi_global_header.hdr_size =
1611252206Sdavidcs		sizeof(qls_mpid_glbl_hdr_t);
1612252206Sdavidcs	mpi_dump->mpi_global_header.img_size =
1613252206Sdavidcs		sizeof(qls_mpi_coredump_t);
1614252206Sdavidcs
1615252206Sdavidcs	memcpy(mpi_dump->mpi_global_header.id, "MPI Coredump",
1616252206Sdavidcs		sizeof(mpi_dump->mpi_global_header.id));
1617252206Sdavidcs
1618252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->nic1_regs_seg_hdr,
1619252206Sdavidcs		Q81_NIC1_CONTROL_SEG_NUM,
1620252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic1_regs)),
1621252206Sdavidcs		"NIC1 Registers");
1622252206Sdavidcs
1623252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->nic2_regs_seg_hdr,
1624252206Sdavidcs		Q81_NIC2_CONTROL_SEG_NUM,
1625252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic2_regs)),
1626252206Sdavidcs		"NIC2 Registers");
1627252206Sdavidcs
1628252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xgmac1_seg_hdr,
1629252206Sdavidcs		Q81_NIC1_XGMAC_SEG_NUM,
1630252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->xgmac1)),
1631252206Sdavidcs		"NIC1 XGMac Registers");
1632252206Sdavidcs
1633252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xgmac2_seg_hdr,
1634252206Sdavidcs		Q81_NIC2_XGMAC_SEG_NUM,
1635252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->xgmac2)),
1636252206Sdavidcs		"NIC2 XGMac Registers");
1637252206Sdavidcs
1638252206Sdavidcs	if (ha->pci_func & 1) {
1639252206Sdavidcs		for (i = 0; i < 64; i++)
1640252206Sdavidcs			mpi_dump->nic2_regs[i] =
1641252206Sdavidcs				READ_REG32(ha, i * sizeof(uint32_t));
1642252206Sdavidcs
1643252206Sdavidcs		for (i = 0; i < 64; i++)
1644252206Sdavidcs			mpi_dump->nic1_regs[i] =
1645252206Sdavidcs				qls_rd_ofunc_reg(ha,
1646252206Sdavidcs					(i * sizeof(uint32_t)) / 4);
1647252206Sdavidcs
1648252206Sdavidcs		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac2[0], 0);
1649252206Sdavidcs		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac1[0], 1);
1650252206Sdavidcs	} else {
1651252206Sdavidcs		for (i = 0; i < 64; i++)
1652252206Sdavidcs			mpi_dump->nic1_regs[i] =
1653252206Sdavidcs				READ_REG32(ha, i * sizeof(uint32_t));
1654252206Sdavidcs
1655252206Sdavidcs		for (i = 0; i < 64; i++)
1656252206Sdavidcs			mpi_dump->nic2_regs[i] =
1657252206Sdavidcs				qls_rd_ofunc_reg(ha,
1658252206Sdavidcs					(i * sizeof(uint32_t)) / 4);
1659252206Sdavidcs
1660252206Sdavidcs		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac1[0], 0);
1661252206Sdavidcs		qls_rd_xgmac_regs(ha, &mpi_dump->xgmac2[0], 1);
1662252206Sdavidcs	}
1663252206Sdavidcs
1664252206Sdavidcs
1665252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xaui1_an_hdr,
1666252206Sdavidcs		Q81_XAUI1_AN_SEG_NUM,
1667252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1668252206Sdavidcs			sizeof(mpi_dump->serdes1_xaui_an)),
1669252206Sdavidcs		"XAUI1 AN Registers");
1670252206Sdavidcs
1671252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xaui1_hss_pcs_hdr,
1672252206Sdavidcs		Q81_XAUI1_HSS_PCS_SEG_NUM,
1673252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1674252206Sdavidcs			sizeof(mpi_dump->serdes1_xaui_hss_pcs)),
1675252206Sdavidcs		"XAUI1 HSS PCS Registers");
1676252206Sdavidcs
1677252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi1_an_hdr,
1678252206Sdavidcs		Q81_XFI1_AN_SEG_NUM,
1679252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->serdes1_xfi_an)),
1680252206Sdavidcs		"XFI1 AN Registers");
1681252206Sdavidcs
1682252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi1_train_hdr,
1683252206Sdavidcs		Q81_XFI1_TRAIN_SEG_NUM,
1684252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1685252206Sdavidcs			sizeof(mpi_dump->serdes1_xfi_train)),
1686252206Sdavidcs		"XFI1 TRAIN Registers");
1687252206Sdavidcs
1688252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_pcs_hdr,
1689252206Sdavidcs		Q81_XFI1_HSS_PCS_SEG_NUM,
1690252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1691252206Sdavidcs			sizeof(mpi_dump->serdes1_xfi_hss_pcs)),
1692252206Sdavidcs		"XFI1 HSS PCS Registers");
1693252206Sdavidcs
1694252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_tx_hdr,
1695252206Sdavidcs		Q81_XFI1_HSS_TX_SEG_NUM,
1696252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1697252206Sdavidcs			sizeof(mpi_dump->serdes1_xfi_hss_tx)),
1698252206Sdavidcs		"XFI1 HSS TX Registers");
1699252206Sdavidcs
1700252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_rx_hdr,
1701252206Sdavidcs		Q81_XFI1_HSS_RX_SEG_NUM,
1702252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1703252206Sdavidcs			sizeof(mpi_dump->serdes1_xfi_hss_rx)),
1704252206Sdavidcs		"XFI1 HSS RX Registers");
1705252206Sdavidcs
1706252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_pll_hdr,
1707252206Sdavidcs		Q81_XFI1_HSS_PLL_SEG_NUM,
1708252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1709252206Sdavidcs			sizeof(mpi_dump->serdes1_xfi_hss_pll)),
1710252206Sdavidcs		"XFI1 HSS PLL Registers");
1711252206Sdavidcs
1712252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xaui2_an_hdr,
1713252206Sdavidcs		Q81_XAUI2_AN_SEG_NUM,
1714252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1715252206Sdavidcs			sizeof(mpi_dump->serdes2_xaui_an)),
1716252206Sdavidcs		"XAUI2 AN Registers");
1717252206Sdavidcs
1718252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xaui2_hss_pcs_hdr,
1719252206Sdavidcs		Q81_XAUI2_HSS_PCS_SEG_NUM,
1720252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1721252206Sdavidcs			sizeof(mpi_dump->serdes2_xaui_hss_pcs)),
1722252206Sdavidcs		"XAUI2 HSS PCS Registers");
1723252206Sdavidcs
1724252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi2_an_hdr,
1725252206Sdavidcs		Q81_XFI2_AN_SEG_NUM,
1726252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->serdes2_xfi_an)),
1727252206Sdavidcs		"XFI2 AN Registers");
1728252206Sdavidcs
1729252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi2_train_hdr,
1730252206Sdavidcs		Q81_XFI2_TRAIN_SEG_NUM,
1731252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1732252206Sdavidcs			sizeof(mpi_dump->serdes2_xfi_train)),
1733252206Sdavidcs		"XFI2 TRAIN Registers");
1734252206Sdavidcs
1735252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_pcs_hdr,
1736252206Sdavidcs		Q81_XFI2_HSS_PCS_SEG_NUM,
1737252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1738252206Sdavidcs			sizeof(mpi_dump->serdes2_xfi_hss_pcs)),
1739252206Sdavidcs		"XFI2 HSS PCS Registers");
1740252206Sdavidcs
1741252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_tx_hdr,
1742252206Sdavidcs		Q81_XFI2_HSS_TX_SEG_NUM,
1743252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1744252206Sdavidcs			sizeof(mpi_dump->serdes2_xfi_hss_tx)),
1745252206Sdavidcs		"XFI2 HSS TX Registers");
1746252206Sdavidcs
1747252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_rx_hdr,
1748252206Sdavidcs		Q81_XFI2_HSS_RX_SEG_NUM,
1749252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1750252206Sdavidcs			sizeof(mpi_dump->serdes2_xfi_hss_rx)),
1751252206Sdavidcs		"XFI2 HSS RX Registers");
1752252206Sdavidcs
1753252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_pll_hdr,
1754252206Sdavidcs		Q81_XFI2_HSS_PLL_SEG_NUM,
1755252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1756252206Sdavidcs			sizeof(mpi_dump->serdes2_xfi_hss_pll)),
1757252206Sdavidcs		"XFI2 HSS PLL Registers");
1758252206Sdavidcs
1759252206Sdavidcs	qls_rd_serdes_regs(ha, mpi_dump);
1760252206Sdavidcs
1761252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->core_regs_seg_hdr,
1762252206Sdavidcs		Q81_CORE_SEG_NUM,
1763252206Sdavidcs		(sizeof(mpi_dump->core_regs_seg_hdr) +
1764252206Sdavidcs		 sizeof(mpi_dump->mpi_core_regs) +
1765252206Sdavidcs		 sizeof(mpi_dump->mpi_core_sh_regs)),
1766252206Sdavidcs		"Core Registers");
1767252206Sdavidcs
1768252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->mpi_core_regs[0],
1769252206Sdavidcs			Q81_MPI_CORE_REGS_ADDR, Q81_MPI_CORE_REGS_CNT);
1770252206Sdavidcs
1771252206Sdavidcs	ret = qls_get_mpi_shadow_regs(ha,
1772252206Sdavidcs			&mpi_dump->mpi_core_sh_regs[0]);
1773252206Sdavidcs
1774252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->test_logic_regs_seg_hdr,
1775252206Sdavidcs		Q81_TEST_LOGIC_SEG_NUM,
1776252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1777252206Sdavidcs			sizeof(mpi_dump->test_logic_regs)),
1778252206Sdavidcs		"Test Logic Regs");
1779252206Sdavidcs
1780252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->test_logic_regs[0],
1781252206Sdavidcs                            Q81_TEST_REGS_ADDR, Q81_TEST_REGS_CNT);
1782252206Sdavidcs
1783252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->rmii_regs_seg_hdr,
1784252206Sdavidcs		Q81_RMII_SEG_NUM,
1785252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->rmii_regs)),
1786252206Sdavidcs		"RMII Registers");
1787252206Sdavidcs
1788252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->rmii_regs[0],
1789252206Sdavidcs                            Q81_RMII_REGS_ADDR, Q81_RMII_REGS_CNT);
1790252206Sdavidcs
1791252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->fcmac1_regs_seg_hdr,
1792252206Sdavidcs		Q81_FCMAC1_SEG_NUM,
1793252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fcmac1_regs)),
1794252206Sdavidcs		"FCMAC1 Registers");
1795252206Sdavidcs
1796252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->fcmac1_regs[0],
1797252206Sdavidcs                            Q81_FCMAC1_REGS_ADDR, Q81_FCMAC_REGS_CNT);
1798252206Sdavidcs
1799252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->fcmac2_regs_seg_hdr,
1800252206Sdavidcs		Q81_FCMAC2_SEG_NUM,
1801252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fcmac2_regs)),
1802252206Sdavidcs		"FCMAC2 Registers");
1803252206Sdavidcs
1804252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->fcmac2_regs[0],
1805252206Sdavidcs                            Q81_FCMAC2_REGS_ADDR, Q81_FCMAC_REGS_CNT);
1806252206Sdavidcs
1807252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->fc1_mbx_regs_seg_hdr,
1808252206Sdavidcs		Q81_FC1_MBOX_SEG_NUM,
1809252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fc1_mbx_regs)),
1810252206Sdavidcs		"FC1 MBox Regs");
1811252206Sdavidcs
1812252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->fc1_mbx_regs[0],
1813252206Sdavidcs                            Q81_FC1_MBX_REGS_ADDR, Q81_FC_MBX_REGS_CNT);
1814252206Sdavidcs
1815252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->ide_regs_seg_hdr,
1816252206Sdavidcs		Q81_IDE_SEG_NUM,
1817252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->ide_regs)),
1818252206Sdavidcs		"IDE Registers");
1819252206Sdavidcs
1820252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->ide_regs[0],
1821252206Sdavidcs                            Q81_IDE_REGS_ADDR, Q81_IDE_REGS_CNT);
1822252206Sdavidcs
1823252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->nic1_mbx_regs_seg_hdr,
1824252206Sdavidcs		Q81_NIC1_MBOX_SEG_NUM,
1825252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic1_mbx_regs)),
1826252206Sdavidcs		"NIC1 MBox Regs");
1827252206Sdavidcs
1828252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->nic1_mbx_regs[0],
1829252206Sdavidcs                            Q81_NIC1_MBX_REGS_ADDR, Q81_NIC_MBX_REGS_CNT);
1830252206Sdavidcs
1831252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->smbus_regs_seg_hdr,
1832252206Sdavidcs		Q81_SMBUS_SEG_NUM,
1833252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->smbus_regs)),
1834252206Sdavidcs		"SMBus Registers");
1835252206Sdavidcs
1836252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->smbus_regs[0],
1837252206Sdavidcs                            Q81_SMBUS_REGS_ADDR, Q81_SMBUS_REGS_CNT);
1838252206Sdavidcs
1839252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->fc2_mbx_regs_seg_hdr,
1840252206Sdavidcs		Q81_FC2_MBOX_SEG_NUM,
1841252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fc2_mbx_regs)),
1842252206Sdavidcs		"FC2 MBox Regs");
1843252206Sdavidcs
1844252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->fc2_mbx_regs[0],
1845252206Sdavidcs                            Q81_FC2_MBX_REGS_ADDR, Q81_FC_MBX_REGS_CNT);
1846252206Sdavidcs
1847252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->nic2_mbx_regs_seg_hdr,
1848252206Sdavidcs		Q81_NIC2_MBOX_SEG_NUM,
1849252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic2_mbx_regs)),
1850252206Sdavidcs		"NIC2 MBox Regs");
1851252206Sdavidcs
1852252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->nic2_mbx_regs[0],
1853252206Sdavidcs                            Q81_NIC2_MBX_REGS_ADDR, Q81_NIC_MBX_REGS_CNT);
1854252206Sdavidcs
1855252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->i2c_regs_seg_hdr,
1856252206Sdavidcs		Q81_I2C_SEG_NUM,
1857252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) +
1858252206Sdavidcs			sizeof(mpi_dump->i2c_regs)),
1859252206Sdavidcs		"I2C Registers");
1860252206Sdavidcs
1861252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->i2c_regs[0],
1862252206Sdavidcs                            Q81_I2C_REGS_ADDR, Q81_I2C_REGS_CNT);
1863252206Sdavidcs
1864252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->memc_regs_seg_hdr,
1865252206Sdavidcs		Q81_MEMC_SEG_NUM,
1866252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->memc_regs)),
1867252206Sdavidcs		"MEMC Registers");
1868252206Sdavidcs
1869252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->memc_regs[0],
1870252206Sdavidcs                            Q81_MEMC_REGS_ADDR, Q81_MEMC_REGS_CNT);
1871252206Sdavidcs
1872252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->pbus_regs_seg_hdr,
1873252206Sdavidcs		Q81_PBUS_SEG_NUM,
1874252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->pbus_regs)),
1875252206Sdavidcs		"PBUS Registers");
1876252206Sdavidcs
1877252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->pbus_regs[0],
1878252206Sdavidcs                            Q81_PBUS_REGS_ADDR, Q81_PBUS_REGS_CNT);
1879252206Sdavidcs
1880252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->mde_regs_seg_hdr,
1881252206Sdavidcs		Q81_MDE_SEG_NUM,
1882252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->mde_regs)),
1883252206Sdavidcs		"MDE Registers");
1884252206Sdavidcs
1885252206Sdavidcs	ret = qls_get_mpi_regs(ha, &mpi_dump->mde_regs[0],
1886252206Sdavidcs                            Q81_MDE_REGS_ADDR, Q81_MDE_REGS_CNT);
1887252206Sdavidcs
1888252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->intr_states_seg_hdr,
1889252206Sdavidcs		Q81_INTR_STATES_SEG_NUM,
1890252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->intr_states)),
1891252206Sdavidcs		"INTR States");
1892252206Sdavidcs
1893252206Sdavidcs	qls_get_intr_states(ha, &mpi_dump->intr_states[0]);
1894252206Sdavidcs
1895252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->probe_dump_seg_hdr,
1896252206Sdavidcs		Q81_PROBE_DUMP_SEG_NUM,
1897252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->probe_dump)),
1898252206Sdavidcs		"Probe Dump");
1899252206Sdavidcs
1900252206Sdavidcs	qls_get_probe_dump(ha, &mpi_dump->probe_dump[0]);
1901252206Sdavidcs
1902252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->routing_reg_seg_hdr,
1903252206Sdavidcs		Q81_ROUTING_INDEX_SEG_NUM,
1904252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->routing_regs)),
1905252206Sdavidcs		"Routing Regs");
1906252206Sdavidcs
1907252206Sdavidcs	qls_get_ridx_registers(ha, &mpi_dump->routing_regs[0]);
1908252206Sdavidcs
1909252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->mac_prot_reg_seg_hdr,
1910252206Sdavidcs		Q81_MAC_PROTOCOL_SEG_NUM,
1911252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->mac_prot_regs)),
1912252206Sdavidcs		"MAC Prot Regs");
1913252206Sdavidcs
1914252206Sdavidcs	qls_get_mac_proto_regs(ha, &mpi_dump->mac_prot_regs[0]);
1915252206Sdavidcs
1916252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->ets_seg_hdr,
1917252206Sdavidcs		Q81_ETS_SEG_NUM,
1918252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->ets)),
1919252206Sdavidcs		"ETS Registers");
1920252206Sdavidcs
1921252206Sdavidcs	ret = qls_get_ets_regs(ha, &mpi_dump->ets[0]);
1922252206Sdavidcs
1923252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->sem_regs_seg_hdr,
1924252206Sdavidcs		Q81_SEM_REGS_SEG_NUM,
1925252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->sem_regs)),
1926252206Sdavidcs		"Sem Registers");
1927252206Sdavidcs
1928252206Sdavidcs	for(i = 0; i < Q81_MAX_SEMAPHORE_FUNCTIONS ; i ++) {
1929252206Sdavidcs
1930252206Sdavidcs		reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (i << Q81_FUNCTION_SHIFT) |
1931252206Sdavidcs				(Q81_CTL_SEMAPHORE >> 2);
1932252206Sdavidcs
1933252206Sdavidcs		ret = qls_mpi_risc_rd_reg(ha, reg, &reg_val);
1934252206Sdavidcs		mpi_dump->sem_regs[i] = reg_val;
1935252206Sdavidcs
1936252206Sdavidcs		if (ret != 0)
1937252206Sdavidcs			mpi_dump->sem_regs[i] = Q81_BAD_DATA;
1938252206Sdavidcs	}
1939252206Sdavidcs
1940252206Sdavidcs	ret = qls_unpause_mpi_risc(ha);
1941252206Sdavidcs	if (ret)
1942252206Sdavidcs		printf("Failed RISC unpause. Status = 0x%.08x\n",ret);
1943252206Sdavidcs
1944252206Sdavidcs	ret = qls_mpi_reset(ha);
1945252206Sdavidcs	if (ret)
1946252206Sdavidcs		printf("Failed RISC reset. Status = 0x%.08x\n",ret);
1947252206Sdavidcs
1948252206Sdavidcs	WRITE_REG32(ha, Q81_CTL_FUNC_SPECIFIC, 0x80008000);
1949252206Sdavidcs
1950252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->memc_ram_seg_hdr,
1951252206Sdavidcs		Q81_MEMC_RAM_SEG_NUM,
1952252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->memc_ram)),
1953252206Sdavidcs		"MEMC RAM");
1954252206Sdavidcs
1955252206Sdavidcs	ret = qls_mbx_dump_risc_ram(ha, &mpi_dump->memc_ram[0],
1956252206Sdavidcs			Q81_MEMC_RAM_ADDR, Q81_MEMC_RAM_CNT);
1957252206Sdavidcs	if (ret)
1958252206Sdavidcs		printf("Failed Dump of MEMC RAM. Status = 0x%.08x\n",ret);
1959252206Sdavidcs
1960252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->code_ram_seg_hdr,
1961252206Sdavidcs		Q81_WCS_RAM_SEG_NUM,
1962252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->code_ram)),
1963252206Sdavidcs		"WCS RAM");
1964252206Sdavidcs
1965252206Sdavidcs	ret = qls_mbx_dump_risc_ram(ha, &mpi_dump->memc_ram[0],
1966252206Sdavidcs			Q81_CODE_RAM_ADDR, Q81_CODE_RAM_CNT);
1967252206Sdavidcs	if (ret)
1968252206Sdavidcs		printf("Failed Dump of CODE RAM. Status = 0x%.08x\n",ret);
1969252206Sdavidcs
1970252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->wqc1_seg_hdr,
1971252206Sdavidcs		Q81_WQC1_SEG_NUM,
1972252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->wqc1)),
1973252206Sdavidcs		"WQC 1");
1974252206Sdavidcs
1975252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->wqc2_seg_hdr,
1976252206Sdavidcs		Q81_WQC2_SEG_NUM,
1977252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->wqc2)),
1978252206Sdavidcs		"WQC 2");
1979252206Sdavidcs
1980252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->cqc1_seg_hdr,
1981252206Sdavidcs		Q81_CQC1_SEG_NUM,
1982252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->cqc1)),
1983252206Sdavidcs		"CQC 1");
1984252206Sdavidcs
1985252206Sdavidcs	qls_mpid_seg_hdr(&mpi_dump->cqc2_seg_hdr,
1986252206Sdavidcs		Q81_CQC2_SEG_NUM,
1987252206Sdavidcs		(sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->cqc2)),
1988252206Sdavidcs		"CQC 2");
1989252206Sdavidcs
1990252206Sdavidcs	return 0;
1991252206Sdavidcs}
1992252206Sdavidcs
1993