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