xref: /openbmc/linux/drivers/scsi/qla2xxx/qla_mbx.c (revision 545e4006)
1 /*
2  * QLogic Fibre Channel HBA Driver
3  * Copyright (c)  2003-2008 QLogic Corporation
4  *
5  * See LICENSE.qla2xxx for copyright and licensing details.
6  */
7 #include "qla_def.h"
8 
9 #include <linux/delay.h>
10 
11 
12 /*
13  * qla2x00_mailbox_command
14  *	Issue mailbox command and waits for completion.
15  *
16  * Input:
17  *	ha = adapter block pointer.
18  *	mcp = driver internal mbx struct pointer.
19  *
20  * Output:
21  *	mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data.
22  *
23  * Returns:
24  *	0 : QLA_SUCCESS = cmd performed success
25  *	1 : QLA_FUNCTION_FAILED   (error encountered)
26  *	6 : QLA_FUNCTION_TIMEOUT (timeout condition encountered)
27  *
28  * Context:
29  *	Kernel context.
30  */
31 static int
32 qla2x00_mailbox_command(scsi_qla_host_t *pvha, mbx_cmd_t *mcp)
33 {
34 	int		rval;
35 	unsigned long    flags = 0;
36 	device_reg_t __iomem *reg;
37 	uint8_t		abort_active;
38 	uint8_t		io_lock_on;
39 	uint16_t	command;
40 	uint16_t	*iptr;
41 	uint16_t __iomem *optr;
42 	uint32_t	cnt;
43 	uint32_t	mboxes;
44 	unsigned long	wait_time;
45 	scsi_qla_host_t *ha = to_qla_parent(pvha);
46 
47 	reg = ha->iobase;
48 	io_lock_on = ha->flags.init_done;
49 
50 	rval = QLA_SUCCESS;
51 	abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
52 
53 	DEBUG11(printk("%s(%ld): entered.\n", __func__, pvha->host_no));
54 
55 	/*
56 	 * Wait for active mailbox commands to finish by waiting at most tov
57 	 * seconds. This is to serialize actual issuing of mailbox cmds during
58 	 * non ISP abort time.
59 	 */
60 	if (!abort_active) {
61 		if (!wait_for_completion_timeout(&ha->mbx_cmd_comp,
62 		    mcp->tov * HZ)) {
63 			/* Timeout occurred. Return error. */
64 			DEBUG2_3_11(printk("%s(%ld): cmd access timeout. "
65 			    "Exiting.\n", __func__, ha->host_no));
66 			return QLA_FUNCTION_TIMEOUT;
67 		}
68 	}
69 
70 	ha->flags.mbox_busy = 1;
71 	/* Save mailbox command for debug */
72 	ha->mcp = mcp;
73 
74 	DEBUG11(printk("scsi(%ld): prepare to issue mbox cmd=0x%x.\n",
75 	    ha->host_no, mcp->mb[0]));
76 
77 	spin_lock_irqsave(&ha->hardware_lock, flags);
78 
79 	/* Load mailbox registers. */
80 	if (IS_FWI2_CAPABLE(ha))
81 		optr = (uint16_t __iomem *)&reg->isp24.mailbox0;
82 	else
83 		optr = (uint16_t __iomem *)MAILBOX_REG(ha, &reg->isp, 0);
84 
85 	iptr = mcp->mb;
86 	command = mcp->mb[0];
87 	mboxes = mcp->out_mb;
88 
89 	for (cnt = 0; cnt < ha->mbx_count; cnt++) {
90 		if (IS_QLA2200(ha) && cnt == 8)
91 			optr =
92 			    (uint16_t __iomem *)MAILBOX_REG(ha, &reg->isp, 8);
93 		if (mboxes & BIT_0)
94 			WRT_REG_WORD(optr, *iptr);
95 
96 		mboxes >>= 1;
97 		optr++;
98 		iptr++;
99 	}
100 
101 #if defined(QL_DEBUG_LEVEL_1)
102 	printk("%s(%ld): Loaded MBX registers (displayed in bytes) = \n",
103 	    __func__, ha->host_no);
104 	qla2x00_dump_buffer((uint8_t *)mcp->mb, 16);
105 	printk("\n");
106 	qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16);
107 	printk("\n");
108 	qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8);
109 	printk("\n");
110 	printk("%s(%ld): I/O address = %p.\n", __func__, ha->host_no, optr);
111 	qla2x00_dump_regs(ha);
112 #endif
113 
114 	/* Issue set host interrupt command to send cmd out. */
115 	ha->flags.mbox_int = 0;
116 	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
117 
118 	/* Unlock mbx registers and wait for interrupt */
119 	DEBUG11(printk("%s(%ld): going to unlock irq & waiting for interrupt. "
120 	    "jiffies=%lx.\n", __func__, ha->host_no, jiffies));
121 
122 	/* Wait for mbx cmd completion until timeout */
123 
124 	if (!abort_active && io_lock_on) {
125 
126 		set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
127 
128 		if (IS_FWI2_CAPABLE(ha))
129 			WRT_REG_DWORD(&reg->isp24.hccr, HCCRX_SET_HOST_INT);
130 		else
131 			WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
132 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
133 
134 		wait_for_completion_timeout(&ha->mbx_intr_comp, mcp->tov * HZ);
135 
136 		clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
137 
138 	} else {
139 		DEBUG3_11(printk("%s(%ld): cmd=%x POLLING MODE.\n", __func__,
140 		    ha->host_no, command));
141 
142 		if (IS_FWI2_CAPABLE(ha))
143 			WRT_REG_DWORD(&reg->isp24.hccr, HCCRX_SET_HOST_INT);
144 		else
145 			WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
146 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
147 
148 		wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */
149 		while (!ha->flags.mbox_int) {
150 			if (time_after(jiffies, wait_time))
151 				break;
152 
153 			/* Check for pending interrupts. */
154 			qla2x00_poll(ha);
155 
156 			if (command != MBC_LOAD_RISC_RAM_EXTENDED &&
157 			    !ha->flags.mbox_int)
158 				msleep(10);
159 		} /* while */
160 	}
161 
162 	/* Check whether we timed out */
163 	if (ha->flags.mbox_int) {
164 		uint16_t *iptr2;
165 
166 		DEBUG3_11(printk("%s(%ld): cmd %x completed.\n", __func__,
167 		    ha->host_no, command));
168 
169 		/* Got interrupt. Clear the flag. */
170 		ha->flags.mbox_int = 0;
171 		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
172 
173 		if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE)
174 			rval = QLA_FUNCTION_FAILED;
175 
176 		/* Load return mailbox registers. */
177 		iptr2 = mcp->mb;
178 		iptr = (uint16_t *)&ha->mailbox_out[0];
179 		mboxes = mcp->in_mb;
180 		for (cnt = 0; cnt < ha->mbx_count; cnt++) {
181 			if (mboxes & BIT_0)
182 				*iptr2 = *iptr;
183 
184 			mboxes >>= 1;
185 			iptr2++;
186 			iptr++;
187 		}
188 	} else {
189 
190 #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \
191 		defined(QL_DEBUG_LEVEL_11)
192 		uint16_t mb0;
193 		uint32_t ictrl;
194 
195 		if (IS_FWI2_CAPABLE(ha)) {
196 			mb0 = RD_REG_WORD(&reg->isp24.mailbox0);
197 			ictrl = RD_REG_DWORD(&reg->isp24.ictrl);
198 		} else {
199 			mb0 = RD_MAILBOX_REG(ha, &reg->isp, 0);
200 			ictrl = RD_REG_WORD(&reg->isp.ictrl);
201 		}
202 		printk("%s(%ld): **** MB Command Timeout for cmd %x ****\n",
203 		    __func__, ha->host_no, command);
204 		printk("%s(%ld): icontrol=%x jiffies=%lx\n", __func__,
205 		    ha->host_no, ictrl, jiffies);
206 		printk("%s(%ld): *** mailbox[0] = 0x%x ***\n", __func__,
207 		    ha->host_no, mb0);
208 		qla2x00_dump_regs(ha);
209 #endif
210 
211 		rval = QLA_FUNCTION_TIMEOUT;
212 	}
213 
214 	ha->flags.mbox_busy = 0;
215 
216 	/* Clean up */
217 	ha->mcp = NULL;
218 
219 	if (abort_active || !io_lock_on) {
220 		DEBUG11(printk("%s(%ld): checking for additional resp "
221 		    "interrupt.\n", __func__, ha->host_no));
222 
223 		/* polling mode for non isp_abort commands. */
224 		qla2x00_poll(ha);
225 	}
226 
227 	if (rval == QLA_FUNCTION_TIMEOUT &&
228 	    mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) {
229 		if (!io_lock_on || (mcp->flags & IOCTL_CMD)) {
230 			/* not in dpc. schedule it for dpc to take over. */
231 			DEBUG(printk("%s(%ld): timeout schedule "
232 			    "isp_abort_needed.\n", __func__, ha->host_no));
233 			DEBUG2_3_11(printk("%s(%ld): timeout schedule "
234 			    "isp_abort_needed.\n", __func__, ha->host_no));
235 			qla_printk(KERN_WARNING, ha,
236 			    "Mailbox command timeout occured. Scheduling ISP "
237 			    "abort.\n");
238 			set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
239 			qla2xxx_wake_dpc(ha);
240 		} else if (!abort_active) {
241 			/* call abort directly since we are in the DPC thread */
242 			DEBUG(printk("%s(%ld): timeout calling abort_isp\n",
243 			    __func__, ha->host_no));
244 			DEBUG2_3_11(printk("%s(%ld): timeout calling "
245 			    "abort_isp\n", __func__, ha->host_no));
246 			qla_printk(KERN_WARNING, ha,
247 			    "Mailbox command timeout occured. Issuing ISP "
248 			    "abort.\n");
249 
250 			set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
251 			clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
252 			if (qla2x00_abort_isp(ha)) {
253 				/* Failed. retry later. */
254 				set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
255 			}
256 			clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
257 			DEBUG(printk("%s(%ld): finished abort_isp\n", __func__,
258 			    ha->host_no));
259 			DEBUG2_3_11(printk("%s(%ld): finished abort_isp\n",
260 			    __func__, ha->host_no));
261 		}
262 	}
263 
264 	/* Allow next mbx cmd to come in. */
265 	if (!abort_active)
266 		complete(&ha->mbx_cmd_comp);
267 
268 	if (rval) {
269 		DEBUG2_3_11(printk("%s(%ld): **** FAILED. mbx0=%x, mbx1=%x, "
270 		    "mbx2=%x, cmd=%x ****\n", __func__, ha->host_no,
271 		    mcp->mb[0], mcp->mb[1], mcp->mb[2], command));
272 	} else {
273 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
274 	}
275 
276 	return rval;
277 }
278 
279 int
280 qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint32_t risc_addr,
281     uint32_t risc_code_size)
282 {
283 	int rval;
284 	mbx_cmd_t mc;
285 	mbx_cmd_t *mcp = &mc;
286 
287 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
288 
289 	if (MSW(risc_addr) || IS_FWI2_CAPABLE(ha)) {
290 		mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
291 		mcp->mb[8] = MSW(risc_addr);
292 		mcp->out_mb = MBX_8|MBX_0;
293 	} else {
294 		mcp->mb[0] = MBC_LOAD_RISC_RAM;
295 		mcp->out_mb = MBX_0;
296 	}
297 	mcp->mb[1] = LSW(risc_addr);
298 	mcp->mb[2] = MSW(req_dma);
299 	mcp->mb[3] = LSW(req_dma);
300 	mcp->mb[6] = MSW(MSD(req_dma));
301 	mcp->mb[7] = LSW(MSD(req_dma));
302 	mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1;
303 	if (IS_FWI2_CAPABLE(ha)) {
304 		mcp->mb[4] = MSW(risc_code_size);
305 		mcp->mb[5] = LSW(risc_code_size);
306 		mcp->out_mb |= MBX_5|MBX_4;
307 	} else {
308 		mcp->mb[4] = LSW(risc_code_size);
309 		mcp->out_mb |= MBX_4;
310 	}
311 
312 	mcp->in_mb = MBX_0;
313 	mcp->tov = MBX_TOV_SECONDS;
314 	mcp->flags = 0;
315 	rval = qla2x00_mailbox_command(ha, mcp);
316 
317 	if (rval != QLA_SUCCESS) {
318 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__,
319 		    ha->host_no, rval, mcp->mb[0]));
320 	} else {
321 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
322 	}
323 
324 	return rval;
325 }
326 
327 /*
328  * qla2x00_execute_fw
329  *     Start adapter firmware.
330  *
331  * Input:
332  *     ha = adapter block pointer.
333  *     TARGET_QUEUE_LOCK must be released.
334  *     ADAPTER_STATE_LOCK must be released.
335  *
336  * Returns:
337  *     qla2x00 local function return status code.
338  *
339  * Context:
340  *     Kernel context.
341  */
342 int
343 qla2x00_execute_fw(scsi_qla_host_t *ha, uint32_t risc_addr)
344 {
345 	int rval;
346 	mbx_cmd_t mc;
347 	mbx_cmd_t *mcp = &mc;
348 
349 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
350 
351 	mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
352 	mcp->out_mb = MBX_0;
353 	mcp->in_mb = MBX_0;
354 	if (IS_FWI2_CAPABLE(ha)) {
355 		mcp->mb[1] = MSW(risc_addr);
356 		mcp->mb[2] = LSW(risc_addr);
357 		mcp->mb[3] = 0;
358 		mcp->mb[4] = 0;
359 		mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1;
360 		mcp->in_mb |= MBX_1;
361 	} else {
362 		mcp->mb[1] = LSW(risc_addr);
363 		mcp->out_mb |= MBX_1;
364 		if (IS_QLA2322(ha) || IS_QLA6322(ha)) {
365 			mcp->mb[2] = 0;
366 			mcp->out_mb |= MBX_2;
367 		}
368 	}
369 
370 	mcp->tov = MBX_TOV_SECONDS;
371 	mcp->flags = 0;
372 	rval = qla2x00_mailbox_command(ha, mcp);
373 
374 	if (rval != QLA_SUCCESS) {
375 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__,
376 		    ha->host_no, rval, mcp->mb[0]));
377 	} else {
378 		if (IS_FWI2_CAPABLE(ha)) {
379 			DEBUG11(printk("%s(%ld): done exchanges=%x.\n",
380 			    __func__, ha->host_no, mcp->mb[1]));
381 		} else {
382 			DEBUG11(printk("%s(%ld): done.\n", __func__,
383 			    ha->host_no));
384 		}
385 	}
386 
387 	return rval;
388 }
389 
390 /*
391  * qla2x00_get_fw_version
392  *	Get firmware version.
393  *
394  * Input:
395  *	ha:		adapter state pointer.
396  *	major:		pointer for major number.
397  *	minor:		pointer for minor number.
398  *	subminor:	pointer for subminor number.
399  *
400  * Returns:
401  *	qla2x00 local function return status code.
402  *
403  * Context:
404  *	Kernel context.
405  */
406 void
407 qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, uint16_t *minor,
408     uint16_t *subminor, uint16_t *attributes, uint32_t *memory)
409 {
410 	int		rval;
411 	mbx_cmd_t	mc;
412 	mbx_cmd_t	*mcp = &mc;
413 
414 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
415 
416 	mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
417 	mcp->out_mb = MBX_0;
418 	mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
419 	mcp->flags = 0;
420 	mcp->tov = MBX_TOV_SECONDS;
421 	rval = qla2x00_mailbox_command(ha, mcp);
422 
423 	/* Return mailbox data. */
424 	*major = mcp->mb[1];
425 	*minor = mcp->mb[2];
426 	*subminor = mcp->mb[3];
427 	*attributes = mcp->mb[6];
428 	if (IS_QLA2100(ha) || IS_QLA2200(ha))
429 		*memory = 0x1FFFF;			/* Defaults to 128KB. */
430 	else
431 		*memory = (mcp->mb[5] << 16) | mcp->mb[4];
432 
433 	if (rval != QLA_SUCCESS) {
434 		/*EMPTY*/
435 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
436 		    ha->host_no, rval));
437 	} else {
438 		/*EMPTY*/
439 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
440 	}
441 }
442 
443 /*
444  * qla2x00_get_fw_options
445  *	Set firmware options.
446  *
447  * Input:
448  *	ha = adapter block pointer.
449  *	fwopt = pointer for firmware options.
450  *
451  * Returns:
452  *	qla2x00 local function return status code.
453  *
454  * Context:
455  *	Kernel context.
456  */
457 int
458 qla2x00_get_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts)
459 {
460 	int rval;
461 	mbx_cmd_t mc;
462 	mbx_cmd_t *mcp = &mc;
463 
464 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
465 
466 	mcp->mb[0] = MBC_GET_FIRMWARE_OPTION;
467 	mcp->out_mb = MBX_0;
468 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
469 	mcp->tov = MBX_TOV_SECONDS;
470 	mcp->flags = 0;
471 	rval = qla2x00_mailbox_command(ha, mcp);
472 
473 	if (rval != QLA_SUCCESS) {
474 		/*EMPTY*/
475 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
476 		    ha->host_no, rval));
477 	} else {
478 		fwopts[0] = mcp->mb[0];
479 		fwopts[1] = mcp->mb[1];
480 		fwopts[2] = mcp->mb[2];
481 		fwopts[3] = mcp->mb[3];
482 
483 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
484 	}
485 
486 	return rval;
487 }
488 
489 
490 /*
491  * qla2x00_set_fw_options
492  *	Set firmware options.
493  *
494  * Input:
495  *	ha = adapter block pointer.
496  *	fwopt = pointer for firmware options.
497  *
498  * Returns:
499  *	qla2x00 local function return status code.
500  *
501  * Context:
502  *	Kernel context.
503  */
504 int
505 qla2x00_set_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts)
506 {
507 	int rval;
508 	mbx_cmd_t mc;
509 	mbx_cmd_t *mcp = &mc;
510 
511 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
512 
513 	mcp->mb[0] = MBC_SET_FIRMWARE_OPTION;
514 	mcp->mb[1] = fwopts[1];
515 	mcp->mb[2] = fwopts[2];
516 	mcp->mb[3] = fwopts[3];
517 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
518 	mcp->in_mb = MBX_0;
519 	if (IS_FWI2_CAPABLE(ha)) {
520 		mcp->in_mb |= MBX_1;
521 	} else {
522 		mcp->mb[10] = fwopts[10];
523 		mcp->mb[11] = fwopts[11];
524 		mcp->mb[12] = 0;	/* Undocumented, but used */
525 		mcp->out_mb |= MBX_12|MBX_11|MBX_10;
526 	}
527 	mcp->tov = MBX_TOV_SECONDS;
528 	mcp->flags = 0;
529 	rval = qla2x00_mailbox_command(ha, mcp);
530 
531 	fwopts[0] = mcp->mb[0];
532 
533 	if (rval != QLA_SUCCESS) {
534 		/*EMPTY*/
535 		DEBUG2_3_11(printk("%s(%ld): failed=%x (%x/%x).\n", __func__,
536 		    ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
537 	} else {
538 		/*EMPTY*/
539 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
540 	}
541 
542 	return rval;
543 }
544 
545 /*
546  * qla2x00_mbx_reg_test
547  *	Mailbox register wrap test.
548  *
549  * Input:
550  *	ha = adapter block pointer.
551  *	TARGET_QUEUE_LOCK must be released.
552  *	ADAPTER_STATE_LOCK must be released.
553  *
554  * Returns:
555  *	qla2x00 local function return status code.
556  *
557  * Context:
558  *	Kernel context.
559  */
560 int
561 qla2x00_mbx_reg_test(scsi_qla_host_t *ha)
562 {
563 	int rval;
564 	mbx_cmd_t mc;
565 	mbx_cmd_t *mcp = &mc;
566 
567 	DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha->host_no));
568 
569 	mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
570 	mcp->mb[1] = 0xAAAA;
571 	mcp->mb[2] = 0x5555;
572 	mcp->mb[3] = 0xAA55;
573 	mcp->mb[4] = 0x55AA;
574 	mcp->mb[5] = 0xA5A5;
575 	mcp->mb[6] = 0x5A5A;
576 	mcp->mb[7] = 0x2525;
577 	mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
578 	mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
579 	mcp->tov = MBX_TOV_SECONDS;
580 	mcp->flags = 0;
581 	rval = qla2x00_mailbox_command(ha, mcp);
582 
583 	if (rval == QLA_SUCCESS) {
584 		if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
585 		    mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA)
586 			rval = QLA_FUNCTION_FAILED;
587 		if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
588 		    mcp->mb[7] != 0x2525)
589 			rval = QLA_FUNCTION_FAILED;
590 		if (rval == QLA_FUNCTION_FAILED) {
591 			struct device_reg_24xx __iomem *reg =
592 			    &ha->iobase->isp24;
593 
594 			qla2xxx_hw_event_log(ha, HW_EVENT_ISP_ERR, 0,
595 			    LSW(RD_REG_DWORD(&reg->hccr)),
596 			    LSW(RD_REG_DWORD(&reg->istatus)));
597 		}
598 	}
599 
600 	if (rval != QLA_SUCCESS) {
601 		/*EMPTY*/
602 		DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n",
603 		    ha->host_no, rval));
604 	} else {
605 		/*EMPTY*/
606 		DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n",
607 		    ha->host_no));
608 	}
609 
610 	return rval;
611 }
612 
613 /*
614  * qla2x00_verify_checksum
615  *	Verify firmware checksum.
616  *
617  * Input:
618  *	ha = adapter block pointer.
619  *	TARGET_QUEUE_LOCK must be released.
620  *	ADAPTER_STATE_LOCK must be released.
621  *
622  * Returns:
623  *	qla2x00 local function return status code.
624  *
625  * Context:
626  *	Kernel context.
627  */
628 int
629 qla2x00_verify_checksum(scsi_qla_host_t *ha, uint32_t risc_addr)
630 {
631 	int rval;
632 	mbx_cmd_t mc;
633 	mbx_cmd_t *mcp = &mc;
634 
635 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
636 
637 	mcp->mb[0] = MBC_VERIFY_CHECKSUM;
638 	mcp->out_mb = MBX_0;
639 	mcp->in_mb = MBX_0;
640 	if (IS_FWI2_CAPABLE(ha)) {
641 		mcp->mb[1] = MSW(risc_addr);
642 		mcp->mb[2] = LSW(risc_addr);
643 		mcp->out_mb |= MBX_2|MBX_1;
644 		mcp->in_mb |= MBX_2|MBX_1;
645 	} else {
646 		mcp->mb[1] = LSW(risc_addr);
647 		mcp->out_mb |= MBX_1;
648 		mcp->in_mb |= MBX_1;
649 	}
650 
651 	mcp->tov = MBX_TOV_SECONDS;
652 	mcp->flags = 0;
653 	rval = qla2x00_mailbox_command(ha, mcp);
654 
655 	if (rval != QLA_SUCCESS) {
656 		DEBUG2_3_11(printk("%s(%ld): failed=%x chk sum=%x.\n", __func__,
657 		    ha->host_no, rval, IS_FWI2_CAPABLE(ha) ?
658 		    (mcp->mb[2] << 16) | mcp->mb[1]: mcp->mb[1]));
659 	} else {
660 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
661 	}
662 
663 	return rval;
664 }
665 
666 /*
667  * qla2x00_issue_iocb
668  *	Issue IOCB using mailbox command
669  *
670  * Input:
671  *	ha = adapter state pointer.
672  *	buffer = buffer pointer.
673  *	phys_addr = physical address of buffer.
674  *	size = size of buffer.
675  *	TARGET_QUEUE_LOCK must be released.
676  *	ADAPTER_STATE_LOCK must be released.
677  *
678  * Returns:
679  *	qla2x00 local function return status code.
680  *
681  * Context:
682  *	Kernel context.
683  */
684 static int
685 qla2x00_issue_iocb_timeout(scsi_qla_host_t *ha, void *buffer,
686     dma_addr_t phys_addr, size_t size, uint32_t tov)
687 {
688 	int		rval;
689 	mbx_cmd_t	mc;
690 	mbx_cmd_t	*mcp = &mc;
691 
692 	mcp->mb[0] = MBC_IOCB_COMMAND_A64;
693 	mcp->mb[1] = 0;
694 	mcp->mb[2] = MSW(phys_addr);
695 	mcp->mb[3] = LSW(phys_addr);
696 	mcp->mb[6] = MSW(MSD(phys_addr));
697 	mcp->mb[7] = LSW(MSD(phys_addr));
698 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
699 	mcp->in_mb = MBX_2|MBX_0;
700 	mcp->tov = tov;
701 	mcp->flags = 0;
702 	rval = qla2x00_mailbox_command(ha, mcp);
703 
704 	if (rval != QLA_SUCCESS) {
705 		/*EMPTY*/
706 		DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n",
707 		    ha->host_no, rval));
708 		DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n",
709 		    ha->host_no, rval));
710 	} else {
711 		sts_entry_t *sts_entry = (sts_entry_t *) buffer;
712 
713 		/* Mask reserved bits. */
714 		sts_entry->entry_status &=
715 		    IS_FWI2_CAPABLE(ha) ? RF_MASK_24XX :RF_MASK;
716 	}
717 
718 	return rval;
719 }
720 
721 int
722 qla2x00_issue_iocb(scsi_qla_host_t *ha, void *buffer, dma_addr_t phys_addr,
723     size_t size)
724 {
725 	return qla2x00_issue_iocb_timeout(ha, buffer, phys_addr, size,
726 	    MBX_TOV_SECONDS);
727 }
728 
729 /*
730  * qla2x00_abort_command
731  *	Abort command aborts a specified IOCB.
732  *
733  * Input:
734  *	ha = adapter block pointer.
735  *	sp = SB structure pointer.
736  *
737  * Returns:
738  *	qla2x00 local function return status code.
739  *
740  * Context:
741  *	Kernel context.
742  */
743 int
744 qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp)
745 {
746 	unsigned long   flags = 0;
747 	fc_port_t	*fcport;
748 	int		rval;
749 	uint32_t	handle;
750 	mbx_cmd_t	mc;
751 	mbx_cmd_t	*mcp = &mc;
752 
753 	DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no));
754 
755 	fcport = sp->fcport;
756 
757 	spin_lock_irqsave(&ha->hardware_lock, flags);
758 	for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
759 		if (ha->outstanding_cmds[handle] == sp)
760 			break;
761 	}
762 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
763 
764 	if (handle == MAX_OUTSTANDING_COMMANDS) {
765 		/* command not found */
766 		return QLA_FUNCTION_FAILED;
767 	}
768 
769 	mcp->mb[0] = MBC_ABORT_COMMAND;
770 	if (HAS_EXTENDED_IDS(ha))
771 		mcp->mb[1] = fcport->loop_id;
772 	else
773 		mcp->mb[1] = fcport->loop_id << 8;
774 	mcp->mb[2] = (uint16_t)handle;
775 	mcp->mb[3] = (uint16_t)(handle >> 16);
776 	mcp->mb[6] = (uint16_t)sp->cmd->device->lun;
777 	mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
778 	mcp->in_mb = MBX_0;
779 	mcp->tov = MBX_TOV_SECONDS;
780 	mcp->flags = 0;
781 	rval = qla2x00_mailbox_command(ha, mcp);
782 
783 	if (rval != QLA_SUCCESS) {
784 		DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n",
785 		    ha->host_no, rval));
786 	} else {
787 		DEBUG11(printk("qla2x00_abort_command(%ld): done.\n",
788 		    ha->host_no));
789 	}
790 
791 	return rval;
792 }
793 
794 int
795 qla2x00_abort_target(struct fc_port *fcport, unsigned int l)
796 {
797 	int rval, rval2;
798 	mbx_cmd_t  mc;
799 	mbx_cmd_t  *mcp = &mc;
800 	scsi_qla_host_t *ha;
801 
802 	DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no));
803 
804 	l = l;
805 	ha = fcport->ha;
806 	mcp->mb[0] = MBC_ABORT_TARGET;
807 	mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0;
808 	if (HAS_EXTENDED_IDS(ha)) {
809 		mcp->mb[1] = fcport->loop_id;
810 		mcp->mb[10] = 0;
811 		mcp->out_mb |= MBX_10;
812 	} else {
813 		mcp->mb[1] = fcport->loop_id << 8;
814 	}
815 	mcp->mb[2] = ha->loop_reset_delay;
816 	mcp->mb[9] = ha->vp_idx;
817 
818 	mcp->in_mb = MBX_0;
819 	mcp->tov = MBX_TOV_SECONDS;
820 	mcp->flags = 0;
821 	rval = qla2x00_mailbox_command(ha, mcp);
822 	if (rval != QLA_SUCCESS) {
823 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
824 		    ha->host_no, rval));
825 	}
826 
827 	/* Issue marker IOCB. */
828 	rval2 = qla2x00_marker(ha, fcport->loop_id, 0, MK_SYNC_ID);
829 	if (rval2 != QLA_SUCCESS) {
830 		DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB "
831 		    "(%x).\n", __func__, ha->host_no, rval2));
832 	} else {
833 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
834 	}
835 
836 	return rval;
837 }
838 
839 int
840 qla2x00_lun_reset(struct fc_port *fcport, unsigned int l)
841 {
842 	int rval, rval2;
843 	mbx_cmd_t  mc;
844 	mbx_cmd_t  *mcp = &mc;
845 	scsi_qla_host_t *ha;
846 
847 	DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no));
848 
849 	ha = fcport->ha;
850 	mcp->mb[0] = MBC_LUN_RESET;
851 	mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
852 	if (HAS_EXTENDED_IDS(ha))
853 		mcp->mb[1] = fcport->loop_id;
854 	else
855 		mcp->mb[1] = fcport->loop_id << 8;
856 	mcp->mb[2] = l;
857 	mcp->mb[3] = 0;
858 	mcp->mb[9] = ha->vp_idx;
859 
860 	mcp->in_mb = MBX_0;
861 	mcp->tov = MBX_TOV_SECONDS;
862 	mcp->flags = 0;
863 	rval = qla2x00_mailbox_command(ha, mcp);
864 	if (rval != QLA_SUCCESS) {
865 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
866 		    ha->host_no, rval));
867 	}
868 
869 	/* Issue marker IOCB. */
870 	rval2 = qla2x00_marker(ha, fcport->loop_id, l, MK_SYNC_ID_LUN);
871 	if (rval2 != QLA_SUCCESS) {
872 		DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB "
873 		    "(%x).\n", __func__, ha->host_no, rval2));
874 	} else {
875 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
876 	}
877 
878 	return rval;
879 }
880 
881 /*
882  * qla2x00_get_adapter_id
883  *	Get adapter ID and topology.
884  *
885  * Input:
886  *	ha = adapter block pointer.
887  *	id = pointer for loop ID.
888  *	al_pa = pointer for AL_PA.
889  *	area = pointer for area.
890  *	domain = pointer for domain.
891  *	top = pointer for topology.
892  *	TARGET_QUEUE_LOCK must be released.
893  *	ADAPTER_STATE_LOCK must be released.
894  *
895  * Returns:
896  *	qla2x00 local function return status code.
897  *
898  * Context:
899  *	Kernel context.
900  */
901 int
902 qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
903     uint8_t *area, uint8_t *domain, uint16_t *top, uint16_t *sw_cap)
904 {
905 	int rval;
906 	mbx_cmd_t mc;
907 	mbx_cmd_t *mcp = &mc;
908 
909 	DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n",
910 	    ha->host_no));
911 
912 	mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID;
913 	mcp->mb[9] = ha->vp_idx;
914 	mcp->out_mb = MBX_9|MBX_0;
915 	mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
916 	mcp->tov = MBX_TOV_SECONDS;
917 	mcp->flags = 0;
918 	rval = qla2x00_mailbox_command(ha, mcp);
919 	if (mcp->mb[0] == MBS_COMMAND_ERROR)
920 		rval = QLA_COMMAND_ERROR;
921 
922 	/* Return data. */
923 	*id = mcp->mb[1];
924 	*al_pa = LSB(mcp->mb[2]);
925 	*area = MSB(mcp->mb[2]);
926 	*domain	= LSB(mcp->mb[3]);
927 	*top = mcp->mb[6];
928 	*sw_cap = mcp->mb[7];
929 
930 	if (rval != QLA_SUCCESS) {
931 		/*EMPTY*/
932 		DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n",
933 		    ha->host_no, rval));
934 	} else {
935 		/*EMPTY*/
936 		DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n",
937 		    ha->host_no));
938 	}
939 
940 	return rval;
941 }
942 
943 /*
944  * qla2x00_get_retry_cnt
945  *	Get current firmware login retry count and delay.
946  *
947  * Input:
948  *	ha = adapter block pointer.
949  *	retry_cnt = pointer to login retry count.
950  *	tov = pointer to login timeout value.
951  *
952  * Returns:
953  *	qla2x00 local function return status code.
954  *
955  * Context:
956  *	Kernel context.
957  */
958 int
959 qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov,
960     uint16_t *r_a_tov)
961 {
962 	int rval;
963 	uint16_t ratov;
964 	mbx_cmd_t mc;
965 	mbx_cmd_t *mcp = &mc;
966 
967 	DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n",
968 			ha->host_no));
969 
970 	mcp->mb[0] = MBC_GET_RETRY_COUNT;
971 	mcp->out_mb = MBX_0;
972 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
973 	mcp->tov = MBX_TOV_SECONDS;
974 	mcp->flags = 0;
975 	rval = qla2x00_mailbox_command(ha, mcp);
976 
977 	if (rval != QLA_SUCCESS) {
978 		/*EMPTY*/
979 		DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n",
980 		    ha->host_no, mcp->mb[0]));
981 	} else {
982 		/* Convert returned data and check our values. */
983 		*r_a_tov = mcp->mb[3] / 2;
984 		ratov = (mcp->mb[3]/2) / 10;  /* mb[3] value is in 100ms */
985 		if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) {
986 			/* Update to the larger values */
987 			*retry_cnt = (uint8_t)mcp->mb[1];
988 			*tov = ratov;
989 		}
990 
991 		DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d "
992 		    "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov));
993 	}
994 
995 	return rval;
996 }
997 
998 /*
999  * qla2x00_init_firmware
1000  *	Initialize adapter firmware.
1001  *
1002  * Input:
1003  *	ha = adapter block pointer.
1004  *	dptr = Initialization control block pointer.
1005  *	size = size of initialization control block.
1006  *	TARGET_QUEUE_LOCK must be released.
1007  *	ADAPTER_STATE_LOCK must be released.
1008  *
1009  * Returns:
1010  *	qla2x00 local function return status code.
1011  *
1012  * Context:
1013  *	Kernel context.
1014  */
1015 int
1016 qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size)
1017 {
1018 	int rval;
1019 	mbx_cmd_t mc;
1020 	mbx_cmd_t *mcp = &mc;
1021 
1022 	DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n",
1023 	    ha->host_no));
1024 
1025 	if (ha->flags.npiv_supported)
1026 		mcp->mb[0] = MBC_MID_INITIALIZE_FIRMWARE;
1027 	else
1028 		mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
1029 
1030 	mcp->mb[2] = MSW(ha->init_cb_dma);
1031 	mcp->mb[3] = LSW(ha->init_cb_dma);
1032 	mcp->mb[4] = 0;
1033 	mcp->mb[5] = 0;
1034 	mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
1035 	mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
1036 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
1037 	mcp->in_mb = MBX_5|MBX_4|MBX_0;
1038 	mcp->buf_size = size;
1039 	mcp->flags = MBX_DMA_OUT;
1040 	mcp->tov = MBX_TOV_SECONDS;
1041 	rval = qla2x00_mailbox_command(ha, mcp);
1042 
1043 	if (rval != QLA_SUCCESS) {
1044 		/*EMPTY*/
1045 		DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x "
1046 		    "mb0=%x.\n",
1047 		    ha->host_no, rval, mcp->mb[0]));
1048 	} else {
1049 		/*EMPTY*/
1050 		DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n",
1051 		    ha->host_no));
1052 	}
1053 
1054 	return rval;
1055 }
1056 
1057 /*
1058  * qla2x00_get_port_database
1059  *	Issue normal/enhanced get port database mailbox command
1060  *	and copy device name as necessary.
1061  *
1062  * Input:
1063  *	ha = adapter state pointer.
1064  *	dev = structure pointer.
1065  *	opt = enhanced cmd option byte.
1066  *
1067  * Returns:
1068  *	qla2x00 local function return status code.
1069  *
1070  * Context:
1071  *	Kernel context.
1072  */
1073 int
1074 qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt)
1075 {
1076 	int rval;
1077 	mbx_cmd_t mc;
1078 	mbx_cmd_t *mcp = &mc;
1079 	port_database_t *pd;
1080 	struct port_database_24xx *pd24;
1081 	dma_addr_t pd_dma;
1082 
1083 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
1084 
1085 	pd24 = NULL;
1086 	pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma);
1087 	if (pd  == NULL) {
1088 		DEBUG2_3(printk("%s(%ld): failed to allocate Port Database "
1089 		    "structure.\n", __func__, ha->host_no));
1090 		return QLA_MEMORY_ALLOC_FAILED;
1091 	}
1092 	memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE));
1093 
1094 	mcp->mb[0] = MBC_GET_PORT_DATABASE;
1095 	if (opt != 0 && !IS_FWI2_CAPABLE(ha))
1096 		mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE;
1097 	mcp->mb[2] = MSW(pd_dma);
1098 	mcp->mb[3] = LSW(pd_dma);
1099 	mcp->mb[6] = MSW(MSD(pd_dma));
1100 	mcp->mb[7] = LSW(MSD(pd_dma));
1101 	mcp->mb[9] = ha->vp_idx;
1102 	mcp->out_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
1103 	mcp->in_mb = MBX_0;
1104 	if (IS_FWI2_CAPABLE(ha)) {
1105 		mcp->mb[1] = fcport->loop_id;
1106 		mcp->mb[10] = opt;
1107 		mcp->out_mb |= MBX_10|MBX_1;
1108 		mcp->in_mb |= MBX_1;
1109 	} else if (HAS_EXTENDED_IDS(ha)) {
1110 		mcp->mb[1] = fcport->loop_id;
1111 		mcp->mb[10] = opt;
1112 		mcp->out_mb |= MBX_10|MBX_1;
1113 	} else {
1114 		mcp->mb[1] = fcport->loop_id << 8 | opt;
1115 		mcp->out_mb |= MBX_1;
1116 	}
1117 	mcp->buf_size = IS_FWI2_CAPABLE(ha) ?
1118 	    PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE;
1119 	mcp->flags = MBX_DMA_IN;
1120 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1121 	rval = qla2x00_mailbox_command(ha, mcp);
1122 	if (rval != QLA_SUCCESS)
1123 		goto gpd_error_out;
1124 
1125 	if (IS_FWI2_CAPABLE(ha)) {
1126 		pd24 = (struct port_database_24xx *) pd;
1127 
1128 		/* Check for logged in state. */
1129 		if (pd24->current_login_state != PDS_PRLI_COMPLETE &&
1130 		    pd24->last_login_state != PDS_PRLI_COMPLETE) {
1131 			DEBUG2(printk("%s(%ld): Unable to verify "
1132 			    "login-state (%x/%x) for loop_id %x\n",
1133 			    __func__, ha->host_no,
1134 			    pd24->current_login_state,
1135 			    pd24->last_login_state, fcport->loop_id));
1136 			rval = QLA_FUNCTION_FAILED;
1137 			goto gpd_error_out;
1138 		}
1139 
1140 		/* Names are little-endian. */
1141 		memcpy(fcport->node_name, pd24->node_name, WWN_SIZE);
1142 		memcpy(fcport->port_name, pd24->port_name, WWN_SIZE);
1143 
1144 		/* Get port_id of device. */
1145 		fcport->d_id.b.domain = pd24->port_id[0];
1146 		fcport->d_id.b.area = pd24->port_id[1];
1147 		fcport->d_id.b.al_pa = pd24->port_id[2];
1148 		fcport->d_id.b.rsvd_1 = 0;
1149 
1150 		/* If not target must be initiator or unknown type. */
1151 		if ((pd24->prli_svc_param_word_3[0] & BIT_4) == 0)
1152 			fcport->port_type = FCT_INITIATOR;
1153 		else
1154 			fcport->port_type = FCT_TARGET;
1155 	} else {
1156 		/* Check for logged in state. */
1157 		if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
1158 		    pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
1159 			rval = QLA_FUNCTION_FAILED;
1160 			goto gpd_error_out;
1161 		}
1162 
1163 		/* Names are little-endian. */
1164 		memcpy(fcport->node_name, pd->node_name, WWN_SIZE);
1165 		memcpy(fcport->port_name, pd->port_name, WWN_SIZE);
1166 
1167 		/* Get port_id of device. */
1168 		fcport->d_id.b.domain = pd->port_id[0];
1169 		fcport->d_id.b.area = pd->port_id[3];
1170 		fcport->d_id.b.al_pa = pd->port_id[2];
1171 		fcport->d_id.b.rsvd_1 = 0;
1172 
1173 		/* Check for device require authentication. */
1174 		pd->common_features & BIT_5 ? (fcport->flags |= FCF_AUTH_REQ) :
1175 		    (fcport->flags &= ~FCF_AUTH_REQ);
1176 
1177 		/* If not target must be initiator or unknown type. */
1178 		if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
1179 			fcport->port_type = FCT_INITIATOR;
1180 		else
1181 			fcport->port_type = FCT_TARGET;
1182 
1183 		/* Passback COS information. */
1184 		fcport->supported_classes = (pd->options & BIT_4) ?
1185 		    FC_COS_CLASS2: FC_COS_CLASS3;
1186 	}
1187 
1188 gpd_error_out:
1189 	dma_pool_free(ha->s_dma_pool, pd, pd_dma);
1190 
1191 	if (rval != QLA_SUCCESS) {
1192 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
1193 		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
1194 	} else {
1195 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
1196 	}
1197 
1198 	return rval;
1199 }
1200 
1201 /*
1202  * qla2x00_get_firmware_state
1203  *	Get adapter firmware state.
1204  *
1205  * Input:
1206  *	ha = adapter block pointer.
1207  *	dptr = pointer for firmware state.
1208  *	TARGET_QUEUE_LOCK must be released.
1209  *	ADAPTER_STATE_LOCK must be released.
1210  *
1211  * Returns:
1212  *	qla2x00 local function return status code.
1213  *
1214  * Context:
1215  *	Kernel context.
1216  */
1217 int
1218 qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *states)
1219 {
1220 	int rval;
1221 	mbx_cmd_t mc;
1222 	mbx_cmd_t *mcp = &mc;
1223 
1224 	DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n",
1225 	    ha->host_no));
1226 
1227 	mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
1228 	mcp->out_mb = MBX_0;
1229 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1230 	mcp->tov = MBX_TOV_SECONDS;
1231 	mcp->flags = 0;
1232 	rval = qla2x00_mailbox_command(ha, mcp);
1233 
1234 	/* Return firmware states. */
1235 	states[0] = mcp->mb[1];
1236 	states[1] = mcp->mb[2];
1237 	states[2] = mcp->mb[3];
1238 
1239 	if (rval != QLA_SUCCESS) {
1240 		/*EMPTY*/
1241 		DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): "
1242 		    "failed=%x.\n", ha->host_no, rval));
1243 	} else {
1244 		/*EMPTY*/
1245 		DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n",
1246 		    ha->host_no));
1247 	}
1248 
1249 	return rval;
1250 }
1251 
1252 /*
1253  * qla2x00_get_port_name
1254  *	Issue get port name mailbox command.
1255  *	Returned name is in big endian format.
1256  *
1257  * Input:
1258  *	ha = adapter block pointer.
1259  *	loop_id = loop ID of device.
1260  *	name = pointer for name.
1261  *	TARGET_QUEUE_LOCK must be released.
1262  *	ADAPTER_STATE_LOCK must be released.
1263  *
1264  * Returns:
1265  *	qla2x00 local function return status code.
1266  *
1267  * Context:
1268  *	Kernel context.
1269  */
1270 int
1271 qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name,
1272     uint8_t opt)
1273 {
1274 	int rval;
1275 	mbx_cmd_t mc;
1276 	mbx_cmd_t *mcp = &mc;
1277 
1278 	DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n",
1279 	    ha->host_no));
1280 
1281 	mcp->mb[0] = MBC_GET_PORT_NAME;
1282 	mcp->mb[9] = ha->vp_idx;
1283 	mcp->out_mb = MBX_9|MBX_1|MBX_0;
1284 	if (HAS_EXTENDED_IDS(ha)) {
1285 		mcp->mb[1] = loop_id;
1286 		mcp->mb[10] = opt;
1287 		mcp->out_mb |= MBX_10;
1288 	} else {
1289 		mcp->mb[1] = loop_id << 8 | opt;
1290 	}
1291 
1292 	mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1293 	mcp->tov = MBX_TOV_SECONDS;
1294 	mcp->flags = 0;
1295 	rval = qla2x00_mailbox_command(ha, mcp);
1296 
1297 	if (rval != QLA_SUCCESS) {
1298 		/*EMPTY*/
1299 		DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n",
1300 		    ha->host_no, rval));
1301 	} else {
1302 		if (name != NULL) {
1303 			/* This function returns name in big endian. */
1304 			name[0] = MSB(mcp->mb[2]);
1305 			name[1] = LSB(mcp->mb[2]);
1306 			name[2] = MSB(mcp->mb[3]);
1307 			name[3] = LSB(mcp->mb[3]);
1308 			name[4] = MSB(mcp->mb[6]);
1309 			name[5] = LSB(mcp->mb[6]);
1310 			name[6] = MSB(mcp->mb[7]);
1311 			name[7] = LSB(mcp->mb[7]);
1312 		}
1313 
1314 		DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n",
1315 		    ha->host_no));
1316 	}
1317 
1318 	return rval;
1319 }
1320 
1321 /*
1322  * qla2x00_lip_reset
1323  *	Issue LIP reset mailbox command.
1324  *
1325  * Input:
1326  *	ha = adapter block pointer.
1327  *	TARGET_QUEUE_LOCK must be released.
1328  *	ADAPTER_STATE_LOCK must be released.
1329  *
1330  * Returns:
1331  *	qla2x00 local function return status code.
1332  *
1333  * Context:
1334  *	Kernel context.
1335  */
1336 int
1337 qla2x00_lip_reset(scsi_qla_host_t *ha)
1338 {
1339 	int rval;
1340 	mbx_cmd_t mc;
1341 	mbx_cmd_t *mcp = &mc;
1342 
1343 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
1344 
1345 	if (IS_FWI2_CAPABLE(ha)) {
1346 		mcp->mb[0] = MBC_LIP_FULL_LOGIN;
1347 		mcp->mb[1] = BIT_6;
1348 		mcp->mb[2] = 0;
1349 		mcp->mb[3] = ha->loop_reset_delay;
1350 		mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1351 	} else {
1352 		mcp->mb[0] = MBC_LIP_RESET;
1353 		mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1354 		if (HAS_EXTENDED_IDS(ha)) {
1355 			mcp->mb[1] = 0x00ff;
1356 			mcp->mb[10] = 0;
1357 			mcp->out_mb |= MBX_10;
1358 		} else {
1359 			mcp->mb[1] = 0xff00;
1360 		}
1361 		mcp->mb[2] = ha->loop_reset_delay;
1362 		mcp->mb[3] = 0;
1363 	}
1364 	mcp->in_mb = MBX_0;
1365 	mcp->tov = MBX_TOV_SECONDS;
1366 	mcp->flags = 0;
1367 	rval = qla2x00_mailbox_command(ha, mcp);
1368 
1369 	if (rval != QLA_SUCCESS) {
1370 		/*EMPTY*/
1371 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n",
1372 		    __func__, ha->host_no, rval));
1373 	} else {
1374 		/*EMPTY*/
1375 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
1376 	}
1377 
1378 	return rval;
1379 }
1380 
1381 /*
1382  * qla2x00_send_sns
1383  *	Send SNS command.
1384  *
1385  * Input:
1386  *	ha = adapter block pointer.
1387  *	sns = pointer for command.
1388  *	cmd_size = command size.
1389  *	buf_size = response/command size.
1390  *	TARGET_QUEUE_LOCK must be released.
1391  *	ADAPTER_STATE_LOCK must be released.
1392  *
1393  * Returns:
1394  *	qla2x00 local function return status code.
1395  *
1396  * Context:
1397  *	Kernel context.
1398  */
1399 int
1400 qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address,
1401     uint16_t cmd_size, size_t buf_size)
1402 {
1403 	int rval;
1404 	mbx_cmd_t mc;
1405 	mbx_cmd_t *mcp = &mc;
1406 
1407 	DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n",
1408 	    ha->host_no));
1409 
1410 	DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total "
1411 	    "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov));
1412 
1413 	mcp->mb[0] = MBC_SEND_SNS_COMMAND;
1414 	mcp->mb[1] = cmd_size;
1415 	mcp->mb[2] = MSW(sns_phys_address);
1416 	mcp->mb[3] = LSW(sns_phys_address);
1417 	mcp->mb[6] = MSW(MSD(sns_phys_address));
1418 	mcp->mb[7] = LSW(MSD(sns_phys_address));
1419 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1420 	mcp->in_mb = MBX_0|MBX_1;
1421 	mcp->buf_size = buf_size;
1422 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN;
1423 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1424 	rval = qla2x00_mailbox_command(ha, mcp);
1425 
1426 	if (rval != QLA_SUCCESS) {
1427 		/*EMPTY*/
1428 		DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
1429 		    "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
1430 		DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
1431 		    "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
1432 	} else {
1433 		/*EMPTY*/
1434 		DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha->host_no));
1435 	}
1436 
1437 	return rval;
1438 }
1439 
1440 int
1441 qla24xx_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
1442     uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
1443 {
1444 	int		rval;
1445 
1446 	struct logio_entry_24xx *lg;
1447 	dma_addr_t	lg_dma;
1448 	uint32_t	iop[2];
1449 
1450 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
1451 
1452 	lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);
1453 	if (lg == NULL) {
1454 		DEBUG2_3(printk("%s(%ld): failed to allocate Login IOCB.\n",
1455 		    __func__, ha->host_no));
1456 		return QLA_MEMORY_ALLOC_FAILED;
1457 	}
1458 	memset(lg, 0, sizeof(struct logio_entry_24xx));
1459 
1460 	lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1461 	lg->entry_count = 1;
1462 	lg->nport_handle = cpu_to_le16(loop_id);
1463 	lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI);
1464 	if (opt & BIT_0)
1465 		lg->control_flags |= __constant_cpu_to_le16(LCF_COND_PLOGI);
1466 	if (opt & BIT_1)
1467 		lg->control_flags |= __constant_cpu_to_le16(LCF_SKIP_PRLI);
1468 	lg->port_id[0] = al_pa;
1469 	lg->port_id[1] = area;
1470 	lg->port_id[2] = domain;
1471 	lg->vp_index = ha->vp_idx;
1472 	rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0);
1473 	if (rval != QLA_SUCCESS) {
1474 		DEBUG2_3_11(printk("%s(%ld): failed to issue Login IOCB "
1475 		    "(%x).\n", __func__, ha->host_no, rval));
1476 	} else if (lg->entry_status != 0) {
1477 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
1478 		    "-- error status (%x).\n", __func__, ha->host_no,
1479 		    lg->entry_status));
1480 		rval = QLA_FUNCTION_FAILED;
1481 	} else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
1482 		iop[0] = le32_to_cpu(lg->io_parameter[0]);
1483 		iop[1] = le32_to_cpu(lg->io_parameter[1]);
1484 
1485 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
1486 		    "-- completion status (%x)  ioparam=%x/%x.\n", __func__,
1487 		    ha->host_no, le16_to_cpu(lg->comp_status), iop[0],
1488 		    iop[1]));
1489 
1490 		switch (iop[0]) {
1491 		case LSC_SCODE_PORTID_USED:
1492 			mb[0] = MBS_PORT_ID_USED;
1493 			mb[1] = LSW(iop[1]);
1494 			break;
1495 		case LSC_SCODE_NPORT_USED:
1496 			mb[0] = MBS_LOOP_ID_USED;
1497 			break;
1498 		case LSC_SCODE_NOLINK:
1499 		case LSC_SCODE_NOIOCB:
1500 		case LSC_SCODE_NOXCB:
1501 		case LSC_SCODE_CMD_FAILED:
1502 		case LSC_SCODE_NOFABRIC:
1503 		case LSC_SCODE_FW_NOT_READY:
1504 		case LSC_SCODE_NOT_LOGGED_IN:
1505 		case LSC_SCODE_NOPCB:
1506 		case LSC_SCODE_ELS_REJECT:
1507 		case LSC_SCODE_CMD_PARAM_ERR:
1508 		case LSC_SCODE_NONPORT:
1509 		case LSC_SCODE_LOGGED_IN:
1510 		case LSC_SCODE_NOFLOGI_ACC:
1511 		default:
1512 			mb[0] = MBS_COMMAND_ERROR;
1513 			break;
1514 		}
1515 	} else {
1516 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
1517 
1518 		iop[0] = le32_to_cpu(lg->io_parameter[0]);
1519 
1520 		mb[0] = MBS_COMMAND_COMPLETE;
1521 		mb[1] = 0;
1522 		if (iop[0] & BIT_4) {
1523 			if (iop[0] & BIT_8)
1524 				mb[1] |= BIT_1;
1525 		} else
1526 			mb[1] = BIT_0;
1527 
1528 		/* Passback COS information. */
1529 		mb[10] = 0;
1530 		if (lg->io_parameter[7] || lg->io_parameter[8])
1531 			mb[10] |= BIT_0;	/* Class 2. */
1532 		if (lg->io_parameter[9] || lg->io_parameter[10])
1533 			mb[10] |= BIT_1;	/* Class 3. */
1534 	}
1535 
1536 	dma_pool_free(ha->s_dma_pool, lg, lg_dma);
1537 
1538 	return rval;
1539 }
1540 
1541 /*
1542  * qla2x00_login_fabric
1543  *	Issue login fabric port mailbox command.
1544  *
1545  * Input:
1546  *	ha = adapter block pointer.
1547  *	loop_id = device loop ID.
1548  *	domain = device domain.
1549  *	area = device area.
1550  *	al_pa = device AL_PA.
1551  *	status = pointer for return status.
1552  *	opt = command options.
1553  *	TARGET_QUEUE_LOCK must be released.
1554  *	ADAPTER_STATE_LOCK must be released.
1555  *
1556  * Returns:
1557  *	qla2x00 local function return status code.
1558  *
1559  * Context:
1560  *	Kernel context.
1561  */
1562 int
1563 qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
1564     uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
1565 {
1566 	int rval;
1567 	mbx_cmd_t mc;
1568 	mbx_cmd_t *mcp = &mc;
1569 
1570 	DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha->host_no));
1571 
1572 	mcp->mb[0] = MBC_LOGIN_FABRIC_PORT;
1573 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1574 	if (HAS_EXTENDED_IDS(ha)) {
1575 		mcp->mb[1] = loop_id;
1576 		mcp->mb[10] = opt;
1577 		mcp->out_mb |= MBX_10;
1578 	} else {
1579 		mcp->mb[1] = (loop_id << 8) | opt;
1580 	}
1581 	mcp->mb[2] = domain;
1582 	mcp->mb[3] = area << 8 | al_pa;
1583 
1584 	mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0;
1585 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1586 	mcp->flags = 0;
1587 	rval = qla2x00_mailbox_command(ha, mcp);
1588 
1589 	/* Return mailbox statuses. */
1590 	if (mb != NULL) {
1591 		mb[0] = mcp->mb[0];
1592 		mb[1] = mcp->mb[1];
1593 		mb[2] = mcp->mb[2];
1594 		mb[6] = mcp->mb[6];
1595 		mb[7] = mcp->mb[7];
1596 		/* COS retrieved from Get-Port-Database mailbox command. */
1597 		mb[10] = 0;
1598 	}
1599 
1600 	if (rval != QLA_SUCCESS) {
1601 		/* RLU tmp code: need to change main mailbox_command function to
1602 		 * return ok even when the mailbox completion value is not
1603 		 * SUCCESS. The caller needs to be responsible to interpret
1604 		 * the return values of this mailbox command if we're not
1605 		 * to change too much of the existing code.
1606 		 */
1607 		if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||
1608 		    mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||
1609 		    mcp->mb[0] == 0x4006)
1610 			rval = QLA_SUCCESS;
1611 
1612 		/*EMPTY*/
1613 		DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x "
1614 		    "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha->host_no, rval,
1615 		    mcp->mb[0], mcp->mb[1], mcp->mb[2]));
1616 	} else {
1617 		/*EMPTY*/
1618 		DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n",
1619 		    ha->host_no));
1620 	}
1621 
1622 	return rval;
1623 }
1624 
1625 /*
1626  * qla2x00_login_local_device
1627  *           Issue login loop port mailbox command.
1628  *
1629  * Input:
1630  *           ha = adapter block pointer.
1631  *           loop_id = device loop ID.
1632  *           opt = command options.
1633  *
1634  * Returns:
1635  *            Return status code.
1636  *
1637  * Context:
1638  *            Kernel context.
1639  *
1640  */
1641 int
1642 qla2x00_login_local_device(scsi_qla_host_t *ha, fc_port_t *fcport,
1643     uint16_t *mb_ret, uint8_t opt)
1644 {
1645 	int rval;
1646 	mbx_cmd_t mc;
1647 	mbx_cmd_t *mcp = &mc;
1648 
1649 	if (IS_FWI2_CAPABLE(ha))
1650 		return qla24xx_login_fabric(ha, fcport->loop_id,
1651 		    fcport->d_id.b.domain, fcport->d_id.b.area,
1652 		    fcport->d_id.b.al_pa, mb_ret, opt);
1653 
1654 	DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no));
1655 
1656 	mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
1657 	if (HAS_EXTENDED_IDS(ha))
1658 		mcp->mb[1] = fcport->loop_id;
1659 	else
1660 		mcp->mb[1] = fcport->loop_id << 8;
1661 	mcp->mb[2] = opt;
1662 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
1663  	mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
1664 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1665 	mcp->flags = 0;
1666 	rval = qla2x00_mailbox_command(ha, mcp);
1667 
1668  	/* Return mailbox statuses. */
1669  	if (mb_ret != NULL) {
1670  		mb_ret[0] = mcp->mb[0];
1671  		mb_ret[1] = mcp->mb[1];
1672  		mb_ret[6] = mcp->mb[6];
1673  		mb_ret[7] = mcp->mb[7];
1674  	}
1675 
1676 	if (rval != QLA_SUCCESS) {
1677  		/* AV tmp code: need to change main mailbox_command function to
1678  		 * return ok even when the mailbox completion value is not
1679  		 * SUCCESS. The caller needs to be responsible to interpret
1680  		 * the return values of this mailbox command if we're not
1681  		 * to change too much of the existing code.
1682  		 */
1683  		if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006)
1684  			rval = QLA_SUCCESS;
1685 
1686 		DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
1687 		    "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,
1688 		    mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]));
1689 		DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
1690 		    "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,
1691 		    mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]));
1692 	} else {
1693 		/*EMPTY*/
1694 		DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no));
1695 	}
1696 
1697 	return (rval);
1698 }
1699 
1700 int
1701 qla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
1702     uint8_t area, uint8_t al_pa)
1703 {
1704 	int		rval;
1705 	struct logio_entry_24xx *lg;
1706 	dma_addr_t	lg_dma;
1707 
1708 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
1709 
1710 	lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);
1711 	if (lg == NULL) {
1712 		DEBUG2_3(printk("%s(%ld): failed to allocate Logout IOCB.\n",
1713 		    __func__, ha->host_no));
1714 		return QLA_MEMORY_ALLOC_FAILED;
1715 	}
1716 	memset(lg, 0, sizeof(struct logio_entry_24xx));
1717 
1718 	lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1719 	lg->entry_count = 1;
1720 	lg->nport_handle = cpu_to_le16(loop_id);
1721 	lg->control_flags =
1722 	    __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO);
1723 	lg->port_id[0] = al_pa;
1724 	lg->port_id[1] = area;
1725 	lg->port_id[2] = domain;
1726 	lg->vp_index = ha->vp_idx;
1727 	rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0);
1728 	if (rval != QLA_SUCCESS) {
1729 		DEBUG2_3_11(printk("%s(%ld): failed to issue Logout IOCB "
1730 		    "(%x).\n", __func__, ha->host_no, rval));
1731 	} else if (lg->entry_status != 0) {
1732 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
1733 		    "-- error status (%x).\n", __func__, ha->host_no,
1734 		    lg->entry_status));
1735 		rval = QLA_FUNCTION_FAILED;
1736 	} else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
1737 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
1738 		    "-- completion status (%x)  ioparam=%x/%x.\n", __func__,
1739 		    ha->host_no, le16_to_cpu(lg->comp_status),
1740 		    le32_to_cpu(lg->io_parameter[0]),
1741 		    le32_to_cpu(lg->io_parameter[1])));
1742 	} else {
1743 		/*EMPTY*/
1744 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
1745 	}
1746 
1747 	dma_pool_free(ha->s_dma_pool, lg, lg_dma);
1748 
1749 	return rval;
1750 }
1751 
1752 /*
1753  * qla2x00_fabric_logout
1754  *	Issue logout fabric port mailbox command.
1755  *
1756  * Input:
1757  *	ha = adapter block pointer.
1758  *	loop_id = device loop ID.
1759  *	TARGET_QUEUE_LOCK must be released.
1760  *	ADAPTER_STATE_LOCK must be released.
1761  *
1762  * Returns:
1763  *	qla2x00 local function return status code.
1764  *
1765  * Context:
1766  *	Kernel context.
1767  */
1768 int
1769 qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
1770     uint8_t area, uint8_t al_pa)
1771 {
1772 	int rval;
1773 	mbx_cmd_t mc;
1774 	mbx_cmd_t *mcp = &mc;
1775 
1776 	DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n",
1777 	    ha->host_no));
1778 
1779 	mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
1780 	mcp->out_mb = MBX_1|MBX_0;
1781 	if (HAS_EXTENDED_IDS(ha)) {
1782 		mcp->mb[1] = loop_id;
1783 		mcp->mb[10] = 0;
1784 		mcp->out_mb |= MBX_10;
1785 	} else {
1786 		mcp->mb[1] = loop_id << 8;
1787 	}
1788 
1789 	mcp->in_mb = MBX_1|MBX_0;
1790 	mcp->tov = MBX_TOV_SECONDS;
1791 	mcp->flags = 0;
1792 	rval = qla2x00_mailbox_command(ha, mcp);
1793 
1794 	if (rval != QLA_SUCCESS) {
1795 		/*EMPTY*/
1796 		DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x "
1797 		    "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1]));
1798 	} else {
1799 		/*EMPTY*/
1800 		DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n",
1801 		    ha->host_no));
1802 	}
1803 
1804 	return rval;
1805 }
1806 
1807 /*
1808  * qla2x00_full_login_lip
1809  *	Issue full login LIP mailbox command.
1810  *
1811  * Input:
1812  *	ha = adapter block pointer.
1813  *	TARGET_QUEUE_LOCK must be released.
1814  *	ADAPTER_STATE_LOCK must be released.
1815  *
1816  * Returns:
1817  *	qla2x00 local function return status code.
1818  *
1819  * Context:
1820  *	Kernel context.
1821  */
1822 int
1823 qla2x00_full_login_lip(scsi_qla_host_t *ha)
1824 {
1825 	int rval;
1826 	mbx_cmd_t mc;
1827 	mbx_cmd_t *mcp = &mc;
1828 
1829 	DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n",
1830 	    ha->host_no));
1831 
1832 	mcp->mb[0] = MBC_LIP_FULL_LOGIN;
1833 	mcp->mb[1] = IS_FWI2_CAPABLE(ha) ? BIT_3: 0;
1834 	mcp->mb[2] = 0;
1835 	mcp->mb[3] = 0;
1836 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1837 	mcp->in_mb = MBX_0;
1838 	mcp->tov = MBX_TOV_SECONDS;
1839 	mcp->flags = 0;
1840 	rval = qla2x00_mailbox_command(ha, mcp);
1841 
1842 	if (rval != QLA_SUCCESS) {
1843 		/*EMPTY*/
1844 		DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n",
1845 		    ha->host_no, rval));
1846 	} else {
1847 		/*EMPTY*/
1848 		DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n",
1849 		    ha->host_no));
1850 	}
1851 
1852 	return rval;
1853 }
1854 
1855 /*
1856  * qla2x00_get_id_list
1857  *
1858  * Input:
1859  *	ha = adapter block pointer.
1860  *
1861  * Returns:
1862  *	qla2x00 local function return status code.
1863  *
1864  * Context:
1865  *	Kernel context.
1866  */
1867 int
1868 qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma,
1869     uint16_t *entries)
1870 {
1871 	int rval;
1872 	mbx_cmd_t mc;
1873 	mbx_cmd_t *mcp = &mc;
1874 
1875 	DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n",
1876 	    ha->host_no));
1877 
1878 	if (id_list == NULL)
1879 		return QLA_FUNCTION_FAILED;
1880 
1881 	mcp->mb[0] = MBC_GET_ID_LIST;
1882 	mcp->out_mb = MBX_0;
1883 	if (IS_FWI2_CAPABLE(ha)) {
1884 		mcp->mb[2] = MSW(id_list_dma);
1885 		mcp->mb[3] = LSW(id_list_dma);
1886 		mcp->mb[6] = MSW(MSD(id_list_dma));
1887 		mcp->mb[7] = LSW(MSD(id_list_dma));
1888 		mcp->mb[8] = 0;
1889 		mcp->mb[9] = ha->vp_idx;
1890 		mcp->out_mb |= MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2;
1891 	} else {
1892 		mcp->mb[1] = MSW(id_list_dma);
1893 		mcp->mb[2] = LSW(id_list_dma);
1894 		mcp->mb[3] = MSW(MSD(id_list_dma));
1895 		mcp->mb[6] = LSW(MSD(id_list_dma));
1896 		mcp->out_mb |= MBX_6|MBX_3|MBX_2|MBX_1;
1897 	}
1898 	mcp->in_mb = MBX_1|MBX_0;
1899 	mcp->tov = MBX_TOV_SECONDS;
1900 	mcp->flags = 0;
1901 	rval = qla2x00_mailbox_command(ha, mcp);
1902 
1903 	if (rval != QLA_SUCCESS) {
1904 		/*EMPTY*/
1905 		DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n",
1906 		    ha->host_no, rval));
1907 	} else {
1908 		*entries = mcp->mb[1];
1909 		DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n",
1910 		    ha->host_no));
1911 	}
1912 
1913 	return rval;
1914 }
1915 
1916 /*
1917  * qla2x00_get_resource_cnts
1918  *	Get current firmware resource counts.
1919  *
1920  * Input:
1921  *	ha = adapter block pointer.
1922  *
1923  * Returns:
1924  *	qla2x00 local function return status code.
1925  *
1926  * Context:
1927  *	Kernel context.
1928  */
1929 int
1930 qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt,
1931     uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt,
1932     uint16_t *orig_iocb_cnt, uint16_t *max_npiv_vports)
1933 {
1934 	int rval;
1935 	mbx_cmd_t mc;
1936 	mbx_cmd_t *mcp = &mc;
1937 
1938 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
1939 
1940 	mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
1941 	mcp->out_mb = MBX_0;
1942 	mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1943 	mcp->tov = MBX_TOV_SECONDS;
1944 	mcp->flags = 0;
1945 	rval = qla2x00_mailbox_command(ha, mcp);
1946 
1947 	if (rval != QLA_SUCCESS) {
1948 		/*EMPTY*/
1949 		DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__,
1950 		    ha->host_no, mcp->mb[0]));
1951 	} else {
1952 		DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x "
1953 		    "mb7=%x mb10=%x mb11=%x.\n", __func__, ha->host_no,
1954 		    mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[6], mcp->mb[7],
1955 		    mcp->mb[10], mcp->mb[11]));
1956 
1957 		if (cur_xchg_cnt)
1958 			*cur_xchg_cnt = mcp->mb[3];
1959 		if (orig_xchg_cnt)
1960 			*orig_xchg_cnt = mcp->mb[6];
1961 		if (cur_iocb_cnt)
1962 			*cur_iocb_cnt = mcp->mb[7];
1963 		if (orig_iocb_cnt)
1964 			*orig_iocb_cnt = mcp->mb[10];
1965 		if (max_npiv_vports)
1966 			*max_npiv_vports = mcp->mb[11];
1967 	}
1968 
1969 	return (rval);
1970 }
1971 
1972 #if defined(QL_DEBUG_LEVEL_3)
1973 /*
1974  * qla2x00_get_fcal_position_map
1975  *	Get FCAL (LILP) position map using mailbox command
1976  *
1977  * Input:
1978  *	ha = adapter state pointer.
1979  *	pos_map = buffer pointer (can be NULL).
1980  *
1981  * Returns:
1982  *	qla2x00 local function return status code.
1983  *
1984  * Context:
1985  *	Kernel context.
1986  */
1987 int
1988 qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map)
1989 {
1990 	int rval;
1991 	mbx_cmd_t mc;
1992 	mbx_cmd_t *mcp = &mc;
1993 	char *pmap;
1994 	dma_addr_t pmap_dma;
1995 
1996 	pmap = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pmap_dma);
1997 	if (pmap  == NULL) {
1998 		DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****",
1999 		    __func__, ha->host_no));
2000 		return QLA_MEMORY_ALLOC_FAILED;
2001 	}
2002 	memset(pmap, 0, FCAL_MAP_SIZE);
2003 
2004 	mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP;
2005 	mcp->mb[2] = MSW(pmap_dma);
2006 	mcp->mb[3] = LSW(pmap_dma);
2007 	mcp->mb[6] = MSW(MSD(pmap_dma));
2008 	mcp->mb[7] = LSW(MSD(pmap_dma));
2009 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2010 	mcp->in_mb = MBX_1|MBX_0;
2011 	mcp->buf_size = FCAL_MAP_SIZE;
2012 	mcp->flags = MBX_DMA_IN;
2013 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
2014 	rval = qla2x00_mailbox_command(ha, mcp);
2015 
2016 	if (rval == QLA_SUCCESS) {
2017 		DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "
2018 		    "size (%x)\n", __func__, ha->host_no, mcp->mb[0],
2019 		    mcp->mb[1], (unsigned)pmap[0]));
2020 		DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1));
2021 
2022 		if (pos_map)
2023 			memcpy(pos_map, pmap, FCAL_MAP_SIZE);
2024 	}
2025 	dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);
2026 
2027 	if (rval != QLA_SUCCESS) {
2028 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2029 		    ha->host_no, rval));
2030 	} else {
2031 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2032 	}
2033 
2034 	return rval;
2035 }
2036 #endif
2037 
2038 /*
2039  * qla2x00_get_link_status
2040  *
2041  * Input:
2042  *	ha = adapter block pointer.
2043  *	loop_id = device loop ID.
2044  *	ret_buf = pointer to link status return buffer.
2045  *
2046  * Returns:
2047  *	0 = success.
2048  *	BIT_0 = mem alloc error.
2049  *	BIT_1 = mailbox error.
2050  */
2051 int
2052 qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id,
2053     struct link_statistics *stats, dma_addr_t stats_dma)
2054 {
2055 	int rval;
2056 	mbx_cmd_t mc;
2057 	mbx_cmd_t *mcp = &mc;
2058 	uint32_t *siter, *diter, dwords;
2059 
2060 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2061 
2062 	mcp->mb[0] = MBC_GET_LINK_STATUS;
2063 	mcp->mb[2] = MSW(stats_dma);
2064 	mcp->mb[3] = LSW(stats_dma);
2065 	mcp->mb[6] = MSW(MSD(stats_dma));
2066 	mcp->mb[7] = LSW(MSD(stats_dma));
2067 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2068 	mcp->in_mb = MBX_0;
2069 	if (IS_FWI2_CAPABLE(ha)) {
2070 		mcp->mb[1] = loop_id;
2071 		mcp->mb[4] = 0;
2072 		mcp->mb[10] = 0;
2073 		mcp->out_mb |= MBX_10|MBX_4|MBX_1;
2074 		mcp->in_mb |= MBX_1;
2075 	} else if (HAS_EXTENDED_IDS(ha)) {
2076 		mcp->mb[1] = loop_id;
2077 		mcp->mb[10] = 0;
2078 		mcp->out_mb |= MBX_10|MBX_1;
2079 	} else {
2080 		mcp->mb[1] = loop_id << 8;
2081 		mcp->out_mb |= MBX_1;
2082 	}
2083 	mcp->tov = MBX_TOV_SECONDS;
2084 	mcp->flags = IOCTL_CMD;
2085 	rval = qla2x00_mailbox_command(ha, mcp);
2086 
2087 	if (rval == QLA_SUCCESS) {
2088 		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
2089 			DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n",
2090 			    __func__, ha->host_no, mcp->mb[0]));
2091 			rval = QLA_FUNCTION_FAILED;
2092 		} else {
2093 			/* Copy over data -- firmware data is LE. */
2094 			dwords = offsetof(struct link_statistics, unused1) / 4;
2095 			siter = diter = &stats->link_fail_cnt;
2096 			while (dwords--)
2097 				*diter++ = le32_to_cpu(*siter++);
2098 		}
2099 	} else {
2100 		/* Failed. */
2101 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2102 		    ha->host_no, rval));
2103 	}
2104 
2105 	return rval;
2106 }
2107 
2108 int
2109 qla24xx_get_isp_stats(scsi_qla_host_t *ha, struct link_statistics *stats,
2110     dma_addr_t stats_dma)
2111 {
2112 	int rval;
2113 	mbx_cmd_t mc;
2114 	mbx_cmd_t *mcp = &mc;
2115 	uint32_t *siter, *diter, dwords;
2116 
2117 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2118 
2119 	mcp->mb[0] = MBC_GET_LINK_PRIV_STATS;
2120 	mcp->mb[2] = MSW(stats_dma);
2121 	mcp->mb[3] = LSW(stats_dma);
2122 	mcp->mb[6] = MSW(MSD(stats_dma));
2123 	mcp->mb[7] = LSW(MSD(stats_dma));
2124 	mcp->mb[8] = sizeof(struct link_statistics) / 4;
2125 	mcp->mb[9] = ha->vp_idx;
2126 	mcp->mb[10] = 0;
2127 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2128 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
2129 	mcp->tov = MBX_TOV_SECONDS;
2130 	mcp->flags = IOCTL_CMD;
2131 	rval = qla2x00_mailbox_command(ha, mcp);
2132 
2133 	if (rval == QLA_SUCCESS) {
2134 		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
2135 			DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n",
2136 			    __func__, ha->host_no, mcp->mb[0]));
2137 			rval = QLA_FUNCTION_FAILED;
2138 		} else {
2139 			/* Copy over data -- firmware data is LE. */
2140 			dwords = sizeof(struct link_statistics) / 4;
2141 			siter = diter = &stats->link_fail_cnt;
2142 			while (dwords--)
2143 				*diter++ = le32_to_cpu(*siter++);
2144 		}
2145 	} else {
2146 		/* Failed. */
2147 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2148 		    ha->host_no, rval));
2149 	}
2150 
2151 	return rval;
2152 }
2153 
2154 int
2155 qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp)
2156 {
2157 	int		rval;
2158 	fc_port_t	*fcport;
2159 	unsigned long   flags = 0;
2160 
2161 	struct abort_entry_24xx *abt;
2162 	dma_addr_t	abt_dma;
2163 	uint32_t	handle;
2164 
2165 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2166 
2167 	fcport = sp->fcport;
2168 
2169 	spin_lock_irqsave(&ha->hardware_lock, flags);
2170 	for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
2171 		if (ha->outstanding_cmds[handle] == sp)
2172 			break;
2173 	}
2174 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
2175 	if (handle == MAX_OUTSTANDING_COMMANDS) {
2176 		/* Command not found. */
2177 		return QLA_FUNCTION_FAILED;
2178 	}
2179 
2180 	abt = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &abt_dma);
2181 	if (abt == NULL) {
2182 		DEBUG2_3(printk("%s(%ld): failed to allocate Abort IOCB.\n",
2183 		    __func__, ha->host_no));
2184 		return QLA_MEMORY_ALLOC_FAILED;
2185 	}
2186 	memset(abt, 0, sizeof(struct abort_entry_24xx));
2187 
2188 	abt->entry_type = ABORT_IOCB_TYPE;
2189 	abt->entry_count = 1;
2190 	abt->nport_handle = cpu_to_le16(fcport->loop_id);
2191 	abt->handle_to_abort = handle;
2192 	abt->port_id[0] = fcport->d_id.b.al_pa;
2193 	abt->port_id[1] = fcport->d_id.b.area;
2194 	abt->port_id[2] = fcport->d_id.b.domain;
2195 	abt->vp_index = fcport->vp_idx;
2196 	rval = qla2x00_issue_iocb(ha, abt, abt_dma, 0);
2197 	if (rval != QLA_SUCCESS) {
2198 		DEBUG2_3_11(printk("%s(%ld): failed to issue IOCB (%x).\n",
2199 		    __func__, ha->host_no, rval));
2200 	} else if (abt->entry_status != 0) {
2201 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2202 		    "-- error status (%x).\n", __func__, ha->host_no,
2203 		    abt->entry_status));
2204 		rval = QLA_FUNCTION_FAILED;
2205 	} else if (abt->nport_handle != __constant_cpu_to_le16(0)) {
2206 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2207 		    "-- completion status (%x).\n", __func__, ha->host_no,
2208 		    le16_to_cpu(abt->nport_handle)));
2209 		rval = QLA_FUNCTION_FAILED;
2210 	} else {
2211 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2212 	}
2213 
2214 	dma_pool_free(ha->s_dma_pool, abt, abt_dma);
2215 
2216 	return rval;
2217 }
2218 
2219 struct tsk_mgmt_cmd {
2220 	union {
2221 		struct tsk_mgmt_entry tsk;
2222 		struct sts_entry_24xx sts;
2223 	} p;
2224 };
2225 
2226 static int
2227 __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
2228     unsigned int l)
2229 {
2230 	int		rval, rval2;
2231 	struct tsk_mgmt_cmd *tsk;
2232 	dma_addr_t	tsk_dma;
2233 	scsi_qla_host_t *ha, *pha;
2234 
2235 	DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no));
2236 
2237 	ha = fcport->ha;
2238 	pha = to_qla_parent(ha);
2239 	tsk = dma_pool_alloc(pha->s_dma_pool, GFP_KERNEL, &tsk_dma);
2240 	if (tsk == NULL) {
2241 		DEBUG2_3(printk("%s(%ld): failed to allocate Task Management "
2242 		    "IOCB.\n", __func__, ha->host_no));
2243 		return QLA_MEMORY_ALLOC_FAILED;
2244 	}
2245 	memset(tsk, 0, sizeof(struct tsk_mgmt_cmd));
2246 
2247 	tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE;
2248 	tsk->p.tsk.entry_count = 1;
2249 	tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id);
2250 	tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
2251 	tsk->p.tsk.control_flags = cpu_to_le32(type);
2252 	tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa;
2253 	tsk->p.tsk.port_id[1] = fcport->d_id.b.area;
2254 	tsk->p.tsk.port_id[2] = fcport->d_id.b.domain;
2255 	tsk->p.tsk.vp_index = fcport->vp_idx;
2256 	if (type == TCF_LUN_RESET) {
2257 		int_to_scsilun(l, &tsk->p.tsk.lun);
2258 		host_to_fcp_swap((uint8_t *)&tsk->p.tsk.lun,
2259 		    sizeof(tsk->p.tsk.lun));
2260 	}
2261 
2262 	rval = qla2x00_issue_iocb(ha, tsk, tsk_dma, 0);
2263 	if (rval != QLA_SUCCESS) {
2264 		DEBUG2_3_11(printk("%s(%ld): failed to issue %s Reset IOCB "
2265 		    "(%x).\n", __func__, ha->host_no, name, rval));
2266 	} else if (tsk->p.sts.entry_status != 0) {
2267 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2268 		    "-- error status (%x).\n", __func__, ha->host_no,
2269 		    tsk->p.sts.entry_status));
2270 		rval = QLA_FUNCTION_FAILED;
2271 	} else if (tsk->p.sts.comp_status !=
2272 	    __constant_cpu_to_le16(CS_COMPLETE)) {
2273 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2274 		    "-- completion status (%x).\n", __func__,
2275 		    ha->host_no, le16_to_cpu(tsk->p.sts.comp_status)));
2276 		rval = QLA_FUNCTION_FAILED;
2277 	}
2278 
2279 	/* Issue marker IOCB. */
2280 	rval2 = qla2x00_marker(ha, fcport->loop_id, l,
2281 	    type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID);
2282 	if (rval2 != QLA_SUCCESS) {
2283 		DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB "
2284 		    "(%x).\n", __func__, ha->host_no, rval2));
2285 	} else {
2286 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2287 	}
2288 
2289 	dma_pool_free(pha->s_dma_pool, tsk, tsk_dma);
2290 
2291 	return rval;
2292 }
2293 
2294 int
2295 qla24xx_abort_target(struct fc_port *fcport, unsigned int l)
2296 {
2297 	return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l);
2298 }
2299 
2300 int
2301 qla24xx_lun_reset(struct fc_port *fcport, unsigned int l)
2302 {
2303 	return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l);
2304 }
2305 
2306 int
2307 qla2x00_system_error(scsi_qla_host_t *ha)
2308 {
2309 	int rval;
2310 	mbx_cmd_t mc;
2311 	mbx_cmd_t *mcp = &mc;
2312 
2313 	if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha))
2314 		return QLA_FUNCTION_FAILED;
2315 
2316 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2317 
2318 	mcp->mb[0] = MBC_GEN_SYSTEM_ERROR;
2319 	mcp->out_mb = MBX_0;
2320 	mcp->in_mb = MBX_0;
2321 	mcp->tov = 5;
2322 	mcp->flags = 0;
2323 	rval = qla2x00_mailbox_command(ha, mcp);
2324 
2325 	if (rval != QLA_SUCCESS) {
2326 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2327 		    ha->host_no, rval));
2328 	} else {
2329 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2330 	}
2331 
2332 	return rval;
2333 }
2334 
2335 /**
2336  * qla2x00_set_serdes_params() -
2337  * @ha: HA context
2338  *
2339  * Returns
2340  */
2341 int
2342 qla2x00_set_serdes_params(scsi_qla_host_t *ha, uint16_t sw_em_1g,
2343     uint16_t sw_em_2g, uint16_t sw_em_4g)
2344 {
2345 	int rval;
2346 	mbx_cmd_t mc;
2347 	mbx_cmd_t *mcp = &mc;
2348 
2349 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2350 
2351 	mcp->mb[0] = MBC_SERDES_PARAMS;
2352 	mcp->mb[1] = BIT_0;
2353 	mcp->mb[2] = sw_em_1g | BIT_15;
2354 	mcp->mb[3] = sw_em_2g | BIT_15;
2355 	mcp->mb[4] = sw_em_4g | BIT_15;
2356 	mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
2357 	mcp->in_mb = MBX_0;
2358 	mcp->tov = MBX_TOV_SECONDS;
2359 	mcp->flags = 0;
2360 	rval = qla2x00_mailbox_command(ha, mcp);
2361 
2362 	if (rval != QLA_SUCCESS) {
2363 		/*EMPTY*/
2364 		DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
2365 		    ha->host_no, rval, mcp->mb[0]));
2366 	} else {
2367 		/*EMPTY*/
2368 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2369 	}
2370 
2371 	return rval;
2372 }
2373 
2374 int
2375 qla2x00_stop_firmware(scsi_qla_host_t *ha)
2376 {
2377 	int rval;
2378 	mbx_cmd_t mc;
2379 	mbx_cmd_t *mcp = &mc;
2380 
2381 	if (!IS_FWI2_CAPABLE(ha))
2382 		return QLA_FUNCTION_FAILED;
2383 
2384 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2385 
2386 	mcp->mb[0] = MBC_STOP_FIRMWARE;
2387 	mcp->out_mb = MBX_0;
2388 	mcp->in_mb = MBX_0;
2389 	mcp->tov = 5;
2390 	mcp->flags = 0;
2391 	rval = qla2x00_mailbox_command(ha, mcp);
2392 
2393 	if (rval != QLA_SUCCESS) {
2394 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2395 		    ha->host_no, rval));
2396 	} else {
2397 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2398 	}
2399 
2400 	return rval;
2401 }
2402 
2403 int
2404 qla2x00_enable_eft_trace(scsi_qla_host_t *ha, dma_addr_t eft_dma,
2405     uint16_t buffers)
2406 {
2407 	int rval;
2408 	mbx_cmd_t mc;
2409 	mbx_cmd_t *mcp = &mc;
2410 
2411 	if (!IS_FWI2_CAPABLE(ha))
2412 		return QLA_FUNCTION_FAILED;
2413 
2414 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2415 
2416 	mcp->mb[0] = MBC_TRACE_CONTROL;
2417 	mcp->mb[1] = TC_EFT_ENABLE;
2418 	mcp->mb[2] = LSW(eft_dma);
2419 	mcp->mb[3] = MSW(eft_dma);
2420 	mcp->mb[4] = LSW(MSD(eft_dma));
2421 	mcp->mb[5] = MSW(MSD(eft_dma));
2422 	mcp->mb[6] = buffers;
2423 	mcp->mb[7] = TC_AEN_DISABLE;
2424 	mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
2425 	mcp->in_mb = MBX_1|MBX_0;
2426 	mcp->tov = MBX_TOV_SECONDS;
2427 	mcp->flags = 0;
2428 	rval = qla2x00_mailbox_command(ha, mcp);
2429 	if (rval != QLA_SUCCESS) {
2430 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
2431 		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
2432 	} else {
2433 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2434 	}
2435 
2436 	return rval;
2437 }
2438 
2439 int
2440 qla2x00_disable_eft_trace(scsi_qla_host_t *ha)
2441 {
2442 	int rval;
2443 	mbx_cmd_t mc;
2444 	mbx_cmd_t *mcp = &mc;
2445 
2446 	if (!IS_FWI2_CAPABLE(ha))
2447 		return QLA_FUNCTION_FAILED;
2448 
2449 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2450 
2451 	mcp->mb[0] = MBC_TRACE_CONTROL;
2452 	mcp->mb[1] = TC_EFT_DISABLE;
2453 	mcp->out_mb = MBX_1|MBX_0;
2454 	mcp->in_mb = MBX_1|MBX_0;
2455 	mcp->tov = MBX_TOV_SECONDS;
2456 	mcp->flags = 0;
2457 	rval = qla2x00_mailbox_command(ha, mcp);
2458 	if (rval != QLA_SUCCESS) {
2459 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
2460 		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
2461 	} else {
2462 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2463 	}
2464 
2465 	return rval;
2466 }
2467 
2468 int
2469 qla2x00_enable_fce_trace(scsi_qla_host_t *ha, dma_addr_t fce_dma,
2470     uint16_t buffers, uint16_t *mb, uint32_t *dwords)
2471 {
2472 	int rval;
2473 	mbx_cmd_t mc;
2474 	mbx_cmd_t *mcp = &mc;
2475 
2476 	if (!IS_QLA25XX(ha))
2477 		return QLA_FUNCTION_FAILED;
2478 
2479 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2480 
2481 	mcp->mb[0] = MBC_TRACE_CONTROL;
2482 	mcp->mb[1] = TC_FCE_ENABLE;
2483 	mcp->mb[2] = LSW(fce_dma);
2484 	mcp->mb[3] = MSW(fce_dma);
2485 	mcp->mb[4] = LSW(MSD(fce_dma));
2486 	mcp->mb[5] = MSW(MSD(fce_dma));
2487 	mcp->mb[6] = buffers;
2488 	mcp->mb[7] = TC_AEN_DISABLE;
2489 	mcp->mb[8] = 0;
2490 	mcp->mb[9] = TC_FCE_DEFAULT_RX_SIZE;
2491 	mcp->mb[10] = TC_FCE_DEFAULT_TX_SIZE;
2492 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|
2493 	    MBX_1|MBX_0;
2494 	mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
2495 	mcp->tov = MBX_TOV_SECONDS;
2496 	mcp->flags = 0;
2497 	rval = qla2x00_mailbox_command(ha, mcp);
2498 	if (rval != QLA_SUCCESS) {
2499 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
2500 		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
2501 	} else {
2502 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2503 
2504 		if (mb)
2505 			memcpy(mb, mcp->mb, 8 * sizeof(*mb));
2506 		if (dwords)
2507 			*dwords = buffers;
2508 	}
2509 
2510 	return rval;
2511 }
2512 
2513 int
2514 qla2x00_disable_fce_trace(scsi_qla_host_t *ha, uint64_t *wr, uint64_t *rd)
2515 {
2516 	int rval;
2517 	mbx_cmd_t mc;
2518 	mbx_cmd_t *mcp = &mc;
2519 
2520 	if (!IS_FWI2_CAPABLE(ha))
2521 		return QLA_FUNCTION_FAILED;
2522 
2523 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2524 
2525 	mcp->mb[0] = MBC_TRACE_CONTROL;
2526 	mcp->mb[1] = TC_FCE_DISABLE;
2527 	mcp->mb[2] = TC_FCE_DISABLE_TRACE;
2528 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
2529 	mcp->in_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|
2530 	    MBX_1|MBX_0;
2531 	mcp->tov = MBX_TOV_SECONDS;
2532 	mcp->flags = 0;
2533 	rval = qla2x00_mailbox_command(ha, mcp);
2534 	if (rval != QLA_SUCCESS) {
2535 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
2536 		    __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1]));
2537 	} else {
2538 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2539 
2540 		if (wr)
2541 			*wr = (uint64_t) mcp->mb[5] << 48 |
2542 			    (uint64_t) mcp->mb[4] << 32 |
2543 			    (uint64_t) mcp->mb[3] << 16 |
2544 			    (uint64_t) mcp->mb[2];
2545 		if (rd)
2546 			*rd = (uint64_t) mcp->mb[9] << 48 |
2547 			    (uint64_t) mcp->mb[8] << 32 |
2548 			    (uint64_t) mcp->mb[7] << 16 |
2549 			    (uint64_t) mcp->mb[6];
2550 	}
2551 
2552 	return rval;
2553 }
2554 
2555 int
2556 qla2x00_read_sfp(scsi_qla_host_t *ha, dma_addr_t sfp_dma, uint16_t addr,
2557     uint16_t off, uint16_t count)
2558 {
2559 	int rval;
2560 	mbx_cmd_t mc;
2561 	mbx_cmd_t *mcp = &mc;
2562 
2563 	if (!IS_FWI2_CAPABLE(ha))
2564 		return QLA_FUNCTION_FAILED;
2565 
2566 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2567 
2568 	mcp->mb[0] = MBC_READ_SFP;
2569 	mcp->mb[1] = addr;
2570 	mcp->mb[2] = MSW(sfp_dma);
2571 	mcp->mb[3] = LSW(sfp_dma);
2572 	mcp->mb[6] = MSW(MSD(sfp_dma));
2573 	mcp->mb[7] = LSW(MSD(sfp_dma));
2574 	mcp->mb[8] = count;
2575 	mcp->mb[9] = off;
2576 	mcp->mb[10] = 0;
2577 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2578 	mcp->in_mb = MBX_0;
2579 	mcp->tov = MBX_TOV_SECONDS;
2580 	mcp->flags = 0;
2581 	rval = qla2x00_mailbox_command(ha, mcp);
2582 
2583 	if (rval != QLA_SUCCESS) {
2584 		DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
2585 		    ha->host_no, rval, mcp->mb[0]));
2586 	} else {
2587 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2588 	}
2589 
2590 	return rval;
2591 }
2592 
2593 int
2594 qla2x00_set_idma_speed(scsi_qla_host_t *ha, uint16_t loop_id,
2595     uint16_t port_speed, uint16_t *mb)
2596 {
2597 	int rval;
2598 	mbx_cmd_t mc;
2599 	mbx_cmd_t *mcp = &mc;
2600 
2601 	if (!IS_IIDMA_CAPABLE(ha))
2602 		return QLA_FUNCTION_FAILED;
2603 
2604 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2605 
2606 	mcp->mb[0] = MBC_PORT_PARAMS;
2607 	mcp->mb[1] = loop_id;
2608 	mcp->mb[2] = BIT_0;
2609 	mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
2610 	mcp->mb[4] = mcp->mb[5] = 0;
2611 	mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
2612 	mcp->in_mb = MBX_5|MBX_4|MBX_3|MBX_1|MBX_0;
2613 	mcp->tov = MBX_TOV_SECONDS;
2614 	mcp->flags = 0;
2615 	rval = qla2x00_mailbox_command(ha, mcp);
2616 
2617 	/* Return mailbox statuses. */
2618 	if (mb != NULL) {
2619 		mb[0] = mcp->mb[0];
2620 		mb[1] = mcp->mb[1];
2621 		mb[3] = mcp->mb[3];
2622 		mb[4] = mcp->mb[4];
2623 		mb[5] = mcp->mb[5];
2624 	}
2625 
2626 	if (rval != QLA_SUCCESS) {
2627 		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2628 		    ha->host_no, rval));
2629 	} else {
2630 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2631 	}
2632 
2633 	return rval;
2634 }
2635 
2636 void
2637 qla24xx_report_id_acquisition(scsi_qla_host_t *ha,
2638 	struct vp_rpt_id_entry_24xx *rptid_entry)
2639 {
2640 	uint8_t vp_idx;
2641 	uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);
2642 	scsi_qla_host_t *vha;
2643 
2644 	if (rptid_entry->entry_status != 0)
2645 		return;
2646 
2647 	if (rptid_entry->format == 0) {
2648 		DEBUG15(printk("%s:format 0 : scsi(%ld) number of VPs setup %d,"
2649 			" number of VPs acquired %d\n", __func__, ha->host_no,
2650 			MSB(rptid_entry->vp_count), LSB(rptid_entry->vp_count)));
2651 		DEBUG15(printk("%s primary port id %02x%02x%02x\n", __func__,
2652 			rptid_entry->port_id[2], rptid_entry->port_id[1],
2653 			rptid_entry->port_id[0]));
2654 	} else if (rptid_entry->format == 1) {
2655 		vp_idx = LSB(stat);
2656 		DEBUG15(printk("%s:format 1: scsi(%ld): VP[%d] enabled "
2657 		    "- status %d - "
2658 		    "with port id %02x%02x%02x\n",__func__,ha->host_no,
2659 		    vp_idx, MSB(stat),
2660 		    rptid_entry->port_id[2], rptid_entry->port_id[1],
2661 		    rptid_entry->port_id[0]));
2662 		if (vp_idx == 0)
2663 			return;
2664 
2665 		if (MSB(stat) == 1)
2666 			return;
2667 
2668 		list_for_each_entry(vha, &ha->vp_list, vp_list)
2669 			if (vp_idx == vha->vp_idx)
2670 				break;
2671 
2672 		if (!vha)
2673 			return;
2674 
2675 		vha->d_id.b.domain = rptid_entry->port_id[2];
2676 		vha->d_id.b.area =  rptid_entry->port_id[1];
2677 		vha->d_id.b.al_pa = rptid_entry->port_id[0];
2678 
2679 		/*
2680 		 * Cannot configure here as we are still sitting on the
2681 		 * response queue. Handle it in dpc context.
2682 		 */
2683 		set_bit(VP_IDX_ACQUIRED, &vha->vp_flags);
2684 		set_bit(VP_DPC_NEEDED, &ha->dpc_flags);
2685 
2686 		wake_up_process(ha->dpc_thread);
2687 	}
2688 }
2689 
2690 /*
2691  * qla24xx_modify_vp_config
2692  *	Change VP configuration for vha
2693  *
2694  * Input:
2695  *	vha = adapter block pointer.
2696  *
2697  * Returns:
2698  *	qla2xxx local function return status code.
2699  *
2700  * Context:
2701  *	Kernel context.
2702  */
2703 int
2704 qla24xx_modify_vp_config(scsi_qla_host_t *vha)
2705 {
2706 	int		rval;
2707 	struct vp_config_entry_24xx *vpmod;
2708 	dma_addr_t	vpmod_dma;
2709 	scsi_qla_host_t *pha;
2710 
2711 	/* This can be called by the parent */
2712 	pha = to_qla_parent(vha);
2713 
2714 	vpmod = dma_pool_alloc(pha->s_dma_pool, GFP_KERNEL, &vpmod_dma);
2715 	if (!vpmod) {
2716 		DEBUG2_3(printk("%s(%ld): failed to allocate Modify VP "
2717 		    "IOCB.\n", __func__, pha->host_no));
2718 		return QLA_MEMORY_ALLOC_FAILED;
2719 	}
2720 
2721 	memset(vpmod, 0, sizeof(struct vp_config_entry_24xx));
2722 	vpmod->entry_type = VP_CONFIG_IOCB_TYPE;
2723 	vpmod->entry_count = 1;
2724 	vpmod->command = VCT_COMMAND_MOD_ENABLE_VPS;
2725 	vpmod->vp_count = 1;
2726 	vpmod->vp_index1 = vha->vp_idx;
2727 	vpmod->options_idx1 = BIT_3|BIT_4|BIT_5;
2728 	memcpy(vpmod->node_name_idx1, vha->node_name, WWN_SIZE);
2729 	memcpy(vpmod->port_name_idx1, vha->port_name, WWN_SIZE);
2730 	vpmod->entry_count = 1;
2731 
2732 	rval = qla2x00_issue_iocb(pha, vpmod, vpmod_dma, 0);
2733 	if (rval != QLA_SUCCESS) {
2734 		DEBUG2_3_11(printk("%s(%ld): failed to issue VP config IOCB"
2735 			"(%x).\n", __func__, pha->host_no, rval));
2736 	} else if (vpmod->comp_status != 0) {
2737 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2738 			"-- error status (%x).\n", __func__, pha->host_no,
2739 			vpmod->comp_status));
2740 		rval = QLA_FUNCTION_FAILED;
2741 	} else if (vpmod->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
2742 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2743 		    "-- completion status (%x).\n", __func__, pha->host_no,
2744 		    le16_to_cpu(vpmod->comp_status)));
2745 		rval = QLA_FUNCTION_FAILED;
2746 	} else {
2747 		/* EMPTY */
2748 		DEBUG11(printk("%s(%ld): done.\n", __func__, pha->host_no));
2749 		fc_vport_set_state(vha->fc_vport, FC_VPORT_INITIALIZING);
2750 	}
2751 	dma_pool_free(pha->s_dma_pool, vpmod, vpmod_dma);
2752 
2753 	return rval;
2754 }
2755 
2756 /*
2757  * qla24xx_control_vp
2758  *	Enable a virtual port for given host
2759  *
2760  * Input:
2761  *	ha = adapter block pointer.
2762  *	vhba = virtual adapter (unused)
2763  *	index = index number for enabled VP
2764  *
2765  * Returns:
2766  *	qla2xxx local function return status code.
2767  *
2768  * Context:
2769  *	Kernel context.
2770  */
2771 int
2772 qla24xx_control_vp(scsi_qla_host_t *vha, int cmd)
2773 {
2774 	int		rval;
2775 	int		map, pos;
2776 	struct vp_ctrl_entry_24xx   *vce;
2777 	dma_addr_t	vce_dma;
2778 	scsi_qla_host_t *ha = vha->parent;
2779 	int	vp_index = vha->vp_idx;
2780 
2781 	DEBUG11(printk("%s(%ld): entered. Enabling index %d\n", __func__,
2782 	    ha->host_no, vp_index));
2783 
2784 	if (vp_index == 0 || vp_index >= ha->max_npiv_vports)
2785 		return QLA_PARAMETER_ERROR;
2786 
2787 	vce = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vce_dma);
2788 	if (!vce) {
2789 		DEBUG2_3(printk("%s(%ld): "
2790 		    "failed to allocate VP Control IOCB.\n", __func__,
2791 		    ha->host_no));
2792 		return QLA_MEMORY_ALLOC_FAILED;
2793 	}
2794 	memset(vce, 0, sizeof(struct vp_ctrl_entry_24xx));
2795 
2796 	vce->entry_type = VP_CTRL_IOCB_TYPE;
2797 	vce->entry_count = 1;
2798 	vce->command = cpu_to_le16(cmd);
2799 	vce->vp_count = __constant_cpu_to_le16(1);
2800 
2801 	/* index map in firmware starts with 1; decrement index
2802 	 * this is ok as we never use index 0
2803 	 */
2804 	map = (vp_index - 1) / 8;
2805 	pos = (vp_index - 1) & 7;
2806 	mutex_lock(&ha->vport_lock);
2807 	vce->vp_idx_map[map] |= 1 << pos;
2808 	mutex_unlock(&ha->vport_lock);
2809 
2810 	rval = qla2x00_issue_iocb(ha, vce, vce_dma, 0);
2811 	if (rval != QLA_SUCCESS) {
2812 		DEBUG2_3_11(printk("%s(%ld): failed to issue VP control IOCB"
2813 		    "(%x).\n", __func__, ha->host_no, rval));
2814 		printk("%s(%ld): failed to issue VP control IOCB"
2815 		    "(%x).\n", __func__, ha->host_no, rval);
2816 	} else if (vce->entry_status != 0) {
2817 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2818 		    "-- error status (%x).\n", __func__, ha->host_no,
2819 		    vce->entry_status));
2820 		printk("%s(%ld): failed to complete IOCB "
2821 		    "-- error status (%x).\n", __func__, ha->host_no,
2822 		    vce->entry_status);
2823 		rval = QLA_FUNCTION_FAILED;
2824 	} else if (vce->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
2825 		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
2826 		    "-- completion status (%x).\n", __func__, ha->host_no,
2827 		    le16_to_cpu(vce->comp_status)));
2828 		printk("%s(%ld): failed to complete IOCB "
2829 		    "-- completion status (%x).\n", __func__, ha->host_no,
2830 		    le16_to_cpu(vce->comp_status));
2831 		rval = QLA_FUNCTION_FAILED;
2832 	} else {
2833 		DEBUG2(printk("%s(%ld): done.\n", __func__, ha->host_no));
2834 	}
2835 
2836 	dma_pool_free(ha->s_dma_pool, vce, vce_dma);
2837 
2838 	return rval;
2839 }
2840 
2841 /*
2842  * qla2x00_send_change_request
2843  *	Receive or disable RSCN request from fabric controller
2844  *
2845  * Input:
2846  *	ha = adapter block pointer
2847  *	format = registration format:
2848  *		0 - Reserved
2849  *		1 - Fabric detected registration
2850  *		2 - N_port detected registration
2851  *		3 - Full registration
2852  *		FF - clear registration
2853  *	vp_idx = Virtual port index
2854  *
2855  * Returns:
2856  *	qla2x00 local function return status code.
2857  *
2858  * Context:
2859  *	Kernel Context
2860  */
2861 
2862 int
2863 qla2x00_send_change_request(scsi_qla_host_t *ha, uint16_t format,
2864 			    uint16_t vp_idx)
2865 {
2866 	int rval;
2867 	mbx_cmd_t mc;
2868 	mbx_cmd_t *mcp = &mc;
2869 
2870 	/*
2871 	 * This command is implicitly executed by firmware during login for the
2872 	 * physical hosts
2873 	 */
2874 	if (vp_idx == 0)
2875 		return QLA_FUNCTION_FAILED;
2876 
2877 	mcp->mb[0] = MBC_SEND_CHANGE_REQUEST;
2878 	mcp->mb[1] = format;
2879 	mcp->mb[9] = vp_idx;
2880 	mcp->out_mb = MBX_9|MBX_1|MBX_0;
2881 	mcp->in_mb = MBX_0|MBX_1;
2882 	mcp->tov = MBX_TOV_SECONDS;
2883 	mcp->flags = 0;
2884 	rval = qla2x00_mailbox_command(ha, mcp);
2885 
2886 	if (rval == QLA_SUCCESS) {
2887 		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
2888 			rval = BIT_1;
2889 		}
2890 	} else
2891 		rval = BIT_1;
2892 
2893 	return rval;
2894 }
2895 
2896 int
2897 qla2x00_dump_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint32_t addr,
2898     uint32_t size)
2899 {
2900 	int rval;
2901 	mbx_cmd_t mc;
2902 	mbx_cmd_t *mcp = &mc;
2903 
2904 	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2905 
2906 	if (MSW(addr) || IS_FWI2_CAPABLE(ha)) {
2907 		mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED;
2908 		mcp->mb[8] = MSW(addr);
2909 		mcp->out_mb = MBX_8|MBX_0;
2910 	} else {
2911 		mcp->mb[0] = MBC_DUMP_RISC_RAM;
2912 		mcp->out_mb = MBX_0;
2913 	}
2914 	mcp->mb[1] = LSW(addr);
2915 	mcp->mb[2] = MSW(req_dma);
2916 	mcp->mb[3] = LSW(req_dma);
2917 	mcp->mb[6] = MSW(MSD(req_dma));
2918 	mcp->mb[7] = LSW(MSD(req_dma));
2919 	mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1;
2920 	if (IS_FWI2_CAPABLE(ha)) {
2921 		mcp->mb[4] = MSW(size);
2922 		mcp->mb[5] = LSW(size);
2923 		mcp->out_mb |= MBX_5|MBX_4;
2924 	} else {
2925 		mcp->mb[4] = LSW(size);
2926 		mcp->out_mb |= MBX_4;
2927 	}
2928 
2929 	mcp->in_mb = MBX_0;
2930 	mcp->tov = MBX_TOV_SECONDS;
2931 	mcp->flags = 0;
2932 	rval = qla2x00_mailbox_command(ha, mcp);
2933 
2934 	if (rval != QLA_SUCCESS) {
2935 		DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__,
2936 		    ha->host_no, rval, mcp->mb[0]));
2937 	} else {
2938 		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
2939 	}
2940 
2941 	return rval;
2942 }
2943 
2944 /* 84XX Support **************************************************************/
2945 
2946 struct cs84xx_mgmt_cmd {
2947 	union {
2948 		struct verify_chip_entry_84xx req;
2949 		struct verify_chip_rsp_84xx rsp;
2950 	} p;
2951 };
2952 
2953 int
2954 qla84xx_verify_chip(struct scsi_qla_host *ha, uint16_t *status)
2955 {
2956 	int rval, retry;
2957 	struct cs84xx_mgmt_cmd *mn;
2958 	dma_addr_t mn_dma;
2959 	uint16_t options;
2960 	unsigned long flags;
2961 
2962 	DEBUG16(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2963 
2964 	mn = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &mn_dma);
2965 	if (mn == NULL) {
2966 		DEBUG2_3(printk("%s(%ld): failed to allocate Verify ISP84XX "
2967 		    "IOCB.\n", __func__, ha->host_no));
2968 		return QLA_MEMORY_ALLOC_FAILED;
2969 	}
2970 
2971 	/* Force Update? */
2972 	options = ha->cs84xx->fw_update ? VCO_FORCE_UPDATE : 0;
2973 	/* Diagnostic firmware? */
2974 	/* options |= MENLO_DIAG_FW; */
2975 	/* We update the firmware with only one data sequence. */
2976 	options |= VCO_END_OF_DATA;
2977 
2978 	do {
2979 		retry = 0;
2980 		memset(mn, 0, sizeof(*mn));
2981 		mn->p.req.entry_type = VERIFY_CHIP_IOCB_TYPE;
2982 		mn->p.req.entry_count = 1;
2983 		mn->p.req.options = cpu_to_le16(options);
2984 
2985 		DEBUG16(printk("%s(%ld): Dump of Verify Request.\n", __func__,
2986 		    ha->host_no));
2987 		DEBUG16(qla2x00_dump_buffer((uint8_t *)mn,
2988 		    sizeof(*mn)));
2989 
2990 		rval = qla2x00_issue_iocb_timeout(ha, mn, mn_dma, 0, 120);
2991 		if (rval != QLA_SUCCESS) {
2992 			DEBUG2_16(printk("%s(%ld): failed to issue Verify "
2993 			    "IOCB (%x).\n", __func__, ha->host_no, rval));
2994 			goto verify_done;
2995 		}
2996 
2997 		DEBUG16(printk("%s(%ld): Dump of Verify Response.\n", __func__,
2998 		    ha->host_no));
2999 		DEBUG16(qla2x00_dump_buffer((uint8_t *)mn,
3000 		    sizeof(*mn)));
3001 
3002 		status[0] = le16_to_cpu(mn->p.rsp.comp_status);
3003 		status[1] = status[0] == CS_VCS_CHIP_FAILURE ?
3004 		    le16_to_cpu(mn->p.rsp.failure_code) : 0;
3005 		DEBUG2_16(printk("%s(%ld): cs=%x fc=%x\n", __func__,
3006 		    ha->host_no, status[0], status[1]));
3007 
3008 		if (status[0] != CS_COMPLETE) {
3009 			rval = QLA_FUNCTION_FAILED;
3010 			if (!(options & VCO_DONT_UPDATE_FW)) {
3011 				DEBUG2_16(printk("%s(%ld): Firmware update "
3012 				    "failed. Retrying without update "
3013 				    "firmware.\n", __func__, ha->host_no));
3014 				options |= VCO_DONT_UPDATE_FW;
3015 				options &= ~VCO_FORCE_UPDATE;
3016 				retry = 1;
3017 			}
3018 		} else {
3019 			DEBUG2_16(printk("%s(%ld): firmware updated to %x.\n",
3020 			    __func__, ha->host_no,
3021 			    le32_to_cpu(mn->p.rsp.fw_ver)));
3022 
3023 			/* NOTE: we only update OP firmware. */
3024 			spin_lock_irqsave(&ha->cs84xx->access_lock, flags);
3025 			ha->cs84xx->op_fw_version =
3026 			    le32_to_cpu(mn->p.rsp.fw_ver);
3027 			spin_unlock_irqrestore(&ha->cs84xx->access_lock,
3028 			    flags);
3029 		}
3030 	} while (retry);
3031 
3032 verify_done:
3033 	dma_pool_free(ha->s_dma_pool, mn, mn_dma);
3034 
3035 	if (rval != QLA_SUCCESS) {
3036 		DEBUG2_16(printk("%s(%ld): failed=%x.\n", __func__,
3037 		    ha->host_no, rval));
3038 	} else {
3039 		DEBUG16(printk("%s(%ld): done.\n", __func__, ha->host_no));
3040 	}
3041 
3042 	return rval;
3043 }
3044