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