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