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 device_reg_t __iomem *reg = ha->iobase;
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 qla2x00_stats.mboxerr++;
224 rval = QLA_FUNCTION_FAILED;
227 /* Load return mailbox registers. */
229 iptr = (uint16_t *)&ha->mailbox_out[0];
231 for (cnt = 0; cnt < ha->mbx_count; cnt++) {
241 #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \
242 defined(QL_DEBUG_LEVEL_11)
243 printk("qla2x00_mailbox_command(%ld): **** MB Command Timeout "
244 "for cmd %x ****\n", ha->host_no, command);
245 printk("qla2x00_mailbox_command: icontrol=%x jiffies=%lx\n",
246 RD_REG_WORD(®->ictrl), jiffies);
247 printk("qla2x00_mailbox_command: *** mailbox[0] = 0x%x ***\n",
249 qla2x00_dump_regs(ha);
252 qla2x00_stats.mboxtout++;
253 ha->total_mbx_timeout++;
254 rval = QLA_FUNCTION_TIMEOUT;
258 spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
260 ha->flags.mbox_busy = 0;
266 DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional "
267 "resp interrupt.\n");)
269 /* polling mode for non isp_abort commands. */
273 if (rval == QLA_FUNCTION_TIMEOUT) {
274 if (!io_lock_on || (mcp->flags & IOCTL_CMD)) {
275 /* not in dpc. schedule it for dpc to take over. */
276 DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
277 "schedule isp_abort_needed.\n",
279 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
280 "timeout schedule isp_abort_needed.\n",
282 qla_printk(KERN_WARNING, ha,
283 "Mailbox command timeout occured. Scheduling ISP "
285 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
286 if (ha->dpc_wait && !ha->dpc_active)
289 } else if (!abort_active) {
291 /* call abort directly since we are in the DPC thread */
292 DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
293 "calling abort_isp\n", ha->host_no);)
294 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
295 "timeout calling abort_isp\n", ha->host_no);)
296 qla_printk(KERN_WARNING, ha,
297 "Mailbox command timeout occured. Issuing ISP "
300 set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
301 clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
302 if (qla2x00_abort_isp(ha)) {
303 /* failed. retry later. */
304 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
306 clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
308 DEBUG(printk("qla2x00_mailbox_command: finished "
310 DEBUG2_3_11(printk("qla2x00_mailbox_command: finished "
315 /* Allow next mbx cmd to come in. */
317 up(&ha->mbx_cmd_sem);
320 DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. "
321 "mbx0=%x, mbx1=%x, mbx2=%x, cmd=%x ****\n",
322 ha->host_no, mcp->mb[0], mcp->mb[1], mcp->mb[2], command);)
324 DEBUG11(printk("qla2x00_mailbox_command(%ld): done.\n",
328 DEBUG11(printk("qla2x00_mailbox_command(%ld): exiting.\n",
336 * Load adapter RAM using DMA.
339 * ha = adapter block pointer.
342 * qla2x00 local function return status code.
348 qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint16_t risc_addr,
349 uint16_t risc_code_size)
353 mbx_cmd_t *mcp = &mc;
359 DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n",
362 req_len = risc_code_size;
366 normalized = qla2x00_normalize_dma_addr(&req_dma, &req_len, &nml_dma,
369 /* Load first segment */
370 mcp->mb[0] = MBC_LOAD_RISC_RAM;
371 mcp->mb[1] = risc_addr;
372 mcp->mb[2] = MSW(req_dma);
373 mcp->mb[3] = LSW(req_dma);
374 mcp->mb[4] = (uint16_t)req_len;
375 mcp->mb[6] = MSW(MSD(req_dma));
376 mcp->mb[7] = LSW(MSD(req_dma));
377 mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
381 rval = qla2x00_mailbox_command(ha, mcp);
383 /* Load second segment - if necessary */
384 if (normalized && (rval == QLA_SUCCESS)) {
385 mcp->mb[0] = MBC_LOAD_RISC_RAM;
386 mcp->mb[1] = risc_addr + (uint16_t)req_len;
387 mcp->mb[2] = MSW(nml_dma);
388 mcp->mb[3] = LSW(nml_dma);
389 mcp->mb[4] = (uint16_t)nml_len;
390 mcp->mb[6] = MSW(MSD(nml_dma));
391 mcp->mb[7] = LSW(MSD(nml_dma));
392 mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
396 rval = qla2x00_mailbox_command(ha, mcp);
399 if (rval == QLA_SUCCESS) {
401 DEBUG11(printk("qla2x00_load_ram(%ld): done.\n", ha->host_no);)
404 DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x "
405 "mb[0]=%x.\n", ha->host_no, rval, mcp->mb[0]);)
411 * qla2x00_load_ram_ext
412 * Load adapter extended RAM using DMA.
415 * ha = adapter block pointer.
418 * qla2x00 local function return status code.
424 qla2x00_load_ram_ext(scsi_qla_host_t *ha, dma_addr_t req_dma,
425 uint32_t risc_addr, uint16_t risc_code_size)
429 mbx_cmd_t *mcp = &mc;
435 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
437 req_len = risc_code_size;
441 normalized = qla2x00_normalize_dma_addr(&req_dma, &req_len, &nml_dma,
444 /* Load first segment */
445 mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
446 mcp->mb[1] = LSW(risc_addr);
447 mcp->mb[2] = MSW(req_dma);
448 mcp->mb[3] = LSW(req_dma);
449 mcp->mb[4] = (uint16_t)req_len;
450 mcp->mb[6] = MSW(MSD(req_dma));
451 mcp->mb[7] = LSW(MSD(req_dma));
452 mcp->mb[8] = MSW(risc_addr);
453 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
457 rval = qla2x00_mailbox_command(ha, mcp);
459 /* Load second segment - if necessary */
460 if (normalized && (rval == QLA_SUCCESS)) {
461 risc_addr += req_len;
462 mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
463 mcp->mb[1] = LSW(risc_addr);
464 mcp->mb[2] = MSW(nml_dma);
465 mcp->mb[3] = LSW(nml_dma);
466 mcp->mb[4] = (uint16_t)nml_len;
467 mcp->mb[6] = MSW(MSD(nml_dma));
468 mcp->mb[7] = LSW(MSD(nml_dma));
469 mcp->mb[8] = MSW(risc_addr);
470 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
474 rval = qla2x00_mailbox_command(ha, mcp);
477 if (rval != QLA_SUCCESS) {
479 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n",
480 __func__, ha->host_no, rval, mcp->mb[0]));
483 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
491 * Start adapter firmware.
494 * ha = adapter block pointer.
495 * TARGET_QUEUE_LOCK must be released.
496 * ADAPTER_STATE_LOCK must be released.
499 * qla2x00 local function return status code.
505 qla2x00_execute_fw(scsi_qla_host_t *ha)
509 mbx_cmd_t *mcp = &mc;
511 DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n", ha->host_no);)
513 mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
514 mcp->mb[1] = *ha->brd_info->fw_info[0].fwstart;
515 mcp->out_mb = MBX_1|MBX_0;
516 if (IS_QLA2322(ha) || IS_QLA6322(ha)) {
518 mcp->out_mb |= MBX_2;
524 rval = qla2x00_mailbox_command(ha, mcp);
526 DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n", ha->host_no);)
532 * qla2x00_get_fw_version
533 * Get firmware version.
536 * ha: adapter state pointer.
537 * major: pointer for major number.
538 * minor: pointer for minor number.
539 * subminor: pointer for subminor number.
542 * qla2x00 local function return status code.
548 qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, uint16_t *minor,
549 uint16_t *subminor, uint16_t *attributes, uint32_t *memory)
553 mbx_cmd_t *mcp = &mc;
555 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
557 mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
559 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
562 rval = qla2x00_mailbox_command(ha, mcp);
564 /* Return mailbox data. */
567 *subminor = mcp->mb[3];
568 *attributes = mcp->mb[6];
569 if (IS_QLA2100(ha) || IS_QLA2200(ha))
570 *memory = 0x1FFFF; /* Defaults to 128KB. */
572 *memory = (mcp->mb[5] << 16) | mcp->mb[4];
574 if (rval != QLA_SUCCESS) {
576 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
580 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
585 * qla2x00_get_fw_options
586 * Set firmware options.
589 * ha = adapter block pointer.
590 * fwopt = pointer for firmware options.
593 * qla2x00 local function return status code.
599 qla2x00_get_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts)
603 mbx_cmd_t *mcp = &mc;
605 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
607 mcp->mb[0] = MBC_GET_FIRMWARE_OPTION;
609 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
612 rval = qla2x00_mailbox_command(ha, mcp);
614 if (rval != QLA_SUCCESS) {
616 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
619 fwopts[1] = mcp->mb[1];
620 fwopts[2] = mcp->mb[2];
621 fwopts[3] = mcp->mb[3];
623 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
631 * qla2x00_set_fw_options
632 * Set firmware options.
635 * ha = adapter block pointer.
636 * fwopt = pointer for firmware options.
639 * qla2x00 local function return status code.
645 qla2x00_set_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts)
649 mbx_cmd_t *mcp = &mc;
651 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
653 mcp->mb[0] = MBC_SET_FIRMWARE_OPTION;
654 mcp->mb[1] = fwopts[1];
655 mcp->mb[2] = fwopts[2];
656 mcp->mb[3] = fwopts[3];
657 mcp->mb[10] = fwopts[10];
658 mcp->mb[11] = fwopts[11];
659 mcp->mb[12] = 0; /* Undocumented, but used */
660 mcp->out_mb = MBX_12|MBX_11|MBX_10|MBX_3|MBX_2|MBX_1|MBX_0;
664 rval = qla2x00_mailbox_command(ha, mcp);
666 if (rval != QLA_SUCCESS) {
668 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
672 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
679 * qla2x00_read_ram_word
682 * ha = adapter block pointer.
685 * qla2x00 local function return status code.
691 qla2x00_read_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t *data)
695 mbx_cmd_t *mcp = &mc;
697 DEBUG11(printk("qla2x00_read_ram_word(%ld): entered.\n", ha->host_no);)
699 mcp->mb[0] = MBC_READ_RAM_WORD;
701 mcp->out_mb = MBX_1|MBX_0;
702 mcp->in_mb = MBX_0|MBX_2;
705 rval = qla2x00_mailbox_command(ha, mcp);
707 if (rval != QLA_SUCCESS) {
709 DEBUG2_3_11(printk("qla2x00_read_ram_word(%ld): failed=%x.\n",
713 DEBUG11(printk("qla2x00_read_ram_word(%ld): done.\n",
721 * qla2x00_write_ram_word
724 * ha = adapter block pointer.
727 * qla2x00 local function return status code.
733 qla2x00_write_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t data)
737 mbx_cmd_t *mcp = &mc;
739 DEBUG11(printk("qla2x00_write_ram_word(%ld): entered.\n",
742 mcp->mb[0] = MBC_WRITE_RAM_WORD;
745 mcp->out_mb = MBX_2|MBX_1|MBX_0;
749 rval = qla2x00_mailbox_command(ha, mcp);
751 if (rval != QLA_SUCCESS) {
753 DEBUG2_3_11(printk("qla2x00_write_ram_word(%ld): failed=%x.\n",
757 DEBUG11(printk("qla2x00_write_ram_word(%ld): done.\n",
765 * qla2x00_write_ram_word_ext
768 * ha = adapter block pointer.
771 * qla2x00 local function return status code.
777 qla2x00_write_ram_word_ext(scsi_qla_host_t *ha, uint32_t addr, uint16_t data)
781 mbx_cmd_t *mcp = &mc;
783 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
785 mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED;
786 mcp->mb[1] = LSW(addr);
788 mcp->mb[8] = MSW(addr);
789 mcp->out_mb = MBX_8|MBX_2|MBX_1|MBX_0;
793 rval = qla2x00_mailbox_command(ha, mcp);
795 if (rval != QLA_SUCCESS) {
797 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
801 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
808 * qla2x00_mbx_reg_test
809 * Mailbox register wrap test.
812 * ha = adapter block pointer.
813 * TARGET_QUEUE_LOCK must be released.
814 * ADAPTER_STATE_LOCK must be released.
817 * qla2x00 local function return status code.
823 qla2x00_mbx_reg_test(scsi_qla_host_t *ha)
827 mbx_cmd_t *mcp = &mc;
829 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha->host_no);)
831 mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
839 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
840 mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
843 rval = qla2x00_mailbox_command(ha, mcp);
845 if (rval == QLA_SUCCESS) {
846 if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
847 mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA)
848 rval = QLA_FUNCTION_FAILED;
849 if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
850 mcp->mb[7] != 0x2525)
851 rval = QLA_FUNCTION_FAILED;
854 if (rval != QLA_SUCCESS) {
856 DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n",
860 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n",
868 * qla2x00_verify_checksum
869 * Verify firmware checksum.
872 * ha = adapter block pointer.
873 * TARGET_QUEUE_LOCK must be released.
874 * ADAPTER_STATE_LOCK must be released.
877 * qla2x00 local function return status code.
883 qla2x00_verify_checksum(scsi_qla_host_t *ha)
887 mbx_cmd_t *mcp = &mc;
889 DEBUG11(printk("qla2x00_verify_checksum(%ld): entered.\n",
892 mcp->mb[0] = MBC_VERIFY_CHECKSUM;
893 mcp->mb[1] = *ha->brd_info->fw_info[0].fwstart;
894 mcp->out_mb = MBX_1|MBX_0;
895 mcp->in_mb = MBX_2|MBX_0;
898 rval = qla2x00_mailbox_command(ha, mcp);
900 if (rval != QLA_SUCCESS) {
902 DEBUG2_3_11(printk("qla2x00_verify_checksum(%ld): failed=%x.\n",
906 DEBUG11(printk("qla2x00_verify_checksum(%ld): done.\n",
915 * Issue IOCB using mailbox command
918 * ha = adapter state pointer.
919 * buffer = buffer pointer.
920 * phys_addr = physical address of buffer.
921 * size = size of buffer.
922 * TARGET_QUEUE_LOCK must be released.
923 * ADAPTER_STATE_LOCK must be released.
926 * qla2x00 local function return status code.
932 qla2x00_issue_iocb(scsi_qla_host_t *ha, void* buffer, dma_addr_t phys_addr,
937 mbx_cmd_t *mcp = &mc;
939 mcp->mb[0] = MBC_IOCB_COMMAND_A64;
941 mcp->mb[2] = MSW(phys_addr);
942 mcp->mb[3] = LSW(phys_addr);
943 mcp->mb[6] = MSW(MSD(phys_addr));
944 mcp->mb[7] = LSW(MSD(phys_addr));
945 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
946 mcp->in_mb = MBX_2|MBX_0;
949 rval = qla2x00_mailbox_command(ha, mcp);
951 if (rval != QLA_SUCCESS) {
953 DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
955 DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
965 * qla2x00_abort_command
966 * Abort command aborts a specified IOCB.
969 * ha = adapter block pointer.
970 * sp = SB structure pointer.
973 * qla2x00 local function return status code.
979 qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp)
981 unsigned long flags = 0;
986 mbx_cmd_t *mcp = &mc;
988 DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no);)
990 fcport = sp->fclun->fcport;
992 if (atomic_read(&ha->loop_state) == LOOP_DOWN ||
993 atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
997 spin_lock_irqsave(&ha->hardware_lock, flags);
998 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
999 if (ha->outstanding_cmds[handle] == sp)
1002 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1004 if (handle == MAX_OUTSTANDING_COMMANDS) {
1005 /* command not found */
1006 return QLA_FUNCTION_FAILED;
1009 mcp->mb[0] = MBC_ABORT_COMMAND;
1010 if (HAS_EXTENDED_IDS(ha))
1011 mcp->mb[1] = fcport->loop_id;
1013 mcp->mb[1] = fcport->loop_id << 8;
1014 mcp->mb[2] = (uint16_t)handle;
1015 mcp->mb[3] = (uint16_t)(handle >> 16);
1016 mcp->mb[6] = (uint16_t)sp->fclun->lun;
1017 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1021 rval = qla2x00_mailbox_command(ha, mcp);
1023 if (rval != QLA_SUCCESS) {
1024 DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n",
1025 ha->host_no, rval);)
1027 sp->flags |= SRB_ABORT_PENDING;
1028 DEBUG11(printk("qla2x00_abort_command(%ld): done.\n",
1036 * qla2x00_abort_device
1039 * ha = adapter block pointer.
1040 * loop_id = FC loop ID
1044 * qla2x00 local function return status code.
1050 qla2x00_abort_device(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun)
1054 mbx_cmd_t *mcp = &mc;
1056 DEBUG11(printk("qla2x00_abort_device(%ld): entered.\n", ha->host_no);)
1058 mcp->mb[0] = MBC_ABORT_DEVICE;
1059 if (HAS_EXTENDED_IDS(ha))
1060 mcp->mb[1] = loop_id;
1062 mcp->mb[1] = loop_id << 8;
1064 mcp->out_mb = MBX_2|MBX_1|MBX_0;
1068 rval = qla2x00_mailbox_command(ha, mcp);
1070 /* Issue marker command. */
1071 qla2x00_marker(ha, loop_id, lun, MK_SYNC_ID_LUN);
1073 if (rval != QLA_SUCCESS) {
1074 qla_printk(KERN_WARNING, ha,
1075 "Failed Abort Device Mailbox command. Scheduling ISP "
1077 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
1078 if (ha->dpc_wait && !ha->dpc_active)
1080 DEBUG2_3_11(printk("qla2x00_abort_device(%ld): failed=%x.\n",
1081 ha->host_no, rval);)
1084 DEBUG11(printk("qla2x00_abort_device(%ld): done.\n",
1093 * qla2x00_abort_target
1094 * Issue abort target mailbox command.
1097 * ha = adapter block pointer.
1100 * qla2x00 local function return status code.
1106 qla2x00_abort_target(fc_port_t *fcport)
1110 mbx_cmd_t *mcp = &mc;
1112 DEBUG11(printk("qla2x00_abort_target(%ld): entered.\n",
1113 fcport->ha->host_no);)
1115 if (fcport == NULL) {
1116 /* no target to abort */
1120 mcp->mb[0] = MBC_ABORT_TARGET;
1121 mcp->out_mb = MBX_2|MBX_1|MBX_0;
1122 if (HAS_EXTENDED_IDS(fcport->ha)) {
1123 mcp->mb[1] = fcport->loop_id;
1125 mcp->out_mb |= MBX_10;
1127 mcp->mb[1] = fcport->loop_id << 8;
1129 mcp->mb[2] = fcport->ha->loop_reset_delay;
1134 rval = qla2x00_mailbox_command(fcport->ha, mcp);
1136 /* Issue marker command. */
1137 fcport->ha->marker_needed = 1;
1139 if (rval != QLA_SUCCESS) {
1140 DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n",
1141 fcport->ha->host_no, rval);)
1144 DEBUG11(printk("qla2x00_abort_target(%ld): done.\n",
1145 fcport->ha->host_no);)
1153 * qla2x00_target_reset
1154 * Issue target reset mailbox command.
1157 * ha = adapter block pointer.
1158 * TARGET_QUEUE_LOCK must be released.
1159 * ADAPTER_STATE_LOCK must be released.
1162 * qla2x00 local function return status code.
1168 qla2x00_target_reset(scsi_qla_host_t *ha, uint16_t b, uint16_t t)
1172 mbx_cmd_t *mcp = &mc;
1175 DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha->host_no);)
1178 if (tgt->fcport == NULL) {
1179 /* no target to abort */
1182 if (atomic_read(&tgt->fcport->state) != FCS_ONLINE) {
1183 /* target not online */
1187 mcp->mb[0] = MBC_TARGET_RESET;
1188 if (HAS_EXTENDED_IDS(ha))
1189 mcp->mb[1] = tgt->fcport->loop_id;
1191 mcp->mb[1] = tgt->fcport->loop_id << 8;
1192 mcp->mb[2] = ha->loop_reset_delay;
1193 mcp->out_mb = MBX_2|MBX_1|MBX_0;
1197 rval = qla2x00_mailbox_command(ha, mcp);
1199 if (rval != QLA_SUCCESS) {
1201 DEBUG2_3_11(printk("qla2x00_target_reset(%ld): failed=%x.\n",
1202 ha->host_no, rval);)
1205 DEBUG11(printk("qla2x00_target_reset(%ld): done.\n",
1213 * qla2x00_get_adapter_id
1214 * Get adapter ID and topology.
1217 * ha = adapter block pointer.
1218 * id = pointer for loop ID.
1219 * al_pa = pointer for AL_PA.
1220 * area = pointer for area.
1221 * domain = pointer for domain.
1222 * top = pointer for topology.
1223 * TARGET_QUEUE_LOCK must be released.
1224 * ADAPTER_STATE_LOCK must be released.
1227 * qla2x00 local function return status code.
1233 qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
1234 uint8_t *area, uint8_t *domain, uint16_t *top)
1238 mbx_cmd_t *mcp = &mc;
1240 DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n",
1243 mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID;
1244 mcp->out_mb = MBX_0;
1245 mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1248 rval = qla2x00_mailbox_command(ha, mcp);
1252 *al_pa = LSB(mcp->mb[2]);
1253 *area = MSB(mcp->mb[2]);
1254 *domain = LSB(mcp->mb[3]);
1257 if (rval != QLA_SUCCESS) {
1259 DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n",
1260 ha->host_no, rval);)
1263 DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n",
1271 * qla2x00_get_retry_cnt
1272 * Get current firmware login retry count and delay.
1275 * ha = adapter block pointer.
1276 * retry_cnt = pointer to login retry count.
1277 * tov = pointer to login timeout value.
1280 * qla2x00 local function return status code.
1286 qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov,
1292 mbx_cmd_t *mcp = &mc;
1294 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n",
1297 mcp->mb[0] = MBC_GET_RETRY_COUNT;
1298 mcp->out_mb = MBX_0;
1299 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1302 rval = qla2x00_mailbox_command(ha, mcp);
1304 if (rval != QLA_SUCCESS) {
1306 DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n",
1307 ha->host_no, mcp->mb[0]);)
1309 /* Convert returned data and check our values. */
1310 *r_a_tov = mcp->mb[3] / 2;
1311 ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */
1312 if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) {
1313 /* Update to the larger values */
1314 *retry_cnt = (uint8_t)mcp->mb[1];
1318 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d "
1319 "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);)
1326 * qla2x00_init_firmware
1327 * Initialize adapter firmware.
1330 * ha = adapter block pointer.
1331 * dptr = Initialization control block pointer.
1332 * size = size of initialization control block.
1333 * TARGET_QUEUE_LOCK must be released.
1334 * ADAPTER_STATE_LOCK must be released.
1337 * qla2x00 local function return status code.
1343 qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size)
1347 mbx_cmd_t *mcp = &mc;
1349 DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n",
1352 mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
1353 mcp->mb[2] = MSW(ha->init_cb_dma);
1354 mcp->mb[3] = LSW(ha->init_cb_dma);
1357 mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
1358 mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
1359 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
1360 mcp->in_mb = MBX_5|MBX_4|MBX_0;
1361 mcp->buf_size = size;
1362 mcp->flags = MBX_DMA_OUT;
1364 rval = qla2x00_mailbox_command(ha, mcp);
1366 if (rval != QLA_SUCCESS) {
1368 DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x "
1370 ha->host_no, rval, mcp->mb[0]);)
1373 DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n",
1381 * qla2x00_get_port_database
1382 * Issue normal/enhanced get port database mailbox command
1383 * and copy device name as necessary.
1386 * ha = adapter state pointer.
1387 * dev = structure pointer.
1388 * opt = enhanced cmd option byte.
1391 * qla2x00 local function return status code.
1397 qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt)
1401 mbx_cmd_t *mcp = &mc;
1402 port_database_t *pd;
1405 DEBUG11(printk("qla2x00_get_port_database(%ld): entered.\n",
1408 pd = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pd_dma);
1410 DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): **** "
1411 "Mem Alloc Failed ****", ha->host_no);)
1412 return QLA_MEMORY_ALLOC_FAILED;
1414 memset(pd, 0, PORT_DATABASE_SIZE);
1417 mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE;
1419 mcp->mb[0] = MBC_GET_PORT_DATABASE;
1420 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1421 if (HAS_EXTENDED_IDS(ha)) {
1422 mcp->mb[1] = fcport->loop_id;
1424 mcp->out_mb |= MBX_10;
1426 mcp->mb[1] = fcport->loop_id << 8 | opt;
1428 mcp->mb[2] = MSW(pd_dma);
1429 mcp->mb[3] = LSW(pd_dma);
1430 mcp->mb[6] = MSW(MSD(pd_dma));
1431 mcp->mb[7] = LSW(MSD(pd_dma));
1434 mcp->buf_size = PORT_DATABASE_SIZE;
1435 mcp->flags = MBX_DMA_IN;
1436 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1437 rval = qla2x00_mailbox_command(ha, mcp);
1438 if (rval != QLA_SUCCESS)
1441 /* Check for logged in state. */
1442 if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
1443 pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
1444 rval = QLA_FUNCTION_FAILED;
1448 /* Names are little-endian. */
1449 memcpy(fcport->node_name, pd->node_name, WWN_SIZE);
1450 memcpy(fcport->port_name, pd->port_name, WWN_SIZE);
1452 /* Get port_id of device. */
1453 fcport->d_id.b.al_pa = pd->port_id[2];
1454 fcport->d_id.b.area = pd->port_id[3];
1455 fcport->d_id.b.domain = pd->port_id[0];
1456 fcport->d_id.b.rsvd_1 = 0;
1458 /* Check for device require authentication. */
1459 pd->common_features & BIT_5 ? (fcport->flags |= FCF_AUTH_REQ) :
1460 (fcport->flags &= ~FCF_AUTH_REQ);
1462 /* If not target must be initiator or unknown type. */
1463 if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
1464 fcport->port_type = FCT_INITIATOR;
1466 fcport->port_type = FCT_TARGET;
1469 dma_pool_free(ha->s_dma_pool, pd, pd_dma);
1471 if (rval != QLA_SUCCESS) {
1473 DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): "
1474 "failed=%x.\n", ha->host_no, rval);)
1477 DEBUG11(printk("qla2x00_get_port_database(%ld): done.\n",
1485 * qla2x00_get_firmware_state
1486 * Get adapter firmware state.
1489 * ha = adapter block pointer.
1490 * dptr = pointer for firmware state.
1491 * TARGET_QUEUE_LOCK must be released.
1492 * ADAPTER_STATE_LOCK must be released.
1495 * qla2x00 local function return status code.
1501 qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr)
1505 mbx_cmd_t *mcp = &mc;
1507 DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n",
1510 mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
1511 mcp->out_mb = MBX_0;
1512 mcp->in_mb = MBX_2|MBX_1|MBX_0;
1515 rval = qla2x00_mailbox_command(ha, mcp);
1517 /* Return firmware state. */
1520 if (rval != QLA_SUCCESS) {
1522 DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): "
1523 "failed=%x.\n", ha->host_no, rval);)
1526 DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n",
1534 * qla2x00_get_port_name
1535 * Issue get port name mailbox command.
1536 * Returned name is in big endian format.
1539 * ha = adapter block pointer.
1540 * loop_id = loop ID of device.
1541 * name = pointer for name.
1542 * TARGET_QUEUE_LOCK must be released.
1543 * ADAPTER_STATE_LOCK must be released.
1546 * qla2x00 local function return status code.
1552 qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name,
1557 mbx_cmd_t *mcp = &mc;
1559 DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n",
1562 mcp->mb[0] = MBC_GET_PORT_NAME;
1563 mcp->out_mb = MBX_1|MBX_0;
1564 if (HAS_EXTENDED_IDS(ha)) {
1565 mcp->mb[1] = loop_id;
1567 mcp->out_mb |= MBX_10;
1569 mcp->mb[1] = loop_id << 8 | opt;
1572 mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1575 rval = qla2x00_mailbox_command(ha, mcp);
1577 if (rval != QLA_SUCCESS) {
1579 DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n",
1580 ha->host_no, rval);)
1583 /* This function returns name in big endian. */
1584 name[0] = LSB(mcp->mb[2]);
1585 name[1] = MSB(mcp->mb[2]);
1586 name[2] = LSB(mcp->mb[3]);
1587 name[3] = MSB(mcp->mb[3]);
1588 name[4] = LSB(mcp->mb[6]);
1589 name[5] = MSB(mcp->mb[6]);
1590 name[6] = LSB(mcp->mb[7]);
1591 name[7] = MSB(mcp->mb[7]);
1594 DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n",
1602 * qla2x00_get_link_status
1605 * ha = adapter block pointer.
1606 * loop_id = device loop ID.
1607 * ret_buf = pointer to link status return buffer.
1611 * BIT_0 = mem alloc error.
1612 * BIT_1 = mailbox error.
1615 qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id,
1616 link_stat_t *ret_buf, uint16_t *status)
1620 mbx_cmd_t *mcp = &mc;
1621 link_stat_t *stat_buf;
1622 dma_addr_t stat_buf_dma;
1624 DEBUG11(printk("qla2x00_get_link_status(%ld): entered.\n",
1627 stat_buf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &stat_buf_dma);
1628 if (stat_buf == NULL) {
1629 DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): Failed to "
1630 "allocate memory.\n", ha->host_no));
1633 memset(stat_buf, 0, sizeof(link_stat_t));
1635 mcp->mb[0] = MBC_GET_LINK_STATUS;
1636 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1637 if (HAS_EXTENDED_IDS(ha)) {
1638 mcp->mb[1] = loop_id;
1640 mcp->out_mb |= MBX_10;
1642 mcp->mb[1] = loop_id << 8;
1644 mcp->mb[2] = MSW(stat_buf_dma);
1645 mcp->mb[3] = LSW(stat_buf_dma);
1646 mcp->mb[6] = MSW(MSD(stat_buf_dma));
1647 mcp->mb[7] = LSW(MSD(stat_buf_dma));
1651 mcp->flags = IOCTL_CMD;
1652 rval = qla2x00_mailbox_command(ha, mcp);
1654 if (rval == QLA_SUCCESS) {
1655 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
1656 DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): cmd "
1657 "failed. mbx0=%x.\n", ha->host_no, mcp->mb[0]);)
1658 status[0] = mcp->mb[0];
1661 /* copy over data -- firmware data is LE. */
1662 ret_buf->link_fail_cnt =
1663 le32_to_cpu(stat_buf->link_fail_cnt);
1664 ret_buf->loss_sync_cnt =
1665 le32_to_cpu(stat_buf->loss_sync_cnt);
1666 ret_buf->loss_sig_cnt =
1667 le32_to_cpu(stat_buf->loss_sig_cnt);
1668 ret_buf->prim_seq_err_cnt =
1669 le32_to_cpu(stat_buf->prim_seq_err_cnt);
1670 ret_buf->inval_xmit_word_cnt =
1671 le32_to_cpu(stat_buf->inval_xmit_word_cnt);
1672 ret_buf->inval_crc_cnt =
1673 le32_to_cpu(stat_buf->inval_crc_cnt);
1675 DEBUG11(printk("qla2x00_get_link_status(%ld): stat "
1676 "dump: fail_cnt=%d loss_sync=%d loss_sig=%d "
1677 "seq_err=%d inval_xmt_word=%d inval_crc=%d.\n",
1679 stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt,
1680 stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt,
1681 stat_buf->inval_xmit_word_cnt,
1682 stat_buf->inval_crc_cnt);)
1686 DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): failed=%x.\n",
1687 ha->host_no, rval);)
1691 dma_pool_free(ha->s_dma_pool, stat_buf, stat_buf_dma);
1698 * Issue LIP reset mailbox command.
1701 * ha = adapter block pointer.
1702 * TARGET_QUEUE_LOCK must be released.
1703 * ADAPTER_STATE_LOCK must be released.
1706 * qla2x00 local function return status code.
1712 qla2x00_lip_reset(scsi_qla_host_t *ha)
1716 mbx_cmd_t *mcp = &mc;
1718 DEBUG11(printk("qla2x00_lip_reset(%ld): entered.\n",
1721 mcp->mb[0] = MBC_LIP_RESET;
1722 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1723 if (HAS_EXTENDED_IDS(ha)) {
1724 mcp->mb[1] = 0x00ff;
1726 mcp->out_mb |= MBX_10;
1728 mcp->mb[1] = 0xff00;
1730 mcp->mb[2] = ha->loop_reset_delay;
1736 rval = qla2x00_mailbox_command(ha, mcp);
1738 if (rval != QLA_SUCCESS) {
1740 DEBUG2_3_11(printk("qla2x00_lip_reset(%ld): failed=%x.\n",
1741 ha->host_no, rval);)
1744 DEBUG11(printk("qla2x00_lip_reset(%ld): done.\n", ha->host_no);)
1755 * ha = adapter block pointer.
1756 * sns = pointer for command.
1757 * cmd_size = command size.
1758 * buf_size = response/command size.
1759 * TARGET_QUEUE_LOCK must be released.
1760 * ADAPTER_STATE_LOCK must be released.
1763 * qla2x00 local function return status code.
1769 qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address,
1770 uint16_t cmd_size, size_t buf_size)
1774 mbx_cmd_t *mcp = &mc;
1776 DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n",
1779 DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total "
1780 "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);)
1782 mcp->mb[0] = MBC_SEND_SNS_COMMAND;
1783 mcp->mb[1] = cmd_size;
1784 mcp->mb[2] = MSW(sns_phys_address);
1785 mcp->mb[3] = LSW(sns_phys_address);
1786 mcp->mb[6] = MSW(MSD(sns_phys_address));
1787 mcp->mb[7] = LSW(MSD(sns_phys_address));
1788 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1789 mcp->in_mb = MBX_0|MBX_1;
1790 mcp->buf_size = buf_size;
1791 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN;
1792 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1793 rval = qla2x00_mailbox_command(ha, mcp);
1795 if (rval != QLA_SUCCESS) {
1797 DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
1798 "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);)
1799 DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
1800 "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);)
1803 DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha->host_no);)
1810 * qla2x00_login_fabric
1811 * Issue login fabric port mailbox command.
1814 * ha = adapter block pointer.
1815 * loop_id = device loop ID.
1816 * domain = device domain.
1817 * area = device area.
1818 * al_pa = device AL_PA.
1819 * status = pointer for return status.
1820 * opt = command options.
1821 * TARGET_QUEUE_LOCK must be released.
1822 * ADAPTER_STATE_LOCK must be released.
1825 * qla2x00 local function return status code.
1831 qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
1832 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
1836 mbx_cmd_t *mcp = &mc;
1838 DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha->host_no);)
1840 mcp->mb[0] = MBC_LOGIN_FABRIC_PORT;
1841 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1842 if (HAS_EXTENDED_IDS(ha)) {
1843 mcp->mb[1] = loop_id;
1845 mcp->out_mb |= MBX_10;
1847 mcp->mb[1] = (loop_id << 8) | opt;
1849 mcp->mb[2] = domain;
1850 mcp->mb[3] = area << 8 | al_pa;
1852 mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0;
1853 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1855 rval = qla2x00_mailbox_command(ha, mcp);
1857 /* Return mailbox statuses. */
1866 if (rval != QLA_SUCCESS) {
1867 /* RLU tmp code: need to change main mailbox_command function to
1868 * return ok even when the mailbox completion value is not
1869 * SUCCESS. The caller needs to be responsible to interpret
1870 * the return values of this mailbox command if we're not
1871 * to change too much of the existing code.
1873 if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||
1874 mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||
1875 mcp->mb[0] == 0x4006)
1879 DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x "
1880 "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha->host_no, rval,
1881 mcp->mb[0], mcp->mb[1], mcp->mb[2]);)
1884 DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n",
1892 * qla2x00_login_local_device
1893 * Issue login loop port mailbox command.
1896 * ha = adapter block pointer.
1897 * loop_id = device loop ID.
1898 * opt = command options.
1901 * Return status code.
1908 qla2x00_login_local_device(scsi_qla_host_t *ha, uint16_t loop_id,
1909 uint16_t *mb_ret, uint8_t opt)
1913 mbx_cmd_t *mcp = &mc;
1915 DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
1917 mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
1918 if (HAS_EXTENDED_IDS(ha))
1919 mcp->mb[1] = loop_id;
1921 mcp->mb[1] = loop_id << 8;
1923 mcp->out_mb = MBX_2|MBX_1|MBX_0;
1924 mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
1925 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1927 rval = qla2x00_mailbox_command(ha, mcp);
1929 /* Return mailbox statuses. */
1930 if (mb_ret != NULL) {
1931 mb_ret[0] = mcp->mb[0];
1932 mb_ret[1] = mcp->mb[1];
1933 mb_ret[6] = mcp->mb[6];
1934 mb_ret[7] = mcp->mb[7];
1937 if (rval != QLA_SUCCESS) {
1938 /* AV tmp code: need to change main mailbox_command function to
1939 * return ok even when the mailbox completion value is not
1940 * SUCCESS. The caller needs to be responsible to interpret
1941 * the return values of this mailbox command if we're not
1942 * to change too much of the existing code.
1944 if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006)
1947 DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
1948 "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,
1949 mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);)
1950 DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
1951 "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,
1952 mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);)
1955 DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);)
1962 * qla2x00_fabric_logout
1963 * Issue logout fabric port mailbox command.
1966 * ha = adapter block pointer.
1967 * loop_id = device loop ID.
1968 * TARGET_QUEUE_LOCK must be released.
1969 * ADAPTER_STATE_LOCK must be released.
1972 * qla2x00 local function return status code.
1978 qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id)
1982 mbx_cmd_t *mcp = &mc;
1984 DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n",
1987 mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
1988 mcp->out_mb = MBX_1|MBX_0;
1989 if (HAS_EXTENDED_IDS(ha)) {
1990 mcp->mb[1] = loop_id;
1992 mcp->out_mb |= MBX_10;
1994 mcp->mb[1] = loop_id << 8;
1997 mcp->in_mb = MBX_1|MBX_0;
2000 rval = qla2x00_mailbox_command(ha, mcp);
2002 if (rval != QLA_SUCCESS) {
2004 DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x "
2005 "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1]);)
2008 DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n",
2016 * qla2x00_full_login_lip
2017 * Issue full login LIP mailbox command.
2020 * ha = adapter block pointer.
2021 * TARGET_QUEUE_LOCK must be released.
2022 * ADAPTER_STATE_LOCK must be released.
2025 * qla2x00 local function return status code.
2031 qla2x00_full_login_lip(scsi_qla_host_t *ha)
2035 mbx_cmd_t *mcp = &mc;
2037 DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n",
2040 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
2044 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2048 rval = qla2x00_mailbox_command(ha, mcp);
2050 if (rval != QLA_SUCCESS) {
2052 DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n",
2053 ha->instance, rval);)
2056 DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n",
2064 * qla2x00_get_id_list
2067 * ha = adapter block pointer.
2070 * qla2x00 local function return status code.
2076 qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma,
2081 mbx_cmd_t *mcp = &mc;
2083 DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n",
2086 if (id_list == NULL)
2087 return QLA_FUNCTION_FAILED;
2089 mcp->mb[0] = MBC_GET_ID_LIST;
2090 mcp->mb[1] = MSW(id_list_dma);
2091 mcp->mb[2] = LSW(id_list_dma);
2092 mcp->mb[3] = MSW(MSD(id_list_dma));
2093 mcp->mb[6] = LSW(MSD(id_list_dma));
2094 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2095 mcp->in_mb = MBX_1|MBX_0;
2098 rval = qla2x00_mailbox_command(ha, mcp);
2100 if (rval != QLA_SUCCESS) {
2102 DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n",
2103 ha->host_no, rval);)
2105 *entries = mcp->mb[1];
2106 DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n",
2115 * Issue lun reset mailbox command.
2118 * ha = adapter block pointer.
2119 * loop_id = device loop ID.
2120 * lun = lun to be reset.
2121 * TARGET_QUEUE_LOCK must be released.
2122 * ADAPTER_STATE_LOCK must be released.
2125 * qla2x00 local function return status code.
2131 qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun)
2135 mbx_cmd_t *mcp = &mc;
2137 mcp->mb[0] = MBC_LUN_RESET;
2138 if (HAS_EXTENDED_IDS(ha))
2139 mcp->mb[1] = loop_id;
2141 mcp->mb[1] = loop_id << 8;
2143 mcp->out_mb = MBX_2|MBX_1|MBX_0;
2147 rval = qla2x00_mailbox_command(ha, mcp);
2149 if (rval != QLA_SUCCESS) {
2151 printk(KERN_WARNING "qla2x00_lun_reset(%d): failed = %d",
2152 (int)ha->instance, rval);
2161 * qla2x00_send_rnid_mbx
2162 * Issue RNID ELS using mailbox command
2165 * ha = adapter state pointer.
2166 * loop_id = loop ID of the target device.
2167 * data_fmt = currently supports only 0xDF.
2168 * buffer = buffer pointer.
2169 * buf_size = size of buffer.
2170 * mb_reg = pointer to return mailbox registers.
2173 * qla2x00 local function return status code.
2179 qla2x00_send_rnid_mbx(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t data_fmt,
2180 dma_addr_t buf_phys_addr, size_t buf_size, uint16_t *mb_reg)
2184 mbx_cmd_t *mcp = &mc;
2186 DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): entered.\n",
2189 mcp->mb[0] = MBC_SEND_RNID_ELS;
2190 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2191 if (HAS_EXTENDED_IDS(ha)) {
2192 mcp->mb[1] = loop_id;
2193 mcp->mb[10] = data_fmt;
2194 mcp->out_mb |= MBX_10;
2196 mcp->mb[1] = (loop_id << 8) | data_fmt;
2198 mcp->mb[2] = MSW(buf_phys_addr);
2199 mcp->mb[3] = LSW(buf_phys_addr);
2200 mcp->mb[6] = MSW(MSD(buf_phys_addr));
2201 mcp->mb[7] = LSW(MSD(buf_phys_addr));
2203 mcp->in_mb = MBX_1|MBX_0;
2204 mcp->buf_size = buf_size;
2205 mcp->flags = MBX_DMA_IN;
2207 rval = qla2x00_mailbox_command(ha, mcp);
2209 if (rval != QLA_SUCCESS) {
2210 memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
2212 DEBUG2_3_11(printk("qla2x00_send_rnid_mbx(%ld): failed=%x "
2214 ha->host_no, mcp->mb[0], mcp->mb[1]);)
2217 DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): done.\n",
2225 * qla2x00_set_rnid_params_mbx
2226 * Set RNID parameters using mailbox command
2229 * ha = adapter state pointer.
2230 * buffer = buffer pointer.
2231 * buf_size = size of buffer.
2232 * mb_reg = pointer to return mailbox registers.
2235 * qla2x00 local function return status code.
2241 qla2x00_set_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr,
2242 size_t buf_size, uint16_t *mb_reg)
2246 mbx_cmd_t *mcp = &mc;
2248 DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): entered.\n",
2251 mcp->mb[0] = MBC_SET_RNID_PARAMS;
2253 mcp->mb[2] = MSW(buf_phys_addr);
2254 mcp->mb[3] = LSW(buf_phys_addr);
2255 mcp->mb[6] = MSW(MSD(buf_phys_addr));
2256 mcp->mb[7] = LSW(MSD(buf_phys_addr));
2257 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2258 mcp->in_mb = MBX_1|MBX_0;
2259 mcp->buf_size = buf_size;
2260 mcp->flags = MBX_DMA_OUT;
2262 rval = qla2x00_mailbox_command(ha, mcp);
2264 if (rval != QLA_SUCCESS) {
2265 memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
2267 DEBUG2_3_11(printk("qla2x00_set_rnid_params_mbx(%ld): "
2268 "failed=%x mb[1]=%x.\n", ha->host_no, mcp->mb[0],
2272 DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): done.\n",
2280 * qla2x00_get_rnid_params_mbx
2281 * Get RNID parameters using mailbox command
2284 * ha = adapter state pointer.
2285 * buffer = buffer pointer.
2286 * buf_size = size of buffer.
2287 * mb_reg = pointer to return mailbox registers.
2290 * qla2x00 local function return status code.
2296 qla2x00_get_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr,
2297 size_t buf_size, uint16_t *mb_reg)
2301 mbx_cmd_t *mcp = &mc;
2303 DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): entered.\n",
2306 mcp->mb[0] = MBC_GET_RNID_PARAMS;
2308 mcp->mb[2] = MSW(buf_phys_addr);
2309 mcp->mb[3] = LSW(buf_phys_addr);
2310 mcp->mb[6] = MSW(MSD(buf_phys_addr));
2311 mcp->mb[7] = LSW(MSD(buf_phys_addr));
2312 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2313 mcp->in_mb = MBX_1|MBX_0;
2314 mcp->buf_size = buf_size;
2315 mcp->flags = MBX_DMA_IN;
2317 rval = qla2x00_mailbox_command(ha, mcp);
2319 if (rval != QLA_SUCCESS) {
2320 memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
2322 DEBUG2_3_11(printk("qla2x00_get_rnid_params_mbx(%ld): "
2323 "failed=%x mb[1]=%x.\n", ha->host_no, mcp->mb[0],
2327 DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): done.\n",
2335 * qla2x00_get_resource_cnts
2336 * Get current firmware resource counts.
2339 * ha = adapter block pointer.
2342 * qla2x00 local function return status code.
2348 qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt,
2349 uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt, uint16_t *orig_iocb_cnt)
2353 mbx_cmd_t *mcp = &mc;
2355 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
2357 mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
2358 mcp->out_mb = MBX_0;
2359 mcp->in_mb = MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2362 rval = qla2x00_mailbox_command(ha, mcp);
2364 if (rval != QLA_SUCCESS) {
2366 DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__,
2367 ha->host_no, mcp->mb[0]);)
2369 DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x "
2370 "mb7=%x mb10=%x.\n", __func__, ha->host_no,
2371 mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[6], mcp->mb[7],
2375 *cur_xchg_cnt = mcp->mb[3];
2377 *orig_xchg_cnt = mcp->mb[6];
2379 *cur_iocb_cnt = mcp->mb[7];
2381 *orig_iocb_cnt = mcp->mb[10];
2387 #if defined(QL_DEBUG_LEVEL_3)
2389 * qla2x00_get_fcal_position_map
2390 * Get FCAL (LILP) position map using mailbox command
2393 * ha = adapter state pointer.
2394 * pos_map = buffer pointer (can be NULL).
2397 * qla2x00 local function return status code.
2403 qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map)
2407 mbx_cmd_t *mcp = &mc;
2409 dma_addr_t pmap_dma;
2411 pmap = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pmap_dma);
2413 DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****",
2414 __func__, ha->host_no));
2415 return QLA_MEMORY_ALLOC_FAILED;
2417 memset(pmap, 0, FCAL_MAP_SIZE);
2419 mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP;
2420 mcp->mb[2] = MSW(pmap_dma);
2421 mcp->mb[3] = LSW(pmap_dma);
2422 mcp->mb[6] = MSW(MSD(pmap_dma));
2423 mcp->mb[7] = LSW(MSD(pmap_dma));
2424 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2425 mcp->in_mb = MBX_1|MBX_0;
2426 mcp->buf_size = FCAL_MAP_SIZE;
2427 mcp->flags = MBX_DMA_IN;
2428 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
2429 rval = qla2x00_mailbox_command(ha, mcp);
2431 if (rval == QLA_SUCCESS) {
2432 DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "
2433 "size (%x)\n", __func__, ha->host_no, mcp->mb[0],
2434 mcp->mb[1], (unsigned)pmap[0]));
2435 DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1));
2438 memcpy(pos_map, pmap, FCAL_MAP_SIZE);
2440 dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);
2442 if (rval != QLA_SUCCESS) {
2443 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
2444 ha->host_no, rval));
2446 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));