2 * QLOGIC LINUX SOFTWARE
4 * QLogic ISP2x00 device driver for Linux 2.6.x
5 * Copyright (C) 2003-2004 QLogic Corporation
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2, or (at your option) any
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
21 #include <linux/delay.h>
24 qla2x00_mbx_sem_timeout(unsigned long data
)
26 struct semaphore
*sem_ptr
= (struct semaphore
*)data
;
28 DEBUG11(printk("qla2x00_sem_timeout: entered.\n");)
30 if (sem_ptr
!= NULL
) {
34 DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");)
38 * qla2x00_mailbox_command
39 * Issue mailbox command and waits for completion.
42 * ha = adapter block pointer.
43 * mcp = driver internal mbx struct pointer.
46 * mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data.
49 * 0 : QLA_SUCCESS = cmd performed success
50 * 1 : QLA_FUNCTION_FAILED (error encountered)
51 * 6 : QLA_FUNCTION_TIMEOUT (timeout condition encountered)
57 qla2x00_mailbox_command(scsi_qla_host_t
*ha
, mbx_cmd_t
*mcp
)
60 unsigned long flags
= 0;
61 struct device_reg_2xxx __iomem
*reg
= &ha
->iobase
->isp
;
62 struct timer_list tmp_intr_timer
;
63 uint8_t abort_active
= test_bit(ABORT_ISP_ACTIVE
, &ha
->dpc_flags
);
64 uint8_t io_lock_on
= ha
->flags
.init_done
;
67 uint16_t __iomem
*optr
;
70 unsigned long mbx_flags
= 0;
71 unsigned long wait_time
;
75 DEBUG11(printk("qla2x00_mailbox_command(%ld): entered.\n",
78 * Wait for active mailbox commands to finish by waiting at most
79 * tov seconds. This is to serialize actual issuing of mailbox cmds
80 * during non ISP abort time.
83 if (qla2x00_down_timeout(&ha
->mbx_cmd_sem
, mcp
->tov
* HZ
)) {
84 /* Timeout occurred. Return error. */
85 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): cmd "
86 "access timeout. Exiting.\n", ha
->host_no
);)
87 return QLA_FUNCTION_TIMEOUT
;
91 ha
->flags
.mbox_busy
= 1;
92 /* Save mailbox command for debug */
95 /* Try to get mailbox register access */
97 spin_lock_irqsave(&ha
->mbx_reg_lock
, mbx_flags
);
99 DEBUG11(printk("scsi%d: prepare to issue mbox cmd=0x%x.\n",
100 (int)ha
->host_no
, mcp
->mb
[0]);)
102 spin_lock_irqsave(&ha
->hardware_lock
, flags
);
104 /* Load mailbox registers. */
105 optr
= (uint16_t __iomem
*)MAILBOX_REG(ha
, reg
, 0);
108 command
= mcp
->mb
[0];
109 mboxes
= mcp
->out_mb
;
111 for (cnt
= 0; cnt
< ha
->mbx_count
; cnt
++) {
112 if (IS_QLA2200(ha
) && cnt
== 8)
113 optr
= (uint16_t __iomem
*)MAILBOX_REG(ha
, reg
, 8);
115 WRT_REG_WORD(optr
, *iptr
);
122 #if defined(QL_DEBUG_LEVEL_1)
123 printk("qla2x00_mailbox_command: Loaded MBX registers "
124 "(displayed in bytes) = \n");
125 qla2x00_dump_buffer((uint8_t *)mcp
->mb
, 16);
127 qla2x00_dump_buffer(((uint8_t *)mcp
->mb
+ 0x10), 16);
129 qla2x00_dump_buffer(((uint8_t *)mcp
->mb
+ 0x20), 8);
131 printk("qla2x00_mailbox_command: I/O address = %lx.\n",
133 qla2x00_dump_regs(ha
);
136 /* Issue set host interrupt command to send cmd out. */
137 ha
->flags
.mbox_int
= 0;
138 clear_bit(MBX_INTERRUPT
, &ha
->mbx_cmd_flags
);
140 /* Unlock mbx registers and wait for interrupt */
142 DEBUG11(printk("qla2x00_mailbox_command: going to unlock irq & "
143 "waiting for interrupt. jiffies=%lx.\n", jiffies
);)
145 /* Wait for mbx cmd completion until timeout */
147 if (!abort_active
&& io_lock_on
) {
148 /* sleep on completion semaphore */
149 DEBUG11(printk("qla2x00_mailbox_command(%ld): "
150 "INTERRUPT MODE. Initializing timer.\n",
153 init_timer(&tmp_intr_timer
);
154 tmp_intr_timer
.data
= (unsigned long)&ha
->mbx_intr_sem
;
155 tmp_intr_timer
.expires
= jiffies
+ mcp
->tov
* HZ
;
156 tmp_intr_timer
.function
=
157 (void (*)(unsigned long))qla2x00_mbx_sem_timeout
;
159 DEBUG11(printk("qla2x00_mailbox_command(%ld): "
160 "Adding timer.\n", ha
->host_no
);)
161 add_timer(&tmp_intr_timer
);
163 DEBUG11(printk("qla2x00_mailbox_command: going to "
164 "unlock & sleep. time=0x%lx.\n", jiffies
);)
166 set_bit(MBX_INTR_WAIT
, &ha
->mbx_cmd_flags
);
168 WRT_REG_WORD(®
->hccr
, HCCR_SET_HOST_INT
);
169 spin_unlock_irqrestore(&ha
->hardware_lock
, flags
);
172 spin_unlock_irqrestore(&ha
->mbx_reg_lock
, mbx_flags
);
174 /* Wait for either the timer to expire
175 * or the mbox completion interrupt
177 down(&ha
->mbx_intr_sem
);
179 DEBUG11(printk("qla2x00_mailbox_command:"
181 "time=0x%lx\n", jiffies
);)
182 clear_bit(MBX_INTR_WAIT
, &ha
->mbx_cmd_flags
);
184 /* delete the timer */
185 del_timer(&tmp_intr_timer
);
188 DEBUG3_11(printk("qla2x00_mailbox_command(%ld): cmd=%x "
189 "POLLING MODE.\n", ha
->host_no
, command
);)
191 WRT_REG_WORD(®
->hccr
, HCCR_SET_HOST_INT
);
192 spin_unlock_irqrestore(&ha
->hardware_lock
, flags
);
194 spin_unlock_irqrestore(&ha
->mbx_reg_lock
, mbx_flags
);
196 wait_time
= jiffies
+ mcp
->tov
* HZ
; /* wait at most tov secs */
197 while (!ha
->flags
.mbox_int
) {
198 if (time_after(jiffies
, wait_time
))
201 /* Check for pending interrupts. */
204 udelay(10); /* v4.27 */
209 spin_lock_irqsave(&ha
->mbx_reg_lock
, mbx_flags
);
211 /* Check whether we timed out */
212 if (ha
->flags
.mbox_int
) {
215 DEBUG3_11(printk("qla2x00_mailbox_cmd: cmd %x completed.\n",
218 /* Got interrupt. Clear the flag. */
219 ha
->flags
.mbox_int
= 0;
220 clear_bit(MBX_INTERRUPT
, &ha
->mbx_cmd_flags
);
222 if (ha
->mailbox_out
[0] != MBS_COMMAND_COMPLETE
)
223 rval
= QLA_FUNCTION_FAILED
;
225 /* Load return mailbox registers. */
227 iptr
= (uint16_t *)&ha
->mailbox_out
[0];
229 for (cnt
= 0; cnt
< ha
->mbx_count
; cnt
++) {
239 #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \
240 defined(QL_DEBUG_LEVEL_11)
241 printk("qla2x00_mailbox_command(%ld): **** MB Command Timeout "
242 "for cmd %x ****\n", ha
->host_no
, command
);
243 printk("qla2x00_mailbox_command: icontrol=%x jiffies=%lx\n",
244 RD_REG_WORD(®
->ictrl
), jiffies
);
245 printk("qla2x00_mailbox_command: *** mailbox[0] = 0x%x ***\n",
247 qla2x00_dump_regs(ha
);
250 rval
= QLA_FUNCTION_TIMEOUT
;
254 spin_unlock_irqrestore(&ha
->mbx_reg_lock
, mbx_flags
);
256 ha
->flags
.mbox_busy
= 0;
262 DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional "
263 "resp interrupt.\n");)
265 /* polling mode for non isp_abort commands. */
269 if (rval
== QLA_FUNCTION_TIMEOUT
) {
270 if (!io_lock_on
|| (mcp
->flags
& IOCTL_CMD
)) {
271 /* not in dpc. schedule it for dpc to take over. */
272 DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
273 "schedule isp_abort_needed.\n",
275 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
276 "timeout schedule isp_abort_needed.\n",
278 qla_printk(KERN_WARNING
, ha
,
279 "Mailbox command timeout occured. Scheduling ISP "
281 set_bit(ISP_ABORT_NEEDED
, &ha
->dpc_flags
);
282 if (ha
->dpc_wait
&& !ha
->dpc_active
)
285 } else if (!abort_active
) {
287 /* call abort directly since we are in the DPC thread */
288 DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
289 "calling abort_isp\n", ha
->host_no
);)
290 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
291 "timeout calling abort_isp\n", ha
->host_no
);)
292 qla_printk(KERN_WARNING
, ha
,
293 "Mailbox command timeout occured. Issuing ISP "
296 set_bit(ABORT_ISP_ACTIVE
, &ha
->dpc_flags
);
297 clear_bit(ISP_ABORT_NEEDED
, &ha
->dpc_flags
);
298 if (qla2x00_abort_isp(ha
)) {
299 /* failed. retry later. */
300 set_bit(ISP_ABORT_NEEDED
, &ha
->dpc_flags
);
302 clear_bit(ABORT_ISP_ACTIVE
, &ha
->dpc_flags
);
304 DEBUG(printk("qla2x00_mailbox_command: finished "
306 DEBUG2_3_11(printk("qla2x00_mailbox_command: finished "
311 /* Allow next mbx cmd to come in. */
313 up(&ha
->mbx_cmd_sem
);
316 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. "
317 "mbx0=%x, mbx1=%x, mbx2=%x, cmd=%x ****\n",
318 ha
->host_no
, mcp
->mb
[0], mcp
->mb
[1], mcp
->mb
[2], command
);)
320 DEBUG11(printk("qla2x00_mailbox_command(%ld): done.\n",
324 DEBUG11(printk("qla2x00_mailbox_command(%ld): exiting.\n",
332 * Load adapter RAM using DMA.
335 * ha = adapter block pointer.
338 * qla2x00 local function return status code.
344 qla2x00_load_ram(scsi_qla_host_t
*ha
, dma_addr_t req_dma
, uint16_t risc_addr
,
345 uint16_t risc_code_size
)
349 mbx_cmd_t
*mcp
= &mc
;
355 DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n",
358 req_len
= risc_code_size
;
362 normalized
= qla2x00_normalize_dma_addr(&req_dma
, &req_len
, &nml_dma
,
365 /* Load first segment */
366 mcp
->mb
[0] = MBC_LOAD_RISC_RAM
;
367 mcp
->mb
[1] = risc_addr
;
368 mcp
->mb
[2] = MSW(req_dma
);
369 mcp
->mb
[3] = LSW(req_dma
);
370 mcp
->mb
[4] = (uint16_t)req_len
;
371 mcp
->mb
[6] = MSW(MSD(req_dma
));
372 mcp
->mb
[7] = LSW(MSD(req_dma
));
373 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
377 rval
= qla2x00_mailbox_command(ha
, mcp
);
379 /* Load second segment - if necessary */
380 if (normalized
&& (rval
== QLA_SUCCESS
)) {
381 mcp
->mb
[0] = MBC_LOAD_RISC_RAM
;
382 mcp
->mb
[1] = risc_addr
+ (uint16_t)req_len
;
383 mcp
->mb
[2] = MSW(nml_dma
);
384 mcp
->mb
[3] = LSW(nml_dma
);
385 mcp
->mb
[4] = (uint16_t)nml_len
;
386 mcp
->mb
[6] = MSW(MSD(nml_dma
));
387 mcp
->mb
[7] = LSW(MSD(nml_dma
));
388 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
392 rval
= qla2x00_mailbox_command(ha
, mcp
);
395 if (rval
== QLA_SUCCESS
) {
397 DEBUG11(printk("qla2x00_load_ram(%ld): done.\n", ha
->host_no
);)
400 DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x "
401 "mb[0]=%x.\n", ha
->host_no
, rval
, mcp
->mb
[0]);)
407 * qla2x00_load_ram_ext
408 * Load adapter extended RAM using DMA.
411 * ha = adapter block pointer.
414 * qla2x00 local function return status code.
420 qla2x00_load_ram_ext(scsi_qla_host_t
*ha
, dma_addr_t req_dma
,
421 uint32_t risc_addr
, uint16_t risc_code_size
)
425 mbx_cmd_t
*mcp
= &mc
;
431 DEBUG11(printk("%s(%ld): entered.\n", __func__
, ha
->host_no
));
433 req_len
= risc_code_size
;
437 normalized
= qla2x00_normalize_dma_addr(&req_dma
, &req_len
, &nml_dma
,
440 /* Load first segment */
441 mcp
->mb
[0] = MBC_LOAD_RISC_RAM_EXTENDED
;
442 mcp
->mb
[1] = LSW(risc_addr
);
443 mcp
->mb
[2] = MSW(req_dma
);
444 mcp
->mb
[3] = LSW(req_dma
);
445 mcp
->mb
[4] = (uint16_t)req_len
;
446 mcp
->mb
[6] = MSW(MSD(req_dma
));
447 mcp
->mb
[7] = LSW(MSD(req_dma
));
448 mcp
->mb
[8] = MSW(risc_addr
);
449 mcp
->out_mb
= MBX_8
|MBX_7
|MBX_6
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
453 rval
= qla2x00_mailbox_command(ha
, mcp
);
455 /* Load second segment - if necessary */
456 if (normalized
&& (rval
== QLA_SUCCESS
)) {
457 risc_addr
+= req_len
;
458 mcp
->mb
[0] = MBC_LOAD_RISC_RAM_EXTENDED
;
459 mcp
->mb
[1] = LSW(risc_addr
);
460 mcp
->mb
[2] = MSW(nml_dma
);
461 mcp
->mb
[3] = LSW(nml_dma
);
462 mcp
->mb
[4] = (uint16_t)nml_len
;
463 mcp
->mb
[6] = MSW(MSD(nml_dma
));
464 mcp
->mb
[7] = LSW(MSD(nml_dma
));
465 mcp
->mb
[8] = MSW(risc_addr
);
466 mcp
->out_mb
= MBX_8
|MBX_7
|MBX_6
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
470 rval
= qla2x00_mailbox_command(ha
, mcp
);
473 if (rval
!= QLA_SUCCESS
) {
475 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n",
476 __func__
, ha
->host_no
, rval
, mcp
->mb
[0]));
479 DEBUG11(printk("%s(%ld): done.\n", __func__
, ha
->host_no
));
487 * Start adapter firmware.
490 * ha = adapter block pointer.
491 * TARGET_QUEUE_LOCK must be released.
492 * ADAPTER_STATE_LOCK must be released.
495 * qla2x00 local function return status code.
501 qla2x00_execute_fw(scsi_qla_host_t
*ha
)
505 mbx_cmd_t
*mcp
= &mc
;
507 DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n", ha
->host_no
);)
509 mcp
->mb
[0] = MBC_EXECUTE_FIRMWARE
;
510 mcp
->mb
[1] = *ha
->brd_info
->fw_info
[0].fwstart
;
511 mcp
->out_mb
= MBX_1
|MBX_0
;
512 if (IS_QLA2322(ha
) || IS_QLA6322(ha
)) {
514 mcp
->out_mb
|= MBX_2
;
520 rval
= qla2x00_mailbox_command(ha
, mcp
);
522 DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n", ha
->host_no
);)
528 * qla2x00_get_fw_version
529 * Get firmware version.
532 * ha: adapter state pointer.
533 * major: pointer for major number.
534 * minor: pointer for minor number.
535 * subminor: pointer for subminor number.
538 * qla2x00 local function return status code.
544 qla2x00_get_fw_version(scsi_qla_host_t
*ha
, uint16_t *major
, uint16_t *minor
,
545 uint16_t *subminor
, uint16_t *attributes
, uint32_t *memory
)
549 mbx_cmd_t
*mcp
= &mc
;
551 DEBUG11(printk("%s(%ld): entered.\n", __func__
, ha
->host_no
));
553 mcp
->mb
[0] = MBC_GET_FIRMWARE_VERSION
;
555 mcp
->in_mb
= MBX_6
|MBX_5
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
558 rval
= qla2x00_mailbox_command(ha
, mcp
);
560 /* Return mailbox data. */
563 *subminor
= mcp
->mb
[3];
564 *attributes
= mcp
->mb
[6];
565 if (IS_QLA2100(ha
) || IS_QLA2200(ha
))
566 *memory
= 0x1FFFF; /* Defaults to 128KB. */
568 *memory
= (mcp
->mb
[5] << 16) | mcp
->mb
[4];
570 if (rval
!= QLA_SUCCESS
) {
572 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__
,
576 DEBUG11(printk("%s(%ld): done.\n", __func__
, ha
->host_no
));
581 * qla2x00_get_fw_options
582 * Set firmware options.
585 * ha = adapter block pointer.
586 * fwopt = pointer for firmware options.
589 * qla2x00 local function return status code.
595 qla2x00_get_fw_options(scsi_qla_host_t
*ha
, uint16_t *fwopts
)
599 mbx_cmd_t
*mcp
= &mc
;
601 DEBUG11(printk("%s(%ld): entered.\n", __func__
, ha
->host_no
));
603 mcp
->mb
[0] = MBC_GET_FIRMWARE_OPTION
;
605 mcp
->in_mb
= MBX_3
|MBX_2
|MBX_1
|MBX_0
;
608 rval
= qla2x00_mailbox_command(ha
, mcp
);
610 if (rval
!= QLA_SUCCESS
) {
612 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__
,
615 fwopts
[1] = mcp
->mb
[1];
616 fwopts
[2] = mcp
->mb
[2];
617 fwopts
[3] = mcp
->mb
[3];
619 DEBUG11(printk("%s(%ld): done.\n", __func__
, ha
->host_no
));
627 * qla2x00_set_fw_options
628 * Set firmware options.
631 * ha = adapter block pointer.
632 * fwopt = pointer for firmware options.
635 * qla2x00 local function return status code.
641 qla2x00_set_fw_options(scsi_qla_host_t
*ha
, uint16_t *fwopts
)
645 mbx_cmd_t
*mcp
= &mc
;
647 DEBUG11(printk("%s(%ld): entered.\n", __func__
, ha
->host_no
));
649 mcp
->mb
[0] = MBC_SET_FIRMWARE_OPTION
;
650 mcp
->mb
[1] = fwopts
[1];
651 mcp
->mb
[2] = fwopts
[2];
652 mcp
->mb
[3] = fwopts
[3];
653 mcp
->mb
[10] = fwopts
[10];
654 mcp
->mb
[11] = fwopts
[11];
655 mcp
->mb
[12] = 0; /* Undocumented, but used */
656 mcp
->out_mb
= MBX_12
|MBX_11
|MBX_10
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
660 rval
= qla2x00_mailbox_command(ha
, mcp
);
662 if (rval
!= QLA_SUCCESS
) {
664 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__
,
668 DEBUG11(printk("%s(%ld): done.\n", __func__
, ha
->host_no
));
675 * qla2x00_mbx_reg_test
676 * Mailbox register wrap test.
679 * ha = adapter block pointer.
680 * TARGET_QUEUE_LOCK must be released.
681 * ADAPTER_STATE_LOCK must be released.
684 * qla2x00 local function return status code.
690 qla2x00_mbx_reg_test(scsi_qla_host_t
*ha
)
694 mbx_cmd_t
*mcp
= &mc
;
696 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha
->host_no
);)
698 mcp
->mb
[0] = MBC_MAILBOX_REGISTER_TEST
;
706 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_5
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
707 mcp
->in_mb
= MBX_7
|MBX_6
|MBX_5
|MBX_4
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
710 rval
= qla2x00_mailbox_command(ha
, mcp
);
712 if (rval
== QLA_SUCCESS
) {
713 if (mcp
->mb
[1] != 0xAAAA || mcp
->mb
[2] != 0x5555 ||
714 mcp
->mb
[3] != 0xAA55 || mcp
->mb
[4] != 0x55AA)
715 rval
= QLA_FUNCTION_FAILED
;
716 if (mcp
->mb
[5] != 0xA5A5 || mcp
->mb
[6] != 0x5A5A ||
717 mcp
->mb
[7] != 0x2525)
718 rval
= QLA_FUNCTION_FAILED
;
721 if (rval
!= QLA_SUCCESS
) {
723 DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n",
727 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n",
735 * qla2x00_verify_checksum
736 * Verify firmware checksum.
739 * ha = adapter block pointer.
740 * TARGET_QUEUE_LOCK must be released.
741 * ADAPTER_STATE_LOCK must be released.
744 * qla2x00 local function return status code.
750 qla2x00_verify_checksum(scsi_qla_host_t
*ha
)
754 mbx_cmd_t
*mcp
= &mc
;
756 DEBUG11(printk("qla2x00_verify_checksum(%ld): entered.\n",
759 mcp
->mb
[0] = MBC_VERIFY_CHECKSUM
;
760 mcp
->mb
[1] = *ha
->brd_info
->fw_info
[0].fwstart
;
761 mcp
->out_mb
= MBX_1
|MBX_0
;
762 mcp
->in_mb
= MBX_2
|MBX_0
;
765 rval
= qla2x00_mailbox_command(ha
, mcp
);
767 if (rval
!= QLA_SUCCESS
) {
769 DEBUG2_3_11(printk("qla2x00_verify_checksum(%ld): failed=%x.\n",
773 DEBUG11(printk("qla2x00_verify_checksum(%ld): done.\n",
782 * Issue IOCB using mailbox command
785 * ha = adapter state pointer.
786 * buffer = buffer pointer.
787 * phys_addr = physical address of buffer.
788 * size = size of buffer.
789 * TARGET_QUEUE_LOCK must be released.
790 * ADAPTER_STATE_LOCK must be released.
793 * qla2x00 local function return status code.
799 qla2x00_issue_iocb(scsi_qla_host_t
*ha
, void* buffer
, dma_addr_t phys_addr
,
804 mbx_cmd_t
*mcp
= &mc
;
806 mcp
->mb
[0] = MBC_IOCB_COMMAND_A64
;
808 mcp
->mb
[2] = MSW(phys_addr
);
809 mcp
->mb
[3] = LSW(phys_addr
);
810 mcp
->mb
[6] = MSW(MSD(phys_addr
));
811 mcp
->mb
[7] = LSW(MSD(phys_addr
));
812 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
813 mcp
->in_mb
= MBX_2
|MBX_0
;
816 rval
= qla2x00_mailbox_command(ha
, mcp
);
818 if (rval
!= QLA_SUCCESS
) {
820 DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
822 DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
825 sts_entry_t
*sts_entry
= (sts_entry_t
*) buffer
;
827 /* Mask reserved bits. */
828 sts_entry
->entry_status
&=
829 IS_QLA24XX(ha
) || IS_QLA25XX(ha
) ? RF_MASK_24XX
:RF_MASK
;
836 * qla2x00_abort_command
837 * Abort command aborts a specified IOCB.
840 * ha = adapter block pointer.
841 * sp = SB structure pointer.
844 * qla2x00 local function return status code.
850 qla2x00_abort_command(scsi_qla_host_t
*ha
, srb_t
*sp
)
852 unsigned long flags
= 0;
857 mbx_cmd_t
*mcp
= &mc
;
859 DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha
->host_no
);)
862 if (atomic_read(&ha
->loop_state
) == LOOP_DOWN
||
863 atomic_read(&fcport
->state
) == FCS_DEVICE_LOST
) {
867 spin_lock_irqsave(&ha
->hardware_lock
, flags
);
868 for (handle
= 1; handle
< MAX_OUTSTANDING_COMMANDS
; handle
++) {
869 if (ha
->outstanding_cmds
[handle
] == sp
)
872 spin_unlock_irqrestore(&ha
->hardware_lock
, flags
);
874 if (handle
== MAX_OUTSTANDING_COMMANDS
) {
875 /* command not found */
876 return QLA_FUNCTION_FAILED
;
879 mcp
->mb
[0] = MBC_ABORT_COMMAND
;
880 if (HAS_EXTENDED_IDS(ha
))
881 mcp
->mb
[1] = fcport
->loop_id
;
883 mcp
->mb
[1] = fcport
->loop_id
<< 8;
884 mcp
->mb
[2] = (uint16_t)handle
;
885 mcp
->mb
[3] = (uint16_t)(handle
>> 16);
886 mcp
->mb
[6] = (uint16_t)sp
->cmd
->device
->lun
;
887 mcp
->out_mb
= MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
891 rval
= qla2x00_mailbox_command(ha
, mcp
);
893 if (rval
!= QLA_SUCCESS
) {
894 DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n",
897 sp
->flags
|= SRB_ABORT_PENDING
;
898 DEBUG11(printk("qla2x00_abort_command(%ld): done.\n",
907 * qla2x00_abort_target
908 * Issue abort target mailbox command.
911 * ha = adapter block pointer.
914 * qla2x00 local function return status code.
920 qla2x00_abort_target(fc_port_t
*fcport
)
924 mbx_cmd_t
*mcp
= &mc
;
926 DEBUG11(printk("qla2x00_abort_target(%ld): entered.\n",
927 fcport
->ha
->host_no
);)
929 if (fcport
== NULL
) {
930 /* no target to abort */
934 mcp
->mb
[0] = MBC_ABORT_TARGET
;
935 mcp
->out_mb
= MBX_2
|MBX_1
|MBX_0
;
936 if (HAS_EXTENDED_IDS(fcport
->ha
)) {
937 mcp
->mb
[1] = fcport
->loop_id
;
939 mcp
->out_mb
|= MBX_10
;
941 mcp
->mb
[1] = fcport
->loop_id
<< 8;
943 mcp
->mb
[2] = fcport
->ha
->loop_reset_delay
;
948 rval
= qla2x00_mailbox_command(fcport
->ha
, mcp
);
950 /* Issue marker command. */
951 fcport
->ha
->marker_needed
= 1;
953 if (rval
!= QLA_SUCCESS
) {
954 DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n",
955 fcport
->ha
->host_no
, rval
);)
958 DEBUG11(printk("qla2x00_abort_target(%ld): done.\n",
959 fcport
->ha
->host_no
);)
967 * qla2x00_target_reset
968 * Issue target reset mailbox command.
971 * ha = adapter block pointer.
972 * TARGET_QUEUE_LOCK must be released.
973 * ADAPTER_STATE_LOCK must be released.
976 * qla2x00 local function return status code.
982 qla2x00_target_reset(scsi_qla_host_t
*ha
, struct fc_port
*fcport
)
986 mbx_cmd_t
*mcp
= &mc
;
988 DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha
->host_no
);)
990 if (atomic_read(&fcport
->state
) != FCS_ONLINE
)
993 mcp
->mb
[0] = MBC_TARGET_RESET
;
994 if (HAS_EXTENDED_IDS(ha
))
995 mcp
->mb
[1] = fcport
->loop_id
;
997 mcp
->mb
[1] = fcport
->loop_id
<< 8;
998 mcp
->mb
[2] = ha
->loop_reset_delay
;
999 mcp
->out_mb
= MBX_2
|MBX_1
|MBX_0
;
1003 rval
= qla2x00_mailbox_command(ha
, mcp
);
1005 if (rval
!= QLA_SUCCESS
) {
1007 DEBUG2_3_11(printk("qla2x00_target_reset(%ld): failed=%x.\n",
1008 ha
->host_no
, rval
);)
1011 DEBUG11(printk("qla2x00_target_reset(%ld): done.\n",
1019 * qla2x00_get_adapter_id
1020 * Get adapter ID and topology.
1023 * ha = adapter block pointer.
1024 * id = pointer for loop ID.
1025 * al_pa = pointer for AL_PA.
1026 * area = pointer for area.
1027 * domain = pointer for domain.
1028 * top = pointer for topology.
1029 * TARGET_QUEUE_LOCK must be released.
1030 * ADAPTER_STATE_LOCK must be released.
1033 * qla2x00 local function return status code.
1039 qla2x00_get_adapter_id(scsi_qla_host_t
*ha
, uint16_t *id
, uint8_t *al_pa
,
1040 uint8_t *area
, uint8_t *domain
, uint16_t *top
)
1044 mbx_cmd_t
*mcp
= &mc
;
1046 DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n",
1049 mcp
->mb
[0] = MBC_GET_ADAPTER_LOOP_ID
;
1050 mcp
->out_mb
= MBX_0
;
1051 mcp
->in_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1054 rval
= qla2x00_mailbox_command(ha
, mcp
);
1058 *al_pa
= LSB(mcp
->mb
[2]);
1059 *area
= MSB(mcp
->mb
[2]);
1060 *domain
= LSB(mcp
->mb
[3]);
1063 if (rval
!= QLA_SUCCESS
) {
1065 DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n",
1066 ha
->host_no
, rval
);)
1069 DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n",
1077 * qla2x00_get_retry_cnt
1078 * Get current firmware login retry count and delay.
1081 * ha = adapter block pointer.
1082 * retry_cnt = pointer to login retry count.
1083 * tov = pointer to login timeout value.
1086 * qla2x00 local function return status code.
1092 qla2x00_get_retry_cnt(scsi_qla_host_t
*ha
, uint8_t *retry_cnt
, uint8_t *tov
,
1098 mbx_cmd_t
*mcp
= &mc
;
1100 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n",
1103 mcp
->mb
[0] = MBC_GET_RETRY_COUNT
;
1104 mcp
->out_mb
= MBX_0
;
1105 mcp
->in_mb
= MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1108 rval
= qla2x00_mailbox_command(ha
, mcp
);
1110 if (rval
!= QLA_SUCCESS
) {
1112 DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n",
1113 ha
->host_no
, mcp
->mb
[0]);)
1115 /* Convert returned data and check our values. */
1116 *r_a_tov
= mcp
->mb
[3] / 2;
1117 ratov
= (mcp
->mb
[3]/2) / 10; /* mb[3] value is in 100ms */
1118 if (mcp
->mb
[1] * ratov
> (*retry_cnt
) * (*tov
)) {
1119 /* Update to the larger values */
1120 *retry_cnt
= (uint8_t)mcp
->mb
[1];
1124 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d "
1125 "ratov=%d.\n", ha
->host_no
, mcp
->mb
[3], ratov
);)
1132 * qla2x00_init_firmware
1133 * Initialize adapter firmware.
1136 * ha = adapter block pointer.
1137 * dptr = Initialization control block pointer.
1138 * size = size of initialization control block.
1139 * TARGET_QUEUE_LOCK must be released.
1140 * ADAPTER_STATE_LOCK must be released.
1143 * qla2x00 local function return status code.
1149 qla2x00_init_firmware(scsi_qla_host_t
*ha
, uint16_t size
)
1153 mbx_cmd_t
*mcp
= &mc
;
1155 DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n",
1158 mcp
->mb
[0] = MBC_INITIALIZE_FIRMWARE
;
1159 mcp
->mb
[2] = MSW(ha
->init_cb_dma
);
1160 mcp
->mb
[3] = LSW(ha
->init_cb_dma
);
1163 mcp
->mb
[6] = MSW(MSD(ha
->init_cb_dma
));
1164 mcp
->mb
[7] = LSW(MSD(ha
->init_cb_dma
));
1165 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_0
;
1166 mcp
->in_mb
= MBX_5
|MBX_4
|MBX_0
;
1167 mcp
->buf_size
= size
;
1168 mcp
->flags
= MBX_DMA_OUT
;
1170 rval
= qla2x00_mailbox_command(ha
, mcp
);
1172 if (rval
!= QLA_SUCCESS
) {
1174 DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x "
1176 ha
->host_no
, rval
, mcp
->mb
[0]);)
1179 DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n",
1187 * qla2x00_get_port_database
1188 * Issue normal/enhanced get port database mailbox command
1189 * and copy device name as necessary.
1192 * ha = adapter state pointer.
1193 * dev = structure pointer.
1194 * opt = enhanced cmd option byte.
1197 * qla2x00 local function return status code.
1203 qla2x00_get_port_database(scsi_qla_host_t
*ha
, fc_port_t
*fcport
, uint8_t opt
)
1207 mbx_cmd_t
*mcp
= &mc
;
1208 port_database_t
*pd
;
1211 DEBUG11(printk("qla2x00_get_port_database(%ld): entered.\n",
1214 pd
= dma_pool_alloc(ha
->s_dma_pool
, GFP_ATOMIC
, &pd_dma
);
1216 DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): **** "
1217 "Mem Alloc Failed ****", ha
->host_no
);)
1218 return QLA_MEMORY_ALLOC_FAILED
;
1220 memset(pd
, 0, PORT_DATABASE_SIZE
);
1223 mcp
->mb
[0] = MBC_ENHANCED_GET_PORT_DATABASE
;
1225 mcp
->mb
[0] = MBC_GET_PORT_DATABASE
;
1226 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1227 if (HAS_EXTENDED_IDS(ha
)) {
1228 mcp
->mb
[1] = fcport
->loop_id
;
1230 mcp
->out_mb
|= MBX_10
;
1232 mcp
->mb
[1] = fcport
->loop_id
<< 8 | opt
;
1234 mcp
->mb
[2] = MSW(pd_dma
);
1235 mcp
->mb
[3] = LSW(pd_dma
);
1236 mcp
->mb
[6] = MSW(MSD(pd_dma
));
1237 mcp
->mb
[7] = LSW(MSD(pd_dma
));
1240 mcp
->buf_size
= PORT_DATABASE_SIZE
;
1241 mcp
->flags
= MBX_DMA_IN
;
1242 mcp
->tov
= (ha
->login_timeout
* 2) + (ha
->login_timeout
/ 2);
1243 rval
= qla2x00_mailbox_command(ha
, mcp
);
1244 if (rval
!= QLA_SUCCESS
)
1247 /* Check for logged in state. */
1248 if (pd
->master_state
!= PD_STATE_PORT_LOGGED_IN
&&
1249 pd
->slave_state
!= PD_STATE_PORT_LOGGED_IN
) {
1250 rval
= QLA_FUNCTION_FAILED
;
1254 /* Names are little-endian. */
1255 memcpy(fcport
->node_name
, pd
->node_name
, WWN_SIZE
);
1256 memcpy(fcport
->port_name
, pd
->port_name
, WWN_SIZE
);
1258 /* Get port_id of device. */
1259 fcport
->d_id
.b
.al_pa
= pd
->port_id
[2];
1260 fcport
->d_id
.b
.area
= pd
->port_id
[3];
1261 fcport
->d_id
.b
.domain
= pd
->port_id
[0];
1262 fcport
->d_id
.b
.rsvd_1
= 0;
1264 /* Check for device require authentication. */
1265 pd
->common_features
& BIT_5
? (fcport
->flags
|= FCF_AUTH_REQ
) :
1266 (fcport
->flags
&= ~FCF_AUTH_REQ
);
1268 /* If not target must be initiator or unknown type. */
1269 if ((pd
->prli_svc_param_word_3
[0] & BIT_4
) == 0)
1270 fcport
->port_type
= FCT_INITIATOR
;
1272 fcport
->port_type
= FCT_TARGET
;
1275 dma_pool_free(ha
->s_dma_pool
, pd
, pd_dma
);
1277 if (rval
!= QLA_SUCCESS
) {
1279 DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): "
1280 "failed=%x.\n", ha
->host_no
, rval
);)
1283 DEBUG11(printk("qla2x00_get_port_database(%ld): done.\n",
1291 * qla2x00_get_firmware_state
1292 * Get adapter firmware state.
1295 * ha = adapter block pointer.
1296 * dptr = pointer for firmware state.
1297 * TARGET_QUEUE_LOCK must be released.
1298 * ADAPTER_STATE_LOCK must be released.
1301 * qla2x00 local function return status code.
1307 qla2x00_get_firmware_state(scsi_qla_host_t
*ha
, uint16_t *dptr
)
1311 mbx_cmd_t
*mcp
= &mc
;
1313 DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n",
1316 mcp
->mb
[0] = MBC_GET_FIRMWARE_STATE
;
1317 mcp
->out_mb
= MBX_0
;
1318 mcp
->in_mb
= MBX_2
|MBX_1
|MBX_0
;
1321 rval
= qla2x00_mailbox_command(ha
, mcp
);
1323 /* Return firmware state. */
1326 if (rval
!= QLA_SUCCESS
) {
1328 DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): "
1329 "failed=%x.\n", ha
->host_no
, rval
);)
1332 DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n",
1340 * qla2x00_get_port_name
1341 * Issue get port name mailbox command.
1342 * Returned name is in big endian format.
1345 * ha = adapter block pointer.
1346 * loop_id = loop ID of device.
1347 * name = pointer for name.
1348 * TARGET_QUEUE_LOCK must be released.
1349 * ADAPTER_STATE_LOCK must be released.
1352 * qla2x00 local function return status code.
1358 qla2x00_get_port_name(scsi_qla_host_t
*ha
, uint16_t loop_id
, uint8_t *name
,
1363 mbx_cmd_t
*mcp
= &mc
;
1365 DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n",
1368 mcp
->mb
[0] = MBC_GET_PORT_NAME
;
1369 mcp
->out_mb
= MBX_1
|MBX_0
;
1370 if (HAS_EXTENDED_IDS(ha
)) {
1371 mcp
->mb
[1] = loop_id
;
1373 mcp
->out_mb
|= MBX_10
;
1375 mcp
->mb
[1] = loop_id
<< 8 | opt
;
1378 mcp
->in_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1381 rval
= qla2x00_mailbox_command(ha
, mcp
);
1383 if (rval
!= QLA_SUCCESS
) {
1385 DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n",
1386 ha
->host_no
, rval
);)
1389 /* This function returns name in big endian. */
1390 name
[0] = LSB(mcp
->mb
[2]);
1391 name
[1] = MSB(mcp
->mb
[2]);
1392 name
[2] = LSB(mcp
->mb
[3]);
1393 name
[3] = MSB(mcp
->mb
[3]);
1394 name
[4] = LSB(mcp
->mb
[6]);
1395 name
[5] = MSB(mcp
->mb
[6]);
1396 name
[6] = LSB(mcp
->mb
[7]);
1397 name
[7] = MSB(mcp
->mb
[7]);
1400 DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n",
1409 * Issue LIP reset mailbox command.
1412 * ha = adapter block pointer.
1413 * TARGET_QUEUE_LOCK must be released.
1414 * ADAPTER_STATE_LOCK must be released.
1417 * qla2x00 local function return status code.
1423 qla2x00_lip_reset(scsi_qla_host_t
*ha
)
1427 mbx_cmd_t
*mcp
= &mc
;
1429 DEBUG11(printk("qla2x00_lip_reset(%ld): entered.\n",
1432 mcp
->mb
[0] = MBC_LIP_RESET
;
1433 mcp
->out_mb
= MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1434 if (HAS_EXTENDED_IDS(ha
)) {
1435 mcp
->mb
[1] = 0x00ff;
1437 mcp
->out_mb
|= MBX_10
;
1439 mcp
->mb
[1] = 0xff00;
1441 mcp
->mb
[2] = ha
->loop_reset_delay
;
1447 rval
= qla2x00_mailbox_command(ha
, mcp
);
1449 if (rval
!= QLA_SUCCESS
) {
1451 DEBUG2_3_11(printk("qla2x00_lip_reset(%ld): failed=%x.\n",
1452 ha
->host_no
, rval
);)
1455 DEBUG11(printk("qla2x00_lip_reset(%ld): done.\n", ha
->host_no
);)
1466 * ha = adapter block pointer.
1467 * sns = pointer for command.
1468 * cmd_size = command size.
1469 * buf_size = response/command size.
1470 * TARGET_QUEUE_LOCK must be released.
1471 * ADAPTER_STATE_LOCK must be released.
1474 * qla2x00 local function return status code.
1480 qla2x00_send_sns(scsi_qla_host_t
*ha
, dma_addr_t sns_phys_address
,
1481 uint16_t cmd_size
, size_t buf_size
)
1485 mbx_cmd_t
*mcp
= &mc
;
1487 DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n",
1490 DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total "
1491 "tov=%d.\n", ha
->retry_count
, ha
->login_timeout
, mcp
->tov
);)
1493 mcp
->mb
[0] = MBC_SEND_SNS_COMMAND
;
1494 mcp
->mb
[1] = cmd_size
;
1495 mcp
->mb
[2] = MSW(sns_phys_address
);
1496 mcp
->mb
[3] = LSW(sns_phys_address
);
1497 mcp
->mb
[6] = MSW(MSD(sns_phys_address
));
1498 mcp
->mb
[7] = LSW(MSD(sns_phys_address
));
1499 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1500 mcp
->in_mb
= MBX_0
|MBX_1
;
1501 mcp
->buf_size
= buf_size
;
1502 mcp
->flags
= MBX_DMA_OUT
|MBX_DMA_IN
;
1503 mcp
->tov
= (ha
->login_timeout
* 2) + (ha
->login_timeout
/ 2);
1504 rval
= qla2x00_mailbox_command(ha
, mcp
);
1506 if (rval
!= QLA_SUCCESS
) {
1508 DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
1509 "mb[1]=%x.\n", ha
->host_no
, rval
, mcp
->mb
[0], mcp
->mb
[1]);)
1510 DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
1511 "mb[1]=%x.\n", ha
->host_no
, rval
, mcp
->mb
[0], mcp
->mb
[1]);)
1514 DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha
->host_no
);)
1521 * qla2x00_login_fabric
1522 * Issue login fabric port mailbox command.
1525 * ha = adapter block pointer.
1526 * loop_id = device loop ID.
1527 * domain = device domain.
1528 * area = device area.
1529 * al_pa = device AL_PA.
1530 * status = pointer for return status.
1531 * opt = command options.
1532 * TARGET_QUEUE_LOCK must be released.
1533 * ADAPTER_STATE_LOCK must be released.
1536 * qla2x00 local function return status code.
1542 qla2x00_login_fabric(scsi_qla_host_t
*ha
, uint16_t loop_id
, uint8_t domain
,
1543 uint8_t area
, uint8_t al_pa
, uint16_t *mb
, uint8_t opt
)
1547 mbx_cmd_t
*mcp
= &mc
;
1549 DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha
->host_no
);)
1551 mcp
->mb
[0] = MBC_LOGIN_FABRIC_PORT
;
1552 mcp
->out_mb
= MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1553 if (HAS_EXTENDED_IDS(ha
)) {
1554 mcp
->mb
[1] = loop_id
;
1556 mcp
->out_mb
|= MBX_10
;
1558 mcp
->mb
[1] = (loop_id
<< 8) | opt
;
1560 mcp
->mb
[2] = domain
;
1561 mcp
->mb
[3] = area
<< 8 | al_pa
;
1563 mcp
->in_mb
= MBX_7
|MBX_6
|MBX_2
|MBX_1
|MBX_0
;
1564 mcp
->tov
= (ha
->login_timeout
* 2) + (ha
->login_timeout
/ 2);
1566 rval
= qla2x00_mailbox_command(ha
, mcp
);
1568 /* Return mailbox statuses. */
1577 if (rval
!= QLA_SUCCESS
) {
1578 /* RLU tmp code: need to change main mailbox_command function to
1579 * return ok even when the mailbox completion value is not
1580 * SUCCESS. The caller needs to be responsible to interpret
1581 * the return values of this mailbox command if we're not
1582 * to change too much of the existing code.
1584 if (mcp
->mb
[0] == 0x4001 || mcp
->mb
[0] == 0x4002 ||
1585 mcp
->mb
[0] == 0x4003 || mcp
->mb
[0] == 0x4005 ||
1586 mcp
->mb
[0] == 0x4006)
1590 DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x "
1591 "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha
->host_no
, rval
,
1592 mcp
->mb
[0], mcp
->mb
[1], mcp
->mb
[2]);)
1595 DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n",
1603 * qla2x00_login_local_device
1604 * Issue login loop port mailbox command.
1607 * ha = adapter block pointer.
1608 * loop_id = device loop ID.
1609 * opt = command options.
1612 * Return status code.
1619 qla2x00_login_local_device(scsi_qla_host_t
*ha
, uint16_t loop_id
,
1620 uint16_t *mb_ret
, uint8_t opt
)
1624 mbx_cmd_t
*mcp
= &mc
;
1626 DEBUG3(printk("%s(%ld): entered.\n", __func__
, ha
->host_no
);)
1628 mcp
->mb
[0] = MBC_LOGIN_LOOP_PORT
;
1629 if (HAS_EXTENDED_IDS(ha
))
1630 mcp
->mb
[1] = loop_id
;
1632 mcp
->mb
[1] = loop_id
<< 8;
1634 mcp
->out_mb
= MBX_2
|MBX_1
|MBX_0
;
1635 mcp
->in_mb
= MBX_7
|MBX_6
|MBX_1
|MBX_0
;
1636 mcp
->tov
= (ha
->login_timeout
* 2) + (ha
->login_timeout
/ 2);
1638 rval
= qla2x00_mailbox_command(ha
, mcp
);
1640 /* Return mailbox statuses. */
1641 if (mb_ret
!= NULL
) {
1642 mb_ret
[0] = mcp
->mb
[0];
1643 mb_ret
[1] = mcp
->mb
[1];
1644 mb_ret
[6] = mcp
->mb
[6];
1645 mb_ret
[7] = mcp
->mb
[7];
1648 if (rval
!= QLA_SUCCESS
) {
1649 /* AV tmp code: need to change main mailbox_command function to
1650 * return ok even when the mailbox completion value is not
1651 * SUCCESS. The caller needs to be responsible to interpret
1652 * the return values of this mailbox command if we're not
1653 * to change too much of the existing code.
1655 if (mcp
->mb
[0] == 0x4005 || mcp
->mb
[0] == 0x4006)
1658 DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
1659 "mb[6]=%x mb[7]=%x.\n", __func__
, ha
->host_no
, rval
,
1660 mcp
->mb
[0], mcp
->mb
[1], mcp
->mb
[6], mcp
->mb
[7]);)
1661 DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
1662 "mb[6]=%x mb[7]=%x.\n", __func__
, ha
->host_no
, rval
,
1663 mcp
->mb
[0], mcp
->mb
[1], mcp
->mb
[6], mcp
->mb
[7]);)
1666 DEBUG3(printk("%s(%ld): done.\n", __func__
, ha
->host_no
);)
1673 * qla2x00_fabric_logout
1674 * Issue logout fabric port mailbox command.
1677 * ha = adapter block pointer.
1678 * loop_id = device loop ID.
1679 * TARGET_QUEUE_LOCK must be released.
1680 * ADAPTER_STATE_LOCK must be released.
1683 * qla2x00 local function return status code.
1689 qla2x00_fabric_logout(scsi_qla_host_t
*ha
, uint16_t loop_id
)
1693 mbx_cmd_t
*mcp
= &mc
;
1695 DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n",
1698 mcp
->mb
[0] = MBC_LOGOUT_FABRIC_PORT
;
1699 mcp
->out_mb
= MBX_1
|MBX_0
;
1700 if (HAS_EXTENDED_IDS(ha
)) {
1701 mcp
->mb
[1] = loop_id
;
1703 mcp
->out_mb
|= MBX_10
;
1705 mcp
->mb
[1] = loop_id
<< 8;
1708 mcp
->in_mb
= MBX_1
|MBX_0
;
1711 rval
= qla2x00_mailbox_command(ha
, mcp
);
1713 if (rval
!= QLA_SUCCESS
) {
1715 DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x "
1716 "mbx1=%x.\n", ha
->host_no
, rval
, mcp
->mb
[1]);)
1719 DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n",
1727 * qla2x00_full_login_lip
1728 * Issue full login LIP mailbox command.
1731 * ha = adapter block pointer.
1732 * TARGET_QUEUE_LOCK must be released.
1733 * ADAPTER_STATE_LOCK must be released.
1736 * qla2x00 local function return status code.
1742 qla2x00_full_login_lip(scsi_qla_host_t
*ha
)
1746 mbx_cmd_t
*mcp
= &mc
;
1748 DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n",
1751 mcp
->mb
[0] = MBC_LIP_FULL_LOGIN
;
1755 mcp
->out_mb
= MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1759 rval
= qla2x00_mailbox_command(ha
, mcp
);
1761 if (rval
!= QLA_SUCCESS
) {
1763 DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n",
1764 ha
->instance
, rval
);)
1767 DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n",
1775 * qla2x00_get_id_list
1778 * ha = adapter block pointer.
1781 * qla2x00 local function return status code.
1787 qla2x00_get_id_list(scsi_qla_host_t
*ha
, void *id_list
, dma_addr_t id_list_dma
,
1792 mbx_cmd_t
*mcp
= &mc
;
1794 DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n",
1797 if (id_list
== NULL
)
1798 return QLA_FUNCTION_FAILED
;
1800 mcp
->mb
[0] = MBC_GET_ID_LIST
;
1801 mcp
->mb
[1] = MSW(id_list_dma
);
1802 mcp
->mb
[2] = LSW(id_list_dma
);
1803 mcp
->mb
[3] = MSW(MSD(id_list_dma
));
1804 mcp
->mb
[6] = LSW(MSD(id_list_dma
));
1805 mcp
->out_mb
= MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1806 mcp
->in_mb
= MBX_1
|MBX_0
;
1809 rval
= qla2x00_mailbox_command(ha
, mcp
);
1811 if (rval
!= QLA_SUCCESS
) {
1813 DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n",
1814 ha
->host_no
, rval
);)
1816 *entries
= mcp
->mb
[1];
1817 DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n",
1825 * qla2x00_get_resource_cnts
1826 * Get current firmware resource counts.
1829 * ha = adapter block pointer.
1832 * qla2x00 local function return status code.
1838 qla2x00_get_resource_cnts(scsi_qla_host_t
*ha
, uint16_t *cur_xchg_cnt
,
1839 uint16_t *orig_xchg_cnt
, uint16_t *cur_iocb_cnt
, uint16_t *orig_iocb_cnt
)
1843 mbx_cmd_t
*mcp
= &mc
;
1845 DEBUG11(printk("%s(%ld): entered.\n", __func__
, ha
->host_no
));
1847 mcp
->mb
[0] = MBC_GET_RESOURCE_COUNTS
;
1848 mcp
->out_mb
= MBX_0
;
1849 mcp
->in_mb
= MBX_10
|MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_1
|MBX_0
;
1852 rval
= qla2x00_mailbox_command(ha
, mcp
);
1854 if (rval
!= QLA_SUCCESS
) {
1856 DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__
,
1857 ha
->host_no
, mcp
->mb
[0]);)
1859 DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x "
1860 "mb7=%x mb10=%x.\n", __func__
, ha
->host_no
,
1861 mcp
->mb
[1], mcp
->mb
[2], mcp
->mb
[3], mcp
->mb
[6], mcp
->mb
[7],
1865 *cur_xchg_cnt
= mcp
->mb
[3];
1867 *orig_xchg_cnt
= mcp
->mb
[6];
1869 *cur_iocb_cnt
= mcp
->mb
[7];
1871 *orig_iocb_cnt
= mcp
->mb
[10];
1877 #if defined(QL_DEBUG_LEVEL_3)
1879 * qla2x00_get_fcal_position_map
1880 * Get FCAL (LILP) position map using mailbox command
1883 * ha = adapter state pointer.
1884 * pos_map = buffer pointer (can be NULL).
1887 * qla2x00 local function return status code.
1893 qla2x00_get_fcal_position_map(scsi_qla_host_t
*ha
, char *pos_map
)
1897 mbx_cmd_t
*mcp
= &mc
;
1899 dma_addr_t pmap_dma
;
1901 pmap
= dma_pool_alloc(ha
->s_dma_pool
, GFP_ATOMIC
, &pmap_dma
);
1903 DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****",
1904 __func__
, ha
->host_no
));
1905 return QLA_MEMORY_ALLOC_FAILED
;
1907 memset(pmap
, 0, FCAL_MAP_SIZE
);
1909 mcp
->mb
[0] = MBC_GET_FC_AL_POSITION_MAP
;
1910 mcp
->mb
[2] = MSW(pmap_dma
);
1911 mcp
->mb
[3] = LSW(pmap_dma
);
1912 mcp
->mb
[6] = MSW(MSD(pmap_dma
));
1913 mcp
->mb
[7] = LSW(MSD(pmap_dma
));
1914 mcp
->out_mb
= MBX_7
|MBX_6
|MBX_3
|MBX_2
|MBX_0
;
1915 mcp
->in_mb
= MBX_1
|MBX_0
;
1916 mcp
->buf_size
= FCAL_MAP_SIZE
;
1917 mcp
->flags
= MBX_DMA_IN
;
1918 mcp
->tov
= (ha
->login_timeout
* 2) + (ha
->login_timeout
/ 2);
1919 rval
= qla2x00_mailbox_command(ha
, mcp
);
1921 if (rval
== QLA_SUCCESS
) {
1922 DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "
1923 "size (%x)\n", __func__
, ha
->host_no
, mcp
->mb
[0],
1924 mcp
->mb
[1], (unsigned)pmap
[0]));
1925 DEBUG11(qla2x00_dump_buffer(pmap
, pmap
[0] + 1));
1928 memcpy(pos_map
, pmap
, FCAL_MAP_SIZE
);
1930 dma_pool_free(ha
->s_dma_pool
, pmap
, pmap_dma
);
1932 if (rval
!= QLA_SUCCESS
) {
1933 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__
,
1934 ha
->host_no
, rval
));
1936 DEBUG11(printk("%s(%ld): done.\n", __func__
, ha
->host_no
));