xref: /openbmc/linux/drivers/scsi/qla2xxx/qla_mbx.c (revision 77a87824)
1 /*
2  * QLogic Fibre Channel HBA Driver
3  * Copyright (c)  2003-2014 QLogic Corporation
4  *
5  * See LICENSE.qla2xxx for copyright and licensing details.
6  */
7 #include "qla_def.h"
8 #include "qla_target.h"
9 
10 #include <linux/delay.h>
11 #include <linux/gfp.h>
12 
13 
14 /*
15  * qla2x00_mailbox_command
16  *	Issue mailbox command and waits for completion.
17  *
18  * Input:
19  *	ha = adapter block pointer.
20  *	mcp = driver internal mbx struct pointer.
21  *
22  * Output:
23  *	mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data.
24  *
25  * Returns:
26  *	0 : QLA_SUCCESS = cmd performed success
27  *	1 : QLA_FUNCTION_FAILED   (error encountered)
28  *	6 : QLA_FUNCTION_TIMEOUT (timeout condition encountered)
29  *
30  * Context:
31  *	Kernel context.
32  */
33 static int
34 qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
35 {
36 	int		rval, i;
37 	unsigned long    flags = 0;
38 	device_reg_t *reg;
39 	uint8_t		abort_active;
40 	uint8_t		io_lock_on;
41 	uint16_t	command = 0;
42 	uint16_t	*iptr;
43 	uint16_t __iomem *optr;
44 	uint32_t	cnt;
45 	uint32_t	mboxes;
46 	uint16_t __iomem *mbx_reg;
47 	unsigned long	wait_time;
48 	struct qla_hw_data *ha = vha->hw;
49 	scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
50 
51 
52 	ql_dbg(ql_dbg_mbx, vha, 0x1000, "Entered %s.\n", __func__);
53 
54 	if (ha->pdev->error_state > pci_channel_io_frozen) {
55 		ql_log(ql_log_warn, vha, 0x1001,
56 		    "error_state is greater than pci_channel_io_frozen, "
57 		    "exiting.\n");
58 		return QLA_FUNCTION_TIMEOUT;
59 	}
60 
61 	if (vha->device_flags & DFLG_DEV_FAILED) {
62 		ql_log(ql_log_warn, vha, 0x1002,
63 		    "Device in failed state, exiting.\n");
64 		return QLA_FUNCTION_TIMEOUT;
65 	}
66 
67 	 /* if PCI error, then avoid mbx processing.*/
68 	 if (test_bit(PCI_ERR, &base_vha->dpc_flags)) {
69 		ql_log(ql_log_warn, vha, 0x1191,
70 		    "PCI error, exiting.\n");
71 		return QLA_FUNCTION_TIMEOUT;
72 	 }
73 
74 	reg = ha->iobase;
75 	io_lock_on = base_vha->flags.init_done;
76 
77 	rval = QLA_SUCCESS;
78 	abort_active = test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
79 
80 
81 	if (ha->flags.pci_channel_io_perm_failure) {
82 		ql_log(ql_log_warn, vha, 0x1003,
83 		    "Perm failure on EEH timeout MBX, exiting.\n");
84 		return QLA_FUNCTION_TIMEOUT;
85 	}
86 
87 	if (IS_P3P_TYPE(ha) && ha->flags.isp82xx_fw_hung) {
88 		/* Setting Link-Down error */
89 		mcp->mb[0] = MBS_LINK_DOWN_ERROR;
90 		ql_log(ql_log_warn, vha, 0x1004,
91 		    "FW hung = %d.\n", ha->flags.isp82xx_fw_hung);
92 		return QLA_FUNCTION_TIMEOUT;
93 	}
94 
95 	/*
96 	 * Wait for active mailbox commands to finish by waiting at most tov
97 	 * seconds. This is to serialize actual issuing of mailbox cmds during
98 	 * non ISP abort time.
99 	 */
100 	if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) {
101 		/* Timeout occurred. Return error. */
102 		ql_log(ql_log_warn, vha, 0x1005,
103 		    "Cmd access timeout, cmd=0x%x, Exiting.\n",
104 		    mcp->mb[0]);
105 		return QLA_FUNCTION_TIMEOUT;
106 	}
107 
108 	ha->flags.mbox_busy = 1;
109 	/* Save mailbox command for debug */
110 	ha->mcp = mcp;
111 
112 	ql_dbg(ql_dbg_mbx, vha, 0x1006,
113 	    "Prepare to issue mbox cmd=0x%x.\n", mcp->mb[0]);
114 
115 	spin_lock_irqsave(&ha->hardware_lock, flags);
116 
117 	/* Load mailbox registers. */
118 	if (IS_P3P_TYPE(ha))
119 		optr = (uint16_t __iomem *)&reg->isp82.mailbox_in[0];
120 	else if (IS_FWI2_CAPABLE(ha) && !(IS_P3P_TYPE(ha)))
121 		optr = (uint16_t __iomem *)&reg->isp24.mailbox0;
122 	else
123 		optr = (uint16_t __iomem *)MAILBOX_REG(ha, &reg->isp, 0);
124 
125 	iptr = mcp->mb;
126 	command = mcp->mb[0];
127 	mboxes = mcp->out_mb;
128 
129 	ql_dbg(ql_dbg_mbx, vha, 0x1111,
130 	    "Mailbox registers (OUT):\n");
131 	for (cnt = 0; cnt < ha->mbx_count; cnt++) {
132 		if (IS_QLA2200(ha) && cnt == 8)
133 			optr =
134 			    (uint16_t __iomem *)MAILBOX_REG(ha, &reg->isp, 8);
135 		if (mboxes & BIT_0) {
136 			ql_dbg(ql_dbg_mbx, vha, 0x1112,
137 			    "mbox[%d]<-0x%04x\n", cnt, *iptr);
138 			WRT_REG_WORD(optr, *iptr);
139 		}
140 
141 		mboxes >>= 1;
142 		optr++;
143 		iptr++;
144 	}
145 
146 	ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1117,
147 	    "I/O Address = %p.\n", optr);
148 
149 	/* Issue set host interrupt command to send cmd out. */
150 	ha->flags.mbox_int = 0;
151 	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
152 
153 	/* Unlock mbx registers and wait for interrupt */
154 	ql_dbg(ql_dbg_mbx, vha, 0x100f,
155 	    "Going to unlock irq & waiting for interrupts. "
156 	    "jiffies=%lx.\n", jiffies);
157 
158 	/* Wait for mbx cmd completion until timeout */
159 
160 	if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) {
161 		set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
162 
163 		if (IS_P3P_TYPE(ha)) {
164 			if (RD_REG_DWORD(&reg->isp82.hint) &
165 				HINT_MBX_INT_PENDING) {
166 				spin_unlock_irqrestore(&ha->hardware_lock,
167 					flags);
168 				ha->flags.mbox_busy = 0;
169 				ql_dbg(ql_dbg_mbx, vha, 0x1010,
170 				    "Pending mailbox timeout, exiting.\n");
171 				rval = QLA_FUNCTION_TIMEOUT;
172 				goto premature_exit;
173 			}
174 			WRT_REG_DWORD(&reg->isp82.hint, HINT_MBX_INT_PENDING);
175 		} else if (IS_FWI2_CAPABLE(ha))
176 			WRT_REG_DWORD(&reg->isp24.hccr, HCCRX_SET_HOST_INT);
177 		else
178 			WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
179 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
180 
181 		if (!wait_for_completion_timeout(&ha->mbx_intr_comp,
182 		    mcp->tov * HZ)) {
183 			ql_dbg(ql_dbg_mbx, vha, 0x117a,
184 			    "cmd=%x Timeout.\n", command);
185 			spin_lock_irqsave(&ha->hardware_lock, flags);
186 			clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
187 			spin_unlock_irqrestore(&ha->hardware_lock, flags);
188 		}
189 	} else {
190 		ql_dbg(ql_dbg_mbx, vha, 0x1011,
191 		    "Cmd=%x Polling Mode.\n", command);
192 
193 		if (IS_P3P_TYPE(ha)) {
194 			if (RD_REG_DWORD(&reg->isp82.hint) &
195 				HINT_MBX_INT_PENDING) {
196 				spin_unlock_irqrestore(&ha->hardware_lock,
197 					flags);
198 				ha->flags.mbox_busy = 0;
199 				ql_dbg(ql_dbg_mbx, vha, 0x1012,
200 				    "Pending mailbox timeout, exiting.\n");
201 				rval = QLA_FUNCTION_TIMEOUT;
202 				goto premature_exit;
203 			}
204 			WRT_REG_DWORD(&reg->isp82.hint, HINT_MBX_INT_PENDING);
205 		} else if (IS_FWI2_CAPABLE(ha))
206 			WRT_REG_DWORD(&reg->isp24.hccr, HCCRX_SET_HOST_INT);
207 		else
208 			WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
209 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
210 
211 		wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */
212 		while (!ha->flags.mbox_int) {
213 			if (time_after(jiffies, wait_time))
214 				break;
215 
216 			/* Check for pending interrupts. */
217 			qla2x00_poll(ha->rsp_q_map[0]);
218 
219 			if (!ha->flags.mbox_int &&
220 			    !(IS_QLA2200(ha) &&
221 			    command == MBC_LOAD_RISC_RAM_EXTENDED))
222 				msleep(10);
223 		} /* while */
224 		ql_dbg(ql_dbg_mbx, vha, 0x1013,
225 		    "Waited %d sec.\n",
226 		    (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ));
227 	}
228 
229 	/* Check whether we timed out */
230 	if (ha->flags.mbox_int) {
231 		uint16_t *iptr2;
232 
233 		ql_dbg(ql_dbg_mbx, vha, 0x1014,
234 		    "Cmd=%x completed.\n", command);
235 
236 		/* Got interrupt. Clear the flag. */
237 		ha->flags.mbox_int = 0;
238 		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
239 
240 		if (IS_P3P_TYPE(ha) && ha->flags.isp82xx_fw_hung) {
241 			ha->flags.mbox_busy = 0;
242 			/* Setting Link-Down error */
243 			mcp->mb[0] = MBS_LINK_DOWN_ERROR;
244 			ha->mcp = NULL;
245 			rval = QLA_FUNCTION_FAILED;
246 			ql_log(ql_log_warn, vha, 0x1015,
247 			    "FW hung = %d.\n", ha->flags.isp82xx_fw_hung);
248 			goto premature_exit;
249 		}
250 
251 		if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE)
252 			rval = QLA_FUNCTION_FAILED;
253 
254 		/* Load return mailbox registers. */
255 		iptr2 = mcp->mb;
256 		iptr = (uint16_t *)&ha->mailbox_out[0];
257 		mboxes = mcp->in_mb;
258 
259 		ql_dbg(ql_dbg_mbx, vha, 0x1113,
260 		    "Mailbox registers (IN):\n");
261 		for (cnt = 0; cnt < ha->mbx_count; cnt++) {
262 			if (mboxes & BIT_0) {
263 				*iptr2 = *iptr;
264 				ql_dbg(ql_dbg_mbx, vha, 0x1114,
265 				    "mbox[%d]->0x%04x\n", cnt, *iptr2);
266 			}
267 
268 			mboxes >>= 1;
269 			iptr2++;
270 			iptr++;
271 		}
272 	} else {
273 
274 		uint16_t mb0;
275 		uint32_t ictrl;
276 		uint16_t        w;
277 
278 		if (IS_FWI2_CAPABLE(ha)) {
279 			mb0 = RD_REG_WORD(&reg->isp24.mailbox0);
280 			ictrl = RD_REG_DWORD(&reg->isp24.ictrl);
281 		} else {
282 			mb0 = RD_MAILBOX_REG(ha, &reg->isp, 0);
283 			ictrl = RD_REG_WORD(&reg->isp.ictrl);
284 		}
285 		ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1119,
286 		    "MBX Command timeout for cmd %x, iocontrol=%x jiffies=%lx "
287 		    "mb[0]=0x%x\n", command, ictrl, jiffies, mb0);
288 		ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1019);
289 
290 		/* Capture FW dump only, if PCI device active */
291 		if (!pci_channel_offline(vha->hw->pdev)) {
292 			pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w);
293 			if (w == 0xffff || ictrl == 0xffffffff) {
294 				/* This is special case if there is unload
295 				 * of driver happening and if PCI device go
296 				 * into bad state due to PCI error condition
297 				 * then only PCI ERR flag would be set.
298 				 * we will do premature exit for above case.
299 				 */
300 				if (test_bit(UNLOADING, &base_vha->dpc_flags))
301 					set_bit(PCI_ERR, &base_vha->dpc_flags);
302 				ha->flags.mbox_busy = 0;
303 				rval = QLA_FUNCTION_TIMEOUT;
304 				goto premature_exit;
305 			}
306 
307 			/* Attempt to capture firmware dump for further
308 			 * anallysis of the current formware state. we do not
309 			 * need to do this if we are intentionally generating
310 			 * a dump
311 			 */
312 			if (mcp->mb[0] != MBC_GEN_SYSTEM_ERROR)
313 				ha->isp_ops->fw_dump(vha, 0);
314 			rval = QLA_FUNCTION_TIMEOUT;
315 		 }
316 	}
317 
318 	ha->flags.mbox_busy = 0;
319 
320 	/* Clean up */
321 	ha->mcp = NULL;
322 
323 	if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) {
324 		ql_dbg(ql_dbg_mbx, vha, 0x101a,
325 		    "Checking for additional resp interrupt.\n");
326 
327 		/* polling mode for non isp_abort commands. */
328 		qla2x00_poll(ha->rsp_q_map[0]);
329 	}
330 
331 	if (rval == QLA_FUNCTION_TIMEOUT &&
332 	    mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) {
333 		if (!io_lock_on || (mcp->flags & IOCTL_CMD) ||
334 		    ha->flags.eeh_busy) {
335 			/* not in dpc. schedule it for dpc to take over. */
336 			ql_dbg(ql_dbg_mbx, vha, 0x101b,
337 			    "Timeout, schedule isp_abort_needed.\n");
338 
339 			if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) &&
340 			    !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
341 			    !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
342 				if (IS_QLA82XX(ha)) {
343 					ql_dbg(ql_dbg_mbx, vha, 0x112a,
344 					    "disabling pause transmit on port "
345 					    "0 & 1.\n");
346 					qla82xx_wr_32(ha,
347 					    QLA82XX_CRB_NIU + 0x98,
348 					    CRB_NIU_XG_PAUSE_CTL_P0|
349 					    CRB_NIU_XG_PAUSE_CTL_P1);
350 				}
351 				ql_log(ql_log_info, base_vha, 0x101c,
352 				    "Mailbox cmd timeout occurred, cmd=0x%x, "
353 				    "mb[0]=0x%x, eeh_busy=0x%x. Scheduling ISP "
354 				    "abort.\n", command, mcp->mb[0],
355 				    ha->flags.eeh_busy);
356 				set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
357 				qla2xxx_wake_dpc(vha);
358 			}
359 		} else if (!abort_active) {
360 			/* call abort directly since we are in the DPC thread */
361 			ql_dbg(ql_dbg_mbx, vha, 0x101d,
362 			    "Timeout, calling abort_isp.\n");
363 
364 			if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) &&
365 			    !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
366 			    !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
367 				if (IS_QLA82XX(ha)) {
368 					ql_dbg(ql_dbg_mbx, vha, 0x112b,
369 					    "disabling pause transmit on port "
370 					    "0 & 1.\n");
371 					qla82xx_wr_32(ha,
372 					    QLA82XX_CRB_NIU + 0x98,
373 					    CRB_NIU_XG_PAUSE_CTL_P0|
374 					    CRB_NIU_XG_PAUSE_CTL_P1);
375 				}
376 				ql_log(ql_log_info, base_vha, 0x101e,
377 				    "Mailbox cmd timeout occurred, cmd=0x%x, "
378 				    "mb[0]=0x%x. Scheduling ISP abort ",
379 				    command, mcp->mb[0]);
380 				set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
381 				clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
382 				/* Allow next mbx cmd to come in. */
383 				complete(&ha->mbx_cmd_comp);
384 				if (ha->isp_ops->abort_isp(vha)) {
385 					/* Failed. retry later. */
386 					set_bit(ISP_ABORT_NEEDED,
387 					    &vha->dpc_flags);
388 				}
389 				clear_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
390 				ql_dbg(ql_dbg_mbx, vha, 0x101f,
391 				    "Finished abort_isp.\n");
392 				goto mbx_done;
393 			}
394 		}
395 	}
396 
397 premature_exit:
398 	/* Allow next mbx cmd to come in. */
399 	complete(&ha->mbx_cmd_comp);
400 
401 mbx_done:
402 	if (rval) {
403 		ql_dbg(ql_dbg_disc, base_vha, 0x1020,
404 		    "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n",
405 		    mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command);
406 
407 		ql_dbg(ql_dbg_mbx, vha, 0x1198,
408 		    "host status: 0x%x, flags:0x%lx, intr ctrl reg:0x%x, intr status:0x%x\n",
409 		    RD_REG_DWORD(&reg->isp24.host_status),
410 		    ha->fw_dump_cap_flags,
411 		    RD_REG_DWORD(&reg->isp24.ictrl),
412 		    RD_REG_DWORD(&reg->isp24.istatus));
413 
414 		mbx_reg = &reg->isp24.mailbox0;
415 		for (i = 0; i < 6; i++)
416 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1199,
417 			    "mbox[%d] 0x%04x\n", i, RD_REG_WORD(mbx_reg++));
418 	} else {
419 		ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__);
420 	}
421 
422 	return rval;
423 }
424 
425 int
426 qla2x00_load_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t risc_addr,
427     uint32_t risc_code_size)
428 {
429 	int rval;
430 	struct qla_hw_data *ha = vha->hw;
431 	mbx_cmd_t mc;
432 	mbx_cmd_t *mcp = &mc;
433 
434 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1022,
435 	    "Entered %s.\n", __func__);
436 
437 	if (MSW(risc_addr) || IS_FWI2_CAPABLE(ha)) {
438 		mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
439 		mcp->mb[8] = MSW(risc_addr);
440 		mcp->out_mb = MBX_8|MBX_0;
441 	} else {
442 		mcp->mb[0] = MBC_LOAD_RISC_RAM;
443 		mcp->out_mb = MBX_0;
444 	}
445 	mcp->mb[1] = LSW(risc_addr);
446 	mcp->mb[2] = MSW(req_dma);
447 	mcp->mb[3] = LSW(req_dma);
448 	mcp->mb[6] = MSW(MSD(req_dma));
449 	mcp->mb[7] = LSW(MSD(req_dma));
450 	mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1;
451 	if (IS_FWI2_CAPABLE(ha)) {
452 		mcp->mb[4] = MSW(risc_code_size);
453 		mcp->mb[5] = LSW(risc_code_size);
454 		mcp->out_mb |= MBX_5|MBX_4;
455 	} else {
456 		mcp->mb[4] = LSW(risc_code_size);
457 		mcp->out_mb |= MBX_4;
458 	}
459 
460 	mcp->in_mb = MBX_0;
461 	mcp->tov = MBX_TOV_SECONDS;
462 	mcp->flags = 0;
463 	rval = qla2x00_mailbox_command(vha, mcp);
464 
465 	if (rval != QLA_SUCCESS) {
466 		ql_dbg(ql_dbg_mbx, vha, 0x1023,
467 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
468 	} else {
469 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1024,
470 		    "Done %s.\n", __func__);
471 	}
472 
473 	return rval;
474 }
475 
476 #define	EXTENDED_BB_CREDITS	BIT_0
477 /*
478  * qla2x00_execute_fw
479  *     Start adapter firmware.
480  *
481  * Input:
482  *     ha = adapter block pointer.
483  *     TARGET_QUEUE_LOCK must be released.
484  *     ADAPTER_STATE_LOCK must be released.
485  *
486  * Returns:
487  *     qla2x00 local function return status code.
488  *
489  * Context:
490  *     Kernel context.
491  */
492 int
493 qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
494 {
495 	int rval;
496 	struct qla_hw_data *ha = vha->hw;
497 	mbx_cmd_t mc;
498 	mbx_cmd_t *mcp = &mc;
499 
500 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1025,
501 	    "Entered %s.\n", __func__);
502 
503 	mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
504 	mcp->out_mb = MBX_0;
505 	mcp->in_mb = MBX_0;
506 	if (IS_FWI2_CAPABLE(ha)) {
507 		mcp->mb[1] = MSW(risc_addr);
508 		mcp->mb[2] = LSW(risc_addr);
509 		mcp->mb[3] = 0;
510 		if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) ||
511 		    IS_QLA27XX(ha)) {
512 			struct nvram_81xx *nv = ha->nvram;
513 			mcp->mb[4] = (nv->enhanced_features &
514 			    EXTENDED_BB_CREDITS);
515 		} else
516 			mcp->mb[4] = 0;
517 
518 		if (ha->flags.exlogins_enabled)
519 			mcp->mb[4] |= ENABLE_EXTENDED_LOGIN;
520 
521 		if (ha->flags.exchoffld_enabled)
522 			mcp->mb[4] |= ENABLE_EXCHANGE_OFFLD;
523 
524 		mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1;
525 		mcp->in_mb |= MBX_1;
526 	} else {
527 		mcp->mb[1] = LSW(risc_addr);
528 		mcp->out_mb |= MBX_1;
529 		if (IS_QLA2322(ha) || IS_QLA6322(ha)) {
530 			mcp->mb[2] = 0;
531 			mcp->out_mb |= MBX_2;
532 		}
533 	}
534 
535 	mcp->tov = MBX_TOV_SECONDS;
536 	mcp->flags = 0;
537 	rval = qla2x00_mailbox_command(vha, mcp);
538 
539 	if (rval != QLA_SUCCESS) {
540 		ql_dbg(ql_dbg_mbx, vha, 0x1026,
541 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
542 	} else {
543 		if (IS_FWI2_CAPABLE(ha)) {
544 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1027,
545 			    "Done exchanges=%x.\n", mcp->mb[1]);
546 		} else {
547 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1028,
548 			    "Done %s.\n", __func__);
549 		}
550 	}
551 
552 	return rval;
553 }
554 
555 /*
556  * qla_get_exlogin_status
557  *	Get extended login status
558  *	uses the memory offload control/status Mailbox
559  *
560  * Input:
561  *	ha:		adapter state pointer.
562  *	fwopt:		firmware options
563  *
564  * Returns:
565  *	qla2x00 local function status
566  *
567  * Context:
568  *	Kernel context.
569  */
570 #define	FETCH_XLOGINS_STAT	0x8
571 int
572 qla_get_exlogin_status(scsi_qla_host_t *vha, uint16_t *buf_sz,
573 	uint16_t *ex_logins_cnt)
574 {
575 	int rval;
576 	mbx_cmd_t	mc;
577 	mbx_cmd_t	*mcp = &mc;
578 
579 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x118f,
580 	    "Entered %s\n", __func__);
581 
582 	memset(mcp->mb, 0 , sizeof(mcp->mb));
583 	mcp->mb[0] = MBC_GET_MEM_OFFLOAD_CNTRL_STAT;
584 	mcp->mb[1] = FETCH_XLOGINS_STAT;
585 	mcp->out_mb = MBX_1|MBX_0;
586 	mcp->in_mb = MBX_10|MBX_4|MBX_0;
587 	mcp->tov = MBX_TOV_SECONDS;
588 	mcp->flags = 0;
589 
590 	rval = qla2x00_mailbox_command(vha, mcp);
591 	if (rval != QLA_SUCCESS) {
592 		ql_dbg(ql_dbg_mbx, vha, 0x1115, "Failed=%x.\n", rval);
593 	} else {
594 		*buf_sz = mcp->mb[4];
595 		*ex_logins_cnt = mcp->mb[10];
596 
597 		ql_log(ql_log_info, vha, 0x1190,
598 		    "buffer size 0x%x, exchange login count=%d\n",
599 		    mcp->mb[4], mcp->mb[10]);
600 
601 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1116,
602 		    "Done %s.\n", __func__);
603 	}
604 
605 	return rval;
606 }
607 
608 /*
609  * qla_set_exlogin_mem_cfg
610  *	set extended login memory configuration
611  *	Mbx needs to be issues before init_cb is set
612  *
613  * Input:
614  *	ha:		adapter state pointer.
615  *	buffer:		buffer pointer
616  *	phys_addr:	physical address of buffer
617  *	size:		size of buffer
618  *	TARGET_QUEUE_LOCK must be released
619  *	ADAPTER_STATE_LOCK must be release
620  *
621  * Returns:
622  *	qla2x00 local funxtion status code.
623  *
624  * Context:
625  *	Kernel context.
626  */
627 #define CONFIG_XLOGINS_MEM	0x3
628 int
629 qla_set_exlogin_mem_cfg(scsi_qla_host_t *vha, dma_addr_t phys_addr)
630 {
631 	int		rval;
632 	mbx_cmd_t	mc;
633 	mbx_cmd_t	*mcp = &mc;
634 	struct qla_hw_data *ha = vha->hw;
635 	int configured_count;
636 
637 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x111a,
638 	    "Entered %s.\n", __func__);
639 
640 	memset(mcp->mb, 0 , sizeof(mcp->mb));
641 	mcp->mb[0] = MBC_GET_MEM_OFFLOAD_CNTRL_STAT;
642 	mcp->mb[1] = CONFIG_XLOGINS_MEM;
643 	mcp->mb[2] = MSW(phys_addr);
644 	mcp->mb[3] = LSW(phys_addr);
645 	mcp->mb[6] = MSW(MSD(phys_addr));
646 	mcp->mb[7] = LSW(MSD(phys_addr));
647 	mcp->mb[8] = MSW(ha->exlogin_size);
648 	mcp->mb[9] = LSW(ha->exlogin_size);
649 	mcp->out_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
650 	mcp->in_mb = MBX_11|MBX_0;
651 	mcp->tov = MBX_TOV_SECONDS;
652 	mcp->flags = 0;
653 	rval = qla2x00_mailbox_command(vha, mcp);
654 	if (rval != QLA_SUCCESS) {
655 		/*EMPTY*/
656 		ql_dbg(ql_dbg_mbx, vha, 0x111b, "Failed=%x.\n", rval);
657 	} else {
658 		configured_count = mcp->mb[11];
659 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x118c,
660 		    "Done %s.\n", __func__);
661 	}
662 
663 	return rval;
664 }
665 
666 /*
667  * qla_get_exchoffld_status
668  *	Get exchange offload status
669  *	uses the memory offload control/status Mailbox
670  *
671  * Input:
672  *	ha:		adapter state pointer.
673  *	fwopt:		firmware options
674  *
675  * Returns:
676  *	qla2x00 local function status
677  *
678  * Context:
679  *	Kernel context.
680  */
681 #define	FETCH_XCHOFFLD_STAT	0x2
682 int
683 qla_get_exchoffld_status(scsi_qla_host_t *vha, uint16_t *buf_sz,
684 	uint16_t *ex_logins_cnt)
685 {
686 	int rval;
687 	mbx_cmd_t	mc;
688 	mbx_cmd_t	*mcp = &mc;
689 
690 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1019,
691 	    "Entered %s\n", __func__);
692 
693 	memset(mcp->mb, 0 , sizeof(mcp->mb));
694 	mcp->mb[0] = MBC_GET_MEM_OFFLOAD_CNTRL_STAT;
695 	mcp->mb[1] = FETCH_XCHOFFLD_STAT;
696 	mcp->out_mb = MBX_1|MBX_0;
697 	mcp->in_mb = MBX_10|MBX_4|MBX_0;
698 	mcp->tov = MBX_TOV_SECONDS;
699 	mcp->flags = 0;
700 
701 	rval = qla2x00_mailbox_command(vha, mcp);
702 	if (rval != QLA_SUCCESS) {
703 		ql_dbg(ql_dbg_mbx, vha, 0x1155, "Failed=%x.\n", rval);
704 	} else {
705 		*buf_sz = mcp->mb[4];
706 		*ex_logins_cnt = mcp->mb[10];
707 
708 		ql_log(ql_log_info, vha, 0x118e,
709 		    "buffer size 0x%x, exchange offload count=%d\n",
710 		    mcp->mb[4], mcp->mb[10]);
711 
712 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1156,
713 		    "Done %s.\n", __func__);
714 	}
715 
716 	return rval;
717 }
718 
719 /*
720  * qla_set_exchoffld_mem_cfg
721  *	Set exchange offload memory configuration
722  *	Mbx needs to be issues before init_cb is set
723  *
724  * Input:
725  *	ha:		adapter state pointer.
726  *	buffer:		buffer pointer
727  *	phys_addr:	physical address of buffer
728  *	size:		size of buffer
729  *	TARGET_QUEUE_LOCK must be released
730  *	ADAPTER_STATE_LOCK must be release
731  *
732  * Returns:
733  *	qla2x00 local funxtion status code.
734  *
735  * Context:
736  *	Kernel context.
737  */
738 #define CONFIG_XCHOFFLD_MEM	0x3
739 int
740 qla_set_exchoffld_mem_cfg(scsi_qla_host_t *vha, dma_addr_t phys_addr)
741 {
742 	int		rval;
743 	mbx_cmd_t	mc;
744 	mbx_cmd_t	*mcp = &mc;
745 	struct qla_hw_data *ha = vha->hw;
746 
747 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1157,
748 	    "Entered %s.\n", __func__);
749 
750 	memset(mcp->mb, 0 , sizeof(mcp->mb));
751 	mcp->mb[0] = MBC_GET_MEM_OFFLOAD_CNTRL_STAT;
752 	mcp->mb[1] = CONFIG_XCHOFFLD_MEM;
753 	mcp->mb[2] = MSW(phys_addr);
754 	mcp->mb[3] = LSW(phys_addr);
755 	mcp->mb[6] = MSW(MSD(phys_addr));
756 	mcp->mb[7] = LSW(MSD(phys_addr));
757 	mcp->mb[8] = MSW(ha->exlogin_size);
758 	mcp->mb[9] = LSW(ha->exlogin_size);
759 	mcp->out_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
760 	mcp->in_mb = MBX_11|MBX_0;
761 	mcp->tov = MBX_TOV_SECONDS;
762 	mcp->flags = 0;
763 	rval = qla2x00_mailbox_command(vha, mcp);
764 	if (rval != QLA_SUCCESS) {
765 		/*EMPTY*/
766 		ql_dbg(ql_dbg_mbx, vha, 0x1158, "Failed=%x.\n", rval);
767 	} else {
768 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1192,
769 		    "Done %s.\n", __func__);
770 	}
771 
772 	return rval;
773 }
774 
775 /*
776  * qla2x00_get_fw_version
777  *	Get firmware version.
778  *
779  * Input:
780  *	ha:		adapter state pointer.
781  *	major:		pointer for major number.
782  *	minor:		pointer for minor number.
783  *	subminor:	pointer for subminor number.
784  *
785  * Returns:
786  *	qla2x00 local function return status code.
787  *
788  * Context:
789  *	Kernel context.
790  */
791 int
792 qla2x00_get_fw_version(scsi_qla_host_t *vha)
793 {
794 	int		rval;
795 	mbx_cmd_t	mc;
796 	mbx_cmd_t	*mcp = &mc;
797 	struct qla_hw_data *ha = vha->hw;
798 
799 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1029,
800 	    "Entered %s.\n", __func__);
801 
802 	mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
803 	mcp->out_mb = MBX_0;
804 	mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
805 	if (IS_QLA81XX(vha->hw) || IS_QLA8031(ha) || IS_QLA8044(ha))
806 		mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8;
807 	if (IS_FWI2_CAPABLE(ha))
808 		mcp->in_mb |= MBX_17|MBX_16|MBX_15;
809 	if (IS_QLA27XX(ha))
810 		mcp->in_mb |=
811 		    MBX_25|MBX_24|MBX_23|MBX_22|MBX_21|MBX_20|MBX_19|MBX_18|
812 		    MBX_14|MBX_13|MBX_11|MBX_10|MBX_9|MBX_8;
813 
814 	mcp->flags = 0;
815 	mcp->tov = MBX_TOV_SECONDS;
816 	rval = qla2x00_mailbox_command(vha, mcp);
817 	if (rval != QLA_SUCCESS)
818 		goto failed;
819 
820 	/* Return mailbox data. */
821 	ha->fw_major_version = mcp->mb[1];
822 	ha->fw_minor_version = mcp->mb[2];
823 	ha->fw_subminor_version = mcp->mb[3];
824 	ha->fw_attributes = mcp->mb[6];
825 	if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw))
826 		ha->fw_memory_size = 0x1FFFF;		/* Defaults to 128KB. */
827 	else
828 		ha->fw_memory_size = (mcp->mb[5] << 16) | mcp->mb[4];
829 
830 	if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) || IS_QLA8044(ha)) {
831 		ha->mpi_version[0] = mcp->mb[10] & 0xff;
832 		ha->mpi_version[1] = mcp->mb[11] >> 8;
833 		ha->mpi_version[2] = mcp->mb[11] & 0xff;
834 		ha->mpi_capabilities = (mcp->mb[12] << 16) | mcp->mb[13];
835 		ha->phy_version[0] = mcp->mb[8] & 0xff;
836 		ha->phy_version[1] = mcp->mb[9] >> 8;
837 		ha->phy_version[2] = mcp->mb[9] & 0xff;
838 	}
839 
840 	if (IS_FWI2_CAPABLE(ha)) {
841 		ha->fw_attributes_h = mcp->mb[15];
842 		ha->fw_attributes_ext[0] = mcp->mb[16];
843 		ha->fw_attributes_ext[1] = mcp->mb[17];
844 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1139,
845 		    "%s: FW_attributes Upper: 0x%x, Lower: 0x%x.\n",
846 		    __func__, mcp->mb[15], mcp->mb[6]);
847 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x112f,
848 		    "%s: Ext_FwAttributes Upper: 0x%x, Lower: 0x%x.\n",
849 		    __func__, mcp->mb[17], mcp->mb[16]);
850 
851 		if (ha->fw_attributes_h & 0x4)
852 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x118d,
853 			    "%s: Firmware supports Extended Login 0x%x\n",
854 			    __func__, ha->fw_attributes_h);
855 
856 		if (ha->fw_attributes_h & 0x8)
857 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1191,
858 			    "%s: Firmware supports Exchange Offload 0x%x\n",
859 			    __func__, ha->fw_attributes_h);
860 	}
861 
862 	if (IS_QLA27XX(ha)) {
863 		ha->mpi_version[0] = mcp->mb[10] & 0xff;
864 		ha->mpi_version[1] = mcp->mb[11] >> 8;
865 		ha->mpi_version[2] = mcp->mb[11] & 0xff;
866 		ha->pep_version[0] = mcp->mb[13] & 0xff;
867 		ha->pep_version[1] = mcp->mb[14] >> 8;
868 		ha->pep_version[2] = mcp->mb[14] & 0xff;
869 		ha->fw_shared_ram_start = (mcp->mb[19] << 16) | mcp->mb[18];
870 		ha->fw_shared_ram_end = (mcp->mb[21] << 16) | mcp->mb[20];
871 		ha->fw_ddr_ram_start = (mcp->mb[23] << 16) | mcp->mb[22];
872 		ha->fw_ddr_ram_end = (mcp->mb[25] << 16) | mcp->mb[24];
873 	}
874 
875 failed:
876 	if (rval != QLA_SUCCESS) {
877 		/*EMPTY*/
878 		ql_dbg(ql_dbg_mbx, vha, 0x102a, "Failed=%x.\n", rval);
879 	} else {
880 		/*EMPTY*/
881 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102b,
882 		    "Done %s.\n", __func__);
883 	}
884 	return rval;
885 }
886 
887 /*
888  * qla2x00_get_fw_options
889  *	Set firmware options.
890  *
891  * Input:
892  *	ha = adapter block pointer.
893  *	fwopt = pointer for firmware options.
894  *
895  * Returns:
896  *	qla2x00 local function return status code.
897  *
898  * Context:
899  *	Kernel context.
900  */
901 int
902 qla2x00_get_fw_options(scsi_qla_host_t *vha, uint16_t *fwopts)
903 {
904 	int rval;
905 	mbx_cmd_t mc;
906 	mbx_cmd_t *mcp = &mc;
907 
908 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102c,
909 	    "Entered %s.\n", __func__);
910 
911 	mcp->mb[0] = MBC_GET_FIRMWARE_OPTION;
912 	mcp->out_mb = MBX_0;
913 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
914 	mcp->tov = MBX_TOV_SECONDS;
915 	mcp->flags = 0;
916 	rval = qla2x00_mailbox_command(vha, mcp);
917 
918 	if (rval != QLA_SUCCESS) {
919 		/*EMPTY*/
920 		ql_dbg(ql_dbg_mbx, vha, 0x102d, "Failed=%x.\n", rval);
921 	} else {
922 		fwopts[0] = mcp->mb[0];
923 		fwopts[1] = mcp->mb[1];
924 		fwopts[2] = mcp->mb[2];
925 		fwopts[3] = mcp->mb[3];
926 
927 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102e,
928 		    "Done %s.\n", __func__);
929 	}
930 
931 	return rval;
932 }
933 
934 
935 /*
936  * qla2x00_set_fw_options
937  *	Set firmware options.
938  *
939  * Input:
940  *	ha = adapter block pointer.
941  *	fwopt = pointer for firmware options.
942  *
943  * Returns:
944  *	qla2x00 local function return status code.
945  *
946  * Context:
947  *	Kernel context.
948  */
949 int
950 qla2x00_set_fw_options(scsi_qla_host_t *vha, uint16_t *fwopts)
951 {
952 	int rval;
953 	mbx_cmd_t mc;
954 	mbx_cmd_t *mcp = &mc;
955 
956 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102f,
957 	    "Entered %s.\n", __func__);
958 
959 	mcp->mb[0] = MBC_SET_FIRMWARE_OPTION;
960 	mcp->mb[1] = fwopts[1];
961 	mcp->mb[2] = fwopts[2];
962 	mcp->mb[3] = fwopts[3];
963 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
964 	mcp->in_mb = MBX_0;
965 	if (IS_FWI2_CAPABLE(vha->hw)) {
966 		mcp->in_mb |= MBX_1;
967 	} else {
968 		mcp->mb[10] = fwopts[10];
969 		mcp->mb[11] = fwopts[11];
970 		mcp->mb[12] = 0;	/* Undocumented, but used */
971 		mcp->out_mb |= MBX_12|MBX_11|MBX_10;
972 	}
973 	mcp->tov = MBX_TOV_SECONDS;
974 	mcp->flags = 0;
975 	rval = qla2x00_mailbox_command(vha, mcp);
976 
977 	fwopts[0] = mcp->mb[0];
978 
979 	if (rval != QLA_SUCCESS) {
980 		/*EMPTY*/
981 		ql_dbg(ql_dbg_mbx, vha, 0x1030,
982 		    "Failed=%x (%x/%x).\n", rval, mcp->mb[0], mcp->mb[1]);
983 	} else {
984 		/*EMPTY*/
985 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1031,
986 		    "Done %s.\n", __func__);
987 	}
988 
989 	return rval;
990 }
991 
992 /*
993  * qla2x00_mbx_reg_test
994  *	Mailbox register wrap test.
995  *
996  * Input:
997  *	ha = adapter block pointer.
998  *	TARGET_QUEUE_LOCK must be released.
999  *	ADAPTER_STATE_LOCK must be released.
1000  *
1001  * Returns:
1002  *	qla2x00 local function return status code.
1003  *
1004  * Context:
1005  *	Kernel context.
1006  */
1007 int
1008 qla2x00_mbx_reg_test(scsi_qla_host_t *vha)
1009 {
1010 	int rval;
1011 	mbx_cmd_t mc;
1012 	mbx_cmd_t *mcp = &mc;
1013 
1014 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1032,
1015 	    "Entered %s.\n", __func__);
1016 
1017 	mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
1018 	mcp->mb[1] = 0xAAAA;
1019 	mcp->mb[2] = 0x5555;
1020 	mcp->mb[3] = 0xAA55;
1021 	mcp->mb[4] = 0x55AA;
1022 	mcp->mb[5] = 0xA5A5;
1023 	mcp->mb[6] = 0x5A5A;
1024 	mcp->mb[7] = 0x2525;
1025 	mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
1026 	mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
1027 	mcp->tov = MBX_TOV_SECONDS;
1028 	mcp->flags = 0;
1029 	rval = qla2x00_mailbox_command(vha, mcp);
1030 
1031 	if (rval == QLA_SUCCESS) {
1032 		if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
1033 		    mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA)
1034 			rval = QLA_FUNCTION_FAILED;
1035 		if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
1036 		    mcp->mb[7] != 0x2525)
1037 			rval = QLA_FUNCTION_FAILED;
1038 	}
1039 
1040 	if (rval != QLA_SUCCESS) {
1041 		/*EMPTY*/
1042 		ql_dbg(ql_dbg_mbx, vha, 0x1033, "Failed=%x.\n", rval);
1043 	} else {
1044 		/*EMPTY*/
1045 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1034,
1046 		    "Done %s.\n", __func__);
1047 	}
1048 
1049 	return rval;
1050 }
1051 
1052 /*
1053  * qla2x00_verify_checksum
1054  *	Verify firmware checksum.
1055  *
1056  * Input:
1057  *	ha = adapter block pointer.
1058  *	TARGET_QUEUE_LOCK must be released.
1059  *	ADAPTER_STATE_LOCK must be released.
1060  *
1061  * Returns:
1062  *	qla2x00 local function return status code.
1063  *
1064  * Context:
1065  *	Kernel context.
1066  */
1067 int
1068 qla2x00_verify_checksum(scsi_qla_host_t *vha, uint32_t risc_addr)
1069 {
1070 	int rval;
1071 	mbx_cmd_t mc;
1072 	mbx_cmd_t *mcp = &mc;
1073 
1074 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1035,
1075 	    "Entered %s.\n", __func__);
1076 
1077 	mcp->mb[0] = MBC_VERIFY_CHECKSUM;
1078 	mcp->out_mb = MBX_0;
1079 	mcp->in_mb = MBX_0;
1080 	if (IS_FWI2_CAPABLE(vha->hw)) {
1081 		mcp->mb[1] = MSW(risc_addr);
1082 		mcp->mb[2] = LSW(risc_addr);
1083 		mcp->out_mb |= MBX_2|MBX_1;
1084 		mcp->in_mb |= MBX_2|MBX_1;
1085 	} else {
1086 		mcp->mb[1] = LSW(risc_addr);
1087 		mcp->out_mb |= MBX_1;
1088 		mcp->in_mb |= MBX_1;
1089 	}
1090 
1091 	mcp->tov = MBX_TOV_SECONDS;
1092 	mcp->flags = 0;
1093 	rval = qla2x00_mailbox_command(vha, mcp);
1094 
1095 	if (rval != QLA_SUCCESS) {
1096 		ql_dbg(ql_dbg_mbx, vha, 0x1036,
1097 		    "Failed=%x chm sum=%x.\n", rval, IS_FWI2_CAPABLE(vha->hw) ?
1098 		    (mcp->mb[2] << 16) | mcp->mb[1] : mcp->mb[1]);
1099 	} else {
1100 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1037,
1101 		    "Done %s.\n", __func__);
1102 	}
1103 
1104 	return rval;
1105 }
1106 
1107 /*
1108  * qla2x00_issue_iocb
1109  *	Issue IOCB using mailbox command
1110  *
1111  * Input:
1112  *	ha = adapter state pointer.
1113  *	buffer = buffer pointer.
1114  *	phys_addr = physical address of buffer.
1115  *	size = size of buffer.
1116  *	TARGET_QUEUE_LOCK must be released.
1117  *	ADAPTER_STATE_LOCK must be released.
1118  *
1119  * Returns:
1120  *	qla2x00 local function return status code.
1121  *
1122  * Context:
1123  *	Kernel context.
1124  */
1125 int
1126 qla2x00_issue_iocb_timeout(scsi_qla_host_t *vha, void *buffer,
1127     dma_addr_t phys_addr, size_t size, uint32_t tov)
1128 {
1129 	int		rval;
1130 	mbx_cmd_t	mc;
1131 	mbx_cmd_t	*mcp = &mc;
1132 
1133 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1038,
1134 	    "Entered %s.\n", __func__);
1135 
1136 	mcp->mb[0] = MBC_IOCB_COMMAND_A64;
1137 	mcp->mb[1] = 0;
1138 	mcp->mb[2] = MSW(phys_addr);
1139 	mcp->mb[3] = LSW(phys_addr);
1140 	mcp->mb[6] = MSW(MSD(phys_addr));
1141 	mcp->mb[7] = LSW(MSD(phys_addr));
1142 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1143 	mcp->in_mb = MBX_2|MBX_0;
1144 	mcp->tov = tov;
1145 	mcp->flags = 0;
1146 	rval = qla2x00_mailbox_command(vha, mcp);
1147 
1148 	if (rval != QLA_SUCCESS) {
1149 		/*EMPTY*/
1150 		ql_dbg(ql_dbg_mbx, vha, 0x1039, "Failed=%x.\n", rval);
1151 	} else {
1152 		sts_entry_t *sts_entry = (sts_entry_t *) buffer;
1153 
1154 		/* Mask reserved bits. */
1155 		sts_entry->entry_status &=
1156 		    IS_FWI2_CAPABLE(vha->hw) ? RF_MASK_24XX : RF_MASK;
1157 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103a,
1158 		    "Done %s.\n", __func__);
1159 	}
1160 
1161 	return rval;
1162 }
1163 
1164 int
1165 qla2x00_issue_iocb(scsi_qla_host_t *vha, void *buffer, dma_addr_t phys_addr,
1166     size_t size)
1167 {
1168 	return qla2x00_issue_iocb_timeout(vha, buffer, phys_addr, size,
1169 	    MBX_TOV_SECONDS);
1170 }
1171 
1172 /*
1173  * qla2x00_abort_command
1174  *	Abort command aborts a specified IOCB.
1175  *
1176  * Input:
1177  *	ha = adapter block pointer.
1178  *	sp = SB structure pointer.
1179  *
1180  * Returns:
1181  *	qla2x00 local function return status code.
1182  *
1183  * Context:
1184  *	Kernel context.
1185  */
1186 int
1187 qla2x00_abort_command(srb_t *sp)
1188 {
1189 	unsigned long   flags = 0;
1190 	int		rval;
1191 	uint32_t	handle = 0;
1192 	mbx_cmd_t	mc;
1193 	mbx_cmd_t	*mcp = &mc;
1194 	fc_port_t	*fcport = sp->fcport;
1195 	scsi_qla_host_t *vha = fcport->vha;
1196 	struct qla_hw_data *ha = vha->hw;
1197 	struct req_que *req = vha->req;
1198 	struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1199 
1200 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103b,
1201 	    "Entered %s.\n", __func__);
1202 
1203 	spin_lock_irqsave(&ha->hardware_lock, flags);
1204 	for (handle = 1; handle < req->num_outstanding_cmds; handle++) {
1205 		if (req->outstanding_cmds[handle] == sp)
1206 			break;
1207 	}
1208 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
1209 
1210 	if (handle == req->num_outstanding_cmds) {
1211 		/* command not found */
1212 		return QLA_FUNCTION_FAILED;
1213 	}
1214 
1215 	mcp->mb[0] = MBC_ABORT_COMMAND;
1216 	if (HAS_EXTENDED_IDS(ha))
1217 		mcp->mb[1] = fcport->loop_id;
1218 	else
1219 		mcp->mb[1] = fcport->loop_id << 8;
1220 	mcp->mb[2] = (uint16_t)handle;
1221 	mcp->mb[3] = (uint16_t)(handle >> 16);
1222 	mcp->mb[6] = (uint16_t)cmd->device->lun;
1223 	mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1224 	mcp->in_mb = MBX_0;
1225 	mcp->tov = MBX_TOV_SECONDS;
1226 	mcp->flags = 0;
1227 	rval = qla2x00_mailbox_command(vha, mcp);
1228 
1229 	if (rval != QLA_SUCCESS) {
1230 		ql_dbg(ql_dbg_mbx, vha, 0x103c, "Failed=%x.\n", rval);
1231 	} else {
1232 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103d,
1233 		    "Done %s.\n", __func__);
1234 	}
1235 
1236 	return rval;
1237 }
1238 
1239 int
1240 qla2x00_abort_target(struct fc_port *fcport, uint64_t l, int tag)
1241 {
1242 	int rval, rval2;
1243 	mbx_cmd_t  mc;
1244 	mbx_cmd_t  *mcp = &mc;
1245 	scsi_qla_host_t *vha;
1246 	struct req_que *req;
1247 	struct rsp_que *rsp;
1248 
1249 	l = l;
1250 	vha = fcport->vha;
1251 
1252 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103e,
1253 	    "Entered %s.\n", __func__);
1254 
1255 	req = vha->hw->req_q_map[0];
1256 	rsp = req->rsp;
1257 	mcp->mb[0] = MBC_ABORT_TARGET;
1258 	mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0;
1259 	if (HAS_EXTENDED_IDS(vha->hw)) {
1260 		mcp->mb[1] = fcport->loop_id;
1261 		mcp->mb[10] = 0;
1262 		mcp->out_mb |= MBX_10;
1263 	} else {
1264 		mcp->mb[1] = fcport->loop_id << 8;
1265 	}
1266 	mcp->mb[2] = vha->hw->loop_reset_delay;
1267 	mcp->mb[9] = vha->vp_idx;
1268 
1269 	mcp->in_mb = MBX_0;
1270 	mcp->tov = MBX_TOV_SECONDS;
1271 	mcp->flags = 0;
1272 	rval = qla2x00_mailbox_command(vha, mcp);
1273 	if (rval != QLA_SUCCESS) {
1274 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103f,
1275 		    "Failed=%x.\n", rval);
1276 	}
1277 
1278 	/* Issue marker IOCB. */
1279 	rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, 0,
1280 							MK_SYNC_ID);
1281 	if (rval2 != QLA_SUCCESS) {
1282 		ql_dbg(ql_dbg_mbx, vha, 0x1040,
1283 		    "Failed to issue marker IOCB (%x).\n", rval2);
1284 	} else {
1285 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1041,
1286 		    "Done %s.\n", __func__);
1287 	}
1288 
1289 	return rval;
1290 }
1291 
1292 int
1293 qla2x00_lun_reset(struct fc_port *fcport, uint64_t l, int tag)
1294 {
1295 	int rval, rval2;
1296 	mbx_cmd_t  mc;
1297 	mbx_cmd_t  *mcp = &mc;
1298 	scsi_qla_host_t *vha;
1299 	struct req_que *req;
1300 	struct rsp_que *rsp;
1301 
1302 	vha = fcport->vha;
1303 
1304 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1042,
1305 	    "Entered %s.\n", __func__);
1306 
1307 	req = vha->hw->req_q_map[0];
1308 	rsp = req->rsp;
1309 	mcp->mb[0] = MBC_LUN_RESET;
1310 	mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
1311 	if (HAS_EXTENDED_IDS(vha->hw))
1312 		mcp->mb[1] = fcport->loop_id;
1313 	else
1314 		mcp->mb[1] = fcport->loop_id << 8;
1315 	mcp->mb[2] = (u32)l;
1316 	mcp->mb[3] = 0;
1317 	mcp->mb[9] = vha->vp_idx;
1318 
1319 	mcp->in_mb = MBX_0;
1320 	mcp->tov = MBX_TOV_SECONDS;
1321 	mcp->flags = 0;
1322 	rval = qla2x00_mailbox_command(vha, mcp);
1323 	if (rval != QLA_SUCCESS) {
1324 		ql_dbg(ql_dbg_mbx, vha, 0x1043, "Failed=%x.\n", rval);
1325 	}
1326 
1327 	/* Issue marker IOCB. */
1328 	rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l,
1329 								MK_SYNC_ID_LUN);
1330 	if (rval2 != QLA_SUCCESS) {
1331 		ql_dbg(ql_dbg_mbx, vha, 0x1044,
1332 		    "Failed to issue marker IOCB (%x).\n", rval2);
1333 	} else {
1334 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1045,
1335 		    "Done %s.\n", __func__);
1336 	}
1337 
1338 	return rval;
1339 }
1340 
1341 /*
1342  * qla2x00_get_adapter_id
1343  *	Get adapter ID and topology.
1344  *
1345  * Input:
1346  *	ha = adapter block pointer.
1347  *	id = pointer for loop ID.
1348  *	al_pa = pointer for AL_PA.
1349  *	area = pointer for area.
1350  *	domain = pointer for domain.
1351  *	top = pointer for topology.
1352  *	TARGET_QUEUE_LOCK must be released.
1353  *	ADAPTER_STATE_LOCK must be released.
1354  *
1355  * Returns:
1356  *	qla2x00 local function return status code.
1357  *
1358  * Context:
1359  *	Kernel context.
1360  */
1361 int
1362 qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
1363     uint8_t *area, uint8_t *domain, uint16_t *top, uint16_t *sw_cap)
1364 {
1365 	int rval;
1366 	mbx_cmd_t mc;
1367 	mbx_cmd_t *mcp = &mc;
1368 
1369 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1046,
1370 	    "Entered %s.\n", __func__);
1371 
1372 	mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID;
1373 	mcp->mb[9] = vha->vp_idx;
1374 	mcp->out_mb = MBX_9|MBX_0;
1375 	mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1376 	if (IS_CNA_CAPABLE(vha->hw))
1377 		mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
1378 	if (IS_FWI2_CAPABLE(vha->hw))
1379 		mcp->in_mb |= MBX_19|MBX_18|MBX_17|MBX_16;
1380 	if (IS_QLA27XX(vha->hw))
1381 		mcp->in_mb |= MBX_15;
1382 	mcp->tov = MBX_TOV_SECONDS;
1383 	mcp->flags = 0;
1384 	rval = qla2x00_mailbox_command(vha, mcp);
1385 	if (mcp->mb[0] == MBS_COMMAND_ERROR)
1386 		rval = QLA_COMMAND_ERROR;
1387 	else if (mcp->mb[0] == MBS_INVALID_COMMAND)
1388 		rval = QLA_INVALID_COMMAND;
1389 
1390 	/* Return data. */
1391 	*id = mcp->mb[1];
1392 	*al_pa = LSB(mcp->mb[2]);
1393 	*area = MSB(mcp->mb[2]);
1394 	*domain	= LSB(mcp->mb[3]);
1395 	*top = mcp->mb[6];
1396 	*sw_cap = mcp->mb[7];
1397 
1398 	if (rval != QLA_SUCCESS) {
1399 		/*EMPTY*/
1400 		ql_dbg(ql_dbg_mbx, vha, 0x1047, "Failed=%x.\n", rval);
1401 	} else {
1402 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1048,
1403 		    "Done %s.\n", __func__);
1404 
1405 		if (IS_CNA_CAPABLE(vha->hw)) {
1406 			vha->fcoe_vlan_id = mcp->mb[9] & 0xfff;
1407 			vha->fcoe_fcf_idx = mcp->mb[10];
1408 			vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8;
1409 			vha->fcoe_vn_port_mac[4] = mcp->mb[11] & 0xff;
1410 			vha->fcoe_vn_port_mac[3] = mcp->mb[12] >> 8;
1411 			vha->fcoe_vn_port_mac[2] = mcp->mb[12] & 0xff;
1412 			vha->fcoe_vn_port_mac[1] = mcp->mb[13] >> 8;
1413 			vha->fcoe_vn_port_mac[0] = mcp->mb[13] & 0xff;
1414 		}
1415 		/* If FA-WWN supported */
1416 		if (IS_FAWWN_CAPABLE(vha->hw)) {
1417 			if (mcp->mb[7] & BIT_14) {
1418 				vha->port_name[0] = MSB(mcp->mb[16]);
1419 				vha->port_name[1] = LSB(mcp->mb[16]);
1420 				vha->port_name[2] = MSB(mcp->mb[17]);
1421 				vha->port_name[3] = LSB(mcp->mb[17]);
1422 				vha->port_name[4] = MSB(mcp->mb[18]);
1423 				vha->port_name[5] = LSB(mcp->mb[18]);
1424 				vha->port_name[6] = MSB(mcp->mb[19]);
1425 				vha->port_name[7] = LSB(mcp->mb[19]);
1426 				fc_host_port_name(vha->host) =
1427 				    wwn_to_u64(vha->port_name);
1428 				ql_dbg(ql_dbg_mbx, vha, 0x10ca,
1429 				    "FA-WWN acquired %016llx\n",
1430 				    wwn_to_u64(vha->port_name));
1431 			}
1432 		}
1433 
1434 		if (IS_QLA27XX(vha->hw))
1435 			vha->bbcr = mcp->mb[15];
1436 	}
1437 
1438 	return rval;
1439 }
1440 
1441 /*
1442  * qla2x00_get_retry_cnt
1443  *	Get current firmware login retry count and delay.
1444  *
1445  * Input:
1446  *	ha = adapter block pointer.
1447  *	retry_cnt = pointer to login retry count.
1448  *	tov = pointer to login timeout value.
1449  *
1450  * Returns:
1451  *	qla2x00 local function return status code.
1452  *
1453  * Context:
1454  *	Kernel context.
1455  */
1456 int
1457 qla2x00_get_retry_cnt(scsi_qla_host_t *vha, uint8_t *retry_cnt, uint8_t *tov,
1458     uint16_t *r_a_tov)
1459 {
1460 	int rval;
1461 	uint16_t ratov;
1462 	mbx_cmd_t mc;
1463 	mbx_cmd_t *mcp = &mc;
1464 
1465 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1049,
1466 	    "Entered %s.\n", __func__);
1467 
1468 	mcp->mb[0] = MBC_GET_RETRY_COUNT;
1469 	mcp->out_mb = MBX_0;
1470 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1471 	mcp->tov = MBX_TOV_SECONDS;
1472 	mcp->flags = 0;
1473 	rval = qla2x00_mailbox_command(vha, mcp);
1474 
1475 	if (rval != QLA_SUCCESS) {
1476 		/*EMPTY*/
1477 		ql_dbg(ql_dbg_mbx, vha, 0x104a,
1478 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
1479 	} else {
1480 		/* Convert returned data and check our values. */
1481 		*r_a_tov = mcp->mb[3] / 2;
1482 		ratov = (mcp->mb[3]/2) / 10;  /* mb[3] value is in 100ms */
1483 		if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) {
1484 			/* Update to the larger values */
1485 			*retry_cnt = (uint8_t)mcp->mb[1];
1486 			*tov = ratov;
1487 		}
1488 
1489 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104b,
1490 		    "Done %s mb3=%d ratov=%d.\n", __func__, mcp->mb[3], ratov);
1491 	}
1492 
1493 	return rval;
1494 }
1495 
1496 /*
1497  * qla2x00_init_firmware
1498  *	Initialize adapter firmware.
1499  *
1500  * Input:
1501  *	ha = adapter block pointer.
1502  *	dptr = Initialization control block pointer.
1503  *	size = size of initialization control block.
1504  *	TARGET_QUEUE_LOCK must be released.
1505  *	ADAPTER_STATE_LOCK must be released.
1506  *
1507  * Returns:
1508  *	qla2x00 local function return status code.
1509  *
1510  * Context:
1511  *	Kernel context.
1512  */
1513 int
1514 qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
1515 {
1516 	int rval;
1517 	mbx_cmd_t mc;
1518 	mbx_cmd_t *mcp = &mc;
1519 	struct qla_hw_data *ha = vha->hw;
1520 
1521 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104c,
1522 	    "Entered %s.\n", __func__);
1523 
1524 	if (IS_P3P_TYPE(ha) && ql2xdbwr)
1525 		qla82xx_wr_32(ha, (uintptr_t __force)ha->nxdb_wr_ptr,
1526 			(0x04 | (ha->portnum << 5) | (0 << 8) | (0 << 16)));
1527 
1528 	if (ha->flags.npiv_supported)
1529 		mcp->mb[0] = MBC_MID_INITIALIZE_FIRMWARE;
1530 	else
1531 		mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
1532 
1533 	mcp->mb[1] = 0;
1534 	mcp->mb[2] = MSW(ha->init_cb_dma);
1535 	mcp->mb[3] = LSW(ha->init_cb_dma);
1536 	mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
1537 	mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
1538 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1539 	if (ha->ex_init_cb && ha->ex_init_cb->ex_version) {
1540 		mcp->mb[1] = BIT_0;
1541 		mcp->mb[10] = MSW(ha->ex_init_cb_dma);
1542 		mcp->mb[11] = LSW(ha->ex_init_cb_dma);
1543 		mcp->mb[12] = MSW(MSD(ha->ex_init_cb_dma));
1544 		mcp->mb[13] = LSW(MSD(ha->ex_init_cb_dma));
1545 		mcp->mb[14] = sizeof(*ha->ex_init_cb);
1546 		mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10;
1547 	}
1548 	/* 1 and 2 should normally be captured. */
1549 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
1550 	if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
1551 		/* mb3 is additional info about the installed SFP. */
1552 		mcp->in_mb  |= MBX_3;
1553 	mcp->buf_size = size;
1554 	mcp->flags = MBX_DMA_OUT;
1555 	mcp->tov = MBX_TOV_SECONDS;
1556 	rval = qla2x00_mailbox_command(vha, mcp);
1557 
1558 	if (rval != QLA_SUCCESS) {
1559 		/*EMPTY*/
1560 		ql_dbg(ql_dbg_mbx, vha, 0x104d,
1561 		    "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x,.\n",
1562 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3]);
1563 	} else {
1564 		/*EMPTY*/
1565 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104e,
1566 		    "Done %s.\n", __func__);
1567 	}
1568 
1569 	return rval;
1570 }
1571 
1572 /*
1573  * qla2x00_get_node_name_list
1574  *      Issue get node name list mailbox command, kmalloc()
1575  *      and return the resulting list. Caller must kfree() it!
1576  *
1577  * Input:
1578  *      ha = adapter state pointer.
1579  *      out_data = resulting list
1580  *      out_len = length of the resulting list
1581  *
1582  * Returns:
1583  *      qla2x00 local function return status code.
1584  *
1585  * Context:
1586  *      Kernel context.
1587  */
1588 int
1589 qla2x00_get_node_name_list(scsi_qla_host_t *vha, void **out_data, int *out_len)
1590 {
1591 	struct qla_hw_data *ha = vha->hw;
1592 	struct qla_port_24xx_data *list = NULL;
1593 	void *pmap;
1594 	mbx_cmd_t mc;
1595 	dma_addr_t pmap_dma;
1596 	ulong dma_size;
1597 	int rval, left;
1598 
1599 	left = 1;
1600 	while (left > 0) {
1601 		dma_size = left * sizeof(*list);
1602 		pmap = dma_alloc_coherent(&ha->pdev->dev, dma_size,
1603 					 &pmap_dma, GFP_KERNEL);
1604 		if (!pmap) {
1605 			ql_log(ql_log_warn, vha, 0x113f,
1606 			    "%s(%ld): DMA Alloc failed of %ld\n",
1607 			    __func__, vha->host_no, dma_size);
1608 			rval = QLA_MEMORY_ALLOC_FAILED;
1609 			goto out;
1610 		}
1611 
1612 		mc.mb[0] = MBC_PORT_NODE_NAME_LIST;
1613 		mc.mb[1] = BIT_1 | BIT_3;
1614 		mc.mb[2] = MSW(pmap_dma);
1615 		mc.mb[3] = LSW(pmap_dma);
1616 		mc.mb[6] = MSW(MSD(pmap_dma));
1617 		mc.mb[7] = LSW(MSD(pmap_dma));
1618 		mc.mb[8] = dma_size;
1619 		mc.out_mb = MBX_0|MBX_1|MBX_2|MBX_3|MBX_6|MBX_7|MBX_8;
1620 		mc.in_mb = MBX_0|MBX_1;
1621 		mc.tov = 30;
1622 		mc.flags = MBX_DMA_IN;
1623 
1624 		rval = qla2x00_mailbox_command(vha, &mc);
1625 		if (rval != QLA_SUCCESS) {
1626 			if ((mc.mb[0] == MBS_COMMAND_ERROR) &&
1627 			    (mc.mb[1] == 0xA)) {
1628 				left += le16_to_cpu(mc.mb[2]) /
1629 				    sizeof(struct qla_port_24xx_data);
1630 				goto restart;
1631 			}
1632 			goto out_free;
1633 		}
1634 
1635 		left = 0;
1636 
1637 		list = kmemdup(pmap, dma_size, GFP_KERNEL);
1638 		if (!list) {
1639 			ql_log(ql_log_warn, vha, 0x1140,
1640 			    "%s(%ld): failed to allocate node names list "
1641 			    "structure.\n", __func__, vha->host_no);
1642 			rval = QLA_MEMORY_ALLOC_FAILED;
1643 			goto out_free;
1644 		}
1645 
1646 restart:
1647 		dma_free_coherent(&ha->pdev->dev, dma_size, pmap, pmap_dma);
1648 	}
1649 
1650 	*out_data = list;
1651 	*out_len = dma_size;
1652 
1653 out:
1654 	return rval;
1655 
1656 out_free:
1657 	dma_free_coherent(&ha->pdev->dev, dma_size, pmap, pmap_dma);
1658 	return rval;
1659 }
1660 
1661 /*
1662  * qla2x00_get_port_database
1663  *	Issue normal/enhanced get port database mailbox command
1664  *	and copy device name as necessary.
1665  *
1666  * Input:
1667  *	ha = adapter state pointer.
1668  *	dev = structure pointer.
1669  *	opt = enhanced cmd option byte.
1670  *
1671  * Returns:
1672  *	qla2x00 local function return status code.
1673  *
1674  * Context:
1675  *	Kernel context.
1676  */
1677 int
1678 qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
1679 {
1680 	int rval;
1681 	mbx_cmd_t mc;
1682 	mbx_cmd_t *mcp = &mc;
1683 	port_database_t *pd;
1684 	struct port_database_24xx *pd24;
1685 	dma_addr_t pd_dma;
1686 	struct qla_hw_data *ha = vha->hw;
1687 
1688 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104f,
1689 	    "Entered %s.\n", __func__);
1690 
1691 	pd24 = NULL;
1692 	pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma);
1693 	if (pd  == NULL) {
1694 		ql_log(ql_log_warn, vha, 0x1050,
1695 		    "Failed to allocate port database structure.\n");
1696 		return QLA_MEMORY_ALLOC_FAILED;
1697 	}
1698 	memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE));
1699 
1700 	mcp->mb[0] = MBC_GET_PORT_DATABASE;
1701 	if (opt != 0 && !IS_FWI2_CAPABLE(ha))
1702 		mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE;
1703 	mcp->mb[2] = MSW(pd_dma);
1704 	mcp->mb[3] = LSW(pd_dma);
1705 	mcp->mb[6] = MSW(MSD(pd_dma));
1706 	mcp->mb[7] = LSW(MSD(pd_dma));
1707 	mcp->mb[9] = vha->vp_idx;
1708 	mcp->out_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
1709 	mcp->in_mb = MBX_0;
1710 	if (IS_FWI2_CAPABLE(ha)) {
1711 		mcp->mb[1] = fcport->loop_id;
1712 		mcp->mb[10] = opt;
1713 		mcp->out_mb |= MBX_10|MBX_1;
1714 		mcp->in_mb |= MBX_1;
1715 	} else if (HAS_EXTENDED_IDS(ha)) {
1716 		mcp->mb[1] = fcport->loop_id;
1717 		mcp->mb[10] = opt;
1718 		mcp->out_mb |= MBX_10|MBX_1;
1719 	} else {
1720 		mcp->mb[1] = fcport->loop_id << 8 | opt;
1721 		mcp->out_mb |= MBX_1;
1722 	}
1723 	mcp->buf_size = IS_FWI2_CAPABLE(ha) ?
1724 	    PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE;
1725 	mcp->flags = MBX_DMA_IN;
1726 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1727 	rval = qla2x00_mailbox_command(vha, mcp);
1728 	if (rval != QLA_SUCCESS)
1729 		goto gpd_error_out;
1730 
1731 	if (IS_FWI2_CAPABLE(ha)) {
1732 		uint64_t zero = 0;
1733 		pd24 = (struct port_database_24xx *) pd;
1734 
1735 		/* Check for logged in state. */
1736 		if (pd24->current_login_state != PDS_PRLI_COMPLETE &&
1737 		    pd24->last_login_state != PDS_PRLI_COMPLETE) {
1738 			ql_dbg(ql_dbg_mbx, vha, 0x1051,
1739 			    "Unable to verify login-state (%x/%x) for "
1740 			    "loop_id %x.\n", pd24->current_login_state,
1741 			    pd24->last_login_state, fcport->loop_id);
1742 			rval = QLA_FUNCTION_FAILED;
1743 			goto gpd_error_out;
1744 		}
1745 
1746 		if (fcport->loop_id == FC_NO_LOOP_ID ||
1747 		    (memcmp(fcport->port_name, (uint8_t *)&zero, 8) &&
1748 		     memcmp(fcport->port_name, pd24->port_name, 8))) {
1749 			/* We lost the device mid way. */
1750 			rval = QLA_NOT_LOGGED_IN;
1751 			goto gpd_error_out;
1752 		}
1753 
1754 		/* Names are little-endian. */
1755 		memcpy(fcport->node_name, pd24->node_name, WWN_SIZE);
1756 		memcpy(fcport->port_name, pd24->port_name, WWN_SIZE);
1757 
1758 		/* Get port_id of device. */
1759 		fcport->d_id.b.domain = pd24->port_id[0];
1760 		fcport->d_id.b.area = pd24->port_id[1];
1761 		fcport->d_id.b.al_pa = pd24->port_id[2];
1762 		fcport->d_id.b.rsvd_1 = 0;
1763 
1764 		/* If not target must be initiator or unknown type. */
1765 		if ((pd24->prli_svc_param_word_3[0] & BIT_4) == 0)
1766 			fcport->port_type = FCT_INITIATOR;
1767 		else
1768 			fcport->port_type = FCT_TARGET;
1769 
1770 		/* Passback COS information. */
1771 		fcport->supported_classes = (pd24->flags & PDF_CLASS_2) ?
1772 				FC_COS_CLASS2 : FC_COS_CLASS3;
1773 
1774 		if (pd24->prli_svc_param_word_3[0] & BIT_7)
1775 			fcport->flags |= FCF_CONF_COMP_SUPPORTED;
1776 	} else {
1777 		uint64_t zero = 0;
1778 
1779 		/* Check for logged in state. */
1780 		if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
1781 		    pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
1782 			ql_dbg(ql_dbg_mbx, vha, 0x100a,
1783 			    "Unable to verify login-state (%x/%x) - "
1784 			    "portid=%02x%02x%02x.\n", pd->master_state,
1785 			    pd->slave_state, fcport->d_id.b.domain,
1786 			    fcport->d_id.b.area, fcport->d_id.b.al_pa);
1787 			rval = QLA_FUNCTION_FAILED;
1788 			goto gpd_error_out;
1789 		}
1790 
1791 		if (fcport->loop_id == FC_NO_LOOP_ID ||
1792 		    (memcmp(fcport->port_name, (uint8_t *)&zero, 8) &&
1793 		     memcmp(fcport->port_name, pd->port_name, 8))) {
1794 			/* We lost the device mid way. */
1795 			rval = QLA_NOT_LOGGED_IN;
1796 			goto gpd_error_out;
1797 		}
1798 
1799 		/* Names are little-endian. */
1800 		memcpy(fcport->node_name, pd->node_name, WWN_SIZE);
1801 		memcpy(fcport->port_name, pd->port_name, WWN_SIZE);
1802 
1803 		/* Get port_id of device. */
1804 		fcport->d_id.b.domain = pd->port_id[0];
1805 		fcport->d_id.b.area = pd->port_id[3];
1806 		fcport->d_id.b.al_pa = pd->port_id[2];
1807 		fcport->d_id.b.rsvd_1 = 0;
1808 
1809 		/* If not target must be initiator or unknown type. */
1810 		if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
1811 			fcport->port_type = FCT_INITIATOR;
1812 		else
1813 			fcport->port_type = FCT_TARGET;
1814 
1815 		/* Passback COS information. */
1816 		fcport->supported_classes = (pd->options & BIT_4) ?
1817 		    FC_COS_CLASS2: FC_COS_CLASS3;
1818 	}
1819 
1820 gpd_error_out:
1821 	dma_pool_free(ha->s_dma_pool, pd, pd_dma);
1822 
1823 	if (rval != QLA_SUCCESS) {
1824 		ql_dbg(ql_dbg_mbx, vha, 0x1052,
1825 		    "Failed=%x mb[0]=%x mb[1]=%x.\n", rval,
1826 		    mcp->mb[0], mcp->mb[1]);
1827 	} else {
1828 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1053,
1829 		    "Done %s.\n", __func__);
1830 	}
1831 
1832 	return rval;
1833 }
1834 
1835 /*
1836  * qla2x00_get_firmware_state
1837  *	Get adapter firmware state.
1838  *
1839  * Input:
1840  *	ha = adapter block pointer.
1841  *	dptr = pointer for firmware state.
1842  *	TARGET_QUEUE_LOCK must be released.
1843  *	ADAPTER_STATE_LOCK must be released.
1844  *
1845  * Returns:
1846  *	qla2x00 local function return status code.
1847  *
1848  * Context:
1849  *	Kernel context.
1850  */
1851 int
1852 qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states)
1853 {
1854 	int rval;
1855 	mbx_cmd_t mc;
1856 	mbx_cmd_t *mcp = &mc;
1857 
1858 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1054,
1859 	    "Entered %s.\n", __func__);
1860 
1861 	mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
1862 	mcp->out_mb = MBX_0;
1863 	if (IS_FWI2_CAPABLE(vha->hw))
1864 		mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
1865 	else
1866 		mcp->in_mb = MBX_1|MBX_0;
1867 	mcp->tov = MBX_TOV_SECONDS;
1868 	mcp->flags = 0;
1869 	rval = qla2x00_mailbox_command(vha, mcp);
1870 
1871 	/* Return firmware states. */
1872 	states[0] = mcp->mb[1];
1873 	if (IS_FWI2_CAPABLE(vha->hw)) {
1874 		states[1] = mcp->mb[2];
1875 		states[2] = mcp->mb[3];  /* SFP info */
1876 		states[3] = mcp->mb[4];
1877 		states[4] = mcp->mb[5];
1878 		states[5] = mcp->mb[6];  /* DPORT status */
1879 	}
1880 
1881 	if (rval != QLA_SUCCESS) {
1882 		/*EMPTY*/
1883 		ql_dbg(ql_dbg_mbx, vha, 0x1055, "Failed=%x.\n", rval);
1884 	} else {
1885 		/*EMPTY*/
1886 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1056,
1887 		    "Done %s.\n", __func__);
1888 	}
1889 
1890 	return rval;
1891 }
1892 
1893 /*
1894  * qla2x00_get_port_name
1895  *	Issue get port name mailbox command.
1896  *	Returned name is in big endian format.
1897  *
1898  * Input:
1899  *	ha = adapter block pointer.
1900  *	loop_id = loop ID of device.
1901  *	name = pointer for name.
1902  *	TARGET_QUEUE_LOCK must be released.
1903  *	ADAPTER_STATE_LOCK must be released.
1904  *
1905  * Returns:
1906  *	qla2x00 local function return status code.
1907  *
1908  * Context:
1909  *	Kernel context.
1910  */
1911 int
1912 qla2x00_get_port_name(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t *name,
1913     uint8_t opt)
1914 {
1915 	int rval;
1916 	mbx_cmd_t mc;
1917 	mbx_cmd_t *mcp = &mc;
1918 
1919 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1057,
1920 	    "Entered %s.\n", __func__);
1921 
1922 	mcp->mb[0] = MBC_GET_PORT_NAME;
1923 	mcp->mb[9] = vha->vp_idx;
1924 	mcp->out_mb = MBX_9|MBX_1|MBX_0;
1925 	if (HAS_EXTENDED_IDS(vha->hw)) {
1926 		mcp->mb[1] = loop_id;
1927 		mcp->mb[10] = opt;
1928 		mcp->out_mb |= MBX_10;
1929 	} else {
1930 		mcp->mb[1] = loop_id << 8 | opt;
1931 	}
1932 
1933 	mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1934 	mcp->tov = MBX_TOV_SECONDS;
1935 	mcp->flags = 0;
1936 	rval = qla2x00_mailbox_command(vha, mcp);
1937 
1938 	if (rval != QLA_SUCCESS) {
1939 		/*EMPTY*/
1940 		ql_dbg(ql_dbg_mbx, vha, 0x1058, "Failed=%x.\n", rval);
1941 	} else {
1942 		if (name != NULL) {
1943 			/* This function returns name in big endian. */
1944 			name[0] = MSB(mcp->mb[2]);
1945 			name[1] = LSB(mcp->mb[2]);
1946 			name[2] = MSB(mcp->mb[3]);
1947 			name[3] = LSB(mcp->mb[3]);
1948 			name[4] = MSB(mcp->mb[6]);
1949 			name[5] = LSB(mcp->mb[6]);
1950 			name[6] = MSB(mcp->mb[7]);
1951 			name[7] = LSB(mcp->mb[7]);
1952 		}
1953 
1954 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1059,
1955 		    "Done %s.\n", __func__);
1956 	}
1957 
1958 	return rval;
1959 }
1960 
1961 /*
1962  * qla24xx_link_initialization
1963  *	Issue link initialization mailbox command.
1964  *
1965  * Input:
1966  *	ha = adapter block pointer.
1967  *	TARGET_QUEUE_LOCK must be released.
1968  *	ADAPTER_STATE_LOCK must be released.
1969  *
1970  * Returns:
1971  *	qla2x00 local function return status code.
1972  *
1973  * Context:
1974  *	Kernel context.
1975  */
1976 int
1977 qla24xx_link_initialize(scsi_qla_host_t *vha)
1978 {
1979 	int rval;
1980 	mbx_cmd_t mc;
1981 	mbx_cmd_t *mcp = &mc;
1982 
1983 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1152,
1984 	    "Entered %s.\n", __func__);
1985 
1986 	if (!IS_FWI2_CAPABLE(vha->hw) || IS_CNA_CAPABLE(vha->hw))
1987 		return QLA_FUNCTION_FAILED;
1988 
1989 	mcp->mb[0] = MBC_LINK_INITIALIZATION;
1990 	mcp->mb[1] = BIT_4;
1991 	if (vha->hw->operating_mode == LOOP)
1992 		mcp->mb[1] |= BIT_6;
1993 	else
1994 		mcp->mb[1] |= BIT_5;
1995 	mcp->mb[2] = 0;
1996 	mcp->mb[3] = 0;
1997 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1998 	mcp->in_mb = MBX_0;
1999 	mcp->tov = MBX_TOV_SECONDS;
2000 	mcp->flags = 0;
2001 	rval = qla2x00_mailbox_command(vha, mcp);
2002 
2003 	if (rval != QLA_SUCCESS) {
2004 		ql_dbg(ql_dbg_mbx, vha, 0x1153, "Failed=%x.\n", rval);
2005 	} else {
2006 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1154,
2007 		    "Done %s.\n", __func__);
2008 	}
2009 
2010 	return rval;
2011 }
2012 
2013 /*
2014  * qla2x00_lip_reset
2015  *	Issue LIP reset mailbox command.
2016  *
2017  * Input:
2018  *	ha = adapter block pointer.
2019  *	TARGET_QUEUE_LOCK must be released.
2020  *	ADAPTER_STATE_LOCK must be released.
2021  *
2022  * Returns:
2023  *	qla2x00 local function return status code.
2024  *
2025  * Context:
2026  *	Kernel context.
2027  */
2028 int
2029 qla2x00_lip_reset(scsi_qla_host_t *vha)
2030 {
2031 	int rval;
2032 	mbx_cmd_t mc;
2033 	mbx_cmd_t *mcp = &mc;
2034 
2035 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105a,
2036 	    "Entered %s.\n", __func__);
2037 
2038 	if (IS_CNA_CAPABLE(vha->hw)) {
2039 		/* Logout across all FCFs. */
2040 		mcp->mb[0] = MBC_LIP_FULL_LOGIN;
2041 		mcp->mb[1] = BIT_1;
2042 		mcp->mb[2] = 0;
2043 		mcp->out_mb = MBX_2|MBX_1|MBX_0;
2044 	} else if (IS_FWI2_CAPABLE(vha->hw)) {
2045 		mcp->mb[0] = MBC_LIP_FULL_LOGIN;
2046 		mcp->mb[1] = BIT_6;
2047 		mcp->mb[2] = 0;
2048 		mcp->mb[3] = vha->hw->loop_reset_delay;
2049 		mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2050 	} else {
2051 		mcp->mb[0] = MBC_LIP_RESET;
2052 		mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2053 		if (HAS_EXTENDED_IDS(vha->hw)) {
2054 			mcp->mb[1] = 0x00ff;
2055 			mcp->mb[10] = 0;
2056 			mcp->out_mb |= MBX_10;
2057 		} else {
2058 			mcp->mb[1] = 0xff00;
2059 		}
2060 		mcp->mb[2] = vha->hw->loop_reset_delay;
2061 		mcp->mb[3] = 0;
2062 	}
2063 	mcp->in_mb = MBX_0;
2064 	mcp->tov = MBX_TOV_SECONDS;
2065 	mcp->flags = 0;
2066 	rval = qla2x00_mailbox_command(vha, mcp);
2067 
2068 	if (rval != QLA_SUCCESS) {
2069 		/*EMPTY*/
2070 		ql_dbg(ql_dbg_mbx, vha, 0x105b, "Failed=%x.\n", rval);
2071 	} else {
2072 		/*EMPTY*/
2073 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105c,
2074 		    "Done %s.\n", __func__);
2075 	}
2076 
2077 	return rval;
2078 }
2079 
2080 /*
2081  * qla2x00_send_sns
2082  *	Send SNS command.
2083  *
2084  * Input:
2085  *	ha = adapter block pointer.
2086  *	sns = pointer for command.
2087  *	cmd_size = command size.
2088  *	buf_size = response/command size.
2089  *	TARGET_QUEUE_LOCK must be released.
2090  *	ADAPTER_STATE_LOCK must be released.
2091  *
2092  * Returns:
2093  *	qla2x00 local function return status code.
2094  *
2095  * Context:
2096  *	Kernel context.
2097  */
2098 int
2099 qla2x00_send_sns(scsi_qla_host_t *vha, dma_addr_t sns_phys_address,
2100     uint16_t cmd_size, size_t buf_size)
2101 {
2102 	int rval;
2103 	mbx_cmd_t mc;
2104 	mbx_cmd_t *mcp = &mc;
2105 
2106 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105d,
2107 	    "Entered %s.\n", __func__);
2108 
2109 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105e,
2110 	    "Retry cnt=%d ratov=%d total tov=%d.\n",
2111 	    vha->hw->retry_count, vha->hw->login_timeout, mcp->tov);
2112 
2113 	mcp->mb[0] = MBC_SEND_SNS_COMMAND;
2114 	mcp->mb[1] = cmd_size;
2115 	mcp->mb[2] = MSW(sns_phys_address);
2116 	mcp->mb[3] = LSW(sns_phys_address);
2117 	mcp->mb[6] = MSW(MSD(sns_phys_address));
2118 	mcp->mb[7] = LSW(MSD(sns_phys_address));
2119 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2120 	mcp->in_mb = MBX_0|MBX_1;
2121 	mcp->buf_size = buf_size;
2122 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN;
2123 	mcp->tov = (vha->hw->login_timeout * 2) + (vha->hw->login_timeout / 2);
2124 	rval = qla2x00_mailbox_command(vha, mcp);
2125 
2126 	if (rval != QLA_SUCCESS) {
2127 		/*EMPTY*/
2128 		ql_dbg(ql_dbg_mbx, vha, 0x105f,
2129 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
2130 		    rval, mcp->mb[0], mcp->mb[1]);
2131 	} else {
2132 		/*EMPTY*/
2133 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1060,
2134 		    "Done %s.\n", __func__);
2135 	}
2136 
2137 	return rval;
2138 }
2139 
2140 int
2141 qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
2142     uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
2143 {
2144 	int		rval;
2145 
2146 	struct logio_entry_24xx *lg;
2147 	dma_addr_t	lg_dma;
2148 	uint32_t	iop[2];
2149 	struct qla_hw_data *ha = vha->hw;
2150 	struct req_que *req;
2151 
2152 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1061,
2153 	    "Entered %s.\n", __func__);
2154 
2155 	if (ha->flags.cpu_affinity_enabled)
2156 		req = ha->req_q_map[0];
2157 	else
2158 		req = vha->req;
2159 
2160 	lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);
2161 	if (lg == NULL) {
2162 		ql_log(ql_log_warn, vha, 0x1062,
2163 		    "Failed to allocate login IOCB.\n");
2164 		return QLA_MEMORY_ALLOC_FAILED;
2165 	}
2166 	memset(lg, 0, sizeof(struct logio_entry_24xx));
2167 
2168 	lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;
2169 	lg->entry_count = 1;
2170 	lg->handle = MAKE_HANDLE(req->id, lg->handle);
2171 	lg->nport_handle = cpu_to_le16(loop_id);
2172 	lg->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI);
2173 	if (opt & BIT_0)
2174 		lg->control_flags |= cpu_to_le16(LCF_COND_PLOGI);
2175 	if (opt & BIT_1)
2176 		lg->control_flags |= cpu_to_le16(LCF_SKIP_PRLI);
2177 	lg->port_id[0] = al_pa;
2178 	lg->port_id[1] = area;
2179 	lg->port_id[2] = domain;
2180 	lg->vp_index = vha->vp_idx;
2181 	rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0,
2182 	    (ha->r_a_tov / 10 * 2) + 2);
2183 	if (rval != QLA_SUCCESS) {
2184 		ql_dbg(ql_dbg_mbx, vha, 0x1063,
2185 		    "Failed to issue login IOCB (%x).\n", rval);
2186 	} else if (lg->entry_status != 0) {
2187 		ql_dbg(ql_dbg_mbx, vha, 0x1064,
2188 		    "Failed to complete IOCB -- error status (%x).\n",
2189 		    lg->entry_status);
2190 		rval = QLA_FUNCTION_FAILED;
2191 	} else if (lg->comp_status != cpu_to_le16(CS_COMPLETE)) {
2192 		iop[0] = le32_to_cpu(lg->io_parameter[0]);
2193 		iop[1] = le32_to_cpu(lg->io_parameter[1]);
2194 
2195 		ql_dbg(ql_dbg_mbx, vha, 0x1065,
2196 		    "Failed to complete IOCB -- completion  status (%x) "
2197 		    "ioparam=%x/%x.\n", le16_to_cpu(lg->comp_status),
2198 		    iop[0], iop[1]);
2199 
2200 		switch (iop[0]) {
2201 		case LSC_SCODE_PORTID_USED:
2202 			mb[0] = MBS_PORT_ID_USED;
2203 			mb[1] = LSW(iop[1]);
2204 			break;
2205 		case LSC_SCODE_NPORT_USED:
2206 			mb[0] = MBS_LOOP_ID_USED;
2207 			break;
2208 		case LSC_SCODE_NOLINK:
2209 		case LSC_SCODE_NOIOCB:
2210 		case LSC_SCODE_NOXCB:
2211 		case LSC_SCODE_CMD_FAILED:
2212 		case LSC_SCODE_NOFABRIC:
2213 		case LSC_SCODE_FW_NOT_READY:
2214 		case LSC_SCODE_NOT_LOGGED_IN:
2215 		case LSC_SCODE_NOPCB:
2216 		case LSC_SCODE_ELS_REJECT:
2217 		case LSC_SCODE_CMD_PARAM_ERR:
2218 		case LSC_SCODE_NONPORT:
2219 		case LSC_SCODE_LOGGED_IN:
2220 		case LSC_SCODE_NOFLOGI_ACC:
2221 		default:
2222 			mb[0] = MBS_COMMAND_ERROR;
2223 			break;
2224 		}
2225 	} else {
2226 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1066,
2227 		    "Done %s.\n", __func__);
2228 
2229 		iop[0] = le32_to_cpu(lg->io_parameter[0]);
2230 
2231 		mb[0] = MBS_COMMAND_COMPLETE;
2232 		mb[1] = 0;
2233 		if (iop[0] & BIT_4) {
2234 			if (iop[0] & BIT_8)
2235 				mb[1] |= BIT_1;
2236 		} else
2237 			mb[1] = BIT_0;
2238 
2239 		/* Passback COS information. */
2240 		mb[10] = 0;
2241 		if (lg->io_parameter[7] || lg->io_parameter[8])
2242 			mb[10] |= BIT_0;	/* Class 2. */
2243 		if (lg->io_parameter[9] || lg->io_parameter[10])
2244 			mb[10] |= BIT_1;	/* Class 3. */
2245 		if (lg->io_parameter[0] & cpu_to_le32(BIT_7))
2246 			mb[10] |= BIT_7;	/* Confirmed Completion
2247 						 * Allowed
2248 						 */
2249 	}
2250 
2251 	dma_pool_free(ha->s_dma_pool, lg, lg_dma);
2252 
2253 	return rval;
2254 }
2255 
2256 /*
2257  * qla2x00_login_fabric
2258  *	Issue login fabric port mailbox command.
2259  *
2260  * Input:
2261  *	ha = adapter block pointer.
2262  *	loop_id = device loop ID.
2263  *	domain = device domain.
2264  *	area = device area.
2265  *	al_pa = device AL_PA.
2266  *	status = pointer for return status.
2267  *	opt = command options.
2268  *	TARGET_QUEUE_LOCK must be released.
2269  *	ADAPTER_STATE_LOCK must be released.
2270  *
2271  * Returns:
2272  *	qla2x00 local function return status code.
2273  *
2274  * Context:
2275  *	Kernel context.
2276  */
2277 int
2278 qla2x00_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
2279     uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
2280 {
2281 	int rval;
2282 	mbx_cmd_t mc;
2283 	mbx_cmd_t *mcp = &mc;
2284 	struct qla_hw_data *ha = vha->hw;
2285 
2286 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1067,
2287 	    "Entered %s.\n", __func__);
2288 
2289 	mcp->mb[0] = MBC_LOGIN_FABRIC_PORT;
2290 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2291 	if (HAS_EXTENDED_IDS(ha)) {
2292 		mcp->mb[1] = loop_id;
2293 		mcp->mb[10] = opt;
2294 		mcp->out_mb |= MBX_10;
2295 	} else {
2296 		mcp->mb[1] = (loop_id << 8) | opt;
2297 	}
2298 	mcp->mb[2] = domain;
2299 	mcp->mb[3] = area << 8 | al_pa;
2300 
2301 	mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0;
2302 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
2303 	mcp->flags = 0;
2304 	rval = qla2x00_mailbox_command(vha, mcp);
2305 
2306 	/* Return mailbox statuses. */
2307 	if (mb != NULL) {
2308 		mb[0] = mcp->mb[0];
2309 		mb[1] = mcp->mb[1];
2310 		mb[2] = mcp->mb[2];
2311 		mb[6] = mcp->mb[6];
2312 		mb[7] = mcp->mb[7];
2313 		/* COS retrieved from Get-Port-Database mailbox command. */
2314 		mb[10] = 0;
2315 	}
2316 
2317 	if (rval != QLA_SUCCESS) {
2318 		/* RLU tmp code: need to change main mailbox_command function to
2319 		 * return ok even when the mailbox completion value is not
2320 		 * SUCCESS. The caller needs to be responsible to interpret
2321 		 * the return values of this mailbox command if we're not
2322 		 * to change too much of the existing code.
2323 		 */
2324 		if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||
2325 		    mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||
2326 		    mcp->mb[0] == 0x4006)
2327 			rval = QLA_SUCCESS;
2328 
2329 		/*EMPTY*/
2330 		ql_dbg(ql_dbg_mbx, vha, 0x1068,
2331 		    "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
2332 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
2333 	} else {
2334 		/*EMPTY*/
2335 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1069,
2336 		    "Done %s.\n", __func__);
2337 	}
2338 
2339 	return rval;
2340 }
2341 
2342 /*
2343  * qla2x00_login_local_device
2344  *           Issue login loop port mailbox command.
2345  *
2346  * Input:
2347  *           ha = adapter block pointer.
2348  *           loop_id = device loop ID.
2349  *           opt = command options.
2350  *
2351  * Returns:
2352  *            Return status code.
2353  *
2354  * Context:
2355  *            Kernel context.
2356  *
2357  */
2358 int
2359 qla2x00_login_local_device(scsi_qla_host_t *vha, fc_port_t *fcport,
2360     uint16_t *mb_ret, uint8_t opt)
2361 {
2362 	int rval;
2363 	mbx_cmd_t mc;
2364 	mbx_cmd_t *mcp = &mc;
2365 	struct qla_hw_data *ha = vha->hw;
2366 
2367 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x106a,
2368 	    "Entered %s.\n", __func__);
2369 
2370 	if (IS_FWI2_CAPABLE(ha))
2371 		return qla24xx_login_fabric(vha, fcport->loop_id,
2372 		    fcport->d_id.b.domain, fcport->d_id.b.area,
2373 		    fcport->d_id.b.al_pa, mb_ret, opt);
2374 
2375 	mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
2376 	if (HAS_EXTENDED_IDS(ha))
2377 		mcp->mb[1] = fcport->loop_id;
2378 	else
2379 		mcp->mb[1] = fcport->loop_id << 8;
2380 	mcp->mb[2] = opt;
2381 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
2382  	mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
2383 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
2384 	mcp->flags = 0;
2385 	rval = qla2x00_mailbox_command(vha, mcp);
2386 
2387  	/* Return mailbox statuses. */
2388  	if (mb_ret != NULL) {
2389  		mb_ret[0] = mcp->mb[0];
2390  		mb_ret[1] = mcp->mb[1];
2391  		mb_ret[6] = mcp->mb[6];
2392  		mb_ret[7] = mcp->mb[7];
2393  	}
2394 
2395 	if (rval != QLA_SUCCESS) {
2396  		/* AV tmp code: need to change main mailbox_command function to
2397  		 * return ok even when the mailbox completion value is not
2398  		 * SUCCESS. The caller needs to be responsible to interpret
2399  		 * the return values of this mailbox command if we're not
2400  		 * to change too much of the existing code.
2401  		 */
2402  		if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006)
2403  			rval = QLA_SUCCESS;
2404 
2405 		ql_dbg(ql_dbg_mbx, vha, 0x106b,
2406 		    "Failed=%x mb[0]=%x mb[1]=%x mb[6]=%x mb[7]=%x.\n",
2407 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);
2408 	} else {
2409 		/*EMPTY*/
2410 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x106c,
2411 		    "Done %s.\n", __func__);
2412 	}
2413 
2414 	return (rval);
2415 }
2416 
2417 int
2418 qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
2419     uint8_t area, uint8_t al_pa)
2420 {
2421 	int		rval;
2422 	struct logio_entry_24xx *lg;
2423 	dma_addr_t	lg_dma;
2424 	struct qla_hw_data *ha = vha->hw;
2425 	struct req_que *req;
2426 
2427 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x106d,
2428 	    "Entered %s.\n", __func__);
2429 
2430 	lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);
2431 	if (lg == NULL) {
2432 		ql_log(ql_log_warn, vha, 0x106e,
2433 		    "Failed to allocate logout IOCB.\n");
2434 		return QLA_MEMORY_ALLOC_FAILED;
2435 	}
2436 	memset(lg, 0, sizeof(struct logio_entry_24xx));
2437 
2438 	if (ql2xmaxqueues > 1)
2439 		req = ha->req_q_map[0];
2440 	else
2441 		req = vha->req;
2442 	lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;
2443 	lg->entry_count = 1;
2444 	lg->handle = MAKE_HANDLE(req->id, lg->handle);
2445 	lg->nport_handle = cpu_to_le16(loop_id);
2446 	lg->control_flags =
2447 	    cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO|
2448 		LCF_FREE_NPORT);
2449 	lg->port_id[0] = al_pa;
2450 	lg->port_id[1] = area;
2451 	lg->port_id[2] = domain;
2452 	lg->vp_index = vha->vp_idx;
2453 	rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0,
2454 	    (ha->r_a_tov / 10 * 2) + 2);
2455 	if (rval != QLA_SUCCESS) {
2456 		ql_dbg(ql_dbg_mbx, vha, 0x106f,
2457 		    "Failed to issue logout IOCB (%x).\n", rval);
2458 	} else if (lg->entry_status != 0) {
2459 		ql_dbg(ql_dbg_mbx, vha, 0x1070,
2460 		    "Failed to complete IOCB -- error status (%x).\n",
2461 		    lg->entry_status);
2462 		rval = QLA_FUNCTION_FAILED;
2463 	} else if (lg->comp_status != cpu_to_le16(CS_COMPLETE)) {
2464 		ql_dbg(ql_dbg_mbx, vha, 0x1071,
2465 		    "Failed to complete IOCB -- completion status (%x) "
2466 		    "ioparam=%x/%x.\n", le16_to_cpu(lg->comp_status),
2467 		    le32_to_cpu(lg->io_parameter[0]),
2468 		    le32_to_cpu(lg->io_parameter[1]));
2469 	} else {
2470 		/*EMPTY*/
2471 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1072,
2472 		    "Done %s.\n", __func__);
2473 	}
2474 
2475 	dma_pool_free(ha->s_dma_pool, lg, lg_dma);
2476 
2477 	return rval;
2478 }
2479 
2480 /*
2481  * qla2x00_fabric_logout
2482  *	Issue logout fabric port mailbox command.
2483  *
2484  * Input:
2485  *	ha = adapter block pointer.
2486  *	loop_id = device loop ID.
2487  *	TARGET_QUEUE_LOCK must be released.
2488  *	ADAPTER_STATE_LOCK must be released.
2489  *
2490  * Returns:
2491  *	qla2x00 local function return status code.
2492  *
2493  * Context:
2494  *	Kernel context.
2495  */
2496 int
2497 qla2x00_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
2498     uint8_t area, uint8_t al_pa)
2499 {
2500 	int rval;
2501 	mbx_cmd_t mc;
2502 	mbx_cmd_t *mcp = &mc;
2503 
2504 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1073,
2505 	    "Entered %s.\n", __func__);
2506 
2507 	mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
2508 	mcp->out_mb = MBX_1|MBX_0;
2509 	if (HAS_EXTENDED_IDS(vha->hw)) {
2510 		mcp->mb[1] = loop_id;
2511 		mcp->mb[10] = 0;
2512 		mcp->out_mb |= MBX_10;
2513 	} else {
2514 		mcp->mb[1] = loop_id << 8;
2515 	}
2516 
2517 	mcp->in_mb = MBX_1|MBX_0;
2518 	mcp->tov = MBX_TOV_SECONDS;
2519 	mcp->flags = 0;
2520 	rval = qla2x00_mailbox_command(vha, mcp);
2521 
2522 	if (rval != QLA_SUCCESS) {
2523 		/*EMPTY*/
2524 		ql_dbg(ql_dbg_mbx, vha, 0x1074,
2525 		    "Failed=%x mb[1]=%x.\n", rval, mcp->mb[1]);
2526 	} else {
2527 		/*EMPTY*/
2528 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1075,
2529 		    "Done %s.\n", __func__);
2530 	}
2531 
2532 	return rval;
2533 }
2534 
2535 /*
2536  * qla2x00_full_login_lip
2537  *	Issue full login LIP mailbox command.
2538  *
2539  * Input:
2540  *	ha = adapter block pointer.
2541  *	TARGET_QUEUE_LOCK must be released.
2542  *	ADAPTER_STATE_LOCK must be released.
2543  *
2544  * Returns:
2545  *	qla2x00 local function return status code.
2546  *
2547  * Context:
2548  *	Kernel context.
2549  */
2550 int
2551 qla2x00_full_login_lip(scsi_qla_host_t *vha)
2552 {
2553 	int rval;
2554 	mbx_cmd_t mc;
2555 	mbx_cmd_t *mcp = &mc;
2556 
2557 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1076,
2558 	    "Entered %s.\n", __func__);
2559 
2560 	mcp->mb[0] = MBC_LIP_FULL_LOGIN;
2561 	mcp->mb[1] = IS_FWI2_CAPABLE(vha->hw) ? BIT_3 : 0;
2562 	mcp->mb[2] = 0;
2563 	mcp->mb[3] = 0;
2564 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2565 	mcp->in_mb = MBX_0;
2566 	mcp->tov = MBX_TOV_SECONDS;
2567 	mcp->flags = 0;
2568 	rval = qla2x00_mailbox_command(vha, mcp);
2569 
2570 	if (rval != QLA_SUCCESS) {
2571 		/*EMPTY*/
2572 		ql_dbg(ql_dbg_mbx, vha, 0x1077, "Failed=%x.\n", rval);
2573 	} else {
2574 		/*EMPTY*/
2575 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1078,
2576 		    "Done %s.\n", __func__);
2577 	}
2578 
2579 	return rval;
2580 }
2581 
2582 /*
2583  * qla2x00_get_id_list
2584  *
2585  * Input:
2586  *	ha = adapter block pointer.
2587  *
2588  * Returns:
2589  *	qla2x00 local function return status code.
2590  *
2591  * Context:
2592  *	Kernel context.
2593  */
2594 int
2595 qla2x00_get_id_list(scsi_qla_host_t *vha, void *id_list, dma_addr_t id_list_dma,
2596     uint16_t *entries)
2597 {
2598 	int rval;
2599 	mbx_cmd_t mc;
2600 	mbx_cmd_t *mcp = &mc;
2601 
2602 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1079,
2603 	    "Entered %s.\n", __func__);
2604 
2605 	if (id_list == NULL)
2606 		return QLA_FUNCTION_FAILED;
2607 
2608 	mcp->mb[0] = MBC_GET_ID_LIST;
2609 	mcp->out_mb = MBX_0;
2610 	if (IS_FWI2_CAPABLE(vha->hw)) {
2611 		mcp->mb[2] = MSW(id_list_dma);
2612 		mcp->mb[3] = LSW(id_list_dma);
2613 		mcp->mb[6] = MSW(MSD(id_list_dma));
2614 		mcp->mb[7] = LSW(MSD(id_list_dma));
2615 		mcp->mb[8] = 0;
2616 		mcp->mb[9] = vha->vp_idx;
2617 		mcp->out_mb |= MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2;
2618 	} else {
2619 		mcp->mb[1] = MSW(id_list_dma);
2620 		mcp->mb[2] = LSW(id_list_dma);
2621 		mcp->mb[3] = MSW(MSD(id_list_dma));
2622 		mcp->mb[6] = LSW(MSD(id_list_dma));
2623 		mcp->out_mb |= MBX_6|MBX_3|MBX_2|MBX_1;
2624 	}
2625 	mcp->in_mb = MBX_1|MBX_0;
2626 	mcp->tov = MBX_TOV_SECONDS;
2627 	mcp->flags = 0;
2628 	rval = qla2x00_mailbox_command(vha, mcp);
2629 
2630 	if (rval != QLA_SUCCESS) {
2631 		/*EMPTY*/
2632 		ql_dbg(ql_dbg_mbx, vha, 0x107a, "Failed=%x.\n", rval);
2633 	} else {
2634 		*entries = mcp->mb[1];
2635 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107b,
2636 		    "Done %s.\n", __func__);
2637 	}
2638 
2639 	return rval;
2640 }
2641 
2642 /*
2643  * qla2x00_get_resource_cnts
2644  *	Get current firmware resource counts.
2645  *
2646  * Input:
2647  *	ha = adapter block pointer.
2648  *
2649  * Returns:
2650  *	qla2x00 local function return status code.
2651  *
2652  * Context:
2653  *	Kernel context.
2654  */
2655 int
2656 qla2x00_get_resource_cnts(scsi_qla_host_t *vha)
2657 {
2658 	struct qla_hw_data *ha = vha->hw;
2659 	int rval;
2660 	mbx_cmd_t mc;
2661 	mbx_cmd_t *mcp = &mc;
2662 
2663 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107c,
2664 	    "Entered %s.\n", __func__);
2665 
2666 	mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
2667 	mcp->out_mb = MBX_0;
2668 	mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2669 	if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw) || IS_QLA27XX(vha->hw))
2670 		mcp->in_mb |= MBX_12;
2671 	mcp->tov = MBX_TOV_SECONDS;
2672 	mcp->flags = 0;
2673 	rval = qla2x00_mailbox_command(vha, mcp);
2674 
2675 	if (rval != QLA_SUCCESS) {
2676 		/*EMPTY*/
2677 		ql_dbg(ql_dbg_mbx, vha, 0x107d,
2678 		    "Failed mb[0]=%x.\n", mcp->mb[0]);
2679 	} else {
2680 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107e,
2681 		    "Done %s mb1=%x mb2=%x mb3=%x mb6=%x mb7=%x mb10=%x "
2682 		    "mb11=%x mb12=%x.\n", __func__, mcp->mb[1], mcp->mb[2],
2683 		    mcp->mb[3], mcp->mb[6], mcp->mb[7], mcp->mb[10],
2684 		    mcp->mb[11], mcp->mb[12]);
2685 
2686 		ha->orig_fw_tgt_xcb_count =  mcp->mb[1];
2687 		ha->cur_fw_tgt_xcb_count = mcp->mb[2];
2688 		ha->cur_fw_xcb_count = mcp->mb[3];
2689 		ha->orig_fw_xcb_count = mcp->mb[6];
2690 		ha->cur_fw_iocb_count = mcp->mb[7];
2691 		ha->orig_fw_iocb_count = mcp->mb[10];
2692 		if (ha->flags.npiv_supported)
2693 			ha->max_npiv_vports = mcp->mb[11];
2694 		if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha))
2695 			ha->fw_max_fcf_count = mcp->mb[12];
2696 	}
2697 
2698 	return (rval);
2699 }
2700 
2701 /*
2702  * qla2x00_get_fcal_position_map
2703  *	Get FCAL (LILP) position map using mailbox command
2704  *
2705  * Input:
2706  *	ha = adapter state pointer.
2707  *	pos_map = buffer pointer (can be NULL).
2708  *
2709  * Returns:
2710  *	qla2x00 local function return status code.
2711  *
2712  * Context:
2713  *	Kernel context.
2714  */
2715 int
2716 qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map)
2717 {
2718 	int rval;
2719 	mbx_cmd_t mc;
2720 	mbx_cmd_t *mcp = &mc;
2721 	char *pmap;
2722 	dma_addr_t pmap_dma;
2723 	struct qla_hw_data *ha = vha->hw;
2724 
2725 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107f,
2726 	    "Entered %s.\n", __func__);
2727 
2728 	pmap = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pmap_dma);
2729 	if (pmap  == NULL) {
2730 		ql_log(ql_log_warn, vha, 0x1080,
2731 		    "Memory alloc failed.\n");
2732 		return QLA_MEMORY_ALLOC_FAILED;
2733 	}
2734 	memset(pmap, 0, FCAL_MAP_SIZE);
2735 
2736 	mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP;
2737 	mcp->mb[2] = MSW(pmap_dma);
2738 	mcp->mb[3] = LSW(pmap_dma);
2739 	mcp->mb[6] = MSW(MSD(pmap_dma));
2740 	mcp->mb[7] = LSW(MSD(pmap_dma));
2741 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2742 	mcp->in_mb = MBX_1|MBX_0;
2743 	mcp->buf_size = FCAL_MAP_SIZE;
2744 	mcp->flags = MBX_DMA_IN;
2745 	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
2746 	rval = qla2x00_mailbox_command(vha, mcp);
2747 
2748 	if (rval == QLA_SUCCESS) {
2749 		ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1081,
2750 		    "mb0/mb1=%x/%X FC/AL position map size (%x).\n",
2751 		    mcp->mb[0], mcp->mb[1], (unsigned)pmap[0]);
2752 		ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111d,
2753 		    pmap, pmap[0] + 1);
2754 
2755 		if (pos_map)
2756 			memcpy(pos_map, pmap, FCAL_MAP_SIZE);
2757 	}
2758 	dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);
2759 
2760 	if (rval != QLA_SUCCESS) {
2761 		ql_dbg(ql_dbg_mbx, vha, 0x1082, "Failed=%x.\n", rval);
2762 	} else {
2763 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1083,
2764 		    "Done %s.\n", __func__);
2765 	}
2766 
2767 	return rval;
2768 }
2769 
2770 /*
2771  * qla2x00_get_link_status
2772  *
2773  * Input:
2774  *	ha = adapter block pointer.
2775  *	loop_id = device loop ID.
2776  *	ret_buf = pointer to link status return buffer.
2777  *
2778  * Returns:
2779  *	0 = success.
2780  *	BIT_0 = mem alloc error.
2781  *	BIT_1 = mailbox error.
2782  */
2783 int
2784 qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id,
2785     struct link_statistics *stats, dma_addr_t stats_dma)
2786 {
2787 	int rval;
2788 	mbx_cmd_t mc;
2789 	mbx_cmd_t *mcp = &mc;
2790 	uint32_t *iter = (void *)stats;
2791 	ushort dwords = offsetof(typeof(*stats), link_up_cnt)/sizeof(*iter);
2792 	struct qla_hw_data *ha = vha->hw;
2793 
2794 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1084,
2795 	    "Entered %s.\n", __func__);
2796 
2797 	mcp->mb[0] = MBC_GET_LINK_STATUS;
2798 	mcp->mb[2] = MSW(LSD(stats_dma));
2799 	mcp->mb[3] = LSW(LSD(stats_dma));
2800 	mcp->mb[6] = MSW(MSD(stats_dma));
2801 	mcp->mb[7] = LSW(MSD(stats_dma));
2802 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2803 	mcp->in_mb = MBX_0;
2804 	if (IS_FWI2_CAPABLE(ha)) {
2805 		mcp->mb[1] = loop_id;
2806 		mcp->mb[4] = 0;
2807 		mcp->mb[10] = 0;
2808 		mcp->out_mb |= MBX_10|MBX_4|MBX_1;
2809 		mcp->in_mb |= MBX_1;
2810 	} else if (HAS_EXTENDED_IDS(ha)) {
2811 		mcp->mb[1] = loop_id;
2812 		mcp->mb[10] = 0;
2813 		mcp->out_mb |= MBX_10|MBX_1;
2814 	} else {
2815 		mcp->mb[1] = loop_id << 8;
2816 		mcp->out_mb |= MBX_1;
2817 	}
2818 	mcp->tov = MBX_TOV_SECONDS;
2819 	mcp->flags = IOCTL_CMD;
2820 	rval = qla2x00_mailbox_command(vha, mcp);
2821 
2822 	if (rval == QLA_SUCCESS) {
2823 		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
2824 			ql_dbg(ql_dbg_mbx, vha, 0x1085,
2825 			    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
2826 			rval = QLA_FUNCTION_FAILED;
2827 		} else {
2828 			/* Re-endianize - firmware data is le32. */
2829 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1086,
2830 			    "Done %s.\n", __func__);
2831 			for ( ; dwords--; iter++)
2832 				le32_to_cpus(iter);
2833 		}
2834 	} else {
2835 		/* Failed. */
2836 		ql_dbg(ql_dbg_mbx, vha, 0x1087, "Failed=%x.\n", rval);
2837 	}
2838 
2839 	return rval;
2840 }
2841 
2842 int
2843 qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats,
2844     dma_addr_t stats_dma, uint options)
2845 {
2846 	int rval;
2847 	mbx_cmd_t mc;
2848 	mbx_cmd_t *mcp = &mc;
2849 	uint32_t *iter, dwords;
2850 
2851 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1088,
2852 	    "Entered %s.\n", __func__);
2853 
2854 	mcp->mb[0] = MBC_GET_LINK_PRIV_STATS;
2855 	mcp->mb[2] = MSW(stats_dma);
2856 	mcp->mb[3] = LSW(stats_dma);
2857 	mcp->mb[6] = MSW(MSD(stats_dma));
2858 	mcp->mb[7] = LSW(MSD(stats_dma));
2859 	mcp->mb[8] = sizeof(struct link_statistics) / 4;
2860 	mcp->mb[9] = vha->vp_idx;
2861 	mcp->mb[10] = options;
2862 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2863 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
2864 	mcp->tov = MBX_TOV_SECONDS;
2865 	mcp->flags = IOCTL_CMD;
2866 	rval = qla2x00_mailbox_command(vha, mcp);
2867 
2868 	if (rval == QLA_SUCCESS) {
2869 		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
2870 			ql_dbg(ql_dbg_mbx, vha, 0x1089,
2871 			    "Failed mb[0]=%x.\n", mcp->mb[0]);
2872 			rval = QLA_FUNCTION_FAILED;
2873 		} else {
2874 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x108a,
2875 			    "Done %s.\n", __func__);
2876 			/* Re-endianize - firmware data is le32. */
2877 			dwords = sizeof(struct link_statistics) / 4;
2878 			iter = &stats->link_fail_cnt;
2879 			for ( ; dwords--; iter++)
2880 				le32_to_cpus(iter);
2881 		}
2882 	} else {
2883 		/* Failed. */
2884 		ql_dbg(ql_dbg_mbx, vha, 0x108b, "Failed=%x.\n", rval);
2885 	}
2886 
2887 	return rval;
2888 }
2889 
2890 int
2891 qla24xx_abort_command(srb_t *sp)
2892 {
2893 	int		rval;
2894 	unsigned long   flags = 0;
2895 
2896 	struct abort_entry_24xx *abt;
2897 	dma_addr_t	abt_dma;
2898 	uint32_t	handle;
2899 	fc_port_t	*fcport = sp->fcport;
2900 	struct scsi_qla_host *vha = fcport->vha;
2901 	struct qla_hw_data *ha = vha->hw;
2902 	struct req_que *req = vha->req;
2903 
2904 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x108c,
2905 	    "Entered %s.\n", __func__);
2906 
2907 	if (ql2xasynctmfenable)
2908 		return qla24xx_async_abort_command(sp);
2909 
2910 	spin_lock_irqsave(&ha->hardware_lock, flags);
2911 	for (handle = 1; handle < req->num_outstanding_cmds; handle++) {
2912 		if (req->outstanding_cmds[handle] == sp)
2913 			break;
2914 	}
2915 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
2916 	if (handle == req->num_outstanding_cmds) {
2917 		/* Command not found. */
2918 		return QLA_FUNCTION_FAILED;
2919 	}
2920 
2921 	abt = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &abt_dma);
2922 	if (abt == NULL) {
2923 		ql_log(ql_log_warn, vha, 0x108d,
2924 		    "Failed to allocate abort IOCB.\n");
2925 		return QLA_MEMORY_ALLOC_FAILED;
2926 	}
2927 	memset(abt, 0, sizeof(struct abort_entry_24xx));
2928 
2929 	abt->entry_type = ABORT_IOCB_TYPE;
2930 	abt->entry_count = 1;
2931 	abt->handle = MAKE_HANDLE(req->id, abt->handle);
2932 	abt->nport_handle = cpu_to_le16(fcport->loop_id);
2933 	abt->handle_to_abort = MAKE_HANDLE(req->id, handle);
2934 	abt->port_id[0] = fcport->d_id.b.al_pa;
2935 	abt->port_id[1] = fcport->d_id.b.area;
2936 	abt->port_id[2] = fcport->d_id.b.domain;
2937 	abt->vp_index = fcport->vha->vp_idx;
2938 
2939 	abt->req_que_no = cpu_to_le16(req->id);
2940 
2941 	rval = qla2x00_issue_iocb(vha, abt, abt_dma, 0);
2942 	if (rval != QLA_SUCCESS) {
2943 		ql_dbg(ql_dbg_mbx, vha, 0x108e,
2944 		    "Failed to issue IOCB (%x).\n", rval);
2945 	} else if (abt->entry_status != 0) {
2946 		ql_dbg(ql_dbg_mbx, vha, 0x108f,
2947 		    "Failed to complete IOCB -- error status (%x).\n",
2948 		    abt->entry_status);
2949 		rval = QLA_FUNCTION_FAILED;
2950 	} else if (abt->nport_handle != cpu_to_le16(0)) {
2951 		ql_dbg(ql_dbg_mbx, vha, 0x1090,
2952 		    "Failed to complete IOCB -- completion status (%x).\n",
2953 		    le16_to_cpu(abt->nport_handle));
2954 		if (abt->nport_handle == CS_IOCB_ERROR)
2955 			rval = QLA_FUNCTION_PARAMETER_ERROR;
2956 		else
2957 			rval = QLA_FUNCTION_FAILED;
2958 	} else {
2959 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1091,
2960 		    "Done %s.\n", __func__);
2961 	}
2962 
2963 	dma_pool_free(ha->s_dma_pool, abt, abt_dma);
2964 
2965 	return rval;
2966 }
2967 
2968 struct tsk_mgmt_cmd {
2969 	union {
2970 		struct tsk_mgmt_entry tsk;
2971 		struct sts_entry_24xx sts;
2972 	} p;
2973 };
2974 
2975 static int
2976 __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
2977     uint64_t l, int tag)
2978 {
2979 	int		rval, rval2;
2980 	struct tsk_mgmt_cmd *tsk;
2981 	struct sts_entry_24xx *sts;
2982 	dma_addr_t	tsk_dma;
2983 	scsi_qla_host_t *vha;
2984 	struct qla_hw_data *ha;
2985 	struct req_que *req;
2986 	struct rsp_que *rsp;
2987 
2988 	vha = fcport->vha;
2989 	ha = vha->hw;
2990 	req = vha->req;
2991 
2992 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1092,
2993 	    "Entered %s.\n", __func__);
2994 
2995 	if (ha->flags.cpu_affinity_enabled)
2996 		rsp = ha->rsp_q_map[tag + 1];
2997 	else
2998 		rsp = req->rsp;
2999 	tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma);
3000 	if (tsk == NULL) {
3001 		ql_log(ql_log_warn, vha, 0x1093,
3002 		    "Failed to allocate task management IOCB.\n");
3003 		return QLA_MEMORY_ALLOC_FAILED;
3004 	}
3005 	memset(tsk, 0, sizeof(struct tsk_mgmt_cmd));
3006 
3007 	tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE;
3008 	tsk->p.tsk.entry_count = 1;
3009 	tsk->p.tsk.handle = MAKE_HANDLE(req->id, tsk->p.tsk.handle);
3010 	tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id);
3011 	tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
3012 	tsk->p.tsk.control_flags = cpu_to_le32(type);
3013 	tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa;
3014 	tsk->p.tsk.port_id[1] = fcport->d_id.b.area;
3015 	tsk->p.tsk.port_id[2] = fcport->d_id.b.domain;
3016 	tsk->p.tsk.vp_index = fcport->vha->vp_idx;
3017 	if (type == TCF_LUN_RESET) {
3018 		int_to_scsilun(l, &tsk->p.tsk.lun);
3019 		host_to_fcp_swap((uint8_t *)&tsk->p.tsk.lun,
3020 		    sizeof(tsk->p.tsk.lun));
3021 	}
3022 
3023 	sts = &tsk->p.sts;
3024 	rval = qla2x00_issue_iocb(vha, tsk, tsk_dma, 0);
3025 	if (rval != QLA_SUCCESS) {
3026 		ql_dbg(ql_dbg_mbx, vha, 0x1094,
3027 		    "Failed to issue %s reset IOCB (%x).\n", name, rval);
3028 	} else if (sts->entry_status != 0) {
3029 		ql_dbg(ql_dbg_mbx, vha, 0x1095,
3030 		    "Failed to complete IOCB -- error status (%x).\n",
3031 		    sts->entry_status);
3032 		rval = QLA_FUNCTION_FAILED;
3033 	} else if (sts->comp_status != cpu_to_le16(CS_COMPLETE)) {
3034 		ql_dbg(ql_dbg_mbx, vha, 0x1096,
3035 		    "Failed to complete IOCB -- completion status (%x).\n",
3036 		    le16_to_cpu(sts->comp_status));
3037 		rval = QLA_FUNCTION_FAILED;
3038 	} else if (le16_to_cpu(sts->scsi_status) &
3039 	    SS_RESPONSE_INFO_LEN_VALID) {
3040 		if (le32_to_cpu(sts->rsp_data_len) < 4) {
3041 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1097,
3042 			    "Ignoring inconsistent data length -- not enough "
3043 			    "response info (%d).\n",
3044 			    le32_to_cpu(sts->rsp_data_len));
3045 		} else if (sts->data[3]) {
3046 			ql_dbg(ql_dbg_mbx, vha, 0x1098,
3047 			    "Failed to complete IOCB -- response (%x).\n",
3048 			    sts->data[3]);
3049 			rval = QLA_FUNCTION_FAILED;
3050 		}
3051 	}
3052 
3053 	/* Issue marker IOCB. */
3054 	rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l,
3055 	    type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID);
3056 	if (rval2 != QLA_SUCCESS) {
3057 		ql_dbg(ql_dbg_mbx, vha, 0x1099,
3058 		    "Failed to issue marker IOCB (%x).\n", rval2);
3059 	} else {
3060 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109a,
3061 		    "Done %s.\n", __func__);
3062 	}
3063 
3064 	dma_pool_free(ha->s_dma_pool, tsk, tsk_dma);
3065 
3066 	return rval;
3067 }
3068 
3069 int
3070 qla24xx_abort_target(struct fc_port *fcport, uint64_t l, int tag)
3071 {
3072 	struct qla_hw_data *ha = fcport->vha->hw;
3073 
3074 	if ((ql2xasynctmfenable) && IS_FWI2_CAPABLE(ha))
3075 		return qla2x00_async_tm_cmd(fcport, TCF_TARGET_RESET, l, tag);
3076 
3077 	return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l, tag);
3078 }
3079 
3080 int
3081 qla24xx_lun_reset(struct fc_port *fcport, uint64_t l, int tag)
3082 {
3083 	struct qla_hw_data *ha = fcport->vha->hw;
3084 
3085 	if ((ql2xasynctmfenable) && IS_FWI2_CAPABLE(ha))
3086 		return qla2x00_async_tm_cmd(fcport, TCF_LUN_RESET, l, tag);
3087 
3088 	return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l, tag);
3089 }
3090 
3091 int
3092 qla2x00_system_error(scsi_qla_host_t *vha)
3093 {
3094 	int rval;
3095 	mbx_cmd_t mc;
3096 	mbx_cmd_t *mcp = &mc;
3097 	struct qla_hw_data *ha = vha->hw;
3098 
3099 	if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha))
3100 		return QLA_FUNCTION_FAILED;
3101 
3102 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109b,
3103 	    "Entered %s.\n", __func__);
3104 
3105 	mcp->mb[0] = MBC_GEN_SYSTEM_ERROR;
3106 	mcp->out_mb = MBX_0;
3107 	mcp->in_mb = MBX_0;
3108 	mcp->tov = 5;
3109 	mcp->flags = 0;
3110 	rval = qla2x00_mailbox_command(vha, mcp);
3111 
3112 	if (rval != QLA_SUCCESS) {
3113 		ql_dbg(ql_dbg_mbx, vha, 0x109c, "Failed=%x.\n", rval);
3114 	} else {
3115 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109d,
3116 		    "Done %s.\n", __func__);
3117 	}
3118 
3119 	return rval;
3120 }
3121 
3122 int
3123 qla2x00_write_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t data)
3124 {
3125 	int rval;
3126 	mbx_cmd_t mc;
3127 	mbx_cmd_t *mcp = &mc;
3128 
3129 	if (!IS_QLA25XX(vha->hw) && !IS_QLA2031(vha->hw) &&
3130 	    !IS_QLA27XX(vha->hw))
3131 		return QLA_FUNCTION_FAILED;
3132 
3133 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1182,
3134 	    "Entered %s.\n", __func__);
3135 
3136 	mcp->mb[0] = MBC_WRITE_SERDES;
3137 	mcp->mb[1] = addr;
3138 	if (IS_QLA2031(vha->hw))
3139 		mcp->mb[2] = data & 0xff;
3140 	else
3141 		mcp->mb[2] = data;
3142 
3143 	mcp->mb[3] = 0;
3144 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
3145 	mcp->in_mb = MBX_0;
3146 	mcp->tov = MBX_TOV_SECONDS;
3147 	mcp->flags = 0;
3148 	rval = qla2x00_mailbox_command(vha, mcp);
3149 
3150 	if (rval != QLA_SUCCESS) {
3151 		ql_dbg(ql_dbg_mbx, vha, 0x1183,
3152 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3153 	} else {
3154 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1184,
3155 		    "Done %s.\n", __func__);
3156 	}
3157 
3158 	return rval;
3159 }
3160 
3161 int
3162 qla2x00_read_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t *data)
3163 {
3164 	int rval;
3165 	mbx_cmd_t mc;
3166 	mbx_cmd_t *mcp = &mc;
3167 
3168 	if (!IS_QLA25XX(vha->hw) && !IS_QLA2031(vha->hw) &&
3169 	    !IS_QLA27XX(vha->hw))
3170 		return QLA_FUNCTION_FAILED;
3171 
3172 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1185,
3173 	    "Entered %s.\n", __func__);
3174 
3175 	mcp->mb[0] = MBC_READ_SERDES;
3176 	mcp->mb[1] = addr;
3177 	mcp->mb[3] = 0;
3178 	mcp->out_mb = MBX_3|MBX_1|MBX_0;
3179 	mcp->in_mb = MBX_1|MBX_0;
3180 	mcp->tov = MBX_TOV_SECONDS;
3181 	mcp->flags = 0;
3182 	rval = qla2x00_mailbox_command(vha, mcp);
3183 
3184 	if (IS_QLA2031(vha->hw))
3185 		*data = mcp->mb[1] & 0xff;
3186 	else
3187 		*data = mcp->mb[1];
3188 
3189 	if (rval != QLA_SUCCESS) {
3190 		ql_dbg(ql_dbg_mbx, vha, 0x1186,
3191 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3192 	} else {
3193 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1187,
3194 		    "Done %s.\n", __func__);
3195 	}
3196 
3197 	return rval;
3198 }
3199 
3200 int
3201 qla8044_write_serdes_word(scsi_qla_host_t *vha, uint32_t addr, uint32_t data)
3202 {
3203 	int rval;
3204 	mbx_cmd_t mc;
3205 	mbx_cmd_t *mcp = &mc;
3206 
3207 	if (!IS_QLA8044(vha->hw))
3208 		return QLA_FUNCTION_FAILED;
3209 
3210 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1186,
3211 	    "Entered %s.\n", __func__);
3212 
3213 	mcp->mb[0] = MBC_SET_GET_ETH_SERDES_REG;
3214 	mcp->mb[1] = HCS_WRITE_SERDES;
3215 	mcp->mb[3] = LSW(addr);
3216 	mcp->mb[4] = MSW(addr);
3217 	mcp->mb[5] = LSW(data);
3218 	mcp->mb[6] = MSW(data);
3219 	mcp->out_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_1|MBX_0;
3220 	mcp->in_mb = MBX_0;
3221 	mcp->tov = MBX_TOV_SECONDS;
3222 	mcp->flags = 0;
3223 	rval = qla2x00_mailbox_command(vha, mcp);
3224 
3225 	if (rval != QLA_SUCCESS) {
3226 		ql_dbg(ql_dbg_mbx, vha, 0x1187,
3227 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3228 	} else {
3229 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1188,
3230 		    "Done %s.\n", __func__);
3231 	}
3232 
3233 	return rval;
3234 }
3235 
3236 int
3237 qla8044_read_serdes_word(scsi_qla_host_t *vha, uint32_t addr, uint32_t *data)
3238 {
3239 	int rval;
3240 	mbx_cmd_t mc;
3241 	mbx_cmd_t *mcp = &mc;
3242 
3243 	if (!IS_QLA8044(vha->hw))
3244 		return QLA_FUNCTION_FAILED;
3245 
3246 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1189,
3247 	    "Entered %s.\n", __func__);
3248 
3249 	mcp->mb[0] = MBC_SET_GET_ETH_SERDES_REG;
3250 	mcp->mb[1] = HCS_READ_SERDES;
3251 	mcp->mb[3] = LSW(addr);
3252 	mcp->mb[4] = MSW(addr);
3253 	mcp->out_mb = MBX_4|MBX_3|MBX_1|MBX_0;
3254 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
3255 	mcp->tov = MBX_TOV_SECONDS;
3256 	mcp->flags = 0;
3257 	rval = qla2x00_mailbox_command(vha, mcp);
3258 
3259 	*data = mcp->mb[2] << 16 | mcp->mb[1];
3260 
3261 	if (rval != QLA_SUCCESS) {
3262 		ql_dbg(ql_dbg_mbx, vha, 0x118a,
3263 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3264 	} else {
3265 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x118b,
3266 		    "Done %s.\n", __func__);
3267 	}
3268 
3269 	return rval;
3270 }
3271 
3272 /**
3273  * qla2x00_set_serdes_params() -
3274  * @ha: HA context
3275  *
3276  * Returns
3277  */
3278 int
3279 qla2x00_set_serdes_params(scsi_qla_host_t *vha, uint16_t sw_em_1g,
3280     uint16_t sw_em_2g, uint16_t sw_em_4g)
3281 {
3282 	int rval;
3283 	mbx_cmd_t mc;
3284 	mbx_cmd_t *mcp = &mc;
3285 
3286 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109e,
3287 	    "Entered %s.\n", __func__);
3288 
3289 	mcp->mb[0] = MBC_SERDES_PARAMS;
3290 	mcp->mb[1] = BIT_0;
3291 	mcp->mb[2] = sw_em_1g | BIT_15;
3292 	mcp->mb[3] = sw_em_2g | BIT_15;
3293 	mcp->mb[4] = sw_em_4g | BIT_15;
3294 	mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3295 	mcp->in_mb = MBX_0;
3296 	mcp->tov = MBX_TOV_SECONDS;
3297 	mcp->flags = 0;
3298 	rval = qla2x00_mailbox_command(vha, mcp);
3299 
3300 	if (rval != QLA_SUCCESS) {
3301 		/*EMPTY*/
3302 		ql_dbg(ql_dbg_mbx, vha, 0x109f,
3303 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3304 	} else {
3305 		/*EMPTY*/
3306 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a0,
3307 		    "Done %s.\n", __func__);
3308 	}
3309 
3310 	return rval;
3311 }
3312 
3313 int
3314 qla2x00_stop_firmware(scsi_qla_host_t *vha)
3315 {
3316 	int rval;
3317 	mbx_cmd_t mc;
3318 	mbx_cmd_t *mcp = &mc;
3319 
3320 	if (!IS_FWI2_CAPABLE(vha->hw))
3321 		return QLA_FUNCTION_FAILED;
3322 
3323 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a1,
3324 	    "Entered %s.\n", __func__);
3325 
3326 	mcp->mb[0] = MBC_STOP_FIRMWARE;
3327 	mcp->mb[1] = 0;
3328 	mcp->out_mb = MBX_1|MBX_0;
3329 	mcp->in_mb = MBX_0;
3330 	mcp->tov = 5;
3331 	mcp->flags = 0;
3332 	rval = qla2x00_mailbox_command(vha, mcp);
3333 
3334 	if (rval != QLA_SUCCESS) {
3335 		ql_dbg(ql_dbg_mbx, vha, 0x10a2, "Failed=%x.\n", rval);
3336 		if (mcp->mb[0] == MBS_INVALID_COMMAND)
3337 			rval = QLA_INVALID_COMMAND;
3338 	} else {
3339 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a3,
3340 		    "Done %s.\n", __func__);
3341 	}
3342 
3343 	return rval;
3344 }
3345 
3346 int
3347 qla2x00_enable_eft_trace(scsi_qla_host_t *vha, dma_addr_t eft_dma,
3348     uint16_t buffers)
3349 {
3350 	int rval;
3351 	mbx_cmd_t mc;
3352 	mbx_cmd_t *mcp = &mc;
3353 
3354 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a4,
3355 	    "Entered %s.\n", __func__);
3356 
3357 	if (!IS_FWI2_CAPABLE(vha->hw))
3358 		return QLA_FUNCTION_FAILED;
3359 
3360 	if (unlikely(pci_channel_offline(vha->hw->pdev)))
3361 		return QLA_FUNCTION_FAILED;
3362 
3363 	mcp->mb[0] = MBC_TRACE_CONTROL;
3364 	mcp->mb[1] = TC_EFT_ENABLE;
3365 	mcp->mb[2] = LSW(eft_dma);
3366 	mcp->mb[3] = MSW(eft_dma);
3367 	mcp->mb[4] = LSW(MSD(eft_dma));
3368 	mcp->mb[5] = MSW(MSD(eft_dma));
3369 	mcp->mb[6] = buffers;
3370 	mcp->mb[7] = TC_AEN_DISABLE;
3371 	mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3372 	mcp->in_mb = MBX_1|MBX_0;
3373 	mcp->tov = MBX_TOV_SECONDS;
3374 	mcp->flags = 0;
3375 	rval = qla2x00_mailbox_command(vha, mcp);
3376 	if (rval != QLA_SUCCESS) {
3377 		ql_dbg(ql_dbg_mbx, vha, 0x10a5,
3378 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
3379 		    rval, mcp->mb[0], mcp->mb[1]);
3380 	} else {
3381 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a6,
3382 		    "Done %s.\n", __func__);
3383 	}
3384 
3385 	return rval;
3386 }
3387 
3388 int
3389 qla2x00_disable_eft_trace(scsi_qla_host_t *vha)
3390 {
3391 	int rval;
3392 	mbx_cmd_t mc;
3393 	mbx_cmd_t *mcp = &mc;
3394 
3395 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a7,
3396 	    "Entered %s.\n", __func__);
3397 
3398 	if (!IS_FWI2_CAPABLE(vha->hw))
3399 		return QLA_FUNCTION_FAILED;
3400 
3401 	if (unlikely(pci_channel_offline(vha->hw->pdev)))
3402 		return QLA_FUNCTION_FAILED;
3403 
3404 	mcp->mb[0] = MBC_TRACE_CONTROL;
3405 	mcp->mb[1] = TC_EFT_DISABLE;
3406 	mcp->out_mb = MBX_1|MBX_0;
3407 	mcp->in_mb = MBX_1|MBX_0;
3408 	mcp->tov = MBX_TOV_SECONDS;
3409 	mcp->flags = 0;
3410 	rval = qla2x00_mailbox_command(vha, mcp);
3411 	if (rval != QLA_SUCCESS) {
3412 		ql_dbg(ql_dbg_mbx, vha, 0x10a8,
3413 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
3414 		    rval, mcp->mb[0], mcp->mb[1]);
3415 	} else {
3416 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a9,
3417 		    "Done %s.\n", __func__);
3418 	}
3419 
3420 	return rval;
3421 }
3422 
3423 int
3424 qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma,
3425     uint16_t buffers, uint16_t *mb, uint32_t *dwords)
3426 {
3427 	int rval;
3428 	mbx_cmd_t mc;
3429 	mbx_cmd_t *mcp = &mc;
3430 
3431 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10aa,
3432 	    "Entered %s.\n", __func__);
3433 
3434 	if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) &&
3435 	    !IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw))
3436 		return QLA_FUNCTION_FAILED;
3437 
3438 	if (unlikely(pci_channel_offline(vha->hw->pdev)))
3439 		return QLA_FUNCTION_FAILED;
3440 
3441 	mcp->mb[0] = MBC_TRACE_CONTROL;
3442 	mcp->mb[1] = TC_FCE_ENABLE;
3443 	mcp->mb[2] = LSW(fce_dma);
3444 	mcp->mb[3] = MSW(fce_dma);
3445 	mcp->mb[4] = LSW(MSD(fce_dma));
3446 	mcp->mb[5] = MSW(MSD(fce_dma));
3447 	mcp->mb[6] = buffers;
3448 	mcp->mb[7] = TC_AEN_DISABLE;
3449 	mcp->mb[8] = 0;
3450 	mcp->mb[9] = TC_FCE_DEFAULT_RX_SIZE;
3451 	mcp->mb[10] = TC_FCE_DEFAULT_TX_SIZE;
3452 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|
3453 	    MBX_1|MBX_0;
3454 	mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3455 	mcp->tov = MBX_TOV_SECONDS;
3456 	mcp->flags = 0;
3457 	rval = qla2x00_mailbox_command(vha, mcp);
3458 	if (rval != QLA_SUCCESS) {
3459 		ql_dbg(ql_dbg_mbx, vha, 0x10ab,
3460 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
3461 		    rval, mcp->mb[0], mcp->mb[1]);
3462 	} else {
3463 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ac,
3464 		    "Done %s.\n", __func__);
3465 
3466 		if (mb)
3467 			memcpy(mb, mcp->mb, 8 * sizeof(*mb));
3468 		if (dwords)
3469 			*dwords = buffers;
3470 	}
3471 
3472 	return rval;
3473 }
3474 
3475 int
3476 qla2x00_disable_fce_trace(scsi_qla_host_t *vha, uint64_t *wr, uint64_t *rd)
3477 {
3478 	int rval;
3479 	mbx_cmd_t mc;
3480 	mbx_cmd_t *mcp = &mc;
3481 
3482 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ad,
3483 	    "Entered %s.\n", __func__);
3484 
3485 	if (!IS_FWI2_CAPABLE(vha->hw))
3486 		return QLA_FUNCTION_FAILED;
3487 
3488 	if (unlikely(pci_channel_offline(vha->hw->pdev)))
3489 		return QLA_FUNCTION_FAILED;
3490 
3491 	mcp->mb[0] = MBC_TRACE_CONTROL;
3492 	mcp->mb[1] = TC_FCE_DISABLE;
3493 	mcp->mb[2] = TC_FCE_DISABLE_TRACE;
3494 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
3495 	mcp->in_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|
3496 	    MBX_1|MBX_0;
3497 	mcp->tov = MBX_TOV_SECONDS;
3498 	mcp->flags = 0;
3499 	rval = qla2x00_mailbox_command(vha, mcp);
3500 	if (rval != QLA_SUCCESS) {
3501 		ql_dbg(ql_dbg_mbx, vha, 0x10ae,
3502 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
3503 		    rval, mcp->mb[0], mcp->mb[1]);
3504 	} else {
3505 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10af,
3506 		    "Done %s.\n", __func__);
3507 
3508 		if (wr)
3509 			*wr = (uint64_t) mcp->mb[5] << 48 |
3510 			    (uint64_t) mcp->mb[4] << 32 |
3511 			    (uint64_t) mcp->mb[3] << 16 |
3512 			    (uint64_t) mcp->mb[2];
3513 		if (rd)
3514 			*rd = (uint64_t) mcp->mb[9] << 48 |
3515 			    (uint64_t) mcp->mb[8] << 32 |
3516 			    (uint64_t) mcp->mb[7] << 16 |
3517 			    (uint64_t) mcp->mb[6];
3518 	}
3519 
3520 	return rval;
3521 }
3522 
3523 int
3524 qla2x00_get_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
3525 	uint16_t *port_speed, uint16_t *mb)
3526 {
3527 	int rval;
3528 	mbx_cmd_t mc;
3529 	mbx_cmd_t *mcp = &mc;
3530 
3531 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b0,
3532 	    "Entered %s.\n", __func__);
3533 
3534 	if (!IS_IIDMA_CAPABLE(vha->hw))
3535 		return QLA_FUNCTION_FAILED;
3536 
3537 	mcp->mb[0] = MBC_PORT_PARAMS;
3538 	mcp->mb[1] = loop_id;
3539 	mcp->mb[2] = mcp->mb[3] = 0;
3540 	mcp->mb[9] = vha->vp_idx;
3541 	mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
3542 	mcp->in_mb = MBX_3|MBX_1|MBX_0;
3543 	mcp->tov = MBX_TOV_SECONDS;
3544 	mcp->flags = 0;
3545 	rval = qla2x00_mailbox_command(vha, mcp);
3546 
3547 	/* Return mailbox statuses. */
3548 	if (mb != NULL) {
3549 		mb[0] = mcp->mb[0];
3550 		mb[1] = mcp->mb[1];
3551 		mb[3] = mcp->mb[3];
3552 	}
3553 
3554 	if (rval != QLA_SUCCESS) {
3555 		ql_dbg(ql_dbg_mbx, vha, 0x10b1, "Failed=%x.\n", rval);
3556 	} else {
3557 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b2,
3558 		    "Done %s.\n", __func__);
3559 		if (port_speed)
3560 			*port_speed = mcp->mb[3];
3561 	}
3562 
3563 	return rval;
3564 }
3565 
3566 int
3567 qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
3568     uint16_t port_speed, uint16_t *mb)
3569 {
3570 	int rval;
3571 	mbx_cmd_t mc;
3572 	mbx_cmd_t *mcp = &mc;
3573 
3574 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b3,
3575 	    "Entered %s.\n", __func__);
3576 
3577 	if (!IS_IIDMA_CAPABLE(vha->hw))
3578 		return QLA_FUNCTION_FAILED;
3579 
3580 	mcp->mb[0] = MBC_PORT_PARAMS;
3581 	mcp->mb[1] = loop_id;
3582 	mcp->mb[2] = BIT_0;
3583 	if (IS_CNA_CAPABLE(vha->hw))
3584 		mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
3585 	else
3586 		mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
3587 	mcp->mb[9] = vha->vp_idx;
3588 	mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
3589 	mcp->in_mb = MBX_3|MBX_1|MBX_0;
3590 	mcp->tov = MBX_TOV_SECONDS;
3591 	mcp->flags = 0;
3592 	rval = qla2x00_mailbox_command(vha, mcp);
3593 
3594 	/* Return mailbox statuses. */
3595 	if (mb != NULL) {
3596 		mb[0] = mcp->mb[0];
3597 		mb[1] = mcp->mb[1];
3598 		mb[3] = mcp->mb[3];
3599 	}
3600 
3601 	if (rval != QLA_SUCCESS) {
3602 		ql_dbg(ql_dbg_mbx, vha, 0x10b4,
3603 		    "Failed=%x.\n", rval);
3604 	} else {
3605 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b5,
3606 		    "Done %s.\n", __func__);
3607 	}
3608 
3609 	return rval;
3610 }
3611 
3612 void
3613 qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
3614 	struct vp_rpt_id_entry_24xx *rptid_entry)
3615 {
3616 	uint8_t vp_idx;
3617 	uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);
3618 	struct qla_hw_data *ha = vha->hw;
3619 	scsi_qla_host_t *vp;
3620 	unsigned long   flags;
3621 	int found;
3622 
3623 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b6,
3624 	    "Entered %s.\n", __func__);
3625 
3626 	if (rptid_entry->entry_status != 0)
3627 		return;
3628 
3629 	if (rptid_entry->format == 0) {
3630 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b7,
3631 		    "Format 0 : Number of VPs setup %d, number of "
3632 		    "VPs acquired %d.\n",
3633 		    MSB(le16_to_cpu(rptid_entry->vp_count)),
3634 		    LSB(le16_to_cpu(rptid_entry->vp_count)));
3635 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b8,
3636 		    "Primary port id %02x%02x%02x.\n",
3637 		    rptid_entry->port_id[2], rptid_entry->port_id[1],
3638 		    rptid_entry->port_id[0]);
3639 	} else if (rptid_entry->format == 1) {
3640 		vp_idx = LSB(stat);
3641 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b9,
3642 		    "Format 1: VP[%d] enabled - status %d - with "
3643 		    "port id %02x%02x%02x.\n", vp_idx, MSB(stat),
3644 		    rptid_entry->port_id[2], rptid_entry->port_id[1],
3645 		    rptid_entry->port_id[0]);
3646 
3647 		/* buffer to buffer credit flag */
3648 		vha->flags.bbcr_enable = (rptid_entry->bbcr & 0xf) != 0;
3649 
3650 		/* FA-WWN is only for physical port */
3651 		if (!vp_idx) {
3652 			void *wwpn = ha->init_cb->port_name;
3653 
3654 			if (!MSB(stat)) {
3655 				if (rptid_entry->vp_idx_map[1] & BIT_6)
3656 					wwpn = rptid_entry->reserved_4 + 8;
3657 			}
3658 			memcpy(vha->port_name, wwpn, WWN_SIZE);
3659 			fc_host_port_name(vha->host) =
3660 			    wwn_to_u64(vha->port_name);
3661 			ql_dbg(ql_dbg_mbx, vha, 0x1018,
3662 			    "FA-WWN portname %016llx (%x)\n",
3663 			    fc_host_port_name(vha->host), MSB(stat));
3664 		}
3665 
3666 		vp = vha;
3667 		if (vp_idx == 0)
3668 			goto reg_needed;
3669 
3670 		if (MSB(stat) != 0 && MSB(stat) != 2) {
3671 			ql_dbg(ql_dbg_mbx, vha, 0x10ba,
3672 			    "Could not acquire ID for VP[%d].\n", vp_idx);
3673 			return;
3674 		}
3675 
3676 		found = 0;
3677 		spin_lock_irqsave(&ha->vport_slock, flags);
3678 		list_for_each_entry(vp, &ha->vp_list, list) {
3679 			if (vp_idx == vp->vp_idx) {
3680 				found = 1;
3681 				break;
3682 			}
3683 		}
3684 		spin_unlock_irqrestore(&ha->vport_slock, flags);
3685 
3686 		if (!found)
3687 			return;
3688 
3689 		vp->d_id.b.domain = rptid_entry->port_id[2];
3690 		vp->d_id.b.area =  rptid_entry->port_id[1];
3691 		vp->d_id.b.al_pa = rptid_entry->port_id[0];
3692 
3693 		/*
3694 		 * Cannot configure here as we are still sitting on the
3695 		 * response queue. Handle it in dpc context.
3696 		 */
3697 		set_bit(VP_IDX_ACQUIRED, &vp->vp_flags);
3698 
3699 reg_needed:
3700 		set_bit(REGISTER_FC4_NEEDED, &vp->dpc_flags);
3701 		set_bit(REGISTER_FDMI_NEEDED, &vp->dpc_flags);
3702 		set_bit(VP_DPC_NEEDED, &vha->dpc_flags);
3703 		qla2xxx_wake_dpc(vha);
3704 	}
3705 }
3706 
3707 /*
3708  * qla24xx_modify_vp_config
3709  *	Change VP configuration for vha
3710  *
3711  * Input:
3712  *	vha = adapter block pointer.
3713  *
3714  * Returns:
3715  *	qla2xxx local function return status code.
3716  *
3717  * Context:
3718  *	Kernel context.
3719  */
3720 int
3721 qla24xx_modify_vp_config(scsi_qla_host_t *vha)
3722 {
3723 	int		rval;
3724 	struct vp_config_entry_24xx *vpmod;
3725 	dma_addr_t	vpmod_dma;
3726 	struct qla_hw_data *ha = vha->hw;
3727 	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
3728 
3729 	/* This can be called by the parent */
3730 
3731 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10bb,
3732 	    "Entered %s.\n", __func__);
3733 
3734 	vpmod = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vpmod_dma);
3735 	if (!vpmod) {
3736 		ql_log(ql_log_warn, vha, 0x10bc,
3737 		    "Failed to allocate modify VP IOCB.\n");
3738 		return QLA_MEMORY_ALLOC_FAILED;
3739 	}
3740 
3741 	memset(vpmod, 0, sizeof(struct vp_config_entry_24xx));
3742 	vpmod->entry_type = VP_CONFIG_IOCB_TYPE;
3743 	vpmod->entry_count = 1;
3744 	vpmod->command = VCT_COMMAND_MOD_ENABLE_VPS;
3745 	vpmod->vp_count = 1;
3746 	vpmod->vp_index1 = vha->vp_idx;
3747 	vpmod->options_idx1 = BIT_3|BIT_4|BIT_5;
3748 
3749 	qlt_modify_vp_config(vha, vpmod);
3750 
3751 	memcpy(vpmod->node_name_idx1, vha->node_name, WWN_SIZE);
3752 	memcpy(vpmod->port_name_idx1, vha->port_name, WWN_SIZE);
3753 	vpmod->entry_count = 1;
3754 
3755 	rval = qla2x00_issue_iocb(base_vha, vpmod, vpmod_dma, 0);
3756 	if (rval != QLA_SUCCESS) {
3757 		ql_dbg(ql_dbg_mbx, vha, 0x10bd,
3758 		    "Failed to issue VP config IOCB (%x).\n", rval);
3759 	} else if (vpmod->comp_status != 0) {
3760 		ql_dbg(ql_dbg_mbx, vha, 0x10be,
3761 		    "Failed to complete IOCB -- error status (%x).\n",
3762 		    vpmod->comp_status);
3763 		rval = QLA_FUNCTION_FAILED;
3764 	} else if (vpmod->comp_status != cpu_to_le16(CS_COMPLETE)) {
3765 		ql_dbg(ql_dbg_mbx, vha, 0x10bf,
3766 		    "Failed to complete IOCB -- completion status (%x).\n",
3767 		    le16_to_cpu(vpmod->comp_status));
3768 		rval = QLA_FUNCTION_FAILED;
3769 	} else {
3770 		/* EMPTY */
3771 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c0,
3772 		    "Done %s.\n", __func__);
3773 		fc_vport_set_state(vha->fc_vport, FC_VPORT_INITIALIZING);
3774 	}
3775 	dma_pool_free(ha->s_dma_pool, vpmod, vpmod_dma);
3776 
3777 	return rval;
3778 }
3779 
3780 /*
3781  * qla24xx_control_vp
3782  *	Enable a virtual port for given host
3783  *
3784  * Input:
3785  *	ha = adapter block pointer.
3786  *	vhba = virtual adapter (unused)
3787  *	index = index number for enabled VP
3788  *
3789  * Returns:
3790  *	qla2xxx local function return status code.
3791  *
3792  * Context:
3793  *	Kernel context.
3794  */
3795 int
3796 qla24xx_control_vp(scsi_qla_host_t *vha, int cmd)
3797 {
3798 	int		rval;
3799 	int		map, pos;
3800 	struct vp_ctrl_entry_24xx   *vce;
3801 	dma_addr_t	vce_dma;
3802 	struct qla_hw_data *ha = vha->hw;
3803 	int	vp_index = vha->vp_idx;
3804 	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
3805 
3806 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c1,
3807 	    "Entered %s enabling index %d.\n", __func__, vp_index);
3808 
3809 	if (vp_index == 0 || vp_index >= ha->max_npiv_vports)
3810 		return QLA_PARAMETER_ERROR;
3811 
3812 	vce = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vce_dma);
3813 	if (!vce) {
3814 		ql_log(ql_log_warn, vha, 0x10c2,
3815 		    "Failed to allocate VP control IOCB.\n");
3816 		return QLA_MEMORY_ALLOC_FAILED;
3817 	}
3818 	memset(vce, 0, sizeof(struct vp_ctrl_entry_24xx));
3819 
3820 	vce->entry_type = VP_CTRL_IOCB_TYPE;
3821 	vce->entry_count = 1;
3822 	vce->command = cpu_to_le16(cmd);
3823 	vce->vp_count = cpu_to_le16(1);
3824 
3825 	/* index map in firmware starts with 1; decrement index
3826 	 * this is ok as we never use index 0
3827 	 */
3828 	map = (vp_index - 1) / 8;
3829 	pos = (vp_index - 1) & 7;
3830 	mutex_lock(&ha->vport_lock);
3831 	vce->vp_idx_map[map] |= 1 << pos;
3832 	mutex_unlock(&ha->vport_lock);
3833 
3834 	rval = qla2x00_issue_iocb(base_vha, vce, vce_dma, 0);
3835 	if (rval != QLA_SUCCESS) {
3836 		ql_dbg(ql_dbg_mbx, vha, 0x10c3,
3837 		    "Failed to issue VP control IOCB (%x).\n", rval);
3838 	} else if (vce->entry_status != 0) {
3839 		ql_dbg(ql_dbg_mbx, vha, 0x10c4,
3840 		    "Failed to complete IOCB -- error status (%x).\n",
3841 		    vce->entry_status);
3842 		rval = QLA_FUNCTION_FAILED;
3843 	} else if (vce->comp_status != cpu_to_le16(CS_COMPLETE)) {
3844 		ql_dbg(ql_dbg_mbx, vha, 0x10c5,
3845 		    "Failed to complet IOCB -- completion status (%x).\n",
3846 		    le16_to_cpu(vce->comp_status));
3847 		rval = QLA_FUNCTION_FAILED;
3848 	} else {
3849 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c6,
3850 		    "Done %s.\n", __func__);
3851 	}
3852 
3853 	dma_pool_free(ha->s_dma_pool, vce, vce_dma);
3854 
3855 	return rval;
3856 }
3857 
3858 /*
3859  * qla2x00_send_change_request
3860  *	Receive or disable RSCN request from fabric controller
3861  *
3862  * Input:
3863  *	ha = adapter block pointer
3864  *	format = registration format:
3865  *		0 - Reserved
3866  *		1 - Fabric detected registration
3867  *		2 - N_port detected registration
3868  *		3 - Full registration
3869  *		FF - clear registration
3870  *	vp_idx = Virtual port index
3871  *
3872  * Returns:
3873  *	qla2x00 local function return status code.
3874  *
3875  * Context:
3876  *	Kernel Context
3877  */
3878 
3879 int
3880 qla2x00_send_change_request(scsi_qla_host_t *vha, uint16_t format,
3881 			    uint16_t vp_idx)
3882 {
3883 	int rval;
3884 	mbx_cmd_t mc;
3885 	mbx_cmd_t *mcp = &mc;
3886 
3887 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c7,
3888 	    "Entered %s.\n", __func__);
3889 
3890 	mcp->mb[0] = MBC_SEND_CHANGE_REQUEST;
3891 	mcp->mb[1] = format;
3892 	mcp->mb[9] = vp_idx;
3893 	mcp->out_mb = MBX_9|MBX_1|MBX_0;
3894 	mcp->in_mb = MBX_0|MBX_1;
3895 	mcp->tov = MBX_TOV_SECONDS;
3896 	mcp->flags = 0;
3897 	rval = qla2x00_mailbox_command(vha, mcp);
3898 
3899 	if (rval == QLA_SUCCESS) {
3900 		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
3901 			rval = BIT_1;
3902 		}
3903 	} else
3904 		rval = BIT_1;
3905 
3906 	return rval;
3907 }
3908 
3909 int
3910 qla2x00_dump_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr,
3911     uint32_t size)
3912 {
3913 	int rval;
3914 	mbx_cmd_t mc;
3915 	mbx_cmd_t *mcp = &mc;
3916 
3917 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1009,
3918 	    "Entered %s.\n", __func__);
3919 
3920 	if (MSW(addr) || IS_FWI2_CAPABLE(vha->hw)) {
3921 		mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED;
3922 		mcp->mb[8] = MSW(addr);
3923 		mcp->out_mb = MBX_8|MBX_0;
3924 	} else {
3925 		mcp->mb[0] = MBC_DUMP_RISC_RAM;
3926 		mcp->out_mb = MBX_0;
3927 	}
3928 	mcp->mb[1] = LSW(addr);
3929 	mcp->mb[2] = MSW(req_dma);
3930 	mcp->mb[3] = LSW(req_dma);
3931 	mcp->mb[6] = MSW(MSD(req_dma));
3932 	mcp->mb[7] = LSW(MSD(req_dma));
3933 	mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1;
3934 	if (IS_FWI2_CAPABLE(vha->hw)) {
3935 		mcp->mb[4] = MSW(size);
3936 		mcp->mb[5] = LSW(size);
3937 		mcp->out_mb |= MBX_5|MBX_4;
3938 	} else {
3939 		mcp->mb[4] = LSW(size);
3940 		mcp->out_mb |= MBX_4;
3941 	}
3942 
3943 	mcp->in_mb = MBX_0;
3944 	mcp->tov = MBX_TOV_SECONDS;
3945 	mcp->flags = 0;
3946 	rval = qla2x00_mailbox_command(vha, mcp);
3947 
3948 	if (rval != QLA_SUCCESS) {
3949 		ql_dbg(ql_dbg_mbx, vha, 0x1008,
3950 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3951 	} else {
3952 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1007,
3953 		    "Done %s.\n", __func__);
3954 	}
3955 
3956 	return rval;
3957 }
3958 /* 84XX Support **************************************************************/
3959 
3960 struct cs84xx_mgmt_cmd {
3961 	union {
3962 		struct verify_chip_entry_84xx req;
3963 		struct verify_chip_rsp_84xx rsp;
3964 	} p;
3965 };
3966 
3967 int
3968 qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status)
3969 {
3970 	int rval, retry;
3971 	struct cs84xx_mgmt_cmd *mn;
3972 	dma_addr_t mn_dma;
3973 	uint16_t options;
3974 	unsigned long flags;
3975 	struct qla_hw_data *ha = vha->hw;
3976 
3977 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c8,
3978 	    "Entered %s.\n", __func__);
3979 
3980 	mn = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &mn_dma);
3981 	if (mn == NULL) {
3982 		return QLA_MEMORY_ALLOC_FAILED;
3983 	}
3984 
3985 	/* Force Update? */
3986 	options = ha->cs84xx->fw_update ? VCO_FORCE_UPDATE : 0;
3987 	/* Diagnostic firmware? */
3988 	/* options |= MENLO_DIAG_FW; */
3989 	/* We update the firmware with only one data sequence. */
3990 	options |= VCO_END_OF_DATA;
3991 
3992 	do {
3993 		retry = 0;
3994 		memset(mn, 0, sizeof(*mn));
3995 		mn->p.req.entry_type = VERIFY_CHIP_IOCB_TYPE;
3996 		mn->p.req.entry_count = 1;
3997 		mn->p.req.options = cpu_to_le16(options);
3998 
3999 		ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111c,
4000 		    "Dump of Verify Request.\n");
4001 		ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111e,
4002 		    (uint8_t *)mn, sizeof(*mn));
4003 
4004 		rval = qla2x00_issue_iocb_timeout(vha, mn, mn_dma, 0, 120);
4005 		if (rval != QLA_SUCCESS) {
4006 			ql_dbg(ql_dbg_mbx, vha, 0x10cb,
4007 			    "Failed to issue verify IOCB (%x).\n", rval);
4008 			goto verify_done;
4009 		}
4010 
4011 		ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1110,
4012 		    "Dump of Verify Response.\n");
4013 		ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1118,
4014 		    (uint8_t *)mn, sizeof(*mn));
4015 
4016 		status[0] = le16_to_cpu(mn->p.rsp.comp_status);
4017 		status[1] = status[0] == CS_VCS_CHIP_FAILURE ?
4018 		    le16_to_cpu(mn->p.rsp.failure_code) : 0;
4019 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ce,
4020 		    "cs=%x fc=%x.\n", status[0], status[1]);
4021 
4022 		if (status[0] != CS_COMPLETE) {
4023 			rval = QLA_FUNCTION_FAILED;
4024 			if (!(options & VCO_DONT_UPDATE_FW)) {
4025 				ql_dbg(ql_dbg_mbx, vha, 0x10cf,
4026 				    "Firmware update failed. Retrying "
4027 				    "without update firmware.\n");
4028 				options |= VCO_DONT_UPDATE_FW;
4029 				options &= ~VCO_FORCE_UPDATE;
4030 				retry = 1;
4031 			}
4032 		} else {
4033 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d0,
4034 			    "Firmware updated to %x.\n",
4035 			    le32_to_cpu(mn->p.rsp.fw_ver));
4036 
4037 			/* NOTE: we only update OP firmware. */
4038 			spin_lock_irqsave(&ha->cs84xx->access_lock, flags);
4039 			ha->cs84xx->op_fw_version =
4040 			    le32_to_cpu(mn->p.rsp.fw_ver);
4041 			spin_unlock_irqrestore(&ha->cs84xx->access_lock,
4042 			    flags);
4043 		}
4044 	} while (retry);
4045 
4046 verify_done:
4047 	dma_pool_free(ha->s_dma_pool, mn, mn_dma);
4048 
4049 	if (rval != QLA_SUCCESS) {
4050 		ql_dbg(ql_dbg_mbx, vha, 0x10d1,
4051 		    "Failed=%x.\n", rval);
4052 	} else {
4053 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d2,
4054 		    "Done %s.\n", __func__);
4055 	}
4056 
4057 	return rval;
4058 }
4059 
4060 int
4061 qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
4062 {
4063 	int rval;
4064 	unsigned long flags;
4065 	mbx_cmd_t mc;
4066 	mbx_cmd_t *mcp = &mc;
4067 	struct qla_hw_data *ha = vha->hw;
4068 
4069 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3,
4070 	    "Entered %s.\n", __func__);
4071 
4072 	if (IS_SHADOW_REG_CAPABLE(ha))
4073 		req->options |= BIT_13;
4074 
4075 	mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
4076 	mcp->mb[1] = req->options;
4077 	mcp->mb[2] = MSW(LSD(req->dma));
4078 	mcp->mb[3] = LSW(LSD(req->dma));
4079 	mcp->mb[6] = MSW(MSD(req->dma));
4080 	mcp->mb[7] = LSW(MSD(req->dma));
4081 	mcp->mb[5] = req->length;
4082 	if (req->rsp)
4083 		mcp->mb[10] = req->rsp->id;
4084 	mcp->mb[12] = req->qos;
4085 	mcp->mb[11] = req->vp_idx;
4086 	mcp->mb[13] = req->rid;
4087 	if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
4088 		mcp->mb[15] = 0;
4089 
4090 	mcp->mb[4] = req->id;
4091 	/* que in ptr index */
4092 	mcp->mb[8] = 0;
4093 	/* que out ptr index */
4094 	mcp->mb[9] = *req->out_ptr = 0;
4095 	mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7|
4096 			MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4097 	mcp->in_mb = MBX_0;
4098 	mcp->flags = MBX_DMA_OUT;
4099 	mcp->tov = MBX_TOV_SECONDS * 2;
4100 
4101 	if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha))
4102 		mcp->in_mb |= MBX_1;
4103 	if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
4104 		mcp->out_mb |= MBX_15;
4105 		/* debug q create issue in SR-IOV */
4106 		mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
4107 	}
4108 
4109 	spin_lock_irqsave(&ha->hardware_lock, flags);
4110 	if (!(req->options & BIT_0)) {
4111 		WRT_REG_DWORD(req->req_q_in, 0);
4112 		if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
4113 			WRT_REG_DWORD(req->req_q_out, 0);
4114 	}
4115 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
4116 
4117 	rval = qla2x00_mailbox_command(vha, mcp);
4118 	if (rval != QLA_SUCCESS) {
4119 		ql_dbg(ql_dbg_mbx, vha, 0x10d4,
4120 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4121 	} else {
4122 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d5,
4123 		    "Done %s.\n", __func__);
4124 	}
4125 
4126 	return rval;
4127 }
4128 
4129 int
4130 qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
4131 {
4132 	int rval;
4133 	unsigned long flags;
4134 	mbx_cmd_t mc;
4135 	mbx_cmd_t *mcp = &mc;
4136 	struct qla_hw_data *ha = vha->hw;
4137 
4138 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6,
4139 	    "Entered %s.\n", __func__);
4140 
4141 	if (IS_SHADOW_REG_CAPABLE(ha))
4142 		rsp->options |= BIT_13;
4143 
4144 	mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
4145 	mcp->mb[1] = rsp->options;
4146 	mcp->mb[2] = MSW(LSD(rsp->dma));
4147 	mcp->mb[3] = LSW(LSD(rsp->dma));
4148 	mcp->mb[6] = MSW(MSD(rsp->dma));
4149 	mcp->mb[7] = LSW(MSD(rsp->dma));
4150 	mcp->mb[5] = rsp->length;
4151 	mcp->mb[14] = rsp->msix->entry;
4152 	mcp->mb[13] = rsp->rid;
4153 	if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
4154 		mcp->mb[15] = 0;
4155 
4156 	mcp->mb[4] = rsp->id;
4157 	/* que in ptr index */
4158 	mcp->mb[8] = *rsp->in_ptr = 0;
4159 	/* que out ptr index */
4160 	mcp->mb[9] = 0;
4161 	mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7
4162 			|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4163 	mcp->in_mb = MBX_0;
4164 	mcp->flags = MBX_DMA_OUT;
4165 	mcp->tov = MBX_TOV_SECONDS * 2;
4166 
4167 	if (IS_QLA81XX(ha)) {
4168 		mcp->out_mb |= MBX_12|MBX_11|MBX_10;
4169 		mcp->in_mb |= MBX_1;
4170 	} else if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
4171 		mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10;
4172 		mcp->in_mb |= MBX_1;
4173 		/* debug q create issue in SR-IOV */
4174 		mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
4175 	}
4176 
4177 	spin_lock_irqsave(&ha->hardware_lock, flags);
4178 	if (!(rsp->options & BIT_0)) {
4179 		WRT_REG_DWORD(rsp->rsp_q_out, 0);
4180 		if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
4181 			WRT_REG_DWORD(rsp->rsp_q_in, 0);
4182 	}
4183 
4184 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
4185 
4186 	rval = qla2x00_mailbox_command(vha, mcp);
4187 	if (rval != QLA_SUCCESS) {
4188 		ql_dbg(ql_dbg_mbx, vha, 0x10d7,
4189 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4190 	} else {
4191 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d8,
4192 		    "Done %s.\n", __func__);
4193 	}
4194 
4195 	return rval;
4196 }
4197 
4198 int
4199 qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb)
4200 {
4201 	int rval;
4202 	mbx_cmd_t mc;
4203 	mbx_cmd_t *mcp = &mc;
4204 
4205 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d9,
4206 	    "Entered %s.\n", __func__);
4207 
4208 	mcp->mb[0] = MBC_IDC_ACK;
4209 	memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
4210 	mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4211 	mcp->in_mb = MBX_0;
4212 	mcp->tov = MBX_TOV_SECONDS;
4213 	mcp->flags = 0;
4214 	rval = qla2x00_mailbox_command(vha, mcp);
4215 
4216 	if (rval != QLA_SUCCESS) {
4217 		ql_dbg(ql_dbg_mbx, vha, 0x10da,
4218 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4219 	} else {
4220 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10db,
4221 		    "Done %s.\n", __func__);
4222 	}
4223 
4224 	return rval;
4225 }
4226 
4227 int
4228 qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size)
4229 {
4230 	int rval;
4231 	mbx_cmd_t mc;
4232 	mbx_cmd_t *mcp = &mc;
4233 
4234 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10dc,
4235 	    "Entered %s.\n", __func__);
4236 
4237 	if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) &&
4238 	    !IS_QLA27XX(vha->hw))
4239 		return QLA_FUNCTION_FAILED;
4240 
4241 	mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
4242 	mcp->mb[1] = FAC_OPT_CMD_GET_SECTOR_SIZE;
4243 	mcp->out_mb = MBX_1|MBX_0;
4244 	mcp->in_mb = MBX_1|MBX_0;
4245 	mcp->tov = MBX_TOV_SECONDS;
4246 	mcp->flags = 0;
4247 	rval = qla2x00_mailbox_command(vha, mcp);
4248 
4249 	if (rval != QLA_SUCCESS) {
4250 		ql_dbg(ql_dbg_mbx, vha, 0x10dd,
4251 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
4252 		    rval, mcp->mb[0], mcp->mb[1]);
4253 	} else {
4254 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10de,
4255 		    "Done %s.\n", __func__);
4256 		*sector_size = mcp->mb[1];
4257 	}
4258 
4259 	return rval;
4260 }
4261 
4262 int
4263 qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable)
4264 {
4265 	int rval;
4266 	mbx_cmd_t mc;
4267 	mbx_cmd_t *mcp = &mc;
4268 
4269 	if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) &&
4270 	    !IS_QLA27XX(vha->hw))
4271 		return QLA_FUNCTION_FAILED;
4272 
4273 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10df,
4274 	    "Entered %s.\n", __func__);
4275 
4276 	mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
4277 	mcp->mb[1] = enable ? FAC_OPT_CMD_WRITE_ENABLE :
4278 	    FAC_OPT_CMD_WRITE_PROTECT;
4279 	mcp->out_mb = MBX_1|MBX_0;
4280 	mcp->in_mb = MBX_1|MBX_0;
4281 	mcp->tov = MBX_TOV_SECONDS;
4282 	mcp->flags = 0;
4283 	rval = qla2x00_mailbox_command(vha, mcp);
4284 
4285 	if (rval != QLA_SUCCESS) {
4286 		ql_dbg(ql_dbg_mbx, vha, 0x10e0,
4287 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
4288 		    rval, mcp->mb[0], mcp->mb[1]);
4289 	} else {
4290 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e1,
4291 		    "Done %s.\n", __func__);
4292 	}
4293 
4294 	return rval;
4295 }
4296 
4297 int
4298 qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish)
4299 {
4300 	int rval;
4301 	mbx_cmd_t mc;
4302 	mbx_cmd_t *mcp = &mc;
4303 
4304 	if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) &&
4305 	    !IS_QLA27XX(vha->hw))
4306 		return QLA_FUNCTION_FAILED;
4307 
4308 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e2,
4309 	    "Entered %s.\n", __func__);
4310 
4311 	mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
4312 	mcp->mb[1] = FAC_OPT_CMD_ERASE_SECTOR;
4313 	mcp->mb[2] = LSW(start);
4314 	mcp->mb[3] = MSW(start);
4315 	mcp->mb[4] = LSW(finish);
4316 	mcp->mb[5] = MSW(finish);
4317 	mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4318 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
4319 	mcp->tov = MBX_TOV_SECONDS;
4320 	mcp->flags = 0;
4321 	rval = qla2x00_mailbox_command(vha, mcp);
4322 
4323 	if (rval != QLA_SUCCESS) {
4324 		ql_dbg(ql_dbg_mbx, vha, 0x10e3,
4325 		    "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
4326 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
4327 	} else {
4328 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e4,
4329 		    "Done %s.\n", __func__);
4330 	}
4331 
4332 	return rval;
4333 }
4334 
4335 int
4336 qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha)
4337 {
4338 	int rval = 0;
4339 	mbx_cmd_t mc;
4340 	mbx_cmd_t *mcp = &mc;
4341 
4342 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e5,
4343 	    "Entered %s.\n", __func__);
4344 
4345 	mcp->mb[0] = MBC_RESTART_MPI_FW;
4346 	mcp->out_mb = MBX_0;
4347 	mcp->in_mb = MBX_0|MBX_1;
4348 	mcp->tov = MBX_TOV_SECONDS;
4349 	mcp->flags = 0;
4350 	rval = qla2x00_mailbox_command(vha, mcp);
4351 
4352 	if (rval != QLA_SUCCESS) {
4353 		ql_dbg(ql_dbg_mbx, vha, 0x10e6,
4354 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
4355 		    rval, mcp->mb[0], mcp->mb[1]);
4356 	} else {
4357 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e7,
4358 		    "Done %s.\n", __func__);
4359 	}
4360 
4361 	return rval;
4362 }
4363 
4364 int
4365 qla82xx_set_driver_version(scsi_qla_host_t *vha, char *version)
4366 {
4367 	int rval;
4368 	mbx_cmd_t mc;
4369 	mbx_cmd_t *mcp = &mc;
4370 	int i;
4371 	int len;
4372 	uint16_t *str;
4373 	struct qla_hw_data *ha = vha->hw;
4374 
4375 	if (!IS_P3P_TYPE(ha))
4376 		return QLA_FUNCTION_FAILED;
4377 
4378 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x117b,
4379 	    "Entered %s.\n", __func__);
4380 
4381 	str = (void *)version;
4382 	len = strlen(version);
4383 
4384 	mcp->mb[0] = MBC_SET_RNID_PARAMS;
4385 	mcp->mb[1] = RNID_TYPE_SET_VERSION << 8;
4386 	mcp->out_mb = MBX_1|MBX_0;
4387 	for (i = 4; i < 16 && len; i++, str++, len -= 2) {
4388 		mcp->mb[i] = cpu_to_le16p(str);
4389 		mcp->out_mb |= 1<<i;
4390 	}
4391 	for (; i < 16; i++) {
4392 		mcp->mb[i] = 0;
4393 		mcp->out_mb |= 1<<i;
4394 	}
4395 	mcp->in_mb = MBX_1|MBX_0;
4396 	mcp->tov = MBX_TOV_SECONDS;
4397 	mcp->flags = 0;
4398 	rval = qla2x00_mailbox_command(vha, mcp);
4399 
4400 	if (rval != QLA_SUCCESS) {
4401 		ql_dbg(ql_dbg_mbx, vha, 0x117c,
4402 		    "Failed=%x mb[0]=%x,%x.\n", rval, mcp->mb[0], mcp->mb[1]);
4403 	} else {
4404 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x117d,
4405 		    "Done %s.\n", __func__);
4406 	}
4407 
4408 	return rval;
4409 }
4410 
4411 int
4412 qla25xx_set_driver_version(scsi_qla_host_t *vha, char *version)
4413 {
4414 	int rval;
4415 	mbx_cmd_t mc;
4416 	mbx_cmd_t *mcp = &mc;
4417 	int len;
4418 	uint16_t dwlen;
4419 	uint8_t *str;
4420 	dma_addr_t str_dma;
4421 	struct qla_hw_data *ha = vha->hw;
4422 
4423 	if (!IS_FWI2_CAPABLE(ha) || IS_QLA24XX_TYPE(ha) || IS_QLA81XX(ha) ||
4424 	    IS_P3P_TYPE(ha))
4425 		return QLA_FUNCTION_FAILED;
4426 
4427 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x117e,
4428 	    "Entered %s.\n", __func__);
4429 
4430 	str = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &str_dma);
4431 	if (!str) {
4432 		ql_log(ql_log_warn, vha, 0x117f,
4433 		    "Failed to allocate driver version param.\n");
4434 		return QLA_MEMORY_ALLOC_FAILED;
4435 	}
4436 
4437 	memcpy(str, "\x7\x3\x11\x0", 4);
4438 	dwlen = str[0];
4439 	len = dwlen * 4 - 4;
4440 	memset(str + 4, 0, len);
4441 	if (len > strlen(version))
4442 		len = strlen(version);
4443 	memcpy(str + 4, version, len);
4444 
4445 	mcp->mb[0] = MBC_SET_RNID_PARAMS;
4446 	mcp->mb[1] = RNID_TYPE_SET_VERSION << 8 | dwlen;
4447 	mcp->mb[2] = MSW(LSD(str_dma));
4448 	mcp->mb[3] = LSW(LSD(str_dma));
4449 	mcp->mb[6] = MSW(MSD(str_dma));
4450 	mcp->mb[7] = LSW(MSD(str_dma));
4451 	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
4452 	mcp->in_mb = MBX_1|MBX_0;
4453 	mcp->tov = MBX_TOV_SECONDS;
4454 	mcp->flags = 0;
4455 	rval = qla2x00_mailbox_command(vha, mcp);
4456 
4457 	if (rval != QLA_SUCCESS) {
4458 		ql_dbg(ql_dbg_mbx, vha, 0x1180,
4459 		    "Failed=%x mb[0]=%x,%x.\n", rval, mcp->mb[0], mcp->mb[1]);
4460 	} else {
4461 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1181,
4462 		    "Done %s.\n", __func__);
4463 	}
4464 
4465 	dma_pool_free(ha->s_dma_pool, str, str_dma);
4466 
4467 	return rval;
4468 }
4469 
4470 static int
4471 qla2x00_read_asic_temperature(scsi_qla_host_t *vha, uint16_t *temp)
4472 {
4473 	int rval;
4474 	mbx_cmd_t mc;
4475 	mbx_cmd_t *mcp = &mc;
4476 
4477 	if (!IS_FWI2_CAPABLE(vha->hw))
4478 		return QLA_FUNCTION_FAILED;
4479 
4480 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1159,
4481 	    "Entered %s.\n", __func__);
4482 
4483 	mcp->mb[0] = MBC_GET_RNID_PARAMS;
4484 	mcp->mb[1] = RNID_TYPE_ASIC_TEMP << 8;
4485 	mcp->out_mb = MBX_1|MBX_0;
4486 	mcp->in_mb = MBX_1|MBX_0;
4487 	mcp->tov = MBX_TOV_SECONDS;
4488 	mcp->flags = 0;
4489 	rval = qla2x00_mailbox_command(vha, mcp);
4490 	*temp = mcp->mb[1];
4491 
4492 	if (rval != QLA_SUCCESS) {
4493 		ql_dbg(ql_dbg_mbx, vha, 0x115a,
4494 		    "Failed=%x mb[0]=%x,%x.\n", rval, mcp->mb[0], mcp->mb[1]);
4495 	} else {
4496 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x115b,
4497 		    "Done %s.\n", __func__);
4498 	}
4499 
4500 	return rval;
4501 }
4502 
4503 int
4504 qla2x00_read_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint8_t *sfp,
4505 	uint16_t dev, uint16_t off, uint16_t len, uint16_t opt)
4506 {
4507 	int rval;
4508 	mbx_cmd_t mc;
4509 	mbx_cmd_t *mcp = &mc;
4510 	struct qla_hw_data *ha = vha->hw;
4511 
4512 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e8,
4513 	    "Entered %s.\n", __func__);
4514 
4515 	if (!IS_FWI2_CAPABLE(ha))
4516 		return QLA_FUNCTION_FAILED;
4517 
4518 	if (len == 1)
4519 		opt |= BIT_0;
4520 
4521 	mcp->mb[0] = MBC_READ_SFP;
4522 	mcp->mb[1] = dev;
4523 	mcp->mb[2] = MSW(sfp_dma);
4524 	mcp->mb[3] = LSW(sfp_dma);
4525 	mcp->mb[6] = MSW(MSD(sfp_dma));
4526 	mcp->mb[7] = LSW(MSD(sfp_dma));
4527 	mcp->mb[8] = len;
4528 	mcp->mb[9] = off;
4529 	mcp->mb[10] = opt;
4530 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
4531 	mcp->in_mb = MBX_1|MBX_0;
4532 	mcp->tov = MBX_TOV_SECONDS;
4533 	mcp->flags = 0;
4534 	rval = qla2x00_mailbox_command(vha, mcp);
4535 
4536 	if (opt & BIT_0)
4537 		*sfp = mcp->mb[1];
4538 
4539 	if (rval != QLA_SUCCESS) {
4540 		ql_dbg(ql_dbg_mbx, vha, 0x10e9,
4541 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4542 	} else {
4543 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ea,
4544 		    "Done %s.\n", __func__);
4545 	}
4546 
4547 	return rval;
4548 }
4549 
4550 int
4551 qla2x00_write_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint8_t *sfp,
4552 	uint16_t dev, uint16_t off, uint16_t len, uint16_t opt)
4553 {
4554 	int rval;
4555 	mbx_cmd_t mc;
4556 	mbx_cmd_t *mcp = &mc;
4557 	struct qla_hw_data *ha = vha->hw;
4558 
4559 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10eb,
4560 	    "Entered %s.\n", __func__);
4561 
4562 	if (!IS_FWI2_CAPABLE(ha))
4563 		return QLA_FUNCTION_FAILED;
4564 
4565 	if (len == 1)
4566 		opt |= BIT_0;
4567 
4568 	if (opt & BIT_0)
4569 		len = *sfp;
4570 
4571 	mcp->mb[0] = MBC_WRITE_SFP;
4572 	mcp->mb[1] = dev;
4573 	mcp->mb[2] = MSW(sfp_dma);
4574 	mcp->mb[3] = LSW(sfp_dma);
4575 	mcp->mb[6] = MSW(MSD(sfp_dma));
4576 	mcp->mb[7] = LSW(MSD(sfp_dma));
4577 	mcp->mb[8] = len;
4578 	mcp->mb[9] = off;
4579 	mcp->mb[10] = opt;
4580 	mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
4581 	mcp->in_mb = MBX_1|MBX_0;
4582 	mcp->tov = MBX_TOV_SECONDS;
4583 	mcp->flags = 0;
4584 	rval = qla2x00_mailbox_command(vha, mcp);
4585 
4586 	if (rval != QLA_SUCCESS) {
4587 		ql_dbg(ql_dbg_mbx, vha, 0x10ec,
4588 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4589 	} else {
4590 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ed,
4591 		    "Done %s.\n", __func__);
4592 	}
4593 
4594 	return rval;
4595 }
4596 
4597 int
4598 qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma,
4599     uint16_t size_in_bytes, uint16_t *actual_size)
4600 {
4601 	int rval;
4602 	mbx_cmd_t mc;
4603 	mbx_cmd_t *mcp = &mc;
4604 
4605 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ee,
4606 	    "Entered %s.\n", __func__);
4607 
4608 	if (!IS_CNA_CAPABLE(vha->hw))
4609 		return QLA_FUNCTION_FAILED;
4610 
4611 	mcp->mb[0] = MBC_GET_XGMAC_STATS;
4612 	mcp->mb[2] = MSW(stats_dma);
4613 	mcp->mb[3] = LSW(stats_dma);
4614 	mcp->mb[6] = MSW(MSD(stats_dma));
4615 	mcp->mb[7] = LSW(MSD(stats_dma));
4616 	mcp->mb[8] = size_in_bytes >> 2;
4617 	mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
4618 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
4619 	mcp->tov = MBX_TOV_SECONDS;
4620 	mcp->flags = 0;
4621 	rval = qla2x00_mailbox_command(vha, mcp);
4622 
4623 	if (rval != QLA_SUCCESS) {
4624 		ql_dbg(ql_dbg_mbx, vha, 0x10ef,
4625 		    "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
4626 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
4627 	} else {
4628 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f0,
4629 		    "Done %s.\n", __func__);
4630 
4631 
4632 		*actual_size = mcp->mb[2] << 2;
4633 	}
4634 
4635 	return rval;
4636 }
4637 
4638 int
4639 qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma,
4640     uint16_t size)
4641 {
4642 	int rval;
4643 	mbx_cmd_t mc;
4644 	mbx_cmd_t *mcp = &mc;
4645 
4646 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f1,
4647 	    "Entered %s.\n", __func__);
4648 
4649 	if (!IS_CNA_CAPABLE(vha->hw))
4650 		return QLA_FUNCTION_FAILED;
4651 
4652 	mcp->mb[0] = MBC_GET_DCBX_PARAMS;
4653 	mcp->mb[1] = 0;
4654 	mcp->mb[2] = MSW(tlv_dma);
4655 	mcp->mb[3] = LSW(tlv_dma);
4656 	mcp->mb[6] = MSW(MSD(tlv_dma));
4657 	mcp->mb[7] = LSW(MSD(tlv_dma));
4658 	mcp->mb[8] = size;
4659 	mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
4660 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
4661 	mcp->tov = MBX_TOV_SECONDS;
4662 	mcp->flags = 0;
4663 	rval = qla2x00_mailbox_command(vha, mcp);
4664 
4665 	if (rval != QLA_SUCCESS) {
4666 		ql_dbg(ql_dbg_mbx, vha, 0x10f2,
4667 		    "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
4668 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
4669 	} else {
4670 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f3,
4671 		    "Done %s.\n", __func__);
4672 	}
4673 
4674 	return rval;
4675 }
4676 
4677 int
4678 qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data)
4679 {
4680 	int rval;
4681 	mbx_cmd_t mc;
4682 	mbx_cmd_t *mcp = &mc;
4683 
4684 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f4,
4685 	    "Entered %s.\n", __func__);
4686 
4687 	if (!IS_FWI2_CAPABLE(vha->hw))
4688 		return QLA_FUNCTION_FAILED;
4689 
4690 	mcp->mb[0] = MBC_READ_RAM_EXTENDED;
4691 	mcp->mb[1] = LSW(risc_addr);
4692 	mcp->mb[8] = MSW(risc_addr);
4693 	mcp->out_mb = MBX_8|MBX_1|MBX_0;
4694 	mcp->in_mb = MBX_3|MBX_2|MBX_0;
4695 	mcp->tov = 30;
4696 	mcp->flags = 0;
4697 	rval = qla2x00_mailbox_command(vha, mcp);
4698 	if (rval != QLA_SUCCESS) {
4699 		ql_dbg(ql_dbg_mbx, vha, 0x10f5,
4700 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4701 	} else {
4702 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f6,
4703 		    "Done %s.\n", __func__);
4704 		*data = mcp->mb[3] << 16 | mcp->mb[2];
4705 	}
4706 
4707 	return rval;
4708 }
4709 
4710 int
4711 qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
4712 	uint16_t *mresp)
4713 {
4714 	int rval;
4715 	mbx_cmd_t mc;
4716 	mbx_cmd_t *mcp = &mc;
4717 
4718 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f7,
4719 	    "Entered %s.\n", __func__);
4720 
4721 	memset(mcp->mb, 0 , sizeof(mcp->mb));
4722 	mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK;
4723 	mcp->mb[1] = mreq->options | BIT_6;	// BIT_6 specifies 64 bit addressing
4724 
4725 	/* transfer count */
4726 	mcp->mb[10] = LSW(mreq->transfer_size);
4727 	mcp->mb[11] = MSW(mreq->transfer_size);
4728 
4729 	/* send data address */
4730 	mcp->mb[14] = LSW(mreq->send_dma);
4731 	mcp->mb[15] = MSW(mreq->send_dma);
4732 	mcp->mb[20] = LSW(MSD(mreq->send_dma));
4733 	mcp->mb[21] = MSW(MSD(mreq->send_dma));
4734 
4735 	/* receive data address */
4736 	mcp->mb[16] = LSW(mreq->rcv_dma);
4737 	mcp->mb[17] = MSW(mreq->rcv_dma);
4738 	mcp->mb[6] = LSW(MSD(mreq->rcv_dma));
4739 	mcp->mb[7] = MSW(MSD(mreq->rcv_dma));
4740 
4741 	/* Iteration count */
4742 	mcp->mb[18] = LSW(mreq->iteration_count);
4743 	mcp->mb[19] = MSW(mreq->iteration_count);
4744 
4745 	mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15|
4746 	    MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
4747 	if (IS_CNA_CAPABLE(vha->hw))
4748 		mcp->out_mb |= MBX_2;
4749 	mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0;
4750 
4751 	mcp->buf_size = mreq->transfer_size;
4752 	mcp->tov = MBX_TOV_SECONDS;
4753 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
4754 
4755 	rval = qla2x00_mailbox_command(vha, mcp);
4756 
4757 	if (rval != QLA_SUCCESS) {
4758 		ql_dbg(ql_dbg_mbx, vha, 0x10f8,
4759 		    "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x mb[3]=%x mb[18]=%x "
4760 		    "mb[19]=%x.\n", rval, mcp->mb[0], mcp->mb[1], mcp->mb[2],
4761 		    mcp->mb[3], mcp->mb[18], mcp->mb[19]);
4762 	} else {
4763 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f9,
4764 		    "Done %s.\n", __func__);
4765 	}
4766 
4767 	/* Copy mailbox information */
4768 	memcpy( mresp, mcp->mb, 64);
4769 	return rval;
4770 }
4771 
4772 int
4773 qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
4774 	uint16_t *mresp)
4775 {
4776 	int rval;
4777 	mbx_cmd_t mc;
4778 	mbx_cmd_t *mcp = &mc;
4779 	struct qla_hw_data *ha = vha->hw;
4780 
4781 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10fa,
4782 	    "Entered %s.\n", __func__);
4783 
4784 	memset(mcp->mb, 0 , sizeof(mcp->mb));
4785 	mcp->mb[0] = MBC_DIAGNOSTIC_ECHO;
4786 	mcp->mb[1] = mreq->options | BIT_6;	/* BIT_6 specifies 64bit address */
4787 	if (IS_CNA_CAPABLE(ha)) {
4788 		mcp->mb[1] |= BIT_15;
4789 		mcp->mb[2] = vha->fcoe_fcf_idx;
4790 	}
4791 	mcp->mb[16] = LSW(mreq->rcv_dma);
4792 	mcp->mb[17] = MSW(mreq->rcv_dma);
4793 	mcp->mb[6] = LSW(MSD(mreq->rcv_dma));
4794 	mcp->mb[7] = MSW(MSD(mreq->rcv_dma));
4795 
4796 	mcp->mb[10] = LSW(mreq->transfer_size);
4797 
4798 	mcp->mb[14] = LSW(mreq->send_dma);
4799 	mcp->mb[15] = MSW(mreq->send_dma);
4800 	mcp->mb[20] = LSW(MSD(mreq->send_dma));
4801 	mcp->mb[21] = MSW(MSD(mreq->send_dma));
4802 
4803 	mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15|
4804 	    MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
4805 	if (IS_CNA_CAPABLE(ha))
4806 		mcp->out_mb |= MBX_2;
4807 
4808 	mcp->in_mb = MBX_0;
4809 	if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) ||
4810 	    IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
4811 		mcp->in_mb |= MBX_1;
4812 	if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
4813 		mcp->in_mb |= MBX_3;
4814 
4815 	mcp->tov = MBX_TOV_SECONDS;
4816 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
4817 	mcp->buf_size = mreq->transfer_size;
4818 
4819 	rval = qla2x00_mailbox_command(vha, mcp);
4820 
4821 	if (rval != QLA_SUCCESS) {
4822 		ql_dbg(ql_dbg_mbx, vha, 0x10fb,
4823 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
4824 		    rval, mcp->mb[0], mcp->mb[1]);
4825 	} else {
4826 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10fc,
4827 		    "Done %s.\n", __func__);
4828 	}
4829 
4830 	/* Copy mailbox information */
4831 	memcpy(mresp, mcp->mb, 64);
4832 	return rval;
4833 }
4834 
4835 int
4836 qla84xx_reset_chip(scsi_qla_host_t *vha, uint16_t enable_diagnostic)
4837 {
4838 	int rval;
4839 	mbx_cmd_t mc;
4840 	mbx_cmd_t *mcp = &mc;
4841 
4842 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10fd,
4843 	    "Entered %s enable_diag=%d.\n", __func__, enable_diagnostic);
4844 
4845 	mcp->mb[0] = MBC_ISP84XX_RESET;
4846 	mcp->mb[1] = enable_diagnostic;
4847 	mcp->out_mb = MBX_1|MBX_0;
4848 	mcp->in_mb = MBX_1|MBX_0;
4849 	mcp->tov = MBX_TOV_SECONDS;
4850 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
4851 	rval = qla2x00_mailbox_command(vha, mcp);
4852 
4853 	if (rval != QLA_SUCCESS)
4854 		ql_dbg(ql_dbg_mbx, vha, 0x10fe, "Failed=%x.\n", rval);
4855 	else
4856 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ff,
4857 		    "Done %s.\n", __func__);
4858 
4859 	return rval;
4860 }
4861 
4862 int
4863 qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data)
4864 {
4865 	int rval;
4866 	mbx_cmd_t mc;
4867 	mbx_cmd_t *mcp = &mc;
4868 
4869 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1100,
4870 	    "Entered %s.\n", __func__);
4871 
4872 	if (!IS_FWI2_CAPABLE(vha->hw))
4873 		return QLA_FUNCTION_FAILED;
4874 
4875 	mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED;
4876 	mcp->mb[1] = LSW(risc_addr);
4877 	mcp->mb[2] = LSW(data);
4878 	mcp->mb[3] = MSW(data);
4879 	mcp->mb[8] = MSW(risc_addr);
4880 	mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0;
4881 	mcp->in_mb = MBX_0;
4882 	mcp->tov = 30;
4883 	mcp->flags = 0;
4884 	rval = qla2x00_mailbox_command(vha, mcp);
4885 	if (rval != QLA_SUCCESS) {
4886 		ql_dbg(ql_dbg_mbx, vha, 0x1101,
4887 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4888 	} else {
4889 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1102,
4890 		    "Done %s.\n", __func__);
4891 	}
4892 
4893 	return rval;
4894 }
4895 
4896 int
4897 qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb)
4898 {
4899 	int rval;
4900 	uint32_t stat, timer;
4901 	uint16_t mb0 = 0;
4902 	struct qla_hw_data *ha = vha->hw;
4903 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
4904 
4905 	rval = QLA_SUCCESS;
4906 
4907 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1103,
4908 	    "Entered %s.\n", __func__);
4909 
4910 	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
4911 
4912 	/* Write the MBC data to the registers */
4913 	WRT_REG_WORD(&reg->mailbox0, MBC_WRITE_MPI_REGISTER);
4914 	WRT_REG_WORD(&reg->mailbox1, mb[0]);
4915 	WRT_REG_WORD(&reg->mailbox2, mb[1]);
4916 	WRT_REG_WORD(&reg->mailbox3, mb[2]);
4917 	WRT_REG_WORD(&reg->mailbox4, mb[3]);
4918 
4919 	WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
4920 
4921 	/* Poll for MBC interrupt */
4922 	for (timer = 6000000; timer; timer--) {
4923 		/* Check for pending interrupts. */
4924 		stat = RD_REG_DWORD(&reg->host_status);
4925 		if (stat & HSRX_RISC_INT) {
4926 			stat &= 0xff;
4927 
4928 			if (stat == 0x1 || stat == 0x2 ||
4929 			    stat == 0x10 || stat == 0x11) {
4930 				set_bit(MBX_INTERRUPT,
4931 				    &ha->mbx_cmd_flags);
4932 				mb0 = RD_REG_WORD(&reg->mailbox0);
4933 				WRT_REG_DWORD(&reg->hccr,
4934 				    HCCRX_CLR_RISC_INT);
4935 				RD_REG_DWORD(&reg->hccr);
4936 				break;
4937 			}
4938 		}
4939 		udelay(5);
4940 	}
4941 
4942 	if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags))
4943 		rval = mb0 & MBS_MASK;
4944 	else
4945 		rval = QLA_FUNCTION_FAILED;
4946 
4947 	if (rval != QLA_SUCCESS) {
4948 		ql_dbg(ql_dbg_mbx, vha, 0x1104,
4949 		    "Failed=%x mb[0]=%x.\n", rval, mb[0]);
4950 	} else {
4951 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1105,
4952 		    "Done %s.\n", __func__);
4953 	}
4954 
4955 	return rval;
4956 }
4957 
4958 int
4959 qla2x00_get_data_rate(scsi_qla_host_t *vha)
4960 {
4961 	int rval;
4962 	mbx_cmd_t mc;
4963 	mbx_cmd_t *mcp = &mc;
4964 	struct qla_hw_data *ha = vha->hw;
4965 
4966 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1106,
4967 	    "Entered %s.\n", __func__);
4968 
4969 	if (!IS_FWI2_CAPABLE(ha))
4970 		return QLA_FUNCTION_FAILED;
4971 
4972 	mcp->mb[0] = MBC_DATA_RATE;
4973 	mcp->mb[1] = 0;
4974 	mcp->out_mb = MBX_1|MBX_0;
4975 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
4976 	if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
4977 		mcp->in_mb |= MBX_3;
4978 	mcp->tov = MBX_TOV_SECONDS;
4979 	mcp->flags = 0;
4980 	rval = qla2x00_mailbox_command(vha, mcp);
4981 	if (rval != QLA_SUCCESS) {
4982 		ql_dbg(ql_dbg_mbx, vha, 0x1107,
4983 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4984 	} else {
4985 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1108,
4986 		    "Done %s.\n", __func__);
4987 		if (mcp->mb[1] != 0x7)
4988 			ha->link_data_rate = mcp->mb[1];
4989 	}
4990 
4991 	return rval;
4992 }
4993 
4994 int
4995 qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb)
4996 {
4997 	int rval;
4998 	mbx_cmd_t mc;
4999 	mbx_cmd_t *mcp = &mc;
5000 	struct qla_hw_data *ha = vha->hw;
5001 
5002 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1109,
5003 	    "Entered %s.\n", __func__);
5004 
5005 	if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA8044(ha) &&
5006 	    !IS_QLA27XX(ha))
5007 		return QLA_FUNCTION_FAILED;
5008 	mcp->mb[0] = MBC_GET_PORT_CONFIG;
5009 	mcp->out_mb = MBX_0;
5010 	mcp->in_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5011 	mcp->tov = MBX_TOV_SECONDS;
5012 	mcp->flags = 0;
5013 
5014 	rval = qla2x00_mailbox_command(vha, mcp);
5015 
5016 	if (rval != QLA_SUCCESS) {
5017 		ql_dbg(ql_dbg_mbx, vha, 0x110a,
5018 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5019 	} else {
5020 		/* Copy all bits to preserve original value */
5021 		memcpy(mb, &mcp->mb[1], sizeof(uint16_t) * 4);
5022 
5023 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110b,
5024 		    "Done %s.\n", __func__);
5025 	}
5026 	return rval;
5027 }
5028 
5029 int
5030 qla81xx_set_port_config(scsi_qla_host_t *vha, uint16_t *mb)
5031 {
5032 	int rval;
5033 	mbx_cmd_t mc;
5034 	mbx_cmd_t *mcp = &mc;
5035 
5036 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110c,
5037 	    "Entered %s.\n", __func__);
5038 
5039 	mcp->mb[0] = MBC_SET_PORT_CONFIG;
5040 	/* Copy all bits to preserve original setting */
5041 	memcpy(&mcp->mb[1], mb, sizeof(uint16_t) * 4);
5042 	mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5043 	mcp->in_mb = MBX_0;
5044 	mcp->tov = MBX_TOV_SECONDS;
5045 	mcp->flags = 0;
5046 	rval = qla2x00_mailbox_command(vha, mcp);
5047 
5048 	if (rval != QLA_SUCCESS) {
5049 		ql_dbg(ql_dbg_mbx, vha, 0x110d,
5050 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5051 	} else
5052 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110e,
5053 		    "Done %s.\n", __func__);
5054 
5055 	return rval;
5056 }
5057 
5058 
5059 int
5060 qla24xx_set_fcp_prio(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t priority,
5061 		uint16_t *mb)
5062 {
5063 	int rval;
5064 	mbx_cmd_t mc;
5065 	mbx_cmd_t *mcp = &mc;
5066 	struct qla_hw_data *ha = vha->hw;
5067 
5068 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110f,
5069 	    "Entered %s.\n", __func__);
5070 
5071 	if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha))
5072 		return QLA_FUNCTION_FAILED;
5073 
5074 	mcp->mb[0] = MBC_PORT_PARAMS;
5075 	mcp->mb[1] = loop_id;
5076 	if (ha->flags.fcp_prio_enabled)
5077 		mcp->mb[2] = BIT_1;
5078 	else
5079 		mcp->mb[2] = BIT_2;
5080 	mcp->mb[4] = priority & 0xf;
5081 	mcp->mb[9] = vha->vp_idx;
5082 	mcp->out_mb = MBX_9|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5083 	mcp->in_mb = MBX_4|MBX_3|MBX_1|MBX_0;
5084 	mcp->tov = 30;
5085 	mcp->flags = 0;
5086 	rval = qla2x00_mailbox_command(vha, mcp);
5087 	if (mb != NULL) {
5088 		mb[0] = mcp->mb[0];
5089 		mb[1] = mcp->mb[1];
5090 		mb[3] = mcp->mb[3];
5091 		mb[4] = mcp->mb[4];
5092 	}
5093 
5094 	if (rval != QLA_SUCCESS) {
5095 		ql_dbg(ql_dbg_mbx, vha, 0x10cd, "Failed=%x.\n", rval);
5096 	} else {
5097 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10cc,
5098 		    "Done %s.\n", __func__);
5099 	}
5100 
5101 	return rval;
5102 }
5103 
5104 int
5105 qla2x00_get_thermal_temp(scsi_qla_host_t *vha, uint16_t *temp)
5106 {
5107 	int rval = QLA_FUNCTION_FAILED;
5108 	struct qla_hw_data *ha = vha->hw;
5109 	uint8_t byte;
5110 
5111 	if (!IS_FWI2_CAPABLE(ha) || IS_QLA24XX_TYPE(ha) || IS_QLA81XX(ha)) {
5112 		ql_dbg(ql_dbg_mbx, vha, 0x1150,
5113 		    "Thermal not supported by this card.\n");
5114 		return rval;
5115 	}
5116 
5117 	if (IS_QLA25XX(ha)) {
5118 		if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
5119 		    ha->pdev->subsystem_device == 0x0175) {
5120 			rval = qla2x00_read_sfp(vha, 0, &byte,
5121 			    0x98, 0x1, 1, BIT_13|BIT_0);
5122 			*temp = byte;
5123 			return rval;
5124 		}
5125 		if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
5126 		    ha->pdev->subsystem_device == 0x338e) {
5127 			rval = qla2x00_read_sfp(vha, 0, &byte,
5128 			    0x98, 0x1, 1, BIT_15|BIT_14|BIT_0);
5129 			*temp = byte;
5130 			return rval;
5131 		}
5132 		ql_dbg(ql_dbg_mbx, vha, 0x10c9,
5133 		    "Thermal not supported by this card.\n");
5134 		return rval;
5135 	}
5136 
5137 	if (IS_QLA82XX(ha)) {
5138 		*temp = qla82xx_read_temperature(vha);
5139 		rval = QLA_SUCCESS;
5140 		return rval;
5141 	} else if (IS_QLA8044(ha)) {
5142 		*temp = qla8044_read_temperature(vha);
5143 		rval = QLA_SUCCESS;
5144 		return rval;
5145 	}
5146 
5147 	rval = qla2x00_read_asic_temperature(vha, temp);
5148 	return rval;
5149 }
5150 
5151 int
5152 qla82xx_mbx_intr_enable(scsi_qla_host_t *vha)
5153 {
5154 	int rval;
5155 	struct qla_hw_data *ha = vha->hw;
5156 	mbx_cmd_t mc;
5157 	mbx_cmd_t *mcp = &mc;
5158 
5159 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1017,
5160 	    "Entered %s.\n", __func__);
5161 
5162 	if (!IS_FWI2_CAPABLE(ha))
5163 		return QLA_FUNCTION_FAILED;
5164 
5165 	memset(mcp, 0, sizeof(mbx_cmd_t));
5166 	mcp->mb[0] = MBC_TOGGLE_INTERRUPT;
5167 	mcp->mb[1] = 1;
5168 
5169 	mcp->out_mb = MBX_1|MBX_0;
5170 	mcp->in_mb = MBX_0;
5171 	mcp->tov = 30;
5172 	mcp->flags = 0;
5173 
5174 	rval = qla2x00_mailbox_command(vha, mcp);
5175 	if (rval != QLA_SUCCESS) {
5176 		ql_dbg(ql_dbg_mbx, vha, 0x1016,
5177 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5178 	} else {
5179 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100e,
5180 		    "Done %s.\n", __func__);
5181 	}
5182 
5183 	return rval;
5184 }
5185 
5186 int
5187 qla82xx_mbx_intr_disable(scsi_qla_host_t *vha)
5188 {
5189 	int rval;
5190 	struct qla_hw_data *ha = vha->hw;
5191 	mbx_cmd_t mc;
5192 	mbx_cmd_t *mcp = &mc;
5193 
5194 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100d,
5195 	    "Entered %s.\n", __func__);
5196 
5197 	if (!IS_P3P_TYPE(ha))
5198 		return QLA_FUNCTION_FAILED;
5199 
5200 	memset(mcp, 0, sizeof(mbx_cmd_t));
5201 	mcp->mb[0] = MBC_TOGGLE_INTERRUPT;
5202 	mcp->mb[1] = 0;
5203 
5204 	mcp->out_mb = MBX_1|MBX_0;
5205 	mcp->in_mb = MBX_0;
5206 	mcp->tov = 30;
5207 	mcp->flags = 0;
5208 
5209 	rval = qla2x00_mailbox_command(vha, mcp);
5210 	if (rval != QLA_SUCCESS) {
5211 		ql_dbg(ql_dbg_mbx, vha, 0x100c,
5212 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5213 	} else {
5214 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100b,
5215 		    "Done %s.\n", __func__);
5216 	}
5217 
5218 	return rval;
5219 }
5220 
5221 int
5222 qla82xx_md_get_template_size(scsi_qla_host_t *vha)
5223 {
5224 	struct qla_hw_data *ha = vha->hw;
5225 	mbx_cmd_t mc;
5226 	mbx_cmd_t *mcp = &mc;
5227 	int rval = QLA_FUNCTION_FAILED;
5228 
5229 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x111f,
5230 	    "Entered %s.\n", __func__);
5231 
5232 	memset(mcp->mb, 0 , sizeof(mcp->mb));
5233 	mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
5234 	mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
5235 	mcp->mb[2] = LSW(RQST_TMPLT_SIZE);
5236 	mcp->mb[3] = MSW(RQST_TMPLT_SIZE);
5237 
5238 	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
5239 	mcp->in_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|
5240 	    MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5241 
5242 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
5243 	mcp->tov = MBX_TOV_SECONDS;
5244 	rval = qla2x00_mailbox_command(vha, mcp);
5245 
5246 	/* Always copy back return mailbox values. */
5247 	if (rval != QLA_SUCCESS) {
5248 		ql_dbg(ql_dbg_mbx, vha, 0x1120,
5249 		    "mailbox command FAILED=0x%x, subcode=%x.\n",
5250 		    (mcp->mb[1] << 16) | mcp->mb[0],
5251 		    (mcp->mb[3] << 16) | mcp->mb[2]);
5252 	} else {
5253 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1121,
5254 		    "Done %s.\n", __func__);
5255 		ha->md_template_size = ((mcp->mb[3] << 16) | mcp->mb[2]);
5256 		if (!ha->md_template_size) {
5257 			ql_dbg(ql_dbg_mbx, vha, 0x1122,
5258 			    "Null template size obtained.\n");
5259 			rval = QLA_FUNCTION_FAILED;
5260 		}
5261 	}
5262 	return rval;
5263 }
5264 
5265 int
5266 qla82xx_md_get_template(scsi_qla_host_t *vha)
5267 {
5268 	struct qla_hw_data *ha = vha->hw;
5269 	mbx_cmd_t mc;
5270 	mbx_cmd_t *mcp = &mc;
5271 	int rval = QLA_FUNCTION_FAILED;
5272 
5273 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1123,
5274 	    "Entered %s.\n", __func__);
5275 
5276 	ha->md_tmplt_hdr = dma_alloc_coherent(&ha->pdev->dev,
5277 	   ha->md_template_size, &ha->md_tmplt_hdr_dma, GFP_KERNEL);
5278 	if (!ha->md_tmplt_hdr) {
5279 		ql_log(ql_log_warn, vha, 0x1124,
5280 		    "Unable to allocate memory for Minidump template.\n");
5281 		return rval;
5282 	}
5283 
5284 	memset(mcp->mb, 0 , sizeof(mcp->mb));
5285 	mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
5286 	mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
5287 	mcp->mb[2] = LSW(RQST_TMPLT);
5288 	mcp->mb[3] = MSW(RQST_TMPLT);
5289 	mcp->mb[4] = LSW(LSD(ha->md_tmplt_hdr_dma));
5290 	mcp->mb[5] = MSW(LSD(ha->md_tmplt_hdr_dma));
5291 	mcp->mb[6] = LSW(MSD(ha->md_tmplt_hdr_dma));
5292 	mcp->mb[7] = MSW(MSD(ha->md_tmplt_hdr_dma));
5293 	mcp->mb[8] = LSW(ha->md_template_size);
5294 	mcp->mb[9] = MSW(ha->md_template_size);
5295 
5296 	mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
5297 	mcp->tov = MBX_TOV_SECONDS;
5298 	mcp->out_mb = MBX_11|MBX_10|MBX_9|MBX_8|
5299 	    MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5300 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
5301 	rval = qla2x00_mailbox_command(vha, mcp);
5302 
5303 	if (rval != QLA_SUCCESS) {
5304 		ql_dbg(ql_dbg_mbx, vha, 0x1125,
5305 		    "mailbox command FAILED=0x%x, subcode=%x.\n",
5306 		    ((mcp->mb[1] << 16) | mcp->mb[0]),
5307 		    ((mcp->mb[3] << 16) | mcp->mb[2]));
5308 	} else
5309 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1126,
5310 		    "Done %s.\n", __func__);
5311 	return rval;
5312 }
5313 
5314 int
5315 qla8044_md_get_template(scsi_qla_host_t *vha)
5316 {
5317 	struct qla_hw_data *ha = vha->hw;
5318 	mbx_cmd_t mc;
5319 	mbx_cmd_t *mcp = &mc;
5320 	int rval = QLA_FUNCTION_FAILED;
5321 	int offset = 0, size = MINIDUMP_SIZE_36K;
5322 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0xb11f,
5323 	    "Entered %s.\n", __func__);
5324 
5325 	ha->md_tmplt_hdr = dma_alloc_coherent(&ha->pdev->dev,
5326 	   ha->md_template_size, &ha->md_tmplt_hdr_dma, GFP_KERNEL);
5327 	if (!ha->md_tmplt_hdr) {
5328 		ql_log(ql_log_warn, vha, 0xb11b,
5329 		    "Unable to allocate memory for Minidump template.\n");
5330 		return rval;
5331 	}
5332 
5333 	memset(mcp->mb, 0 , sizeof(mcp->mb));
5334 	while (offset < ha->md_template_size) {
5335 		mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
5336 		mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
5337 		mcp->mb[2] = LSW(RQST_TMPLT);
5338 		mcp->mb[3] = MSW(RQST_TMPLT);
5339 		mcp->mb[4] = LSW(LSD(ha->md_tmplt_hdr_dma + offset));
5340 		mcp->mb[5] = MSW(LSD(ha->md_tmplt_hdr_dma + offset));
5341 		mcp->mb[6] = LSW(MSD(ha->md_tmplt_hdr_dma + offset));
5342 		mcp->mb[7] = MSW(MSD(ha->md_tmplt_hdr_dma + offset));
5343 		mcp->mb[8] = LSW(size);
5344 		mcp->mb[9] = MSW(size);
5345 		mcp->mb[10] = offset & 0x0000FFFF;
5346 		mcp->mb[11] = offset & 0xFFFF0000;
5347 		mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
5348 		mcp->tov = MBX_TOV_SECONDS;
5349 		mcp->out_mb = MBX_11|MBX_10|MBX_9|MBX_8|
5350 			MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5351 		mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
5352 		rval = qla2x00_mailbox_command(vha, mcp);
5353 
5354 		if (rval != QLA_SUCCESS) {
5355 			ql_dbg(ql_dbg_mbx, vha, 0xb11c,
5356 				"mailbox command FAILED=0x%x, subcode=%x.\n",
5357 				((mcp->mb[1] << 16) | mcp->mb[0]),
5358 				((mcp->mb[3] << 16) | mcp->mb[2]));
5359 			return rval;
5360 		} else
5361 			ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0xb11d,
5362 				"Done %s.\n", __func__);
5363 		offset = offset + size;
5364 	}
5365 	return rval;
5366 }
5367 
5368 int
5369 qla81xx_set_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
5370 {
5371 	int rval;
5372 	struct qla_hw_data *ha = vha->hw;
5373 	mbx_cmd_t mc;
5374 	mbx_cmd_t *mcp = &mc;
5375 
5376 	if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
5377 		return QLA_FUNCTION_FAILED;
5378 
5379 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1133,
5380 	    "Entered %s.\n", __func__);
5381 
5382 	memset(mcp, 0, sizeof(mbx_cmd_t));
5383 	mcp->mb[0] = MBC_SET_LED_CONFIG;
5384 	mcp->mb[1] = led_cfg[0];
5385 	mcp->mb[2] = led_cfg[1];
5386 	if (IS_QLA8031(ha)) {
5387 		mcp->mb[3] = led_cfg[2];
5388 		mcp->mb[4] = led_cfg[3];
5389 		mcp->mb[5] = led_cfg[4];
5390 		mcp->mb[6] = led_cfg[5];
5391 	}
5392 
5393 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
5394 	if (IS_QLA8031(ha))
5395 		mcp->out_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
5396 	mcp->in_mb = MBX_0;
5397 	mcp->tov = 30;
5398 	mcp->flags = 0;
5399 
5400 	rval = qla2x00_mailbox_command(vha, mcp);
5401 	if (rval != QLA_SUCCESS) {
5402 		ql_dbg(ql_dbg_mbx, vha, 0x1134,
5403 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5404 	} else {
5405 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1135,
5406 		    "Done %s.\n", __func__);
5407 	}
5408 
5409 	return rval;
5410 }
5411 
5412 int
5413 qla81xx_get_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
5414 {
5415 	int rval;
5416 	struct qla_hw_data *ha = vha->hw;
5417 	mbx_cmd_t mc;
5418 	mbx_cmd_t *mcp = &mc;
5419 
5420 	if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
5421 		return QLA_FUNCTION_FAILED;
5422 
5423 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1136,
5424 	    "Entered %s.\n", __func__);
5425 
5426 	memset(mcp, 0, sizeof(mbx_cmd_t));
5427 	mcp->mb[0] = MBC_GET_LED_CONFIG;
5428 
5429 	mcp->out_mb = MBX_0;
5430 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
5431 	if (IS_QLA8031(ha))
5432 		mcp->in_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
5433 	mcp->tov = 30;
5434 	mcp->flags = 0;
5435 
5436 	rval = qla2x00_mailbox_command(vha, mcp);
5437 	if (rval != QLA_SUCCESS) {
5438 		ql_dbg(ql_dbg_mbx, vha, 0x1137,
5439 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5440 	} else {
5441 		led_cfg[0] = mcp->mb[1];
5442 		led_cfg[1] = mcp->mb[2];
5443 		if (IS_QLA8031(ha)) {
5444 			led_cfg[2] = mcp->mb[3];
5445 			led_cfg[3] = mcp->mb[4];
5446 			led_cfg[4] = mcp->mb[5];
5447 			led_cfg[5] = mcp->mb[6];
5448 		}
5449 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1138,
5450 		    "Done %s.\n", __func__);
5451 	}
5452 
5453 	return rval;
5454 }
5455 
5456 int
5457 qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable)
5458 {
5459 	int rval;
5460 	struct qla_hw_data *ha = vha->hw;
5461 	mbx_cmd_t mc;
5462 	mbx_cmd_t *mcp = &mc;
5463 
5464 	if (!IS_P3P_TYPE(ha))
5465 		return QLA_FUNCTION_FAILED;
5466 
5467 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1127,
5468 		"Entered %s.\n", __func__);
5469 
5470 	memset(mcp, 0, sizeof(mbx_cmd_t));
5471 	mcp->mb[0] = MBC_SET_LED_CONFIG;
5472 	if (enable)
5473 		mcp->mb[7] = 0xE;
5474 	else
5475 		mcp->mb[7] = 0xD;
5476 
5477 	mcp->out_mb = MBX_7|MBX_0;
5478 	mcp->in_mb = MBX_0;
5479 	mcp->tov = MBX_TOV_SECONDS;
5480 	mcp->flags = 0;
5481 
5482 	rval = qla2x00_mailbox_command(vha, mcp);
5483 	if (rval != QLA_SUCCESS) {
5484 		ql_dbg(ql_dbg_mbx, vha, 0x1128,
5485 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5486 	} else {
5487 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1129,
5488 		    "Done %s.\n", __func__);
5489 	}
5490 
5491 	return rval;
5492 }
5493 
5494 int
5495 qla83xx_wr_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data)
5496 {
5497 	int rval;
5498 	struct qla_hw_data *ha = vha->hw;
5499 	mbx_cmd_t mc;
5500 	mbx_cmd_t *mcp = &mc;
5501 
5502 	if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
5503 		return QLA_FUNCTION_FAILED;
5504 
5505 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1130,
5506 	    "Entered %s.\n", __func__);
5507 
5508 	mcp->mb[0] = MBC_WRITE_REMOTE_REG;
5509 	mcp->mb[1] = LSW(reg);
5510 	mcp->mb[2] = MSW(reg);
5511 	mcp->mb[3] = LSW(data);
5512 	mcp->mb[4] = MSW(data);
5513 	mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
5514 
5515 	mcp->in_mb = MBX_1|MBX_0;
5516 	mcp->tov = MBX_TOV_SECONDS;
5517 	mcp->flags = 0;
5518 	rval = qla2x00_mailbox_command(vha, mcp);
5519 
5520 	if (rval != QLA_SUCCESS) {
5521 		ql_dbg(ql_dbg_mbx, vha, 0x1131,
5522 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5523 	} else {
5524 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1132,
5525 		    "Done %s.\n", __func__);
5526 	}
5527 
5528 	return rval;
5529 }
5530 
5531 int
5532 qla2x00_port_logout(scsi_qla_host_t *vha, struct fc_port *fcport)
5533 {
5534 	int rval;
5535 	struct qla_hw_data *ha = vha->hw;
5536 	mbx_cmd_t mc;
5537 	mbx_cmd_t *mcp = &mc;
5538 
5539 	if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
5540 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x113b,
5541 		    "Implicit LOGO Unsupported.\n");
5542 		return QLA_FUNCTION_FAILED;
5543 	}
5544 
5545 
5546 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x113c,
5547 	    "Entering %s.\n",  __func__);
5548 
5549 	/* Perform Implicit LOGO. */
5550 	mcp->mb[0] = MBC_PORT_LOGOUT;
5551 	mcp->mb[1] = fcport->loop_id;
5552 	mcp->mb[10] = BIT_15;
5553 	mcp->out_mb = MBX_10|MBX_1|MBX_0;
5554 	mcp->in_mb = MBX_0;
5555 	mcp->tov = MBX_TOV_SECONDS;
5556 	mcp->flags = 0;
5557 	rval = qla2x00_mailbox_command(vha, mcp);
5558 	if (rval != QLA_SUCCESS)
5559 		ql_dbg(ql_dbg_mbx, vha, 0x113d,
5560 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5561 	else
5562 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x113e,
5563 		    "Done %s.\n", __func__);
5564 
5565 	return rval;
5566 }
5567 
5568 int
5569 qla83xx_rd_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t *data)
5570 {
5571 	int rval;
5572 	mbx_cmd_t mc;
5573 	mbx_cmd_t *mcp = &mc;
5574 	struct qla_hw_data *ha = vha->hw;
5575 	unsigned long retry_max_time = jiffies + (2 * HZ);
5576 
5577 	if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
5578 		return QLA_FUNCTION_FAILED;
5579 
5580 	ql_dbg(ql_dbg_mbx, vha, 0x114b, "Entered %s.\n", __func__);
5581 
5582 retry_rd_reg:
5583 	mcp->mb[0] = MBC_READ_REMOTE_REG;
5584 	mcp->mb[1] = LSW(reg);
5585 	mcp->mb[2] = MSW(reg);
5586 	mcp->out_mb = MBX_2|MBX_1|MBX_0;
5587 	mcp->in_mb = MBX_4|MBX_3|MBX_1|MBX_0;
5588 	mcp->tov = MBX_TOV_SECONDS;
5589 	mcp->flags = 0;
5590 	rval = qla2x00_mailbox_command(vha, mcp);
5591 
5592 	if (rval != QLA_SUCCESS) {
5593 		ql_dbg(ql_dbg_mbx, vha, 0x114c,
5594 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
5595 		    rval, mcp->mb[0], mcp->mb[1]);
5596 	} else {
5597 		*data = (mcp->mb[3] | (mcp->mb[4] << 16));
5598 		if (*data == QLA8XXX_BAD_VALUE) {
5599 			/*
5600 			 * During soft-reset CAMRAM register reads might
5601 			 * return 0xbad0bad0. So retry for MAX of 2 sec
5602 			 * while reading camram registers.
5603 			 */
5604 			if (time_after(jiffies, retry_max_time)) {
5605 				ql_dbg(ql_dbg_mbx, vha, 0x1141,
5606 				    "Failure to read CAMRAM register. "
5607 				    "data=0x%x.\n", *data);
5608 				return QLA_FUNCTION_FAILED;
5609 			}
5610 			msleep(100);
5611 			goto retry_rd_reg;
5612 		}
5613 		ql_dbg(ql_dbg_mbx, vha, 0x1142, "Done %s.\n", __func__);
5614 	}
5615 
5616 	return rval;
5617 }
5618 
5619 int
5620 qla83xx_restart_nic_firmware(scsi_qla_host_t *vha)
5621 {
5622 	int rval;
5623 	mbx_cmd_t mc;
5624 	mbx_cmd_t *mcp = &mc;
5625 	struct qla_hw_data *ha = vha->hw;
5626 
5627 	if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
5628 		return QLA_FUNCTION_FAILED;
5629 
5630 	ql_dbg(ql_dbg_mbx, vha, 0x1143, "Entered %s.\n", __func__);
5631 
5632 	mcp->mb[0] = MBC_RESTART_NIC_FIRMWARE;
5633 	mcp->out_mb = MBX_0;
5634 	mcp->in_mb = MBX_1|MBX_0;
5635 	mcp->tov = MBX_TOV_SECONDS;
5636 	mcp->flags = 0;
5637 	rval = qla2x00_mailbox_command(vha, mcp);
5638 
5639 	if (rval != QLA_SUCCESS) {
5640 		ql_dbg(ql_dbg_mbx, vha, 0x1144,
5641 		    "Failed=%x mb[0]=%x mb[1]=%x.\n",
5642 		    rval, mcp->mb[0], mcp->mb[1]);
5643 		ha->isp_ops->fw_dump(vha, 0);
5644 	} else {
5645 		ql_dbg(ql_dbg_mbx, vha, 0x1145, "Done %s.\n", __func__);
5646 	}
5647 
5648 	return rval;
5649 }
5650 
5651 int
5652 qla83xx_access_control(scsi_qla_host_t *vha, uint16_t options,
5653 	uint32_t start_addr, uint32_t end_addr, uint16_t *sector_size)
5654 {
5655 	int rval;
5656 	mbx_cmd_t mc;
5657 	mbx_cmd_t *mcp = &mc;
5658 	uint8_t subcode = (uint8_t)options;
5659 	struct qla_hw_data *ha = vha->hw;
5660 
5661 	if (!IS_QLA8031(ha))
5662 		return QLA_FUNCTION_FAILED;
5663 
5664 	ql_dbg(ql_dbg_mbx, vha, 0x1146, "Entered %s.\n", __func__);
5665 
5666 	mcp->mb[0] = MBC_SET_ACCESS_CONTROL;
5667 	mcp->mb[1] = options;
5668 	mcp->out_mb = MBX_1|MBX_0;
5669 	if (subcode & BIT_2) {
5670 		mcp->mb[2] = LSW(start_addr);
5671 		mcp->mb[3] = MSW(start_addr);
5672 		mcp->mb[4] = LSW(end_addr);
5673 		mcp->mb[5] = MSW(end_addr);
5674 		mcp->out_mb |= MBX_5|MBX_4|MBX_3|MBX_2;
5675 	}
5676 	mcp->in_mb = MBX_2|MBX_1|MBX_0;
5677 	if (!(subcode & (BIT_2 | BIT_5)))
5678 		mcp->in_mb |= MBX_4|MBX_3;
5679 	mcp->tov = MBX_TOV_SECONDS;
5680 	mcp->flags = 0;
5681 	rval = qla2x00_mailbox_command(vha, mcp);
5682 
5683 	if (rval != QLA_SUCCESS) {
5684 		ql_dbg(ql_dbg_mbx, vha, 0x1147,
5685 		    "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x mb[3]=%x mb[4]=%x.\n",
5686 		    rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3],
5687 		    mcp->mb[4]);
5688 		ha->isp_ops->fw_dump(vha, 0);
5689 	} else {
5690 		if (subcode & BIT_5)
5691 			*sector_size = mcp->mb[1];
5692 		else if (subcode & (BIT_6 | BIT_7)) {
5693 			ql_dbg(ql_dbg_mbx, vha, 0x1148,
5694 			    "Driver-lock id=%x%x", mcp->mb[4], mcp->mb[3]);
5695 		} else if (subcode & (BIT_3 | BIT_4)) {
5696 			ql_dbg(ql_dbg_mbx, vha, 0x1149,
5697 			    "Flash-lock id=%x%x", mcp->mb[4], mcp->mb[3]);
5698 		}
5699 		ql_dbg(ql_dbg_mbx, vha, 0x114a, "Done %s.\n", __func__);
5700 	}
5701 
5702 	return rval;
5703 }
5704 
5705 int
5706 qla2x00_dump_mctp_data(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr,
5707 	uint32_t size)
5708 {
5709 	int rval;
5710 	mbx_cmd_t mc;
5711 	mbx_cmd_t *mcp = &mc;
5712 
5713 	if (!IS_MCTP_CAPABLE(vha->hw))
5714 		return QLA_FUNCTION_FAILED;
5715 
5716 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x114f,
5717 	    "Entered %s.\n", __func__);
5718 
5719 	mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED;
5720 	mcp->mb[1] = LSW(addr);
5721 	mcp->mb[2] = MSW(req_dma);
5722 	mcp->mb[3] = LSW(req_dma);
5723 	mcp->mb[4] = MSW(size);
5724 	mcp->mb[5] = LSW(size);
5725 	mcp->mb[6] = MSW(MSD(req_dma));
5726 	mcp->mb[7] = LSW(MSD(req_dma));
5727 	mcp->mb[8] = MSW(addr);
5728 	/* Setting RAM ID to valid */
5729 	mcp->mb[10] |= BIT_7;
5730 	/* For MCTP RAM ID is 0x40 */
5731 	mcp->mb[10] |= 0x40;
5732 
5733 	mcp->out_mb |= MBX_10|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|
5734 	    MBX_0;
5735 
5736 	mcp->in_mb = MBX_0;
5737 	mcp->tov = MBX_TOV_SECONDS;
5738 	mcp->flags = 0;
5739 	rval = qla2x00_mailbox_command(vha, mcp);
5740 
5741 	if (rval != QLA_SUCCESS) {
5742 		ql_dbg(ql_dbg_mbx, vha, 0x114e,
5743 		    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
5744 	} else {
5745 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x114d,
5746 		    "Done %s.\n", __func__);
5747 	}
5748 
5749 	return rval;
5750 }
5751 
5752 int
5753 qla26xx_dport_diagnostics(scsi_qla_host_t *vha,
5754 	void *dd_buf, uint size, uint options)
5755 {
5756 	int rval;
5757 	mbx_cmd_t mc;
5758 	mbx_cmd_t *mcp = &mc;
5759 	dma_addr_t dd_dma;
5760 
5761 	if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw))
5762 		return QLA_FUNCTION_FAILED;
5763 
5764 	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1192,
5765 	    "Entered %s.\n", __func__);
5766 
5767 	dd_dma = dma_map_single(&vha->hw->pdev->dev,
5768 	    dd_buf, size, DMA_FROM_DEVICE);
5769 	if (!dd_dma) {
5770 		ql_log(ql_log_warn, vha, 0x1194, "Failed to map dma buffer.\n");
5771 		return QLA_MEMORY_ALLOC_FAILED;
5772 	}
5773 
5774 	memset(dd_buf, 0, size);
5775 
5776 	mcp->mb[0] = MBC_DPORT_DIAGNOSTICS;
5777 	mcp->mb[1] = options;
5778 	mcp->mb[2] = MSW(LSD(dd_dma));
5779 	mcp->mb[3] = LSW(LSD(dd_dma));
5780 	mcp->mb[6] = MSW(MSD(dd_dma));
5781 	mcp->mb[7] = LSW(MSD(dd_dma));
5782 	mcp->mb[8] = size;
5783 	mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
5784 	mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
5785 	mcp->buf_size = size;
5786 	mcp->flags = MBX_DMA_IN;
5787 	mcp->tov = MBX_TOV_SECONDS * 4;
5788 	rval = qla2x00_mailbox_command(vha, mcp);
5789 
5790 	if (rval != QLA_SUCCESS) {
5791 		ql_dbg(ql_dbg_mbx, vha, 0x1195, "Failed=%x.\n", rval);
5792 	} else {
5793 		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1196,
5794 		    "Done %s.\n", __func__);
5795 	}
5796 
5797 	dma_unmap_single(&vha->hw->pdev->dev, dd_dma,
5798 	    size, DMA_FROM_DEVICE);
5799 
5800 	return rval;
5801 }
5802