1bafec742SSukumar Swaminathan /*
2bafec742SSukumar Swaminathan  * CDDL HEADER START
3bafec742SSukumar Swaminathan  *
4bafec742SSukumar Swaminathan  * The contents of this file are subject to the terms of the
5bafec742SSukumar Swaminathan  * Common Development and Distribution License (the "License").
6bafec742SSukumar Swaminathan  * You may not use this file except in compliance with the License.
7bafec742SSukumar Swaminathan  *
8bafec742SSukumar Swaminathan  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9bafec742SSukumar Swaminathan  * or http://www.opensolaris.org/os/licensing.
10bafec742SSukumar Swaminathan  * See the License for the specific language governing permissions
11bafec742SSukumar Swaminathan  * and limitations under the License.
12bafec742SSukumar Swaminathan  *
13bafec742SSukumar Swaminathan  * When distributing Covered Code, include this CDDL HEADER in each
14bafec742SSukumar Swaminathan  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15bafec742SSukumar Swaminathan  * If applicable, add the following below this CDDL HEADER, with the
16bafec742SSukumar Swaminathan  * fields enclosed by brackets "[]" replaced with your own identifying
17bafec742SSukumar Swaminathan  * information: Portions Copyright [yyyy] [name of copyright owner]
18bafec742SSukumar Swaminathan  *
19bafec742SSukumar Swaminathan  * CDDL HEADER END
20bafec742SSukumar Swaminathan  */
21bafec742SSukumar Swaminathan 
22bafec742SSukumar Swaminathan /*
23accf27a5SSukumar Swaminathan  * Copyright 2010 QLogic Corporation. All rights reserved.
24bafec742SSukumar Swaminathan  */
25bafec742SSukumar Swaminathan 
26bafec742SSukumar Swaminathan #include <qlge.h>
27bafec742SSukumar Swaminathan 
28bafec742SSukumar Swaminathan static uint32_t ql_dump_buf_8(uint8_t *, uint32_t, uint32_t);
29bafec742SSukumar Swaminathan static uint32_t ql_dump_buf_16(uint16_t *, uint32_t, uint32_t);
30bafec742SSukumar Swaminathan static uint32_t ql_dump_buf_32(uint32_t *, uint32_t, uint32_t);
31bafec742SSukumar Swaminathan static uint32_t ql_dump_buf_64(uint64_t *, uint32_t, uint32_t);
32bafec742SSukumar Swaminathan static int ql_binary_core_dump(qlge_t *, uint32_t, uint32_t *);
33bafec742SSukumar Swaminathan 
34bafec742SSukumar Swaminathan static char ISP_8100_REGION[] = {
35bafec742SSukumar Swaminathan 	"nic: nic_boot, nic_param, nic_vpd \n"
36bafec742SSukumar Swaminathan 	"mpi: mpi_fw, mpi_config, edc_fw\n"
37bafec742SSukumar Swaminathan 	"fc: fc_boot, fc_fw, fc_nvram, fc_vpd"};
38bafec742SSukumar Swaminathan static char ISP_8100_AVAILABLE_DUMPS[] = {"core,register,all"};
39bafec742SSukumar Swaminathan 
40bafec742SSukumar Swaminathan /*
41bafec742SSukumar Swaminathan  * Get byte from I/O port
42bafec742SSukumar Swaminathan  */
43bafec742SSukumar Swaminathan uint8_t
ql_get8(qlge_t * qlge,uint32_t index)44bafec742SSukumar Swaminathan ql_get8(qlge_t *qlge, uint32_t index)
45bafec742SSukumar Swaminathan {
46bafec742SSukumar Swaminathan 	uint8_t ret;
47bafec742SSukumar Swaminathan 
48bafec742SSukumar Swaminathan 	ret = (uint8_t)ddi_get8(qlge->dev_handle,
49bafec742SSukumar Swaminathan 	    (uint8_t *)(((caddr_t)qlge->iobase) + index));
50bafec742SSukumar Swaminathan 	return (ret);
51bafec742SSukumar Swaminathan }
52bafec742SSukumar Swaminathan 
53bafec742SSukumar Swaminathan /*
54bafec742SSukumar Swaminathan  * Get word from I/O port
55bafec742SSukumar Swaminathan  */
56bafec742SSukumar Swaminathan uint16_t
ql_get16(qlge_t * qlge,uint32_t index)57bafec742SSukumar Swaminathan ql_get16(qlge_t *qlge, uint32_t index)
58bafec742SSukumar Swaminathan {
59bafec742SSukumar Swaminathan 	uint16_t ret;
60bafec742SSukumar Swaminathan 
61bafec742SSukumar Swaminathan 	ret = (uint16_t)ddi_get16(qlge->dev_handle,
62bafec742SSukumar Swaminathan 	    (uint16_t *)(void *)(((caddr_t)qlge->iobase) + index));
63bafec742SSukumar Swaminathan 	return (ret);
64bafec742SSukumar Swaminathan }
65bafec742SSukumar Swaminathan 
66bafec742SSukumar Swaminathan /*
67bafec742SSukumar Swaminathan  * Get double word from I/O port
68bafec742SSukumar Swaminathan  */
69bafec742SSukumar Swaminathan uint32_t
ql_get32(qlge_t * qlge,uint32_t index)70bafec742SSukumar Swaminathan ql_get32(qlge_t *qlge, uint32_t index)
71bafec742SSukumar Swaminathan {
72bafec742SSukumar Swaminathan 	uint32_t ret;
73bafec742SSukumar Swaminathan 
74bafec742SSukumar Swaminathan 	ret = ddi_get32(qlge->dev_handle,
75bafec742SSukumar Swaminathan 	    (uint32_t *)(void *)(((caddr_t)qlge->iobase) + index));
76bafec742SSukumar Swaminathan 	return (ret);
77bafec742SSukumar Swaminathan }
78bafec742SSukumar Swaminathan 
79bafec742SSukumar Swaminathan /*
80bafec742SSukumar Swaminathan  * Send byte to I/O port
81bafec742SSukumar Swaminathan  */
82bafec742SSukumar Swaminathan void
ql_put8(qlge_t * qlge,uint32_t index,uint8_t data)83bafec742SSukumar Swaminathan ql_put8(qlge_t *qlge, uint32_t index, uint8_t data)
84bafec742SSukumar Swaminathan {
85bafec742SSukumar Swaminathan 	ddi_put8(qlge->dev_handle,
86bafec742SSukumar Swaminathan 	    (uint8_t *)(((caddr_t)qlge->iobase) + index), data);
87bafec742SSukumar Swaminathan }
88bafec742SSukumar Swaminathan 
89bafec742SSukumar Swaminathan /*
90bafec742SSukumar Swaminathan  * Send word to I/O port
91bafec742SSukumar Swaminathan  */
92bafec742SSukumar Swaminathan void
ql_put16(qlge_t * qlge,uint32_t index,uint16_t data)93bafec742SSukumar Swaminathan ql_put16(qlge_t *qlge, uint32_t index, uint16_t data)
94bafec742SSukumar Swaminathan {
95bafec742SSukumar Swaminathan 	ddi_put16(qlge->dev_handle,
96bafec742SSukumar Swaminathan 	    (uint16_t *)(void *)(((caddr_t)qlge->iobase) + index), data);
97bafec742SSukumar Swaminathan }
98bafec742SSukumar Swaminathan 
99bafec742SSukumar Swaminathan /*
100bafec742SSukumar Swaminathan  * Send double word to I/O port
101bafec742SSukumar Swaminathan  */
102bafec742SSukumar Swaminathan void
ql_put32(qlge_t * qlge,uint32_t index,uint32_t data)103bafec742SSukumar Swaminathan ql_put32(qlge_t *qlge, uint32_t index, uint32_t data)
104bafec742SSukumar Swaminathan {
105bafec742SSukumar Swaminathan 	ddi_put32(qlge->dev_handle,
106bafec742SSukumar Swaminathan 	    (uint32_t *)(void *)(((caddr_t)qlge->iobase) + index), data);
107bafec742SSukumar Swaminathan }
108bafec742SSukumar Swaminathan 
109bafec742SSukumar Swaminathan /*
110bafec742SSukumar Swaminathan  * Read from a register
111bafec742SSukumar Swaminathan  */
112bafec742SSukumar Swaminathan uint32_t
ql_read_reg(qlge_t * qlge,uint32_t reg)113bafec742SSukumar Swaminathan ql_read_reg(qlge_t *qlge, uint32_t reg)
114bafec742SSukumar Swaminathan {
115bafec742SSukumar Swaminathan 	uint32_t data = ql_get32(qlge, reg);
116bafec742SSukumar Swaminathan 
117bafec742SSukumar Swaminathan 	return (data);
118bafec742SSukumar Swaminathan }
119bafec742SSukumar Swaminathan 
120bafec742SSukumar Swaminathan /*
121bafec742SSukumar Swaminathan  * Write 32 bit data to a register
122bafec742SSukumar Swaminathan  */
123bafec742SSukumar Swaminathan void
ql_write_reg(qlge_t * qlge,uint32_t reg,uint32_t data)124bafec742SSukumar Swaminathan ql_write_reg(qlge_t *qlge, uint32_t reg, uint32_t data)
125bafec742SSukumar Swaminathan {
126bafec742SSukumar Swaminathan 	ql_put32(qlge, reg, data);
127bafec742SSukumar Swaminathan }
128bafec742SSukumar Swaminathan 
129bafec742SSukumar Swaminathan /*
130bafec742SSukumar Swaminathan  * Set semaphore register bit to lock access to a shared register
131bafec742SSukumar Swaminathan  */
132bafec742SSukumar Swaminathan int
ql_sem_lock(qlge_t * qlge,uint32_t sem_mask,uint32_t sem_bits)133bafec742SSukumar Swaminathan ql_sem_lock(qlge_t *qlge, uint32_t sem_mask, uint32_t sem_bits)
134bafec742SSukumar Swaminathan {
135bafec742SSukumar Swaminathan 	uint32_t value;
136bafec742SSukumar Swaminathan 
137bafec742SSukumar Swaminathan 	ql_put32(qlge, REG_SEMAPHORE, (sem_mask | sem_bits));
138bafec742SSukumar Swaminathan 	value = ql_get32(qlge, REG_SEMAPHORE);
139bafec742SSukumar Swaminathan 	return ((value & (sem_mask >> 16)) == sem_bits);
140bafec742SSukumar Swaminathan }
141bafec742SSukumar Swaminathan /*
142bafec742SSukumar Swaminathan  * Wait up to "delay" seconds until the register "reg"'s
143bafec742SSukumar Swaminathan  * "wait_bit" is set
144bafec742SSukumar Swaminathan  * Default wait time is 5 seconds if "delay" time was not set.
145bafec742SSukumar Swaminathan  */
146bafec742SSukumar Swaminathan int
ql_wait_reg_bit(qlge_t * qlge,uint32_t reg,uint32_t wait_bit,int set,uint32_t delay)147bafec742SSukumar Swaminathan ql_wait_reg_bit(qlge_t *qlge, uint32_t reg, uint32_t wait_bit, int set,
148bafec742SSukumar Swaminathan     uint32_t delay)
149bafec742SSukumar Swaminathan {
150bafec742SSukumar Swaminathan 	uint32_t reg_status;
151bafec742SSukumar Swaminathan 	uint32_t timer = 5; /* 5 second */
152bafec742SSukumar Swaminathan 	int rtn_val = DDI_SUCCESS;
153bafec742SSukumar Swaminathan 	uint32_t delay_ticks;
154bafec742SSukumar Swaminathan 
155bafec742SSukumar Swaminathan 	if (delay != 0)
156bafec742SSukumar Swaminathan 		timer = delay;
157bafec742SSukumar Swaminathan 
158bafec742SSukumar Swaminathan 	delay_ticks = timer * 100;
159bafec742SSukumar Swaminathan 	/*
160bafec742SSukumar Swaminathan 	 * wait for Configuration register test bit to be set,
161bafec742SSukumar Swaminathan 	 * if not, then it is still busy.
162bafec742SSukumar Swaminathan 	 */
163bafec742SSukumar Swaminathan 	do {
164bafec742SSukumar Swaminathan 		reg_status = ql_read_reg(qlge, reg);
165bafec742SSukumar Swaminathan 		/* wait for bit set or reset? */
166bafec742SSukumar Swaminathan 		if (set == BIT_SET) {
167bafec742SSukumar Swaminathan 			if (reg_status & wait_bit)
168bafec742SSukumar Swaminathan 				break;
169bafec742SSukumar Swaminathan 			else
170bafec742SSukumar Swaminathan 				qlge_delay(QL_ONE_SEC_DELAY / 100);
171bafec742SSukumar Swaminathan 		} else {
172bafec742SSukumar Swaminathan 			if (reg_status & wait_bit)
173bafec742SSukumar Swaminathan 				qlge_delay(QL_ONE_SEC_DELAY / 100);
174bafec742SSukumar Swaminathan 			else
175bafec742SSukumar Swaminathan 				break;
176bafec742SSukumar Swaminathan 		}
177bafec742SSukumar Swaminathan 	} while (--delay_ticks);
178bafec742SSukumar Swaminathan 
179bafec742SSukumar Swaminathan 	if (delay_ticks == 0) {
180bafec742SSukumar Swaminathan 		rtn_val = DDI_FAILURE;
181accf27a5SSukumar Swaminathan 		cmn_err(CE_WARN, "qlge(%d)wait reg %x, bit %x time out",
182accf27a5SSukumar Swaminathan 		    qlge->instance, reg, wait_bit);
183accf27a5SSukumar Swaminathan 		if (qlge->fm_enable) {
184accf27a5SSukumar Swaminathan 			ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
185accf27a5SSukumar Swaminathan 			atomic_or_32(&qlge->flags, ADAPTER_ERROR);
186accf27a5SSukumar Swaminathan 		}
187bafec742SSukumar Swaminathan 	}
188bafec742SSukumar Swaminathan 	return (rtn_val);
189bafec742SSukumar Swaminathan }
190bafec742SSukumar Swaminathan 
191bafec742SSukumar Swaminathan /*
192bafec742SSukumar Swaminathan  * Dump the value of control registers
193bafec742SSukumar Swaminathan  */
194bafec742SSukumar Swaminathan void
ql_dump_all_contrl_regs(qlge_t * qlge)195bafec742SSukumar Swaminathan ql_dump_all_contrl_regs(qlge_t *qlge)
196bafec742SSukumar Swaminathan {
197bafec742SSukumar Swaminathan 	int i;
198bafec742SSukumar Swaminathan 	uint32_t data;
199bafec742SSukumar Swaminathan 
200bafec742SSukumar Swaminathan 	for (i = 0; i < 0xff; i = i+4) {
201bafec742SSukumar Swaminathan 		data = ql_read_reg(qlge, i);
202bafec742SSukumar Swaminathan 		ql_printf("\tregister# 0x%x value: 0x%x\n", i, data);
203bafec742SSukumar Swaminathan 	}
204bafec742SSukumar Swaminathan }
205bafec742SSukumar Swaminathan 
206bafec742SSukumar Swaminathan /*
207bafec742SSukumar Swaminathan  * Prints string plus buffer.
208bafec742SSukumar Swaminathan  */
209bafec742SSukumar Swaminathan void
ql_dump_buf(char * string,uint8_t * buffer,uint8_t wd_size,uint32_t count)210bafec742SSukumar Swaminathan ql_dump_buf(char *string, uint8_t *buffer, uint8_t wd_size,
211bafec742SSukumar Swaminathan     uint32_t count)
212bafec742SSukumar Swaminathan {
213bafec742SSukumar Swaminathan 	uint32_t offset = 0;
214bafec742SSukumar Swaminathan 
215bafec742SSukumar Swaminathan 	if (strcmp(string, "") != 0)
216bafec742SSukumar Swaminathan 		ql_printf(string);
217bafec742SSukumar Swaminathan 
218bafec742SSukumar Swaminathan 	if ((buffer == NULL) || (count == 0))
219bafec742SSukumar Swaminathan 		return;
220bafec742SSukumar Swaminathan 
221bafec742SSukumar Swaminathan 	switch (wd_size) {
222bafec742SSukumar Swaminathan 	case 8:
223bafec742SSukumar Swaminathan 		while (count) {
224bafec742SSukumar Swaminathan 			count = ql_dump_buf_8(buffer, count, offset);
225bafec742SSukumar Swaminathan 			offset += 8;
226bafec742SSukumar Swaminathan 			buffer += 8;
227bafec742SSukumar Swaminathan 		}
228bafec742SSukumar Swaminathan 		break;
229bafec742SSukumar Swaminathan 
230bafec742SSukumar Swaminathan 	case 16:
231bafec742SSukumar Swaminathan 		while (count) {
232bafec742SSukumar Swaminathan 			count = ql_dump_buf_16((uint16_t *)(void *)buffer,
233bafec742SSukumar Swaminathan 			    count, offset);
234bafec742SSukumar Swaminathan 			offset += 16;
235bafec742SSukumar Swaminathan 			buffer += 16;
236bafec742SSukumar Swaminathan 		}
237bafec742SSukumar Swaminathan 		break;
238bafec742SSukumar Swaminathan 	case 32:
239bafec742SSukumar Swaminathan 		while (count) {
240bafec742SSukumar Swaminathan 			count = ql_dump_buf_32((uint32_t *)(void *)buffer,
241bafec742SSukumar Swaminathan 			    count, offset);
242bafec742SSukumar Swaminathan 			offset += 16;
243bafec742SSukumar Swaminathan 			buffer += 16;
244bafec742SSukumar Swaminathan 		}
245bafec742SSukumar Swaminathan 		break;
246bafec742SSukumar Swaminathan 	case 64:
247bafec742SSukumar Swaminathan 		while (count) {
248bafec742SSukumar Swaminathan 			count = ql_dump_buf_64((uint64_t *)(void *)buffer,
249bafec742SSukumar Swaminathan 			    count, offset);
250bafec742SSukumar Swaminathan 			offset += 16;
251bafec742SSukumar Swaminathan 			buffer += 16;
252bafec742SSukumar Swaminathan 		}
253bafec742SSukumar Swaminathan 		break;
254bafec742SSukumar Swaminathan 	default:
255bafec742SSukumar Swaminathan 		break;
256bafec742SSukumar Swaminathan 	}
257bafec742SSukumar Swaminathan }
258bafec742SSukumar Swaminathan 
259bafec742SSukumar Swaminathan /*
260bafec742SSukumar Swaminathan  * Print as 8bit bytes
261bafec742SSukumar Swaminathan  */
262bafec742SSukumar Swaminathan static uint32_t
ql_dump_buf_8(uint8_t * bp,uint32_t count,uint32_t offset)263bafec742SSukumar Swaminathan ql_dump_buf_8(uint8_t *bp, uint32_t count, uint32_t offset)
264bafec742SSukumar Swaminathan {
265bafec742SSukumar Swaminathan 	switch (count) {
266bafec742SSukumar Swaminathan 	case 1:
267bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x\n",
268bafec742SSukumar Swaminathan 		    offset,
269bafec742SSukumar Swaminathan 		    *bp);
270bafec742SSukumar Swaminathan 		break;
271bafec742SSukumar Swaminathan 
272bafec742SSukumar Swaminathan 	case 2:
273bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x\n",
274bafec742SSukumar Swaminathan 		    offset,
275bafec742SSukumar Swaminathan 		    *bp, *(bp+1));
276bafec742SSukumar Swaminathan 		break;
277bafec742SSukumar Swaminathan 
278bafec742SSukumar Swaminathan 	case 3:
279bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x %02x\n",
280bafec742SSukumar Swaminathan 		    offset,
281bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2));
282bafec742SSukumar Swaminathan 		break;
283bafec742SSukumar Swaminathan 
284bafec742SSukumar Swaminathan 	case 4:
285bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x %02x %02x\n",
286bafec742SSukumar Swaminathan 		    offset,
287bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3));
288bafec742SSukumar Swaminathan 		break;
289bafec742SSukumar Swaminathan 
290bafec742SSukumar Swaminathan 	case 5:
291bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x %02x %02x %02x\n",
292bafec742SSukumar Swaminathan 		    offset,
293bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4));
294bafec742SSukumar Swaminathan 		break;
295bafec742SSukumar Swaminathan 
296bafec742SSukumar Swaminathan 	case 6:
297bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x %02x %02x %02x %02x\n",
298bafec742SSukumar Swaminathan 		    offset,
299bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4), *(bp+5));
300bafec742SSukumar Swaminathan 		break;
301bafec742SSukumar Swaminathan 
302bafec742SSukumar Swaminathan 	case 7:
303bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x %02x %02x %02x %02x %02x\n",
304bafec742SSukumar Swaminathan 		    offset,
305bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4), *(bp+5), *(bp+6));
306bafec742SSukumar Swaminathan 		break;
307bafec742SSukumar Swaminathan 
308bafec742SSukumar Swaminathan 	default:
309bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %02x %02x %02x %02x %02x %02x %02x %02x\n",
310bafec742SSukumar Swaminathan 		    offset,
311bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4), *(bp+5), *(bp+6),
312bafec742SSukumar Swaminathan 		    *(bp+7));
313bafec742SSukumar Swaminathan 		break;
314bafec742SSukumar Swaminathan 
315bafec742SSukumar Swaminathan 	}
316bafec742SSukumar Swaminathan 
317bafec742SSukumar Swaminathan 	if (count < 8) {
318bafec742SSukumar Swaminathan 		count = 0;
319bafec742SSukumar Swaminathan 	} else {
320bafec742SSukumar Swaminathan 		count -= 8;
321bafec742SSukumar Swaminathan 	}
322bafec742SSukumar Swaminathan 
323bafec742SSukumar Swaminathan 	return (count);
324bafec742SSukumar Swaminathan }
325bafec742SSukumar Swaminathan 
326bafec742SSukumar Swaminathan /*
327bafec742SSukumar Swaminathan  * Print as 16bit
328bafec742SSukumar Swaminathan  */
329bafec742SSukumar Swaminathan static uint32_t
ql_dump_buf_16(uint16_t * bp,uint32_t count,uint32_t offset)330bafec742SSukumar Swaminathan ql_dump_buf_16(uint16_t *bp, uint32_t count, uint32_t offset)
331bafec742SSukumar Swaminathan {
332bafec742SSukumar Swaminathan 
333bafec742SSukumar Swaminathan 	switch (count) {
334bafec742SSukumar Swaminathan 	case 1:
335bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x\n",
336bafec742SSukumar Swaminathan 		    offset,
337bafec742SSukumar Swaminathan 		    *bp);
338bafec742SSukumar Swaminathan 		break;
339bafec742SSukumar Swaminathan 
340bafec742SSukumar Swaminathan 	case 2:
341bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x\n",
342bafec742SSukumar Swaminathan 		    offset,
343bafec742SSukumar Swaminathan 		    *bp, *(bp+1));
344bafec742SSukumar Swaminathan 		break;
345bafec742SSukumar Swaminathan 
346bafec742SSukumar Swaminathan 	case 3:
347bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x %04x\n",
348bafec742SSukumar Swaminathan 		    offset,
349bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2));
350bafec742SSukumar Swaminathan 		break;
351bafec742SSukumar Swaminathan 
352bafec742SSukumar Swaminathan 	case 4:
353bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x %04x %04x\n",
354bafec742SSukumar Swaminathan 		    offset,
355bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3));
356bafec742SSukumar Swaminathan 		break;
357bafec742SSukumar Swaminathan 
358bafec742SSukumar Swaminathan 	case 5:
359bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x %04x %04x %04x\n",
360bafec742SSukumar Swaminathan 		    offset,
361bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4));
362bafec742SSukumar Swaminathan 		break;
363bafec742SSukumar Swaminathan 
364bafec742SSukumar Swaminathan 	case 6:
365bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x %04x %04x %04x %04x\n",
366bafec742SSukumar Swaminathan 		    offset,
367bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4), *(bp+5));
368bafec742SSukumar Swaminathan 		break;
369bafec742SSukumar Swaminathan 
370bafec742SSukumar Swaminathan 	case 7:
371bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x %04x %04x %04x %04x %04x\n",
372bafec742SSukumar Swaminathan 		    offset,
373bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4), *(bp+5), *(bp+6));
374bafec742SSukumar Swaminathan 		break;
375bafec742SSukumar Swaminathan 
376bafec742SSukumar Swaminathan 	default:
377bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %04x %04x %04x %04x %04x %04x %04x %04x\n",
378bafec742SSukumar Swaminathan 		    offset,
379bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3), *(bp+4), *(bp+5), *(bp+6),
380bafec742SSukumar Swaminathan 		    *(bp+7));
381bafec742SSukumar Swaminathan 		break;
382bafec742SSukumar Swaminathan 	}
383bafec742SSukumar Swaminathan 
384bafec742SSukumar Swaminathan 	if (count < 8) {
385bafec742SSukumar Swaminathan 		count = 0;
386bafec742SSukumar Swaminathan 	} else {
387bafec742SSukumar Swaminathan 		count -= 8;
388bafec742SSukumar Swaminathan 	}
389bafec742SSukumar Swaminathan 
390bafec742SSukumar Swaminathan 	return (count);
391bafec742SSukumar Swaminathan }
392bafec742SSukumar Swaminathan 
393bafec742SSukumar Swaminathan /*
394bafec742SSukumar Swaminathan  * Print as 32bit
395bafec742SSukumar Swaminathan  */
396bafec742SSukumar Swaminathan static uint32_t
ql_dump_buf_32(uint32_t * bp,uint32_t count,uint32_t offset)397bafec742SSukumar Swaminathan ql_dump_buf_32(uint32_t *bp, uint32_t count, uint32_t offset)
398bafec742SSukumar Swaminathan {
399bafec742SSukumar Swaminathan 
400bafec742SSukumar Swaminathan 	switch (count) {
401bafec742SSukumar Swaminathan 	case 1:
402bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %08x\n",
403bafec742SSukumar Swaminathan 		    offset,
404bafec742SSukumar Swaminathan 		    *bp);
405bafec742SSukumar Swaminathan 		break;
406bafec742SSukumar Swaminathan 
407bafec742SSukumar Swaminathan 	case 2:
408bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %08x %08x\n",
409bafec742SSukumar Swaminathan 		    offset,
410bafec742SSukumar Swaminathan 		    *bp, *(bp+1));
411bafec742SSukumar Swaminathan 		break;
412bafec742SSukumar Swaminathan 
413bafec742SSukumar Swaminathan 	case 3:
414bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %08x %08x %08x\n",
415bafec742SSukumar Swaminathan 		    offset,
416bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2));
417bafec742SSukumar Swaminathan 		break;
418bafec742SSukumar Swaminathan 
419bafec742SSukumar Swaminathan 	default:
420bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %08x %08x %08x %08x\n",
421bafec742SSukumar Swaminathan 		    offset,
422bafec742SSukumar Swaminathan 		    *bp, *(bp+1), *(bp+2), *(bp+3));
423bafec742SSukumar Swaminathan 		break;
424bafec742SSukumar Swaminathan 	}
425bafec742SSukumar Swaminathan 
426bafec742SSukumar Swaminathan 	if (count < 4) {
427bafec742SSukumar Swaminathan 		count = 0;
428bafec742SSukumar Swaminathan 	} else {
429bafec742SSukumar Swaminathan 		count -= 4;
430bafec742SSukumar Swaminathan 	}
431bafec742SSukumar Swaminathan 
432bafec742SSukumar Swaminathan 	return (count);
433bafec742SSukumar Swaminathan }
434bafec742SSukumar Swaminathan 
435bafec742SSukumar Swaminathan /*
436bafec742SSukumar Swaminathan  * Print as 64bit
437bafec742SSukumar Swaminathan  */
438bafec742SSukumar Swaminathan static uint32_t
ql_dump_buf_64(uint64_t * bp,uint32_t count,uint32_t offset)439bafec742SSukumar Swaminathan ql_dump_buf_64(uint64_t *bp, uint32_t count, uint32_t offset)
440bafec742SSukumar Swaminathan {
441bafec742SSukumar Swaminathan 
442bafec742SSukumar Swaminathan 	switch (count) {
443bafec742SSukumar Swaminathan 	case 1:
444bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %016x\n",
445bafec742SSukumar Swaminathan 		    offset,
446bafec742SSukumar Swaminathan 		    *bp);
447bafec742SSukumar Swaminathan 		break;
448bafec742SSukumar Swaminathan 
449bafec742SSukumar Swaminathan 	default:
450bafec742SSukumar Swaminathan 		ql_printf("0x%016x : %016x %016x\n",
451bafec742SSukumar Swaminathan 		    offset,
452bafec742SSukumar Swaminathan 		    *bp, *(bp+1));
453bafec742SSukumar Swaminathan 		break;
454bafec742SSukumar Swaminathan 
455bafec742SSukumar Swaminathan 	}
456bafec742SSukumar Swaminathan 
457bafec742SSukumar Swaminathan 	if (count < 2) {
458bafec742SSukumar Swaminathan 		count = 0;
459bafec742SSukumar Swaminathan 	} else {
460bafec742SSukumar Swaminathan 		count -= 2;
461bafec742SSukumar Swaminathan 	}
462bafec742SSukumar Swaminathan 
463bafec742SSukumar Swaminathan 	return (count);
464bafec742SSukumar Swaminathan }
465bafec742SSukumar Swaminathan 
466bafec742SSukumar Swaminathan /*
467bafec742SSukumar Swaminathan  * Print CQICB control block information
468bafec742SSukumar Swaminathan  */
469bafec742SSukumar Swaminathan /* ARGSUSED */
470bafec742SSukumar Swaminathan void
ql_dump_cqicb(qlge_t * qlge,struct cqicb_t * cqicb)471bafec742SSukumar Swaminathan ql_dump_cqicb(qlge_t *qlge, struct cqicb_t *cqicb)
472bafec742SSukumar Swaminathan {
473bafec742SSukumar Swaminathan 	_NOTE(ARGUNUSED(qlge));
474bafec742SSukumar Swaminathan 	ASSERT(qlge != NULL);
475bafec742SSukumar Swaminathan 	ASSERT(cqicb != NULL);
476bafec742SSukumar Swaminathan 	ql_printf("ql_dump_cqicb:entered\n");
477bafec742SSukumar Swaminathan 
478bafec742SSukumar Swaminathan 	ql_printf("\t msix_vect   = 0x%x\n",
479bafec742SSukumar Swaminathan 	    cqicb->msix_vect);
480bafec742SSukumar Swaminathan 	ql_printf("\t reserved1  = 0x%x\n",
481bafec742SSukumar Swaminathan 	    cqicb->reserved1);
482bafec742SSukumar Swaminathan 	ql_printf("\t reserved2  = 0x%x\n",
483bafec742SSukumar Swaminathan 	    cqicb->reserved2);
484bafec742SSukumar Swaminathan 	ql_printf("\t flags  = 0x%x\n",
485bafec742SSukumar Swaminathan 	    cqicb->flags);
486bafec742SSukumar Swaminathan 	ql_printf("\t len  = 0x%x\n",
487bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->len));
488bafec742SSukumar Swaminathan 	ql_printf("\t rid = 0x%x\n",
489bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->rid));
490bafec742SSukumar Swaminathan 	ql_printf("\t cq_base_addr_lo = 0x%x\n",
491bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->cq_base_addr_lo));
492bafec742SSukumar Swaminathan 	ql_printf("\t cq_base_addr_hi = 0x%x\n",
493bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->cq_base_addr_hi));
494bafec742SSukumar Swaminathan 	ql_printf("\t prod_idx_addr_lo = %x\n",
495bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->prod_idx_addr_lo));
496bafec742SSukumar Swaminathan 	ql_printf("\t prod_idx_addr_hi = %x\n",
497bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->prod_idx_addr_hi));
498bafec742SSukumar Swaminathan 	ql_printf("\t pkt_delay = %d\n",
499bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->pkt_delay));
500bafec742SSukumar Swaminathan 	ql_printf("\t irq_delay = 0x%x\n",
501bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->irq_delay));
502bafec742SSukumar Swaminathan 	ql_printf("\t lbq_addr_lo = 0x%x\n",
503bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->lbq_addr_lo));
504bafec742SSukumar Swaminathan 	ql_printf("\t lbq_addr_hi = 0x%x\n",
505bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->lbq_addr_hi));
506bafec742SSukumar Swaminathan 	ql_printf("\t lbq_buf_size = 0x%x\n",
507bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->lbq_buf_size));
508bafec742SSukumar Swaminathan 	ql_printf("\t lbq_len = 0x%x\n",
509bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->lbq_len));
510bafec742SSukumar Swaminathan 	ql_printf("\t sbq_addr_lo = 0x%x\n",
511bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->sbq_addr_lo));
512bafec742SSukumar Swaminathan 	ql_printf("\t sbq_addr_hi = 0x%x\n",
513bafec742SSukumar Swaminathan 	    le32_to_cpu(cqicb->sbq_addr_hi));
514bafec742SSukumar Swaminathan 	ql_printf("\t sbq_buf_size = 0x%x\n",
515bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->sbq_buf_size));
516bafec742SSukumar Swaminathan 	ql_printf("\t sbq_len = 0x%x\n",
517bafec742SSukumar Swaminathan 	    le16_to_cpu(cqicb->sbq_len));
518bafec742SSukumar Swaminathan 
519bafec742SSukumar Swaminathan 	ql_printf("ql_dump_cqicb:exiting\n");
520bafec742SSukumar Swaminathan }
521bafec742SSukumar Swaminathan 
522bafec742SSukumar Swaminathan /*
523bafec742SSukumar Swaminathan  * Print WQICB control block information
524bafec742SSukumar Swaminathan  */
525bafec742SSukumar Swaminathan /* ARGSUSED */
526bafec742SSukumar Swaminathan void
ql_dump_wqicb(qlge_t * qlge,struct wqicb_t * wqicb)527bafec742SSukumar Swaminathan ql_dump_wqicb(qlge_t *qlge, struct wqicb_t *wqicb)
528bafec742SSukumar Swaminathan {
529bafec742SSukumar Swaminathan 	_NOTE(ARGUNUSED(qlge));
530bafec742SSukumar Swaminathan 	ASSERT(qlge != NULL);
531bafec742SSukumar Swaminathan 	ASSERT(wqicb != NULL);
532bafec742SSukumar Swaminathan 
533bafec742SSukumar Swaminathan 	ql_printf("ql_dump_wqicb:entered\n");
534bafec742SSukumar Swaminathan 
535bafec742SSukumar Swaminathan 	ql_printf("\t len = %x\n",
536bafec742SSukumar Swaminathan 	    le16_to_cpu(wqicb->len));
537bafec742SSukumar Swaminathan 	ql_printf("\t flags = %x\n",
538bafec742SSukumar Swaminathan 	    le16_to_cpu(wqicb->flags));
539bafec742SSukumar Swaminathan 	ql_printf("\t cq_id_rss = %x\n",
540bafec742SSukumar Swaminathan 	    le16_to_cpu(wqicb->cq_id_rss));
541bafec742SSukumar Swaminathan 	ql_printf("\t rid = 0x%x\n",
542bafec742SSukumar Swaminathan 	    le16_to_cpu(wqicb->rid));
543bafec742SSukumar Swaminathan 	ql_printf("\t wq_addr_lo = 0x%x\n",
544bafec742SSukumar Swaminathan 	    le32_to_cpu(wqicb->wq_addr_lo));
545bafec742SSukumar Swaminathan 	ql_printf("\t wq_addr_hi = 0x%x\n",
546bafec742SSukumar Swaminathan 	    le32_to_cpu(wqicb->wq_addr_hi));
547bafec742SSukumar Swaminathan 	ql_printf("\t cnsmr_idx_addr_lo = %x\n",
548bafec742SSukumar Swaminathan 	    le32_to_cpu(wqicb->cnsmr_idx_addr_lo));
549bafec742SSukumar Swaminathan 	ql_printf("\t cnsmr_idx_addr_hi = %x\n",
550bafec742SSukumar Swaminathan 	    le32_to_cpu(wqicb->cnsmr_idx_addr_hi));
551bafec742SSukumar Swaminathan 
552bafec742SSukumar Swaminathan 	ql_printf("ql_dump_wqicb:exit\n");
553bafec742SSukumar Swaminathan }
554bafec742SSukumar Swaminathan 
555bafec742SSukumar Swaminathan /*
556bafec742SSukumar Swaminathan  * Print request descriptor information
557bafec742SSukumar Swaminathan  */
558bafec742SSukumar Swaminathan void
ql_dump_req_pkt(qlge_t * qlge,struct ob_mac_iocb_req * pkt,void * oal,int number)559bafec742SSukumar Swaminathan ql_dump_req_pkt(qlge_t *qlge, struct ob_mac_iocb_req *pkt, void *oal,
560bafec742SSukumar Swaminathan     int number)
561bafec742SSukumar Swaminathan {
562bafec742SSukumar Swaminathan 	int i = 0;
563bafec742SSukumar Swaminathan 	struct oal_entry *oal_entry;
564bafec742SSukumar Swaminathan 
565bafec742SSukumar Swaminathan 	ql_printf("ql_dump_req_pkt(%d):enter\n", qlge->instance);
566bafec742SSukumar Swaminathan 
567bafec742SSukumar Swaminathan 	ql_printf("\t opcode = 0x%x\n",
568bafec742SSukumar Swaminathan 	    pkt->opcode);
569bafec742SSukumar Swaminathan 	ql_printf("\t flag0  = 0x%x\n",
570bafec742SSukumar Swaminathan 	    pkt->flag0);
571bafec742SSukumar Swaminathan 	ql_printf("\t flag1  = 0x%x\n",
572bafec742SSukumar Swaminathan 	    pkt->flag1);
573bafec742SSukumar Swaminathan 	ql_printf("\t flag2  = 0x%x\n",
574bafec742SSukumar Swaminathan 	    pkt->flag2);
575bafec742SSukumar Swaminathan 	ql_printf("\t frame_len  = 0x%x\n",
576bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->frame_len));
577bafec742SSukumar Swaminathan 	ql_printf("\t transaction_id_low = 0x%x\n",
578bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->tid));
579bafec742SSukumar Swaminathan 	ql_printf("\t txq_idx = 0x%x\n",
580bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->txq_idx));
581bafec742SSukumar Swaminathan 	ql_printf("\t protocol_hdr_len = 0x%x\n",
582bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->protocol_hdr_len));
583bafec742SSukumar Swaminathan 	ql_printf("\t hdr_off = %d\n",
584bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->hdr_off));
585bafec742SSukumar Swaminathan 	ql_printf("\t vlan_tci = %d\n",
586bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->vlan_tci));
587bafec742SSukumar Swaminathan 	ql_printf("\t mss = %d\n",
588bafec742SSukumar Swaminathan 	    le16_to_cpu(pkt->mss));
589bafec742SSukumar Swaminathan 
590bafec742SSukumar Swaminathan 	/* if OAL is needed */
591bafec742SSukumar Swaminathan 	if (number > TX_DESC_PER_IOCB) {
592bafec742SSukumar Swaminathan 		for (i = 0; i < TX_DESC_PER_IOCB; i++) {
593bafec742SSukumar Swaminathan 			ql_printf("\t buf_addr%d_low = 0x%x\n",
594bafec742SSukumar Swaminathan 			    i, pkt->oal_entry[i].buf_addr_low);
595bafec742SSukumar Swaminathan 			ql_printf("\t buf_addr%d_high = 0x%x\n",
596bafec742SSukumar Swaminathan 			    i, pkt->oal_entry[i].buf_addr_high);
597bafec742SSukumar Swaminathan 			ql_printf("\t buf%d_len = 0x%x\n",
598bafec742SSukumar Swaminathan 			    i, pkt->oal_entry[i].buf_len);
599bafec742SSukumar Swaminathan 		}
600bafec742SSukumar Swaminathan 		oal_entry = (struct oal_entry *)oal;
601bafec742SSukumar Swaminathan 		ql_printf("\t additional %d tx descriptors in OAL\n",
602bafec742SSukumar Swaminathan 		    (number - TX_DESC_PER_IOCB + 1));
603bafec742SSukumar Swaminathan 		for (i = 0; i < (number-TX_DESC_PER_IOCB + 1); i++) {
604bafec742SSukumar Swaminathan 			ql_printf("\t buf_addr%d_low = 0x%x\n",
605bafec742SSukumar Swaminathan 			    i, oal_entry[i].buf_addr_low);
606bafec742SSukumar Swaminathan 			ql_printf("\t buf_addr%d_high = 0x%x\n",
607bafec742SSukumar Swaminathan 			    i, oal_entry[i].buf_addr_high);
608bafec742SSukumar Swaminathan 			ql_printf("\t buf%d_len = 0x%x\n",
609bafec742SSukumar Swaminathan 			    i, oal_entry[i].buf_len);
610bafec742SSukumar Swaminathan 		}
611bafec742SSukumar Swaminathan 	} else {
612bafec742SSukumar Swaminathan 		for (i = 0; i < number; i++) {
613bafec742SSukumar Swaminathan 			ql_printf("\t buf_addr%d_low = 0x%x\n",
614bafec742SSukumar Swaminathan 			    i, pkt->oal_entry[i].buf_addr_low);
615bafec742SSukumar Swaminathan 			ql_printf("\t buf_addr%d_high = 0x%x\n",
616bafec742SSukumar Swaminathan 			    i, pkt->oal_entry[i].buf_addr_high);
617bafec742SSukumar Swaminathan 			ql_printf("\t buf%d_len = 0x%x\n",
618bafec742SSukumar Swaminathan 			    i, pkt->oal_entry[i].buf_len);
619bafec742SSukumar Swaminathan 		}
620bafec742SSukumar Swaminathan 	}
621bafec742SSukumar Swaminathan 	ql_printf("ql_dump_req_pkt:exiting\n");
622bafec742SSukumar Swaminathan }
623bafec742SSukumar Swaminathan 
624bafec742SSukumar Swaminathan /*
625bafec742SSukumar Swaminathan  * Print PCI configuration
626bafec742SSukumar Swaminathan  */
627bafec742SSukumar Swaminathan void
ql_dump_pci_config(qlge_t * qlge)628bafec742SSukumar Swaminathan ql_dump_pci_config(qlge_t *qlge)
629bafec742SSukumar Swaminathan {
630bafec742SSukumar Swaminathan 	qlge->pci_cfg.vendor_id = (uint16_t)
631bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, PCI_CONF_VENID);
632bafec742SSukumar Swaminathan 
633bafec742SSukumar Swaminathan 	qlge->pci_cfg.device_id = (uint16_t)
634bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, PCI_CONF_DEVID);
635bafec742SSukumar Swaminathan 
636bafec742SSukumar Swaminathan 	qlge->pci_cfg.command = (uint16_t)
637bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, PCI_CONF_COMM);
638bafec742SSukumar Swaminathan 
639bafec742SSukumar Swaminathan 	qlge->pci_cfg.status = (uint16_t)
640bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, PCI_CONF_STAT);
641bafec742SSukumar Swaminathan 
642bafec742SSukumar Swaminathan 	qlge->pci_cfg.revision = (uint8_t)
643bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_REVID);
644bafec742SSukumar Swaminathan 
645bafec742SSukumar Swaminathan 	qlge->pci_cfg.prog_class = (uint8_t)
646bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_PROGCLASS);
647bafec742SSukumar Swaminathan 
648bafec742SSukumar Swaminathan 	qlge->pci_cfg.sub_class = (uint8_t)
649bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_SUBCLASS);
650bafec742SSukumar Swaminathan 
651bafec742SSukumar Swaminathan 	qlge->pci_cfg.base_class = (uint8_t)
652bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_BASCLASS);
653bafec742SSukumar Swaminathan 
654bafec742SSukumar Swaminathan 	qlge->pci_cfg.cache_line_size = (uint8_t)
655bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_CACHE_LINESZ);
656bafec742SSukumar Swaminathan 
657bafec742SSukumar Swaminathan 	qlge->pci_cfg.latency_timer = (uint8_t)
658bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_LATENCY_TIMER);
659bafec742SSukumar Swaminathan 
660bafec742SSukumar Swaminathan 	qlge->pci_cfg.header_type = (uint8_t)
661bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_HEADER);
662bafec742SSukumar Swaminathan 
663bafec742SSukumar Swaminathan 	qlge->pci_cfg.io_base_address =
664bafec742SSukumar Swaminathan 	    pci_config_get32(qlge->pci_handle, PCI_CONF_BASE0);
665bafec742SSukumar Swaminathan 
666bafec742SSukumar Swaminathan 	qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_lower =
667bafec742SSukumar Swaminathan 	    pci_config_get32(qlge->pci_handle, PCI_CONF_BASE1);
668bafec742SSukumar Swaminathan 
669bafec742SSukumar Swaminathan 	qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_upper =
670bafec742SSukumar Swaminathan 	    pci_config_get32(qlge->pci_handle, PCI_CONF_BASE2);
671bafec742SSukumar Swaminathan 
672bafec742SSukumar Swaminathan 	qlge->pci_cfg.pci_doorbell_mem_base_address_lower =
673bafec742SSukumar Swaminathan 	    pci_config_get32(qlge->pci_handle, PCI_CONF_BASE3);
674bafec742SSukumar Swaminathan 
675bafec742SSukumar Swaminathan 	qlge->pci_cfg.pci_doorbell_mem_base_address_upper =
676bafec742SSukumar Swaminathan 	    pci_config_get32(qlge->pci_handle, PCI_CONF_BASE4);
677bafec742SSukumar Swaminathan 
678bafec742SSukumar Swaminathan 	qlge->pci_cfg.sub_vendor_id = (uint16_t)
679bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, PCI_CONF_SUBVENID);
680bafec742SSukumar Swaminathan 
681bafec742SSukumar Swaminathan 	qlge->pci_cfg.sub_device_id = (uint16_t)
682bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, PCI_CONF_SUBSYSID);
683bafec742SSukumar Swaminathan 
684bafec742SSukumar Swaminathan 	qlge->pci_cfg.expansion_rom =
685bafec742SSukumar Swaminathan 	    pci_config_get32(qlge->pci_handle, PCI_CONF_ROM);
686bafec742SSukumar Swaminathan 
687bafec742SSukumar Swaminathan 	qlge->pci_cfg.intr_line = (uint8_t)
688bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_ILINE);
689bafec742SSukumar Swaminathan 
690bafec742SSukumar Swaminathan 	qlge->pci_cfg.intr_pin = (uint8_t)
691bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_IPIN);
692bafec742SSukumar Swaminathan 
693bafec742SSukumar Swaminathan 	qlge->pci_cfg.min_grant = (uint8_t)
694bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_MIN_G);
695bafec742SSukumar Swaminathan 
696bafec742SSukumar Swaminathan 	qlge->pci_cfg.max_latency = (uint8_t)
697bafec742SSukumar Swaminathan 	    pci_config_get8(qlge->pci_handle, PCI_CONF_MAX_L);
698bafec742SSukumar Swaminathan 
699bafec742SSukumar Swaminathan 	qlge->pci_cfg.pcie_device_control = (uint16_t)
700bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, 0x54);
701bafec742SSukumar Swaminathan 
702bafec742SSukumar Swaminathan 	qlge->pci_cfg.link_status = (uint16_t)
703bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, 0x5e);
704bafec742SSukumar Swaminathan 
705bafec742SSukumar Swaminathan 	qlge->pci_cfg.msi_msg_control = (uint16_t)
706bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, 0x8a);
707bafec742SSukumar Swaminathan 
708bafec742SSukumar Swaminathan 	qlge->pci_cfg.msi_x_msg_control = (uint16_t)
709bafec742SSukumar Swaminathan 	    pci_config_get16(qlge->pci_handle, 0xa2);
710bafec742SSukumar Swaminathan 
711bafec742SSukumar Swaminathan 	if (qlge->ql_dbgprnt & DBG_GLD) {
712accf27a5SSukumar Swaminathan 		ql_printf("ql_dump_pci_config(%d): enter\n",
713accf27a5SSukumar Swaminathan 		    qlge->instance);
714bafec742SSukumar Swaminathan 		ql_printf("\tvendorid =0x%x.\n",
715bafec742SSukumar Swaminathan 		    qlge->pci_cfg.vendor_id);
716bafec742SSukumar Swaminathan 		ql_printf("\tdeviceid =0x%x.\n",
717bafec742SSukumar Swaminathan 		    qlge->pci_cfg.device_id);
718bafec742SSukumar Swaminathan 		ql_printf("\tcommand =0x%x.\n",
719bafec742SSukumar Swaminathan 		    qlge->pci_cfg.command);
720bafec742SSukumar Swaminathan 		ql_printf("\tstatus =0x%x.\n",
721bafec742SSukumar Swaminathan 		    qlge->pci_cfg.status);
722bafec742SSukumar Swaminathan 		ql_printf("\trevision id =0x%x.\n",
723bafec742SSukumar Swaminathan 		    qlge->pci_cfg.revision);
724bafec742SSukumar Swaminathan 		ql_printf("\tprogram class =0x%x.\n",
725bafec742SSukumar Swaminathan 		    qlge->pci_cfg.prog_class);
726bafec742SSukumar Swaminathan 		ql_printf("\tsubclass code =0x%x.\n",
727bafec742SSukumar Swaminathan 		    qlge->pci_cfg.sub_class);
728bafec742SSukumar Swaminathan 		ql_printf("\tbase class code =0x%x.\n",
729bafec742SSukumar Swaminathan 		    qlge->pci_cfg.base_class);
730bafec742SSukumar Swaminathan 		ql_printf("\tcache line size =0x%x.\n",
731bafec742SSukumar Swaminathan 		    qlge->pci_cfg.cache_line_size);
732bafec742SSukumar Swaminathan 		ql_printf("\tlatency timer =0x%x.\n",
733bafec742SSukumar Swaminathan 		    qlge->pci_cfg.latency_timer);
734bafec742SSukumar Swaminathan 		ql_printf("\theader =0x%x.\n",
735bafec742SSukumar Swaminathan 		    qlge->pci_cfg.header_type);
736bafec742SSukumar Swaminathan 		ql_printf("\tI/O Base Register Address0 =0x%x.\n",
737bafec742SSukumar Swaminathan 		    qlge->pci_cfg.io_base_address);
738bafec742SSukumar Swaminathan 		ql_printf("\tpci_cntl_reg_set_mem_base_address_lower =0x%x.\n",
739bafec742SSukumar Swaminathan 		    qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_lower);
740bafec742SSukumar Swaminathan 		ql_printf("\tpci_cntl_reg_set_mem_base_address_upper =0x%x.\n",
741bafec742SSukumar Swaminathan 		    qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_upper);
742bafec742SSukumar Swaminathan 		ql_printf("\tpci_doorbell_mem_base_address_lower =0x%x.\n",
743bafec742SSukumar Swaminathan 		    qlge->pci_cfg.pci_doorbell_mem_base_address_lower);
744bafec742SSukumar Swaminathan 		ql_printf("\tpci_doorbell_mem_base_address_upper =0x%x.\n",
745bafec742SSukumar Swaminathan 		    qlge->pci_cfg.pci_doorbell_mem_base_address_upper);
746*d0b12b66SToomas Soome 		ql_printf("\tSubsystem Vendor Id =0x%x.\n",
747bafec742SSukumar Swaminathan 		    qlge->pci_cfg.sub_vendor_id);
748*d0b12b66SToomas Soome 		ql_printf("\tSubsystem Id =0x%x.\n",
749bafec742SSukumar Swaminathan 		    qlge->pci_cfg.sub_device_id);
750bafec742SSukumar Swaminathan 		ql_printf("\tExpansion ROM Base Register =0x%x.\n",
751bafec742SSukumar Swaminathan 		    qlge->pci_cfg.expansion_rom);
752bafec742SSukumar Swaminathan 		ql_printf("\tInterrupt Line =0x%x.\n",
753bafec742SSukumar Swaminathan 		    qlge->pci_cfg.intr_line);
754bafec742SSukumar Swaminathan 		ql_printf("\tInterrupt Pin =0x%x.\n",
755bafec742SSukumar Swaminathan 		    qlge->pci_cfg.intr_pin);
756bafec742SSukumar Swaminathan 		ql_printf("\tMin Grant =0x%x.\n",
757bafec742SSukumar Swaminathan 		    qlge->pci_cfg.min_grant);
758bafec742SSukumar Swaminathan 		ql_printf("\tMax Grant =0x%x.\n",
759bafec742SSukumar Swaminathan 		    qlge->pci_cfg.max_latency);
760bafec742SSukumar Swaminathan 		ql_printf("\tdevice_control =0x%x.\n",
761bafec742SSukumar Swaminathan 		    qlge->pci_cfg.pcie_device_control);
762bafec742SSukumar Swaminathan 		ql_printf("\tlink_status =0x%x.\n",
763bafec742SSukumar Swaminathan 		    qlge->pci_cfg.link_status);
764bafec742SSukumar Swaminathan 		ql_printf("\tmsi_msg_control =0x%x.\n",
765bafec742SSukumar Swaminathan 		    qlge->pci_cfg.msi_msg_control);
766bafec742SSukumar Swaminathan 		ql_printf("\tmsi_x_msg_control =0x%x.\n",
767bafec742SSukumar Swaminathan 		    qlge->pci_cfg.msi_x_msg_control);
768bafec742SSukumar Swaminathan 
769accf27a5SSukumar Swaminathan 		ql_printf("ql_dump_pci_config(%d): exit\n", qlge->instance);
770bafec742SSukumar Swaminathan 	}
771bafec742SSukumar Swaminathan }
772bafec742SSukumar Swaminathan 
773bafec742SSukumar Swaminathan /*
774bafec742SSukumar Swaminathan  * Print a formated string
775bafec742SSukumar Swaminathan  */
776bafec742SSukumar Swaminathan void
ql_printf(const char * fmt,...)777bafec742SSukumar Swaminathan ql_printf(const char *fmt, ...)
778bafec742SSukumar Swaminathan {
779bafec742SSukumar Swaminathan 	va_list ap;
780bafec742SSukumar Swaminathan 
781bafec742SSukumar Swaminathan 	va_start(ap, fmt);
782bafec742SSukumar Swaminathan 	vcmn_err(CE_CONT, fmt, ap);
783bafec742SSukumar Swaminathan 	va_end(ap);
784bafec742SSukumar Swaminathan 
785bafec742SSukumar Swaminathan }
786bafec742SSukumar Swaminathan 
787bafec742SSukumar Swaminathan /*
788bafec742SSukumar Swaminathan  * Read all control registers value and save in a string
789bafec742SSukumar Swaminathan  */
790bafec742SSukumar Swaminathan static uint32_t
read_ctrl_reg_set(qlge_t * qlge,caddr_t bufp)791bafec742SSukumar Swaminathan read_ctrl_reg_set(qlge_t *qlge, caddr_t bufp)
792bafec742SSukumar Swaminathan {
793bafec742SSukumar Swaminathan 	int i, j;
794bafec742SSukumar Swaminathan 	uint32_t data;
795bafec742SSukumar Swaminathan 	caddr_t bp = bufp;
796bafec742SSukumar Swaminathan 	uint32_t cnt;
797bafec742SSukumar Swaminathan 
798bafec742SSukumar Swaminathan 	/* read Reg 0 -0xC4 */
799bafec742SSukumar Swaminathan 	for (i = 0, j = 0; i <= 0xfc; i += 4) {
800bafec742SSukumar Swaminathan 		data = ql_read_reg(qlge, i);
801bafec742SSukumar Swaminathan 		(void) sprintf(bp, "Register[%x] = 0x%x\n", i, data);
802bafec742SSukumar Swaminathan 		bp += strlen(bp);
803bafec742SSukumar Swaminathan 		if (i == REG_INTERRUPT_ENABLE) {
804bafec742SSukumar Swaminathan 			/* Read */
805bafec742SSukumar Swaminathan 			data = INTR_EN_TYPE_READ;
806bafec742SSukumar Swaminathan 			ql_write_reg(qlge, i, (data | (data << 16)));
807bafec742SSukumar Swaminathan 			data = ql_read_reg(qlge, i);
808bafec742SSukumar Swaminathan 			if (data & INTR_EN_EN) {
809bafec742SSukumar Swaminathan 				(void) sprintf(bp, "Intr0 enabled: 0x%x\n",
810bafec742SSukumar Swaminathan 				    data);
811bafec742SSukumar Swaminathan 				bp += strlen(bp);
812bafec742SSukumar Swaminathan 			} else {
813bafec742SSukumar Swaminathan 				(void) sprintf(bp, "Intr0 disabled: 0x%x\n",
814bafec742SSukumar Swaminathan 				    data);
815bafec742SSukumar Swaminathan 				bp += strlen(bp);
816bafec742SSukumar Swaminathan 			}
817bafec742SSukumar Swaminathan 		}
818bafec742SSukumar Swaminathan 		j++;
819bafec742SSukumar Swaminathan 	}
820bafec742SSukumar Swaminathan 	*bp = '\0';
821bafec742SSukumar Swaminathan 	bp++;
822bafec742SSukumar Swaminathan 	cnt = (uint32_t)((uintptr_t)bp - (uintptr_t)bufp);
823bafec742SSukumar Swaminathan 	QL_PRINT(DBG_GLD, ("%s(%d) %x bytes to export\n",
824bafec742SSukumar Swaminathan 	    __func__, qlge->instance, cnt));
825bafec742SSukumar Swaminathan 	return (cnt);
826bafec742SSukumar Swaminathan }
827bafec742SSukumar Swaminathan 
828bafec742SSukumar Swaminathan /*
829bafec742SSukumar Swaminathan  * Get address and size of image tables in flash memory
830bafec742SSukumar Swaminathan  */
831bafec742SSukumar Swaminathan static int
ql_get_flash_table_region_info(qlge_t * qlge,uint32_t region,uint32_t * addr,uint32_t * size)832bafec742SSukumar Swaminathan ql_get_flash_table_region_info(qlge_t *qlge, uint32_t region, uint32_t *addr,
833bafec742SSukumar Swaminathan     uint32_t *size)
834bafec742SSukumar Swaminathan {
835bafec742SSukumar Swaminathan 	int rval = DDI_SUCCESS;
836bafec742SSukumar Swaminathan 
837bafec742SSukumar Swaminathan 	switch (region) {
838bafec742SSukumar Swaminathan 	case FLT_REGION_FDT:
839bafec742SSukumar Swaminathan 		*addr = ISP_8100_FDT_ADDR;
840bafec742SSukumar Swaminathan 		*size = ISP_8100_FDT_SIZE;
841bafec742SSukumar Swaminathan 		break;
842bafec742SSukumar Swaminathan 	case FLT_REGION_FLT:
843bafec742SSukumar Swaminathan 		*addr = ISP_8100_FLT_ADDR;
844bafec742SSukumar Swaminathan 		*size = ISP_8100_FLT_SIZE;
845bafec742SSukumar Swaminathan 		break;
846bafec742SSukumar Swaminathan 	case FLT_REGION_NIC_BOOT_CODE:
847bafec742SSukumar Swaminathan 		*addr = ISP_8100_NIC_BOOT_CODE_ADDR;
848bafec742SSukumar Swaminathan 		*size = ISP_8100_NIC_BOOT_CODE_SIZE;
849bafec742SSukumar Swaminathan 		break;
850bafec742SSukumar Swaminathan 	case FLT_REGION_MPI_FW_USE:
851bafec742SSukumar Swaminathan 		*addr = ISP_8100_MPI_FW_USE_ADDR;
852bafec742SSukumar Swaminathan 		*size = ISP_8100_MPI_FW_USE_SIZE;
853bafec742SSukumar Swaminathan 		break;
854bafec742SSukumar Swaminathan 	case FLT_REGION_MPI_RISC_FW:
855bafec742SSukumar Swaminathan 		*addr = ISP_8100_MPI_RISC_FW_ADDR;
856bafec742SSukumar Swaminathan 		*size = ISP_8100_MPI_RISC_FW_SIZE;
857bafec742SSukumar Swaminathan 		break;
858bafec742SSukumar Swaminathan 	case FLT_REGION_VPD0:
859bafec742SSukumar Swaminathan 		*addr = ISP_8100_VPD0_ADDR;
860bafec742SSukumar Swaminathan 		*size = ISP_8100_VPD0_SIZE;
861bafec742SSukumar Swaminathan 		break;
862bafec742SSukumar Swaminathan 	case FLT_REGION_NIC_PARAM0:
863bafec742SSukumar Swaminathan 		*addr = ISP_8100_NIC_PARAM0_ADDR;
864bafec742SSukumar Swaminathan 		*size = ISP_8100_NIC_PARAM0_SIZE;
865bafec742SSukumar Swaminathan 		break;
866bafec742SSukumar Swaminathan 	case FLT_REGION_VPD1:
867bafec742SSukumar Swaminathan 		*addr = ISP_8100_VPD1_ADDR;
868bafec742SSukumar Swaminathan 		*size = ISP_8100_VPD1_SIZE;
869bafec742SSukumar Swaminathan 		break;
870bafec742SSukumar Swaminathan 	case FLT_REGION_NIC_PARAM1:
871bafec742SSukumar Swaminathan 		*addr = ISP_8100_NIC_PARAM1_ADDR;
872bafec742SSukumar Swaminathan 		*size = ISP_8100_NIC_PARAM1_SIZE;
873bafec742SSukumar Swaminathan 		break;
874bafec742SSukumar Swaminathan 	case FLT_REGION_MPI_CFG:
875bafec742SSukumar Swaminathan 		*addr = ISP_8100_MPI_CFG_ADDR;
876bafec742SSukumar Swaminathan 		*size = ISP_8100_MPI_CFG_SIZE;
877bafec742SSukumar Swaminathan 		break;
878bafec742SSukumar Swaminathan 	case FLT_REGION_EDC_PHY_FW:
879bafec742SSukumar Swaminathan 		*addr = ISP_8100_EDC_PHY_FW_ADDR;
880bafec742SSukumar Swaminathan 		*size = ISP_8100_EDC_PHY_FW_SIZE;
881bafec742SSukumar Swaminathan 		break;
882bafec742SSukumar Swaminathan 	case FLT_REGION_FC_BOOT_CODE:
883bafec742SSukumar Swaminathan 		*addr = ISP_8100_FC_BOOT_CODE_ADDR;
884bafec742SSukumar Swaminathan 		*size = ISP_8100_FC_BOOT_CODE_SIZE;
885bafec742SSukumar Swaminathan 		break;
886bafec742SSukumar Swaminathan 	case FLT_REGION_FC_FW:
887bafec742SSukumar Swaminathan 		*addr = ISP_8100_FC_FW_ADDR;
888bafec742SSukumar Swaminathan 		*size = ISP_8100_FC_FW_SIZE;
889bafec742SSukumar Swaminathan 		break;
890bafec742SSukumar Swaminathan 	default:
891bafec742SSukumar Swaminathan 		cmn_err(CE_WARN, "%s(%d): Unknown region code %x!",
892bafec742SSukumar Swaminathan 		    __func__, qlge->instance, region);
893bafec742SSukumar Swaminathan 		rval = DDI_FAILURE;
894bafec742SSukumar Swaminathan 	}
895bafec742SSukumar Swaminathan 	return (rval);
896bafec742SSukumar Swaminathan }
897bafec742SSukumar Swaminathan 
898bafec742SSukumar Swaminathan /*
899bafec742SSukumar Swaminathan  * Get PCI bus information
900bafec742SSukumar Swaminathan  */
901bafec742SSukumar Swaminathan static int
ql_get_pci_bus_info(qlge_t * qlge,uint32_t * pci_bus_info_ptr)902bafec742SSukumar Swaminathan ql_get_pci_bus_info(qlge_t *qlge, uint32_t *pci_bus_info_ptr)
903bafec742SSukumar Swaminathan {
904bafec742SSukumar Swaminathan 	dev_info_t *dip;
905bafec742SSukumar Swaminathan 	int *options;
906bafec742SSukumar Swaminathan 	unsigned int noptions;
907bafec742SSukumar Swaminathan 	int rval = DDI_FAILURE;
908bafec742SSukumar Swaminathan 
909bafec742SSukumar Swaminathan 	dip = qlge->dip;
910bafec742SSukumar Swaminathan 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0,
911bafec742SSukumar Swaminathan 	    "assigned-addresses", &options, &noptions) == DDI_PROP_SUCCESS) {
912bafec742SSukumar Swaminathan 		QL_PRINT(DBG_GLD, ("%s(%d) %d options\n",
913bafec742SSukumar Swaminathan 		    __func__, qlge->instance, noptions));
914bafec742SSukumar Swaminathan 
915bafec742SSukumar Swaminathan 		if (noptions != 0) {
916bafec742SSukumar Swaminathan 			*pci_bus_info_ptr = options[0];
917bafec742SSukumar Swaminathan 			rval = DDI_SUCCESS;
918bafec742SSukumar Swaminathan 		}
919bafec742SSukumar Swaminathan 
920bafec742SSukumar Swaminathan 		ddi_prop_free(options);
921bafec742SSukumar Swaminathan 	}
922bafec742SSukumar Swaminathan 	return (rval);
923bafec742SSukumar Swaminathan }
924bafec742SSukumar Swaminathan 
925bafec742SSukumar Swaminathan /*
926bafec742SSukumar Swaminathan  * Build the first packet header in case that 1k+ data transfer is required
927bafec742SSukumar Swaminathan  */
928bafec742SSukumar Swaminathan void
build_init_pkt_header(qlge_t * qlge,ioctl_header_info_t * pheader,uint32_t size)929bafec742SSukumar Swaminathan build_init_pkt_header(qlge_t *qlge, ioctl_header_info_t *pheader, uint32_t size)
930bafec742SSukumar Swaminathan {
931bafec742SSukumar Swaminathan 	qlge->ioctl_total_length = size;
932bafec742SSukumar Swaminathan 	QL_PRINT(DBG_GLD, ("%d bytes used in kernel buffer\n",
933bafec742SSukumar Swaminathan 	    qlge->ioctl_total_length));
934bafec742SSukumar Swaminathan 	qlge->expected_trans_times =
935bafec742SSukumar Swaminathan 	    (uint16_t)(qlge->ioctl_total_length / IOCTL_MAX_DATA_LEN);
936bafec742SSukumar Swaminathan 	if ((qlge->ioctl_total_length % IOCTL_MAX_DATA_LEN) != 0)
937bafec742SSukumar Swaminathan 		qlge->expected_trans_times++;
938bafec742SSukumar Swaminathan 	QL_PRINT(DBG_GLD, ("expected transer times %d \n",
939bafec742SSukumar Swaminathan 	    qlge->expected_trans_times));
940bafec742SSukumar Swaminathan 	qlge->ioctl_transferred_bytes = 0;
941bafec742SSukumar Swaminathan 	/*
942bafec742SSukumar Swaminathan 	 * tell user total bytes prepare to receive in the
943bafec742SSukumar Swaminathan 	 * following transactions
944bafec742SSukumar Swaminathan 	 */
945bafec742SSukumar Swaminathan 	pheader->version = 0;
946bafec742SSukumar Swaminathan 	pheader->total_length = qlge->ioctl_total_length;
947bafec742SSukumar Swaminathan 	pheader->payload_length = 0;
948bafec742SSukumar Swaminathan 	pheader->expected_trans_times = qlge->expected_trans_times;
949bafec742SSukumar Swaminathan }
950bafec742SSukumar Swaminathan 
951bafec742SSukumar Swaminathan /*
952bafec742SSukumar Swaminathan  * Do ioctl on hardware
953bafec742SSukumar Swaminathan  */
954bafec742SSukumar Swaminathan /* ARGSUSED */
955bafec742SSukumar Swaminathan enum ioc_reply
ql_chip_ioctl(qlge_t * qlge,queue_t * q,mblk_t * mp)956bafec742SSukumar Swaminathan ql_chip_ioctl(qlge_t *qlge, queue_t *q, mblk_t *mp)
957bafec742SSukumar Swaminathan {
958bafec742SSukumar Swaminathan 	mblk_t *dmp;
959bafec742SSukumar Swaminathan 	int cmd, i, rval;
960bafec742SSukumar Swaminathan 	struct ql_device_reg *reg;
961bafec742SSukumar Swaminathan 	struct ql_pci_reg *pci_reg;
962bafec742SSukumar Swaminathan 	struct ql_flash_io_info *flash_io_info_ptr;
963bafec742SSukumar Swaminathan 	pci_cfg_t *pci_cfg;
964bafec742SSukumar Swaminathan 	uint32_t *pvalue;
965bafec742SSukumar Swaminathan 	struct qlnic_prop_info *prop_ptr;
966bafec742SSukumar Swaminathan 	ql_adapter_info_t *adapter_info_ptr;
967bafec742SSukumar Swaminathan 	uint16_t payload_len;
968bafec742SSukumar Swaminathan 	uint32_t remaining_bytes;
969bafec742SSukumar Swaminathan 	ioctl_header_info_t *pheader;
970bafec742SSukumar Swaminathan 	caddr_t bp, bdesc;
971bafec742SSukumar Swaminathan 	uint32_t len;
972bafec742SSukumar Swaminathan 	uint32_t addr, size, region;
973bafec742SSukumar Swaminathan 	struct iocblk *iocp = (struct iocblk *)(void *)mp->b_rptr;
974bafec742SSukumar Swaminathan 	uint16_t iltds_image_entry_regions[] = {
975bafec742SSukumar Swaminathan 			FLT_REGION_NIC_BOOT_CODE, FLT_REGION_MPI_RISC_FW,
976bafec742SSukumar Swaminathan 			FLT_REGION_EDC_PHY_FW, FLT_REGION_FC_BOOT_CODE,
977bafec742SSukumar Swaminathan 			FLT_REGION_FC_FW};
978bafec742SSukumar Swaminathan 	ql_iltds_description_header_t *iltds_ptr;
979bafec742SSukumar Swaminathan 	ql_iltds_header_t *ql_iltds_header_ptr;
980bafec742SSukumar Swaminathan 	uint32_t offset;
981bafec742SSukumar Swaminathan 	uint16_t requested_dump;
982bafec742SSukumar Swaminathan 
983bafec742SSukumar Swaminathan 	/*
984bafec742SSukumar Swaminathan 	 * There should be a M_DATA mblk following
985bafec742SSukumar Swaminathan 	 * the initial M_IOCTL mblk
986bafec742SSukumar Swaminathan 	 */
987bafec742SSukumar Swaminathan 	if ((dmp = mp->b_cont) == NULL) {
988bafec742SSukumar Swaminathan 		cmn_err(CE_WARN, "%s(%d) b_count NULL",
989bafec742SSukumar Swaminathan 		    __func__, qlge->instance);
990bafec742SSukumar Swaminathan 		return (IOC_INVAL);
991bafec742SSukumar Swaminathan 	}
992bafec742SSukumar Swaminathan 
993bafec742SSukumar Swaminathan 	cmd = iocp->ioc_cmd;
994bafec742SSukumar Swaminathan 
995bafec742SSukumar Swaminathan 	reg = (struct ql_device_reg *)(void *)dmp->b_rptr;
996bafec742SSukumar Swaminathan 	pci_reg = (struct ql_pci_reg *)(void *)dmp->b_rptr;
997bafec742SSukumar Swaminathan 	pvalue = (uint32_t *)(void *)dmp->b_rptr;
998bafec742SSukumar Swaminathan 	flash_io_info_ptr = (struct ql_flash_io_info *)(void *)dmp->b_rptr;
999bafec742SSukumar Swaminathan 	adapter_info_ptr = (ql_adapter_info_t *)(void *)dmp->b_rptr;
1000bafec742SSukumar Swaminathan 
1001bafec742SSukumar Swaminathan 	switch (cmd) {
1002bafec742SSukumar Swaminathan 		case QLA_GET_DBGLEAVEL:
1003bafec742SSukumar Swaminathan 			if (iocp->ioc_count != sizeof (*pvalue)) {
1004bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1005bafec742SSukumar Swaminathan 			}
1006bafec742SSukumar Swaminathan 			*pvalue = qlge->ql_dbgprnt;
1007bafec742SSukumar Swaminathan 			break;
1008bafec742SSukumar Swaminathan 
1009bafec742SSukumar Swaminathan 		case QLA_SET_DBGLEAVEL:
1010bafec742SSukumar Swaminathan 			if (iocp->ioc_count != sizeof (*pvalue)) {
1011bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1012bafec742SSukumar Swaminathan 			}
1013bafec742SSukumar Swaminathan 			qlge->ql_dbgprnt = *pvalue;
1014bafec742SSukumar Swaminathan 			break;
1015bafec742SSukumar Swaminathan 
1016bafec742SSukumar Swaminathan 		case QLA_WRITE_REG:
1017bafec742SSukumar Swaminathan 			if (iocp->ioc_count != sizeof (*reg)) {
1018bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1019bafec742SSukumar Swaminathan 			}
1020bafec742SSukumar Swaminathan 			ql_write_reg(qlge, reg->addr, reg->value);
1021bafec742SSukumar Swaminathan 			break;
1022bafec742SSukumar Swaminathan 
1023bafec742SSukumar Swaminathan 		case QLA_READ_PCI_REG:
1024bafec742SSukumar Swaminathan 			if (iocp->ioc_count != sizeof (*pci_reg)) {
1025bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1026bafec742SSukumar Swaminathan 			}
1027bafec742SSukumar Swaminathan 			/* protect against bad addr values */
1028bafec742SSukumar Swaminathan 			if (pci_reg->addr > 0xff)
1029bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1030bafec742SSukumar Swaminathan 			pci_reg->value =
1031bafec742SSukumar Swaminathan 			    (uint16_t)pci_config_get16(qlge->pci_handle,
1032bafec742SSukumar Swaminathan 			    pci_reg->addr);
1033bafec742SSukumar Swaminathan 			break;
1034bafec742SSukumar Swaminathan 
1035bafec742SSukumar Swaminathan 		case QLA_WRITE_PCI_REG:
1036bafec742SSukumar Swaminathan 			if (iocp->ioc_count != sizeof (*pci_reg)) {
1037bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1038bafec742SSukumar Swaminathan 			}
1039bafec742SSukumar Swaminathan 			/* protect against bad addr values */
1040bafec742SSukumar Swaminathan 			if (pci_reg->addr > 0xff)
1041bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1042bafec742SSukumar Swaminathan 			pci_config_put16(qlge->pci_handle, pci_reg->addr,
1043bafec742SSukumar Swaminathan 			    pci_reg->value);
1044bafec742SSukumar Swaminathan 			break;
1045bafec742SSukumar Swaminathan 
1046bafec742SSukumar Swaminathan 		case QLA_PCI_STATUS:
1047bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1048bafec742SSukumar Swaminathan 			if (len != sizeof (pci_cfg_t)) {
1049bafec742SSukumar Swaminathan 				cmn_err(CE_WARN, "QLA_PCI_STATUS size error, "
1050bafec742SSukumar Swaminathan 				    "driver size 0x%x not 0x%x ",
1051bafec742SSukumar Swaminathan 				    (int)MBLKL(dmp),
1052bafec742SSukumar Swaminathan 				    (int)sizeof (pci_cfg_t));
1053bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1054bafec742SSukumar Swaminathan 			}
1055bafec742SSukumar Swaminathan 			pci_cfg = (pci_cfg_t *)(void *)dmp->b_rptr;
1056bafec742SSukumar Swaminathan 			/* get PCI configuration */
1057bafec742SSukumar Swaminathan 			bcopy((const void *)(&qlge->pci_cfg),
1058bafec742SSukumar Swaminathan 			    (void *)pci_cfg, len);
1059bafec742SSukumar Swaminathan 			break;
1060bafec742SSukumar Swaminathan 
1061bafec742SSukumar Swaminathan 		case QLA_GET_PROP:
1062bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1063bafec742SSukumar Swaminathan 			if (len != sizeof (struct qlnic_prop_info)) {
1064bafec742SSukumar Swaminathan 				cmn_err(CE_WARN, "QLA_GET_PROP size error, "
1065bafec742SSukumar Swaminathan 				    "driver size 0x%x not 0x%x ",
1066bafec742SSukumar Swaminathan 				    (int)MBLKL(dmp),
1067bafec742SSukumar Swaminathan 				    (int)sizeof (pci_cfg_t));
1068bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1069bafec742SSukumar Swaminathan 			}
1070bafec742SSukumar Swaminathan 			prop_ptr =
1071bafec742SSukumar Swaminathan 			    (struct qlnic_prop_info *)(void *)dmp->b_rptr;
1072bafec742SSukumar Swaminathan 			/* get various properties */
1073accf27a5SSukumar Swaminathan 			mutex_enter(&qlge->mbx_mutex);
10740662fbf4SSukumar Swaminathan 			(void) ql_get_firmware_version(qlge,
1075bafec742SSukumar Swaminathan 			    &prop_ptr->mpi_version);
10760662fbf4SSukumar Swaminathan 			(void) ql_get_fw_state(qlge, &prop_ptr->fw_state);
10770662fbf4SSukumar Swaminathan 			(void) qlge_get_link_status(qlge,
10780662fbf4SSukumar Swaminathan 			    &prop_ptr->link_status);
1079accf27a5SSukumar Swaminathan 			mutex_exit(&qlge->mbx_mutex);
1080bafec742SSukumar Swaminathan 			break;
1081bafec742SSukumar Swaminathan 
1082bafec742SSukumar Swaminathan 		case QLA_LIST_ADAPTER_INFO:
1083bafec742SSukumar Swaminathan 			/* count must be exactly same */
1084bafec742SSukumar Swaminathan 			if (iocp->ioc_count != sizeof (ql_adapter_info_t)) {
1085bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1086bafec742SSukumar Swaminathan 			}
1087bafec742SSukumar Swaminathan 			if (ql_get_pci_bus_info(qlge,
1088bafec742SSukumar Swaminathan 			    &(adapter_info_ptr->pci_binding)) != DDI_SUCCESS) {
1089bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1090bafec742SSukumar Swaminathan 			}
1091bafec742SSukumar Swaminathan 			adapter_info_ptr->vendor_id =
1092bafec742SSukumar Swaminathan 			    qlge->pci_cfg.vendor_id;
1093bafec742SSukumar Swaminathan 			adapter_info_ptr->sub_vendor_id =
1094bafec742SSukumar Swaminathan 			    qlge->pci_cfg.sub_vendor_id;
1095bafec742SSukumar Swaminathan 			adapter_info_ptr->device_id =
1096bafec742SSukumar Swaminathan 			    qlge->pci_cfg.device_id;
1097bafec742SSukumar Swaminathan 			adapter_info_ptr->sub_device_id =
1098bafec742SSukumar Swaminathan 			    qlge->pci_cfg.sub_device_id;
1099bafec742SSukumar Swaminathan 
1100bafec742SSukumar Swaminathan 			bcopy(qlge->unicst_addr[0].addr.ether_addr_octet,
1101bafec742SSukumar Swaminathan 			    &(adapter_info_ptr->cur_addr), ETHERADDRL);
1102bafec742SSukumar Swaminathan 			break;
1103bafec742SSukumar Swaminathan 
1104bafec742SSukumar Swaminathan 		case QLA_SHOW_REGION:
1105bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1106bafec742SSukumar Swaminathan 			bdesc = (caddr_t)dmp->b_rptr;
1107bafec742SSukumar Swaminathan 			if (CFG_IST(qlge, CFG_CHIP_8100))
1108bafec742SSukumar Swaminathan 				(void) sprintf(bdesc, "ISP 8100 available "
1109bafec742SSukumar Swaminathan 				    "regions %s", ISP_8100_REGION);
1110bafec742SSukumar Swaminathan 			break;
1111bafec742SSukumar Swaminathan 
1112bafec742SSukumar Swaminathan 		case QLA_CONTINUE_COPY_OUT:
1113bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL)
1114bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1115bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1116bafec742SSukumar Swaminathan 			bp = qlge->ioctl_buf_ptr;
1117bafec742SSukumar Swaminathan 			bp += qlge->ioctl_transferred_bytes;
1118bafec742SSukumar Swaminathan 			remaining_bytes =
1119bafec742SSukumar Swaminathan 			    qlge->ioctl_total_length -
1120bafec742SSukumar Swaminathan 			    qlge->ioctl_transferred_bytes;
1121bafec742SSukumar Swaminathan 			/* how many data bytes sent this time */
1122bafec742SSukumar Swaminathan 			payload_len =
1123bafec742SSukumar Swaminathan 			    (uint16_t)min(IOCTL_MAX_DATA_LEN, remaining_bytes);
1124bafec742SSukumar Swaminathan 			/* create packet header */
1125bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1126bafec742SSukumar Swaminathan 			pheader->version = 0;
1127bafec742SSukumar Swaminathan 			pheader->total_length = qlge->ioctl_total_length;
1128bafec742SSukumar Swaminathan 			pheader->expected_trans_times =
1129bafec742SSukumar Swaminathan 			    qlge->expected_trans_times;
1130bafec742SSukumar Swaminathan 			pheader->payload_length = payload_len;
1131bafec742SSukumar Swaminathan 			/* create packet payload */
1132bafec742SSukumar Swaminathan 			bdesc = (caddr_t)dmp->b_rptr;
1133bafec742SSukumar Swaminathan 			bdesc += IOCTL_HEADER_LEN;
1134bafec742SSukumar Swaminathan 			bcopy(bp, bdesc, pheader->payload_length);
1135bafec742SSukumar Swaminathan 			qlge->ioctl_transferred_bytes +=
1136bafec742SSukumar Swaminathan 			    pheader->payload_length;
1137bafec742SSukumar Swaminathan 			QL_PRINT(DBG_GLD, ("QLA_CONTINUE_COPY_OUT, %d bytes"
1138bafec742SSukumar Swaminathan 			    " exported \n", payload_len));
1139bafec742SSukumar Swaminathan 			if (qlge->ioctl_transferred_bytes >=
1140bafec742SSukumar Swaminathan 			    qlge->ioctl_total_length) {
1141bafec742SSukumar Swaminathan 				QL_PRINT(DBG_GLD, ("all data out,clean up \n"));
1142bafec742SSukumar Swaminathan 				kmem_free(qlge->ioctl_buf_ptr,
1143bafec742SSukumar Swaminathan 				    qlge->ioctl_buf_lenth);
1144bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr = NULL;
1145bafec742SSukumar Swaminathan 				qlge->ioctl_buf_lenth = 0;
1146bafec742SSukumar Swaminathan 			}
1147bafec742SSukumar Swaminathan 			iocp->ioc_count = len;
1148bafec742SSukumar Swaminathan 			break;
1149bafec742SSukumar Swaminathan 
1150bafec742SSukumar Swaminathan 		case QLA_CONTINUE_COPY_IN:
1151bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL)
1152bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1153bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1154bafec742SSukumar Swaminathan 			bdesc = qlge->ioctl_buf_ptr;
1155bafec742SSukumar Swaminathan 			bdesc += qlge->ioctl_transferred_bytes;
1156bafec742SSukumar Swaminathan 			remaining_bytes = qlge->ioctl_total_length -
1157bafec742SSukumar Swaminathan 			    qlge->ioctl_transferred_bytes;
1158bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1159bafec742SSukumar Swaminathan 			payload_len = pheader->payload_length;
1160bafec742SSukumar Swaminathan 			/* create packet header */
1161bafec742SSukumar Swaminathan 			pheader->version = 0;
1162bafec742SSukumar Swaminathan 			pheader->total_length = qlge->ioctl_total_length;
1163bafec742SSukumar Swaminathan 			pheader->expected_trans_times =
1164bafec742SSukumar Swaminathan 			    qlge->expected_trans_times;
1165bafec742SSukumar Swaminathan 			/* get packet payload */
1166bafec742SSukumar Swaminathan 			bp = (caddr_t)dmp->b_rptr;
1167bafec742SSukumar Swaminathan 			bp += IOCTL_HEADER_LEN;
1168bafec742SSukumar Swaminathan 			bcopy(bp, bdesc, pheader->payload_length);
1169bafec742SSukumar Swaminathan 			qlge->ioctl_transferred_bytes +=
1170bafec742SSukumar Swaminathan 			    pheader->payload_length;
1171bafec742SSukumar Swaminathan 			QL_PRINT(DBG_GLD, ("QLA_CONTINUE_COPY_IN, %d bytes "
1172bafec742SSukumar Swaminathan 			    "received \n", payload_len));
1173bafec742SSukumar Swaminathan 			if (qlge->ioctl_transferred_bytes >=
1174bafec742SSukumar Swaminathan 			    qlge->ioctl_total_length) {
1175bafec742SSukumar Swaminathan 				region = pheader->option[0];
11760662fbf4SSukumar Swaminathan 				(void) ql_get_flash_table_region_info(qlge,
11770662fbf4SSukumar Swaminathan 				    region, &addr, &size);
1178bafec742SSukumar Swaminathan 				QL_PRINT(DBG_GLD, ("write data to region 0x%x,"
1179bafec742SSukumar Swaminathan 				    " addr 0x%x, max size %d bytes\n",
1180bafec742SSukumar Swaminathan 				    region, addr, size));
11810662fbf4SSukumar Swaminathan 				(void) qlge_load_flash(qlge,
1182bafec742SSukumar Swaminathan 				    (uint8_t *)qlge->ioctl_buf_ptr,
1183bafec742SSukumar Swaminathan 				    qlge->ioctl_transferred_bytes /* size */,
1184bafec742SSukumar Swaminathan 				    addr);
1185bafec742SSukumar Swaminathan 				QL_PRINT(DBG_GLD, ("all %d data written, do "
1186bafec742SSukumar Swaminathan 				    "clean up \n",
1187bafec742SSukumar Swaminathan 				    qlge->ioctl_transferred_bytes));
1188bafec742SSukumar Swaminathan 				kmem_free(qlge->ioctl_buf_ptr,
1189bafec742SSukumar Swaminathan 				    qlge->ioctl_buf_lenth);
1190bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr = NULL;
1191bafec742SSukumar Swaminathan 				qlge->ioctl_buf_lenth = 0;
1192bafec742SSukumar Swaminathan 			}
1193bafec742SSukumar Swaminathan 			iocp->ioc_count = len;
1194bafec742SSukumar Swaminathan 			break;
1195bafec742SSukumar Swaminathan 
1196bafec742SSukumar Swaminathan 		case QLA_READ_CONTRL_REGISTERS:
1197bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL) {
1198bafec742SSukumar Swaminathan 				qlge->ioctl_buf_lenth =
1199bafec742SSukumar Swaminathan 				    IOCTL_MAX_BUF_SIZE; /* 512k */
1200bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr =
1201bafec742SSukumar Swaminathan 				    kmem_zalloc(qlge->ioctl_buf_lenth,
1202bafec742SSukumar Swaminathan 				    KM_SLEEP);
1203bafec742SSukumar Swaminathan 				if (qlge->ioctl_buf_ptr == NULL) {
1204bafec742SSukumar Swaminathan 					cmn_err(CE_WARN, "%s(%d): Unable to "
1205bafec742SSukumar Swaminathan 					    "allocate ioctl buffer",
1206bafec742SSukumar Swaminathan 					    __func__, qlge->instance);
1207bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1208bafec742SSukumar Swaminathan 				}
1209bafec742SSukumar Swaminathan 			}
1210bafec742SSukumar Swaminathan 			len = read_ctrl_reg_set(qlge, qlge->ioctl_buf_ptr);
1211bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1212bafec742SSukumar Swaminathan 			/* build initial ioctl packet header */
1213bafec742SSukumar Swaminathan 			build_init_pkt_header(qlge, pheader, len);
1214bafec742SSukumar Swaminathan 			iocp->ioc_count = sizeof (*pheader);
1215bafec742SSukumar Swaminathan 			break;
1216bafec742SSukumar Swaminathan 
1217bafec742SSukumar Swaminathan 		case QLA_SUPPORTED_DUMP_TYPES: /* show available regions */
1218bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1219bafec742SSukumar Swaminathan 			bdesc = (caddr_t)dmp->b_rptr;
1220bafec742SSukumar Swaminathan 			if (CFG_IST(qlge, CFG_CHIP_8100))
1221bafec742SSukumar Swaminathan 				(void) sprintf(bdesc, "ISP 8100 supported dump"
1222bafec742SSukumar Swaminathan 				    " types: %s", ISP_8100_AVAILABLE_DUMPS);
1223bafec742SSukumar Swaminathan 			break;
1224bafec742SSukumar Swaminathan 
1225bafec742SSukumar Swaminathan 		case QLA_GET_BINARY_CORE_DUMP:
1226bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1227bafec742SSukumar Swaminathan 			requested_dump = *((uint16_t *)(void *)dmp->b_rptr);
1228bafec742SSukumar Swaminathan 			rval = ql_binary_core_dump(qlge, requested_dump, &len);
1229bafec742SSukumar Swaminathan 			if (rval == DDI_SUCCESS) {
1230bafec742SSukumar Swaminathan 				pheader =
1231bafec742SSukumar Swaminathan 				    (ioctl_header_info_t *)(void *)dmp->b_rptr;
1232bafec742SSukumar Swaminathan 				/* build initial ioctl packet header */
1233bafec742SSukumar Swaminathan 				build_init_pkt_header(qlge, pheader, len);
1234bafec742SSukumar Swaminathan 				iocp->ioc_count = sizeof (*pheader);
1235bafec742SSukumar Swaminathan 			} else {
1236bafec742SSukumar Swaminathan 				cmn_err(CE_WARN, "ql_binary_core_dump error");
1237bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1238bafec742SSukumar Swaminathan 			}
1239bafec742SSukumar Swaminathan 			break;
1240bafec742SSukumar Swaminathan 
1241bafec742SSukumar Swaminathan 		case QLA_TRIGGER_SYS_ERROR_EVENT:
12420662fbf4SSukumar Swaminathan 			(void) ql_trigger_system_error_event(qlge);
1243bafec742SSukumar Swaminathan 			break;
1244bafec742SSukumar Swaminathan 
1245bafec742SSukumar Swaminathan 		case QLA_READ_VPD:
1246bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL) {
1247bafec742SSukumar Swaminathan 				qlge->ioctl_buf_lenth =
1248bafec742SSukumar Swaminathan 				    IOCTL_MAX_BUF_SIZE; /* 512k */
1249bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr =
1250bafec742SSukumar Swaminathan 				    kmem_zalloc(qlge->ioctl_buf_lenth,
1251bafec742SSukumar Swaminathan 				    KM_SLEEP);
1252bafec742SSukumar Swaminathan 				if (qlge->ioctl_buf_ptr == NULL) {
1253bafec742SSukumar Swaminathan 					cmn_err(CE_WARN, "%s(%d): Unable to "
1254bafec742SSukumar Swaminathan 					    "allocate ioctl buffer",
1255bafec742SSukumar Swaminathan 					    __func__, qlge->instance);
1256bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1257bafec742SSukumar Swaminathan 				}
1258bafec742SSukumar Swaminathan 			}
1259bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1260bafec742SSukumar Swaminathan 			QL_PRINT(DBG_GLD, (" 0x%x user buffer available \n",
1261bafec742SSukumar Swaminathan 			    len));
12620662fbf4SSukumar Swaminathan 			(void) ql_flash_vpd(qlge,
12630662fbf4SSukumar Swaminathan 			    (uint8_t *)qlge->ioctl_buf_ptr);
1264bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1265bafec742SSukumar Swaminathan 			/* build initial ioctl packet header */
1266bafec742SSukumar Swaminathan 			build_init_pkt_header(qlge, pheader,
1267bafec742SSukumar Swaminathan 			    ISP_8100_VPD0_SIZE);
1268bafec742SSukumar Swaminathan 			iocp->ioc_count = sizeof (*pheader);
1269bafec742SSukumar Swaminathan 			break;
1270bafec742SSukumar Swaminathan 
1271bafec742SSukumar Swaminathan 		case QLA_MANUAL_READ_FLASH:
1272bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL) {
1273bafec742SSukumar Swaminathan 				qlge->ioctl_buf_lenth =
1274bafec742SSukumar Swaminathan 				    IOCTL_MAX_BUF_SIZE; /* 512k */
1275bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr =
1276bafec742SSukumar Swaminathan 				    kmem_zalloc(qlge->ioctl_buf_lenth,
1277bafec742SSukumar Swaminathan 				    KM_SLEEP);
1278bafec742SSukumar Swaminathan 				if (qlge->ioctl_buf_ptr == NULL) {
1279bafec742SSukumar Swaminathan 					cmn_err(CE_WARN, "%s(%d): Unable to "
1280bafec742SSukumar Swaminathan 					    "allocate ioctl buffer",
1281bafec742SSukumar Swaminathan 					    __func__, qlge->instance);
1282bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1283bafec742SSukumar Swaminathan 				}
1284bafec742SSukumar Swaminathan 			}
1285bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1286bafec742SSukumar Swaminathan 			rval = qlge_dump_fcode(qlge,
1287bafec742SSukumar Swaminathan 			    (uint8_t *)qlge->ioctl_buf_ptr,
1288bafec742SSukumar Swaminathan 			    flash_io_info_ptr->size,
1289bafec742SSukumar Swaminathan 			    flash_io_info_ptr->addr);
1290bafec742SSukumar Swaminathan 			if (rval != DDI_SUCCESS) {
1291bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1292bafec742SSukumar Swaminathan 			}
1293bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1294bafec742SSukumar Swaminathan 			/* build initial ioctl packet header */
1295bafec742SSukumar Swaminathan 			build_init_pkt_header(qlge, pheader,
1296bafec742SSukumar Swaminathan 			    flash_io_info_ptr->size);
1297bafec742SSukumar Swaminathan 			iocp->ioc_count = sizeof (*pheader);
1298bafec742SSukumar Swaminathan 			break;
1299bafec742SSukumar Swaminathan 
1300bafec742SSukumar Swaminathan 		case QLA_READ_FLASH:
1301bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL) {
1302bafec742SSukumar Swaminathan 				qlge->ioctl_buf_lenth = IOCTL_MAX_BUF_SIZE;
1303bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr =
1304bafec742SSukumar Swaminathan 				    kmem_zalloc(qlge->ioctl_buf_lenth,
1305bafec742SSukumar Swaminathan 				    KM_SLEEP);
1306bafec742SSukumar Swaminathan 				if (qlge->ioctl_buf_ptr == NULL) {
1307bafec742SSukumar Swaminathan 					cmn_err(CE_WARN, "%s(%d): Unable to"
1308bafec742SSukumar Swaminathan 					    "allocate ioctl buffer",
1309bafec742SSukumar Swaminathan 					    __func__, qlge->instance);
1310bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1311bafec742SSukumar Swaminathan 				}
1312bafec742SSukumar Swaminathan 			}
1313bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1314bafec742SSukumar Swaminathan 			region = *pvalue;
1315bafec742SSukumar Swaminathan 			if (ql_get_flash_table_region_info(qlge, region, &addr,
1316bafec742SSukumar Swaminathan 			    &size) != DDI_SUCCESS)
1317bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1318bafec742SSukumar Swaminathan 			rval = qlge_dump_fcode(qlge,
1319bafec742SSukumar Swaminathan 			    (uint8_t *)qlge->ioctl_buf_ptr,
1320bafec742SSukumar Swaminathan 			    size, addr);
1321bafec742SSukumar Swaminathan 			if (rval != DDI_SUCCESS) {
1322bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1323bafec742SSukumar Swaminathan 			}
1324bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1325bafec742SSukumar Swaminathan 			/* build initial ioctl packet header */
1326bafec742SSukumar Swaminathan 			build_init_pkt_header(qlge, pheader, size);
1327bafec742SSukumar Swaminathan 			iocp->ioc_count = sizeof (*pheader);
1328bafec742SSukumar Swaminathan 			break;
1329bafec742SSukumar Swaminathan 
1330bafec742SSukumar Swaminathan 		case QLA_WRITE_FLASH:
1331bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1332bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1333bafec742SSukumar Swaminathan 			region = pheader->option[0];
1334bafec742SSukumar Swaminathan 			qlge->ioctl_buf_lenth = pheader->total_length;
1335bafec742SSukumar Swaminathan 			qlge->ioctl_total_length = pheader->total_length;
1336bafec742SSukumar Swaminathan 			qlge->expected_trans_times =
1337bafec742SSukumar Swaminathan 			    pheader->expected_trans_times;
1338bafec742SSukumar Swaminathan 			qlge->ioctl_transferred_bytes = 0;
1339bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL) {
1340bafec742SSukumar Swaminathan 				qlge->ioctl_buf_ptr =
1341bafec742SSukumar Swaminathan 				    kmem_zalloc(qlge->ioctl_buf_lenth,
1342bafec742SSukumar Swaminathan 				    KM_SLEEP);
1343bafec742SSukumar Swaminathan 				if (qlge->ioctl_buf_ptr == NULL) {
1344bafec742SSukumar Swaminathan 					cmn_err(CE_WARN, "%s(%d): Unable to "
1345bafec742SSukumar Swaminathan 					    "allocate ioctl buffer",
1346bafec742SSukumar Swaminathan 					    __func__, qlge->instance);
1347bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1348bafec742SSukumar Swaminathan 				}
1349bafec742SSukumar Swaminathan 			}
1350bafec742SSukumar Swaminathan 			QL_PRINT(DBG_GLD, ("QLA_WRITE_FLASH write to region "
1351bafec742SSukumar Swaminathan 			    "%x, total buffer size 0x%x bytes\n",
1352bafec742SSukumar Swaminathan 			    region, qlge->ioctl_buf_lenth));
1353bafec742SSukumar Swaminathan 			iocp->ioc_count = sizeof (*pheader);
1354bafec742SSukumar Swaminathan 			break;
1355bafec742SSukumar Swaminathan 
1356bafec742SSukumar Swaminathan 		case QLA_READ_FW_IMAGE:
1357bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr != NULL) {
1358bafec742SSukumar Swaminathan 				kmem_free(qlge->ioctl_buf_ptr,
1359bafec742SSukumar Swaminathan 				    qlge->ioctl_buf_lenth);
1360bafec742SSukumar Swaminathan 			}
1361bafec742SSukumar Swaminathan 			qlge->ioctl_buf_lenth = IOCTL_MAX_BUF_SIZE * 4;
1362bafec742SSukumar Swaminathan 			qlge->ioctl_buf_ptr = kmem_zalloc(qlge->ioctl_buf_lenth,
1363bafec742SSukumar Swaminathan 			    KM_SLEEP);
1364bafec742SSukumar Swaminathan 			if (qlge->ioctl_buf_ptr == NULL) {
1365bafec742SSukumar Swaminathan 				cmn_err(CE_WARN, "%s(%d): Unable to "
1366bafec742SSukumar Swaminathan 				    "allocate ioctl buffer",
1367bafec742SSukumar Swaminathan 				    __func__, qlge->instance);
1368bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1369bafec742SSukumar Swaminathan 			}
1370bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1371bafec742SSukumar Swaminathan 			iltds_ptr = (ql_iltds_description_header_t *)
1372bafec742SSukumar Swaminathan 			    (void *)qlge->ioctl_buf_ptr;
1373bafec742SSukumar Swaminathan 			iltds_ptr->iltds_table_header.signature =
1374bafec742SSukumar Swaminathan 			    FLASH_ILTDS_SIGNATURE;
1375bafec742SSukumar Swaminathan 			iltds_ptr->iltds_table_header.table_version = 1;
1376bafec742SSukumar Swaminathan 			iltds_ptr->iltds_table_header.length =
1377bafec742SSukumar Swaminathan 			    ILTDS_DESCRIPTION_HEADERS_LEN;
1378bafec742SSukumar Swaminathan 			iltds_ptr->iltds_table_header.number_entries =
1379bafec742SSukumar Swaminathan 			    IMAGE_TABLE_IMAGE_DEFAULT_ENTRIES +
1380bafec742SSukumar Swaminathan 			    1 /* timestamp */;
1381bafec742SSukumar Swaminathan 			iltds_ptr->iltds_table_header.reserved = 0;
1382bafec742SSukumar Swaminathan 			iltds_ptr->iltds_table_header.version = 1;
1383bafec742SSukumar Swaminathan 			/* where is the flash data saved */
1384bafec742SSukumar Swaminathan 			bdesc = qlge->ioctl_buf_ptr +
1385bafec742SSukumar Swaminathan 			    ILTDS_DESCRIPTION_HEADERS_LEN;
1386bafec742SSukumar Swaminathan 			offset = iltds_ptr->iltds_table_header.length;
1387bafec742SSukumar Swaminathan 			for (i = 0; i < IMAGE_TABLE_IMAGE_DEFAULT_ENTRIES;
1388bafec742SSukumar Swaminathan 			    i++) {
1389bafec742SSukumar Swaminathan 				region = iltds_image_entry_regions[i];
1390bafec742SSukumar Swaminathan 				if (ql_get_flash_table_region_info(qlge,
1391bafec742SSukumar Swaminathan 				    region, &addr, &size) != DDI_SUCCESS)
1392bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1393bafec742SSukumar Swaminathan 				QL_PRINT(DBG_GLD, ("region %x addr 0x%x, 0x%x "
1394bafec742SSukumar Swaminathan 				    "bytes\n", region, addr, size));
1395bafec742SSukumar Swaminathan 				/* Dump one image entry */
1396bafec742SSukumar Swaminathan 				rval = qlge_dump_fcode(qlge, (uint8_t *)bdesc,
1397bafec742SSukumar Swaminathan 				    size, addr);
1398bafec742SSukumar Swaminathan 				if (rval != DDI_SUCCESS) {
1399bafec742SSukumar Swaminathan 					return (IOC_INVAL);
1400bafec742SSukumar Swaminathan 				}
1401bafec742SSukumar Swaminathan 				bdesc += size;
1402bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].region_type =
1403bafec742SSukumar Swaminathan 				    (uint16_t)region;
1404bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].region_version_len = 0;
1405bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].region_version[0] = 0;
1406bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].region_version[1] = 0;
1407bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].region_version[2] = 0;
1408bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].offset_lo = LSW(offset);
1409bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].offset_hi = MSW(offset);
1410bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].size_lo = LSW(size);
1411bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].size_hi = MSW(size);
1412bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].swap_mode = 0;
1413bafec742SSukumar Swaminathan 				iltds_ptr->img_entry[i].card_type = 0;
1414bafec742SSukumar Swaminathan 				QL_PRINT(DBG_GLD, ("image offset %x size %x "
1415bafec742SSukumar Swaminathan 				    "bytes\n", offset, size));
1416bafec742SSukumar Swaminathan 				QL_PRINT(DBG_GLD, ("offset %x lsw %x msw %x"
1417bafec742SSukumar Swaminathan 				    " \n", offset, LSW(offset), MSW(offset)));
1418bafec742SSukumar Swaminathan 				offset += size;
1419bafec742SSukumar Swaminathan 			}
1420bafec742SSukumar Swaminathan 			/* Last entry */
1421bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.region_type =
1422bafec742SSukumar Swaminathan 			    FLT_REGION_TIME_STAMP;
1423bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.region_version_len = 0;
1424bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.region_version[0] = 0;
1425bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.region_version[1] = 0;
1426bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.region_version[2] = 0;
1427bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.year = 0x09;
1428bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.month = 0x01;
1429bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.day = 0x20;
1430bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.hour = 0x14;
1431bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.min = 0x20;
1432bafec742SSukumar Swaminathan 			iltds_ptr->time_stamp.sec = 0x50;
1433bafec742SSukumar Swaminathan 
1434bafec742SSukumar Swaminathan 			pheader = (ioctl_header_info_t *)(void *)dmp->b_rptr;
1435bafec742SSukumar Swaminathan 			/* build initial ioctl packet header */
1436bafec742SSukumar Swaminathan 			build_init_pkt_header(qlge, pheader, offset);
1437bafec742SSukumar Swaminathan 			iocp->ioc_count = sizeof (*pheader);
1438bafec742SSukumar Swaminathan 			break;
1439bafec742SSukumar Swaminathan 
1440bafec742SSukumar Swaminathan 		case QLA_WRITE_FW_IMAGE_HEADERS:
1441bafec742SSukumar Swaminathan 			len = (uint32_t)iocp->ioc_count;
1442bafec742SSukumar Swaminathan 			if (len == 0)
1443bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1444bafec742SSukumar Swaminathan 			ql_iltds_header_ptr =
1445bafec742SSukumar Swaminathan 			    (ql_iltds_header_t *)(void *)dmp->b_rptr;
1446bafec742SSukumar Swaminathan 			if (len != ql_iltds_header_ptr->length) {
1447bafec742SSukumar Swaminathan 				cmn_err(CE_WARN, "QLA_WRITE_FW_IMAGE_HEADERS "
1448bafec742SSukumar Swaminathan 				    "data length error!"
1449bafec742SSukumar Swaminathan 				    " %x bytes expected, %x received",
1450bafec742SSukumar Swaminathan 				    ql_iltds_header_ptr->length, len);
1451bafec742SSukumar Swaminathan 				return (IOC_INVAL);
1452bafec742SSukumar Swaminathan 			}
1453bafec742SSukumar Swaminathan 			QL_PRINT(DBG_GLD, ("Fw Image header len 0x%x bytes, "
1454bafec742SSukumar Swaminathan 			    "0x%x entries\n",
1455bafec742SSukumar Swaminathan 			    len, ql_iltds_header_ptr->number_entries));
1456bafec742SSukumar Swaminathan 			ql_dump_buf("all copy in data:\n",
1457bafec742SSukumar Swaminathan 			    (uint8_t *)dmp->b_rptr, 8, len);
1458bafec742SSukumar Swaminathan 			mp->b_cont = NULL;
1459bafec742SSukumar Swaminathan 			break;
1460bafec742SSukumar Swaminathan 
1461bafec742SSukumar Swaminathan 		case QLA_SOFT_RESET:
1462bafec742SSukumar Swaminathan 			iocp->ioc_count = 0;
1463bafec742SSukumar Swaminathan 			ql_wake_asic_reset_soft_intr(qlge);
1464bafec742SSukumar Swaminathan 			QL_PRINT(DBG_GLD, ("QLA_SOFT_RESET started \n"));
1465bafec742SSukumar Swaminathan 			break;
1466bafec742SSukumar Swaminathan 
1467bafec742SSukumar Swaminathan 		default:
1468bafec742SSukumar Swaminathan 			return (IOC_INVAL);
1469bafec742SSukumar Swaminathan 	}
1470bafec742SSukumar Swaminathan 
1471bafec742SSukumar Swaminathan 	return (IOC_REPLY);
1472bafec742SSukumar Swaminathan }
1473bafec742SSukumar Swaminathan 
1474bafec742SSukumar Swaminathan /*
1475bafec742SSukumar Swaminathan  * Loopback ioctl code
1476bafec742SSukumar Swaminathan  */
1477bafec742SSukumar Swaminathan static lb_property_t loopmodes[] = {
1478bafec742SSukumar Swaminathan 	{ normal,	"normal",	QLGE_LOOP_NONE			},
1479bafec742SSukumar Swaminathan 	{ internal,	"parallel",	QLGE_LOOP_INTERNAL_PARALLEL	},
1480bafec742SSukumar Swaminathan 	{ internal,	"serial",	QLGE_LOOP_INTERNAL_SERIAL	},
1481cddcb3daSSukumar Swaminathan 	{ external,	"phy",		QLGE_LOOP_EXTERNAL_PHY		}
1482bafec742SSukumar Swaminathan };
1483bafec742SSukumar Swaminathan 
1484bafec742SSukumar Swaminathan /*
1485bafec742SSukumar Swaminathan  * Set Loopback mode
1486bafec742SSukumar Swaminathan  */
1487bafec742SSukumar Swaminathan static enum ioc_reply
qlge_set_loop_mode(qlge_t * qlge,uint32_t mode)1488bafec742SSukumar Swaminathan qlge_set_loop_mode(qlge_t *qlge, uint32_t mode)
1489bafec742SSukumar Swaminathan {
1490bafec742SSukumar Swaminathan 	/*
1491bafec742SSukumar Swaminathan 	 * If the mode is same as current mode ...
1492bafec742SSukumar Swaminathan 	 */
1493bafec742SSukumar Swaminathan 	if (mode == qlge->loop_back_mode)
1494bafec742SSukumar Swaminathan 		return (IOC_ACK);
1495bafec742SSukumar Swaminathan 
1496bafec742SSukumar Swaminathan 	/*
1497bafec742SSukumar Swaminathan 	 * Validate the requested mode
1498bafec742SSukumar Swaminathan 	 */
1499bafec742SSukumar Swaminathan 	switch (mode) {
1500bafec742SSukumar Swaminathan 	default:
1501bafec742SSukumar Swaminathan 		return (IOC_INVAL);
1502bafec742SSukumar Swaminathan 
1503bafec742SSukumar Swaminathan 	case QLGE_LOOP_NONE:
1504bafec742SSukumar Swaminathan 	case QLGE_LOOP_INTERNAL_PARALLEL:
1505bafec742SSukumar Swaminathan 	case QLGE_LOOP_INTERNAL_SERIAL:
1506cddcb3daSSukumar Swaminathan 	case QLGE_LOOP_EXTERNAL_PHY:
1507bafec742SSukumar Swaminathan 		break;
1508bafec742SSukumar Swaminathan 	}
1509bafec742SSukumar Swaminathan 
1510bafec742SSukumar Swaminathan 	/*
1511bafec742SSukumar Swaminathan 	 * All OK; reprogram for the new mode ...
1512bafec742SSukumar Swaminathan 	 */
1513bafec742SSukumar Swaminathan 	qlge->loop_back_mode = mode;
1514bafec742SSukumar Swaminathan 	mutex_enter(&qlge->mbx_mutex);
1515accf27a5SSukumar Swaminathan 	(void) ql_set_loop_back_mode(qlge);
1516bafec742SSukumar Swaminathan 	mutex_exit(&qlge->mbx_mutex);
1517cddcb3daSSukumar Swaminathan 	/* if loopback mode test is done */
1518cddcb3daSSukumar Swaminathan 	if (mode == QLGE_LOOP_NONE) {
1519cddcb3daSSukumar Swaminathan 		mutex_enter(&qlge->hw_mutex);
1520cddcb3daSSukumar Swaminathan 		(void) ql_route_initialize(qlge);
1521cddcb3daSSukumar Swaminathan 		mutex_exit(&qlge->hw_mutex);
1522cddcb3daSSukumar Swaminathan 	}
1523cddcb3daSSukumar Swaminathan 
1524bafec742SSukumar Swaminathan 	return (IOC_REPLY);
1525bafec742SSukumar Swaminathan }
1526bafec742SSukumar Swaminathan /*
1527bafec742SSukumar Swaminathan  * Loopback ioctl
1528bafec742SSukumar Swaminathan  */
1529bafec742SSukumar Swaminathan /* ARGSUSED */
1530bafec742SSukumar Swaminathan enum ioc_reply
ql_loop_ioctl(qlge_t * qlge,queue_t * wq,mblk_t * mp,struct iocblk * iocp)1531bafec742SSukumar Swaminathan ql_loop_ioctl(qlge_t *qlge, queue_t *wq, mblk_t *mp, struct iocblk *iocp)
1532bafec742SSukumar Swaminathan {
1533bafec742SSukumar Swaminathan 	lb_info_sz_t *lbsp;
1534bafec742SSukumar Swaminathan 	lb_property_t *lbpp;
1535bafec742SSukumar Swaminathan 	uint32_t *lbmp;
1536bafec742SSukumar Swaminathan 	int cmd;
1537bafec742SSukumar Swaminathan 
1538bafec742SSukumar Swaminathan 	_NOTE(ARGUNUSED(wq))
1539bafec742SSukumar Swaminathan 	/*
1540bafec742SSukumar Swaminathan 	 * Validate format of ioctl
1541bafec742SSukumar Swaminathan 	 */
1542bafec742SSukumar Swaminathan 	if (mp->b_cont == NULL)
1543bafec742SSukumar Swaminathan 		return (IOC_INVAL);
1544bafec742SSukumar Swaminathan 
1545bafec742SSukumar Swaminathan 	cmd = iocp->ioc_cmd;
1546bafec742SSukumar Swaminathan 	switch (cmd) {
1547bafec742SSukumar Swaminathan 	default:
1548bafec742SSukumar Swaminathan 		/* NOTREACHED */
1549bafec742SSukumar Swaminathan 		QL_PRINT(DBG_GLD, ("%s(%d) invalid cmd 0x%x\n",
1550bafec742SSukumar Swaminathan 		    __func__, qlge->instance, cmd));
1551bafec742SSukumar Swaminathan 		return (IOC_INVAL);
1552bafec742SSukumar Swaminathan 
1553bafec742SSukumar Swaminathan 	case LB_GET_INFO_SIZE:
1554bafec742SSukumar Swaminathan 		if (iocp->ioc_count != sizeof (lb_info_sz_t))
1555bafec742SSukumar Swaminathan 			return (IOC_INVAL);
1556bafec742SSukumar Swaminathan 		lbsp = (void *)mp->b_cont->b_rptr;
1557bafec742SSukumar Swaminathan 		*lbsp = sizeof (loopmodes);
1558bafec742SSukumar Swaminathan 		return (IOC_REPLY);
1559bafec742SSukumar Swaminathan 
1560bafec742SSukumar Swaminathan 	case LB_GET_INFO:
1561bafec742SSukumar Swaminathan 		if (iocp->ioc_count != sizeof (loopmodes))
1562bafec742SSukumar Swaminathan 			return (IOC_INVAL);
1563bafec742SSukumar Swaminathan 		lbpp = (void *)mp->b_cont->b_rptr;
1564bafec742SSukumar Swaminathan 		bcopy(loopmodes, lbpp, sizeof (loopmodes));
1565bafec742SSukumar Swaminathan 		return (IOC_REPLY);
1566bafec742SSukumar Swaminathan 
1567bafec742SSukumar Swaminathan 	case LB_GET_MODE:
1568bafec742SSukumar Swaminathan 		if (iocp->ioc_count != sizeof (uint32_t))
1569bafec742SSukumar Swaminathan 			return (IOC_INVAL);
1570bafec742SSukumar Swaminathan 		lbmp = (void *)mp->b_cont->b_rptr;
1571bafec742SSukumar Swaminathan 		*lbmp = qlge->loop_back_mode;
1572bafec742SSukumar Swaminathan 		return (IOC_REPLY);
1573bafec742SSukumar Swaminathan 
1574bafec742SSukumar Swaminathan 	case LB_SET_MODE:
1575bafec742SSukumar Swaminathan 		if (iocp->ioc_count != sizeof (uint32_t))
1576bafec742SSukumar Swaminathan 			return (IOC_INVAL);
1577bafec742SSukumar Swaminathan 		lbmp = (void *)mp->b_cont->b_rptr;
1578bafec742SSukumar Swaminathan 		return (qlge_set_loop_mode(qlge, *lbmp));
1579bafec742SSukumar Swaminathan 	}
1580bafec742SSukumar Swaminathan }
1581bafec742SSukumar Swaminathan 
1582bafec742SSukumar Swaminathan /*
1583bafec742SSukumar Swaminathan  * Dumps binary data from firmware.
1584bafec742SSukumar Swaminathan  */
1585bafec742SSukumar Swaminathan static int
ql_8xxx_binary_core_dump_with_header(qlge_t * qlge,caddr_t buf,uint32_t * len_ptr)1586bafec742SSukumar Swaminathan ql_8xxx_binary_core_dump_with_header(qlge_t *qlge, caddr_t buf,
1587bafec742SSukumar Swaminathan     uint32_t *len_ptr)
1588bafec742SSukumar Swaminathan {
1589bafec742SSukumar Swaminathan 	caddr_t bp = buf;
1590bafec742SSukumar Swaminathan 	int rval = DDI_SUCCESS;
1591bafec742SSukumar Swaminathan 	ql_dump_image_header_t *ql_dump_image_header_ptr =
1592bafec742SSukumar Swaminathan 	    (ql_dump_image_header_t *)(void *)bp;
1593bafec742SSukumar Swaminathan 
1594bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->signature = DUMP_IMAGE_HEADER_SIGNATURE;
1595bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->version = 1;
1596bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->header_length = 16;
1597bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->data_type = DUMP_TYPE_CORE_DUMP;
1598bafec742SSukumar Swaminathan 	/* point to real dump data area */
1599bafec742SSukumar Swaminathan 	bp += sizeof (ql_dump_image_header_t);
1600bafec742SSukumar Swaminathan 	bcopy(&qlge->ql_mpi_coredump, bp, sizeof (ql_mpi_coredump_t));
1601bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->data_length = sizeof (ql_mpi_coredump_t);
1602bafec742SSukumar Swaminathan 	/* total length: header + data image */
1603bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->checksum = (uint16_t)
1604bafec742SSukumar Swaminathan 	    (ql_dump_image_header_ptr->signature
1605bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->version
1606bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->header_length
1607bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->data_type
1608bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->data_length);
1609bafec742SSukumar Swaminathan 
1610bafec742SSukumar Swaminathan 	*len_ptr = ql_dump_image_header_ptr->header_length +
1611bafec742SSukumar Swaminathan 	    ql_dump_image_header_ptr->data_length;
1612bafec742SSukumar Swaminathan 	QL_PRINT(DBG_GLD, ("%s done,core dump lenth %d bytes\n",
1613bafec742SSukumar Swaminathan 	    __func__, *len_ptr));
1614bafec742SSukumar Swaminathan 	return (rval);
1615bafec742SSukumar Swaminathan }
1616bafec742SSukumar Swaminathan 
1617bafec742SSukumar Swaminathan /*
1618bafec742SSukumar Swaminathan  * Dump registers value in binary format
1619bafec742SSukumar Swaminathan  */
1620bafec742SSukumar Swaminathan static int
ql_8xxx_binary_register_dump_with_header(qlge_t * qlge,caddr_t buf,uint32_t * len_ptr)1621bafec742SSukumar Swaminathan ql_8xxx_binary_register_dump_with_header(qlge_t *qlge, caddr_t buf,
1622bafec742SSukumar Swaminathan     uint32_t *len_ptr)
1623bafec742SSukumar Swaminathan {
1624bafec742SSukumar Swaminathan 	caddr_t bp = buf;
1625bafec742SSukumar Swaminathan 	int i;
1626bafec742SSukumar Swaminathan 	uint32_t *data_ptr;
1627bafec742SSukumar Swaminathan 	int rval = DDI_SUCCESS;
1628bafec742SSukumar Swaminathan 
1629bafec742SSukumar Swaminathan 	ql_dump_image_header_t *ql_dump_image_header_ptr =
1630bafec742SSukumar Swaminathan 	    (ql_dump_image_header_t *)(void *)bp;
1631bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->signature =
1632bafec742SSukumar Swaminathan 	    DUMP_IMAGE_HEADER_SIGNATURE;
1633bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->version = 1;
1634bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->header_length = 16;
1635bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->data_type = DUMP_TYPE_REGISTER_DUMP;
1636bafec742SSukumar Swaminathan 	/* point to real dump data area */
1637bafec742SSukumar Swaminathan 	bp += sizeof (ql_dump_image_header_t);
1638bafec742SSukumar Swaminathan 	data_ptr = (uint32_t *)(void *)bp;
1639bafec742SSukumar Swaminathan 
1640bafec742SSukumar Swaminathan 	for (i = 0; i <= 0xfc; i += 4) {
1641bafec742SSukumar Swaminathan 		*data_ptr = ql_read_reg(qlge, i);
1642bafec742SSukumar Swaminathan 		data_ptr++;
1643bafec742SSukumar Swaminathan 	}
1644bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->data_length = 0x100; /* 0 ~ 0xFF */
1645bafec742SSukumar Swaminathan 	/* total length: header + data image */
1646bafec742SSukumar Swaminathan 	ql_dump_image_header_ptr->checksum = (uint16_t)
1647bafec742SSukumar Swaminathan 	    (ql_dump_image_header_ptr->signature
1648bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->version
1649bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->header_length
1650bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->data_type
1651bafec742SSukumar Swaminathan 	    +ql_dump_image_header_ptr->data_length);
1652bafec742SSukumar Swaminathan 
1653bafec742SSukumar Swaminathan 	*len_ptr = ql_dump_image_header_ptr->header_length +
1654bafec742SSukumar Swaminathan 	    ql_dump_image_header_ptr->data_length;
1655bafec742SSukumar Swaminathan 
1656bafec742SSukumar Swaminathan 	QL_PRINT(DBG_GLD, ("%s done, dump lenth %x bytes\n", __func__,
1657bafec742SSukumar Swaminathan 	    *len_ptr));
1658bafec742SSukumar Swaminathan 
1659bafec742SSukumar Swaminathan 	return (rval);
1660bafec742SSukumar Swaminathan }
1661bafec742SSukumar Swaminathan 
1662bafec742SSukumar Swaminathan /*
1663bafec742SSukumar Swaminathan  * Core dump in binary format
1664bafec742SSukumar Swaminathan  */
1665bafec742SSukumar Swaminathan static int
ql_binary_core_dump(qlge_t * qlge,uint32_t requested_dumps,uint32_t * len_ptr)1666bafec742SSukumar Swaminathan ql_binary_core_dump(qlge_t *qlge, uint32_t requested_dumps, uint32_t *len_ptr)
1667bafec742SSukumar Swaminathan {
1668bafec742SSukumar Swaminathan 	int rval = DDI_FAILURE;
1669bafec742SSukumar Swaminathan 	uint32_t length, size = 0;
1670bafec742SSukumar Swaminathan 	uint64_t timestamp;
1671bafec742SSukumar Swaminathan 	caddr_t bp;
1672bafec742SSukumar Swaminathan 	ql_dump_header_t *ql_dump_header_ptr;
1673bafec742SSukumar Swaminathan 	ql_dump_footer_t *ql_dump_footer_ptr;
1674bafec742SSukumar Swaminathan 
1675bafec742SSukumar Swaminathan 	if (qlge->ioctl_buf_ptr == NULL) {
1676bafec742SSukumar Swaminathan 		qlge->ioctl_buf_lenth = IOCTL_MAX_BUF_SIZE; /* 512k */
1677bafec742SSukumar Swaminathan 		qlge->ioctl_buf_ptr =
1678bafec742SSukumar Swaminathan 		    kmem_zalloc(qlge->ioctl_buf_lenth, KM_SLEEP);
1679bafec742SSukumar Swaminathan 		if (qlge->ioctl_buf_ptr == NULL) {
1680bafec742SSukumar Swaminathan 			cmn_err(CE_WARN,
1681bafec742SSukumar Swaminathan 			    "%s(%d): Unable to allocate ioctl buffer",
1682bafec742SSukumar Swaminathan 			    __func__, qlge->instance);
1683bafec742SSukumar Swaminathan 			goto out;
1684bafec742SSukumar Swaminathan 		}
1685bafec742SSukumar Swaminathan 	}
1686bafec742SSukumar Swaminathan 
1687bafec742SSukumar Swaminathan 	/* description info header */
1688bafec742SSukumar Swaminathan 	ql_dump_header_ptr = (ql_dump_header_t *)(void *)qlge->ioctl_buf_ptr;
1689bafec742SSukumar Swaminathan 	/* add QTSB signature */
1690bafec742SSukumar Swaminathan 	ql_dump_header_ptr->signature = DUMP_DESCRIPTION_HEADER_SIGNATURE;
1691bafec742SSukumar Swaminathan 	ql_dump_header_ptr->version = 1;
1692bafec742SSukumar Swaminathan 	ql_dump_header_ptr->length = 16;
1693bafec742SSukumar Swaminathan 	ql_dump_header_ptr->reserved = 0;
1694bafec742SSukumar Swaminathan 	/* get dump creation timestamp */
1695bafec742SSukumar Swaminathan 	timestamp = ddi_get_time();
1696bafec742SSukumar Swaminathan 	timestamp *= 1000000;
1697bafec742SSukumar Swaminathan 	ql_dump_header_ptr->time_stamp_lo = LSW(timestamp);
1698bafec742SSukumar Swaminathan 	ql_dump_header_ptr->time_stamp_hi = MSW(timestamp);
1699bafec742SSukumar Swaminathan 	/* point to first image header area */
1700bafec742SSukumar Swaminathan 	length = sizeof (ql_dump_header_t);
1701bafec742SSukumar Swaminathan 	bp = (caddr_t)qlge->ioctl_buf_ptr + length;
1702bafec742SSukumar Swaminathan 
1703bafec742SSukumar Swaminathan 	if (CFG_IST(qlge, CFG_CHIP_8100)) {
1704bafec742SSukumar Swaminathan 		/* if dumping all */
1705bafec742SSukumar Swaminathan 		if ((requested_dumps & DUMP_REQUEST_ALL) != 0) {
1706bafec742SSukumar Swaminathan 			ql_dump_header_ptr->num_dumps = 2;
17070662fbf4SSukumar Swaminathan 			(void) ql_8xxx_binary_core_dump_with_header(qlge,
17080662fbf4SSukumar Swaminathan 			    bp, &size);
1709bafec742SSukumar Swaminathan 			length += size;
1710bafec742SSukumar Swaminathan 			bp = (caddr_t)qlge->ioctl_buf_ptr + length;
17110662fbf4SSukumar Swaminathan 			(void) ql_8xxx_binary_register_dump_with_header(qlge,
1712bafec742SSukumar Swaminathan 			    bp, &size);
1713bafec742SSukumar Swaminathan 			length += size;
1714bafec742SSukumar Swaminathan 			bp = (caddr_t)qlge->ioctl_buf_ptr + length;
1715bafec742SSukumar Swaminathan 		} else if ((requested_dumps & DUMP_REQUEST_CORE) != 0) {
1716bafec742SSukumar Swaminathan 			ql_dump_header_ptr->num_dumps = 1;
17170662fbf4SSukumar Swaminathan 			(void) ql_8xxx_binary_core_dump_with_header(qlge,
17180662fbf4SSukumar Swaminathan 			    bp, &size);
1719bafec742SSukumar Swaminathan 			length += size;
1720bafec742SSukumar Swaminathan 			bp = (caddr_t)qlge->ioctl_buf_ptr + length;
1721bafec742SSukumar Swaminathan 		} else if ((requested_dumps & DUMP_REQUEST_REGISTER) != 0) {
1722bafec742SSukumar Swaminathan 			ql_dump_header_ptr->num_dumps = 1;
17230662fbf4SSukumar Swaminathan 			(void) ql_8xxx_binary_register_dump_with_header(qlge,
1724bafec742SSukumar Swaminathan 			    bp, &size);
1725bafec742SSukumar Swaminathan 			length += size;
1726bafec742SSukumar Swaminathan 			bp = (caddr_t)qlge->ioctl_buf_ptr + length;
1727bafec742SSukumar Swaminathan 		} else {
1728bafec742SSukumar Swaminathan 			cmn_err(CE_WARN, "%s(%d): not supported dump type %d",
1729bafec742SSukumar Swaminathan 			    __func__, qlge->instance, requested_dumps);
1730bafec742SSukumar Swaminathan 			goto out;
1731bafec742SSukumar Swaminathan 		}
1732bafec742SSukumar Swaminathan 	}
1733bafec742SSukumar Swaminathan 
1734bafec742SSukumar Swaminathan 	ql_dump_footer_ptr = (ql_dump_footer_t *)(void *)bp;
1735bafec742SSukumar Swaminathan 	ql_dump_footer_ptr->signature = DUMP_DESCRIPTION_FOOTER_SIGNATURE;
1736bafec742SSukumar Swaminathan 	ql_dump_footer_ptr->version = 1;
1737bafec742SSukumar Swaminathan 	ql_dump_footer_ptr->length = 16;
1738bafec742SSukumar Swaminathan 	ql_dump_footer_ptr->reserved = 0;
1739bafec742SSukumar Swaminathan 	timestamp = ddi_get_time();
1740bafec742SSukumar Swaminathan 	timestamp *= 1000000;
1741bafec742SSukumar Swaminathan 	ql_dump_footer_ptr->time_stamp_lo = LSW(timestamp);
1742bafec742SSukumar Swaminathan 	ql_dump_footer_ptr->time_stamp_hi = MSW(timestamp);
1743bafec742SSukumar Swaminathan 	length += ql_dump_footer_ptr->length;
1744bafec742SSukumar Swaminathan 	rval = DDI_SUCCESS;
1745bafec742SSukumar Swaminathan 	*len_ptr = length;
1746bafec742SSukumar Swaminathan 	QL_PRINT(DBG_MBX, ("%s(%d): exiting,total %x bytes\n",
1747bafec742SSukumar Swaminathan 	    __func__, qlge->instance, length));
1748bafec742SSukumar Swaminathan out:
1749bafec742SSukumar Swaminathan 	return (rval);
1750bafec742SSukumar Swaminathan }
1751bafec742SSukumar Swaminathan 
1752bafec742SSukumar Swaminathan /*
1753bafec742SSukumar Swaminathan  * build core dump segment header
1754bafec742SSukumar Swaminathan  */
1755bafec742SSukumar Swaminathan static void
ql_build_coredump_seg_header(mpi_coredump_segment_header_t * seg_hdr,uint32_t seg_number,uint32_t seg_size,uint8_t * desc)1756bafec742SSukumar Swaminathan ql_build_coredump_seg_header(mpi_coredump_segment_header_t *seg_hdr,
1757bafec742SSukumar Swaminathan     uint32_t seg_number, uint32_t seg_size, uint8_t *desc)
1758bafec742SSukumar Swaminathan {
1759bafec742SSukumar Swaminathan 	(void) memset(seg_hdr, 0, sizeof (mpi_coredump_segment_header_t));
1760bafec742SSukumar Swaminathan 	seg_hdr->cookie = MPI_COREDUMP_COOKIE;
1761bafec742SSukumar Swaminathan 	seg_hdr->seg_number = seg_number;
1762bafec742SSukumar Swaminathan 	seg_hdr->seg_size = seg_size;
1763bafec742SSukumar Swaminathan 	(void) memcpy(seg_hdr->description, desc,
1764bafec742SSukumar Swaminathan 	    (sizeof (seg_hdr->description))-1);
1765bafec742SSukumar Swaminathan }
1766bafec742SSukumar Swaminathan 
1767bafec742SSukumar Swaminathan /*
1768bafec742SSukumar Swaminathan  * Unpause MPI risc
1769bafec742SSukumar Swaminathan  */
1770bafec742SSukumar Swaminathan static int
ql_unpause_mpi_risc(qlge_t * qlge)1771bafec742SSukumar Swaminathan ql_unpause_mpi_risc(qlge_t *qlge)
1772bafec742SSukumar Swaminathan {
1773bafec742SSukumar Swaminathan 	uint32_t tmp;
1774bafec742SSukumar Swaminathan 
1775bafec742SSukumar Swaminathan 	/* Un-pause the RISC */
1776bafec742SSukumar Swaminathan 	tmp = ql_read_reg(qlge, REG_HOST_CMD_STATUS);
1777bafec742SSukumar Swaminathan 	if ((tmp & CSR_RP) == 0)
1778bafec742SSukumar Swaminathan 		return (DDI_FAILURE);
1779bafec742SSukumar Swaminathan 
1780bafec742SSukumar Swaminathan 	ql_write_reg(qlge, REG_HOST_CMD_STATUS, CSR_CMD_CLR_PAUSE);
1781bafec742SSukumar Swaminathan 	return (DDI_SUCCESS);
1782bafec742SSukumar Swaminathan }
1783bafec742SSukumar Swaminathan 
1784bafec742SSukumar Swaminathan /*
1785bafec742SSukumar Swaminathan  * Pause MPI risc
1786bafec742SSukumar Swaminathan  */
1787bafec742SSukumar Swaminathan static int
ql_pause_mpi_risc(qlge_t * qlge)1788bafec742SSukumar Swaminathan ql_pause_mpi_risc(qlge_t *qlge)
1789bafec742SSukumar Swaminathan {
1790bafec742SSukumar Swaminathan 	uint32_t tmp;
1791bafec742SSukumar Swaminathan 	int count = 10;
1792bafec742SSukumar Swaminathan 
1793bafec742SSukumar Swaminathan 	/* Pause the RISC */
1794bafec742SSukumar Swaminathan 	ql_write_reg(qlge, REG_HOST_CMD_STATUS, CSR_CMD_SET_PAUSE);
1795bafec742SSukumar Swaminathan 	do {
1796bafec742SSukumar Swaminathan 		tmp = ql_read_reg(qlge, REG_HOST_CMD_STATUS);
1797bafec742SSukumar Swaminathan 		if ((tmp & CSR_RP) != 0)
1798bafec742SSukumar Swaminathan 			break;
1799bafec742SSukumar Swaminathan 		qlge_delay(10);
1800bafec742SSukumar Swaminathan 		count--;
1801bafec742SSukumar Swaminathan 	} while (count);
1802bafec742SSukumar Swaminathan 	return ((count == 0) ? DDI_FAILURE : DDI_SUCCESS);
1803bafec742SSukumar Swaminathan }
1804bafec742SSukumar Swaminathan 
1805bafec742SSukumar Swaminathan /*
1806bafec742SSukumar Swaminathan  * Get Interrupt Status registers value
1807bafec742SSukumar Swaminathan  */
1808bafec742SSukumar Swaminathan static void
ql_get_intr_states(qlge_t * qlge,uint32_t * buf)1809bafec742SSukumar Swaminathan ql_get_intr_states(qlge_t *qlge, uint32_t *buf)
1810bafec742SSukumar Swaminathan {
1811bafec742SSukumar Swaminathan 	int i;
1812bafec742SSukumar Swaminathan 
1813bafec742SSukumar Swaminathan 	for (i = 0; i < MAX_RX_RINGS; i++, buf++) {
1814bafec742SSukumar Swaminathan 		/* read the interrupt enable register for each rx ring */
1815bafec742SSukumar Swaminathan 		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, 0x037f0300 + i);
1816bafec742SSukumar Swaminathan 		*buf = ql_read_reg(qlge, REG_INTERRUPT_ENABLE);
1817bafec742SSukumar Swaminathan 	}
1818bafec742SSukumar Swaminathan }
1819bafec742SSukumar Swaminathan 
1820bafec742SSukumar Swaminathan /*
1821bafec742SSukumar Swaminathan  * Read serdes register
1822bafec742SSukumar Swaminathan  */
1823bafec742SSukumar Swaminathan static int
ql_read_serdes_reg(qlge_t * qlge,uint32_t reg,uint32_t * data)1824bafec742SSukumar Swaminathan ql_read_serdes_reg(qlge_t *qlge, uint32_t reg, uint32_t *data)
1825bafec742SSukumar Swaminathan {
1826bafec742SSukumar Swaminathan 	int rtn_val = DDI_FAILURE;
1827bafec742SSukumar Swaminathan 
1828bafec742SSukumar Swaminathan 	/* wait for reg to come ready */
1829bafec742SSukumar Swaminathan 	if (ql_wait_reg_bit(qlge, REG_XG_SERDES_ADDR,
1830bafec742SSukumar Swaminathan 	    XG_SERDES_ADDR_RDY, BIT_SET, 0) != DDI_SUCCESS)
1831bafec742SSukumar Swaminathan 		goto exit;
1832bafec742SSukumar Swaminathan 	/* set up for reg read */
1833bafec742SSukumar Swaminathan 	ql_write_reg(qlge, REG_XG_SERDES_ADDR, reg | PROC_ADDR_R);
1834bafec742SSukumar Swaminathan 	/* wait for reg to come ready */
1835bafec742SSukumar Swaminathan 	if (ql_wait_reg_bit(qlge, REG_XG_SERDES_ADDR,
1836bafec742SSukumar Swaminathan 	    XG_SERDES_ADDR_RDY, BIT_SET, 0) != DDI_SUCCESS)
1837bafec742SSukumar Swaminathan 		goto exit;
1838bafec742SSukumar Swaminathan 	/* get the data */
1839bafec742SSukumar Swaminathan 	*data = ql_read_reg(qlge, REG_XG_SERDES_DATA);
1840bafec742SSukumar Swaminathan 	rtn_val = DDI_SUCCESS;
1841bafec742SSukumar Swaminathan exit:
1842bafec742SSukumar Swaminathan 	return (rtn_val);
1843bafec742SSukumar Swaminathan }
1844bafec742SSukumar Swaminathan 
1845bafec742SSukumar Swaminathan /*
1846bafec742SSukumar Swaminathan  * Read XGMAC register
1847bafec742SSukumar Swaminathan  */
1848bafec742SSukumar Swaminathan static int
ql_get_xgmac_regs(qlge_t * qlge,uint32_t * buf)1849bafec742SSukumar Swaminathan ql_get_xgmac_regs(qlge_t *qlge, uint32_t *buf)
1850bafec742SSukumar Swaminathan {
1851bafec742SSukumar Swaminathan 	int status;
1852bafec742SSukumar Swaminathan 	int i;
1853bafec742SSukumar Swaminathan 
1854bafec742SSukumar Swaminathan 	for (i = 0; i < XGMAC_REGISTER_END; i += 4, buf ++) {
1855bafec742SSukumar Swaminathan 		switch (i) {
1856bafec742SSukumar Swaminathan 		case  PAUSE_SRC_LO		:
1857bafec742SSukumar Swaminathan 		case  PAUSE_SRC_HI		:
1858bafec742SSukumar Swaminathan 		case  GLOBAL_CFG		:
1859bafec742SSukumar Swaminathan 		case  TX_CFG			:
1860bafec742SSukumar Swaminathan 		case  RX_CFG			:
1861bafec742SSukumar Swaminathan 		case  FLOW_CTL			:
1862bafec742SSukumar Swaminathan 		case  PAUSE_OPCODE		:
1863bafec742SSukumar Swaminathan 		case  PAUSE_TIMER		:
1864bafec742SSukumar Swaminathan 		case  PAUSE_FRM_DEST_LO		:
1865bafec742SSukumar Swaminathan 		case  PAUSE_FRM_DEST_HI		:
1866bafec742SSukumar Swaminathan 		case  MAC_TX_PARAMS		:
1867bafec742SSukumar Swaminathan 		case  MAC_RX_PARAMS		:
1868bafec742SSukumar Swaminathan 		case  MAC_SYS_INT		:
1869bafec742SSukumar Swaminathan 		case  MAC_SYS_INT_MASK		:
1870bafec742SSukumar Swaminathan 		case  MAC_MGMT_INT		:
1871bafec742SSukumar Swaminathan 		case  MAC_MGMT_IN_MASK		:
1872bafec742SSukumar Swaminathan 		case  EXT_ARB_MODE		:
1873bafec742SSukumar Swaminathan 		case  TX_PKTS		:
1874bafec742SSukumar Swaminathan 		case  TX_PKTS_LO		:
1875bafec742SSukumar Swaminathan 		case  TX_BYTES			:
1876bafec742SSukumar Swaminathan 		case  TX_BYTES_LO		:
1877bafec742SSukumar Swaminathan 		case  TX_MCAST_PKTS		:
1878bafec742SSukumar Swaminathan 		case  TX_MCAST_PKTS_LO		:
1879bafec742SSukumar Swaminathan 		case  TX_BCAST_PKTS		:
1880bafec742SSukumar Swaminathan 		case  TX_BCAST_PKTS_LO		:
1881bafec742SSukumar Swaminathan 		case  TX_UCAST_PKTS		:
1882bafec742SSukumar Swaminathan 		case  TX_UCAST_PKTS_LO		:
1883bafec742SSukumar Swaminathan 		case  TX_CTL_PKTS		:
1884bafec742SSukumar Swaminathan 		case  TX_CTL_PKTS_LO		:
1885bafec742SSukumar Swaminathan 		case  TX_PAUSE_PKTS		:
1886bafec742SSukumar Swaminathan 		case  TX_PAUSE_PKTS_LO		:
1887bafec742SSukumar Swaminathan 		case  TX_64_PKT			:
1888bafec742SSukumar Swaminathan 		case  TX_64_PKT_LO		:
1889bafec742SSukumar Swaminathan 		case  TX_65_TO_127_PKT		:
1890bafec742SSukumar Swaminathan 		case  TX_65_TO_127_PKT_LO	:
1891bafec742SSukumar Swaminathan 		case  TX_128_TO_255_PKT		:
1892bafec742SSukumar Swaminathan 		case  TX_128_TO_255_PKT_LO	:
1893bafec742SSukumar Swaminathan 		case  TX_256_511_PKT		:
1894bafec742SSukumar Swaminathan 		case  TX_256_511_PKT_LO		:
1895bafec742SSukumar Swaminathan 		case  TX_512_TO_1023_PKT	:
1896bafec742SSukumar Swaminathan 		case  TX_512_TO_1023_PKT_LO	:
1897bafec742SSukumar Swaminathan 		case  TX_1024_TO_1518_PKT	:
1898bafec742SSukumar Swaminathan 		case  TX_1024_TO_1518_PKT_LO	:
1899bafec742SSukumar Swaminathan 		case  TX_1519_TO_MAX_PKT	:
1900bafec742SSukumar Swaminathan 		case  TX_1519_TO_MAX_PKT_LO	:
1901bafec742SSukumar Swaminathan 		case  TX_UNDERSIZE_PKT		:
1902bafec742SSukumar Swaminathan 		case  TX_UNDERSIZE_PKT_LO	:
1903bafec742SSukumar Swaminathan 		case  TX_OVERSIZE_PKT		:
1904bafec742SSukumar Swaminathan 		case  TX_OVERSIZE_PKT_LO	:
1905bafec742SSukumar Swaminathan 		case  RX_HALF_FULL_DET		:
1906bafec742SSukumar Swaminathan 		case  TX_HALF_FULL_DET_LO	:
1907bafec742SSukumar Swaminathan 		case  RX_OVERFLOW_DET		:
1908bafec742SSukumar Swaminathan 		case  TX_OVERFLOW_DET_LO	:
1909bafec742SSukumar Swaminathan 		case  RX_HALF_FULL_MASK		:
1910bafec742SSukumar Swaminathan 		case  TX_HALF_FULL_MASK_LO	:
1911bafec742SSukumar Swaminathan 		case  RX_OVERFLOW_MASK		:
1912bafec742SSukumar Swaminathan 		case  TX_OVERFLOW_MASK_LO	:
1913bafec742SSukumar Swaminathan 		case  STAT_CNT_CTL		:
1914bafec742SSukumar Swaminathan 		case  AUX_RX_HALF_FULL_DET	:
1915bafec742SSukumar Swaminathan 		case  AUX_TX_HALF_FULL_DET	:
1916bafec742SSukumar Swaminathan 		case  AUX_RX_OVERFLOW_DET	:
1917bafec742SSukumar Swaminathan 		case  AUX_TX_OVERFLOW_DET	:
1918bafec742SSukumar Swaminathan 		case  AUX_RX_HALF_FULL_MASK	:
1919bafec742SSukumar Swaminathan 		case  AUX_TX_HALF_FULL_MASK	:
1920bafec742SSukumar Swaminathan 		case  AUX_RX_OVERFLOW_MASK	:
1921bafec742SSukumar Swaminathan 		case  AUX_TX_OVERFLOW_MASK	:
1922bafec742SSukumar Swaminathan 		case  RX_BYTES			:
1923bafec742SSukumar Swaminathan 		case  RX_BYTES_LO		:
1924bafec742SSukumar Swaminathan 		case  RX_BYTES_OK		:
1925bafec742SSukumar Swaminathan 		case  RX_BYTES_OK_LO		:
1926bafec742SSukumar Swaminathan 		case  RX_PKTS			:
1927bafec742SSukumar Swaminathan 		case  RX_PKTS_LO		:
1928bafec742SSukumar Swaminathan 		case  RX_PKTS_OK		:
1929bafec742SSukumar Swaminathan 		case  RX_PKTS_OK_LO		:
1930bafec742SSukumar Swaminathan 		case  RX_BCAST_PKTS		:
1931bafec742SSukumar Swaminathan 		case  RX_BCAST_PKTS_LO		:
1932bafec742SSukumar Swaminathan 		case  RX_MCAST_PKTS		:
1933bafec742SSukumar Swaminathan 		case  RX_MCAST_PKTS_LO		:
1934bafec742SSukumar Swaminathan 		case  RX_UCAST_PKTS		:
1935bafec742SSukumar Swaminathan 		case  RX_UCAST_PKTS_LO		:
1936bafec742SSukumar Swaminathan 		case  RX_UNDERSIZE_PKTS		:
1937bafec742SSukumar Swaminathan 		case  RX_UNDERSIZE_PKTS_LO	:
1938bafec742SSukumar Swaminathan 		case  RX_OVERSIZE_PKTS		:
1939bafec742SSukumar Swaminathan 		case  RX_OVERSIZE_PKTS_LO	:
1940bafec742SSukumar Swaminathan 		case  RX_JABBER_PKTS		:
1941bafec742SSukumar Swaminathan 		case  RX_JABBER_PKTS_LO		:
1942bafec742SSukumar Swaminathan 		case  RX_UNDERSIZE_FCERR_PKTS	:
1943bafec742SSukumar Swaminathan 		case  RX_UNDERSIZE_FCERR_PKTS_LO :
1944bafec742SSukumar Swaminathan 		case  RX_DROP_EVENTS		:
1945bafec742SSukumar Swaminathan 		case  RX_DROP_EVENTS_LO		:
1946bafec742SSukumar Swaminathan 		case  RX_FCERR_PKTS		:
1947bafec742SSukumar Swaminathan 		case  RX_FCERR_PKTS_LO		:
1948bafec742SSukumar Swaminathan 		case  RX_ALIGN_ERR		:
1949bafec742SSukumar Swaminathan 		case  RX_ALIGN_ERR_LO		:
1950bafec742SSukumar Swaminathan 		case  RX_SYMBOL_ERR		:
1951bafec742SSukumar Swaminathan 		case  RX_SYMBOL_ERR_LO		:
1952bafec742SSukumar Swaminathan 		case  RX_MAC_ERR		:
1953bafec742SSukumar Swaminathan 		case  RX_MAC_ERR_LO		:
1954bafec742SSukumar Swaminathan 		case  RX_CTL_PKTS		:
1955bafec742SSukumar Swaminathan 		case  RX_CTL_PKTS_LO		:
1956bafec742SSukumar Swaminathan 		case  RX_PAUSE_PKTS		:
1957bafec742SSukumar Swaminathan 		case  RX_PAUSE_PKTS_LO		:
1958bafec742SSukumar Swaminathan 		case  RX_64_PKTS		:
1959bafec742SSukumar Swaminathan 		case  RX_64_PKTS_LO		:
1960bafec742SSukumar Swaminathan 		case  RX_65_TO_127_PKTS		:
1961bafec742SSukumar Swaminathan 		case  RX_65_TO_127_PKTS_LO	:
1962bafec742SSukumar Swaminathan 		case  RX_128_255_PKTS		:
1963bafec742SSukumar Swaminathan 		case  RX_128_255_PKTS_LO	:
1964bafec742SSukumar Swaminathan 		case  RX_256_511_PKTS		:
1965bafec742SSukumar Swaminathan 		case  RX_256_511_PKTS_LO	:
1966bafec742SSukumar Swaminathan 		case  RX_512_TO_1023_PKTS	:
1967bafec742SSukumar Swaminathan 		case  RX_512_TO_1023_PKTS_LO	:
1968bafec742SSukumar Swaminathan 		case  RX_1024_TO_1518_PKTS	:
1969bafec742SSukumar Swaminathan 		case  RX_1024_TO_1518_PKTS_LO	:
1970bafec742SSukumar Swaminathan 		case  RX_1519_TO_MAX_PKTS	:
1971bafec742SSukumar Swaminathan 		case  RX_1519_TO_MAX_PKTS_LO	:
1972bafec742SSukumar Swaminathan 		case  RX_LEN_ERR_PKTS		:
1973bafec742SSukumar Swaminathan 		case  RX_LEN_ERR_PKTS_LO	:
1974bafec742SSukumar Swaminathan 		case  MDIO_TX_DATA		:
1975bafec742SSukumar Swaminathan 		case  MDIO_RX_DATA		:
1976bafec742SSukumar Swaminathan 		case  MDIO_CMD			:
1977bafec742SSukumar Swaminathan 		case  MDIO_PHY_ADDR		:
1978bafec742SSukumar Swaminathan 		case  MDIO_PORT			:
1979bafec742SSukumar Swaminathan 		case  MDIO_STATUS		:
1980bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES0	:
1981bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES0_LO	:
1982bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES1	:
1983bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES1_LO	:
1984bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES2	:
1985bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES2_LO	:
1986bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES3	:
1987bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES3_LO	:
1988bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES4	:
1989bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES4_LO	:
1990bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES5	:
1991bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES5_LO	:
1992bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES6	:
1993bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES6_LO	:
1994bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES7	:
1995bafec742SSukumar Swaminathan 		case  TX_CBFC_PAUSE_FRAMES7_LO	:
1996bafec742SSukumar Swaminathan 		case  TX_FCOE_PKTS		:
1997bafec742SSukumar Swaminathan 		case  TX_FCOE_PKTS_LO		:
1998bafec742SSukumar Swaminathan 		case  TX_MGMT_PKTS		:
1999bafec742SSukumar Swaminathan 		case  TX_MGMT_PKTS_LO		:
2000bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES0	:
2001bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES0_LO	:
2002bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES1	:
2003bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES1_LO	:
2004bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES2	:
2005bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES2_LO	:
2006bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES3	:
2007bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES3_LO	:
2008bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES4	:
2009bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES4_LO	:
2010bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES5	:
2011bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES5_LO	:
2012bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES6	:
2013bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES6_LO	:
2014bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES7	:
2015bafec742SSukumar Swaminathan 		case  RX_CBFC_PAUSE_FRAMES7_LO	:
2016bafec742SSukumar Swaminathan 		case  RX_FCOE_PKTS		:
2017bafec742SSukumar Swaminathan 		case  RX_FCOE_PKTS_LO		:
2018bafec742SSukumar Swaminathan 		case  RX_MGMT_PKTS		:
2019bafec742SSukumar Swaminathan 		case  RX_MGMT_PKTS_LO		:
2020bafec742SSukumar Swaminathan 		case  RX_NIC_FIFO_DROP		:
2021bafec742SSukumar Swaminathan 		case  RX_NIC_FIFO_DROP_LO	:
2022bafec742SSukumar Swaminathan 		case  RX_FCOE_FIFO_DROP		:
2023bafec742SSukumar Swaminathan 		case  RX_FCOE_FIFO_DROP_LO	:
2024bafec742SSukumar Swaminathan 		case  RX_MGMT_FIFO_DROP		:
2025bafec742SSukumar Swaminathan 		case  RX_MGMT_FIFO_DROP_LO	:
2026bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY0		:
2027bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY0_LO	:
2028bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY1		:
2029bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY1_LO	:
2030bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY2		:
2031bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY2_LO	:
2032bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY3		:
2033bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY3_LO	:
2034bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY4		:
2035bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY4_LO	:
2036bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY5		:
2037bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY5_LO	:
2038bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY6		:
2039bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY6_LO	:
2040bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY7		:
2041bafec742SSukumar Swaminathan 		case  RX_PKTS_PRIORITY7_LO	:
2042bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY0	:
2043bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY0_LO	:
2044bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY1	:
2045bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY1_LO	:
2046bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY2	:
2047bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY2_LO	:
2048bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY3	:
2049bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY3_LO	:
2050bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY4	:
2051bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY4_LO	:
2052bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY5	:
2053bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY5_LO	:
2054bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY6	:
2055bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY6_LO	:
2056bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY7	:
2057bafec742SSukumar Swaminathan 		case  RX_OCTETS_PRIORITY7_LO	:
2058bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY0		:
2059bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY0_LO	:
2060bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY1		:
2061bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY1_LO	:
2062bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY2		:
2063bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY2_LO	:
2064bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY3		:
2065bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY3_LO	:
2066bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY4		:
2067bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY4_LO	:
2068bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY5		:
2069bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY5_LO	:
2070bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY6		:
2071bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY6_LO	:
2072bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY7		:
2073bafec742SSukumar Swaminathan 		case  TX_PKTS_PRIORITY7_LO	:
2074bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY0	:
2075bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY0_LO	:
2076bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY1	:
2077bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY1_LO	:
2078bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY2	:
2079bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY2_LO	:
2080bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY3	:
2081bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY3_LO	:
2082bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY4	:
2083bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY4_LO	:
2084bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY5	:
2085bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY5_LO	:
2086bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY6	:
2087bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY6_LO	:
2088bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY7	:
2089bafec742SSukumar Swaminathan 		case  TX_OCTETS_PRIORITY7_LO	:
2090bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY0	:
2091bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY0_LO	:
2092bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY1	:
2093bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY1_LO	:
2094bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY2	:
2095bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY2_LO	:
2096bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY3	:
2097bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY3_LO	:
2098bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY4	:
2099bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY4_LO	:
2100bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY5	:
2101bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY5_LO	:
2102bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY6	:
2103bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY6_LO	:
2104bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY7	:
2105bafec742SSukumar Swaminathan 		case  RX_DISCARD_PRIORITY7_LO	:
2106bafec742SSukumar Swaminathan 			status = ql_read_xgmac_reg(qlge, i, buf);
2107bafec742SSukumar Swaminathan 			if (status != DDI_SUCCESS)
2108bafec742SSukumar Swaminathan 				goto err;
2109bafec742SSukumar Swaminathan 			break;
2110bafec742SSukumar Swaminathan 
2111bafec742SSukumar Swaminathan 		default:
2112bafec742SSukumar Swaminathan 			break;
2113bafec742SSukumar Swaminathan 		}
2114bafec742SSukumar Swaminathan 	}
2115bafec742SSukumar Swaminathan err:
2116bafec742SSukumar Swaminathan 	return (status);
2117bafec742SSukumar Swaminathan }
2118bafec742SSukumar Swaminathan 
2119bafec742SSukumar Swaminathan /*
2120bafec742SSukumar Swaminathan  * Read MPI related registers
2121bafec742SSukumar Swaminathan  */
2122bafec742SSukumar Swaminathan static int
ql_get_mpi_regs(qlge_t * qlge,uint32_t * buf,uint32_t offset,uint32_t count)2123bafec742SSukumar Swaminathan ql_get_mpi_regs(qlge_t *qlge, uint32_t *buf, uint32_t offset, uint32_t count)
2124bafec742SSukumar Swaminathan {
2125bafec742SSukumar Swaminathan 	int i, rtn_val = DDI_FAILURE;
2126bafec742SSukumar Swaminathan 
2127bafec742SSukumar Swaminathan 	for (i = 0; i < count; i++, buf++) {
2128bafec742SSukumar Swaminathan 		if (ql_read_processor_data(qlge, offset + i, buf)
2129bafec742SSukumar Swaminathan 		    != DDI_SUCCESS) {
2130bafec742SSukumar Swaminathan 			goto out;
2131bafec742SSukumar Swaminathan 		}
2132bafec742SSukumar Swaminathan 	}
2133bafec742SSukumar Swaminathan 	rtn_val = DDI_SUCCESS;
2134bafec742SSukumar Swaminathan out:
2135bafec742SSukumar Swaminathan 	return (rtn_val);
2136bafec742SSukumar Swaminathan }
2137bafec742SSukumar Swaminathan 
2138bafec742SSukumar Swaminathan /*
2139bafec742SSukumar Swaminathan  * Read processor "shadow" register "addr" value and save
2140bafec742SSukumar Swaminathan  * in "data".Assume all the locks&semaphore have been acquired
2141bafec742SSukumar Swaminathan  */
2142bafec742SSukumar Swaminathan static int
ql_get_mpi_shadow_regs(qlge_t * qlge,uint32_t * buf)2143bafec742SSukumar Swaminathan ql_get_mpi_shadow_regs(qlge_t *qlge, uint32_t *buf)
2144bafec742SSukumar Swaminathan {
2145bafec742SSukumar Swaminathan 	uint32_t i;
2146bafec742SSukumar Swaminathan 	int rtn_val = DDI_FAILURE;
2147bafec742SSukumar Swaminathan 
2148bafec742SSukumar Swaminathan #define	RISC_124	0x0003007c
2149bafec742SSukumar Swaminathan #define	RISC_127	0x0003007f
2150bafec742SSukumar Swaminathan #define	SHADOW_OFFSET	0xb0000000
2151bafec742SSukumar Swaminathan 
2152bafec742SSukumar Swaminathan 	for (i = 0; i < MPI_CORE_SH_REGS_CNT; i++, buf++) {
2153bafec742SSukumar Swaminathan 		if (ql_write_processor_data(qlge, RISC_124,
2154bafec742SSukumar Swaminathan 		    (SHADOW_OFFSET | i << 20)) != DDI_SUCCESS)
2155bafec742SSukumar Swaminathan 			goto end;
2156bafec742SSukumar Swaminathan 		if (ql_read_processor_data(qlge, RISC_127, buf) != DDI_SUCCESS)
2157bafec742SSukumar Swaminathan 			goto end;
2158bafec742SSukumar Swaminathan 	}
2159bafec742SSukumar Swaminathan 	rtn_val = DDI_SUCCESS;
2160bafec742SSukumar Swaminathan 
2161bafec742SSukumar Swaminathan end:
2162bafec742SSukumar Swaminathan 	return (rtn_val);
2163bafec742SSukumar Swaminathan }
2164bafec742SSukumar Swaminathan 
2165bafec742SSukumar Swaminathan #define	SYS_CLOCK		0x00
2166bafec742SSukumar Swaminathan #define	PCI_CLOCK		0x80
2167bafec742SSukumar Swaminathan #define	FC_CLOCK		0x140
2168bafec742SSukumar Swaminathan #define	XGM_CLOCK		0x180
2169bafec742SSukumar Swaminathan #define	ADDRESS_REGISTER_ENABLE	0x00010000
2170bafec742SSukumar Swaminathan #define	UP			0x00008000
2171bafec742SSukumar Swaminathan #define	MAX_MUX			0x40
2172bafec742SSukumar Swaminathan #define	MAX_MODULES		0x1F
2173bafec742SSukumar Swaminathan 
2174bafec742SSukumar Swaminathan static uint32_t *
ql_get_probe(qlge_t * qlge,uint32_t clock,uint8_t * valid,uint32_t * buf)2175bafec742SSukumar Swaminathan ql_get_probe(qlge_t *qlge, uint32_t clock, uint8_t *valid, uint32_t *buf)
2176bafec742SSukumar Swaminathan {
2177bafec742SSukumar Swaminathan 	uint32_t module, mux_sel, probe, lo_val, hi_val;
2178bafec742SSukumar Swaminathan 
2179bafec742SSukumar Swaminathan 	for (module = 0; module < MAX_MODULES; module ++) {
2180bafec742SSukumar Swaminathan 		if (valid[module]) {
2181bafec742SSukumar Swaminathan 			for (mux_sel = 0; mux_sel < MAX_MUX; mux_sel++) {
2182bafec742SSukumar Swaminathan 				probe = clock | ADDRESS_REGISTER_ENABLE |
2183bafec742SSukumar Swaminathan 				    mux_sel |(module << 9);
2184bafec742SSukumar Swaminathan 
2185bafec742SSukumar Swaminathan 				ql_write_reg(qlge, REG_PRB_MX_ADDR, probe);
2186bafec742SSukumar Swaminathan 				lo_val = ql_read_reg(qlge, REG_PRB_MX_DATA);
2187bafec742SSukumar Swaminathan 				if (mux_sel == 0) {
2188bafec742SSukumar Swaminathan 					*buf = probe;
2189bafec742SSukumar Swaminathan 					buf ++;
2190bafec742SSukumar Swaminathan 				}
2191bafec742SSukumar Swaminathan 				probe |= UP;
2192bafec742SSukumar Swaminathan 				ql_write_reg(qlge, REG_PRB_MX_ADDR, probe);
2193bafec742SSukumar Swaminathan 				hi_val = ql_read_reg(qlge, REG_PRB_MX_DATA);
2194bafec742SSukumar Swaminathan 				*buf = lo_val;
2195bafec742SSukumar Swaminathan 				buf++;
2196bafec742SSukumar Swaminathan 				*buf = hi_val;
2197bafec742SSukumar Swaminathan 				buf++;
2198bafec742SSukumar Swaminathan 			}
2199bafec742SSukumar Swaminathan 		}
2200bafec742SSukumar Swaminathan 	}
2201bafec742SSukumar Swaminathan 	return (buf);
2202bafec742SSukumar Swaminathan }
2203bafec742SSukumar Swaminathan 
2204bafec742SSukumar Swaminathan static int
ql_get_probe_dump(qlge_t * qlge,uint32_t * buf)2205bafec742SSukumar Swaminathan ql_get_probe_dump(qlge_t *qlge, uint32_t *buf)
2206bafec742SSukumar Swaminathan {
2207bafec742SSukumar Swaminathan 	uint8_t sys_clock_valid_modules[0x20] = {
2208bafec742SSukumar Swaminathan 		1,	/* 0x00 */
2209bafec742SSukumar Swaminathan 		1,	/* 0x01 */
2210bafec742SSukumar Swaminathan 		1,	/* 0x02 */
2211bafec742SSukumar Swaminathan 		0,	/* 0x03 */
2212bafec742SSukumar Swaminathan 		1,	/* 0x04 */
2213bafec742SSukumar Swaminathan 		1,	/* 0x05 */
2214bafec742SSukumar Swaminathan 		1,	/* 0x06 */
2215bafec742SSukumar Swaminathan 		1,	/* 0x07 */
2216bafec742SSukumar Swaminathan 		1,	/* 0x08 */
2217bafec742SSukumar Swaminathan 		1,	/* 0x09 */
2218bafec742SSukumar Swaminathan 		1,	/* 0x0A */
2219bafec742SSukumar Swaminathan 		1,	/* 0x0B */
2220bafec742SSukumar Swaminathan 		1,	/* 0x0C */
2221bafec742SSukumar Swaminathan 		1,	/* 0x0D */
2222bafec742SSukumar Swaminathan 		1,	/* 0x0E */
2223bafec742SSukumar Swaminathan 		0,	/* 0x0F */
2224bafec742SSukumar Swaminathan 		1,	/* 0x10 */
2225bafec742SSukumar Swaminathan 		1,	/* 0x11 */
2226bafec742SSukumar Swaminathan 		1,	/* 0x12 */
2227bafec742SSukumar Swaminathan 		1,	/* 0x13 */
2228bafec742SSukumar Swaminathan 		0,	/* 0x14 */
2229bafec742SSukumar Swaminathan 		0,	/* 0x15 */
2230bafec742SSukumar Swaminathan 		0,	/* 0x16 */
2231bafec742SSukumar Swaminathan 		0,	/* 0x17 */
2232bafec742SSukumar Swaminathan 		0,	/* 0x18 */
2233bafec742SSukumar Swaminathan 		0,	/* 0x19 */
2234bafec742SSukumar Swaminathan 		0,	/* 0x1A */
2235bafec742SSukumar Swaminathan 		0,	/* 0x1B */
2236bafec742SSukumar Swaminathan 		0,	/* 0x1C */
2237bafec742SSukumar Swaminathan 		0,	/* 0x1D */
2238bafec742SSukumar Swaminathan 		0,	/* 0x1E */
2239bafec742SSukumar Swaminathan 		0	/* 0x1F */
2240bafec742SSukumar Swaminathan 	};
2241bafec742SSukumar Swaminathan 
2242bafec742SSukumar Swaminathan 	unsigned char pci_clock_valid_modules[0x20] = {
2243bafec742SSukumar Swaminathan 		1,	/* 0x00 */
2244bafec742SSukumar Swaminathan 		0,	/* 0x01 */
2245bafec742SSukumar Swaminathan 		0,	/* 0x02 */
2246bafec742SSukumar Swaminathan 		0,	/* 0x03 */
2247bafec742SSukumar Swaminathan 		0,	/* 0x04 */
2248bafec742SSukumar Swaminathan 		0,	/* 0x05 */
2249bafec742SSukumar Swaminathan 		1,	/* 0x06 */
2250bafec742SSukumar Swaminathan 		1,	/* 0x07 */
2251bafec742SSukumar Swaminathan 		0,	/* 0x08 */
2252bafec742SSukumar Swaminathan 		0,	/* 0x09 */
2253bafec742SSukumar Swaminathan 		0,	/* 0x0A */
2254bafec742SSukumar Swaminathan 		0,	/* 0x0B */
2255bafec742SSukumar Swaminathan 		0,	/* 0x0C */
2256bafec742SSukumar Swaminathan 		0,	/* 0x0D */
2257bafec742SSukumar Swaminathan 		1,	/* 0x0E */
2258bafec742SSukumar Swaminathan 		0,	/* 0x0F */
2259bafec742SSukumar Swaminathan 		0,	/* 0x10 */
2260bafec742SSukumar Swaminathan 		0,	/* 0x11 */
2261bafec742SSukumar Swaminathan 		0,	/* 0x12 */
2262bafec742SSukumar Swaminathan 		0,	/* 0x13 */
2263bafec742SSukumar Swaminathan 		0,	/* 0x14 */
2264bafec742SSukumar Swaminathan 		0,	/* 0x15 */
2265bafec742SSukumar Swaminathan 		0,	/* 0x16 */
2266bafec742SSukumar Swaminathan 		0,	/* 0x17 */
2267bafec742SSukumar Swaminathan 		0,	/* 0x18 */
2268bafec742SSukumar Swaminathan 		0,	/* 0x19 */
2269bafec742SSukumar Swaminathan 		0,	/* 0x1A */
2270bafec742SSukumar Swaminathan 		0,	/* 0x1B */
2271bafec742SSukumar Swaminathan 		0,	/* 0x1C */
2272bafec742SSukumar Swaminathan 		0,	/* 0x1D */
2273bafec742SSukumar Swaminathan 		0,	/* 0x1E */
2274bafec742SSukumar Swaminathan 		0	/* 0x1F */
2275bafec742SSukumar Swaminathan 	};
2276bafec742SSukumar Swaminathan 
2277bafec742SSukumar Swaminathan 	unsigned char xgm_clock_valid_modules[0x20] = {
2278bafec742SSukumar Swaminathan 		1,	/* 0x00 */
2279bafec742SSukumar Swaminathan 		0,	/* 0x01 */
2280bafec742SSukumar Swaminathan 		0,	/* 0x02 */
2281bafec742SSukumar Swaminathan 		1,	/* 0x03 */
2282bafec742SSukumar Swaminathan 		0,	/* 0x04 */
2283bafec742SSukumar Swaminathan 		0,	/* 0x05 */
2284bafec742SSukumar Swaminathan 		0,	/* 0x06 */
2285bafec742SSukumar Swaminathan 		0,	/* 0x07 */
2286bafec742SSukumar Swaminathan 		1,	/* 0x08 */
2287bafec742SSukumar Swaminathan 		1,	/* 0x09 */
2288bafec742SSukumar Swaminathan 		0,	/* 0x0A */
2289bafec742SSukumar Swaminathan 		0,	/* 0x0B */
2290bafec742SSukumar Swaminathan 		1,	/* 0x0C */
2291bafec742SSukumar Swaminathan 		1,	/* 0x0D */
2292bafec742SSukumar Swaminathan 		1,	/* 0x0E */
2293bafec742SSukumar Swaminathan 		0,	/* 0x0F */
2294bafec742SSukumar Swaminathan 		1,	/* 0x10 */
2295bafec742SSukumar Swaminathan 		1,	/* 0x11 */
2296bafec742SSukumar Swaminathan 		0,	/* 0x12 */
2297bafec742SSukumar Swaminathan 		0,	/* 0x13 */
2298bafec742SSukumar Swaminathan 		0,	/* 0x14 */
2299bafec742SSukumar Swaminathan 		0,	/* 0x15 */
2300bafec742SSukumar Swaminathan 		0,	/* 0x16 */
2301bafec742SSukumar Swaminathan 		0,	/* 0x17 */
2302bafec742SSukumar Swaminathan 		0,	/* 0x18 */
2303bafec742SSukumar Swaminathan 		0,	/* 0x19 */
2304bafec742SSukumar Swaminathan 		0,	/* 0x1A */
2305bafec742SSukumar Swaminathan 		0,	/* 0x1B */
2306bafec742SSukumar Swaminathan 		0,	/* 0x1C */
2307bafec742SSukumar Swaminathan 		0,	/* 0x1D */
2308bafec742SSukumar Swaminathan 		0,	/* 0x1E */
2309bafec742SSukumar Swaminathan 		0	/* 0x1F */
2310bafec742SSukumar Swaminathan 	};
2311bafec742SSukumar Swaminathan 
2312bafec742SSukumar Swaminathan 	unsigned char fc_clock_valid_modules[0x20] = {
2313bafec742SSukumar Swaminathan 		1,	/* 0x00 */
2314bafec742SSukumar Swaminathan 		0,	/* 0x01 */
2315bafec742SSukumar Swaminathan 		0,	/* 0x02 */
2316bafec742SSukumar Swaminathan 		0,	/* 0x03 */
2317bafec742SSukumar Swaminathan 		0,	/* 0x04 */
2318bafec742SSukumar Swaminathan 		0,	/* 0x05 */
2319bafec742SSukumar Swaminathan 		0,	/* 0x06 */
2320bafec742SSukumar Swaminathan 		0,	/* 0x07 */
2321bafec742SSukumar Swaminathan 		0,	/* 0x08 */
2322bafec742SSukumar Swaminathan 		0,	/* 0x09 */
2323bafec742SSukumar Swaminathan 		0,	/* 0x0A */
2324bafec742SSukumar Swaminathan 		0,	/* 0x0B */
2325bafec742SSukumar Swaminathan 		1,	/* 0x0C */
2326bafec742SSukumar Swaminathan 		1,	/* 0x0D */
2327bafec742SSukumar Swaminathan 		0,	/* 0x0E */
2328bafec742SSukumar Swaminathan 		0,	/* 0x0F */
2329bafec742SSukumar Swaminathan 		0,	/* 0x10 */
2330bafec742SSukumar Swaminathan 		0,	/* 0x11 */
2331bafec742SSukumar Swaminathan 		0,	/* 0x12 */
2332bafec742SSukumar Swaminathan 		0,	/* 0x13 */
2333bafec742SSukumar Swaminathan 		0,	/* 0x14 */
2334bafec742SSukumar Swaminathan 		0,	/* 0x15 */
2335bafec742SSukumar Swaminathan 		0,	/* 0x16 */
2336bafec742SSukumar Swaminathan 		0,	/* 0x17 */
2337bafec742SSukumar Swaminathan 		0,	/* 0x18 */
2338bafec742SSukumar Swaminathan 		0,	/* 0x19 */
2339bafec742SSukumar Swaminathan 		0,	/* 0x1A */
2340bafec742SSukumar Swaminathan 		0,	/* 0x1B */
2341bafec742SSukumar Swaminathan 		0,	/* 0x1C */
2342bafec742SSukumar Swaminathan 		0,	/* 0x1D */
2343bafec742SSukumar Swaminathan 		0,	/* 0x1E */
2344bafec742SSukumar Swaminathan 		0	/* 0x1F */
2345bafec742SSukumar Swaminathan 	};
2346bafec742SSukumar Swaminathan 
2347bafec742SSukumar Swaminathan 	/*
2348bafec742SSukumar Swaminathan 	 * First we have to enable the probe mux
2349bafec742SSukumar Swaminathan 	 */
23500662fbf4SSukumar Swaminathan 	(void) ql_write_processor_data(qlge, 0x100e, 0x18a20000);
2351bafec742SSukumar Swaminathan 
2352bafec742SSukumar Swaminathan 	buf = ql_get_probe(qlge, SYS_CLOCK, sys_clock_valid_modules, buf);
2353bafec742SSukumar Swaminathan 
2354bafec742SSukumar Swaminathan 	buf = ql_get_probe(qlge, PCI_CLOCK, pci_clock_valid_modules, buf);
2355bafec742SSukumar Swaminathan 
2356bafec742SSukumar Swaminathan 	buf = ql_get_probe(qlge, XGM_CLOCK, xgm_clock_valid_modules, buf);
2357bafec742SSukumar Swaminathan 
2358bafec742SSukumar Swaminathan 	buf = ql_get_probe(qlge, FC_CLOCK, fc_clock_valid_modules, buf);
2359bafec742SSukumar Swaminathan 
2360bafec742SSukumar Swaminathan 	return (0);
2361bafec742SSukumar Swaminathan 
2362bafec742SSukumar Swaminathan }
2363bafec742SSukumar Swaminathan 
2364bafec742SSukumar Swaminathan /*
2365bafec742SSukumar Swaminathan  * Dump rounting index registers
2366bafec742SSukumar Swaminathan  */
2367bafec742SSukumar Swaminathan void
ql_get_routing_index_registers(qlge_t * qlge,uint32_t * buf)2368bafec742SSukumar Swaminathan ql_get_routing_index_registers(qlge_t *qlge, uint32_t *buf)
2369bafec742SSukumar Swaminathan {
2370bafec742SSukumar Swaminathan 	uint32_t type, index, index_max;
2371bafec742SSukumar Swaminathan 	uint32_t result_index;
2372bafec742SSukumar Swaminathan 	uint32_t result_data;
2373bafec742SSukumar Swaminathan 	uint32_t val;
2374bafec742SSukumar Swaminathan 
2375bafec742SSukumar Swaminathan 	for (type = 0; type < 4; type ++) {
2376bafec742SSukumar Swaminathan 		if (type < 2) {
2377bafec742SSukumar Swaminathan 			index_max = 8;
2378bafec742SSukumar Swaminathan 		} else {
2379bafec742SSukumar Swaminathan 			index_max = 16;
2380bafec742SSukumar Swaminathan 		}
2381bafec742SSukumar Swaminathan 		for (index = 0; index < index_max; index ++) {
2382bafec742SSukumar Swaminathan 			val = 0x04000000 | (type << 16) | (index << 8);
2383bafec742SSukumar Swaminathan 			ql_write_reg(qlge, REG_ROUTING_INDEX, val);
2384bafec742SSukumar Swaminathan 			result_index = 0;
2385bafec742SSukumar Swaminathan 			while ((result_index & 0x40000000) == 0) {
2386bafec742SSukumar Swaminathan 				result_index =
2387bafec742SSukumar Swaminathan 				    ql_read_reg(qlge, REG_ROUTING_INDEX);
2388bafec742SSukumar Swaminathan 			}
2389bafec742SSukumar Swaminathan 			result_data = ql_read_reg(qlge, REG_ROUTING_DATA);
2390bafec742SSukumar Swaminathan 			*buf = type;
2391bafec742SSukumar Swaminathan 			buf ++;
2392bafec742SSukumar Swaminathan 			*buf = index;
2393bafec742SSukumar Swaminathan 			buf ++;
2394bafec742SSukumar Swaminathan 			*buf = result_index;
2395bafec742SSukumar Swaminathan 			buf ++;
2396bafec742SSukumar Swaminathan 			*buf = result_data;
2397bafec742SSukumar Swaminathan 			buf ++;
2398bafec742SSukumar Swaminathan 		}
2399bafec742SSukumar Swaminathan 	}
2400bafec742SSukumar Swaminathan }
2401bafec742SSukumar Swaminathan 
2402bafec742SSukumar Swaminathan /*
2403bafec742SSukumar Swaminathan  * Dump mac protocol registers
2404bafec742SSukumar Swaminathan  */
2405bafec742SSukumar Swaminathan void
ql_get_mac_protocol_registers(qlge_t * qlge,uint32_t * buf)2406bafec742SSukumar Swaminathan ql_get_mac_protocol_registers(qlge_t *qlge, uint32_t *buf)
2407bafec742SSukumar Swaminathan {
2408bafec742SSukumar Swaminathan #define	RS_AND_ADR	0x06000000
2409bafec742SSukumar Swaminathan #define	RS_ONLY		0x04000000
2410bafec742SSukumar Swaminathan #define	NUM_TYPES	10
2411bafec742SSukumar Swaminathan 	uint32_t result_index, result_data;
2412bafec742SSukumar Swaminathan 	uint32_t type;
2413bafec742SSukumar Swaminathan 	uint32_t index;
2414bafec742SSukumar Swaminathan 	uint32_t offset;
2415bafec742SSukumar Swaminathan 	uint32_t val;
2416bafec742SSukumar Swaminathan 	uint32_t initial_val;
2417bafec742SSukumar Swaminathan 	uint32_t max_index;
2418bafec742SSukumar Swaminathan 	uint32_t max_offset;
2419bafec742SSukumar Swaminathan 
2420bafec742SSukumar Swaminathan 	for (type = 0; type < NUM_TYPES; type ++) {
2421bafec742SSukumar Swaminathan 		switch (type) {
2422bafec742SSukumar Swaminathan 
2423bafec742SSukumar Swaminathan 		case 0: /* CAM */
2424bafec742SSukumar Swaminathan 			initial_val = RS_AND_ADR;
2425bafec742SSukumar Swaminathan 			max_index = 512;
2426bafec742SSukumar Swaminathan 			max_offset = 3;
2427bafec742SSukumar Swaminathan 			break;
2428bafec742SSukumar Swaminathan 
2429bafec742SSukumar Swaminathan 		case 1: /* Multicast MAC Address */
2430bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2431bafec742SSukumar Swaminathan 			max_index = 32;
2432bafec742SSukumar Swaminathan 			max_offset = 2;
2433bafec742SSukumar Swaminathan 			break;
2434bafec742SSukumar Swaminathan 
2435bafec742SSukumar Swaminathan 		case 2: /* VLAN filter mask */
2436bafec742SSukumar Swaminathan 		case 3: /* MC filter mask */
2437bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2438bafec742SSukumar Swaminathan 			max_index = 4096;
2439bafec742SSukumar Swaminathan 			max_offset = 1;
2440bafec742SSukumar Swaminathan 			break;
2441bafec742SSukumar Swaminathan 
2442bafec742SSukumar Swaminathan 		case 4: /* FC MAC addresses */
2443bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2444bafec742SSukumar Swaminathan 			max_index = 4;
2445bafec742SSukumar Swaminathan 			max_offset = 2;
2446bafec742SSukumar Swaminathan 			break;
2447bafec742SSukumar Swaminathan 
2448bafec742SSukumar Swaminathan 		case 5: /* Mgmt MAC addresses */
2449bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2450bafec742SSukumar Swaminathan 			max_index = 8;
2451bafec742SSukumar Swaminathan 			max_offset = 2;
2452bafec742SSukumar Swaminathan 			break;
2453bafec742SSukumar Swaminathan 
2454bafec742SSukumar Swaminathan 		case 6: /* Mgmt VLAN addresses */
2455bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2456bafec742SSukumar Swaminathan 			max_index = 16;
2457bafec742SSukumar Swaminathan 			max_offset = 1;
2458bafec742SSukumar Swaminathan 			break;
2459bafec742SSukumar Swaminathan 
2460bafec742SSukumar Swaminathan 		case 7: /* Mgmt IPv4 address */
2461bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2462bafec742SSukumar Swaminathan 			max_index = 4;
2463bafec742SSukumar Swaminathan 			max_offset = 1;
2464bafec742SSukumar Swaminathan 			break;
2465bafec742SSukumar Swaminathan 
2466bafec742SSukumar Swaminathan 		case 8: /* Mgmt IPv6 address */
2467bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2468bafec742SSukumar Swaminathan 			max_index = 4;
2469bafec742SSukumar Swaminathan 			max_offset = 4;
2470bafec742SSukumar Swaminathan 			break;
2471bafec742SSukumar Swaminathan 
2472bafec742SSukumar Swaminathan 		case 9: /* Mgmt TCP/UDP Dest port */
2473bafec742SSukumar Swaminathan 			initial_val = RS_ONLY;
2474bafec742SSukumar Swaminathan 			max_index = 4;
2475bafec742SSukumar Swaminathan 			max_offset = 1;
2476bafec742SSukumar Swaminathan 			break;
2477bafec742SSukumar Swaminathan 
2478bafec742SSukumar Swaminathan 		default:
2479bafec742SSukumar Swaminathan 			cmn_err(CE_WARN, "Bad type!!! 0x%08x", type);
2480bafec742SSukumar Swaminathan 			max_index = 0;
2481bafec742SSukumar Swaminathan 			max_offset = 0;
2482bafec742SSukumar Swaminathan 			break;
2483bafec742SSukumar Swaminathan 		}
2484bafec742SSukumar Swaminathan 		for (index = 0; index < max_index; index ++) {
2485bafec742SSukumar Swaminathan 			for (offset = 0; offset < max_offset; offset ++) {
2486bafec742SSukumar Swaminathan 				val = initial_val | (type << 16) | (index << 4)
2487bafec742SSukumar Swaminathan 				    | (offset);
2488bafec742SSukumar Swaminathan 				ql_write_reg(qlge,
2489bafec742SSukumar Swaminathan 				    REG_MAC_PROTOCOL_ADDRESS_INDEX, val);
2490bafec742SSukumar Swaminathan 				result_index = 0;
2491bafec742SSukumar Swaminathan 				while ((result_index & 0x40000000) == 0) {
2492bafec742SSukumar Swaminathan 					result_index = ql_read_reg(qlge,
2493bafec742SSukumar Swaminathan 					    REG_MAC_PROTOCOL_ADDRESS_INDEX);
2494bafec742SSukumar Swaminathan 				}
2495bafec742SSukumar Swaminathan 				result_data =
2496bafec742SSukumar Swaminathan 				    ql_read_reg(qlge, REG_MAC_PROTOCOL_DATA);
2497bafec742SSukumar Swaminathan 				*buf = result_index;
2498bafec742SSukumar Swaminathan 				buf ++;
2499bafec742SSukumar Swaminathan 				*buf = result_data;
2500bafec742SSukumar Swaminathan 				buf ++;
2501bafec742SSukumar Swaminathan 			}
2502bafec742SSukumar Swaminathan 		}
2503bafec742SSukumar Swaminathan 	}
2504bafec742SSukumar Swaminathan }
2505bafec742SSukumar Swaminathan 
2506bafec742SSukumar Swaminathan /*
2507bafec742SSukumar Swaminathan  * Dump serdes registers
2508bafec742SSukumar Swaminathan  */
2509bafec742SSukumar Swaminathan static int
ql_get_serdes_regs(qlge_t * qlge,struct ql_mpi_coredump * mpi_coredump)2510bafec742SSukumar Swaminathan ql_get_serdes_regs(qlge_t *qlge, struct ql_mpi_coredump *mpi_coredump)
2511bafec742SSukumar Swaminathan {
2512bafec742SSukumar Swaminathan 	uint32_t i, j;
2513bafec742SSukumar Swaminathan 	int status;
2514bafec742SSukumar Swaminathan 
2515bafec742SSukumar Swaminathan 	for (i = 0, j = 0; i <= 0x000000034; i += 4) {
2516bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
2517bafec742SSukumar Swaminathan 		    &mpi_coredump->serdes_xaui_an[j++]);
2518bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2519bafec742SSukumar Swaminathan 			goto err;
2520bafec742SSukumar Swaminathan 		}
2521bafec742SSukumar Swaminathan 	}
2522bafec742SSukumar Swaminathan 
2523bafec742SSukumar Swaminathan 	for (i = 0x800, j = 0; i <= 0x880; i += 4) {
2524bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
2525bafec742SSukumar Swaminathan 		    &mpi_coredump->serdes_xaui_hss_pcs[j++]);
2526bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2527bafec742SSukumar Swaminathan 			goto err;
2528bafec742SSukumar Swaminathan 		}
2529bafec742SSukumar Swaminathan 	}
2530bafec742SSukumar Swaminathan 
2531bafec742SSukumar Swaminathan 	for (i = 0x1000, j = 0; i <= 0x1034; i += 4) {
2532bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
2533bafec742SSukumar Swaminathan 		    &mpi_coredump->serdes_xfi_an[j++]);
2534bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2535bafec742SSukumar Swaminathan 			goto err;
2536bafec742SSukumar Swaminathan 		}
2537bafec742SSukumar Swaminathan 	}
2538bafec742SSukumar Swaminathan 
2539bafec742SSukumar Swaminathan 	for (i = 0x1050, j = 0; i <= 0x107c; i += 4) {
2540bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
2541bafec742SSukumar Swaminathan 		    &mpi_coredump->serdes_xfi_train[j++]);
2542bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2543bafec742SSukumar Swaminathan 			goto err;
2544bafec742SSukumar Swaminathan 		}
2545bafec742SSukumar Swaminathan 	}
2546bafec742SSukumar Swaminathan 
2547bafec742SSukumar Swaminathan 	for (i = 0x1800, j = 0; i <= 0x1838; i += 4) {
2548bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
2549bafec742SSukumar Swaminathan 		    &mpi_coredump->serdes_xfi_hss_pcs[j++]);
2550bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2551bafec742SSukumar Swaminathan 			goto err;
2552bafec742SSukumar Swaminathan 		}
2553bafec742SSukumar Swaminathan 	}
2554bafec742SSukumar Swaminathan 
255546a6b896SRichard Lowe 	for (i = 0x1c00, j = 0; i <= 0x1c1f; i++) {
2556bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
255746a6b896SRichard Lowe 		    &mpi_coredump->serdes_xfi_hss_tx[j++]);
2558bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2559bafec742SSukumar Swaminathan 			goto err;
2560bafec742SSukumar Swaminathan 		}
2561bafec742SSukumar Swaminathan 	}
2562bafec742SSukumar Swaminathan 
256346a6b896SRichard Lowe 	for (i = 0x1c40, j = 0; i <= 0x1c5f; i++) {
2564bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
256546a6b896SRichard Lowe 		    &mpi_coredump->serdes_xfi_hss_rx[j++]);
2566bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2567bafec742SSukumar Swaminathan 			goto err;
2568bafec742SSukumar Swaminathan 		}
2569bafec742SSukumar Swaminathan 	}
2570bafec742SSukumar Swaminathan 
257146a6b896SRichard Lowe 	for (i = 0x1e00, j = 0; i <= 0x1e1f; i++) {
2572bafec742SSukumar Swaminathan 		status = ql_read_serdes_reg(qlge, i,
257346a6b896SRichard Lowe 		    &mpi_coredump->serdes_xfi_hss_pll[j++]);
2574bafec742SSukumar Swaminathan 		if (status != DDI_SUCCESS) {
2575bafec742SSukumar Swaminathan 			goto err;
2576bafec742SSukumar Swaminathan 		}
2577bafec742SSukumar Swaminathan 	}
2578bafec742SSukumar Swaminathan 
2579bafec742SSukumar Swaminathan err:
2580bafec742SSukumar Swaminathan 	if (status != DDI_SUCCESS) {
2581bafec742SSukumar Swaminathan 		cmn_err(CE_WARN, "Serdes register 0x%x access error", i);
2582bafec742SSukumar Swaminathan 	}
2583bafec742SSukumar Swaminathan 
2584bafec742SSukumar Swaminathan 	return (status);
2585bafec742SSukumar Swaminathan }
2586bafec742SSukumar Swaminathan 
2587bafec742SSukumar Swaminathan /*
2588bafec742SSukumar Swaminathan  * Dump ets registers
2589bafec742SSukumar Swaminathan  */
2590bafec742SSukumar Swaminathan static int
ql_get_ets_regs(qlge_t * qlge,uint32_t * buf)2591bafec742SSukumar Swaminathan ql_get_ets_regs(qlge_t *qlge, uint32_t *buf)
2592bafec742SSukumar Swaminathan {
2593bafec742SSukumar Swaminathan 	int i;
2594bafec742SSukumar Swaminathan 
2595bafec742SSukumar Swaminathan 	/*
2596bafec742SSukumar Swaminathan 	 * First read out the NIC ETS
2597bafec742SSukumar Swaminathan 	 */
2598bafec742SSukumar Swaminathan 	for (i = 0; i < 8; i++, buf++) {
2599bafec742SSukumar Swaminathan 		ql_write_reg(qlge, REG_NIC_ENHANCED_TX_SCHEDULE,
2600bafec742SSukumar Swaminathan 		    i << 29 | 0x08000000);
2601bafec742SSukumar Swaminathan 		/* wait for reg to come ready */
2602bafec742SSukumar Swaminathan 		/* get the data */
2603bafec742SSukumar Swaminathan 		*buf = ql_read_reg(qlge, REG_NIC_ENHANCED_TX_SCHEDULE);
2604bafec742SSukumar Swaminathan 	}
2605bafec742SSukumar Swaminathan 	/*
2606bafec742SSukumar Swaminathan 	 * Now read out the CNA ETS
2607bafec742SSukumar Swaminathan 	 */
2608bafec742SSukumar Swaminathan 	for (i = 0; i < 2; i ++, buf ++) {
2609bafec742SSukumar Swaminathan 		ql_write_reg(qlge, REG_CNA_ENHANCED_TX_SCHEDULE,
2610bafec742SSukumar Swaminathan 		    i << 29 | 0x08000000);
2611bafec742SSukumar Swaminathan 		/* wait for reg to come ready */
2612bafec742SSukumar Swaminathan 		*buf = ql_read_reg(qlge, REG_CNA_ENHANCED_TX_SCHEDULE);
2613bafec742SSukumar Swaminathan 	}
2614bafec742SSukumar Swaminathan 
2615bafec742SSukumar Swaminathan 	return (0);
2616bafec742SSukumar Swaminathan }
2617bafec742SSukumar Swaminathan 
2618bafec742SSukumar Swaminathan /*
2619bafec742SSukumar Swaminathan  * Core dump in binary format
2620bafec742SSukumar Swaminathan  */
2621bafec742SSukumar Swaminathan int
ql_8xxx_binary_core_dump(qlge_t * qlge,ql_mpi_coredump_t * mpi_coredump)2622bafec742SSukumar Swaminathan ql_8xxx_binary_core_dump(qlge_t *qlge, ql_mpi_coredump_t *mpi_coredump)
2623bafec742SSukumar Swaminathan {
2624bafec742SSukumar Swaminathan 	int		rtn_val = DDI_FAILURE;
2625bafec742SSukumar Swaminathan 	uint64_t	timestamp, phy_addr;
2626bafec742SSukumar Swaminathan 	uint32_t	addr;
2627bafec742SSukumar Swaminathan 	int		i;
2628bafec742SSukumar Swaminathan 
2629bafec742SSukumar Swaminathan 	if (ql_sem_spinlock(qlge, QL_PROCESSOR_SEM_MASK) != DDI_SUCCESS) {
2630bafec742SSukumar Swaminathan 		return (rtn_val);
2631bafec742SSukumar Swaminathan 	}
2632bafec742SSukumar Swaminathan 
2633bafec742SSukumar Swaminathan 	/* pause the risc */
2634bafec742SSukumar Swaminathan 	if (ql_pause_mpi_risc(qlge) != DDI_SUCCESS) {
2635bafec742SSukumar Swaminathan 		cmn_err(CE_WARN,
2636bafec742SSukumar Swaminathan 		    "%s(%d) Wait for RISC paused timeout.",
2637bafec742SSukumar Swaminathan 		    __func__, qlge->instance);
2638bafec742SSukumar Swaminathan 		goto out;
2639bafec742SSukumar Swaminathan 	}
2640bafec742SSukumar Swaminathan 
2641bafec742SSukumar Swaminathan 	/* 0:make core dump header */
2642bafec742SSukumar Swaminathan 	bzero(&(mpi_coredump->mpi_global_header),
2643bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_global_header_t));
2644bafec742SSukumar Swaminathan 	mpi_coredump->mpi_global_header.cookie = MPI_COREDUMP_COOKIE;
2645bafec742SSukumar Swaminathan 	(void) strcpy(mpi_coredump->mpi_global_header.id_string,
2646bafec742SSukumar Swaminathan 	    "MPI Coredump");
2647bafec742SSukumar Swaminathan 	timestamp = ddi_get_time();
2648bafec742SSukumar Swaminathan 	timestamp *= 1000000;
2649bafec742SSukumar Swaminathan 	mpi_coredump->mpi_global_header.time_lo = LSW(timestamp);
2650bafec742SSukumar Swaminathan 	mpi_coredump->mpi_global_header.time_hi = MSW(timestamp);
2651bafec742SSukumar Swaminathan 	mpi_coredump->mpi_global_header.total_image_size =
2652bafec742SSukumar Swaminathan 	    (uint32_t)(sizeof (ql_mpi_coredump_t));
2653bafec742SSukumar Swaminathan 	mpi_coredump->mpi_global_header.global_header_size =
2654bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_global_header_t);
2655bafec742SSukumar Swaminathan 	(void) strcpy(mpi_coredump->mpi_global_header.driver_info,
2656bafec742SSukumar Swaminathan 	    "driver version is "VERSIONSTR);
2657bafec742SSukumar Swaminathan 
2658bafec742SSukumar Swaminathan 	/* 1:MPI Core Registers */
2659bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->core_regs_seg_hdr,
2660bafec742SSukumar Swaminathan 	    CORE_SEG_NUM, sizeof (mpi_coredump->core_regs_seg_hdr) +
2661bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->mpi_core_regs) +
2662bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->mpi_core_sh_regs),
2663bafec742SSukumar Swaminathan 	    (uint8_t *)"Core Registers");
2664bafec742SSukumar Swaminathan 
2665bafec742SSukumar Swaminathan 	/* first, read 127 core registers */
26660662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->mpi_core_regs[0],
2667bafec742SSukumar Swaminathan 	    MPI_CORE_REGS_ADDR, MPI_CORE_REGS_CNT);
2668bafec742SSukumar Swaminathan 	/* read the next 16 shadow registers */
26690662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_shadow_regs(qlge,
26700662fbf4SSukumar Swaminathan 	    &mpi_coredump->mpi_core_sh_regs[0]);
2671bafec742SSukumar Swaminathan 
2672bafec742SSukumar Swaminathan 	/* 2:MPI Test Logic Registers */
2673bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->test_logic_regs_seg_hdr,
2674bafec742SSukumar Swaminathan 	    TEST_LOGIC_SEG_NUM,
2675bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2676bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->test_logic_regs),
2677bafec742SSukumar Swaminathan 	    (uint8_t *)"Test Logic Regs");
2678bafec742SSukumar Swaminathan 
26790662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->test_logic_regs[0],
2680bafec742SSukumar Swaminathan 	    TEST_REGS_ADDR, TEST_REGS_CNT);
2681bafec742SSukumar Swaminathan 
2682bafec742SSukumar Swaminathan 	/* 3:RMII Registers */
2683bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->rmii_regs_seg_hdr,
2684bafec742SSukumar Swaminathan 	    RMII_SEG_NUM,
2685bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2686bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->rmii_regs),
2687bafec742SSukumar Swaminathan 	    (uint8_t *)"RMII Registers");
26880662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->rmii_regs[0],
2689bafec742SSukumar Swaminathan 	    RMII_REGS_ADDR, RMII_REGS_CNT);
2690bafec742SSukumar Swaminathan 
2691bafec742SSukumar Swaminathan 	/* 4:FCMAC1 Registers */
2692bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->fcmac1_regs_seg_hdr,
2693bafec742SSukumar Swaminathan 	    FCMAC1_SEG_NUM,
2694bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2695bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->fcmac1_regs),
2696bafec742SSukumar Swaminathan 	    (uint8_t *)"FCMAC1 Registers");
26970662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->fcmac1_regs[0],
2698bafec742SSukumar Swaminathan 	    FCMAC1_REGS_ADDR, FCMAC_REGS_CNT);
2699bafec742SSukumar Swaminathan 
2700bafec742SSukumar Swaminathan 	/* 5:FCMAC2 Registers */
2701bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->fcmac2_regs_seg_hdr,
2702bafec742SSukumar Swaminathan 	    FCMAC2_SEG_NUM,
2703bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2704bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->fcmac2_regs),
2705bafec742SSukumar Swaminathan 	    (uint8_t *)"FCMAC2 Registers");
27060662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->fcmac2_regs[0],
2707bafec742SSukumar Swaminathan 	    FCMAC2_REGS_ADDR, FCMAC_REGS_CNT);
2708bafec742SSukumar Swaminathan 
2709bafec742SSukumar Swaminathan 	/* 6:FC1 Mailbox Registers */
2710bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->fc1_mbx_regs_seg_hdr,
2711bafec742SSukumar Swaminathan 	    FC1_MBOX_SEG_NUM,
2712bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2713bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->fc1_mbx_regs),
2714bafec742SSukumar Swaminathan 	    (uint8_t *)"FC1 MBox Regs");
27150662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->fc1_mbx_regs[0],
2716bafec742SSukumar Swaminathan 	    FC1_MBX_REGS_ADDR, FC_MBX_REGS_CNT);
2717bafec742SSukumar Swaminathan 
2718bafec742SSukumar Swaminathan 	/* 7:IDE Registers */
2719bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->ide_regs_seg_hdr,
2720bafec742SSukumar Swaminathan 	    IDE_SEG_NUM,
2721bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2722bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->ide_regs),
2723bafec742SSukumar Swaminathan 	    (uint8_t *)"IDE Registers");
27240662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->ide_regs[0],
2725bafec742SSukumar Swaminathan 	    IDE_REGS_ADDR, IDE_REGS_CNT);
2726bafec742SSukumar Swaminathan 
2727bafec742SSukumar Swaminathan 	/* 8:Host1 Mailbox Registers */
2728bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->nic1_mbx_regs_seg_hdr,
2729bafec742SSukumar Swaminathan 	    NIC1_MBOX_SEG_NUM,
2730bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2731bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->nic1_mbx_regs),
2732bafec742SSukumar Swaminathan 	    (uint8_t *)"NIC1 MBox Regs");
27330662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->nic1_mbx_regs[0],
2734bafec742SSukumar Swaminathan 	    NIC1_MBX_REGS_ADDR, NIC_MBX_REGS_CNT);
2735bafec742SSukumar Swaminathan 
2736bafec742SSukumar Swaminathan 	/* 9:SMBus Registers */
2737bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->smbus_regs_seg_hdr,
2738bafec742SSukumar Swaminathan 	    SMBUS_SEG_NUM,
2739bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2740bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->smbus_regs),
2741bafec742SSukumar Swaminathan 	    (uint8_t *)"SMBus Registers");
27420662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->smbus_regs[0],
2743bafec742SSukumar Swaminathan 	    SMBUS_REGS_ADDR, SMBUS_REGS_CNT);
2744bafec742SSukumar Swaminathan 
2745bafec742SSukumar Swaminathan 	/* 10:FC2 Mailbox Registers */
2746bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->fc2_mbx_regs_seg_hdr,
2747bafec742SSukumar Swaminathan 	    FC2_MBOX_SEG_NUM,
2748bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2749bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->fc2_mbx_regs),
2750bafec742SSukumar Swaminathan 	    (uint8_t *)"FC2 MBox Regs");
27510662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->fc2_mbx_regs[0],
2752bafec742SSukumar Swaminathan 	    FC2_MBX_REGS_ADDR, FC_MBX_REGS_CNT);
2753bafec742SSukumar Swaminathan 
2754bafec742SSukumar Swaminathan 	/* 11:Host2 Mailbox Registers */
2755bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->nic2_mbx_regs_seg_hdr,
2756bafec742SSukumar Swaminathan 	    NIC2_MBOX_SEG_NUM,
2757bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2758bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->nic2_mbx_regs),
2759bafec742SSukumar Swaminathan 	    (uint8_t *)"NIC2 MBox Regs");
27600662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->nic2_mbx_regs[0],
2761bafec742SSukumar Swaminathan 	    NIC2_MBX_REGS_ADDR, NIC_MBX_REGS_CNT);
2762bafec742SSukumar Swaminathan 
2763bafec742SSukumar Swaminathan 	/* 12:i2C Registers */
2764bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->i2c_regs_seg_hdr,
2765bafec742SSukumar Swaminathan 	    I2C_SEG_NUM,
2766bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2767bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->i2c_regs),
2768bafec742SSukumar Swaminathan 	    (uint8_t *)"I2C Registers");
27690662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->i2c_regs[0],
2770bafec742SSukumar Swaminathan 	    I2C_REGS_ADDR, I2C_REGS_CNT);
2771bafec742SSukumar Swaminathan 
2772bafec742SSukumar Swaminathan 	/* 13:MEMC Registers */
2773bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->memc_regs_seg_hdr,
2774bafec742SSukumar Swaminathan 	    MEMC_SEG_NUM,
2775bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2776bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->memc_regs),
2777bafec742SSukumar Swaminathan 	    (uint8_t *)"MEMC Registers");
27780662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->memc_regs[0],
2779bafec742SSukumar Swaminathan 	    MEMC_REGS_ADDR, MEMC_REGS_CNT);
2780bafec742SSukumar Swaminathan 
2781bafec742SSukumar Swaminathan 	/* 14:PBus Registers */
2782bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->pbus_regs_seg_hdr,
2783bafec742SSukumar Swaminathan 	    PBUS_SEG_NUM,
2784bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2785bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->pbus_regs),
2786bafec742SSukumar Swaminathan 	    (uint8_t *)"PBUS Registers");
27870662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->pbus_regs[0],
2788bafec742SSukumar Swaminathan 	    PBUS_REGS_ADDR, PBUS_REGS_CNT);
2789bafec742SSukumar Swaminathan 
2790bafec742SSukumar Swaminathan 	/* 15:MDE Registers */
2791bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->mde_regs_seg_hdr,
2792bafec742SSukumar Swaminathan 	    MDE_SEG_NUM,
2793bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2794bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->mde_regs),
2795bafec742SSukumar Swaminathan 	    (uint8_t *)"MDE Registers");
27960662fbf4SSukumar Swaminathan 	(void) ql_get_mpi_regs(qlge, &mpi_coredump->mde_regs[0],
2797bafec742SSukumar Swaminathan 	    MDE_REGS_ADDR, MDE_REGS_CNT);
2798bafec742SSukumar Swaminathan 
2799bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xaui_an_hdr,
2800bafec742SSukumar Swaminathan 	    XAUI_AN_SEG_NUM,
2801bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2802bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xaui_an),
2803bafec742SSukumar Swaminathan 	    (uint8_t *)"XAUI AN Registers");
2804bafec742SSukumar Swaminathan 
2805bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xaui_hss_pcs_hdr,
2806bafec742SSukumar Swaminathan 	    XAUI_HSS_PCS_SEG_NUM,
2807bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2808bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xaui_hss_pcs),
2809bafec742SSukumar Swaminathan 	    (uint8_t *)"XAUI HSS PCS Registers");
2810bafec742SSukumar Swaminathan 
2811bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xfi_an_hdr,
2812bafec742SSukumar Swaminathan 	    XFI_AN_SEG_NUM,
2813bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2814bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xfi_an),
2815bafec742SSukumar Swaminathan 	    (uint8_t *)"XFI AN Registers");
2816bafec742SSukumar Swaminathan 
2817bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xfi_train_hdr,
2818bafec742SSukumar Swaminathan 	    XFI_TRAIN_SEG_NUM,
2819bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2820bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xfi_train),
2821bafec742SSukumar Swaminathan 	    (uint8_t *)"XFI TRAIN Registers");
2822bafec742SSukumar Swaminathan 
2823bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_pcs_hdr,
2824bafec742SSukumar Swaminathan 	    XFI_HSS_PCS_SEG_NUM,
2825bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2826bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xfi_hss_pcs),
2827bafec742SSukumar Swaminathan 	    (uint8_t *)"XFI HSS PCS Registers");
2828bafec742SSukumar Swaminathan 
2829bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_tx_hdr,
2830bafec742SSukumar Swaminathan 	    XFI_HSS_TX_SEG_NUM,
2831bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2832bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xfi_hss_tx),
2833bafec742SSukumar Swaminathan 	    (uint8_t *)"XFI HSS TX Registers");
2834bafec742SSukumar Swaminathan 
2835bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_rx_hdr,
2836bafec742SSukumar Swaminathan 	    XFI_HSS_RX_SEG_NUM,
2837bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2838bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xfi_hss_rx),
2839bafec742SSukumar Swaminathan 	    (uint8_t *)"XFI HSS RX Registers");
2840bafec742SSukumar Swaminathan 
2841bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_pll_hdr,
2842bafec742SSukumar Swaminathan 	    XFI_HSS_PLL_SEG_NUM,
2843bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2844bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->serdes_xfi_hss_pll),
2845bafec742SSukumar Swaminathan 	    (uint8_t *)"XFI HSS PLL Registers");
2846bafec742SSukumar Swaminathan 
28470662fbf4SSukumar Swaminathan 	(void) ql_get_serdes_regs(qlge, mpi_coredump);
2848bafec742SSukumar Swaminathan 
2849bafec742SSukumar Swaminathan 	/* 16:NIC Ctrl Registers Port1 */
2850bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->nic_regs_seg_hdr,
2851bafec742SSukumar Swaminathan 	    NIC1_CONTROL_SEG_NUM,
2852bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2853bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->nic_regs),
2854bafec742SSukumar Swaminathan 	    (uint8_t *)"NIC Registers");
2855bafec742SSukumar Swaminathan 	i = 0;
2856bafec742SSukumar Swaminathan 	for (addr = 0; addr <= 0xFC; i++) {
2857bafec742SSukumar Swaminathan 		mpi_coredump->nic_regs[i] = ql_read_reg(qlge, addr);
2858bafec742SSukumar Swaminathan 		addr += 4;
2859bafec742SSukumar Swaminathan 	}
2860bafec742SSukumar Swaminathan 
2861bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->intr_states_seg_hdr,
2862bafec742SSukumar Swaminathan 	    INTR_STATES_SEG_NUM,
2863bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2864bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->intr_states),
2865bafec742SSukumar Swaminathan 	    (uint8_t *)"INTR States");
2866bafec742SSukumar Swaminathan 	ql_get_intr_states(qlge, &mpi_coredump->intr_states[0]);
2867bafec742SSukumar Swaminathan 
2868bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->xgmac_seg_hdr,
2869bafec742SSukumar Swaminathan 	    NIC1_XGMAC_SEG_NUM,
2870bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2871bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->xgmac),
2872bafec742SSukumar Swaminathan 	    (uint8_t *)"NIC XGMac Registers");
28730662fbf4SSukumar Swaminathan 	(void) ql_get_xgmac_regs(qlge, &mpi_coredump->xgmac[0]);
2874bafec742SSukumar Swaminathan 
2875bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->probe_dump_seg_hdr,
2876bafec742SSukumar Swaminathan 	    PROBE_DUMP_SEG_NUM,
2877bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2878bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->probe_dump),
2879bafec742SSukumar Swaminathan 	    (uint8_t *)"Probe Dump");
28800662fbf4SSukumar Swaminathan 	(void) ql_get_probe_dump(qlge, &mpi_coredump->probe_dump[0]);
2881bafec742SSukumar Swaminathan 
2882bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->routing_reg_seg_hdr,
2883bafec742SSukumar Swaminathan 	    ROUTING_INDEX_SEG_NUM,
2884bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2885bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->routing_regs),
2886bafec742SSukumar Swaminathan 	    (uint8_t *)"Routing Regs");
2887bafec742SSukumar Swaminathan 
2888bafec742SSukumar Swaminathan 	ql_get_routing_index_registers(qlge, &mpi_coredump->routing_regs[0]);
2889bafec742SSukumar Swaminathan 
2890bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->mac_prot_reg_seg_hdr,
2891bafec742SSukumar Swaminathan 	    MAC_PROTOCOL_SEG_NUM,
2892bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2893bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->mac_prot_regs),
2894bafec742SSukumar Swaminathan 	    (uint8_t *)"MAC Prot Regs");
2895bafec742SSukumar Swaminathan 
2896bafec742SSukumar Swaminathan 	ql_get_mac_protocol_registers(qlge, &mpi_coredump->mac_prot_regs[0]);
2897bafec742SSukumar Swaminathan 
2898bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->ets_seg_hdr,
2899bafec742SSukumar Swaminathan 	    ETS_SEG_NUM,
2900bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2901bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->ets),
2902bafec742SSukumar Swaminathan 	    (uint8_t *)"ETS Registers");
2903bafec742SSukumar Swaminathan 
29040662fbf4SSukumar Swaminathan 	(void) ql_get_ets_regs(qlge, &mpi_coredump->ets[0]);
2905bafec742SSukumar Swaminathan 
2906bafec742SSukumar Swaminathan 	/* clear the pause */
2907bafec742SSukumar Swaminathan 	if (ql_unpause_mpi_risc(qlge) != DDI_SUCCESS) {
2908bafec742SSukumar Swaminathan 		cmn_err(CE_WARN,
2909bafec742SSukumar Swaminathan 		    "Failed RISC unpause.");
2910bafec742SSukumar Swaminathan 		goto out;
2911bafec742SSukumar Swaminathan 	}
2912bafec742SSukumar Swaminathan 
2913bafec742SSukumar Swaminathan 	/* Reset the MPI Processor */
2914bafec742SSukumar Swaminathan 	if (ql_reset_mpi_risc(qlge) != DDI_SUCCESS) {
2915bafec742SSukumar Swaminathan 		goto out;
2916bafec742SSukumar Swaminathan 	}
2917bafec742SSukumar Swaminathan 
2918bafec742SSukumar Swaminathan 	/* 22:WCS MPI Ram ?? */
2919bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->code_ram_seg_hdr,
2920bafec742SSukumar Swaminathan 	    WCS_RAM_SEG_NUM,
2921bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2922bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->code_ram),
2923bafec742SSukumar Swaminathan 	    (uint8_t *)"WCS RAM");
2924bafec742SSukumar Swaminathan 	phy_addr = qlge->ioctl_buf_dma_attr.dma_addr;
2925bafec742SSukumar Swaminathan 	if (ql_read_risc_ram(qlge, CODE_RAM_ADDR, phy_addr, CODE_RAM_CNT)
2926bafec742SSukumar Swaminathan 	    == DDI_SUCCESS) {
2927bafec742SSukumar Swaminathan 		(void) ddi_dma_sync(qlge->ioctl_buf_dma_attr.dma_handle, 0,
2928bafec742SSukumar Swaminathan 		    sizeof (mpi_coredump->code_ram), DDI_DMA_SYNC_FORKERNEL);
2929bafec742SSukumar Swaminathan 		bcopy(qlge->ioctl_buf_dma_attr.vaddr,
2930bafec742SSukumar Swaminathan 		    mpi_coredump->code_ram,
2931bafec742SSukumar Swaminathan 		    sizeof (mpi_coredump->code_ram));
2932bafec742SSukumar Swaminathan 	} else {
2933bafec742SSukumar Swaminathan 		mutex_exit(&qlge->mbx_mutex);
2934bafec742SSukumar Swaminathan 		goto out;
2935bafec742SSukumar Swaminathan 	}
2936bafec742SSukumar Swaminathan 
2937bafec742SSukumar Swaminathan 	/* 23:MEMC Ram ?? */
2938bafec742SSukumar Swaminathan 	ql_build_coredump_seg_header(&mpi_coredump->memc_ram_seg_hdr,
2939bafec742SSukumar Swaminathan 	    MEMC_RAM_SEG_NUM,
2940bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump_segment_header_t) +
2941bafec742SSukumar Swaminathan 	    sizeof (mpi_coredump->memc_ram),
2942bafec742SSukumar Swaminathan 	    (uint8_t *)"MEMC RAM");
2943bafec742SSukumar Swaminathan 	phy_addr = qlge->ioctl_buf_dma_attr.dma_addr;
2944bafec742SSukumar Swaminathan 	if (ql_read_risc_ram(qlge, MEMC_RAM_ADDR, phy_addr, MEMC_RAM_CNT)
2945bafec742SSukumar Swaminathan 	    == DDI_SUCCESS) {
2946bafec742SSukumar Swaminathan 		(void) ddi_dma_sync(qlge->ioctl_buf_dma_attr.dma_handle, 0,
2947bafec742SSukumar Swaminathan 		    sizeof (mpi_coredump->memc_ram), DDI_DMA_SYNC_FORKERNEL);
2948bafec742SSukumar Swaminathan 		bcopy(qlge->ioctl_buf_dma_attr.vaddr, mpi_coredump->memc_ram,
2949bafec742SSukumar Swaminathan 		    sizeof (mpi_coredump->memc_ram));
2950bafec742SSukumar Swaminathan 	} else {
2951bafec742SSukumar Swaminathan 		mutex_exit(&qlge->mbx_mutex);
2952bafec742SSukumar Swaminathan 		goto out;
2953bafec742SSukumar Swaminathan 	}
2954bafec742SSukumar Swaminathan 	/*
2955bafec742SSukumar Swaminathan 	 * 24. Restart MPI
2956bafec742SSukumar Swaminathan 	 */
2957bafec742SSukumar Swaminathan 	if (ql_write_processor_data(qlge, 0x1010, 1) != DDI_SUCCESS) {
2958bafec742SSukumar Swaminathan 		cmn_err(CE_WARN, "MPI restart failure.");
2959bafec742SSukumar Swaminathan 	}
2960bafec742SSukumar Swaminathan 
2961bafec742SSukumar Swaminathan 	rtn_val = DDI_SUCCESS;
2962bafec742SSukumar Swaminathan out:
2963bafec742SSukumar Swaminathan 	ql_sem_unlock(qlge, QL_PROCESSOR_SEM_MASK);
2964bafec742SSukumar Swaminathan 	return (rtn_val);
2965bafec742SSukumar Swaminathan }
2966