1291a2b48SSukumar Swaminathan /*
2291a2b48SSukumar Swaminathan * CDDL HEADER START
3291a2b48SSukumar Swaminathan *
4291a2b48SSukumar Swaminathan * The contents of this file are subject to the terms of the
5291a2b48SSukumar Swaminathan * Common Development and Distribution License (the "License").
6291a2b48SSukumar Swaminathan * You may not use this file except in compliance with the License.
7291a2b48SSukumar Swaminathan *
88f23e9faSHans Rosenfeld * You can obtain a copy of the license at
98f23e9faSHans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt.
10291a2b48SSukumar Swaminathan * See the License for the specific language governing permissions
11291a2b48SSukumar Swaminathan * and limitations under the License.
12291a2b48SSukumar Swaminathan *
13291a2b48SSukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
14291a2b48SSukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15291a2b48SSukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
16291a2b48SSukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
17291a2b48SSukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
18291a2b48SSukumar Swaminathan *
19291a2b48SSukumar Swaminathan * CDDL HEADER END
20291a2b48SSukumar Swaminathan */
21291a2b48SSukumar Swaminathan
22291a2b48SSukumar Swaminathan /*
238f23e9faSHans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
2482527734SSukumar Swaminathan * Use is subject to license terms.
25291a2b48SSukumar Swaminathan */
26291a2b48SSukumar Swaminathan
27291a2b48SSukumar Swaminathan #include <emlxs.h>
28291a2b48SSukumar Swaminathan
29291a2b48SSukumar Swaminathan #ifdef DUMP_SUPPORT
30291a2b48SSukumar Swaminathan
31291a2b48SSukumar Swaminathan /* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
32291a2b48SSukumar Swaminathan EMLXS_MSG_DEF(EMLXS_DUMP_C);
33291a2b48SSukumar Swaminathan
34291a2b48SSukumar Swaminathan /* ************************************************************************* */
35291a2b48SSukumar Swaminathan /* Utility functions */
36291a2b48SSukumar Swaminathan /* ************************************************************************* */
37291a2b48SSukumar Swaminathan
38291a2b48SSukumar Swaminathan static uint32_t
emlxs_menlo_set_mode(emlxs_hba_t * hba,uint32_t mode)39291a2b48SSukumar Swaminathan emlxs_menlo_set_mode(
40291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
41291a2b48SSukumar Swaminathan uint32_t mode)
42291a2b48SSukumar Swaminathan {
43291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
44291a2b48SSukumar Swaminathan uint32_t cmd_size;
45291a2b48SSukumar Swaminathan uint32_t rsp_size;
46291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL;
47291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf = NULL;
48291a2b48SSukumar Swaminathan uint32_t rval = 0;
49291a2b48SSukumar Swaminathan
50*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
51*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
5282527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
53291a2b48SSukumar Swaminathan }
54291a2b48SSukumar Swaminathan
5582527734SSukumar Swaminathan cmd_size = sizeof (menlo_set_cmd_t);
5682527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
57291a2b48SSukumar Swaminathan
5882527734SSukumar Swaminathan rsp_size = 4;
5982527734SSukumar Swaminathan rsp_buf = (menlo_rsp_t *)kmem_zalloc(rsp_size, KM_SLEEP);
60291a2b48SSukumar Swaminathan
61291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_SET_MODE;
62291a2b48SSukumar Swaminathan cmd_buf->set.value1 = mode;
63291a2b48SSukumar Swaminathan cmd_buf->set.value2 = 0;
64291a2b48SSukumar Swaminathan
65291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
66291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
67291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
68291a2b48SSukumar Swaminathan
69291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
70291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) {
71291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
728f23e9faSHans Rosenfeld "menlo_set_mode: Unable to send command.");
73291a2b48SSukumar Swaminathan goto done;
74291a2b48SSukumar Swaminathan }
75291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
76291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
77291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
78291a2b48SSukumar Swaminathan
79291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) {
80291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
818f23e9faSHans Rosenfeld "menlo_set_mode: Menlo command error. code=%d.\n",
82291a2b48SSukumar Swaminathan rsp_buf->code);
83291a2b48SSukumar Swaminathan }
84291a2b48SSukumar Swaminathan
85291a2b48SSukumar Swaminathan rval = rsp_buf->code;
86291a2b48SSukumar Swaminathan
87291a2b48SSukumar Swaminathan done:
88291a2b48SSukumar Swaminathan
89291a2b48SSukumar Swaminathan if (cmd_buf) {
90291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_set_cmd_t));
91291a2b48SSukumar Swaminathan }
92291a2b48SSukumar Swaminathan
93291a2b48SSukumar Swaminathan if (rsp_buf) {
94291a2b48SSukumar Swaminathan kmem_free(rsp_buf, 4);
95291a2b48SSukumar Swaminathan }
96291a2b48SSukumar Swaminathan
97291a2b48SSukumar Swaminathan return (rval);
98291a2b48SSukumar Swaminathan
9982527734SSukumar Swaminathan } /* emlxs_menlo_set_mode() */
100291a2b48SSukumar Swaminathan
101291a2b48SSukumar Swaminathan
102291a2b48SSukumar Swaminathan static uint32_t
emlxs_menlo_reset(emlxs_hba_t * hba,uint32_t firmware)103291a2b48SSukumar Swaminathan emlxs_menlo_reset(
104291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
105291a2b48SSukumar Swaminathan uint32_t firmware)
106291a2b48SSukumar Swaminathan {
107291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
108291a2b48SSukumar Swaminathan uint32_t cmd_size;
109291a2b48SSukumar Swaminathan uint32_t rsp_size;
110291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL;
111291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf = NULL;
112291a2b48SSukumar Swaminathan uint32_t rval = 0;
113291a2b48SSukumar Swaminathan
114*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
115*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
11682527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
117291a2b48SSukumar Swaminathan }
118291a2b48SSukumar Swaminathan
11982527734SSukumar Swaminathan cmd_size = sizeof (menlo_reset_cmd_t);
12082527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
121291a2b48SSukumar Swaminathan
12282527734SSukumar Swaminathan rsp_size = 4;
12382527734SSukumar Swaminathan rsp_buf = (menlo_rsp_t *)kmem_zalloc(rsp_size, KM_SLEEP);
124291a2b48SSukumar Swaminathan
125291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_RESET;
126291a2b48SSukumar Swaminathan cmd_buf->reset.firmware = firmware;
127291a2b48SSukumar Swaminathan
128291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
129291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
130291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
131291a2b48SSukumar Swaminathan
132291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
133291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) {
134291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
1358f23e9faSHans Rosenfeld "menlo_reset: Unable to send command.");
136291a2b48SSukumar Swaminathan goto done;
137291a2b48SSukumar Swaminathan }
138291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
139291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
140291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
141291a2b48SSukumar Swaminathan
142291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) {
143291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
1448f23e9faSHans Rosenfeld "menlo_reset: Menlo command error. code=%d.\n",
145291a2b48SSukumar Swaminathan rsp_buf->code);
146291a2b48SSukumar Swaminathan }
147291a2b48SSukumar Swaminathan
148291a2b48SSukumar Swaminathan rval = rsp_buf->code;
149291a2b48SSukumar Swaminathan
150291a2b48SSukumar Swaminathan done:
151291a2b48SSukumar Swaminathan
152291a2b48SSukumar Swaminathan if (cmd_buf) {
153291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_reset_cmd_t));
154291a2b48SSukumar Swaminathan }
155291a2b48SSukumar Swaminathan
156291a2b48SSukumar Swaminathan if (rsp_buf) {
157291a2b48SSukumar Swaminathan kmem_free(rsp_buf, 4);
158291a2b48SSukumar Swaminathan }
159291a2b48SSukumar Swaminathan
160291a2b48SSukumar Swaminathan return (rval);
161291a2b48SSukumar Swaminathan
16282527734SSukumar Swaminathan } /* emlxs_menlo_reset() */
163291a2b48SSukumar Swaminathan
164291a2b48SSukumar Swaminathan
165291a2b48SSukumar Swaminathan static uint32_t
emlxs_menlo_get_cfg(emlxs_hba_t * hba,menlo_get_config_rsp_t * rsp_buf,uint32_t rsp_size)166291a2b48SSukumar Swaminathan emlxs_menlo_get_cfg(
167291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
168291a2b48SSukumar Swaminathan menlo_get_config_rsp_t *rsp_buf,
169291a2b48SSukumar Swaminathan uint32_t rsp_size)
170291a2b48SSukumar Swaminathan {
171291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
172291a2b48SSukumar Swaminathan uint32_t cmd_size;
173291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL;
174291a2b48SSukumar Swaminathan uint32_t rval = 0;
175291a2b48SSukumar Swaminathan
176*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
177*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
17882527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
179291a2b48SSukumar Swaminathan }
180291a2b48SSukumar Swaminathan
18182527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t);
18282527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
18382527734SSukumar Swaminathan
184291a2b48SSukumar Swaminathan rsp_size = sizeof (menlo_get_config_rsp_t);
185291a2b48SSukumar Swaminathan
186291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_CONFIG;
187291a2b48SSukumar Swaminathan cmd_buf->get.context = 0;
188291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size;
189291a2b48SSukumar Swaminathan
190291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
191291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
192291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
193291a2b48SSukumar Swaminathan
194291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
195291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) {
196291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
1978f23e9faSHans Rosenfeld "menlo_get_cfg: Unable to send command.");
198291a2b48SSukumar Swaminathan goto done;
199291a2b48SSukumar Swaminathan }
200291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
201291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
202291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
203291a2b48SSukumar Swaminathan
204291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) {
205291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2068f23e9faSHans Rosenfeld "menlo_get_cfg: Menlo command error. code=%d.\n",
207291a2b48SSukumar Swaminathan rsp_buf->code);
208291a2b48SSukumar Swaminathan }
209291a2b48SSukumar Swaminathan
210291a2b48SSukumar Swaminathan rval = rsp_buf->code;
211291a2b48SSukumar Swaminathan
212291a2b48SSukumar Swaminathan done:
213291a2b48SSukumar Swaminathan
214291a2b48SSukumar Swaminathan if (cmd_buf) {
215291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
216291a2b48SSukumar Swaminathan }
217291a2b48SSukumar Swaminathan
218291a2b48SSukumar Swaminathan return (rval);
219291a2b48SSukumar Swaminathan
22082527734SSukumar Swaminathan } /* emlxs_menlo_get_cfg() */
221291a2b48SSukumar Swaminathan
222291a2b48SSukumar Swaminathan
223291a2b48SSukumar Swaminathan
224291a2b48SSukumar Swaminathan static uint32_t
emlxs_menlo_get_logcfg(emlxs_hba_t * hba,menlo_rsp_t * rsp_buf,uint32_t rsp_size)225291a2b48SSukumar Swaminathan emlxs_menlo_get_logcfg(
226291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
227291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf,
228291a2b48SSukumar Swaminathan uint32_t rsp_size)
229291a2b48SSukumar Swaminathan {
230291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
231291a2b48SSukumar Swaminathan uint32_t cmd_size;
232291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL;
233291a2b48SSukumar Swaminathan uint32_t rval = 0;
234291a2b48SSukumar Swaminathan
235*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
236*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
23782527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
238291a2b48SSukumar Swaminathan }
239291a2b48SSukumar Swaminathan
24082527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t);
24182527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
24282527734SSukumar Swaminathan
243291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_LOG_CONFIG;
244291a2b48SSukumar Swaminathan cmd_buf->get.context = 0;
245291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size;
246291a2b48SSukumar Swaminathan
247291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
248291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
249291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
250291a2b48SSukumar Swaminathan
251291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
252291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) {
253291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2548f23e9faSHans Rosenfeld "menlo_get_logcfg: Unable to send command.");
255291a2b48SSukumar Swaminathan goto done;
256291a2b48SSukumar Swaminathan }
257291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
258291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
259291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
260291a2b48SSukumar Swaminathan
261291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) {
262291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2638f23e9faSHans Rosenfeld "menlo_get_logcfg: Menlo command error. code=%d.\n",
264291a2b48SSukumar Swaminathan rsp_buf->code);
265291a2b48SSukumar Swaminathan }
266291a2b48SSukumar Swaminathan
267291a2b48SSukumar Swaminathan rval = rsp_buf->code;
268291a2b48SSukumar Swaminathan
269291a2b48SSukumar Swaminathan done:
270291a2b48SSukumar Swaminathan
271291a2b48SSukumar Swaminathan if (cmd_buf) {
272291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
273291a2b48SSukumar Swaminathan }
274291a2b48SSukumar Swaminathan
275291a2b48SSukumar Swaminathan return (rval);
276291a2b48SSukumar Swaminathan
27782527734SSukumar Swaminathan } /* emlxs_menlo_get_logcfg() */
278291a2b48SSukumar Swaminathan
279291a2b48SSukumar Swaminathan
280291a2b48SSukumar Swaminathan static uint32_t
emlxs_menlo_get_log(emlxs_hba_t * hba,uint32_t id,menlo_rsp_t * rsp_buf,uint32_t rsp_size)281291a2b48SSukumar Swaminathan emlxs_menlo_get_log(
282291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
283291a2b48SSukumar Swaminathan uint32_t id,
284291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf,
285291a2b48SSukumar Swaminathan uint32_t rsp_size)
286291a2b48SSukumar Swaminathan {
287291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
288291a2b48SSukumar Swaminathan uint32_t cmd_size;
289291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL;
290291a2b48SSukumar Swaminathan uint32_t rval = 0;
291291a2b48SSukumar Swaminathan
292*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
293*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
29482527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
295291a2b48SSukumar Swaminathan }
296291a2b48SSukumar Swaminathan
29782527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t);
29882527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
29982527734SSukumar Swaminathan
300291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_LOG_DATA;
301291a2b48SSukumar Swaminathan cmd_buf->get.context = id;
302291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size;
303291a2b48SSukumar Swaminathan
304291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
305291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
306291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
307291a2b48SSukumar Swaminathan
308291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
309291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) {
310291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
3118f23e9faSHans Rosenfeld "menlo_get_log: Unable to send command.");
312291a2b48SSukumar Swaminathan goto done;
313291a2b48SSukumar Swaminathan }
314291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
315291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
316291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
317291a2b48SSukumar Swaminathan
318291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) {
319291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
3208f23e9faSHans Rosenfeld "menlo_get_log: Menlo command error. code=%d.\n",
321291a2b48SSukumar Swaminathan rsp_buf->code);
322291a2b48SSukumar Swaminathan }
323291a2b48SSukumar Swaminathan
324291a2b48SSukumar Swaminathan rval = rsp_buf->code;
325291a2b48SSukumar Swaminathan
326291a2b48SSukumar Swaminathan done:
327291a2b48SSukumar Swaminathan
328291a2b48SSukumar Swaminathan if (cmd_buf) {
329291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
330291a2b48SSukumar Swaminathan }
331291a2b48SSukumar Swaminathan
332291a2b48SSukumar Swaminathan return (rval);
333291a2b48SSukumar Swaminathan
33482527734SSukumar Swaminathan } /* emlxs_menlo_get_log() */
335291a2b48SSukumar Swaminathan
336291a2b48SSukumar Swaminathan
337291a2b48SSukumar Swaminathan static uint32_t
emlxs_menlo_get_paniclog(emlxs_hba_t * hba,menlo_rsp_t * rsp_buf,uint32_t rsp_size)338291a2b48SSukumar Swaminathan emlxs_menlo_get_paniclog(
339291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
340291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf,
341291a2b48SSukumar Swaminathan uint32_t rsp_size)
342291a2b48SSukumar Swaminathan {
343291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
344291a2b48SSukumar Swaminathan uint32_t cmd_size;
345291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL;
346291a2b48SSukumar Swaminathan uint32_t rval = 0;
347291a2b48SSukumar Swaminathan
348*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
349*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
35082527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
351291a2b48SSukumar Swaminathan }
352291a2b48SSukumar Swaminathan
35382527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t);
35482527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
35582527734SSukumar Swaminathan
356291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_PANIC_LOG;
357291a2b48SSukumar Swaminathan cmd_buf->get.context = 0;
358291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size;
359291a2b48SSukumar Swaminathan
360291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
361291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
362291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
363291a2b48SSukumar Swaminathan
364291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
365291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) {
366291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
3678f23e9faSHans Rosenfeld "menlo_get_paniclog: Unable to send command.");
368291a2b48SSukumar Swaminathan goto done;
369291a2b48SSukumar Swaminathan }
370291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
371291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
372291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
373291a2b48SSukumar Swaminathan
374291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) {
375291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
3768f23e9faSHans Rosenfeld "menlo_get_paniclog: Menlo command error. code=%d.\n",
377291a2b48SSukumar Swaminathan rsp_buf->code);
378291a2b48SSukumar Swaminathan }
379291a2b48SSukumar Swaminathan
380291a2b48SSukumar Swaminathan rval = rsp_buf->code;
381291a2b48SSukumar Swaminathan
382291a2b48SSukumar Swaminathan done:
383291a2b48SSukumar Swaminathan
384291a2b48SSukumar Swaminathan if (cmd_buf) {
385291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
386291a2b48SSukumar Swaminathan }
387291a2b48SSukumar Swaminathan
388291a2b48SSukumar Swaminathan return (rval);
389291a2b48SSukumar Swaminathan
39082527734SSukumar Swaminathan } /* emlxs_menlo_get_paniclog() */
391291a2b48SSukumar Swaminathan
392291a2b48SSukumar Swaminathan
393291a2b48SSukumar Swaminathan
394291a2b48SSukumar Swaminathan
39582527734SSukumar Swaminathan extern void
emlxs_fflush(emlxs_file_t * fp)396291a2b48SSukumar Swaminathan emlxs_fflush(
397291a2b48SSukumar Swaminathan emlxs_file_t *fp)
398291a2b48SSukumar Swaminathan {
399291a2b48SSukumar Swaminathan uint32_t offset;
400291a2b48SSukumar Swaminathan
401291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
402291a2b48SSukumar Swaminathan
403291a2b48SSukumar Swaminathan if (offset > fp->size) {
404291a2b48SSukumar Swaminathan fp->ptr = fp->buffer + fp->size;
405291a2b48SSukumar Swaminathan }
406291a2b48SSukumar Swaminathan
407291a2b48SSukumar Swaminathan return;
408291a2b48SSukumar Swaminathan
40982527734SSukumar Swaminathan } /* emlxs_fflush() */
410291a2b48SSukumar Swaminathan
411291a2b48SSukumar Swaminathan
412291a2b48SSukumar Swaminathan extern uint32_t
emlxs_ftell(emlxs_file_t * fp)413291a2b48SSukumar Swaminathan emlxs_ftell(
414291a2b48SSukumar Swaminathan emlxs_file_t *fp)
415291a2b48SSukumar Swaminathan {
416291a2b48SSukumar Swaminathan uint32_t offset;
417291a2b48SSukumar Swaminathan
418291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
419291a2b48SSukumar Swaminathan
420291a2b48SSukumar Swaminathan return (offset);
421291a2b48SSukumar Swaminathan
42282527734SSukumar Swaminathan } /* emlxs_ftell() */
423291a2b48SSukumar Swaminathan
424291a2b48SSukumar Swaminathan
425291a2b48SSukumar Swaminathan static void
emlxs_fputc(uint8_t value,emlxs_file_t * fp)426291a2b48SSukumar Swaminathan emlxs_fputc(
427291a2b48SSukumar Swaminathan uint8_t value,
428291a2b48SSukumar Swaminathan emlxs_file_t *fp)
429291a2b48SSukumar Swaminathan {
430291a2b48SSukumar Swaminathan uint32_t offset;
431291a2b48SSukumar Swaminathan
432291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
433291a2b48SSukumar Swaminathan
434291a2b48SSukumar Swaminathan if ((offset + 1) <= fp->size) {
435291a2b48SSukumar Swaminathan *fp->ptr++ = value;
436291a2b48SSukumar Swaminathan }
437291a2b48SSukumar Swaminathan
438291a2b48SSukumar Swaminathan return;
439291a2b48SSukumar Swaminathan
44082527734SSukumar Swaminathan } /* emlxs_fputc() */
441291a2b48SSukumar Swaminathan
442291a2b48SSukumar Swaminathan
443291a2b48SSukumar Swaminathan static uint32_t
emlxs_fwrite(uint8_t * buffer,uint32_t size,uint32_t nitems,emlxs_file_t * fp)444291a2b48SSukumar Swaminathan emlxs_fwrite(
445291a2b48SSukumar Swaminathan uint8_t *buffer,
446291a2b48SSukumar Swaminathan uint32_t size,
447291a2b48SSukumar Swaminathan uint32_t nitems,
448291a2b48SSukumar Swaminathan emlxs_file_t *fp)
449291a2b48SSukumar Swaminathan {
450291a2b48SSukumar Swaminathan uint32_t offset;
451291a2b48SSukumar Swaminathan uint32_t length;
452291a2b48SSukumar Swaminathan
453291a2b48SSukumar Swaminathan length = size * nitems;
454291a2b48SSukumar Swaminathan
455291a2b48SSukumar Swaminathan if (length) {
456291a2b48SSukumar Swaminathan offset =
457291a2b48SSukumar Swaminathan (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
458291a2b48SSukumar Swaminathan
459291a2b48SSukumar Swaminathan if ((offset + length) > fp->size) {
460291a2b48SSukumar Swaminathan length = fp->size - offset;
461291a2b48SSukumar Swaminathan }
462291a2b48SSukumar Swaminathan
463291a2b48SSukumar Swaminathan if (length) {
464291a2b48SSukumar Swaminathan bcopy(buffer, fp->ptr, length);
465291a2b48SSukumar Swaminathan fp->ptr += length;
466291a2b48SSukumar Swaminathan }
467291a2b48SSukumar Swaminathan }
468291a2b48SSukumar Swaminathan
469291a2b48SSukumar Swaminathan return (length);
470291a2b48SSukumar Swaminathan
47182527734SSukumar Swaminathan } /* emlxs_fwrite() */
472291a2b48SSukumar Swaminathan
473291a2b48SSukumar Swaminathan
474291a2b48SSukumar Swaminathan static uint32_t
emlxs_fprintf(emlxs_file_t * fp,const char * fmt,...)475291a2b48SSukumar Swaminathan emlxs_fprintf(
476291a2b48SSukumar Swaminathan emlxs_file_t *fp,
477291a2b48SSukumar Swaminathan const char *fmt, ...)
478291a2b48SSukumar Swaminathan {
479291a2b48SSukumar Swaminathan va_list valist;
480291a2b48SSukumar Swaminathan char va_str[1024];
481291a2b48SSukumar Swaminathan uint32_t length;
482291a2b48SSukumar Swaminathan
483291a2b48SSukumar Swaminathan va_start(valist, fmt);
4848f23e9faSHans Rosenfeld (void) vsnprintf(va_str, sizeof (va_str), fmt, valist);
485291a2b48SSukumar Swaminathan va_end(valist);
486291a2b48SSukumar Swaminathan
487291a2b48SSukumar Swaminathan length = emlxs_fwrite((uint8_t *)va_str, strlen(va_str), 1, fp);
488291a2b48SSukumar Swaminathan
489291a2b48SSukumar Swaminathan return (length);
490291a2b48SSukumar Swaminathan
49182527734SSukumar Swaminathan } /* emlxs_fprintf() */
492291a2b48SSukumar Swaminathan
493291a2b48SSukumar Swaminathan
49482527734SSukumar Swaminathan extern emlxs_file_t *
emlxs_fopen(emlxs_hba_t * hba,uint32_t file_type)495291a2b48SSukumar Swaminathan emlxs_fopen(
496291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
497291a2b48SSukumar Swaminathan uint32_t file_type)
498291a2b48SSukumar Swaminathan {
499291a2b48SSukumar Swaminathan emlxs_file_t *fp;
500291a2b48SSukumar Swaminathan
501291a2b48SSukumar Swaminathan switch (file_type) {
502291a2b48SSukumar Swaminathan case EMLXS_TXT_FILE:
503291a2b48SSukumar Swaminathan fp = &hba->dump_txtfile;
504291a2b48SSukumar Swaminathan fp->size = EMLXS_TXT_FILE_SIZE;
505291a2b48SSukumar Swaminathan break;
506291a2b48SSukumar Swaminathan
507291a2b48SSukumar Swaminathan case EMLXS_DMP_FILE:
508291a2b48SSukumar Swaminathan fp = &hba->dump_dmpfile;
509291a2b48SSukumar Swaminathan fp->size = EMLXS_DMP_FILE_SIZE;
510291a2b48SSukumar Swaminathan break;
511291a2b48SSukumar Swaminathan
512291a2b48SSukumar Swaminathan case EMLXS_CEE_FILE:
513291a2b48SSukumar Swaminathan fp = &hba->dump_ceefile;
514291a2b48SSukumar Swaminathan fp->size = EMLXS_CEE_FILE_SIZE;
515291a2b48SSukumar Swaminathan break;
516291a2b48SSukumar Swaminathan
517291a2b48SSukumar Swaminathan default:
518291a2b48SSukumar Swaminathan return (NULL);
519291a2b48SSukumar Swaminathan }
520291a2b48SSukumar Swaminathan
521291a2b48SSukumar Swaminathan /* Make sure it is word aligned */
522291a2b48SSukumar Swaminathan fp->size &= 0xFFFFFFFC;
523291a2b48SSukumar Swaminathan
524291a2b48SSukumar Swaminathan if (!fp->buffer) {
52582527734SSukumar Swaminathan fp->buffer =
52682527734SSukumar Swaminathan (uint8_t *)kmem_zalloc(fp->size, KM_SLEEP);
527291a2b48SSukumar Swaminathan
528291a2b48SSukumar Swaminathan } else {
529291a2b48SSukumar Swaminathan bzero(fp->buffer, fp->size);
530291a2b48SSukumar Swaminathan }
531291a2b48SSukumar Swaminathan
532291a2b48SSukumar Swaminathan fp->ptr = fp->buffer;
533291a2b48SSukumar Swaminathan
534291a2b48SSukumar Swaminathan return (fp);
535291a2b48SSukumar Swaminathan
53682527734SSukumar Swaminathan } /* emlxs_fopen() */
537291a2b48SSukumar Swaminathan
538291a2b48SSukumar Swaminathan
53982527734SSukumar Swaminathan extern uint32_t
emlxs_fclose(emlxs_file_t * fp)540291a2b48SSukumar Swaminathan emlxs_fclose(
541291a2b48SSukumar Swaminathan emlxs_file_t *fp)
542291a2b48SSukumar Swaminathan {
543291a2b48SSukumar Swaminathan uint32_t offset;
544291a2b48SSukumar Swaminathan
545291a2b48SSukumar Swaminathan if (fp == NULL) {
546291a2b48SSukumar Swaminathan return (0);
547291a2b48SSukumar Swaminathan }
548291a2b48SSukumar Swaminathan
549291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
550291a2b48SSukumar Swaminathan offset = offset % 4;
551291a2b48SSukumar Swaminathan
552291a2b48SSukumar Swaminathan switch (offset) {
553291a2b48SSukumar Swaminathan case 0:
554291a2b48SSukumar Swaminathan break;
555291a2b48SSukumar Swaminathan
556291a2b48SSukumar Swaminathan case 1:
557291a2b48SSukumar Swaminathan *fp->ptr++ = 0;
558291a2b48SSukumar Swaminathan *fp->ptr++ = 0;
559291a2b48SSukumar Swaminathan *fp->ptr++ = 0;
560291a2b48SSukumar Swaminathan break;
561291a2b48SSukumar Swaminathan
562291a2b48SSukumar Swaminathan case 2:
563291a2b48SSukumar Swaminathan *fp->ptr++ = 0;
564291a2b48SSukumar Swaminathan *fp->ptr++ = 0;
565291a2b48SSukumar Swaminathan break;
566291a2b48SSukumar Swaminathan
567291a2b48SSukumar Swaminathan case 3:
568291a2b48SSukumar Swaminathan *fp->ptr++ = 0;
569291a2b48SSukumar Swaminathan break;
570291a2b48SSukumar Swaminathan }
571291a2b48SSukumar Swaminathan
572291a2b48SSukumar Swaminathan return (0);
573291a2b48SSukumar Swaminathan
57482527734SSukumar Swaminathan } /* emlxs_fclose() */
575291a2b48SSukumar Swaminathan
576291a2b48SSukumar Swaminathan
577291a2b48SSukumar Swaminathan static void
emlxs_fdelete(emlxs_file_t * fp)578291a2b48SSukumar Swaminathan emlxs_fdelete(
579291a2b48SSukumar Swaminathan emlxs_file_t *fp)
580291a2b48SSukumar Swaminathan {
581291a2b48SSukumar Swaminathan if (fp == NULL) {
582291a2b48SSukumar Swaminathan return;
583291a2b48SSukumar Swaminathan }
584291a2b48SSukumar Swaminathan
585291a2b48SSukumar Swaminathan if (fp->buffer && fp->size) {
586291a2b48SSukumar Swaminathan kmem_free(fp->buffer, fp->size);
587291a2b48SSukumar Swaminathan }
588291a2b48SSukumar Swaminathan
589291a2b48SSukumar Swaminathan fp->buffer = NULL;
590291a2b48SSukumar Swaminathan fp->ptr = NULL;
591291a2b48SSukumar Swaminathan fp->size = 0;
592291a2b48SSukumar Swaminathan
593291a2b48SSukumar Swaminathan return;
594291a2b48SSukumar Swaminathan
59582527734SSukumar Swaminathan } /* emlxs_fdelete() */
596291a2b48SSukumar Swaminathan
597291a2b48SSukumar Swaminathan
598291a2b48SSukumar Swaminathan /* This builds a single core buffer for the IOCTL interface */
599291a2b48SSukumar Swaminathan extern uint32_t
emlxs_get_dump(emlxs_hba_t * hba,uint8_t * buffer,uint32_t * buflen)600291a2b48SSukumar Swaminathan emlxs_get_dump(
601291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
602291a2b48SSukumar Swaminathan uint8_t *buffer,
603291a2b48SSukumar Swaminathan uint32_t *buflen)
604291a2b48SSukumar Swaminathan {
605291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
606291a2b48SSukumar Swaminathan int32_t i;
607291a2b48SSukumar Swaminathan int32_t size;
608291a2b48SSukumar Swaminathan int32_t count;
609291a2b48SSukumar Swaminathan uint32_t size_dmp;
610291a2b48SSukumar Swaminathan uint32_t size_txt;
611291a2b48SSukumar Swaminathan uint32_t size_cee;
612291a2b48SSukumar Swaminathan emlxs_file_t *fp_txt;
613291a2b48SSukumar Swaminathan emlxs_file_t *fp_dmp;
614291a2b48SSukumar Swaminathan emlxs_file_t *fp_cee;
615291a2b48SSukumar Swaminathan uint32_t *wptr;
616291a2b48SSukumar Swaminathan uint8_t *bptr;
617291a2b48SSukumar Swaminathan
618291a2b48SSukumar Swaminathan if (!buflen) {
619291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
6208f23e9faSHans Rosenfeld "get_dump: Buffer length = 0");
621291a2b48SSukumar Swaminathan return (1);
622291a2b48SSukumar Swaminathan }
623291a2b48SSukumar Swaminathan
624291a2b48SSukumar Swaminathan fp_txt = &hba->dump_txtfile;
625291a2b48SSukumar Swaminathan fp_dmp = &hba->dump_dmpfile;
626291a2b48SSukumar Swaminathan fp_cee = &hba->dump_ceefile;
627291a2b48SSukumar Swaminathan
628291a2b48SSukumar Swaminathan size_txt = emlxs_ftell(fp_txt);
629291a2b48SSukumar Swaminathan size_dmp = emlxs_ftell(fp_dmp);
630291a2b48SSukumar Swaminathan size_cee = emlxs_ftell(fp_cee);
631291a2b48SSukumar Swaminathan
632291a2b48SSukumar Swaminathan size = 0;
633291a2b48SSukumar Swaminathan count = 0;
634291a2b48SSukumar Swaminathan if (size_txt) {
635291a2b48SSukumar Swaminathan count++;
636291a2b48SSukumar Swaminathan size += size_txt + 8;
637291a2b48SSukumar Swaminathan }
638291a2b48SSukumar Swaminathan if (size_dmp) {
639291a2b48SSukumar Swaminathan count++;
640291a2b48SSukumar Swaminathan size += size_dmp + 8;
641291a2b48SSukumar Swaminathan }
642291a2b48SSukumar Swaminathan if (size_cee) {
643291a2b48SSukumar Swaminathan count++;
644291a2b48SSukumar Swaminathan size += size_cee + 8;
645291a2b48SSukumar Swaminathan }
646291a2b48SSukumar Swaminathan
647291a2b48SSukumar Swaminathan if (size) {
648291a2b48SSukumar Swaminathan size += 4;
649291a2b48SSukumar Swaminathan }
650291a2b48SSukumar Swaminathan
651291a2b48SSukumar Swaminathan if (!buffer) {
652291a2b48SSukumar Swaminathan goto done;
653291a2b48SSukumar Swaminathan }
654291a2b48SSukumar Swaminathan
655291a2b48SSukumar Swaminathan bzero(buffer, *buflen);
656291a2b48SSukumar Swaminathan
657291a2b48SSukumar Swaminathan if (*buflen < size) {
658291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
6598f23e9faSHans Rosenfeld "get_dump: Buffer length too small. %d < %d",
660291a2b48SSukumar Swaminathan *buflen, size);
661291a2b48SSukumar Swaminathan
662291a2b48SSukumar Swaminathan *buflen = 0;
663291a2b48SSukumar Swaminathan return (1);
664291a2b48SSukumar Swaminathan }
665291a2b48SSukumar Swaminathan
666291a2b48SSukumar Swaminathan wptr = (uint32_t *)buffer;
667291a2b48SSukumar Swaminathan wptr[0] = count;
668291a2b48SSukumar Swaminathan i = 1;
669291a2b48SSukumar Swaminathan
670291a2b48SSukumar Swaminathan if (size_txt) {
671291a2b48SSukumar Swaminathan wptr[i++] = EMLXS_TXT_FILE_ID;
672291a2b48SSukumar Swaminathan wptr[i++] = size_txt;
673291a2b48SSukumar Swaminathan }
674291a2b48SSukumar Swaminathan
675291a2b48SSukumar Swaminathan if (size_dmp) {
676291a2b48SSukumar Swaminathan wptr[i++] = EMLXS_DMP_FILE_ID;
677291a2b48SSukumar Swaminathan wptr[i++] = size_dmp;
678291a2b48SSukumar Swaminathan }
679291a2b48SSukumar Swaminathan
680291a2b48SSukumar Swaminathan if (size_cee) {
681a9800bebSGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) ||
682a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) {
68382527734SSukumar Swaminathan wptr[i++] = EMLXS_FAT_FILE_ID;
68482527734SSukumar Swaminathan } else {
68582527734SSukumar Swaminathan wptr[i++] = EMLXS_CEE_FILE_ID;
68682527734SSukumar Swaminathan }
68782527734SSukumar Swaminathan
688291a2b48SSukumar Swaminathan wptr[i++] = size_cee;
689291a2b48SSukumar Swaminathan }
690291a2b48SSukumar Swaminathan
691291a2b48SSukumar Swaminathan bptr = (uint8_t *)&wptr[i];
692291a2b48SSukumar Swaminathan
693291a2b48SSukumar Swaminathan if (size_txt) {
694291a2b48SSukumar Swaminathan bcopy(fp_txt->buffer, bptr, size_txt);
695291a2b48SSukumar Swaminathan bptr += size_txt;
696291a2b48SSukumar Swaminathan }
697291a2b48SSukumar Swaminathan
698291a2b48SSukumar Swaminathan if (size_dmp) {
699291a2b48SSukumar Swaminathan bcopy(fp_dmp->buffer, bptr, size_dmp);
700291a2b48SSukumar Swaminathan bptr += size_dmp;
701291a2b48SSukumar Swaminathan }
702291a2b48SSukumar Swaminathan
703291a2b48SSukumar Swaminathan if (size_cee) {
704291a2b48SSukumar Swaminathan bcopy(fp_cee->buffer, bptr, size_cee);
705291a2b48SSukumar Swaminathan bptr += size_cee;
706291a2b48SSukumar Swaminathan }
707291a2b48SSukumar Swaminathan
708291a2b48SSukumar Swaminathan done:
709291a2b48SSukumar Swaminathan
710291a2b48SSukumar Swaminathan *buflen = size;
711291a2b48SSukumar Swaminathan
712291a2b48SSukumar Swaminathan /* printf("Done. buflen=%d \n", *buflen); */
713291a2b48SSukumar Swaminathan
714291a2b48SSukumar Swaminathan return (0);
715291a2b48SSukumar Swaminathan
71682527734SSukumar Swaminathan } /* emlxs_get_dump() */
717291a2b48SSukumar Swaminathan
718291a2b48SSukumar Swaminathan
719291a2b48SSukumar Swaminathan static uint32_t
emlxs_read_cfg_region(emlxs_hba_t * hba,uint32_t Identifier,uint32_t ByteCount,uint32_t * pRetByteCount,uint8_t * pBuffer)720291a2b48SSukumar Swaminathan emlxs_read_cfg_region(
721291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
722291a2b48SSukumar Swaminathan uint32_t Identifier,
723291a2b48SSukumar Swaminathan uint32_t ByteCount,
724291a2b48SSukumar Swaminathan uint32_t *pRetByteCount,
725291a2b48SSukumar Swaminathan uint8_t *pBuffer)
726291a2b48SSukumar Swaminathan {
727291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
728291a2b48SSukumar Swaminathan MAILBOXQ *mbq;
729291a2b48SSukumar Swaminathan uint32_t ByteCountRem; /* remaining portion of original byte count */
730291a2b48SSukumar Swaminathan uint32_t ByteCountReq; /* requested byte count for a particular dump */
731291a2b48SSukumar Swaminathan uint32_t CopyCount; /* bytes to copy after each successful dump */
732291a2b48SSukumar Swaminathan uint32_t Offset; /* Offset into Config Region, for each dump */
733291a2b48SSukumar Swaminathan uint8_t *pLocalBuf; /* ptr to buffer to receive each dump */
734291a2b48SSukumar Swaminathan
7358f23e9faSHans Rosenfeld if (! ByteCount) {
7368f23e9faSHans Rosenfeld return (0);
7378f23e9faSHans Rosenfeld }
7388f23e9faSHans Rosenfeld
73982527734SSukumar Swaminathan mbq =
74082527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
741291a2b48SSukumar Swaminathan
742291a2b48SSukumar Swaminathan pLocalBuf = pBuffer; /* init local pointer to caller's buffer */
743291a2b48SSukumar Swaminathan Offset = 0; /* start at offset 0 */
744291a2b48SSukumar Swaminathan *pRetByteCount = 0; /* init returned byte count */
745291a2b48SSukumar Swaminathan CopyCount = 0;
746291a2b48SSukumar Swaminathan
747291a2b48SSukumar Swaminathan for (ByteCountRem = ByteCount; ByteCountRem > 0;
748291a2b48SSukumar Swaminathan ByteCountRem -= CopyCount) {
749291a2b48SSukumar Swaminathan
75082527734SSukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
75182527734SSukumar Swaminathan MAILBOX4 *mb = (MAILBOX4 *)mbq;
752291a2b48SSukumar Swaminathan
75382527734SSukumar Swaminathan ByteCountReq =
75482527734SSukumar Swaminathan (ByteCountRem < hba->sli.sli4.dump_region.size) ?
75582527734SSukumar Swaminathan ByteCountRem : hba->sli.sli4.dump_region.size;
756291a2b48SSukumar Swaminathan
75782527734SSukumar Swaminathan /* Clear the local dump_region */
75882527734SSukumar Swaminathan bzero(hba->sli.sli4.dump_region.virt,
75982527734SSukumar Swaminathan hba->sli.sli4.dump_region.size);
760291a2b48SSukumar Swaminathan
76182527734SSukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
762291a2b48SSukumar Swaminathan
76382527734SSukumar Swaminathan mb->mbxCommand = MBX_DUMP_MEMORY;
76482527734SSukumar Swaminathan mb->un.varDmp4.type = DMP_NV_PARAMS;
76582527734SSukumar Swaminathan mb->un.varDmp4.entry_index = Offset;
76682527734SSukumar Swaminathan mb->un.varDmp4.region_id = Identifier;
767291a2b48SSukumar Swaminathan
76882527734SSukumar Swaminathan mb->un.varDmp4.available_cnt = ByteCountReq;
76982527734SSukumar Swaminathan mb->un.varDmp4.addrHigh =
77082527734SSukumar Swaminathan PADDR_HI(hba->sli.sli4.dump_region.phys);
77182527734SSukumar Swaminathan mb->un.varDmp4.addrLow =
77282527734SSukumar Swaminathan PADDR_LO(hba->sli.sli4.dump_region.phys);
77382527734SSukumar Swaminathan mb->un.varDmp4.rsp_cnt = 0;
774291a2b48SSukumar Swaminathan
77582527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST;
77682527734SSukumar Swaminathan mbq->mbox_cmpl = NULL;
777291a2b48SSukumar Swaminathan
77882527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
77982527734SSukumar Swaminathan MBX_SUCCESS) {
78082527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
78182527734SSukumar Swaminathan "Unable to read config region. id=%x "\
78282527734SSukumar Swaminathan "offset=%x status=%x",
78382527734SSukumar Swaminathan Identifier, Offset, mb->mbxStatus);
78482527734SSukumar Swaminathan
78582527734SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
78682527734SSukumar Swaminathan return (1);
78782527734SSukumar Swaminathan }
78882527734SSukumar Swaminathan
78982527734SSukumar Swaminathan CopyCount = mb->un.varDmp4.rsp_cnt;
79082527734SSukumar Swaminathan
79182527734SSukumar Swaminathan /* if no more data returned */
79282527734SSukumar Swaminathan if (CopyCount == 0) {
79382527734SSukumar Swaminathan break;
79482527734SSukumar Swaminathan }
79582527734SSukumar Swaminathan
79682527734SSukumar Swaminathan if (CopyCount > ByteCountReq) {
79782527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
7988f23e9faSHans Rosenfeld "read_cfg_region: " \
79982527734SSukumar Swaminathan "Byte count too big. %d > %d\n",
80082527734SSukumar Swaminathan CopyCount, ByteCountReq);
80182527734SSukumar Swaminathan
80282527734SSukumar Swaminathan CopyCount = ByteCountReq;
80382527734SSukumar Swaminathan }
80482527734SSukumar Swaminathan
80582527734SSukumar Swaminathan bcopy((uint8_t *)hba->sli.sli4.dump_region.virt,
80682527734SSukumar Swaminathan pLocalBuf, CopyCount);
80782527734SSukumar Swaminathan
80882527734SSukumar Swaminathan } else {
80982527734SSukumar Swaminathan MAILBOX *mb = (MAILBOX *)mbq;
81082527734SSukumar Swaminathan
81182527734SSukumar Swaminathan ByteCountReq =
81282527734SSukumar Swaminathan (ByteCountRem < DUMP_BC_MAX) ? ByteCountRem :
81382527734SSukumar Swaminathan DUMP_BC_MAX;
81482527734SSukumar Swaminathan
81582527734SSukumar Swaminathan bzero((void *)mb, MAILBOX_CMD_BSIZE);
81682527734SSukumar Swaminathan
81782527734SSukumar Swaminathan mb->mbxCommand = MBX_DUMP_MEMORY;
81882527734SSukumar Swaminathan mb->un.varDmp.type = DMP_NV_PARAMS;
81982527734SSukumar Swaminathan mb->un.varDmp.cv = 1;
82082527734SSukumar Swaminathan mb->un.varDmp.region_id = Identifier;
82182527734SSukumar Swaminathan mb->un.varDmp.entry_index = Offset;
82282527734SSukumar Swaminathan mb->un.varDmp.word_cnt = ByteCountReq / 4;
82382527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST;
82482527734SSukumar Swaminathan mbq->mbox_cmpl = NULL;
82582527734SSukumar Swaminathan
82682527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
82782527734SSukumar Swaminathan MBX_SUCCESS) {
82882527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
82982527734SSukumar Swaminathan "Unable to read config region. id=%x "\
83082527734SSukumar Swaminathan "offset=%x status=%x",
83182527734SSukumar Swaminathan Identifier, Offset, mb->mbxStatus);
83282527734SSukumar Swaminathan
83382527734SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
83482527734SSukumar Swaminathan return (1);
83582527734SSukumar Swaminathan }
83682527734SSukumar Swaminathan
83782527734SSukumar Swaminathan /* Note: for Type 2/3 Dumps, varDmp.word_cnt is */
83882527734SSukumar Swaminathan /* actually a byte count. */
83982527734SSukumar Swaminathan CopyCount = mb->un.varDmp.word_cnt;
84082527734SSukumar Swaminathan
84182527734SSukumar Swaminathan /* if no more data returned */
84282527734SSukumar Swaminathan if (CopyCount == 0) {
84382527734SSukumar Swaminathan break;
84482527734SSukumar Swaminathan }
84582527734SSukumar Swaminathan
84682527734SSukumar Swaminathan if (CopyCount > ByteCountReq) {
84782527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8488f23e9faSHans Rosenfeld "read_cfg_region: " \
84982527734SSukumar Swaminathan "Byte count too big. %d > %d\n",
85082527734SSukumar Swaminathan CopyCount, ByteCountReq);
85182527734SSukumar Swaminathan
85282527734SSukumar Swaminathan CopyCount = ByteCountReq;
85382527734SSukumar Swaminathan }
854291a2b48SSukumar Swaminathan
85582527734SSukumar Swaminathan bcopy((uint8_t *)&mb->un.varDmp.resp_offset, pLocalBuf,
85682527734SSukumar Swaminathan CopyCount);
85782527734SSukumar Swaminathan }
858291a2b48SSukumar Swaminathan
859291a2b48SSukumar Swaminathan pLocalBuf += CopyCount;
860291a2b48SSukumar Swaminathan Offset += CopyCount;
861291a2b48SSukumar Swaminathan *pRetByteCount += CopyCount;
862291a2b48SSukumar Swaminathan }
863291a2b48SSukumar Swaminathan
864291a2b48SSukumar Swaminathan return (0);
865291a2b48SSukumar Swaminathan
86682527734SSukumar Swaminathan } /* emlxs_read_cfg_region() */
867291a2b48SSukumar Swaminathan
868291a2b48SSukumar Swaminathan
869291a2b48SSukumar Swaminathan
870291a2b48SSukumar Swaminathan /* ************************************************************************* */
871291a2b48SSukumar Swaminathan /* ************************************************************************* */
872291a2b48SSukumar Swaminathan /* Dump Generators, Low-Level */
873291a2b48SSukumar Swaminathan /* ************************************************************************* */
874291a2b48SSukumar Swaminathan /* ************************************************************************* */
875291a2b48SSukumar Swaminathan
876291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_string_txtfile(emlxs_file_t * fpTxtFile,char * pString,char * pSidLegend,char * pLidLegend,uint32_t pure)877291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(
878291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
879291a2b48SSukumar Swaminathan char *pString,
880291a2b48SSukumar Swaminathan char *pSidLegend,
881291a2b48SSukumar Swaminathan char *pLidLegend,
882291a2b48SSukumar Swaminathan uint32_t pure)
883291a2b48SSukumar Swaminathan {
884291a2b48SSukumar Swaminathan
885291a2b48SSukumar Swaminathan if (!fpTxtFile) {
886291a2b48SSukumar Swaminathan return (1);
887291a2b48SSukumar Swaminathan }
888291a2b48SSukumar Swaminathan
889291a2b48SSukumar Swaminathan if (pSidLegend && pLidLegend) {
890291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "%s: %s\n", pSidLegend,
891291a2b48SSukumar Swaminathan pLidLegend);
892291a2b48SSukumar Swaminathan
893291a2b48SSukumar Swaminathan if (pure == 0) {
894291a2b48SSukumar Swaminathan emlxs_fputc(' ', fpTxtFile);
895291a2b48SSukumar Swaminathan }
896291a2b48SSukumar Swaminathan
897291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1,
898291a2b48SSukumar Swaminathan fpTxtFile);
899291a2b48SSukumar Swaminathan
900291a2b48SSukumar Swaminathan if (pure == 0) {
901291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile);
902291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile);
903291a2b48SSukumar Swaminathan }
904291a2b48SSukumar Swaminathan } else {
905291a2b48SSukumar Swaminathan if (pure == 0) {
906291a2b48SSukumar Swaminathan emlxs_fputc(' ', fpTxtFile);
907291a2b48SSukumar Swaminathan }
908291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1,
909291a2b48SSukumar Swaminathan fpTxtFile);
910291a2b48SSukumar Swaminathan }
911291a2b48SSukumar Swaminathan
912291a2b48SSukumar Swaminathan emlxs_fflush(fpTxtFile);
913291a2b48SSukumar Swaminathan
914291a2b48SSukumar Swaminathan return (0);
915291a2b48SSukumar Swaminathan
91682527734SSukumar Swaminathan } /* emlxs_dump_string_txtfile() */
917291a2b48SSukumar Swaminathan
918291a2b48SSukumar Swaminathan
919291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_word_txtfile(emlxs_file_t * fpTxtFile,uint32_t * pBuffer,uint32_t WordCount,char * pSidLegend,char * pLidLegend)920291a2b48SSukumar Swaminathan emlxs_dump_word_txtfile(
921291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
922291a2b48SSukumar Swaminathan uint32_t *pBuffer,
923291a2b48SSukumar Swaminathan uint32_t WordCount,
924291a2b48SSukumar Swaminathan char *pSidLegend,
925291a2b48SSukumar Swaminathan char *pLidLegend)
926291a2b48SSukumar Swaminathan {
927291a2b48SSukumar Swaminathan char buf1[256];
928291a2b48SSukumar Swaminathan char buf2[256];
929291a2b48SSukumar Swaminathan uint32_t *ptr;
930291a2b48SSukumar Swaminathan uint32_t j;
931291a2b48SSukumar Swaminathan
932291a2b48SSukumar Swaminathan if (!fpTxtFile) {
933291a2b48SSukumar Swaminathan return (1);
934291a2b48SSukumar Swaminathan }
935291a2b48SSukumar Swaminathan
936291a2b48SSukumar Swaminathan /* Write Legend String to the TXT File */
937291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "%s: %s\n", pSidLegend, pLidLegend);
938291a2b48SSukumar Swaminathan
939291a2b48SSukumar Swaminathan /* Write the buffer to the TXT File */
940291a2b48SSukumar Swaminathan ptr = pBuffer;
941291a2b48SSukumar Swaminathan
942291a2b48SSukumar Swaminathan for (j = 0; j < WordCount; j++) {
943291a2b48SSukumar Swaminathan buf1[0] = 0;
944291a2b48SSukumar Swaminathan buf2[0] = 0;
945291a2b48SSukumar Swaminathan
946291a2b48SSukumar Swaminathan if ((j & 0x03) == 0) {
9478f23e9faSHans Rosenfeld (void) snprintf(buf1, sizeof (buf1), "\n%04x:", j * 4);
9488f23e9faSHans Rosenfeld (void) strlcat(buf2, buf1, sizeof (buf2));
949291a2b48SSukumar Swaminathan }
9508f23e9faSHans Rosenfeld /* print 1 word */
9518f23e9faSHans Rosenfeld (void) snprintf(buf1, sizeof (buf1), " %08x", ptr[j]);
9528f23e9faSHans Rosenfeld (void) strlcat(buf2, buf1, sizeof (buf2));
953291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)buf2, strlen(buf2), 1,
954291a2b48SSukumar Swaminathan fpTxtFile);
955291a2b48SSukumar Swaminathan }
956291a2b48SSukumar Swaminathan
957291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile);
958291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile);
959291a2b48SSukumar Swaminathan emlxs_fflush(fpTxtFile);
960291a2b48SSukumar Swaminathan return (0);
961291a2b48SSukumar Swaminathan
96282527734SSukumar Swaminathan } /* emlxs_dump_word_txtfile() */
963291a2b48SSukumar Swaminathan
964291a2b48SSukumar Swaminathan
965291a2b48SSukumar Swaminathan
966291a2b48SSukumar Swaminathan
967291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_string_dmpfile(emlxs_file_t * fpDmpFile,char * pString,uint8_t sid,char * pSidLegend,char * pLidLegend)968291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(
969291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
970291a2b48SSukumar Swaminathan char *pString,
971291a2b48SSukumar Swaminathan uint8_t sid,
972291a2b48SSukumar Swaminathan char *pSidLegend,
973291a2b48SSukumar Swaminathan char *pLidLegend)
974291a2b48SSukumar Swaminathan {
975291a2b48SSukumar Swaminathan uint32_t length;
976291a2b48SSukumar Swaminathan uint8_t byte;
977291a2b48SSukumar Swaminathan uint32_t pos;
978291a2b48SSukumar Swaminathan
979291a2b48SSukumar Swaminathan if (!fpDmpFile) {
980291a2b48SSukumar Swaminathan return (1);
981291a2b48SSukumar Swaminathan }
982291a2b48SSukumar Swaminathan
983291a2b48SSukumar Swaminathan /* Write Legend SID to the DMP File */
984291a2b48SSukumar Swaminathan emlxs_fputc(SID_LEGEND, fpDmpFile);
985291a2b48SSukumar Swaminathan
986291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
987291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile);
988291a2b48SSukumar Swaminathan
989291a2b48SSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */
990291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend);
991291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
992291a2b48SSukumar Swaminathan
993291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
994291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile);
995291a2b48SSukumar Swaminathan
996291a2b48SSukumar Swaminathan /* Write Buffer Length to the DMP File */
997291a2b48SSukumar Swaminathan length = (uint32_t)(strlen(pString) + 1);
998291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
999291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF);
1000291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1001291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
1002291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1003291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
1004291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
100582527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
100682527734SSukumar Swaminathan
100782527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
1008291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
1009291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1010291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
1011291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1012291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF);
1013291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
101482527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
1015291a2b48SSukumar Swaminathan
1016291a2b48SSukumar Swaminathan /* Write Argument String to the DMP File, including a Null Byte */
1017291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1, fpDmpFile);
1018291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1019291a2b48SSukumar Swaminathan
1020291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1021291a2b48SSukumar Swaminathan
1022291a2b48SSukumar Swaminathan #if CC_DUMP_ENABLE_PAD
1023291a2b48SSukumar Swaminathan /* check file size.. pad as necessary */
1024291a2b48SSukumar Swaminathan pos = emlxs_ftell(fpDmpFile);
1025291a2b48SSukumar Swaminathan switch (pos & 0x03) {
1026291a2b48SSukumar Swaminathan case 0:
1027291a2b48SSukumar Swaminathan break;
1028291a2b48SSukumar Swaminathan case 1:
1029291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1030291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1031291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1032291a2b48SSukumar Swaminathan break;
1033291a2b48SSukumar Swaminathan case 2:
1034291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1035291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1036291a2b48SSukumar Swaminathan break;
1037291a2b48SSukumar Swaminathan case 3:
1038291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1039291a2b48SSukumar Swaminathan break;
1040291a2b48SSukumar Swaminathan }
1041291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1042291a2b48SSukumar Swaminathan #endif
1043291a2b48SSukumar Swaminathan
1044291a2b48SSukumar Swaminathan return (0);
1045291a2b48SSukumar Swaminathan
104682527734SSukumar Swaminathan } /* emlxs_dump_string_dmpfile() */
1047291a2b48SSukumar Swaminathan
1048291a2b48SSukumar Swaminathan
1049291a2b48SSukumar Swaminathan /* ************************************************************************** */
1050291a2b48SSukumar Swaminathan /* emlxs_dump_word_dmpfile */
1051291a2b48SSukumar Swaminathan /* If little endian, just write the buffer normally. */
1052291a2b48SSukumar Swaminathan /* However, if Big Endian... Consider the following: */
1053291a2b48SSukumar Swaminathan /* Automatic Dump, initiated by driver, Port Offline (FW WarmStart Mode), */
1054291a2b48SSukumar Swaminathan /* Mailbox in SLIM. */
1055291a2b48SSukumar Swaminathan /* On-Demand Dump, initiated by utility, Port Online (FW Normal Mode), */
1056291a2b48SSukumar Swaminathan /* Mailbox in Host Memory. */
1057291a2b48SSukumar Swaminathan /* We use the same IOCTL to get the DUMP Data, for both cases. */
1058291a2b48SSukumar Swaminathan /* However, it normalizes the data before delivering it to us. */
1059291a2b48SSukumar Swaminathan /* In the Dump File, we must always write the data in native mode. */
1060291a2b48SSukumar Swaminathan /* So, if Big Endian, On-demand Dump, we must swap the words. */
1061291a2b48SSukumar Swaminathan /* ************************************************************************* */
1062291a2b48SSukumar Swaminathan /*ARGSUSED*/
106382527734SSukumar Swaminathan extern uint32_t
emlxs_dump_word_dmpfile(emlxs_file_t * fpDmpFile,uint8_t * pBuffer,uint32_t bufferLen,int fSwap)1064291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(
1065291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
1066291a2b48SSukumar Swaminathan uint8_t *pBuffer,
1067291a2b48SSukumar Swaminathan uint32_t bufferLen,
1068291a2b48SSukumar Swaminathan int fSwap)
1069291a2b48SSukumar Swaminathan {
1070291a2b48SSukumar Swaminathan uint32_t i;
1071291a2b48SSukumar Swaminathan uint32_t *wptr;
1072291a2b48SSukumar Swaminathan
1073291a2b48SSukumar Swaminathan if (!fpDmpFile) {
1074291a2b48SSukumar Swaminathan return (1);
1075291a2b48SSukumar Swaminathan }
1076291a2b48SSukumar Swaminathan
1077291a2b48SSukumar Swaminathan wptr = (uint32_t *)pBuffer;
1078291a2b48SSukumar Swaminathan for (i = 0; i < bufferLen / 4; i++, wptr++) {
1079291a2b48SSukumar Swaminathan if (fSwap) {
1080291a2b48SSukumar Swaminathan uint32_t w1;
1081291a2b48SSukumar Swaminathan w1 = *wptr;
108282527734SSukumar Swaminathan *wptr = BE_SWAP32(w1);
1083291a2b48SSukumar Swaminathan }
1084291a2b48SSukumar Swaminathan
1085291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)wptr, 4, 1, fpDmpFile);
1086291a2b48SSukumar Swaminathan }
1087291a2b48SSukumar Swaminathan
1088291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1089291a2b48SSukumar Swaminathan
1090291a2b48SSukumar Swaminathan return (0);
1091291a2b48SSukumar Swaminathan
109282527734SSukumar Swaminathan } /* emlxs_dump_word_dmpfile() */
1093291a2b48SSukumar Swaminathan
1094291a2b48SSukumar Swaminathan
1095291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_port_block(emlxs_file_t * fpDmpFile,uint8_t * pBuffer,uint32_t bufferLen,DUMP_TABLE_ENTRY entry,int fSwap)1096291a2b48SSukumar Swaminathan emlxs_dump_port_block(
1097291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
1098291a2b48SSukumar Swaminathan uint8_t *pBuffer,
1099291a2b48SSukumar Swaminathan uint32_t bufferLen,
1100291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry,
1101291a2b48SSukumar Swaminathan int fSwap)
1102291a2b48SSukumar Swaminathan {
1103291a2b48SSukumar Swaminathan uint32_t status;
1104291a2b48SSukumar Swaminathan uint32_t w;
1105291a2b48SSukumar Swaminathan uint8_t b;
1106291a2b48SSukumar Swaminathan
1107291a2b48SSukumar Swaminathan if (!fpDmpFile) {
1108291a2b48SSukumar Swaminathan return (1);
1109291a2b48SSukumar Swaminathan }
1110291a2b48SSukumar Swaminathan
1111291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
1112291a2b48SSukumar Swaminathan b = (uint8_t)entry.un.PortBlock.un.s.sid;
1113291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1114291a2b48SSukumar Swaminathan
1115291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
1116291a2b48SSukumar Swaminathan /* Write Buffer Length to the DMP File */
111782527734SSukumar Swaminathan w = entry.un.PortBlock.un.s.bc;
1118291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1119291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1120291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1121291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1122291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16);
1123291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1124291a2b48SSukumar Swaminathan
1125291a2b48SSukumar Swaminathan /* Write address to the DMP File */
1126291a2b48SSukumar Swaminathan w = entry.un.PortBlock.un.s.addr;
1127291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1128291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1129291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1130291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1131291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16);
1132291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1133291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24);
1134291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
113582527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
113682527734SSukumar Swaminathan
113782527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
113882527734SSukumar Swaminathan /* Write Buffer Length to the DMP File */
113982527734SSukumar Swaminathan w = entry.un.PortBlock.un.s.bc;
114082527734SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16);
114182527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
114282527734SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
114382527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
114482527734SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
114582527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
114682527734SSukumar Swaminathan
114782527734SSukumar Swaminathan /* Write address to the DMP File */
114882527734SSukumar Swaminathan w = entry.un.PortBlock.un.s.addr;
1149291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24);
1150291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1151291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16);
1152291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1153291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1154291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1155291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1156291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
115782527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
1158291a2b48SSukumar Swaminathan
1159291a2b48SSukumar Swaminathan status =
1160291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
1161291a2b48SSukumar Swaminathan
1162291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1163291a2b48SSukumar Swaminathan
1164291a2b48SSukumar Swaminathan return (status);
1165291a2b48SSukumar Swaminathan
116682527734SSukumar Swaminathan } /* emlxs_dump_port_block() */
1167291a2b48SSukumar Swaminathan
1168291a2b48SSukumar Swaminathan
1169291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_port_struct(emlxs_file_t * fpDmpFile,uint8_t * pBuffer,uint32_t bufferLen,DUMP_TABLE_ENTRY entry,int fSwap)1170291a2b48SSukumar Swaminathan emlxs_dump_port_struct(
1171291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
1172291a2b48SSukumar Swaminathan uint8_t *pBuffer,
1173291a2b48SSukumar Swaminathan uint32_t bufferLen,
1174291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry,
1175291a2b48SSukumar Swaminathan int fSwap)
1176291a2b48SSukumar Swaminathan {
1177291a2b48SSukumar Swaminathan uint32_t status;
1178291a2b48SSukumar Swaminathan uint32_t w;
1179291a2b48SSukumar Swaminathan uint8_t b;
1180291a2b48SSukumar Swaminathan
1181291a2b48SSukumar Swaminathan if (!fpDmpFile) {
1182291a2b48SSukumar Swaminathan return (1);
1183291a2b48SSukumar Swaminathan }
1184291a2b48SSukumar Swaminathan
1185291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
1186291a2b48SSukumar Swaminathan b = (uint8_t)entry.un.PortStruct.un.s.sid;
1187291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1188291a2b48SSukumar Swaminathan
1189291a2b48SSukumar Swaminathan /* Write Element Length to the DMP File */
1190291a2b48SSukumar Swaminathan b = (uint8_t)entry.un.PortStruct.un.s.length;
1191291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1192291a2b48SSukumar Swaminathan
119382527734SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
1194291a2b48SSukumar Swaminathan /* Write Element Count to the DMP File */
1195291a2b48SSukumar Swaminathan w = entry.un.PortStruct.un.s.count;
1196291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1197291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1198291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1199291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1200291a2b48SSukumar Swaminathan
1201291a2b48SSukumar Swaminathan /* Write Address to the DMP File */
1202291a2b48SSukumar Swaminathan w = entry.un.PortStruct.un.s.addr;
1203291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1204291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1205291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1206291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1207291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16);
1208291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1209291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24);
1210291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
121182527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
121282527734SSukumar Swaminathan
121382527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
121482527734SSukumar Swaminathan /* Write Element Count to the DMP File */
121582527734SSukumar Swaminathan w = entry.un.PortStruct.un.s.count;
121682527734SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
121782527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
121882527734SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
121982527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
122082527734SSukumar Swaminathan
122182527734SSukumar Swaminathan /* Write Address to the DMP File */
122282527734SSukumar Swaminathan w = entry.un.PortStruct.un.s.addr;
1223291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24);
1224291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1225291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16);
1226291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1227291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1228291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1229291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1230291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
123182527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
1232291a2b48SSukumar Swaminathan
1233291a2b48SSukumar Swaminathan status =
1234291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
1235291a2b48SSukumar Swaminathan
1236291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1237291a2b48SSukumar Swaminathan
1238291a2b48SSukumar Swaminathan return (status);
1239291a2b48SSukumar Swaminathan
124082527734SSukumar Swaminathan } /* emlxs_dump_port_struct() */
1241291a2b48SSukumar Swaminathan
1242291a2b48SSukumar Swaminathan
1243291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_host_block(emlxs_file_t * fpDmpFile,uint8_t * pBuffer,uint32_t bufferLen,uint8_t sid,char * pSidLegend,char * pLidLegend,int fSwap)1244291a2b48SSukumar Swaminathan emlxs_dump_host_block(
1245291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
1246291a2b48SSukumar Swaminathan uint8_t *pBuffer,
1247291a2b48SSukumar Swaminathan uint32_t bufferLen,
1248291a2b48SSukumar Swaminathan uint8_t sid,
1249291a2b48SSukumar Swaminathan char *pSidLegend,
1250291a2b48SSukumar Swaminathan char *pLidLegend,
1251291a2b48SSukumar Swaminathan int fSwap)
1252291a2b48SSukumar Swaminathan {
1253291a2b48SSukumar Swaminathan uint32_t status;
1254291a2b48SSukumar Swaminathan uint32_t length;
1255291a2b48SSukumar Swaminathan uint8_t byte;
1256291a2b48SSukumar Swaminathan
1257291a2b48SSukumar Swaminathan if (!fpDmpFile) {
1258291a2b48SSukumar Swaminathan return (1);
1259291a2b48SSukumar Swaminathan }
1260291a2b48SSukumar Swaminathan
1261291a2b48SSukumar Swaminathan /* Write Legend SID to the DMP File */
1262291a2b48SSukumar Swaminathan emlxs_fputc(SID_LEGEND, fpDmpFile);
1263291a2b48SSukumar Swaminathan
1264291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
1265291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile);
1266291a2b48SSukumar Swaminathan
1267291a2b48SSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */
1268291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend);
1269291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1270291a2b48SSukumar Swaminathan
1271291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
1272291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile);
1273291a2b48SSukumar Swaminathan
1274291a2b48SSukumar Swaminathan /* Write Buffer Length to the DMP File */
1275291a2b48SSukumar Swaminathan length = bufferLen;
1276291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
1277291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF);
1278291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1279291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
1280291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1281291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
1282291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
128382527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
128482527734SSukumar Swaminathan
128582527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
1286291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
1287291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1288291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
1289291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
1290291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF);
1291291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile);
129282527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
1293291a2b48SSukumar Swaminathan
1294291a2b48SSukumar Swaminathan status =
1295291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
1296291a2b48SSukumar Swaminathan
1297291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1298291a2b48SSukumar Swaminathan
1299291a2b48SSukumar Swaminathan return (status);
1300291a2b48SSukumar Swaminathan
130182527734SSukumar Swaminathan } /* emlxs_dump_host_block() */
1302291a2b48SSukumar Swaminathan
1303291a2b48SSukumar Swaminathan
1304291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_host_struct(emlxs_file_t * fpDmpFile,uint8_t * pBuffer,uint32_t bufferLen,uint32_t elementLength,uint32_t elementCount,uint8_t sid,char * pSidLegend,char * pLidLegend,int fSwap)1305291a2b48SSukumar Swaminathan emlxs_dump_host_struct(
1306291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
1307291a2b48SSukumar Swaminathan uint8_t *pBuffer,
1308291a2b48SSukumar Swaminathan uint32_t bufferLen,
1309291a2b48SSukumar Swaminathan uint32_t elementLength,
1310291a2b48SSukumar Swaminathan uint32_t elementCount,
1311291a2b48SSukumar Swaminathan uint8_t sid,
1312291a2b48SSukumar Swaminathan char *pSidLegend,
1313291a2b48SSukumar Swaminathan char *pLidLegend,
1314291a2b48SSukumar Swaminathan int fSwap)
1315291a2b48SSukumar Swaminathan {
1316291a2b48SSukumar Swaminathan uint32_t status;
1317291a2b48SSukumar Swaminathan uint32_t w;
1318291a2b48SSukumar Swaminathan uint8_t b;
1319291a2b48SSukumar Swaminathan
1320291a2b48SSukumar Swaminathan if (!fpDmpFile) {
1321291a2b48SSukumar Swaminathan return (1);
1322291a2b48SSukumar Swaminathan }
1323291a2b48SSukumar Swaminathan
1324291a2b48SSukumar Swaminathan /* Write Legend SID to the DMP File */
1325291a2b48SSukumar Swaminathan emlxs_fputc(SID_LEGEND, fpDmpFile);
1326291a2b48SSukumar Swaminathan
1327291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
1328291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile);
1329291a2b48SSukumar Swaminathan
1330291a2b48SSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */
1331291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend);
1332291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile);
1333291a2b48SSukumar Swaminathan
1334291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */
1335291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile);
1336291a2b48SSukumar Swaminathan
1337291a2b48SSukumar Swaminathan /* Write Element Length to the DMP File */
1338291a2b48SSukumar Swaminathan b = (uint8_t)elementLength;
1339291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1340291a2b48SSukumar Swaminathan
1341291a2b48SSukumar Swaminathan /* Write Element Count to the DMP File */
1342291a2b48SSukumar Swaminathan w = elementCount;
1343291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
1344291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1345291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1346291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1347291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
134882527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
134982527734SSukumar Swaminathan
135082527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
1351291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8);
1352291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
1353291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF);
1354291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile);
135582527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
1356291a2b48SSukumar Swaminathan
1357291a2b48SSukumar Swaminathan status =
1358291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
1359291a2b48SSukumar Swaminathan
1360291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
1361291a2b48SSukumar Swaminathan
1362291a2b48SSukumar Swaminathan return (status);
1363291a2b48SSukumar Swaminathan
136482527734SSukumar Swaminathan } /* emlxs_dump_host_struct() */
1365291a2b48SSukumar Swaminathan
1366291a2b48SSukumar Swaminathan
1367291a2b48SSukumar Swaminathan /* ************************************************************************* */
1368291a2b48SSukumar Swaminathan /* ************************************************************************* */
1369291a2b48SSukumar Swaminathan /* Dump Generators, Mid-Level */
1370291a2b48SSukumar Swaminathan /* ************************************************************************* */
1371291a2b48SSukumar Swaminathan /* ************************************************************************* */
1372291a2b48SSukumar Swaminathan
1373291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_parm_table(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1374291a2b48SSukumar Swaminathan emlxs_dump_parm_table(
1375291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1376291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1377291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1378291a2b48SSukumar Swaminathan {
1379291a2b48SSukumar Swaminathan emlxs_config_t *cfg = &CFG;
1380291a2b48SSukumar Swaminathan uint32_t status;
1381291a2b48SSukumar Swaminathan uint32_t i;
1382291a2b48SSukumar Swaminathan
1383291a2b48SSukumar Swaminathan /* vars used to build the Dump String */
1384291a2b48SSukumar Swaminathan char *buf1;
1385291a2b48SSukumar Swaminathan char *buf2;
1386291a2b48SSukumar Swaminathan
1387291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(8192, KM_SLEEP);
1388291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(8192, KM_SLEEP);
1389291a2b48SSukumar Swaminathan
1390291a2b48SSukumar Swaminathan /* Driver Parameters Heading */
13918f23e9faSHans Rosenfeld (void) snprintf(buf1, 8192,
1392291a2b48SSukumar Swaminathan "IDX string Low "\
1393291a2b48SSukumar Swaminathan "High Def Cur Exp Dyn");
1394291a2b48SSukumar Swaminathan
1395291a2b48SSukumar Swaminathan /* Build the buffer containing all the Driver Params */
1396291a2b48SSukumar Swaminathan for (i = 0; i < NUM_CFG_PARAM; i++) {
13978f23e9faSHans Rosenfeld (void) snprintf(buf2, 8192,
1398291a2b48SSukumar Swaminathan "\n %02x: %25s %8x %8x %8x %8x %4x %4x", i,
1399291a2b48SSukumar Swaminathan cfg[i].string, cfg[i].low, cfg[i].hi, cfg[i].def,
1400291a2b48SSukumar Swaminathan cfg[i].current, (cfg[i].flags & PARM_HIDDEN) ? 0 : 1,
1401291a2b48SSukumar Swaminathan (cfg[i].flags & PARM_DYNAMIC) ? 1 : 0);
1402291a2b48SSukumar Swaminathan
14038f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, 8192);
1404291a2b48SSukumar Swaminathan }
1405291a2b48SSukumar Swaminathan
1406291a2b48SSukumar Swaminathan status =
1407291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_DP_TABLE,
1408291a2b48SSukumar Swaminathan LEGEND_NULL, 0);
1409291a2b48SSukumar Swaminathan
1410291a2b48SSukumar Swaminathan status =
1411291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_DP_TABLE,
1412291a2b48SSukumar Swaminathan LEGEND_DP_TABLE, LEGEND_NULL);
1413291a2b48SSukumar Swaminathan
1414291a2b48SSukumar Swaminathan kmem_free(buf1, 8192);
1415291a2b48SSukumar Swaminathan kmem_free(buf2, 8192);
1416291a2b48SSukumar Swaminathan
1417291a2b48SSukumar Swaminathan return (status);
1418291a2b48SSukumar Swaminathan
141982527734SSukumar Swaminathan } /* emlxs_dump_parm_table() */
1420291a2b48SSukumar Swaminathan
1421291a2b48SSukumar Swaminathan
1422291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_model(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1423291a2b48SSukumar Swaminathan emlxs_dump_model(
1424291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1425291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1426291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1427291a2b48SSukumar Swaminathan {
1428291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD;
1429291a2b48SSukumar Swaminathan uint32_t status;
1430291a2b48SSukumar Swaminathan
1431291a2b48SSukumar Swaminathan /* vars used to build the Dump String */
1432291a2b48SSukumar Swaminathan char buf1[512];
1433291a2b48SSukumar Swaminathan char buf2[512];
1434291a2b48SSukumar Swaminathan
1435291a2b48SSukumar Swaminathan /* Write the Model into the buffer */
14368f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->model);
14378f23e9faSHans Rosenfeld (void) strlcpy(buf1, "Model: ", sizeof (buf1));
14388f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1439291a2b48SSukumar Swaminathan
1440291a2b48SSukumar Swaminathan /* Write the Model Description into the buffer */
14418f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->model_desc);
14428f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Description: ", sizeof (buf1));
14438f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1444291a2b48SSukumar Swaminathan
1445291a2b48SSukumar Swaminathan status =
1446291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
1447291a2b48SSukumar Swaminathan LEGEND_HBA_MODEL, 0);
1448291a2b48SSukumar Swaminathan
1449291a2b48SSukumar Swaminathan status =
1450291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
1451291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_MODEL);
1452291a2b48SSukumar Swaminathan
1453291a2b48SSukumar Swaminathan return (status);
1454291a2b48SSukumar Swaminathan
145582527734SSukumar Swaminathan } /* emlxs_dump_model() */
1456291a2b48SSukumar Swaminathan
1457291a2b48SSukumar Swaminathan
1458291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_wwn(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1459291a2b48SSukumar Swaminathan emlxs_dump_wwn(
1460291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1461291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1462291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1463291a2b48SSukumar Swaminathan {
1464291a2b48SSukumar Swaminathan uint32_t status;
1465291a2b48SSukumar Swaminathan
1466291a2b48SSukumar Swaminathan /* vars used to build the Dump String */
1467291a2b48SSukumar Swaminathan char buf1[512];
1468291a2b48SSukumar Swaminathan char buf2[512];
1469291a2b48SSukumar Swaminathan int i;
1470291a2b48SSukumar Swaminathan uint8_t *p;
1471291a2b48SSukumar Swaminathan
1472291a2b48SSukumar Swaminathan /* Write the WWPN into the buffer */
14738f23e9faSHans Rosenfeld (void) strlcpy(buf1, "Port WWN: ", sizeof (buf1));
1474291a2b48SSukumar Swaminathan p = (uint8_t *)&hba->wwpn;
1475291a2b48SSukumar Swaminathan for (i = 0; i < 7; i++) {
14768f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x:", *p++);
14778f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1478291a2b48SSukumar Swaminathan }
14798f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x", *p++);
14808f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1481291a2b48SSukumar Swaminathan
1482291a2b48SSukumar Swaminathan /* Write the WWNN into the buffer */
14838f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Node WWN: ", sizeof (buf1));
1484291a2b48SSukumar Swaminathan p = (uint8_t *)&hba->wwnn;
1485291a2b48SSukumar Swaminathan for (i = 0; i < 7; i++) {
14868f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x:", *p++);
14878f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1488291a2b48SSukumar Swaminathan }
14898f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x", *p++);
14908f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1491291a2b48SSukumar Swaminathan
1492291a2b48SSukumar Swaminathan status =
1493291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
1494291a2b48SSukumar Swaminathan LEGEND_HBA_WWN, 0);
1495291a2b48SSukumar Swaminathan
1496291a2b48SSukumar Swaminathan status =
1497291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
1498291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_WWN);
1499291a2b48SSukumar Swaminathan
1500291a2b48SSukumar Swaminathan return (status);
1501291a2b48SSukumar Swaminathan
150282527734SSukumar Swaminathan } /* emlxs_dump_wwn() */
1503291a2b48SSukumar Swaminathan
1504291a2b48SSukumar Swaminathan
1505291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_serial_number(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1506291a2b48SSukumar Swaminathan emlxs_dump_serial_number(
1507291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1508291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1509291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1510291a2b48SSukumar Swaminathan {
1511291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD;
1512291a2b48SSukumar Swaminathan uint32_t status;
1513291a2b48SSukumar Swaminathan
1514291a2b48SSukumar Swaminathan /* vars used to build the Dump String */
1515291a2b48SSukumar Swaminathan char buf1[512];
1516291a2b48SSukumar Swaminathan char buf2[512];
1517291a2b48SSukumar Swaminathan
1518291a2b48SSukumar Swaminathan /* Write the Serial Number into the buffer */
15198f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->serial_num);
15208f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_SN, sizeof (buf1));
15218f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", sizeof (buf1));
15228f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
1523291a2b48SSukumar Swaminathan
1524291a2b48SSukumar Swaminathan status =
1525291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
1526291a2b48SSukumar Swaminathan LEGEND_HBA_SN, 0);
1527291a2b48SSukumar Swaminathan
1528291a2b48SSukumar Swaminathan status =
1529291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
1530291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_SN);
1531291a2b48SSukumar Swaminathan
1532291a2b48SSukumar Swaminathan return (status);
1533291a2b48SSukumar Swaminathan
153482527734SSukumar Swaminathan } /* emlxs_dump_serial_number() */
1535291a2b48SSukumar Swaminathan
1536291a2b48SSukumar Swaminathan
1537291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_fw_version(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1538291a2b48SSukumar Swaminathan emlxs_dump_fw_version(
1539291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1540291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1541291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1542291a2b48SSukumar Swaminathan {
1543291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD;
1544291a2b48SSukumar Swaminathan uint32_t status;
1545291a2b48SSukumar Swaminathan
1546291a2b48SSukumar Swaminathan char *buf1;
1547291a2b48SSukumar Swaminathan char *buf2;
1548291a2b48SSukumar Swaminathan uint32_t buf1_size;
1549291a2b48SSukumar Swaminathan uint32_t buf2_size;
1550291a2b48SSukumar Swaminathan
1551291a2b48SSukumar Swaminathan buf1_size = 1024;
1552291a2b48SSukumar Swaminathan buf2_size = 1024;
1553291a2b48SSukumar Swaminathan
1554291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
1555291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
1556291a2b48SSukumar Swaminathan
1557291a2b48SSukumar Swaminathan /* Write the Firmware Version into the buffer */
15588f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->fw_version);
15598f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_FW_VERSION, buf1_size);
15608f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
15618f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1562291a2b48SSukumar Swaminathan
1563291a2b48SSukumar Swaminathan /* Write the Operational FW Version into the buffer */
15648f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->opFwName);
15658f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size);
15668f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_OPVERSION, buf1_size);
15678f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
15688f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1569291a2b48SSukumar Swaminathan
1570291a2b48SSukumar Swaminathan /* Write the SLI-1 FW Version into the buffer */
15718f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli1FwName);
15728f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size);
15738f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI1VERSION, buf1_size);
15748f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
15758f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1576291a2b48SSukumar Swaminathan
1577291a2b48SSukumar Swaminathan /* Write the SLI-2 FW Version into the buffer */
15788f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli2FwName);
15798f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size);
15808f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI2VERSION, buf1_size);
15818f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
15828f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1583291a2b48SSukumar Swaminathan
1584291a2b48SSukumar Swaminathan /* Write the SLI-3 FW Version into the buffer */
15858f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli3FwName);
15868f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size);
15878f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI3VERSION, buf1_size);
15888f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
15898f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1590291a2b48SSukumar Swaminathan
1591291a2b48SSukumar Swaminathan /* Write the Kernel FW Version into the buffer */
15928f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->postKernName);
15938f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size);
15948f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_KERNELVERSION, buf1_size);
15958f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
15968f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1597291a2b48SSukumar Swaminathan
1598291a2b48SSukumar Swaminathan status =
1599291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
1600291a2b48SSukumar Swaminathan LEGEND_HBA_FW_VERSION, 0);
1601291a2b48SSukumar Swaminathan
1602291a2b48SSukumar Swaminathan status =
1603291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
1604291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_FW_VERSION);
1605291a2b48SSukumar Swaminathan
1606291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
1607291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
1608291a2b48SSukumar Swaminathan
1609291a2b48SSukumar Swaminathan return (status);
1610291a2b48SSukumar Swaminathan
161182527734SSukumar Swaminathan } /* emlxs_dump_fw_version() */
1612291a2b48SSukumar Swaminathan
1613291a2b48SSukumar Swaminathan
1614291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_boot_version(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1615291a2b48SSukumar Swaminathan emlxs_dump_boot_version(
1616291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1617291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1618291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1619291a2b48SSukumar Swaminathan {
1620291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD;
1621291a2b48SSukumar Swaminathan uint32_t status;
1622291a2b48SSukumar Swaminathan uint32_t state;
1623291a2b48SSukumar Swaminathan
1624291a2b48SSukumar Swaminathan char *buf1;
1625291a2b48SSukumar Swaminathan char *buf2;
1626291a2b48SSukumar Swaminathan uint32_t buf1_size;
1627291a2b48SSukumar Swaminathan uint32_t buf2_size;
1628291a2b48SSukumar Swaminathan
1629291a2b48SSukumar Swaminathan buf1_size = 1024;
1630291a2b48SSukumar Swaminathan buf2_size = 1024;
1631291a2b48SSukumar Swaminathan
1632291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
1633291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
1634291a2b48SSukumar Swaminathan
1635291a2b48SSukumar Swaminathan #ifdef EMLXS_SPARC
1636291a2b48SSukumar Swaminathan if (strcmp(vpd->fcode_version, "none") == 0)
1637291a2b48SSukumar Swaminathan #else
1638291a2b48SSukumar Swaminathan if (strcmp(vpd->boot_version, "none") == 0)
1639291a2b48SSukumar Swaminathan #endif /* EMLXS_SPARC */
1640291a2b48SSukumar Swaminathan {
1641291a2b48SSukumar Swaminathan state = 2; /* BOOT_BIOS_NOT_PRESENT */
1642291a2b48SSukumar Swaminathan } else {
1643291a2b48SSukumar Swaminathan state = emlxs_boot_code_state(hba);
1644291a2b48SSukumar Swaminathan }
1645291a2b48SSukumar Swaminathan
1646291a2b48SSukumar Swaminathan /* Write the Boot Bios State into the buffer */
16478f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, " %d", state);
16488f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_BB_STATE, buf1_size);
16498f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
16508f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1651291a2b48SSukumar Swaminathan
1652291a2b48SSukumar Swaminathan /* Write the Boot Bios Version into the buffer */
1653291a2b48SSukumar Swaminathan if (state == 2) {
16548f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", "unknown");
1655291a2b48SSukumar Swaminathan } else {
1656291a2b48SSukumar Swaminathan #ifdef EMLXS_SPARC
16578f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s (FCode)",
16588f23e9faSHans Rosenfeld vpd->fcode_version);
1659291a2b48SSukumar Swaminathan #else
16608f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->boot_version);
1661291a2b48SSukumar Swaminathan #endif /* EMLXS_SPARC */
1662291a2b48SSukumar Swaminathan }
1663291a2b48SSukumar Swaminathan
16648f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size);
16658f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_BB_VERSION, buf1_size);
16668f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size);
16678f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1668291a2b48SSukumar Swaminathan
1669291a2b48SSukumar Swaminathan status =
1670291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
1671291a2b48SSukumar Swaminathan LEGEND_HBA_BB_VERSION, 0);
1672291a2b48SSukumar Swaminathan
1673291a2b48SSukumar Swaminathan status =
1674291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
1675291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_BB_VERSION);
1676291a2b48SSukumar Swaminathan
1677291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
1678291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
1679291a2b48SSukumar Swaminathan
1680291a2b48SSukumar Swaminathan return (status);
1681291a2b48SSukumar Swaminathan
168282527734SSukumar Swaminathan } /* emlxs_dump_boot_version() */
1683291a2b48SSukumar Swaminathan
1684291a2b48SSukumar Swaminathan
1685291a2b48SSukumar Swaminathan /* ARGSUSED */
1686291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_cfg_region4_decoded(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,char * pLidLegend,DUMP_WAKE_UP_PARAMS * pBuffer,uint32_t ByteCount)1687291a2b48SSukumar Swaminathan emlxs_dump_cfg_region4_decoded(
1688291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1689291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1690291a2b48SSukumar Swaminathan char *pLidLegend,
1691291a2b48SSukumar Swaminathan DUMP_WAKE_UP_PARAMS *pBuffer,
1692291a2b48SSukumar Swaminathan uint32_t ByteCount)
1693291a2b48SSukumar Swaminathan {
1694291a2b48SSukumar Swaminathan uint32_t status;
1695291a2b48SSukumar Swaminathan char *buf1; /* text buffer */
1696291a2b48SSukumar Swaminathan char *buf2; /* text buffer */
1697291a2b48SSukumar Swaminathan uint32_t buf1_size;
1698291a2b48SSukumar Swaminathan uint32_t buf2_size;
1699291a2b48SSukumar Swaminathan
1700291a2b48SSukumar Swaminathan buf1_size = 1024;
1701291a2b48SSukumar Swaminathan buf2_size = 1024;
1702291a2b48SSukumar Swaminathan
1703291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
1704291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
1705291a2b48SSukumar Swaminathan
1706291a2b48SSukumar Swaminathan /* Write the Initial ID into the buffer */
17078f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s: %08x %08x",
17088f23e9faSHans Rosenfeld LEGEND_CR4_INITIAL_LOAD,
1709291a2b48SSukumar Swaminathan pBuffer->InitialId[0], pBuffer->InitialId[1]);
17108f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1711291a2b48SSukumar Swaminathan
1712291a2b48SSukumar Swaminathan /* Write the Flags Word into the buffer */
17138f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x", LEGEND_CR4_FLAGS,
17148f23e9faSHans Rosenfeld pBuffer->Flags);
17158f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1716291a2b48SSukumar Swaminathan
1717291a2b48SSukumar Swaminathan /* Write the Boot Bios ID into the buffer */
17188f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
17198f23e9faSHans Rosenfeld LEGEND_CR4_BOOT_BIOS_ID,
1720291a2b48SSukumar Swaminathan pBuffer->BootBiosId[0], pBuffer->BootBiosId[1]);
17218f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1722291a2b48SSukumar Swaminathan
1723291a2b48SSukumar Swaminathan /* Write the SLI1 ID into the buffer */
17248f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
17258f23e9faSHans Rosenfeld LEGEND_CR4_SLI1_ID,
1726291a2b48SSukumar Swaminathan pBuffer->Sli1Id[0], pBuffer->Sli1Id[1]);
17278f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1728291a2b48SSukumar Swaminathan
1729291a2b48SSukumar Swaminathan /* Write the SLI2 ID into the buffer */
17308f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
17318f23e9faSHans Rosenfeld LEGEND_CR4_SLI2_ID,
1732291a2b48SSukumar Swaminathan pBuffer->Sli2Id[0], pBuffer->Sli2Id[1]);
17338f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1734291a2b48SSukumar Swaminathan
1735291a2b48SSukumar Swaminathan /* Write the SLI3 ID into the buffer */
17368f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
17378f23e9faSHans Rosenfeld LEGEND_CR4_SLI3_ID,
1738291a2b48SSukumar Swaminathan pBuffer->Sli3Id[0], pBuffer->Sli3Id[1]);
17398f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1740291a2b48SSukumar Swaminathan
1741291a2b48SSukumar Swaminathan /* Write the SLI4 ID into the buffer */
17428f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
17438f23e9faSHans Rosenfeld LEGEND_CR4_SLI4_ID,
1744291a2b48SSukumar Swaminathan pBuffer->Sli4Id[0], pBuffer->Sli4Id[1]);
17458f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1746291a2b48SSukumar Swaminathan
1747291a2b48SSukumar Swaminathan /* Write the Erom ID into the buffer */
17488f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
17498f23e9faSHans Rosenfeld LEGEND_CR4_EROM_ID,
1750291a2b48SSukumar Swaminathan pBuffer->EromId[0], pBuffer->EromId[1]);
17518f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1752291a2b48SSukumar Swaminathan
1753291a2b48SSukumar Swaminathan status =
1754291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION,
1755291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_4, 0);
1756291a2b48SSukumar Swaminathan
1757291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
1758291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
1759291a2b48SSukumar Swaminathan
1760291a2b48SSukumar Swaminathan return (status);
1761291a2b48SSukumar Swaminathan
176282527734SSukumar Swaminathan } /* emlxs_dump_cfg_region4_decoded() */
1763291a2b48SSukumar Swaminathan
1764291a2b48SSukumar Swaminathan
1765291a2b48SSukumar Swaminathan /* ARGSUSED */
1766291a2b48SSukumar Swaminathan uint32_t
emlxs_dump_cfg_region14_decoded(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,char * pLidLegend,char * pBuffer,uint32_t ByteCount)1767291a2b48SSukumar Swaminathan emlxs_dump_cfg_region14_decoded(
1768291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1769291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1770291a2b48SSukumar Swaminathan char *pLidLegend,
1771291a2b48SSukumar Swaminathan char *pBuffer,
1772291a2b48SSukumar Swaminathan uint32_t ByteCount)
1773291a2b48SSukumar Swaminathan {
1774291a2b48SSukumar Swaminathan uint32_t status;
1775291a2b48SSukumar Swaminathan char *buf1; /* text buffer */
1776291a2b48SSukumar Swaminathan char *buf2; /* text buffer */
1777291a2b48SSukumar Swaminathan uint32_t buf1_size;
1778291a2b48SSukumar Swaminathan uint32_t buf2_size;
1779291a2b48SSukumar Swaminathan int i;
1780291a2b48SSukumar Swaminathan uint8_t tag;
1781291a2b48SSukumar Swaminathan uint16_t length;
1782291a2b48SSukumar Swaminathan uint16_t length2;
1783291a2b48SSukumar Swaminathan char mnemonic[4];
1784291a2b48SSukumar Swaminathan int fDone = FALSE; /* flag to exit VPD loop */
1785291a2b48SSukumar Swaminathan
1786291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
1787291a2b48SSukumar Swaminathan uint32_t *wptr;
1788291a2b48SSukumar Swaminathan uint32_t w1;
1789291a2b48SSukumar Swaminathan #endif
1790291a2b48SSukumar Swaminathan
1791291a2b48SSukumar Swaminathan buf1_size = 1024;
1792291a2b48SSukumar Swaminathan buf2_size = 1024;
1793291a2b48SSukumar Swaminathan
1794291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
1795291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
1796291a2b48SSukumar Swaminathan
1797291a2b48SSukumar Swaminathan /* If Big Endian, swap the data in place, */
1798291a2b48SSukumar Swaminathan /* because it's PCI Data (Little Endian) */
1799291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
1800291a2b48SSukumar Swaminathan wptr = (uint32_t *)pBuffer;
1801291a2b48SSukumar Swaminathan for (i = 0; i < (int)ByteCount / 4; i++, wptr++) {
1802291a2b48SSukumar Swaminathan w1 = *wptr;
180382527734SSukumar Swaminathan *wptr = BE_SWAP32(w1);
1804291a2b48SSukumar Swaminathan }
1805291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
1806291a2b48SSukumar Swaminathan
1807291a2b48SSukumar Swaminathan /* Decode the VPD Data and write it into the buffer */
1808291a2b48SSukumar Swaminathan
1809291a2b48SSukumar Swaminathan /* CR 26941 */
1810291a2b48SSukumar Swaminathan /* NOTE: The following code is correct, */
1811291a2b48SSukumar Swaminathan /* should work, and used to work. */
1812291a2b48SSukumar Swaminathan /* pBuffer points to char, and the symbol VPD_TAG_82 is 0x82. */
1813291a2b48SSukumar Swaminathan /* The test is an equality test, not a relational test. */
1814291a2b48SSukumar Swaminathan /* The compiler should generate an 8 bit test, and */
1815291a2b48SSukumar Swaminathan /* sign extension does not apply. */
1816291a2b48SSukumar Swaminathan /* I don't know when or why it stopped working, */
1817291a2b48SSukumar Swaminathan /* and don't have time to dig. */
1818291a2b48SSukumar Swaminathan /* The cast fixes it. */
1819291a2b48SSukumar Swaminathan
1820291a2b48SSukumar Swaminathan if (((unsigned char)pBuffer[0]) != VPD_TAG_82) {
18218f23e9faSHans Rosenfeld (void) snprintf(buf1, buf1_size,
18228f23e9faSHans Rosenfeld "Bad VPD Data: (w0=0x%08x)", *(uint32_t *)pBuffer);
1823291a2b48SSukumar Swaminathan } else { /* begin good data */
1824291a2b48SSukumar Swaminathan i = 0;
1825291a2b48SSukumar Swaminathan while (!fDone) {
1826291a2b48SSukumar Swaminathan tag = pBuffer[i++];
1827291a2b48SSukumar Swaminathan length = pBuffer[i++];
1828291a2b48SSukumar Swaminathan length |= (pBuffer[i++] << 8);
1829291a2b48SSukumar Swaminathan
1830291a2b48SSukumar Swaminathan switch (tag) {
1831291a2b48SSukumar Swaminathan case VPD_TAG_82:
1832291a2b48SSukumar Swaminathan (void) strncpy(buf2, &pBuffer[i],
1833291a2b48SSukumar Swaminathan length > buf2_size ? buf2_size : length);
1834291a2b48SSukumar Swaminathan buf2[length >
1835291a2b48SSukumar Swaminathan (buf2_size - 1) ? (buf2_size -
1836291a2b48SSukumar Swaminathan 1) : length] = 0;
18378f23e9faSHans Rosenfeld (void) strlcat(buf1, "Name: ", buf1_size);
18388f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
1839291a2b48SSukumar Swaminathan i += length;
1840291a2b48SSukumar Swaminathan break;
1841291a2b48SSukumar Swaminathan
1842291a2b48SSukumar Swaminathan case VPD_TAG_90:
1843291a2b48SSukumar Swaminathan for (;;) {
1844291a2b48SSukumar Swaminathan mnemonic[0] = pBuffer[i++];
1845291a2b48SSukumar Swaminathan mnemonic[1] = pBuffer[i++];
1846291a2b48SSukumar Swaminathan mnemonic[2] = 0;
1847291a2b48SSukumar Swaminathan
1848291a2b48SSukumar Swaminathan if (strcmp(mnemonic, "RV") == 0) {
1849291a2b48SSukumar Swaminathan fDone = TRUE;
1850291a2b48SSukumar Swaminathan break;
1851291a2b48SSukumar Swaminathan }
1852291a2b48SSukumar Swaminathan
1853291a2b48SSukumar Swaminathan if (mnemonic[0] == 0) {
1854291a2b48SSukumar Swaminathan fDone = TRUE;
1855291a2b48SSukumar Swaminathan break;
1856291a2b48SSukumar Swaminathan }
1857291a2b48SSukumar Swaminathan
1858291a2b48SSukumar Swaminathan length2 = pBuffer[i++];
18598f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size,
18608f23e9faSHans Rosenfeld "\n %s: ", mnemonic);
18618f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2,
18628f23e9faSHans Rosenfeld buf1_size);
1863291a2b48SSukumar Swaminathan (void) strncpy(buf2, &pBuffer[i],
1864291a2b48SSukumar Swaminathan length2 >
1865291a2b48SSukumar Swaminathan buf2_size ? buf2_size : length2);
1866291a2b48SSukumar Swaminathan buf2[length2 >
1867291a2b48SSukumar Swaminathan (buf2_size - 1) ? (buf2_size -
1868291a2b48SSukumar Swaminathan 1) : length2] = 0;
18698f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2,
18708f23e9faSHans Rosenfeld buf1_size);
1871291a2b48SSukumar Swaminathan i += length2;
1872291a2b48SSukumar Swaminathan }
1873291a2b48SSukumar Swaminathan break;
1874291a2b48SSukumar Swaminathan
1875291a2b48SSukumar Swaminathan default:
1876291a2b48SSukumar Swaminathan break;
1877291a2b48SSukumar Swaminathan
1878291a2b48SSukumar Swaminathan } /* end switch */
1879291a2b48SSukumar Swaminathan
1880291a2b48SSukumar Swaminathan } /* end while */
1881291a2b48SSukumar Swaminathan
1882291a2b48SSukumar Swaminathan } /* good data */
1883291a2b48SSukumar Swaminathan
1884291a2b48SSukumar Swaminathan status =
1885291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION,
1886291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_14, 0);
1887291a2b48SSukumar Swaminathan
1888291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
1889291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
1890291a2b48SSukumar Swaminathan
1891291a2b48SSukumar Swaminathan return (status);
1892291a2b48SSukumar Swaminathan
189382527734SSukumar Swaminathan } /* emlxs_dump_cfg_region14_decoded() */
1894291a2b48SSukumar Swaminathan
1895291a2b48SSukumar Swaminathan
1896291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_cfg_region(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile,uint8_t Region,char * pLidLegend,int fSwap)1897291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(
1898291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1899291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1900291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
1901291a2b48SSukumar Swaminathan uint8_t Region,
1902291a2b48SSukumar Swaminathan char *pLidLegend,
1903291a2b48SSukumar Swaminathan int fSwap)
1904291a2b48SSukumar Swaminathan {
1905291a2b48SSukumar Swaminathan uint32_t status;
1906291a2b48SSukumar Swaminathan uint32_t RetByteCount = 0; /* returned byte count */
1907291a2b48SSukumar Swaminathan char *buf1; /* string ops buffer */
1908291a2b48SSukumar Swaminathan char *buf2; /* string ops buffer */
1909291a2b48SSukumar Swaminathan uint32_t buf1_size;
1910291a2b48SSukumar Swaminathan uint32_t buf2_size;
1911291a2b48SSukumar Swaminathan uint32_t *buffer;
1912291a2b48SSukumar Swaminathan int i;
1913291a2b48SSukumar Swaminathan
1914291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
1915291a2b48SSukumar Swaminathan fSwap = FALSE;
1916291a2b48SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
1917291a2b48SSukumar Swaminathan
1918291a2b48SSukumar Swaminathan buf1_size = 4096;
1919291a2b48SSukumar Swaminathan buf2_size = 1024;
1920291a2b48SSukumar Swaminathan
1921291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
1922291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
1923291a2b48SSukumar Swaminathan
1924291a2b48SSukumar Swaminathan buffer =
1925291a2b48SSukumar Swaminathan (uint32_t *)kmem_zalloc(DUMP_MAX_CONFIG_REGION_LENGTH, KM_SLEEP);
1926291a2b48SSukumar Swaminathan
1927291a2b48SSukumar Swaminathan status =
1928291a2b48SSukumar Swaminathan emlxs_read_cfg_region(hba, Region, DUMP_MAX_CONFIG_REGION_LENGTH,
1929291a2b48SSukumar Swaminathan &RetByteCount, (uint8_t *)buffer);
1930291a2b48SSukumar Swaminathan
1931291a2b48SSukumar Swaminathan if (status != 0) {
1932291a2b48SSukumar Swaminathan kmem_free(buffer, DUMP_MAX_CONFIG_REGION_LENGTH);
1933291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
1934291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
1935291a2b48SSukumar Swaminathan return (status);
1936291a2b48SSukumar Swaminathan }
1937291a2b48SSukumar Swaminathan
1938291a2b48SSukumar Swaminathan /* Write the Data into the buffer */
1939291a2b48SSukumar Swaminathan for (i = 0; i < (int)RetByteCount / 4; i++) {
1940291a2b48SSukumar Swaminathan if ((i % 8 == 0) && (i != 0)) {
19418f23e9faSHans Rosenfeld (void) strlcat((char *)buf1, "\n ", buf1_size);
1942291a2b48SSukumar Swaminathan }
1943291a2b48SSukumar Swaminathan
19448f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%08x, ", buffer[i]);
19458f23e9faSHans Rosenfeld (void) strlcat((char *)buf1, buf2, buf1_size);
1946291a2b48SSukumar Swaminathan }
1947291a2b48SSukumar Swaminathan
1948291a2b48SSukumar Swaminathan status =
1949291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION,
1950291a2b48SSukumar Swaminathan pLidLegend, 0);
1951291a2b48SSukumar Swaminathan
1952291a2b48SSukumar Swaminathan status = emlxs_dump_host_block(fpDmpFile,
1953291a2b48SSukumar Swaminathan (uint8_t *)buffer,
1954291a2b48SSukumar Swaminathan RetByteCount,
1955291a2b48SSukumar Swaminathan SID_CONFIG_REGION, LEGEND_CONFIG_REGION, pLidLegend, fSwap);
1956291a2b48SSukumar Swaminathan
1957291a2b48SSukumar Swaminathan if (Region == 4) {
1958291a2b48SSukumar Swaminathan status =
1959291a2b48SSukumar Swaminathan emlxs_dump_cfg_region4_decoded(hba, fpTxtFile, pLidLegend,
1960291a2b48SSukumar Swaminathan (DUMP_WAKE_UP_PARAMS *)buffer, RetByteCount);
1961291a2b48SSukumar Swaminathan }
1962291a2b48SSukumar Swaminathan
1963291a2b48SSukumar Swaminathan if (Region == 14) {
1964291a2b48SSukumar Swaminathan status =
1965291a2b48SSukumar Swaminathan emlxs_dump_cfg_region14_decoded(hba, fpTxtFile,
1966291a2b48SSukumar Swaminathan pLidLegend, (char *)buffer, RetByteCount);
1967291a2b48SSukumar Swaminathan }
1968291a2b48SSukumar Swaminathan
1969291a2b48SSukumar Swaminathan kmem_free(buffer, DUMP_MAX_CONFIG_REGION_LENGTH);
1970291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
1971291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
1972291a2b48SSukumar Swaminathan
1973291a2b48SSukumar Swaminathan return (status);
1974291a2b48SSukumar Swaminathan
197582527734SSukumar Swaminathan } /* emlxs_dump_cfg_region() */
1976291a2b48SSukumar Swaminathan
1977291a2b48SSukumar Swaminathan
1978291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_cfg_regions(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)1979291a2b48SSukumar Swaminathan emlxs_dump_cfg_regions(
1980291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
1981291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
1982291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
1983291a2b48SSukumar Swaminathan {
1984291a2b48SSukumar Swaminathan uint32_t status;
1985291a2b48SSukumar Swaminathan
1986291a2b48SSukumar Swaminathan status =
1987291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 0,
1988291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_0, FALSE);
1989291a2b48SSukumar Swaminathan
1990291a2b48SSukumar Swaminathan status =
1991291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 1,
1992291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_1, FALSE);
1993291a2b48SSukumar Swaminathan
1994291a2b48SSukumar Swaminathan status =
1995291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 2,
1996291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_2, FALSE);
1997291a2b48SSukumar Swaminathan
1998291a2b48SSukumar Swaminathan status =
1999291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 3,
2000291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_3, FALSE);
2001291a2b48SSukumar Swaminathan
2002291a2b48SSukumar Swaminathan status =
2003291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 4,
2004291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_4, FALSE);
2005291a2b48SSukumar Swaminathan
2006291a2b48SSukumar Swaminathan status =
2007291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 5,
2008291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_5, FALSE);
2009291a2b48SSukumar Swaminathan
2010291a2b48SSukumar Swaminathan status =
2011291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 6,
2012291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_6, FALSE);
2013291a2b48SSukumar Swaminathan
2014291a2b48SSukumar Swaminathan status =
2015291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 7,
2016291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_7, FALSE);
2017291a2b48SSukumar Swaminathan
2018291a2b48SSukumar Swaminathan status =
2019291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 8,
2020291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_8, TRUE);
2021291a2b48SSukumar Swaminathan
2022291a2b48SSukumar Swaminathan status =
2023291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 9,
2024291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_9, TRUE);
2025291a2b48SSukumar Swaminathan
2026291a2b48SSukumar Swaminathan status =
2027291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 10,
2028291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_10, TRUE);
2029291a2b48SSukumar Swaminathan
2030291a2b48SSukumar Swaminathan status =
2031291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 11,
2032291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_11, FALSE);
2033291a2b48SSukumar Swaminathan
2034291a2b48SSukumar Swaminathan status =
2035291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 12,
2036291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_12, FALSE);
2037291a2b48SSukumar Swaminathan
2038291a2b48SSukumar Swaminathan status =
2039291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 13,
2040291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_13, FALSE);
2041291a2b48SSukumar Swaminathan
2042291a2b48SSukumar Swaminathan status =
2043291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 14,
2044291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_14, FALSE);
2045291a2b48SSukumar Swaminathan
2046291a2b48SSukumar Swaminathan status =
2047291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 15,
2048291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_15, FALSE);
2049291a2b48SSukumar Swaminathan
2050291a2b48SSukumar Swaminathan status =
2051291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 16,
2052291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_16, FALSE);
2053291a2b48SSukumar Swaminathan
2054291a2b48SSukumar Swaminathan status =
2055291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 17,
2056291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_17, FALSE);
2057291a2b48SSukumar Swaminathan
2058291a2b48SSukumar Swaminathan status =
2059291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 18,
2060291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_18, FALSE);
2061291a2b48SSukumar Swaminathan
2062291a2b48SSukumar Swaminathan status =
2063291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 19,
2064291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_19, FALSE);
2065291a2b48SSukumar Swaminathan
2066291a2b48SSukumar Swaminathan status =
2067291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 20,
2068291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_20, FALSE);
2069291a2b48SSukumar Swaminathan
2070291a2b48SSukumar Swaminathan status =
2071291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 21,
2072291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_21, FALSE);
2073291a2b48SSukumar Swaminathan
2074291a2b48SSukumar Swaminathan status =
2075291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 22,
2076291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_22, FALSE);
2077291a2b48SSukumar Swaminathan
2078291a2b48SSukumar Swaminathan status =
2079291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 23,
2080291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_23, FALSE);
2081291a2b48SSukumar Swaminathan
2082291a2b48SSukumar Swaminathan status =
2083291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 24,
2084291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_24, FALSE);
2085291a2b48SSukumar Swaminathan
2086291a2b48SSukumar Swaminathan status =
2087291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 25,
2088291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_25, FALSE);
2089291a2b48SSukumar Swaminathan
2090291a2b48SSukumar Swaminathan status =
2091291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 26,
2092291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_26, FALSE);
2093291a2b48SSukumar Swaminathan
2094291a2b48SSukumar Swaminathan status =
2095291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 27,
2096291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_27, FALSE);
2097291a2b48SSukumar Swaminathan
2098291a2b48SSukumar Swaminathan status =
2099291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 28,
2100291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_28, FALSE);
2101291a2b48SSukumar Swaminathan
2102291a2b48SSukumar Swaminathan status =
2103291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 29,
2104291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_29, FALSE);
2105291a2b48SSukumar Swaminathan
2106291a2b48SSukumar Swaminathan status =
2107291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 30,
2108291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_30, FALSE);
2109291a2b48SSukumar Swaminathan
2110291a2b48SSukumar Swaminathan status =
2111291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 31,
2112291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_31, FALSE);
2113291a2b48SSukumar Swaminathan
2114291a2b48SSukumar Swaminathan status =
2115291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 32,
2116291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_32, FALSE);
2117291a2b48SSukumar Swaminathan
2118291a2b48SSukumar Swaminathan return (status);
2119291a2b48SSukumar Swaminathan
212082527734SSukumar Swaminathan } /* emlxs_dump_cfg_regions() */
2121291a2b48SSukumar Swaminathan
2122291a2b48SSukumar Swaminathan
212382527734SSukumar Swaminathan /*ARGSUSED*/
2124291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_os_version(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)2125291a2b48SSukumar Swaminathan emlxs_dump_os_version(
2126291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2127291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2128291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
2129291a2b48SSukumar Swaminathan {
2130291a2b48SSukumar Swaminathan uint32_t status;
2131291a2b48SSukumar Swaminathan char *buf1;
2132291a2b48SSukumar Swaminathan char *buf2;
2133291a2b48SSukumar Swaminathan uint32_t buf1_size;
2134291a2b48SSukumar Swaminathan uint32_t buf2_size;
2135291a2b48SSukumar Swaminathan
2136291a2b48SSukumar Swaminathan buf1_size = 1024;
2137291a2b48SSukumar Swaminathan buf2_size = 1024;
2138291a2b48SSukumar Swaminathan
2139291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
2140291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
2141291a2b48SSukumar Swaminathan
2142291a2b48SSukumar Swaminathan /* First, write the OS Name string into the buffer */
21438f23e9faSHans Rosenfeld (void) strlcpy(buf1, utsname.sysname, buf1_size);
2144291a2b48SSukumar Swaminathan
2145291a2b48SSukumar Swaminathan /* Second, write the Version Info into the buffer */
21468f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, ", %s", utsname.release);
21478f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
2148291a2b48SSukumar Swaminathan
2149291a2b48SSukumar Swaminathan status =
2150291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_REV_INFO,
2151291a2b48SSukumar Swaminathan LEGEND_REV_OS_VERSION, 0);
2152291a2b48SSukumar Swaminathan
2153291a2b48SSukumar Swaminathan status =
2154291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_REV_INFO,
2155291a2b48SSukumar Swaminathan LEGEND_REV_INFO, LEGEND_REV_OS_VERSION);
2156291a2b48SSukumar Swaminathan
2157291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
2158291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
2159291a2b48SSukumar Swaminathan
2160291a2b48SSukumar Swaminathan return (status);
2161291a2b48SSukumar Swaminathan
216282527734SSukumar Swaminathan } /* emlxs_dump_os_version() */
2163291a2b48SSukumar Swaminathan
2164291a2b48SSukumar Swaminathan
216582527734SSukumar Swaminathan /*ARGSUSED*/
2166291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_drv_version(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)2167291a2b48SSukumar Swaminathan emlxs_dump_drv_version(
2168291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2169291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2170291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
2171291a2b48SSukumar Swaminathan {
2172291a2b48SSukumar Swaminathan uint32_t status;
2173291a2b48SSukumar Swaminathan char *buf1;
2174291a2b48SSukumar Swaminathan char *buf2;
2175291a2b48SSukumar Swaminathan uint32_t buf1_size;
2176291a2b48SSukumar Swaminathan uint32_t buf2_size;
2177291a2b48SSukumar Swaminathan
2178291a2b48SSukumar Swaminathan buf1_size = 1024;
2179291a2b48SSukumar Swaminathan buf2_size = 1024;
2180291a2b48SSukumar Swaminathan
2181291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
2182291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
2183291a2b48SSukumar Swaminathan
2184291a2b48SSukumar Swaminathan /* Write the Driver Type into the buffer */
21858f23e9faSHans Rosenfeld (void) strlcpy(buf1, "Driver Type: ", buf1_size);
21868f23e9faSHans Rosenfeld (void) strlcat(buf1, DUMP_DRV_LEADVILLE, buf1_size);
2187291a2b48SSukumar Swaminathan
2188291a2b48SSukumar Swaminathan /* Write the Driver Name into the buffer */
21898f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", DRIVER_NAME);
21908f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Driver Name: ", buf1_size);
21918f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
2192291a2b48SSukumar Swaminathan
2193291a2b48SSukumar Swaminathan /* Write the Driver Version into the buffer */
21948f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", emlxs_version);
21958f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Driver Version: ", buf1_size);
21968f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size);
2197291a2b48SSukumar Swaminathan
2198291a2b48SSukumar Swaminathan status =
2199291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_REV_INFO,
2200291a2b48SSukumar Swaminathan LEGEND_REV_DRV_VERSION, 0);
2201291a2b48SSukumar Swaminathan
2202291a2b48SSukumar Swaminathan status =
2203291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_REV_INFO,
2204291a2b48SSukumar Swaminathan LEGEND_REV_INFO, LEGEND_REV_DRV_VERSION);
2205291a2b48SSukumar Swaminathan
2206291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size);
2207291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size);
2208291a2b48SSukumar Swaminathan
2209291a2b48SSukumar Swaminathan return (status);
2210291a2b48SSukumar Swaminathan
221182527734SSukumar Swaminathan } /* emlxs_dump_drv_version() */
2212291a2b48SSukumar Swaminathan
2213291a2b48SSukumar Swaminathan
2214291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_file_create(emlxs_hba_t * hba,emlxs_file_t ** fpTxtFile,emlxs_file_t ** fpDmpFile,emlxs_file_t ** fpCeeFile)2215291a2b48SSukumar Swaminathan emlxs_dump_file_create(
2216291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2217291a2b48SSukumar Swaminathan emlxs_file_t ** fpTxtFile,
2218291a2b48SSukumar Swaminathan emlxs_file_t ** fpDmpFile,
2219291a2b48SSukumar Swaminathan emlxs_file_t ** fpCeeFile)
2220291a2b48SSukumar Swaminathan {
2221291a2b48SSukumar Swaminathan if (fpTxtFile) {
2222291a2b48SSukumar Swaminathan /* Create the Dump Files */
2223291a2b48SSukumar Swaminathan if ((*fpTxtFile = emlxs_fopen(hba, EMLXS_TXT_FILE)) == NULL) {
2224291a2b48SSukumar Swaminathan return (1);
2225291a2b48SSukumar Swaminathan }
2226291a2b48SSukumar Swaminathan }
2227291a2b48SSukumar Swaminathan
2228291a2b48SSukumar Swaminathan if (fpCeeFile) {
2229291a2b48SSukumar Swaminathan *fpCeeFile = NULL;
2230291a2b48SSukumar Swaminathan
2231*a3170057SPaul Winder if ((hba->model_info.vendor_id == PCI_VENDOR_ID_EMULEX &&
2232*a3170057SPaul Winder hba->model_info.device_id == PCI_DEVICE_ID_HORNET) ||
2233a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE2_CHIP) ||
2234a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) {
2235291a2b48SSukumar Swaminathan if ((*fpCeeFile =
2236291a2b48SSukumar Swaminathan emlxs_fopen(hba, EMLXS_CEE_FILE)) == NULL) {
2237291a2b48SSukumar Swaminathan emlxs_fdelete(*fpTxtFile);
2238291a2b48SSukumar Swaminathan return (1);
2239291a2b48SSukumar Swaminathan }
2240291a2b48SSukumar Swaminathan }
2241291a2b48SSukumar Swaminathan }
2242291a2b48SSukumar Swaminathan
2243291a2b48SSukumar Swaminathan if (fpDmpFile) {
2244291a2b48SSukumar Swaminathan if ((*fpDmpFile = emlxs_fopen(hba, EMLXS_DMP_FILE)) == NULL) {
2245291a2b48SSukumar Swaminathan emlxs_fdelete(*fpTxtFile);
2246291a2b48SSukumar Swaminathan emlxs_fdelete(*fpCeeFile);
2247291a2b48SSukumar Swaminathan return (1);
2248291a2b48SSukumar Swaminathan }
2249291a2b48SSukumar Swaminathan
2250291a2b48SSukumar Swaminathan /* Initialize the DMP File */
2251291a2b48SSukumar Swaminathan /* Write the single-byte Dump Identification */
2252291a2b48SSukumar Swaminathan /* SID to the DMP File */
2253291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN
2254291a2b48SSukumar Swaminathan emlxs_fputc(SID_DUMP_ID_LE, *fpDmpFile);
2255291a2b48SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */
225682527734SSukumar Swaminathan
225782527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
225882527734SSukumar Swaminathan emlxs_fputc(SID_DUMP_ID_BE, *fpDmpFile);
225982527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
226082527734SSukumar Swaminathan
2261291a2b48SSukumar Swaminathan emlxs_fputc(SID_NULL, *fpDmpFile);
2262291a2b48SSukumar Swaminathan emlxs_fputc(SID_NULL, *fpDmpFile);
2263291a2b48SSukumar Swaminathan emlxs_fputc(SID_NULL, *fpDmpFile);
2264291a2b48SSukumar Swaminathan emlxs_fflush(*fpDmpFile);
2265291a2b48SSukumar Swaminathan }
2266291a2b48SSukumar Swaminathan
2267291a2b48SSukumar Swaminathan return (0);
2268291a2b48SSukumar Swaminathan
226982527734SSukumar Swaminathan } /* emlxs_dump_file_create() */
2270291a2b48SSukumar Swaminathan
2271291a2b48SSukumar Swaminathan
2272291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_file_terminate(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile,emlxs_file_t * fpCeeFile)2273291a2b48SSukumar Swaminathan emlxs_dump_file_terminate(
227482527734SSukumar Swaminathan emlxs_hba_t *hba,
2275291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2276291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
2277291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile)
2278291a2b48SSukumar Swaminathan {
2279291a2b48SSukumar Swaminathan
2280291a2b48SSukumar Swaminathan if (fpTxtFile) {
2281291a2b48SSukumar Swaminathan /* Write a suitable string to the Dump TXT File */
2282291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "Dump File End\n");
2283291a2b48SSukumar Swaminathan emlxs_fflush(fpTxtFile);
2284291a2b48SSukumar Swaminathan }
2285291a2b48SSukumar Swaminathan
2286291a2b48SSukumar Swaminathan if (fpCeeFile) {
2287*a3170057SPaul Winder if (hba->model_info.vendor_id == PCI_VENDOR_ID_EMULEX &&
2288*a3170057SPaul Winder hba->model_info.device_id == PCI_DEVICE_ID_HORNET) {
228982527734SSukumar Swaminathan (void) emlxs_fprintf(fpCeeFile, "Dump File End\n");
229082527734SSukumar Swaminathan }
229182527734SSukumar Swaminathan
2292291a2b48SSukumar Swaminathan emlxs_fflush(fpCeeFile);
2293291a2b48SSukumar Swaminathan }
2294291a2b48SSukumar Swaminathan
2295291a2b48SSukumar Swaminathan /* Write the single-byte Dump Termination SID to the DMP File */
2296291a2b48SSukumar Swaminathan if (fpDmpFile) {
2297291a2b48SSukumar Swaminathan emlxs_fputc(SID_DUMP_TERM, fpDmpFile);
2298291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile);
2299291a2b48SSukumar Swaminathan }
2300291a2b48SSukumar Swaminathan
2301291a2b48SSukumar Swaminathan
2302291a2b48SSukumar Swaminathan return (0);
2303291a2b48SSukumar Swaminathan
230482527734SSukumar Swaminathan } /* emlxs_dump_file_terminate() */
2305291a2b48SSukumar Swaminathan
2306291a2b48SSukumar Swaminathan
2307291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_file_close(emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile,emlxs_file_t * fpCeeFile)2308291a2b48SSukumar Swaminathan emlxs_dump_file_close(
2309291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2310291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
2311291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile)
2312291a2b48SSukumar Swaminathan {
2313291a2b48SSukumar Swaminathan
2314291a2b48SSukumar Swaminathan if (fpTxtFile) {
2315291a2b48SSukumar Swaminathan (void) emlxs_fclose(fpTxtFile);
2316291a2b48SSukumar Swaminathan }
2317291a2b48SSukumar Swaminathan
2318291a2b48SSukumar Swaminathan if (fpCeeFile) {
2319291a2b48SSukumar Swaminathan (void) emlxs_fclose(fpCeeFile);
2320291a2b48SSukumar Swaminathan }
2321291a2b48SSukumar Swaminathan
2322291a2b48SSukumar Swaminathan if (fpDmpFile) {
2323291a2b48SSukumar Swaminathan (void) emlxs_fclose(fpDmpFile);
2324291a2b48SSukumar Swaminathan }
2325291a2b48SSukumar Swaminathan
2326291a2b48SSukumar Swaminathan return (0);
2327291a2b48SSukumar Swaminathan
232882527734SSukumar Swaminathan } /* emlxs_dump_file_close() */
2329291a2b48SSukumar Swaminathan
2330291a2b48SSukumar Swaminathan
2331291a2b48SSukumar Swaminathan /* ************************************************************************* */
2332291a2b48SSukumar Swaminathan /* ************************************************************************* */
2333291a2b48SSukumar Swaminathan /* Dump Generators, High Level */
2334291a2b48SSukumar Swaminathan /* ************************************************************************* */
2335291a2b48SSukumar Swaminathan /* ************************************************************************* */
2336291a2b48SSukumar Swaminathan
2337291a2b48SSukumar Swaminathan
2338291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_rev_info(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)2339291a2b48SSukumar Swaminathan emlxs_dump_rev_info(
2340291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2341291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2342291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
2343291a2b48SSukumar Swaminathan {
2344291a2b48SSukumar Swaminathan (void) emlxs_dump_os_version(hba, fpTxtFile, fpDmpFile);
2345291a2b48SSukumar Swaminathan (void) emlxs_dump_drv_version(hba, fpTxtFile, fpDmpFile);
2346291a2b48SSukumar Swaminathan return (0);
2347291a2b48SSukumar Swaminathan
234882527734SSukumar Swaminathan } /* emlxs_dump_rev_info() */
2349291a2b48SSukumar Swaminathan
2350291a2b48SSukumar Swaminathan
2351291a2b48SSukumar Swaminathan /* ARGSUSED */
2352291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_hba_info(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile,uint32_t dump_type)2353291a2b48SSukumar Swaminathan emlxs_dump_hba_info(
2354291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2355291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2356291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
2357291a2b48SSukumar Swaminathan uint32_t dump_type)
2358291a2b48SSukumar Swaminathan {
2359291a2b48SSukumar Swaminathan (void) emlxs_dump_model(hba, fpTxtFile, fpDmpFile);
2360291a2b48SSukumar Swaminathan (void) emlxs_dump_wwn(hba, fpTxtFile, fpDmpFile);
2361291a2b48SSukumar Swaminathan (void) emlxs_dump_serial_number(hba, fpTxtFile, fpDmpFile);
2362291a2b48SSukumar Swaminathan (void) emlxs_dump_fw_version(hba, fpTxtFile, fpDmpFile);
2363291a2b48SSukumar Swaminathan (void) emlxs_dump_boot_version(hba, fpTxtFile, fpDmpFile);
2364291a2b48SSukumar Swaminathan
2365291a2b48SSukumar Swaminathan
2366291a2b48SSukumar Swaminathan return (0);
2367291a2b48SSukumar Swaminathan
236882527734SSukumar Swaminathan } /* emlxs_dump_hba_info() */
2369291a2b48SSukumar Swaminathan
2370291a2b48SSukumar Swaminathan
2371291a2b48SSukumar Swaminathan /* ************************************************************************* */
2372291a2b48SSukumar Swaminathan /* emlxs_dump_table_check */
2373291a2b48SSukumar Swaminathan /* Examine Dump Table, and determine its size. */
2374291a2b48SSukumar Swaminathan /* Count and include ID SIDs, and the TERM SID, */
2375291a2b48SSukumar Swaminathan /* but not the Pointer at Addr 654. */
2376291a2b48SSukumar Swaminathan /* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */
2377291a2b48SSukumar Swaminathan /* ************************************************************************* */
2378291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_table_check(emlxs_hba_t * hba,uint32_t * pSize)2379291a2b48SSukumar Swaminathan emlxs_dump_table_check(
2380291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2381291a2b48SSukumar Swaminathan uint32_t *pSize)
2382291a2b48SSukumar Swaminathan {
2383291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
2384291a2b48SSukumar Swaminathan int fDone = FALSE; /* loop control flag */
2385291a2b48SSukumar Swaminathan uint32_t tableSize = 0; /* dump table size (word count) */
2386291a2b48SSukumar Swaminathan MAILBOX *mb;
2387291a2b48SSukumar Swaminathan MAILBOXQ *mbq;
2388291a2b48SSukumar Swaminathan uint32_t DumpTableAddr;
2389291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry;
2390291a2b48SSukumar Swaminathan
2391291a2b48SSukumar Swaminathan *pSize = 0;
2392291a2b48SSukumar Swaminathan
2393291a2b48SSukumar Swaminathan /* Read 1 word from low memory at address 654; */
2394291a2b48SSukumar Swaminathan /* save the returned Dump Table Base Address */
2395291a2b48SSukumar Swaminathan
239682527734SSukumar Swaminathan mbq =
239782527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
2398291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq;
2399291a2b48SSukumar Swaminathan
2400291a2b48SSukumar Swaminathan /* Read the dump table address */
240182527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, 0x654, 1);
240282527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
2403291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
2404291a2b48SSukumar Swaminathan "Unable to read dump table address. "\
2405291a2b48SSukumar Swaminathan "offset=0x654 status=%x",
2406291a2b48SSukumar Swaminathan mb->mbxStatus);
2407291a2b48SSukumar Swaminathan
2408291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2409291a2b48SSukumar Swaminathan return (1);
2410291a2b48SSukumar Swaminathan }
2411291a2b48SSukumar Swaminathan
2412291a2b48SSukumar Swaminathan DumpTableAddr = mb->un.varDmp.resp_offset;
2413291a2b48SSukumar Swaminathan
2414291a2b48SSukumar Swaminathan if (DumpTableAddr == 0) {
2415291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2416291a2b48SSukumar Swaminathan return (1);
2417291a2b48SSukumar Swaminathan }
2418291a2b48SSukumar Swaminathan
2419291a2b48SSukumar Swaminathan /* Now loop reading Dump Table Entries.. */
2420291a2b48SSukumar Swaminathan /* break out when we see a Terminator SID */
2421291a2b48SSukumar Swaminathan while (!fDone) {
242282527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, DumpTableAddr, 2);
242382527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
2424291a2b48SSukumar Swaminathan MBX_SUCCESS) {
2425291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
2426291a2b48SSukumar Swaminathan "Unable to read dump table entry. "\
2427291a2b48SSukumar Swaminathan "offset=%x status=%x",
2428291a2b48SSukumar Swaminathan DumpTableAddr, mb->mbxStatus);
2429291a2b48SSukumar Swaminathan
2430291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2431291a2b48SSukumar Swaminathan return (1);
2432291a2b48SSukumar Swaminathan }
2433291a2b48SSukumar Swaminathan
2434291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0] = mb->un.varWords[4];
2435291a2b48SSukumar Swaminathan
2436291a2b48SSukumar Swaminathan switch (entry.un.PortBlock.un.s.sid) {
2437291a2b48SSukumar Swaminathan /* New Dump Table */
2438291a2b48SSukumar Swaminathan case SID_ID01:
2439291a2b48SSukumar Swaminathan tableSize++;
2440291a2b48SSukumar Swaminathan DumpTableAddr += 4;
2441291a2b48SSukumar Swaminathan break;
2442291a2b48SSukumar Swaminathan
2443291a2b48SSukumar Swaminathan #ifdef CC_DUMP_USE_ALL_TABLES
2444291a2b48SSukumar Swaminathan /* New Dump Table */
2445291a2b48SSukumar Swaminathan case SID_ID02:
2446291a2b48SSukumar Swaminathan case SID_ID03:
2447291a2b48SSukumar Swaminathan tableSize++;
2448291a2b48SSukumar Swaminathan DumpTableAddr += 4;
2449291a2b48SSukumar Swaminathan break;
2450291a2b48SSukumar Swaminathan #else
2451291a2b48SSukumar Swaminathan /* New Dump Table */
2452291a2b48SSukumar Swaminathan case SID_ID02:
2453291a2b48SSukumar Swaminathan case SID_ID03:
2454291a2b48SSukumar Swaminathan tableSize++;
2455291a2b48SSukumar Swaminathan fDone = TRUE;
2456291a2b48SSukumar Swaminathan break;
2457291a2b48SSukumar Swaminathan #endif /* CC_DUMP_USE_ALL_TABLES */
2458291a2b48SSukumar Swaminathan
2459291a2b48SSukumar Swaminathan /* Dump Table(s) Termination - all done */
2460291a2b48SSukumar Swaminathan case SID_TERM:
2461291a2b48SSukumar Swaminathan tableSize++;
2462291a2b48SSukumar Swaminathan fDone = TRUE;
2463291a2b48SSukumar Swaminathan break;
2464291a2b48SSukumar Swaminathan
2465291a2b48SSukumar Swaminathan /* Dump Table Entry */
2466291a2b48SSukumar Swaminathan default:
2467291a2b48SSukumar Swaminathan tableSize += 2;
2468291a2b48SSukumar Swaminathan DumpTableAddr += 8;
2469291a2b48SSukumar Swaminathan break;
2470291a2b48SSukumar Swaminathan }
2471291a2b48SSukumar Swaminathan
2472291a2b48SSukumar Swaminathan } /* end while */
2473291a2b48SSukumar Swaminathan
2474291a2b48SSukumar Swaminathan *pSize = (tableSize * 4); /* return the total Dump Table size */
2475291a2b48SSukumar Swaminathan
2476291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2477291a2b48SSukumar Swaminathan return (0);
2478291a2b48SSukumar Swaminathan
247982527734SSukumar Swaminathan } /* emlxs_dump_table_check() */
2480291a2b48SSukumar Swaminathan
2481291a2b48SSukumar Swaminathan
2482291a2b48SSukumar Swaminathan /* ************************************************************************ */
2483291a2b48SSukumar Swaminathan /* emlxs_dump_table_read */
2484291a2b48SSukumar Swaminathan /* Read the Dump Table and store it, for use */
2485291a2b48SSukumar Swaminathan /* subsequently in emlxs_dump_hba_memory. */
2486291a2b48SSukumar Swaminathan /* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */
2487291a2b48SSukumar Swaminathan /* ************************************************************************ */
2488291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_table_read(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,uint32_t ** ppDumpTable,uint32_t * pDumpTableSize)2489291a2b48SSukumar Swaminathan emlxs_dump_table_read(
2490291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2491291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2492291a2b48SSukumar Swaminathan uint32_t **ppDumpTable,
2493291a2b48SSukumar Swaminathan uint32_t *pDumpTableSize)
2494291a2b48SSukumar Swaminathan {
2495291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
2496291a2b48SSukumar Swaminathan uint32_t status = 0;
2497291a2b48SSukumar Swaminathan int fDone = FALSE;
2498291a2b48SSukumar Swaminathan MAILBOXQ *mbq;
2499291a2b48SSukumar Swaminathan MAILBOX *mb;
2500291a2b48SSukumar Swaminathan uint32_t *pDumpTableEntry;
2501291a2b48SSukumar Swaminathan uint32_t DumpTableAddr;
2502291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry;
2503291a2b48SSukumar Swaminathan
2504291a2b48SSukumar Swaminathan char buf2[256];
2505291a2b48SSukumar Swaminathan char *buf1;
2506291a2b48SSukumar Swaminathan uint32_t size = (32 * 1024);
2507291a2b48SSukumar Swaminathan
2508291a2b48SSukumar Swaminathan /* First, check the dump table and if valid, get its size */
2509291a2b48SSukumar Swaminathan status = emlxs_dump_table_check(hba, pDumpTableSize);
2510291a2b48SSukumar Swaminathan if (status != 0) {
2511291a2b48SSukumar Swaminathan return (status);
2512291a2b48SSukumar Swaminathan }
2513291a2b48SSukumar Swaminathan
2514291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(size, KM_SLEEP);
2515291a2b48SSukumar Swaminathan
2516291a2b48SSukumar Swaminathan /* Allocate a buffer to hold the Dump Table */
2517291a2b48SSukumar Swaminathan *ppDumpTable = (uint32_t *)kmem_zalloc(*pDumpTableSize, KM_SLEEP);
2518291a2b48SSukumar Swaminathan
2519291a2b48SSukumar Swaminathan pDumpTableEntry = *ppDumpTable;
2520291a2b48SSukumar Swaminathan
2521291a2b48SSukumar Swaminathan /* Read 1 word from low memory at address 654; */
2522291a2b48SSukumar Swaminathan /* save the returned Dump Table Base Address */
252382527734SSukumar Swaminathan mbq =
252482527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
2525291a2b48SSukumar Swaminathan
2526291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq;
2527291a2b48SSukumar Swaminathan
2528291a2b48SSukumar Swaminathan /* Read the dump table address */
252982527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, 0x654, 1);
253082527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
2531291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
2532291a2b48SSukumar Swaminathan "Unable to read dump table address. "\
2533291a2b48SSukumar Swaminathan "offset=0x654 status=%x",
2534291a2b48SSukumar Swaminathan mb->mbxStatus);
2535291a2b48SSukumar Swaminathan
2536291a2b48SSukumar Swaminathan kmem_free(buf1, size);
2537291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2538291a2b48SSukumar Swaminathan
2539291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
2540291a2b48SSukumar Swaminathan *pDumpTableSize = 0;
2541291a2b48SSukumar Swaminathan *ppDumpTable = NULL;
2542291a2b48SSukumar Swaminathan
2543291a2b48SSukumar Swaminathan return (1);
2544291a2b48SSukumar Swaminathan }
2545291a2b48SSukumar Swaminathan
2546291a2b48SSukumar Swaminathan DumpTableAddr = mb->un.varDmp.resp_offset;
2547291a2b48SSukumar Swaminathan
2548291a2b48SSukumar Swaminathan if (DumpTableAddr == 0) {
2549291a2b48SSukumar Swaminathan kmem_free(buf1, size);
2550291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2551291a2b48SSukumar Swaminathan
2552291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
2553291a2b48SSukumar Swaminathan *pDumpTableSize = 0;
2554291a2b48SSukumar Swaminathan *ppDumpTable = NULL;
2555291a2b48SSukumar Swaminathan
2556291a2b48SSukumar Swaminathan return (1);
2557291a2b48SSukumar Swaminathan }
2558291a2b48SSukumar Swaminathan
2559291a2b48SSukumar Swaminathan
2560291a2b48SSukumar Swaminathan /* Now loop reading Dump Table Entries.. */
2561291a2b48SSukumar Swaminathan /* break out when we see a Terminator SID */
2562291a2b48SSukumar Swaminathan while (!fDone) {
256382527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, DumpTableAddr, 2);
256482527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
2565291a2b48SSukumar Swaminathan MBX_SUCCESS) {
2566291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
2567291a2b48SSukumar Swaminathan "Unable to read dump table entry. "\
2568291a2b48SSukumar Swaminathan "offset=%x status=%x",
2569291a2b48SSukumar Swaminathan DumpTableAddr, mb->mbxStatus);
2570291a2b48SSukumar Swaminathan
2571291a2b48SSukumar Swaminathan kmem_free(buf1, size);
2572291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2573291a2b48SSukumar Swaminathan
2574291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
2575291a2b48SSukumar Swaminathan *pDumpTableSize = 0;
2576291a2b48SSukumar Swaminathan *ppDumpTable = NULL;
2577291a2b48SSukumar Swaminathan
2578291a2b48SSukumar Swaminathan return (1);
2579291a2b48SSukumar Swaminathan }
2580291a2b48SSukumar Swaminathan
25818f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n Addr=%08x: ",
25828f23e9faSHans Rosenfeld mb->un.varDmp.base_adr);
25838f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size);
2584291a2b48SSukumar Swaminathan
2585291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0] = mb->un.varWords[4];
2586291a2b48SSukumar Swaminathan *pDumpTableEntry++ = mb->un.varWords[4];
2587291a2b48SSukumar Swaminathan
2588291a2b48SSukumar Swaminathan switch (entry.un.PortBlock.un.s.sid) {
2589291a2b48SSukumar Swaminathan /* New Dump Table */
2590291a2b48SSukumar Swaminathan case SID_ID01:
25918f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
2592291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]);
25938f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size);
2594291a2b48SSukumar Swaminathan DumpTableAddr += 4;
2595291a2b48SSukumar Swaminathan break;
2596291a2b48SSukumar Swaminathan
2597291a2b48SSukumar Swaminathan #ifdef CC_DUMP_USE_ALL_TABLES
2598291a2b48SSukumar Swaminathan /* New Dump Table */
2599291a2b48SSukumar Swaminathan case SID_ID02:
2600291a2b48SSukumar Swaminathan case SID_ID03:
26018f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
2602291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]);
26038f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size);
2604291a2b48SSukumar Swaminathan DumpTableAddr += 4;
2605291a2b48SSukumar Swaminathan break;
2606291a2b48SSukumar Swaminathan #else
2607291a2b48SSukumar Swaminathan /* New Dump Table */
2608291a2b48SSukumar Swaminathan case SID_ID02:
2609291a2b48SSukumar Swaminathan case SID_ID03:
26108f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
2611291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]);
26128f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size);
2613291a2b48SSukumar Swaminathan fDone = TRUE;
2614291a2b48SSukumar Swaminathan break;
2615291a2b48SSukumar Swaminathan #endif /* CC_DUMP_USE_ALL_TABLES */
2616291a2b48SSukumar Swaminathan
2617291a2b48SSukumar Swaminathan /* Dump Table(s) Termination - all done */
2618291a2b48SSukumar Swaminathan case SID_TERM:
26198f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
2620291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]);
26218f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size);
2622291a2b48SSukumar Swaminathan fDone = TRUE;
2623291a2b48SSukumar Swaminathan break;
2624291a2b48SSukumar Swaminathan
2625291a2b48SSukumar Swaminathan /* Dump Table Entry */
2626291a2b48SSukumar Swaminathan default:
2627291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[1] = mb->un.varWords[5];
2628291a2b48SSukumar Swaminathan *pDumpTableEntry++ = mb->un.varWords[5];
2629291a2b48SSukumar Swaminathan
26308f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x, w1=%08x",
2631291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0],
2632291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[1]);
26338f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size);
2634291a2b48SSukumar Swaminathan DumpTableAddr += 8;
2635291a2b48SSukumar Swaminathan break;
2636291a2b48SSukumar Swaminathan }
2637291a2b48SSukumar Swaminathan
2638291a2b48SSukumar Swaminathan } /* end while */
2639291a2b48SSukumar Swaminathan
2640291a2b48SSukumar Swaminathan status =
2641291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_MEM_DUMP,
2642291a2b48SSukumar Swaminathan LEGEND_HBA_MEM_DUMP_TABLE, 0);
2643291a2b48SSukumar Swaminathan
2644291a2b48SSukumar Swaminathan kmem_free(buf1, size);
2645291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2646291a2b48SSukumar Swaminathan
2647291a2b48SSukumar Swaminathan if (status != 0) {
2648291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
2649291a2b48SSukumar Swaminathan *pDumpTableSize = 0;
2650291a2b48SSukumar Swaminathan *ppDumpTable = NULL;
2651291a2b48SSukumar Swaminathan
2652291a2b48SSukumar Swaminathan return (status);
2653291a2b48SSukumar Swaminathan }
2654291a2b48SSukumar Swaminathan
2655291a2b48SSukumar Swaminathan return (0);
2656291a2b48SSukumar Swaminathan
265782527734SSukumar Swaminathan } /* emlxs_dump_table_read() */
2658291a2b48SSukumar Swaminathan
2659291a2b48SSukumar Swaminathan
2660291a2b48SSukumar Swaminathan /* ************************************************************************* */
2661291a2b48SSukumar Swaminathan /* emlxs_dump_hba_memory */
2662291a2b48SSukumar Swaminathan /* Guided by the Dump Table previously read in, */
2663291a2b48SSukumar Swaminathan /* generate the Port Memory Dump. */
2664291a2b48SSukumar Swaminathan /* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */
2665291a2b48SSukumar Swaminathan /* ************************************************************************* */
2666291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_hba_memory(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile,uint32_t * pDumpTable)2667291a2b48SSukumar Swaminathan emlxs_dump_hba_memory(
2668291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2669291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
2670291a2b48SSukumar Swaminathan uint32_t *pDumpTable)
2671291a2b48SSukumar Swaminathan {
2672291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
2673291a2b48SSukumar Swaminathan uint32_t status = 0;
2674291a2b48SSukumar Swaminathan int fDone = FALSE;
2675291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry;
2676291a2b48SSukumar Swaminathan MAILBOXQ *mbq;
2677291a2b48SSukumar Swaminathan MAILBOX *mb;
2678291a2b48SSukumar Swaminathan uint32_t byteCount;
2679291a2b48SSukumar Swaminathan uint32_t byteCountRem;
2680291a2b48SSukumar Swaminathan uint8_t *pBuf;
2681291a2b48SSukumar Swaminathan uint8_t *p1;
2682291a2b48SSukumar Swaminathan uint32_t portAddr;
2683291a2b48SSukumar Swaminathan int fSwap = FALSE;
26848f23e9faSHans Rosenfeld uint32_t offset = 0;
2685291a2b48SSukumar Swaminathan uint32_t wcount;
2686291a2b48SSukumar Swaminathan uint32_t total = 0;
2687291a2b48SSukumar Swaminathan
2688291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
2689291a2b48SSukumar Swaminathan fSwap = TRUE;
2690291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
2691291a2b48SSukumar Swaminathan
2692291a2b48SSukumar Swaminathan if (!fpDmpFile) {
2693291a2b48SSukumar Swaminathan return (1);
2694291a2b48SSukumar Swaminathan }
2695291a2b48SSukumar Swaminathan
269682527734SSukumar Swaminathan mbq =
269782527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
2698291a2b48SSukumar Swaminathan
2699291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq;
2700291a2b48SSukumar Swaminathan
2701291a2b48SSukumar Swaminathan /* loop reading Dump Table Entries.. break out when */
2702291a2b48SSukumar Swaminathan /* we see a Terminator SID */
2703291a2b48SSukumar Swaminathan while (!fDone) {
2704291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0] = *pDumpTable++;
2705291a2b48SSukumar Swaminathan
2706291a2b48SSukumar Swaminathan switch (entry.un.PortBlock.un.s.sid) {
2707291a2b48SSukumar Swaminathan
2708291a2b48SSukumar Swaminathan /* New Dump Table */
2709291a2b48SSukumar Swaminathan case SID_ID01:
2710291a2b48SSukumar Swaminathan break;
2711291a2b48SSukumar Swaminathan
2712291a2b48SSukumar Swaminathan #ifdef CC_DUMP_USE_ALL_TABLES
2713291a2b48SSukumar Swaminathan /* New Dump Table */
2714291a2b48SSukumar Swaminathan case SID_ID02:
2715291a2b48SSukumar Swaminathan case SID_ID03:
2716291a2b48SSukumar Swaminathan break;
2717291a2b48SSukumar Swaminathan #else
2718291a2b48SSukumar Swaminathan /* New Dump Table */
2719291a2b48SSukumar Swaminathan case SID_ID02:
2720291a2b48SSukumar Swaminathan case SID_ID03:
2721291a2b48SSukumar Swaminathan fDone = TRUE;
2722291a2b48SSukumar Swaminathan break;
2723291a2b48SSukumar Swaminathan #endif /* CC_DUMP_USE_ALL_TABLES */
2724291a2b48SSukumar Swaminathan
2725291a2b48SSukumar Swaminathan /* Dump Table(s) Termination - all done */
2726291a2b48SSukumar Swaminathan case SID_TERM:
2727291a2b48SSukumar Swaminathan fDone = TRUE;
2728291a2b48SSukumar Swaminathan break;
2729291a2b48SSukumar Swaminathan
2730291a2b48SSukumar Swaminathan default:
2731291a2b48SSukumar Swaminathan /* Dump Table Entry */
2732291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[1] = *pDumpTable++;
2733291a2b48SSukumar Swaminathan
2734291a2b48SSukumar Swaminathan #ifdef CC_DUMP_FW_BUG_1
2735291a2b48SSukumar Swaminathan if (entry.un.PortBlock.un.w[1] == 0x3E0000) {
2736291a2b48SSukumar Swaminathan break;
2737291a2b48SSukumar Swaminathan }
2738291a2b48SSukumar Swaminathan #endif /* CC_DUMP_FW_BUG_1 */
2739291a2b48SSukumar Swaminathan
2740291a2b48SSukumar Swaminathan /* Check if indirect address, and */
2741291a2b48SSukumar Swaminathan /* obtain the new address if so */
2742291a2b48SSukumar Swaminathan if ((entry.un.PortBlock.un.s.addr & 0x80000000) != 0) {
2743291a2b48SSukumar Swaminathan offset =
2744291a2b48SSukumar Swaminathan (entry.un.PortBlock.un.s.
2745291a2b48SSukumar Swaminathan addr & 0x01FFFFFF);
274682527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, offset, 1);
274782527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT,
2748291a2b48SSukumar Swaminathan 0) != MBX_SUCCESS) {
2749291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
2750291a2b48SSukumar Swaminathan &emlxs_init_debug_msg,
2751291a2b48SSukumar Swaminathan "Unable to read dump table entry. "\
2752291a2b48SSukumar Swaminathan "offset=%x status=%x",
2753291a2b48SSukumar Swaminathan offset, mb->mbxStatus);
2754291a2b48SSukumar Swaminathan
2755291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2756291a2b48SSukumar Swaminathan return (1);
2757291a2b48SSukumar Swaminathan }
2758291a2b48SSukumar Swaminathan
2759291a2b48SSukumar Swaminathan /* replace the indirect address in the */
2760291a2b48SSukumar Swaminathan /* Dump Table */
2761291a2b48SSukumar Swaminathan entry.un.PortBlock.un.s.addr =
2762291a2b48SSukumar Swaminathan mb->un.varWords[4];
2763291a2b48SSukumar Swaminathan }
2764291a2b48SSukumar Swaminathan
2765291a2b48SSukumar Swaminathan /* determine byte count to dump */
2766291a2b48SSukumar Swaminathan byteCount = entry.un.PortBlock.un.s.bc;
2767291a2b48SSukumar Swaminathan if (entry.un.PortBlock.un.s.sid & SID_MULT_ELEM) {
2768291a2b48SSukumar Swaminathan if (entry.un.PortStruct.un.s.count == 0) {
2769291a2b48SSukumar Swaminathan byteCount =
2770291a2b48SSukumar Swaminathan 256 *
2771291a2b48SSukumar Swaminathan entry.un.PortStruct.un.s.length;
2772291a2b48SSukumar Swaminathan } else {
2773291a2b48SSukumar Swaminathan byteCount =
2774291a2b48SSukumar Swaminathan entry.un.PortStruct.un.s.count *
2775291a2b48SSukumar Swaminathan entry.un.PortStruct.un.s.length;
2776291a2b48SSukumar Swaminathan }
2777291a2b48SSukumar Swaminathan }
2778291a2b48SSukumar Swaminathan
2779291a2b48SSukumar Swaminathan total += byteCount;
2780291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
2781291a2b48SSukumar Swaminathan "Dump: addr=%x count=%d total=%d", offset,
2782291a2b48SSukumar Swaminathan byteCount, total);
2783291a2b48SSukumar Swaminathan
2784291a2b48SSukumar Swaminathan /* allocate a buffer to receive the dump data */
2785291a2b48SSukumar Swaminathan pBuf = (uint8_t *)kmem_zalloc(byteCount, KM_SLEEP);
2786291a2b48SSukumar Swaminathan
2787291a2b48SSukumar Swaminathan /* loop issuing MBX commands, 18x measly words at */
2788291a2b48SSukumar Swaminathan /* a time */
2789291a2b48SSukumar Swaminathan
2790291a2b48SSukumar Swaminathan /* init vars */
2791291a2b48SSukumar Swaminathan byteCountRem = byteCount;
2792291a2b48SSukumar Swaminathan p1 = pBuf;
2793291a2b48SSukumar Swaminathan portAddr = entry.un.PortBlock.un.s.addr;
2794291a2b48SSukumar Swaminathan
2795291a2b48SSukumar Swaminathan for (;;) {
2796291a2b48SSukumar Swaminathan if (byteCountRem == 0) {
2797291a2b48SSukumar Swaminathan break;
2798291a2b48SSukumar Swaminathan }
2799291a2b48SSukumar Swaminathan
2800291a2b48SSukumar Swaminathan wcount =
2801291a2b48SSukumar Swaminathan (byteCountRem / 4 >=
2802291a2b48SSukumar Swaminathan 0x18) ? 0x18 : (byteCountRem / 4);
280382527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, portAddr, wcount);
280482527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT,
2805291a2b48SSukumar Swaminathan 0) != MBX_SUCCESS) {
2806291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
2807291a2b48SSukumar Swaminathan &emlxs_init_debug_msg,
2808291a2b48SSukumar Swaminathan "Unable to read dump table entry."\
2809291a2b48SSukumar Swaminathan " offset=%x wc=%d status=%x",
2810291a2b48SSukumar Swaminathan portAddr, wcount, mb->mbxStatus);
2811291a2b48SSukumar Swaminathan break;
2812291a2b48SSukumar Swaminathan }
2813291a2b48SSukumar Swaminathan
2814291a2b48SSukumar Swaminathan bcopy((uint8_t *)&mb->un.varWords[4], p1,
2815291a2b48SSukumar Swaminathan (mb->un.varDmp.word_cnt * 4));
2816291a2b48SSukumar Swaminathan
2817291a2b48SSukumar Swaminathan byteCountRem -= (mb->un.varDmp.word_cnt * 4);
2818291a2b48SSukumar Swaminathan p1 += (mb->un.varDmp.word_cnt * 4);
2819291a2b48SSukumar Swaminathan portAddr += (mb->un.varDmp.word_cnt * 4);
2820291a2b48SSukumar Swaminathan
2821291a2b48SSukumar Swaminathan } /* end for */
2822291a2b48SSukumar Swaminathan
2823291a2b48SSukumar Swaminathan if (status == 0) {
2824291a2b48SSukumar Swaminathan if (entry.un.PortBlock.un.s.
2825291a2b48SSukumar Swaminathan sid & SID_MULT_ELEM) {
2826291a2b48SSukumar Swaminathan status =
2827291a2b48SSukumar Swaminathan emlxs_dump_port_struct(fpDmpFile,
2828291a2b48SSukumar Swaminathan pBuf, byteCount, entry, fSwap);
2829291a2b48SSukumar Swaminathan } else {
2830291a2b48SSukumar Swaminathan status =
2831291a2b48SSukumar Swaminathan emlxs_dump_port_block(fpDmpFile,
2832291a2b48SSukumar Swaminathan pBuf, byteCount, entry, fSwap);
2833291a2b48SSukumar Swaminathan }
2834291a2b48SSukumar Swaminathan }
2835291a2b48SSukumar Swaminathan
2836291a2b48SSukumar Swaminathan if (pBuf) {
2837291a2b48SSukumar Swaminathan kmem_free(pBuf, byteCount);
2838291a2b48SSukumar Swaminathan }
2839291a2b48SSukumar Swaminathan
2840291a2b48SSukumar Swaminathan break;
2841291a2b48SSukumar Swaminathan
2842291a2b48SSukumar Swaminathan } /* end switch */
2843291a2b48SSukumar Swaminathan
2844291a2b48SSukumar Swaminathan } /* end while */
2845291a2b48SSukumar Swaminathan
2846291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
2847291a2b48SSukumar Swaminathan
2848291a2b48SSukumar Swaminathan return (status);
2849291a2b48SSukumar Swaminathan
285082527734SSukumar Swaminathan } /* emlxs_dump_hba_memory() */
2851291a2b48SSukumar Swaminathan
2852291a2b48SSukumar Swaminathan
2853291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_hba(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)2854291a2b48SSukumar Swaminathan emlxs_dump_hba(
2855291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2856291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2857291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
2858291a2b48SSukumar Swaminathan {
2859291a2b48SSukumar Swaminathan uint32_t status = 0;
2860291a2b48SSukumar Swaminathan uint32_t *pDumpTable = 0;
2861291a2b48SSukumar Swaminathan uint32_t DumpTableSize = 0;
2862291a2b48SSukumar Swaminathan
286382527734SSukumar Swaminathan if (hba->sli_mode >= EMLXS_HBA_SLI4_MODE) {
286482527734SSukumar Swaminathan return (1);
286582527734SSukumar Swaminathan }
286682527734SSukumar Swaminathan
286782527734SSukumar Swaminathan /* HBA should be in WARM state here */
2868291a2b48SSukumar Swaminathan status =
2869291a2b48SSukumar Swaminathan emlxs_dump_table_read(hba, fpTxtFile, &pDumpTable,
2870291a2b48SSukumar Swaminathan &DumpTableSize);
2871291a2b48SSukumar Swaminathan if (status) {
2872291a2b48SSukumar Swaminathan return (status);
2873291a2b48SSukumar Swaminathan }
2874291a2b48SSukumar Swaminathan
2875291a2b48SSukumar Swaminathan status = emlxs_dump_hba_memory(hba, fpDmpFile, pDumpTable);
2876291a2b48SSukumar Swaminathan
2877291a2b48SSukumar Swaminathan if (pDumpTable != 0) {
2878291a2b48SSukumar Swaminathan kmem_free(pDumpTable, DumpTableSize);
2879291a2b48SSukumar Swaminathan }
2880291a2b48SSukumar Swaminathan
2881291a2b48SSukumar Swaminathan return (status);
2882291a2b48SSukumar Swaminathan
288382527734SSukumar Swaminathan } /* emlxs_dump_hba() */
2884291a2b48SSukumar Swaminathan
2885291a2b48SSukumar Swaminathan
2886291a2b48SSukumar Swaminathan /* ************************************************************************* */
2887291a2b48SSukumar Swaminathan /* emlxs_dump_drv_region */
2888291a2b48SSukumar Swaminathan /* Common subroutine for all the Dump_Sli"Structures" Routines */
2889291a2b48SSukumar Swaminathan /* NOTE: This routine does not free pBuf. This is by design. */
2890291a2b48SSukumar Swaminathan /* The caller does it. */
2891291a2b48SSukumar Swaminathan /* ************************************************************************* */
2892291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_drv_region(emlxs_hba_t * hba,uint32_t regionId,uint8_t ** pBuf,uint32_t * pBufLen)2893291a2b48SSukumar Swaminathan emlxs_dump_drv_region(
2894291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2895291a2b48SSukumar Swaminathan uint32_t regionId,
2896291a2b48SSukumar Swaminathan uint8_t **pBuf,
2897291a2b48SSukumar Swaminathan uint32_t *pBufLen)
2898291a2b48SSukumar Swaminathan { /* ptr to length of buffer */
2899291a2b48SSukumar Swaminathan uint32_t status;
2900291a2b48SSukumar Swaminathan uint32_t size;
2901291a2b48SSukumar Swaminathan
2902291a2b48SSukumar Swaminathan *pBuf = NULL;
2903291a2b48SSukumar Swaminathan *pBufLen = 0;
2904291a2b48SSukumar Swaminathan
2905291a2b48SSukumar Swaminathan size = 0;
2906291a2b48SSukumar Swaminathan status = emlxs_get_dump_region(hba, regionId, NULL, &size);
2907291a2b48SSukumar Swaminathan
2908291a2b48SSukumar Swaminathan if (status != 0) {
2909291a2b48SSukumar Swaminathan return (1);
2910291a2b48SSukumar Swaminathan }
2911291a2b48SSukumar Swaminathan
2912291a2b48SSukumar Swaminathan /* Now that we know the required length, request the actual data */
2913291a2b48SSukumar Swaminathan *pBuf = (uint8_t *)kmem_zalloc(size, KM_SLEEP);
2914291a2b48SSukumar Swaminathan
2915291a2b48SSukumar Swaminathan status = emlxs_get_dump_region(hba, regionId, *pBuf, &size);
2916291a2b48SSukumar Swaminathan
2917291a2b48SSukumar Swaminathan if (status != 0) {
2918a9800bebSGarrett D'Amore kmem_free(*pBuf, size);
2919291a2b48SSukumar Swaminathan *pBuf = NULL;
2920291a2b48SSukumar Swaminathan
2921291a2b48SSukumar Swaminathan return (1);
2922291a2b48SSukumar Swaminathan }
2923291a2b48SSukumar Swaminathan
2924291a2b48SSukumar Swaminathan *pBufLen = size;
2925291a2b48SSukumar Swaminathan
2926291a2b48SSukumar Swaminathan return (status);
2927291a2b48SSukumar Swaminathan
292882527734SSukumar Swaminathan } /* emlxs_dump_drv_region() */
2929291a2b48SSukumar Swaminathan
2930291a2b48SSukumar Swaminathan
2931291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_sli_regs(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)2932291a2b48SSukumar Swaminathan emlxs_dump_sli_regs(
2933291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2934291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
2935291a2b48SSukumar Swaminathan {
2936291a2b48SSukumar Swaminathan uint32_t status;
2937291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
2938291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
2939291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
2940291a2b48SSukumar Swaminathan
2941291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
2942291a2b48SSukumar Swaminathan fSwap = TRUE;
2943291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
2944291a2b48SSukumar Swaminathan
2945291a2b48SSukumar Swaminathan if (!fpDmpFile) {
2946291a2b48SSukumar Swaminathan return (1);
2947291a2b48SSukumar Swaminathan }
2948291a2b48SSukumar Swaminathan
2949291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_SLI_REGS, &pBuf, &bufLen);
2950291a2b48SSukumar Swaminathan
2951291a2b48SSukumar Swaminathan if (status != 0) {
2952291a2b48SSukumar Swaminathan return (status);
2953291a2b48SSukumar Swaminathan }
2954291a2b48SSukumar Swaminathan
2955291a2b48SSukumar Swaminathan status =
2956291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_SLI_REGS,
2957291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_SLI_REGS, fSwap);
2958291a2b48SSukumar Swaminathan
2959291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
2960291a2b48SSukumar Swaminathan
2961291a2b48SSukumar Swaminathan return (status);
2962291a2b48SSukumar Swaminathan
296382527734SSukumar Swaminathan } /* emlxs_dump_sli_regs() */
2964291a2b48SSukumar Swaminathan
2965291a2b48SSukumar Swaminathan
2966291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_slim(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile,uint32_t dump_type)2967291a2b48SSukumar Swaminathan emlxs_dump_slim(
2968291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
2969291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
2970291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
2971291a2b48SSukumar Swaminathan uint32_t dump_type)
2972291a2b48SSukumar Swaminathan {
2973291a2b48SSukumar Swaminathan uint32_t status;
2974291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
2975291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
2976291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
2977291a2b48SSukumar Swaminathan
2978291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
2979291a2b48SSukumar Swaminathan fSwap = TRUE;
2980291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
2981291a2b48SSukumar Swaminathan
2982291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_SLIM, &pBuf, &bufLen);
2983291a2b48SSukumar Swaminathan
2984291a2b48SSukumar Swaminathan if (status != 0) {
2985291a2b48SSukumar Swaminathan return (status);
2986291a2b48SSukumar Swaminathan }
2987291a2b48SSukumar Swaminathan
2988291a2b48SSukumar Swaminathan /* The SLIM Dump is only useful if it's a */
2989291a2b48SSukumar Swaminathan /* Driver-Initiated dump, say, after a HW Error */
2990291a2b48SSukumar Swaminathan if (dump_type == DUMP_TYPE_DRIVER) {
2991291a2b48SSukumar Swaminathan status =
2992291a2b48SSukumar Swaminathan emlxs_dump_word_txtfile(fpTxtFile, (uint32_t *)pBuf,
2993291a2b48SSukumar Swaminathan 0x40, LEGEND_SLI_STRUCTURES, LEGEND_SLIM);
2994291a2b48SSukumar Swaminathan }
2995291a2b48SSukumar Swaminathan
2996291a2b48SSukumar Swaminathan status =
2997291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_SLIM,
2998291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_SLIM, fSwap);
2999291a2b48SSukumar Swaminathan
3000291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3001291a2b48SSukumar Swaminathan
3002291a2b48SSukumar Swaminathan return (status);
3003291a2b48SSukumar Swaminathan
300482527734SSukumar Swaminathan } /* emlxs_dump_slim() */
3005291a2b48SSukumar Swaminathan
3006291a2b48SSukumar Swaminathan
3007291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_pcb(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)3008291a2b48SSukumar Swaminathan emlxs_dump_pcb(
3009291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3010291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3011291a2b48SSukumar Swaminathan {
3012291a2b48SSukumar Swaminathan uint32_t status;
3013291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
3014291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
3015291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
3016291a2b48SSukumar Swaminathan
3017291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3018291a2b48SSukumar Swaminathan fSwap = TRUE;
3019291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3020291a2b48SSukumar Swaminathan
3021291a2b48SSukumar Swaminathan if (!fpDmpFile) {
3022291a2b48SSukumar Swaminathan return (1);
3023291a2b48SSukumar Swaminathan }
3024291a2b48SSukumar Swaminathan
3025291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_PCB, &pBuf, &bufLen);
3026291a2b48SSukumar Swaminathan if (status != 0) {
3027291a2b48SSukumar Swaminathan return (status);
3028291a2b48SSukumar Swaminathan }
3029291a2b48SSukumar Swaminathan
3030291a2b48SSukumar Swaminathan status =
3031291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_PCB,
3032291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_PCB, fSwap);
3033291a2b48SSukumar Swaminathan
3034291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3035291a2b48SSukumar Swaminathan
3036291a2b48SSukumar Swaminathan return (status);
3037291a2b48SSukumar Swaminathan
303882527734SSukumar Swaminathan } /* emlxs_dump_pcb() */
3039291a2b48SSukumar Swaminathan
3040291a2b48SSukumar Swaminathan
3041291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_mbox(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)3042291a2b48SSukumar Swaminathan emlxs_dump_mbox(
3043291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3044291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3045291a2b48SSukumar Swaminathan {
3046291a2b48SSukumar Swaminathan uint32_t status;
3047291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
3048291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
3049291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
3050291a2b48SSukumar Swaminathan
3051291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3052291a2b48SSukumar Swaminathan fSwap = TRUE;
3053291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3054291a2b48SSukumar Swaminathan
3055291a2b48SSukumar Swaminathan if (!fpDmpFile) {
3056291a2b48SSukumar Swaminathan return (1);
3057291a2b48SSukumar Swaminathan }
3058291a2b48SSukumar Swaminathan
3059291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_MBX, &pBuf, &bufLen);
3060291a2b48SSukumar Swaminathan if (status != 0) {
3061291a2b48SSukumar Swaminathan return (status);
3062291a2b48SSukumar Swaminathan }
3063291a2b48SSukumar Swaminathan
3064291a2b48SSukumar Swaminathan status =
3065291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_MBX,
3066291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_MBX, fSwap);
3067291a2b48SSukumar Swaminathan
3068291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3069291a2b48SSukumar Swaminathan
3070291a2b48SSukumar Swaminathan return (status);
3071291a2b48SSukumar Swaminathan
307282527734SSukumar Swaminathan } /* emlxs_dump_mbox() */
3073291a2b48SSukumar Swaminathan
3074291a2b48SSukumar Swaminathan
3075291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_host_pointers(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)3076291a2b48SSukumar Swaminathan emlxs_dump_host_pointers(
3077291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3078291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3079291a2b48SSukumar Swaminathan {
3080291a2b48SSukumar Swaminathan uint32_t status;
3081291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
3082291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
3083291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
3084291a2b48SSukumar Swaminathan
3085291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3086291a2b48SSukumar Swaminathan fSwap = TRUE;
3087291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3088291a2b48SSukumar Swaminathan
3089291a2b48SSukumar Swaminathan if (!fpDmpFile) {
3090291a2b48SSukumar Swaminathan return (1);
3091291a2b48SSukumar Swaminathan }
3092291a2b48SSukumar Swaminathan
3093291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_HOST_PTRS, &pBuf, &bufLen);
3094291a2b48SSukumar Swaminathan if (status != 0) {
3095291a2b48SSukumar Swaminathan return (status);
3096291a2b48SSukumar Swaminathan }
3097291a2b48SSukumar Swaminathan
3098291a2b48SSukumar Swaminathan status =
3099291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_HOST_PTRS,
3100291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_HOST_PTRS, fSwap);
3101291a2b48SSukumar Swaminathan
3102291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3103291a2b48SSukumar Swaminathan
3104291a2b48SSukumar Swaminathan return (status);
3105291a2b48SSukumar Swaminathan
310682527734SSukumar Swaminathan } /* emlxs_dump_host_pointers() */
3107291a2b48SSukumar Swaminathan
3108291a2b48SSukumar Swaminathan
3109291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_port_pointers(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)3110291a2b48SSukumar Swaminathan emlxs_dump_port_pointers(
3111291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3112291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3113291a2b48SSukumar Swaminathan {
3114291a2b48SSukumar Swaminathan uint32_t status;
3115291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
3116291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
3117291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
3118291a2b48SSukumar Swaminathan
3119291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3120291a2b48SSukumar Swaminathan fSwap = TRUE;
3121291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3122291a2b48SSukumar Swaminathan
3123291a2b48SSukumar Swaminathan if (!fpDmpFile) {
3124291a2b48SSukumar Swaminathan return (1);
3125291a2b48SSukumar Swaminathan }
3126291a2b48SSukumar Swaminathan
3127291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_PORT_PTRS, &pBuf, &bufLen);
3128291a2b48SSukumar Swaminathan if (status != 0) {
3129291a2b48SSukumar Swaminathan return (status);
3130291a2b48SSukumar Swaminathan }
3131291a2b48SSukumar Swaminathan
3132291a2b48SSukumar Swaminathan status =
3133291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_PORT_PTRS,
3134291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_PORT_PTRS, fSwap);
3135291a2b48SSukumar Swaminathan
3136291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3137291a2b48SSukumar Swaminathan
3138291a2b48SSukumar Swaminathan return (status);
3139291a2b48SSukumar Swaminathan
314082527734SSukumar Swaminathan } /* emlxs_dump_port_pointers() */
3141291a2b48SSukumar Swaminathan
3142291a2b48SSukumar Swaminathan
3143291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_rings(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)3144291a2b48SSukumar Swaminathan emlxs_dump_rings(
3145291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3146291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3147291a2b48SSukumar Swaminathan {
3148291a2b48SSukumar Swaminathan uint32_t status;
3149291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
3150291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
3151291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
3152291a2b48SSukumar Swaminathan
3153291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3154291a2b48SSukumar Swaminathan fSwap = TRUE;
3155291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3156291a2b48SSukumar Swaminathan
3157291a2b48SSukumar Swaminathan if (!fpDmpFile) {
3158291a2b48SSukumar Swaminathan return (1);
3159291a2b48SSukumar Swaminathan }
3160291a2b48SSukumar Swaminathan
3161291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_RINGS, &pBuf, &bufLen);
3162291a2b48SSukumar Swaminathan if (status != 0) {
3163291a2b48SSukumar Swaminathan return (status);
3164291a2b48SSukumar Swaminathan }
3165291a2b48SSukumar Swaminathan
3166291a2b48SSukumar Swaminathan status =
3167291a2b48SSukumar Swaminathan emlxs_dump_host_struct(fpDmpFile, pBuf, bufLen, sizeof (IOCB),
3168291a2b48SSukumar Swaminathan bufLen / sizeof (IOCB), SID_RINGS, LEGEND_SLI_STRUCTURES,
3169291a2b48SSukumar Swaminathan LEGEND_RINGS, fSwap);
3170291a2b48SSukumar Swaminathan
3171291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3172291a2b48SSukumar Swaminathan
3173291a2b48SSukumar Swaminathan return (status);
3174291a2b48SSukumar Swaminathan
317582527734SSukumar Swaminathan } /* emlxs_dump_rings() */
3176291a2b48SSukumar Swaminathan
3177291a2b48SSukumar Swaminathan
3178291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_drv_internals(emlxs_hba_t * hba,emlxs_file_t * fpDmpFile)3179291a2b48SSukumar Swaminathan emlxs_dump_drv_internals(
3180291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3181291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3182291a2b48SSukumar Swaminathan {
3183291a2b48SSukumar Swaminathan uint32_t status;
3184291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
3185291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
3186291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
3187291a2b48SSukumar Swaminathan
3188291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3189291a2b48SSukumar Swaminathan fSwap = TRUE;
3190291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3191291a2b48SSukumar Swaminathan
3192291a2b48SSukumar Swaminathan if (!fpDmpFile) {
3193291a2b48SSukumar Swaminathan return (1);
3194291a2b48SSukumar Swaminathan }
3195291a2b48SSukumar Swaminathan
3196291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_INTERNAL, &pBuf, &bufLen);
3197291a2b48SSukumar Swaminathan if (status != 0) {
3198291a2b48SSukumar Swaminathan return (status);
3199291a2b48SSukumar Swaminathan }
3200291a2b48SSukumar Swaminathan
3201291a2b48SSukumar Swaminathan status =
3202291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_INTERNAL_SOL,
3203291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_DRIVER_SPEC, fSwap);
3204291a2b48SSukumar Swaminathan
3205291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen);
3206291a2b48SSukumar Swaminathan
3207291a2b48SSukumar Swaminathan return (status);
3208291a2b48SSukumar Swaminathan
320982527734SSukumar Swaminathan } /* emlxs_dump_drv_internals() */
3210291a2b48SSukumar Swaminathan
3211291a2b48SSukumar Swaminathan
3212291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_sli_interface(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile,uint32_t dump_type)3213291a2b48SSukumar Swaminathan emlxs_dump_sli_interface(
3214291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3215291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
3216291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile,
3217291a2b48SSukumar Swaminathan uint32_t dump_type)
3218291a2b48SSukumar Swaminathan {
321982527734SSukumar Swaminathan
322082527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
322182527734SSukumar Swaminathan /* HBA should be in OFFLINE state here */
322282527734SSukumar Swaminathan
322382527734SSukumar Swaminathan (void) emlxs_dump_sli_regs(hba, fpDmpFile);
322482527734SSukumar Swaminathan (void) emlxs_dump_slim(hba, fpTxtFile, fpDmpFile, dump_type);
322582527734SSukumar Swaminathan (void) emlxs_dump_pcb(hba, fpDmpFile);
322682527734SSukumar Swaminathan (void) emlxs_dump_mbox(hba, fpDmpFile);
322782527734SSukumar Swaminathan (void) emlxs_dump_host_pointers(hba, fpDmpFile);
322882527734SSukumar Swaminathan (void) emlxs_dump_port_pointers(hba, fpDmpFile);
322982527734SSukumar Swaminathan (void) emlxs_dump_rings(hba, fpDmpFile);
323082527734SSukumar Swaminathan }
323182527734SSukumar Swaminathan
3232291a2b48SSukumar Swaminathan (void) emlxs_dump_drv_internals(hba, fpDmpFile);
3233291a2b48SSukumar Swaminathan
3234291a2b48SSukumar Swaminathan return (0);
3235291a2b48SSukumar Swaminathan
323682527734SSukumar Swaminathan } /* emlxs_dump_sli_interface() */
3237291a2b48SSukumar Swaminathan
3238291a2b48SSukumar Swaminathan
3239291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_menlo_log(emlxs_hba_t * hba,emlxs_file_t * fpCeeFile)324082527734SSukumar Swaminathan emlxs_dump_menlo_log(
3241291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3242291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile)
3243291a2b48SSukumar Swaminathan {
3244291a2b48SSukumar Swaminathan uint32_t RmStatus;
3245291a2b48SSukumar Swaminathan int i, j;
3246291a2b48SSukumar Swaminathan int isWrapped = FALSE;
3247291a2b48SSukumar Swaminathan char buf1[2048] = { 0 };
3248291a2b48SSukumar Swaminathan char buf2[2048] = { 0 };
3249291a2b48SSukumar Swaminathan
3250291a2b48SSukumar Swaminathan /* Get Config Command vars */
3251291a2b48SSukumar Swaminathan menlo_get_config_rsp_t GcBuf;
3252291a2b48SSukumar Swaminathan menlo_get_config_rsp_t *pGcBuf = &GcBuf;
3253291a2b48SSukumar Swaminathan
3254291a2b48SSukumar Swaminathan /* Get Log Config Command vars */
3255291a2b48SSukumar Swaminathan uint32_t LcBufSize;
3256291a2b48SSukumar Swaminathan menlo_rsp_t *pLcBuf = NULL;
3257291a2b48SSukumar Swaminathan uint32_t NumLogs;
3258291a2b48SSukumar Swaminathan menlo_log_t *pLcEntry;
3259291a2b48SSukumar Swaminathan
3260291a2b48SSukumar Swaminathan /* Get Log Data Command vars */
3261291a2b48SSukumar Swaminathan uint32_t LdBufSize;
3262291a2b48SSukumar Swaminathan menlo_rsp_t *pLdBuf = NULL;
3263291a2b48SSukumar Swaminathan uint16_t Head;
3264291a2b48SSukumar Swaminathan uint8_t *pLogEntry;
3265291a2b48SSukumar Swaminathan char *pLogString;
3266291a2b48SSukumar Swaminathan
3267291a2b48SSukumar Swaminathan /* Get Panic Log Command vars */
3268291a2b48SSukumar Swaminathan uint32_t PlBufSize;
3269291a2b48SSukumar Swaminathan menlo_rsp_t *pPlBuf = NULL;
3270291a2b48SSukumar Swaminathan uint32_t PanicLogEntryCount;
3271291a2b48SSukumar Swaminathan uint32_t PanicLogEntrySize;
3272291a2b48SSukumar Swaminathan
3273*a3170057SPaul Winder if (hba->model_info.vendor_id != PCI_VENDOR_ID_EMULEX ||
3274*a3170057SPaul Winder hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
327582527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER);
327682527734SSukumar Swaminathan }
327782527734SSukumar Swaminathan
3278291a2b48SSukumar Swaminathan /* First, issue a GetConfig command, which gives us */
3279291a2b48SSukumar Swaminathan /* the Log Config and Panic Log sizes */
3280291a2b48SSukumar Swaminathan
3281291a2b48SSukumar Swaminathan RmStatus =
3282291a2b48SSukumar Swaminathan emlxs_menlo_get_cfg(hba, pGcBuf, sizeof (menlo_get_config_rsp_t));
3283291a2b48SSukumar Swaminathan
3284291a2b48SSukumar Swaminathan if (RmStatus != 0) {
3285291a2b48SSukumar Swaminathan goto done;
3286291a2b48SSukumar Swaminathan }
3287291a2b48SSukumar Swaminathan
3288291a2b48SSukumar Swaminathan LcBufSize = GcBuf.log_cfg_size + 8;
3289291a2b48SSukumar Swaminathan PlBufSize = GcBuf.panic_log_size;
3290291a2b48SSukumar Swaminathan
3291291a2b48SSukumar Swaminathan pLcBuf = (menlo_rsp_t *)kmem_zalloc(LcBufSize, KM_SLEEP);
3292291a2b48SSukumar Swaminathan
3293291a2b48SSukumar Swaminathan RmStatus = emlxs_menlo_get_logcfg(hba, pLcBuf, LcBufSize);
3294291a2b48SSukumar Swaminathan
3295291a2b48SSukumar Swaminathan if (RmStatus != 0) {
3296291a2b48SSukumar Swaminathan goto done;
3297291a2b48SSukumar Swaminathan }
3298291a2b48SSukumar Swaminathan
3299291a2b48SSukumar Swaminathan buf1[0] = 0;
3300291a2b48SSukumar Swaminathan RmStatus =
3301291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1,
3302291a2b48SSukumar Swaminathan LEGEND_MENLO_LOG_CONFIG, LEGEND_NULL, 0);
3303291a2b48SSukumar Swaminathan
3304291a2b48SSukumar Swaminathan NumLogs = pLcBuf->log_cfg.num_logs;
3305291a2b48SSukumar Swaminathan pLcEntry = (menlo_log_t *)&pLcBuf->log_cfg.data;
3306291a2b48SSukumar Swaminathan
3307291a2b48SSukumar Swaminathan buf1[0] = 0;
33088f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "LogId Entries Size Name");
33098f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
33108f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n----- ------- ---- ----");
33118f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3312291a2b48SSukumar Swaminathan
3313291a2b48SSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3314291a2b48SSukumar Swaminathan
3315291a2b48SSukumar Swaminathan for (i = 0; i < (int)NumLogs; i++) {
3316291a2b48SSukumar Swaminathan buf1[0] = 0;
33178f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2),
33188f23e9faSHans Rosenfeld "\n %2d %4d %4d %s",
3319291a2b48SSukumar Swaminathan pLcEntry[i].id,
3320291a2b48SSukumar Swaminathan pLcEntry[i].num_entries,
3321291a2b48SSukumar Swaminathan pLcEntry[i].entry_size, pLcEntry[i].name);
33228f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3323291a2b48SSukumar Swaminathan RmStatus =
3324291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3325291a2b48SSukumar Swaminathan }
3326291a2b48SSukumar Swaminathan
3327291a2b48SSukumar Swaminathan /* Now issue a series of GetLogData commands, */
3328291a2b48SSukumar Swaminathan /* which gives us the actual Logs */
3329291a2b48SSukumar Swaminathan
3330291a2b48SSukumar Swaminathan for (i = 0; i < (int)NumLogs; i++) {
3331291a2b48SSukumar Swaminathan LdBufSize =
3332291a2b48SSukumar Swaminathan (pLcEntry[i].num_entries *pLcEntry[i].entry_size) + 8;
3333291a2b48SSukumar Swaminathan
3334291a2b48SSukumar Swaminathan pLdBuf = (menlo_rsp_t *)kmem_zalloc(LdBufSize, KM_SLEEP);
3335291a2b48SSukumar Swaminathan
3336291a2b48SSukumar Swaminathan RmStatus = emlxs_menlo_get_log(hba, i, pLdBuf, LdBufSize);
3337291a2b48SSukumar Swaminathan
3338291a2b48SSukumar Swaminathan if (RmStatus != 0) {
3339291a2b48SSukumar Swaminathan goto done;
3340291a2b48SSukumar Swaminathan }
3341291a2b48SSukumar Swaminathan
3342291a2b48SSukumar Swaminathan /* print a caption for the current log */
3343291a2b48SSukumar Swaminathan buf1[0] = 0;
33448f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n\nLog %d:", i);
33458f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
33468f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), " %s", pLcEntry[i].name);
33478f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
33488f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n");
3349291a2b48SSukumar Swaminathan
3350291a2b48SSukumar Swaminathan for (j = 0; j < 75; j++) {
33518f23e9faSHans Rosenfeld (void) strlcat(buf2, "-", sizeof (buf2));
3352291a2b48SSukumar Swaminathan }
3353291a2b48SSukumar Swaminathan
33548f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3355291a2b48SSukumar Swaminathan RmStatus =
3356291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3357291a2b48SSukumar Swaminathan
3358291a2b48SSukumar Swaminathan /* check the head entry to determine whether */
3359291a2b48SSukumar Swaminathan /* the log has wrapped or not */
3360291a2b48SSukumar Swaminathan Head = pLdBuf->log.head;
3361291a2b48SSukumar Swaminathan pLogEntry = (uint8_t *)&pLdBuf->log.data;
3362291a2b48SSukumar Swaminathan pLogString =
3363291a2b48SSukumar Swaminathan (char *)&(pLogEntry[Head *pLcEntry[i].entry_size]);
3364291a2b48SSukumar Swaminathan
3365291a2b48SSukumar Swaminathan isWrapped = FALSE;
3366291a2b48SSukumar Swaminathan if (strlen(pLogString) != 0) {
3367291a2b48SSukumar Swaminathan isWrapped = TRUE;
3368291a2b48SSukumar Swaminathan }
3369291a2b48SSukumar Swaminathan
3370291a2b48SSukumar Swaminathan /* if log is wrapped, get entries from the */
3371291a2b48SSukumar Swaminathan /* Head through the End */
3372291a2b48SSukumar Swaminathan if (isWrapped) {
3373291a2b48SSukumar Swaminathan for (j = Head; j < (int)pLcEntry[i].num_entries; j++) {
3374291a2b48SSukumar Swaminathan pLogString =
3375291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j *
3376291a2b48SSukumar Swaminathan pLcEntry[i].entry_size]);
3377291a2b48SSukumar Swaminathan buf1[0] = 0;
33788f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2),
33798f23e9faSHans Rosenfeld "\n%3d: %s", j, pLogString);
33808f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3381291a2b48SSukumar Swaminathan RmStatus =
3382291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1,
3383291a2b48SSukumar Swaminathan 0, 0, 1);
3384291a2b48SSukumar Swaminathan }
3385291a2b48SSukumar Swaminathan }
3386291a2b48SSukumar Swaminathan
3387291a2b48SSukumar Swaminathan /* if wrapped or not, get entries from the Top */
3388291a2b48SSukumar Swaminathan /* through the Head */
3389291a2b48SSukumar Swaminathan for (j = 0; j < Head; j++) {
3390291a2b48SSukumar Swaminathan pLogString =
3391291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j * pLcEntry[i].entry_size]);
3392291a2b48SSukumar Swaminathan buf1[0] = 0;
33938f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n%3d: %s", j,
33948f23e9faSHans Rosenfeld pLogString);
33958f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3396291a2b48SSukumar Swaminathan RmStatus =
3397291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0,
3398291a2b48SSukumar Swaminathan 1);
3399291a2b48SSukumar Swaminathan }
3400291a2b48SSukumar Swaminathan } /* end for i */
3401291a2b48SSukumar Swaminathan
3402291a2b48SSukumar Swaminathan /* Now issue a GetPanicLog command, which gives us the Panic Log */
3403291a2b48SSukumar Swaminathan
3404291a2b48SSukumar Swaminathan /* print a caption for the current log */
34058f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_MENLO_LOG_PANIC_REGS, sizeof (buf1));
3406291a2b48SSukumar Swaminathan buf2[0] = 0;
3407291a2b48SSukumar Swaminathan for (j = 0; j < 75; j++) {
34088f23e9faSHans Rosenfeld (void) strlcat(buf2, "-", sizeof (buf2));
3409291a2b48SSukumar Swaminathan }
34108f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3411291a2b48SSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3412291a2b48SSukumar Swaminathan
3413291a2b48SSukumar Swaminathan pPlBuf = (menlo_rsp_t *)kmem_zalloc(PlBufSize, KM_SLEEP);
3414291a2b48SSukumar Swaminathan
3415291a2b48SSukumar Swaminathan RmStatus = emlxs_menlo_get_paniclog(hba, pPlBuf, PlBufSize);
3416291a2b48SSukumar Swaminathan
3417291a2b48SSukumar Swaminathan if (RmStatus == 0) {
3418291a2b48SSukumar Swaminathan buf1[0] = 0;
34198f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nType = %x",
3420291a2b48SSukumar Swaminathan pPlBuf->panic_log.type);
34218f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
34228f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsEpc = %08x",
3423291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_epc);
34248f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
34258f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsCp0Cause = %08x",
3426291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_cp0_cause);
34278f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
34288f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsCp0Stat = %08x",
3429291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_cp0_status);
34308f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3431291a2b48SSukumar Swaminathan RmStatus =
3432291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3433291a2b48SSukumar Swaminathan
3434291a2b48SSukumar Swaminathan buf1[0] = 0;
3435291a2b48SSukumar Swaminathan for (i = 0; i < MENLO_NUM_GP_REGS; i++) {
34368f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2),
34378f23e9faSHans Rosenfeld "\nRegsGp[%02x] = %08x", i,
3438291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_gp[i]);
34398f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3440291a2b48SSukumar Swaminathan }
3441291a2b48SSukumar Swaminathan RmStatus =
3442291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3443291a2b48SSukumar Swaminathan
3444291a2b48SSukumar Swaminathan buf1[0] = 0;
34458f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nLogPresent = %08x",
3446291a2b48SSukumar Swaminathan pPlBuf->panic_log.log_present);
34478f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3448291a2b48SSukumar Swaminathan PanicLogEntryCount = pPlBuf->panic_log.num_entries;
34498f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nNumEntries = %08x",
3450291a2b48SSukumar Swaminathan PanicLogEntryCount);
34518f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3452291a2b48SSukumar Swaminathan PanicLogEntrySize = pPlBuf->panic_log.entry_size;
34538f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nEntrySize = %d.",
3454291a2b48SSukumar Swaminathan PanicLogEntrySize);
34558f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
34568f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nHead Entry = %d.",
3457291a2b48SSukumar Swaminathan pPlBuf->panic_log.head);
34588f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1));
3459291a2b48SSukumar Swaminathan RmStatus =
3460291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3461291a2b48SSukumar Swaminathan
3462291a2b48SSukumar Swaminathan /* print a caption for the current log */
34638f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_MENLO_LOG_PANIC_LOGS,
34648f23e9faSHans Rosenfeld sizeof (buf1));
3465291a2b48SSukumar Swaminathan buf2[0] = 0;
3466291a2b48SSukumar Swaminathan for (j = 0; j < 75; j++) {
34678f23e9faSHans Rosenfeld (void) strlcat(buf2, "-", sizeof (buf2));
3468291a2b48SSukumar Swaminathan }
34698f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf2));
3470291a2b48SSukumar Swaminathan RmStatus =
3471291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
3472291a2b48SSukumar Swaminathan
3473291a2b48SSukumar Swaminathan /* check the head entry to determine whether the */
3474291a2b48SSukumar Swaminathan /* log has wrapped or not */
3475291a2b48SSukumar Swaminathan Head = pPlBuf->panic_log.head;
3476291a2b48SSukumar Swaminathan pLogEntry = (uint8_t *)&pPlBuf->panic_log.data;
3477291a2b48SSukumar Swaminathan pLogString = (char *)&(pLogEntry[Head * PanicLogEntrySize]);
3478291a2b48SSukumar Swaminathan isWrapped = FALSE;
3479291a2b48SSukumar Swaminathan if (strlen(pLogString) != 0) {
3480291a2b48SSukumar Swaminathan isWrapped = TRUE;
3481291a2b48SSukumar Swaminathan }
3482291a2b48SSukumar Swaminathan
3483291a2b48SSukumar Swaminathan /* if log is wrapped, get entries from the */
3484291a2b48SSukumar Swaminathan /* Head through the End */
3485291a2b48SSukumar Swaminathan if (isWrapped) {
3486291a2b48SSukumar Swaminathan for (j = Head; j < (int)PanicLogEntryCount; j++) {
3487291a2b48SSukumar Swaminathan pLogString =
3488291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j *
3489291a2b48SSukumar Swaminathan PanicLogEntrySize]);
3490291a2b48SSukumar Swaminathan buf1[0] = 0;
34918f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2),
34928f23e9faSHans Rosenfeld "\n%3d: %s", j, pLogString);
34938f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf2));
3494291a2b48SSukumar Swaminathan RmStatus =
3495291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1,
3496291a2b48SSukumar Swaminathan 0, 0, 1);
3497291a2b48SSukumar Swaminathan }
3498291a2b48SSukumar Swaminathan }
3499291a2b48SSukumar Swaminathan /* if wrapped or not, get entries from the Top */
3500291a2b48SSukumar Swaminathan /* through the Head */
3501291a2b48SSukumar Swaminathan for (j = 0; j < Head; j++) {
3502291a2b48SSukumar Swaminathan pLogString =
3503291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j * PanicLogEntrySize]);
3504291a2b48SSukumar Swaminathan buf1[0] = 0;
35058f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n%3d: %s", j,
35068f23e9faSHans Rosenfeld pLogString);
35078f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf2));
3508291a2b48SSukumar Swaminathan RmStatus =
3509291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0,
3510291a2b48SSukumar Swaminathan 1);
3511291a2b48SSukumar Swaminathan }
3512291a2b48SSukumar Swaminathan }
3513291a2b48SSukumar Swaminathan
3514291a2b48SSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, "\n\n", 0, 0, 1);
3515291a2b48SSukumar Swaminathan
3516291a2b48SSukumar Swaminathan done:
3517291a2b48SSukumar Swaminathan
3518291a2b48SSukumar Swaminathan if (pLdBuf != 0) {
3519291a2b48SSukumar Swaminathan kmem_free(pLdBuf, LdBufSize);
3520291a2b48SSukumar Swaminathan }
3521291a2b48SSukumar Swaminathan
3522291a2b48SSukumar Swaminathan if (pLcBuf != 0) {
3523291a2b48SSukumar Swaminathan kmem_free(pLcBuf, LcBufSize);
3524291a2b48SSukumar Swaminathan }
3525291a2b48SSukumar Swaminathan
3526291a2b48SSukumar Swaminathan if (pPlBuf != 0) {
3527291a2b48SSukumar Swaminathan kmem_free(pPlBuf, PlBufSize);
3528291a2b48SSukumar Swaminathan }
3529291a2b48SSukumar Swaminathan
3530291a2b48SSukumar Swaminathan return (RmStatus);
3531291a2b48SSukumar Swaminathan
353282527734SSukumar Swaminathan } /* emlxs_dump_menlo_log() */
3533291a2b48SSukumar Swaminathan
3534291a2b48SSukumar Swaminathan
3535291a2b48SSukumar Swaminathan static uint32_t
emlxs_dump_saturn_log(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpDmpFile)353682527734SSukumar Swaminathan emlxs_dump_saturn_log(
3537291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3538291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile,
3539291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile)
3540291a2b48SSukumar Swaminathan {
3541291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
3542291a2b48SSukumar Swaminathan MAILBOXQ *mbq;
3543291a2b48SSukumar Swaminathan MAILBOX *mb;
354482527734SSukumar Swaminathan MATCHMAP *mp = NULL;
3545291a2b48SSukumar Swaminathan uint32_t status;
3546291a2b48SSukumar Swaminathan uint32_t logSize = 0;
3547291a2b48SSukumar Swaminathan uintptr_t tempAddress;
3548291a2b48SSukumar Swaminathan int fSwap = FALSE;
3549291a2b48SSukumar Swaminathan uint32_t i;
3550291a2b48SSukumar Swaminathan uint32_t block_size;
3551291a2b48SSukumar Swaminathan uint32_t offset;
3552291a2b48SSukumar Swaminathan
3553291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN
3554291a2b48SSukumar Swaminathan fSwap = TRUE;
3555291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */
3556291a2b48SSukumar Swaminathan
355782527734SSukumar Swaminathan if (hba->model_info.chip != EMLXS_SATURN_CHIP) {
3558291a2b48SSukumar Swaminathan return (1);
3559291a2b48SSukumar Swaminathan }
356082527734SSukumar Swaminathan
356182527734SSukumar Swaminathan mbq =
356282527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
356382527734SSukumar Swaminathan
3564291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq;
3565291a2b48SSukumar Swaminathan
3566291a2b48SSukumar Swaminathan /* Step 1: Call MBX_READ_EVENT_LOG_STATUS to get the log size. */
3567291a2b48SSukumar Swaminathan for (i = 0; i < 10; i++) {
3568291a2b48SSukumar Swaminathan bzero((void *)mb, MAILBOX_CMD_BSIZE);
3569291a2b48SSukumar Swaminathan mb->mbxCommand = MBX_READ_EVENT_LOG_STATUS;
357082527734SSukumar Swaminathan mbq->mbox_cmpl = NULL;
3571291a2b48SSukumar Swaminathan
357282527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) ==
3573291a2b48SSukumar Swaminathan MBX_SUCCESS) {
3574291a2b48SSukumar Swaminathan break;
3575291a2b48SSukumar Swaminathan }
3576291a2b48SSukumar Swaminathan
3577291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
3578291a2b48SSukumar Swaminathan "Unable to read event log status. status=%x",
3579291a2b48SSukumar Swaminathan mb->mbxStatus);
3580291a2b48SSukumar Swaminathan
3581291a2b48SSukumar Swaminathan if ((mb->mbxStatus & 0xFFFF) == MBXERR_NOT_SUPPORTED ||
3582291a2b48SSukumar Swaminathan (mb->mbxStatus & 0xFFFF) == MBX_DRVR_ERROR) {
3583291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
3584291a2b48SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP,
3585291a2b48SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG,
3586291a2b48SSukumar Swaminathan LEGEND_NV_LOG_DRIVER_NOT_SUPPORTED, 0);
3587291a2b48SSukumar Swaminathan
3588291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
3589291a2b48SSukumar Swaminathan return (1);
3590291a2b48SSukumar Swaminathan }
3591291a2b48SSukumar Swaminathan
3592291a2b48SSukumar Swaminathan /* The call to get the log size simply fails. */
3593291a2b48SSukumar Swaminathan /* Retry up to 10 times. */
3594291a2b48SSukumar Swaminathan if ((mb->mbxStatus & 0xFFFF) != MBX_BUSY) {
3595291a2b48SSukumar Swaminathan /* Mailbox fails for some unknown reason. */
3596291a2b48SSukumar Swaminathan /* Put something in the txt to indicate this case. */
3597291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
3598291a2b48SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP,
3599291a2b48SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG,
3600291a2b48SSukumar Swaminathan LEGEND_NV_LOG_STATUS_ERROR, 0);
3601291a2b48SSukumar Swaminathan
3602291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
3603291a2b48SSukumar Swaminathan return (1);
3604291a2b48SSukumar Swaminathan }
3605291a2b48SSukumar Swaminathan }
3606291a2b48SSukumar Swaminathan
3607291a2b48SSukumar Swaminathan if (i >= 10) {
3608291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
3609291a2b48SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP, LEGEND_NON_VOLATILE_LOG,
3610291a2b48SSukumar Swaminathan LEGEND_NV_LOG_STATUS_ERROR, 0);
3611291a2b48SSukumar Swaminathan
3612291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
3613291a2b48SSukumar Swaminathan return (1);
3614291a2b48SSukumar Swaminathan }
3615291a2b48SSukumar Swaminathan
3616291a2b48SSukumar Swaminathan /* Step 2: Use the log size from step 1 to call MBX_READ_EVENT_LOG */
3617291a2b48SSukumar Swaminathan logSize = mb->un.varLogStat.size;
361882527734SSukumar Swaminathan
361982527734SSukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, logSize)) == 0) {
3620291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
362182527734SSukumar Swaminathan "Unable to allocate receive buffer. "
362282527734SSukumar Swaminathan "size=%d",
362382527734SSukumar Swaminathan logSize);
3624291a2b48SSukumar Swaminathan
3625291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
3626291a2b48SSukumar Swaminathan return (1);
3627291a2b48SSukumar Swaminathan }
3628291a2b48SSukumar Swaminathan
3629291a2b48SSukumar Swaminathan for (offset = 0; offset < logSize; offset = offset + 1024) {
3630291a2b48SSukumar Swaminathan if (logSize - offset < 1024) {
3631291a2b48SSukumar Swaminathan block_size = logSize - offset;
3632291a2b48SSukumar Swaminathan } else {
3633291a2b48SSukumar Swaminathan block_size = 1024;
3634291a2b48SSukumar Swaminathan }
3635291a2b48SSukumar Swaminathan
363682527734SSukumar Swaminathan tempAddress = (uintptr_t)(mp->phys + offset);
3637291a2b48SSukumar Swaminathan
3638291a2b48SSukumar Swaminathan bzero((void *)mb, MAILBOX_CMD_BSIZE);
3639291a2b48SSukumar Swaminathan mb->mbxCommand = MBX_READ_EVENT_LOG; /* 0x38 */
3640291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.read_log = 1; /* read log */
3641291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.mbox_rsp = 0; /* not using Mailbox */
3642291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.offset = offset;
3643291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.tus.f.bdeFlags = 0x0;
3644291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.tus.f.bdeSize = block_size;
364582527734SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.addrLow = PADDR_LO(tempAddress);
364682527734SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.addrHigh = PADDR_HI(tempAddress);
364782527734SSukumar Swaminathan mbq->mbox_cmpl = NULL;
3648291a2b48SSukumar Swaminathan
364982527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
3650291a2b48SSukumar Swaminathan MBX_SUCCESS) {
3651291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
3652291a2b48SSukumar Swaminathan "Unable to read event log. status=%x",
3653291a2b48SSukumar Swaminathan mb->mbxStatus);
3654291a2b48SSukumar Swaminathan
3655a9800bebSGarrett D'Amore emlxs_mem_buf_free(hba, mp);
3656291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
3657291a2b48SSukumar Swaminathan return (1);
3658291a2b48SSukumar Swaminathan }
3659291a2b48SSukumar Swaminathan }
3660291a2b48SSukumar Swaminathan
3661291a2b48SSukumar Swaminathan /* Step 3: Dump the log to the DMP file as raw data. */
3662291a2b48SSukumar Swaminathan
3663291a2b48SSukumar Swaminathan /* Write a string to text file to direct the user to the DMP */
3664291a2b48SSukumar Swaminathan /* file for the actual log. */
3665291a2b48SSukumar Swaminathan status =
3666291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, NV_LOG_INCLUDED_IN_DMP,
3667291a2b48SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 0);
3668291a2b48SSukumar Swaminathan
3669291a2b48SSukumar Swaminathan /* Write the real log to the DMP file. */
367082527734SSukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, logSize, DDI_DMA_SYNC_FORKERNEL);
367182527734SSukumar Swaminathan
3672291a2b48SSukumar Swaminathan status =
367382527734SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, mp->virt, logSize,
3674291a2b48SSukumar Swaminathan SID_NON_VOLATILE_LOG, LEGEND_NON_VOLATILE_LOG, LEGEND_NULL,
3675291a2b48SSukumar Swaminathan fSwap);
3676291a2b48SSukumar Swaminathan
3677b3660a96SSukumar Swaminathan #ifdef FMA_SUPPORT
3678b3660a96SSukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mp->dma_handle)
3679b3660a96SSukumar Swaminathan != DDI_FM_OK) {
3680b3660a96SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
3681b3660a96SSukumar Swaminathan &emlxs_invalid_dma_handle_msg,
36828f23e9faSHans Rosenfeld "dump_saturn_log: hdl=%p",
3683b3660a96SSukumar Swaminathan mp->dma_handle);
3684b3660a96SSukumar Swaminathan status = 1;
3685b3660a96SSukumar Swaminathan }
3686b3660a96SSukumar Swaminathan #endif /* FMA_SUPPORT */
3687b3660a96SSukumar Swaminathan
3688a9800bebSGarrett D'Amore emlxs_mem_buf_free(hba, mp);
3689291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ));
3690291a2b48SSukumar Swaminathan return (status);
3691291a2b48SSukumar Swaminathan
369282527734SSukumar Swaminathan } /* emlxs_dump_saturn_log() */
369382527734SSukumar Swaminathan
369482527734SSukumar Swaminathan
369582527734SSukumar Swaminathan static uint32_t
emlxs_dump_tigershark_log(emlxs_hba_t * hba,emlxs_file_t * fpTxtFile,emlxs_file_t * fpCeeFile)369682527734SSukumar Swaminathan emlxs_dump_tigershark_log(
369782527734SSukumar Swaminathan emlxs_hba_t *hba,
369882527734SSukumar Swaminathan emlxs_file_t *fpTxtFile,
369982527734SSukumar Swaminathan emlxs_file_t *fpCeeFile)
370082527734SSukumar Swaminathan {
370182527734SSukumar Swaminathan emlxs_port_t *port = &PPORT;
370282527734SSukumar Swaminathan uint32_t rval = 0;
370382527734SSukumar Swaminathan uint32_t offset;
370482527734SSukumar Swaminathan uint32_t log_size;
370582527734SSukumar Swaminathan uint32_t xfer_size;
370682527734SSukumar Swaminathan uint32_t buffer_size;
370782527734SSukumar Swaminathan uint8_t *buffer = NULL;
370882527734SSukumar Swaminathan uint8_t *bptr;
370982527734SSukumar Swaminathan uint8_t *payload;
371082527734SSukumar Swaminathan MAILBOXQ *mbq = NULL;
371182527734SSukumar Swaminathan MAILBOX4 *mb = NULL;
371282527734SSukumar Swaminathan MATCHMAP *mp = NULL;
371382527734SSukumar Swaminathan IOCTL_COMMON_MANAGE_FAT *fat;
371482527734SSukumar Swaminathan mbox_req_hdr_t *hdr_req;
371582527734SSukumar Swaminathan
3716a9800bebSGarrett D'Amore if ((hba->model_info.chip != EMLXS_BE2_CHIP) &&
3717a9800bebSGarrett D'Amore (hba->model_info.chip != EMLXS_BE3_CHIP)) {
371882527734SSukumar Swaminathan return (1);
371982527734SSukumar Swaminathan }
372082527734SSukumar Swaminathan
372182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
372282527734SSukumar Swaminathan "Querying FAT...");
372382527734SSukumar Swaminathan
372482527734SSukumar Swaminathan mbq = (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ),
372582527734SSukumar Swaminathan KM_SLEEP);
372682527734SSukumar Swaminathan
372782527734SSukumar Swaminathan mb = (MAILBOX4*)mbq;
372882527734SSukumar Swaminathan
372982527734SSukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, (sizeof (mbox_req_hdr_t) +
373082527734SSukumar Swaminathan sizeof (IOCTL_COMMON_MANAGE_FAT) + BE_MAX_XFER_SIZE))) == NULL) {
373182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
373282527734SSukumar Swaminathan "Unable to allocate FAT buffer.");
373382527734SSukumar Swaminathan
373482527734SSukumar Swaminathan rval = 1;
373582527734SSukumar Swaminathan goto done;
373682527734SSukumar Swaminathan }
373782527734SSukumar Swaminathan
373882527734SSukumar Swaminathan /* Query FAT */
373982527734SSukumar Swaminathan mb->un.varSLIConfig.be.embedded = 0;
3740a9800bebSGarrett D'Amore mbq->nonembed = (void *)mp;
374182527734SSukumar Swaminathan mbq->mbox_cmpl = NULL;
374282527734SSukumar Swaminathan
374382527734SSukumar Swaminathan mb->mbxCommand = MBX_SLI_CONFIG;
374482527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST;
374582527734SSukumar Swaminathan
374682527734SSukumar Swaminathan hdr_req = (mbox_req_hdr_t *)mp->virt;
374782527734SSukumar Swaminathan hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON;
374882527734SSukumar Swaminathan hdr_req->opcode = COMMON_OPCODE_MANAGE_FAT;
374982527734SSukumar Swaminathan hdr_req->timeout = 0;
375082527734SSukumar Swaminathan hdr_req->req_length = sizeof (IOCTL_COMMON_MANAGE_FAT);
375182527734SSukumar Swaminathan
375282527734SSukumar Swaminathan fat = (IOCTL_COMMON_MANAGE_FAT *)(hdr_req + 1);
375382527734SSukumar Swaminathan fat->params.request.fat_operation = QUERY_FAT;
375482527734SSukumar Swaminathan fat->params.request.read_log_offset = 0;
375582527734SSukumar Swaminathan fat->params.request.read_log_length = 0;
375682527734SSukumar Swaminathan fat->params.request.data_buffer_size = BE_MAX_XFER_SIZE;
375782527734SSukumar Swaminathan
375882527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
375982527734SSukumar Swaminathan MBX_SUCCESS) {
376082527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
376182527734SSukumar Swaminathan "FAT Query failed. status=%x",
376282527734SSukumar Swaminathan mb->mbxStatus);
376382527734SSukumar Swaminathan
376482527734SSukumar Swaminathan rval = 1;
376582527734SSukumar Swaminathan goto done;
376682527734SSukumar Swaminathan }
376782527734SSukumar Swaminathan
376882527734SSukumar Swaminathan log_size = fat->params.response.log_size;
376982527734SSukumar Swaminathan buffer_size = fat->params.response.log_size;
377082527734SSukumar Swaminathan
377182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
377282527734SSukumar Swaminathan "FAT: log_size=%d", log_size);
377382527734SSukumar Swaminathan
3774a9800bebSGarrett D'Amore if (buffer_size == 0) {
3775a9800bebSGarrett D'Amore goto done;
3776a9800bebSGarrett D'Amore }
377782527734SSukumar Swaminathan
3778a9800bebSGarrett D'Amore if ((buffer = (uint8_t *)kmem_alloc(
3779a9800bebSGarrett D'Amore buffer_size, KM_NOSLEEP)) == NULL) {
3780a9800bebSGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
3781a9800bebSGarrett D'Amore "Unable to allocate log buffer.");
3782a9800bebSGarrett D'Amore
3783a9800bebSGarrett D'Amore rval = 1;
3784a9800bebSGarrett D'Amore goto done;
378582527734SSukumar Swaminathan }
3786a9800bebSGarrett D'Amore bzero(buffer, buffer_size);
378782527734SSukumar Swaminathan
378882527734SSukumar Swaminathan /* Upload Log */
378982527734SSukumar Swaminathan bptr = buffer;
379082527734SSukumar Swaminathan offset = 0;
379182527734SSukumar Swaminathan
379282527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
379382527734SSukumar Swaminathan "Uploading log... (%d bytes)", log_size);
379482527734SSukumar Swaminathan
379582527734SSukumar Swaminathan while (log_size) {
379682527734SSukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
379782527734SSukumar Swaminathan bzero((void *) mp->virt, mp->size);
379882527734SSukumar Swaminathan
379982527734SSukumar Swaminathan xfer_size = min(BE_MAX_XFER_SIZE, log_size);
380082527734SSukumar Swaminathan
380182527734SSukumar Swaminathan mb->un.varSLIConfig.be.embedded = 0;
3802a9800bebSGarrett D'Amore mbq->nonembed = (void *)mp;
380382527734SSukumar Swaminathan mbq->mbox_cmpl = NULL;
380482527734SSukumar Swaminathan
380582527734SSukumar Swaminathan mb->mbxCommand = MBX_SLI_CONFIG;
380682527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST;
380782527734SSukumar Swaminathan
380882527734SSukumar Swaminathan hdr_req = (mbox_req_hdr_t *)mp->virt;
380982527734SSukumar Swaminathan hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON;
381082527734SSukumar Swaminathan hdr_req->opcode = COMMON_OPCODE_MANAGE_FAT;
381182527734SSukumar Swaminathan hdr_req->timeout = 0;
381282527734SSukumar Swaminathan hdr_req->req_length =
381382527734SSukumar Swaminathan sizeof (IOCTL_COMMON_MANAGE_FAT) + xfer_size;
381482527734SSukumar Swaminathan
381582527734SSukumar Swaminathan fat = (IOCTL_COMMON_MANAGE_FAT *)(hdr_req + 1);
381682527734SSukumar Swaminathan fat->params.request.fat_operation = RETRIEVE_FAT;
381782527734SSukumar Swaminathan fat->params.request.read_log_offset = offset;
381882527734SSukumar Swaminathan fat->params.request.read_log_length = xfer_size;
381982527734SSukumar Swaminathan fat->params.request.data_buffer_size = BE_MAX_XFER_SIZE;
382082527734SSukumar Swaminathan
382182527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
382282527734SSukumar Swaminathan MBX_SUCCESS) {
382382527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
382482527734SSukumar Swaminathan "Failed to upload log. status=%x",
382582527734SSukumar Swaminathan mb->mbxStatus);
382682527734SSukumar Swaminathan
382782527734SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
382882527734SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_FAT,
382982527734SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG,
383082527734SSukumar Swaminathan LEGEND_NV_LOG_STATUS_ERROR, 0);
383182527734SSukumar Swaminathan
383282527734SSukumar Swaminathan rval = 1;
383382527734SSukumar Swaminathan goto done;
383482527734SSukumar Swaminathan }
383582527734SSukumar Swaminathan
383682527734SSukumar Swaminathan payload = (uint8_t *)(&fat->params.response.data_buffer);
383782527734SSukumar Swaminathan
383882527734SSukumar Swaminathan BE_SWAP32_BCOPY(payload, bptr, xfer_size);
383982527734SSukumar Swaminathan
384082527734SSukumar Swaminathan log_size -= xfer_size;
384182527734SSukumar Swaminathan offset += xfer_size;
384282527734SSukumar Swaminathan bptr += xfer_size;
384382527734SSukumar Swaminathan }
384482527734SSukumar Swaminathan
384582527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
384682527734SSukumar Swaminathan "Log upload complete.");
384782527734SSukumar Swaminathan
384882527734SSukumar Swaminathan /* Write a string to text file to direct the user to the CEE */
384982527734SSukumar Swaminathan /* file for the actual log. */
385082527734SSukumar Swaminathan rval =
385182527734SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, NV_LOG_INCLUDED_IN_FAT,
385282527734SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 0);
385382527734SSukumar Swaminathan
385482527734SSukumar Swaminathan
385582527734SSukumar Swaminathan /* Write the log to the CEE file. */
385682527734SSukumar Swaminathan /* First word is the log size */
385782527734SSukumar Swaminathan bptr = buffer + sizeof (uint32_t);
385882527734SSukumar Swaminathan log_size = buffer_size - sizeof (uint32_t);
385982527734SSukumar Swaminathan rval = emlxs_dump_word_dmpfile(fpCeeFile, (uint8_t *)bptr,
386082527734SSukumar Swaminathan log_size, 0);
386182527734SSukumar Swaminathan
386282527734SSukumar Swaminathan done:
386382527734SSukumar Swaminathan
386482527734SSukumar Swaminathan if (mbq) {
3865a9800bebSGarrett D'Amore emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
386682527734SSukumar Swaminathan }
386782527734SSukumar Swaminathan
386882527734SSukumar Swaminathan if (mp) {
3869a9800bebSGarrett D'Amore emlxs_mem_buf_free(hba, mp);
387082527734SSukumar Swaminathan }
387182527734SSukumar Swaminathan
387282527734SSukumar Swaminathan if (buffer) {
387382527734SSukumar Swaminathan kmem_free(buffer, buffer_size);
387482527734SSukumar Swaminathan }
387582527734SSukumar Swaminathan
387682527734SSukumar Swaminathan if (rval == 0) {
387782527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
387882527734SSukumar Swaminathan "Dump complete.");
387982527734SSukumar Swaminathan }
388082527734SSukumar Swaminathan
388182527734SSukumar Swaminathan return (rval);
388282527734SSukumar Swaminathan
388382527734SSukumar Swaminathan } /* emlxs_dump_tigershark_log() */
3884291a2b48SSukumar Swaminathan
3885291a2b48SSukumar Swaminathan
3886291a2b48SSukumar Swaminathan extern uint32_t
emlxs_dump_user_event(emlxs_hba_t * hba)3887291a2b48SSukumar Swaminathan emlxs_dump_user_event(
3888291a2b48SSukumar Swaminathan emlxs_hba_t *hba)
3889291a2b48SSukumar Swaminathan {
3890291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
3891291a2b48SSukumar Swaminathan uint32_t status;
3892291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile;
3893291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile;
3894291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile;
3895291a2b48SSukumar Swaminathan
3896291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_DUMP_LOCK);
3897291a2b48SSukumar Swaminathan
3898291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
3899291a2b48SSukumar Swaminathan "User Event: Firmware core dump initiated...");
3900291a2b48SSukumar Swaminathan
3901291a2b48SSukumar Swaminathan status =
3902291a2b48SSukumar Swaminathan emlxs_dump_file_create(hba, &fpTxtFile, &fpDmpFile, &fpCeeFile);
3903291a2b48SSukumar Swaminathan if (status != 0) {
3904291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK);
3905291a2b48SSukumar Swaminathan return (1);
3906291a2b48SSukumar Swaminathan }
3907291a2b48SSukumar Swaminathan
3908291a2b48SSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, fpDmpFile);
3909291a2b48SSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, fpDmpFile, DUMP_TYPE_USER);
3910291a2b48SSukumar Swaminathan (void) emlxs_dump_parm_table(hba, fpTxtFile, fpDmpFile);
3911291a2b48SSukumar Swaminathan (void) emlxs_dump_cfg_regions(hba, fpTxtFile, fpDmpFile);
3912291a2b48SSukumar Swaminathan
3913291a2b48SSukumar Swaminathan if (hba->model_info.chip == EMLXS_SATURN_CHIP) {
391482527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI);
391582527734SSukumar Swaminathan (void) emlxs_dump_saturn_log(hba, fpTxtFile, fpDmpFile);
3916291a2b48SSukumar Swaminathan }
3917291a2b48SSukumar Swaminathan
3918a9800bebSGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) ||
3919a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) {
392082527734SSukumar Swaminathan (void) emlxs_dump_tigershark_log(hba, fpTxtFile, fpCeeFile);
392182527734SSukumar Swaminathan }
392282527734SSukumar Swaminathan
392382527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
392482527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_DIAGDI);
3925291a2b48SSukumar Swaminathan }
3926291a2b48SSukumar Swaminathan
3927291a2b48SSukumar Swaminathan (void) emlxs_dump_sli_interface(hba, fpTxtFile, fpDmpFile,
3928291a2b48SSukumar Swaminathan DUMP_TYPE_USER);
3929291a2b48SSukumar Swaminathan
393082527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
3931291a2b48SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI);
3932291a2b48SSukumar Swaminathan }
3933291a2b48SSukumar Swaminathan
3934291a2b48SSukumar Swaminathan (void) emlxs_dump_hba(hba, fpTxtFile, fpDmpFile);
3935291a2b48SSukumar Swaminathan
393682527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI);
3937291a2b48SSukumar Swaminathan
393882527734SSukumar Swaminathan status = emlxs_menlo_set_mode(hba, MENLO_MAINTENANCE_MODE_ENABLE);
393982527734SSukumar Swaminathan if (status == 0) {
394082527734SSukumar Swaminathan (void) emlxs_dump_menlo_log(hba, fpCeeFile);
394182527734SSukumar Swaminathan (void) emlxs_menlo_set_mode(hba,
394282527734SSukumar Swaminathan MENLO_MAINTENANCE_MODE_DISABLE);
3943291a2b48SSukumar Swaminathan }
3944291a2b48SSukumar Swaminathan
394582527734SSukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, fpDmpFile, fpCeeFile);
3946291a2b48SSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, fpDmpFile, fpCeeFile);
3947291a2b48SSukumar Swaminathan
3948291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK);
3949291a2b48SSukumar Swaminathan return (0);
3950291a2b48SSukumar Swaminathan
395182527734SSukumar Swaminathan } /* emlxs_dump_user_event() */
3952291a2b48SSukumar Swaminathan
3953291a2b48SSukumar Swaminathan
3954291a2b48SSukumar Swaminathan extern uint32_t
emlxs_dump_temp_event(emlxs_hba_t * hba,uint32_t tempType,uint32_t temp)3955291a2b48SSukumar Swaminathan emlxs_dump_temp_event(
3956291a2b48SSukumar Swaminathan emlxs_hba_t *hba,
3957291a2b48SSukumar Swaminathan uint32_t tempType,
3958291a2b48SSukumar Swaminathan uint32_t temp)
3959291a2b48SSukumar Swaminathan {
3960291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
3961291a2b48SSukumar Swaminathan uint32_t status;
3962291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile;
3963291a2b48SSukumar Swaminathan
3964291a2b48SSukumar Swaminathan /* misc vars */
3965291a2b48SSukumar Swaminathan char sBuf1[512]; /* general purpose string buffer */
3966291a2b48SSukumar Swaminathan char sBuf2[256]; /* general purpose string buffer */
3967291a2b48SSukumar Swaminathan char sBuf3[256]; /* general purpose string buffer */
3968291a2b48SSukumar Swaminathan
396982527734SSukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
397082527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
397182527734SSukumar Swaminathan "Temperature Event: type=%d temp=%d. "\
397282527734SSukumar Swaminathan "Invalid SLI4 event.",
397382527734SSukumar Swaminathan tempType, temp);
397482527734SSukumar Swaminathan
397582527734SSukumar Swaminathan return (1);
397682527734SSukumar Swaminathan }
397782527734SSukumar Swaminathan
3978291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_DUMP_LOCK);
3979291a2b48SSukumar Swaminathan
3980291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
3981291a2b48SSukumar Swaminathan "Temperature Event: type=%d temp=%d. "\
3982291a2b48SSukumar Swaminathan "Firmware core dump initiated...",
3983291a2b48SSukumar Swaminathan tempType, temp);
3984291a2b48SSukumar Swaminathan
3985291a2b48SSukumar Swaminathan status = emlxs_dump_file_create(hba, &fpTxtFile, 0, 0);
3986291a2b48SSukumar Swaminathan if (status != 0) {
3987291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK);
3988291a2b48SSukumar Swaminathan return (1);
3989291a2b48SSukumar Swaminathan }
3990291a2b48SSukumar Swaminathan
3991291a2b48SSukumar Swaminathan /* Now generate the Dump */
399282527734SSukumar Swaminathan /* Note: ignore return (status); if one part fails, */
3993291a2b48SSukumar Swaminathan /* keep trying to dump more stuff. */
3994291a2b48SSukumar Swaminathan
3995291a2b48SSukumar Swaminathan /* Write a warning at the top of the file */
39968f23e9faSHans Rosenfeld (void) strlcpy(sBuf1, "WARNING: HBA Temperature Event:\n",
39978f23e9faSHans Rosenfeld sizeof (sBuf1));
3998291a2b48SSukumar Swaminathan switch (tempType) {
3999291a2b48SSukumar Swaminathan case TEMP_TYPE_CRITICAL:
40008f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2),
40018f23e9faSHans Rosenfeld " Event Type = %d (Critical)\n", tempType);
4002291a2b48SSukumar Swaminathan break;
4003291a2b48SSukumar Swaminathan case TEMP_TYPE_THRESHOLD:
40048f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2),
40058f23e9faSHans Rosenfeld " Event Type = %d (Threshold)\n", tempType);
4006291a2b48SSukumar Swaminathan break;
4007291a2b48SSukumar Swaminathan case TEMP_TYPE_NORMAL:
40088f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2),
40098f23e9faSHans Rosenfeld " Event Type = %d (Normal)\n", tempType);
4010291a2b48SSukumar Swaminathan break;
4011291a2b48SSukumar Swaminathan default:
40128f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2),
40138f23e9faSHans Rosenfeld " Unknown Event Type = %d\n", tempType);
4014291a2b48SSukumar Swaminathan break;
4015291a2b48SSukumar Swaminathan }
40168f23e9faSHans Rosenfeld (void) snprintf(sBuf3, sizeof (sBuf3), " Temperature = %d\n\n", temp);
40178f23e9faSHans Rosenfeld (void) strlcat(sBuf1, sBuf2, sizeof (sBuf1));
40188f23e9faSHans Rosenfeld (void) strlcat(sBuf1, sBuf3, sizeof (sBuf1));
4019291a2b48SSukumar Swaminathan
4020291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, sBuf1, 0, 0, 0);
4021291a2b48SSukumar Swaminathan
4022291a2b48SSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, NULL);
4023291a2b48SSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, NULL, DUMP_TYPE_TEMP);
4024291a2b48SSukumar Swaminathan
402582527734SSukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, NULL, NULL);
4026291a2b48SSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, NULL, NULL);
4027291a2b48SSukumar Swaminathan
4028291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK);
4029291a2b48SSukumar Swaminathan return (0);
4030291a2b48SSukumar Swaminathan
403182527734SSukumar Swaminathan } /* emlxs_dump_temp_event() */
4032291a2b48SSukumar Swaminathan
4033291a2b48SSukumar Swaminathan
4034291a2b48SSukumar Swaminathan extern uint32_t
emlxs_dump_drv_event(emlxs_hba_t * hba)4035291a2b48SSukumar Swaminathan emlxs_dump_drv_event(
4036291a2b48SSukumar Swaminathan emlxs_hba_t *hba)
4037291a2b48SSukumar Swaminathan {
4038291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
4039291a2b48SSukumar Swaminathan uint32_t status;
4040291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile;
4041291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile;
4042291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile;
4043291a2b48SSukumar Swaminathan
4044291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_DUMP_LOCK);
4045291a2b48SSukumar Swaminathan
4046291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
4047291a2b48SSukumar Swaminathan "Dump Event: Firmware core dump initiated...");
4048291a2b48SSukumar Swaminathan
4049291a2b48SSukumar Swaminathan status =
4050291a2b48SSukumar Swaminathan emlxs_dump_file_create(hba, &fpTxtFile, &fpDmpFile, &fpCeeFile);
4051291a2b48SSukumar Swaminathan if (status != 0) {
4052291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK);
4053291a2b48SSukumar Swaminathan return (1);
4054291a2b48SSukumar Swaminathan }
4055291a2b48SSukumar Swaminathan
4056291a2b48SSukumar Swaminathan if (hba->model_info.chip == EMLXS_SATURN_CHIP) {
405782527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI);
405882527734SSukumar Swaminathan (void) emlxs_dump_saturn_log(hba, fpTxtFile, fpDmpFile);
405982527734SSukumar Swaminathan }
4060291a2b48SSukumar Swaminathan
4061a9800bebSGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) ||
4062a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) {
406382527734SSukumar Swaminathan (void) emlxs_dump_tigershark_log(hba, fpTxtFile, fpCeeFile);
4064291a2b48SSukumar Swaminathan }
4065291a2b48SSukumar Swaminathan
406682527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
406782527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_DIAGDI);
4068291a2b48SSukumar Swaminathan }
4069291a2b48SSukumar Swaminathan
4070291a2b48SSukumar Swaminathan (void) emlxs_dump_sli_interface(hba, fpTxtFile, fpDmpFile,
4071291a2b48SSukumar Swaminathan DUMP_TYPE_DRIVER);
4072291a2b48SSukumar Swaminathan
407382527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
4074291a2b48SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI);
4075291a2b48SSukumar Swaminathan }
4076291a2b48SSukumar Swaminathan
4077291a2b48SSukumar Swaminathan (void) emlxs_dump_hba(hba, fpTxtFile, fpDmpFile);
4078291a2b48SSukumar Swaminathan
40798f23e9faSHans Rosenfeld if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
40808f23e9faSHans Rosenfeld (void) emlxs_set_hba_mode(hba, DDI_ONDI);
40818f23e9faSHans Rosenfeld }
4082291a2b48SSukumar Swaminathan
408382527734SSukumar Swaminathan status = emlxs_menlo_set_mode(hba, MENLO_MAINTENANCE_MODE_ENABLE);
408482527734SSukumar Swaminathan if (status == 0) {
408582527734SSukumar Swaminathan (void) emlxs_dump_menlo_log(hba, fpCeeFile);
4086291a2b48SSukumar Swaminathan }
4087291a2b48SSukumar Swaminathan
4088291a2b48SSukumar Swaminathan /* Now generate the rest of the Dump */
4089291a2b48SSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, fpDmpFile);
4090291a2b48SSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, fpDmpFile, DUMP_TYPE_DRIVER);
4091291a2b48SSukumar Swaminathan (void) emlxs_dump_parm_table(hba, fpTxtFile, fpDmpFile);
4092291a2b48SSukumar Swaminathan (void) emlxs_dump_cfg_regions(hba, fpTxtFile, fpDmpFile);
4093291a2b48SSukumar Swaminathan
409482527734SSukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, fpDmpFile, fpCeeFile);
4095291a2b48SSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, fpDmpFile, fpCeeFile);
4096291a2b48SSukumar Swaminathan
409782527734SSukumar Swaminathan /* The last step of the Menlo Dump. */
409882527734SSukumar Swaminathan (void) emlxs_menlo_reset(hba, MENLO_FW_OPERATIONAL);
409982527734SSukumar Swaminathan
410082527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI);
4101291a2b48SSukumar Swaminathan
4102291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK);
4103291a2b48SSukumar Swaminathan
410482527734SSukumar Swaminathan
4105291a2b48SSukumar Swaminathan return (0);
4106291a2b48SSukumar Swaminathan
410782527734SSukumar Swaminathan } /* emlxs_dump_drv_event() */
4108291a2b48SSukumar Swaminathan
4109291a2b48SSukumar Swaminathan
4110bb63f56eSSukumar Swaminathan /* ARGSUSED */
4111291a2b48SSukumar Swaminathan extern void
emlxs_dump_drv_thread(emlxs_hba_t * hba,void * arg1,void * arg2)4112bb63f56eSSukumar Swaminathan emlxs_dump_drv_thread(emlxs_hba_t *hba,
4113bb63f56eSSukumar Swaminathan void *arg1, void *arg2)
4114291a2b48SSukumar Swaminathan {
4115291a2b48SSukumar Swaminathan (void) emlxs_dump_drv_event(hba);
4116291a2b48SSukumar Swaminathan
4117291a2b48SSukumar Swaminathan /* Clear the Dump flag */
4118291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
4119291a2b48SSukumar Swaminathan hba->flag &= ~FC_DUMP_ACTIVE;
4120291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4121291a2b48SSukumar Swaminathan
4122bb63f56eSSukumar Swaminathan return;
4123291a2b48SSukumar Swaminathan
412482527734SSukumar Swaminathan } /* emlxs_dump_drv_thread() */
4125291a2b48SSukumar Swaminathan
4126291a2b48SSukumar Swaminathan
4127bb63f56eSSukumar Swaminathan /* ARGSUSED */
4128291a2b48SSukumar Swaminathan extern void
emlxs_dump_user_thread(emlxs_hba_t * hba,void * arg1,void * arg2)4129bb63f56eSSukumar Swaminathan emlxs_dump_user_thread(emlxs_hba_t *hba,
4130bb63f56eSSukumar Swaminathan void *arg1, void *arg2)
4131291a2b48SSukumar Swaminathan {
4132291a2b48SSukumar Swaminathan (void) emlxs_dump_user_event(hba);
4133291a2b48SSukumar Swaminathan
4134291a2b48SSukumar Swaminathan /* Clear the Dump flag */
4135291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
4136291a2b48SSukumar Swaminathan hba->flag &= ~FC_DUMP_ACTIVE;
4137291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4138291a2b48SSukumar Swaminathan
4139bb63f56eSSukumar Swaminathan return;
4140291a2b48SSukumar Swaminathan
414182527734SSukumar Swaminathan } /* emlxs_dump_user_thread() */
4142291a2b48SSukumar Swaminathan
4143291a2b48SSukumar Swaminathan
4144bb63f56eSSukumar Swaminathan /* ARGSUSED */
4145291a2b48SSukumar Swaminathan extern void
emlxs_dump_temp_thread(emlxs_hba_t * hba,void * arg1,void * arg2)4146bb63f56eSSukumar Swaminathan emlxs_dump_temp_thread(emlxs_hba_t *hba,
4147bb63f56eSSukumar Swaminathan void *arg1, void *arg2)
4148291a2b48SSukumar Swaminathan {
4149bb63f56eSSukumar Swaminathan dump_temp_event_t *temp_event = (dump_temp_event_t *)arg1;
4150291a2b48SSukumar Swaminathan
4151291a2b48SSukumar Swaminathan (void) emlxs_dump_temp_event(temp_event->hba, temp_event->type,
4152291a2b48SSukumar Swaminathan temp_event->temp);
4153291a2b48SSukumar Swaminathan
4154291a2b48SSukumar Swaminathan /* Free the temp event object */
4155291a2b48SSukumar Swaminathan kmem_free(temp_event, sizeof (dump_temp_event_t));
4156291a2b48SSukumar Swaminathan
4157291a2b48SSukumar Swaminathan /* Clear the Dump flag */
4158291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
4159291a2b48SSukumar Swaminathan hba->flag &= ~FC_DUMP_ACTIVE;
4160291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4161291a2b48SSukumar Swaminathan
4162bb63f56eSSukumar Swaminathan return;
4163291a2b48SSukumar Swaminathan
416482527734SSukumar Swaminathan } /* emlxs_dump_temp_thread() */
4165291a2b48SSukumar Swaminathan
4166291a2b48SSukumar Swaminathan
4167291a2b48SSukumar Swaminathan /* Schedules a dump thread */
4168291a2b48SSukumar Swaminathan /* temp_type and temp are only valid for type=EMLXS_TEMP_DUMP */
4169291a2b48SSukumar Swaminathan extern void
emlxs_dump(emlxs_hba_t * hba,uint32_t type,uint32_t temp_type,uint32_t temp)4170291a2b48SSukumar Swaminathan emlxs_dump(emlxs_hba_t *hba, uint32_t type, uint32_t temp_type, uint32_t temp)
4171291a2b48SSukumar Swaminathan {
4172291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT;
4173291a2b48SSukumar Swaminathan dump_temp_event_t *temp_event = NULL;
4174291a2b48SSukumar Swaminathan
4175291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
4176291a2b48SSukumar Swaminathan
4177291a2b48SSukumar Swaminathan /* Check if it is safe to dump */
4178291a2b48SSukumar Swaminathan if (!(hba->flag & FC_DUMP_SAFE)) {
4179291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4180291a2b48SSukumar Swaminathan
4181291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
41828f23e9faSHans Rosenfeld "dump: Dump disabled.");
4183291a2b48SSukumar Swaminathan
4184291a2b48SSukumar Swaminathan return;
4185291a2b48SSukumar Swaminathan }
4186291a2b48SSukumar Swaminathan
4187291a2b48SSukumar Swaminathan /* Check if a dump is already in progess */
4188291a2b48SSukumar Swaminathan if (hba->flag & FC_DUMP_ACTIVE) {
4189291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4190291a2b48SSukumar Swaminathan
4191291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
41928f23e9faSHans Rosenfeld "dump: Dump already in progress.");
4193291a2b48SSukumar Swaminathan
4194291a2b48SSukumar Swaminathan return;
4195291a2b48SSukumar Swaminathan }
4196291a2b48SSukumar Swaminathan
4197291a2b48SSukumar Swaminathan /* Prepare to schedule dump */
4198291a2b48SSukumar Swaminathan switch (type) {
4199291a2b48SSukumar Swaminathan case EMLXS_DRV_DUMP:
4200291a2b48SSukumar Swaminathan case EMLXS_USER_DUMP:
4201291a2b48SSukumar Swaminathan break;
4202291a2b48SSukumar Swaminathan
4203291a2b48SSukumar Swaminathan case EMLXS_TEMP_DUMP:
4204291a2b48SSukumar Swaminathan temp_event = (dump_temp_event_t *)kmem_alloc(
4205291a2b48SSukumar Swaminathan sizeof (dump_temp_event_t), KM_NOSLEEP);
4206291a2b48SSukumar Swaminathan
4207291a2b48SSukumar Swaminathan if (temp_event == NULL) {
4208291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4209291a2b48SSukumar Swaminathan
4210291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
42118f23e9faSHans Rosenfeld "dump: Unable to allocate temp object.");
4212291a2b48SSukumar Swaminathan
4213291a2b48SSukumar Swaminathan return;
4214291a2b48SSukumar Swaminathan }
4215291a2b48SSukumar Swaminathan
4216291a2b48SSukumar Swaminathan temp_event->hba = hba;
4217291a2b48SSukumar Swaminathan temp_event->type = temp_type;
4218291a2b48SSukumar Swaminathan temp_event->temp = temp;
4219291a2b48SSukumar Swaminathan break;
4220291a2b48SSukumar Swaminathan
4221291a2b48SSukumar Swaminathan default:
4222291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4223291a2b48SSukumar Swaminathan
4224291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
42258f23e9faSHans Rosenfeld "dump: Error: Unknown dump type. (%x)",
4226291a2b48SSukumar Swaminathan type);
4227291a2b48SSukumar Swaminathan
4228291a2b48SSukumar Swaminathan return;
4229291a2b48SSukumar Swaminathan }
4230291a2b48SSukumar Swaminathan
4231291a2b48SSukumar Swaminathan /* Set the Dump-in-progess flag */
4232291a2b48SSukumar Swaminathan hba->flag |= FC_DUMP_ACTIVE;
4233291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
4234291a2b48SSukumar Swaminathan
4235291a2b48SSukumar Swaminathan /* Create a separate thread to run the dump event */
4236291a2b48SSukumar Swaminathan switch (type) {
4237291a2b48SSukumar Swaminathan case EMLXS_DRV_DUMP:
4238bb63f56eSSukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_drv_thread, NULL, NULL);
4239291a2b48SSukumar Swaminathan break;
4240291a2b48SSukumar Swaminathan
4241291a2b48SSukumar Swaminathan case EMLXS_TEMP_DUMP:
4242bb63f56eSSukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_temp_thread,
4243bb63f56eSSukumar Swaminathan (void *)temp_event, NULL);
4244291a2b48SSukumar Swaminathan break;
4245291a2b48SSukumar Swaminathan
4246291a2b48SSukumar Swaminathan case EMLXS_USER_DUMP:
4247bb63f56eSSukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_user_thread, NULL, NULL);
4248291a2b48SSukumar Swaminathan break;
4249291a2b48SSukumar Swaminathan }
4250291a2b48SSukumar Swaminathan
4251291a2b48SSukumar Swaminathan return;
4252291a2b48SSukumar Swaminathan
4253291a2b48SSukumar Swaminathan } /* emlxs_dump() */
4254291a2b48SSukumar Swaminathan
4255291a2b48SSukumar Swaminathan extern void
emlxs_dump_wait(emlxs_hba_t * hba)4256291a2b48SSukumar Swaminathan emlxs_dump_wait(emlxs_hba_t *hba)
4257291a2b48SSukumar Swaminathan {
4258291a2b48SSukumar Swaminathan /* Wait for the Dump flag to clear */
4259291a2b48SSukumar Swaminathan while ((hba->flag & FC_DUMP_ACTIVE)) {
42608f23e9faSHans Rosenfeld BUSYWAIT_MS(1000);
4261291a2b48SSukumar Swaminathan }
4262291a2b48SSukumar Swaminathan
4263291a2b48SSukumar Swaminathan } /* emlxs_dump_wait() */
4264291a2b48SSukumar Swaminathan
4265291a2b48SSukumar Swaminathan
4266291a2b48SSukumar Swaminathan #endif /* DUMP_SUPPORT */
4267