blob: 07f4d3cbcc07e8a39a5af3038e1f711e32b6c969 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Andrew Vasquezfa90c542005-10-27 11:10:08 -07002 * QLogic Fibre Channel HBA Driver
Andrew Vasquez07e264b2011-03-30 11:46:23 -07003 * Copyright (c) 2003-2011 QLogic Corporation
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 *
Andrew Vasquezfa90c542005-10-27 11:10:08 -07005 * See LICENSE.qla2xxx for copyright and licensing details.
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 */
7#include "qla_def.h"
8
9#include <linux/delay.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090010#include <linux/gfp.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070011
Linus Torvalds1da177e2005-04-16 15:20:36 -070012
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 */
32static int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -080033qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
Linus Torvalds1da177e2005-04-16 15:20:36 -070034{
35 int rval;
36 unsigned long flags = 0;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -070037 device_reg_t __iomem *reg;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -070038 uint8_t abort_active;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -070039 uint8_t io_lock_on;
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -070040 uint16_t command = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070041 uint16_t *iptr;
42 uint16_t __iomem *optr;
43 uint32_t cnt;
44 uint32_t mboxes;
Linus Torvalds1da177e2005-04-16 15:20:36 -070045 unsigned long wait_time;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -080046 struct qla_hw_data *ha = vha->hw;
47 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -070048
Arun Easi5e19ed92012-02-09 11:15:51 -080049 ql_dbg(ql_dbg_mbx, vha, 0x1000, "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -070050
51 if (ha->pdev->error_state > pci_channel_io_frozen) {
Arun Easi5e19ed92012-02-09 11:15:51 -080052 ql_log(ql_log_warn, vha, 0x1001,
Saurav Kashyap7c3df132011-07-14 12:00:13 -070053 "error_state is greater than pci_channel_io_frozen, "
54 "exiting.\n");
Seokmann Jub9b12f72009-03-24 09:08:18 -070055 return QLA_FUNCTION_TIMEOUT;
Saurav Kashyap7c3df132011-07-14 12:00:13 -070056 }
Seokmann Jub9b12f72009-03-24 09:08:18 -070057
Giridhar Malavalia9083012010-04-12 17:59:55 -070058 if (vha->device_flags & DFLG_DEV_FAILED) {
Arun Easi5e19ed92012-02-09 11:15:51 -080059 ql_log(ql_log_warn, vha, 0x1002,
Saurav Kashyap7c3df132011-07-14 12:00:13 -070060 "Device in failed state, exiting.\n");
Giridhar Malavalia9083012010-04-12 17:59:55 -070061 return QLA_FUNCTION_TIMEOUT;
62 }
63
Seokmann Ju2c3dfe32007-07-05 13:16:51 -070064 reg = ha->iobase;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -080065 io_lock_on = base_vha->flags.init_done;
Linus Torvalds1da177e2005-04-16 15:20:36 -070066
67 rval = QLA_SUCCESS;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -080068 abort_active = test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070069
Andrew Vasquez1c7c6352005-07-06 10:30:57 -070070
Andrew Vasquez85880802009-12-15 21:29:46 -080071 if (ha->flags.pci_channel_io_perm_failure) {
Arun Easi5e19ed92012-02-09 11:15:51 -080072 ql_log(ql_log_warn, vha, 0x1003,
Saurav Kashyap7c3df132011-07-14 12:00:13 -070073 "Perm failure on EEH timeout MBX, exiting.\n");
Andrew Vasquez85880802009-12-15 21:29:46 -080074 return QLA_FUNCTION_TIMEOUT;
75 }
76
Giridhar Malavali862cd012011-02-23 15:27:11 -080077 if (ha->flags.isp82xx_fw_hung) {
78 /* Setting Link-Down error */
79 mcp->mb[0] = MBS_LINK_DOWN_ERROR;
Arun Easi5e19ed92012-02-09 11:15:51 -080080 ql_log(ql_log_warn, vha, 0x1004,
Saurav Kashyap7c3df132011-07-14 12:00:13 -070081 "FW hung = %d.\n", ha->flags.isp82xx_fw_hung);
Andrew Vasquez1806fcd2011-11-18 09:02:15 -080082 return QLA_FUNCTION_TIMEOUT;
Giridhar Malavali862cd012011-02-23 15:27:11 -080083 }
84
Linus Torvalds1da177e2005-04-16 15:20:36 -070085 /*
Andrew Vasquez1c7c6352005-07-06 10:30:57 -070086 * Wait for active mailbox commands to finish by waiting at most tov
87 * seconds. This is to serialize actual issuing of mailbox cmds during
88 * non ISP abort time.
Linus Torvalds1da177e2005-04-16 15:20:36 -070089 */
Andrew Vasquez8eca3f32009-01-22 09:45:31 -080090 if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) {
91 /* Timeout occurred. Return error. */
Arun Easi5e19ed92012-02-09 11:15:51 -080092 ql_log(ql_log_warn, vha, 0x1005,
Chad Dupuisd8c0d542012-02-09 11:15:46 -080093 "Cmd access timeout, cmd=0x%x, Exiting.\n",
94 mcp->mb[0]);
Andrew Vasquez8eca3f32009-01-22 09:45:31 -080095 return QLA_FUNCTION_TIMEOUT;
Linus Torvalds1da177e2005-04-16 15:20:36 -070096 }
97
98 ha->flags.mbox_busy = 1;
99 /* Save mailbox command for debug */
100 ha->mcp = mcp;
101
Arun Easi5e19ed92012-02-09 11:15:51 -0800102 ql_dbg(ql_dbg_mbx, vha, 0x1006,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700103 "Prepare to issue mbox cmd=0x%x.\n", mcp->mb[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
105 spin_lock_irqsave(&ha->hardware_lock, flags);
106
107 /* Load mailbox registers. */
Giridhar Malavalia9083012010-04-12 17:59:55 -0700108 if (IS_QLA82XX(ha))
109 optr = (uint16_t __iomem *)&reg->isp82.mailbox_in[0];
110 else if (IS_FWI2_CAPABLE(ha) && !IS_QLA82XX(ha))
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700111 optr = (uint16_t __iomem *)&reg->isp24.mailbox0;
112 else
113 optr = (uint16_t __iomem *)MAILBOX_REG(ha, &reg->isp, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114
115 iptr = mcp->mb;
116 command = mcp->mb[0];
117 mboxes = mcp->out_mb;
118
119 for (cnt = 0; cnt < ha->mbx_count; cnt++) {
120 if (IS_QLA2200(ha) && cnt == 8)
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700121 optr =
122 (uint16_t __iomem *)MAILBOX_REG(ha, &reg->isp, 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700123 if (mboxes & BIT_0)
124 WRT_REG_WORD(optr, *iptr);
125
126 mboxes >>= 1;
127 optr++;
128 iptr++;
129 }
130
Arun Easi5e19ed92012-02-09 11:15:51 -0800131 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1111,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700132 "Loaded MBX registers (displayed in bytes) =.\n");
Arun Easi5e19ed92012-02-09 11:15:51 -0800133 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1112,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700134 (uint8_t *)mcp->mb, 16);
Arun Easi5e19ed92012-02-09 11:15:51 -0800135 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1113,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700136 ".\n");
Arun Easi5e19ed92012-02-09 11:15:51 -0800137 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1114,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700138 ((uint8_t *)mcp->mb + 0x10), 16);
Arun Easi5e19ed92012-02-09 11:15:51 -0800139 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1115,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700140 ".\n");
Arun Easi5e19ed92012-02-09 11:15:51 -0800141 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1116,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700142 ((uint8_t *)mcp->mb + 0x20), 8);
Arun Easi5e19ed92012-02-09 11:15:51 -0800143 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1117,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700144 "I/O Address = %p.\n", optr);
Arun Easi5e19ed92012-02-09 11:15:51 -0800145 ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x100e);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146
147 /* Issue set host interrupt command to send cmd out. */
148 ha->flags.mbox_int = 0;
149 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
150
151 /* Unlock mbx registers and wait for interrupt */
Arun Easi5e19ed92012-02-09 11:15:51 -0800152 ql_dbg(ql_dbg_mbx, vha, 0x100f,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700153 "Going to unlock irq & waiting for interrupts. "
154 "jiffies=%lx.\n", jiffies);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155
156 /* Wait for mbx cmd completion until timeout */
157
Andrew Vasquez124f85e2009-01-05 11:18:06 -0800158 if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159 set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
160
Giridhar Malavalia9083012010-04-12 17:59:55 -0700161 if (IS_QLA82XX(ha)) {
162 if (RD_REG_DWORD(&reg->isp82.hint) &
163 HINT_MBX_INT_PENDING) {
164 spin_unlock_irqrestore(&ha->hardware_lock,
165 flags);
Giridhar Malavali8937f2f2011-11-18 09:02:18 -0800166 ha->flags.mbox_busy = 0;
Arun Easi5e19ed92012-02-09 11:15:51 -0800167 ql_dbg(ql_dbg_mbx, vha, 0x1010,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700168 "Pending mailbox timeout, exiting.\n");
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700169 rval = QLA_FUNCTION_TIMEOUT;
170 goto premature_exit;
Giridhar Malavalia9083012010-04-12 17:59:55 -0700171 }
172 WRT_REG_DWORD(&reg->isp82.hint, HINT_MBX_INT_PENDING);
173 } else if (IS_FWI2_CAPABLE(ha))
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700174 WRT_REG_DWORD(&reg->isp24.hccr, HCCRX_SET_HOST_INT);
175 else
176 WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 spin_unlock_irqrestore(&ha->hardware_lock, flags);
178
Marcus Barrow0b05a1f2008-01-17 09:02:13 -0800179 wait_for_completion_timeout(&ha->mbx_intr_comp, mcp->tov * HZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
182
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183 } else {
Arun Easi5e19ed92012-02-09 11:15:51 -0800184 ql_dbg(ql_dbg_mbx, vha, 0x1011,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700185 "Cmd=%x Polling Mode.\n", command);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186
Giridhar Malavalia9083012010-04-12 17:59:55 -0700187 if (IS_QLA82XX(ha)) {
188 if (RD_REG_DWORD(&reg->isp82.hint) &
189 HINT_MBX_INT_PENDING) {
190 spin_unlock_irqrestore(&ha->hardware_lock,
191 flags);
Giridhar Malavali8937f2f2011-11-18 09:02:18 -0800192 ha->flags.mbox_busy = 0;
Arun Easi5e19ed92012-02-09 11:15:51 -0800193 ql_dbg(ql_dbg_mbx, vha, 0x1012,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700194 "Pending mailbox timeout, exiting.\n");
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700195 rval = QLA_FUNCTION_TIMEOUT;
196 goto premature_exit;
Giridhar Malavalia9083012010-04-12 17:59:55 -0700197 }
198 WRT_REG_DWORD(&reg->isp82.hint, HINT_MBX_INT_PENDING);
199 } else if (IS_FWI2_CAPABLE(ha))
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700200 WRT_REG_DWORD(&reg->isp24.hccr, HCCRX_SET_HOST_INT);
201 else
202 WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 spin_unlock_irqrestore(&ha->hardware_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204
205 wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */
206 while (!ha->flags.mbox_int) {
207 if (time_after(jiffies, wait_time))
208 break;
209
210 /* Check for pending interrupts. */
Anirban Chakraborty73208df2008-12-09 16:45:39 -0800211 qla2x00_poll(ha->rsp_q_map[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212
Andrew Vasquez85880802009-12-15 21:29:46 -0800213 if (!ha->flags.mbox_int &&
214 !(IS_QLA2200(ha) &&
215 command == MBC_LOAD_RISC_RAM_EXTENDED))
andrew.vasquez@qlogic.com59989832006-01-13 17:05:10 -0800216 msleep(10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217 } /* while */
Arun Easi5e19ed92012-02-09 11:15:51 -0800218 ql_dbg(ql_dbg_mbx, vha, 0x1013,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700219 "Waited %d sec.\n",
220 (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 }
222
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 /* Check whether we timed out */
224 if (ha->flags.mbox_int) {
225 uint16_t *iptr2;
226
Arun Easi5e19ed92012-02-09 11:15:51 -0800227 ql_dbg(ql_dbg_mbx, vha, 0x1014,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700228 "Cmd=%x completed.\n", command);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229
230 /* Got interrupt. Clear the flag. */
231 ha->flags.mbox_int = 0;
232 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
233
Giridhar Malavali71905752011-02-23 15:27:10 -0800234 if (ha->flags.isp82xx_fw_hung) {
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700235 ha->flags.mbox_busy = 0;
236 /* Setting Link-Down error */
237 mcp->mb[0] = MBS_LINK_DOWN_ERROR;
238 ha->mcp = NULL;
239 rval = QLA_FUNCTION_FAILED;
Arun Easi5e19ed92012-02-09 11:15:51 -0800240 ql_log(ql_log_warn, vha, 0x1015,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700241 "FW hung = %d.\n", ha->flags.isp82xx_fw_hung);
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700242 goto premature_exit;
243 }
244
Andrew Vasquez 354d6b22005-04-23 02:47:27 -0400245 if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246 rval = QLA_FUNCTION_FAILED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247
248 /* Load return mailbox registers. */
249 iptr2 = mcp->mb;
250 iptr = (uint16_t *)&ha->mailbox_out[0];
251 mboxes = mcp->in_mb;
252 for (cnt = 0; cnt < ha->mbx_count; cnt++) {
253 if (mboxes & BIT_0)
254 *iptr2 = *iptr;
255
256 mboxes >>= 1;
257 iptr2++;
258 iptr++;
259 }
260 } else {
261
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700262 uint16_t mb0;
263 uint32_t ictrl;
264
Andrew Vasqueze4289242007-07-19 15:05:56 -0700265 if (IS_FWI2_CAPABLE(ha)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700266 mb0 = RD_REG_WORD(&reg->isp24.mailbox0);
267 ictrl = RD_REG_DWORD(&reg->isp24.ictrl);
268 } else {
Andrew Vasquezcca53352005-08-26 19:08:30 -0700269 mb0 = RD_MAILBOX_REG(ha, &reg->isp, 0);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700270 ictrl = RD_REG_WORD(&reg->isp.ictrl);
271 }
Arun Easi5e19ed92012-02-09 11:15:51 -0800272 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1119,
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400273 "MBX Command timeout for cmd %x, iocontrol=%x jiffies=%lx "
274 "mb[0]=0x%x\n", command, ictrl, jiffies, mb0);
Arun Easi5e19ed92012-02-09 11:15:51 -0800275 ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1019);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276
Chad Dupuisf55bfc82012-02-09 11:15:53 -0800277 /*
278 * Attempt to capture a firmware dump for further analysis
279 * of the current firmware state
280 */
281 ha->isp_ops->fw_dump(vha, 0);
282
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283 rval = QLA_FUNCTION_TIMEOUT;
284 }
285
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 ha->flags.mbox_busy = 0;
287
288 /* Clean up */
289 ha->mcp = NULL;
290
Andrew Vasquez124f85e2009-01-05 11:18:06 -0800291 if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) {
Arun Easi5e19ed92012-02-09 11:15:51 -0800292 ql_dbg(ql_dbg_mbx, vha, 0x101a,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700293 "Checking for additional resp interrupt.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294
295 /* polling mode for non isp_abort commands. */
Anirban Chakraborty73208df2008-12-09 16:45:39 -0800296 qla2x00_poll(ha->rsp_q_map[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297 }
298
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700299 if (rval == QLA_FUNCTION_TIMEOUT &&
300 mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) {
Andrew Vasquez85880802009-12-15 21:29:46 -0800301 if (!io_lock_on || (mcp->flags & IOCTL_CMD) ||
302 ha->flags.eeh_busy) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303 /* not in dpc. schedule it for dpc to take over. */
Arun Easi5e19ed92012-02-09 11:15:51 -0800304 ql_dbg(ql_dbg_mbx, vha, 0x101b,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700305 "Timeout, schedule isp_abort_needed.\n");
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700306
307 if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) &&
308 !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
309 !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
Giridhar Malavali63154912011-11-18 09:02:19 -0800310 if (IS_QLA82XX(ha)) {
311 ql_dbg(ql_dbg_mbx, vha, 0x112a,
312 "disabling pause transmit on port "
313 "0 & 1.\n");
314 qla82xx_wr_32(ha,
315 QLA82XX_CRB_NIU + 0x98,
316 CRB_NIU_XG_PAUSE_CTL_P0|
317 CRB_NIU_XG_PAUSE_CTL_P1);
318 }
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700319 ql_log(ql_log_info, base_vha, 0x101c,
Masanari Iida24d9ee82012-05-15 14:34:10 -0400320 "Mailbox cmd timeout occurred, cmd=0x%x, "
Chad Dupuisd8c0d542012-02-09 11:15:46 -0800321 "mb[0]=0x%x, eeh_busy=0x%x. Scheduling ISP "
322 "abort.\n", command, mcp->mb[0],
323 ha->flags.eeh_busy);
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700324 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
325 qla2xxx_wake_dpc(vha);
326 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 } else if (!abort_active) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328 /* call abort directly since we are in the DPC thread */
Arun Easi5e19ed92012-02-09 11:15:51 -0800329 ql_dbg(ql_dbg_mbx, vha, 0x101d,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700330 "Timeout, calling abort_isp.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700332 if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) &&
333 !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
334 !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
Giridhar Malavali63154912011-11-18 09:02:19 -0800335 if (IS_QLA82XX(ha)) {
336 ql_dbg(ql_dbg_mbx, vha, 0x112b,
337 "disabling pause transmit on port "
338 "0 & 1.\n");
339 qla82xx_wr_32(ha,
340 QLA82XX_CRB_NIU + 0x98,
341 CRB_NIU_XG_PAUSE_CTL_P0|
342 CRB_NIU_XG_PAUSE_CTL_P1);
343 }
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700344 ql_log(ql_log_info, base_vha, 0x101e,
Masanari Iida24d9ee82012-05-15 14:34:10 -0400345 "Mailbox cmd timeout occurred, cmd=0x%x, "
Chad Dupuisd8c0d542012-02-09 11:15:46 -0800346 "mb[0]=0x%x. Scheduling ISP abort ",
347 command, mcp->mb[0]);
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700348 set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
349 clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
Giridhar Malavalid3360962012-02-09 11:14:10 -0800350 /* Allow next mbx cmd to come in. */
351 complete(&ha->mbx_cmd_comp);
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700352 if (ha->isp_ops->abort_isp(vha)) {
353 /* Failed. retry later. */
354 set_bit(ISP_ABORT_NEEDED,
355 &vha->dpc_flags);
356 }
357 clear_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
Arun Easi5e19ed92012-02-09 11:15:51 -0800358 ql_dbg(ql_dbg_mbx, vha, 0x101f,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700359 "Finished abort_isp.\n");
Giridhar Malavalid3360962012-02-09 11:14:10 -0800360 goto mbx_done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362 }
363 }
364
Santosh Vernekarcdbb0a4f2010-05-28 15:08:25 -0700365premature_exit:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 /* Allow next mbx cmd to come in. */
Andrew Vasquez8eca3f32009-01-22 09:45:31 -0800367 complete(&ha->mbx_cmd_comp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368
Giridhar Malavalid3360962012-02-09 11:14:10 -0800369mbx_done:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 if (rval) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700371 ql_dbg(ql_dbg_mbx, base_vha, 0x1020,
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800372 "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n",
373 mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 } else {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700375 ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376 }
377
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 return rval;
379}
380
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800382qla2x00_load_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t risc_addr,
andrew.vasquez@qlogic.com590f98e2006-01-13 17:05:37 -0800383 uint32_t risc_code_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384{
385 int rval;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800386 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 mbx_cmd_t mc;
388 mbx_cmd_t *mcp = &mc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400390 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1022,
391 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Andrew Vasqueze4289242007-07-19 15:05:56 -0700393 if (MSW(risc_addr) || IS_FWI2_CAPABLE(ha)) {
andrew.vasquez@qlogic.com590f98e2006-01-13 17:05:37 -0800394 mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
395 mcp->mb[8] = MSW(risc_addr);
396 mcp->out_mb = MBX_8|MBX_0;
397 } else {
398 mcp->mb[0] = MBC_LOAD_RISC_RAM;
399 mcp->out_mb = MBX_0;
400 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 mcp->mb[1] = LSW(risc_addr);
402 mcp->mb[2] = MSW(req_dma);
403 mcp->mb[3] = LSW(req_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 mcp->mb[6] = MSW(MSD(req_dma));
405 mcp->mb[7] = LSW(MSD(req_dma));
andrew.vasquez@qlogic.com590f98e2006-01-13 17:05:37 -0800406 mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1;
Andrew Vasqueze4289242007-07-19 15:05:56 -0700407 if (IS_FWI2_CAPABLE(ha)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700408 mcp->mb[4] = MSW(risc_code_size);
409 mcp->mb[5] = LSW(risc_code_size);
410 mcp->out_mb |= MBX_5|MBX_4;
411 } else {
412 mcp->mb[4] = LSW(risc_code_size);
413 mcp->out_mb |= MBX_4;
414 }
415
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -0700417 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800419 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700422 ql_dbg(ql_dbg_mbx, vha, 0x1023,
423 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400425 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1024,
426 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 }
428
429 return rval;
430}
431
Santosh Vernekarcad454b2010-03-19 16:59:16 -0700432#define EXTENDED_BB_CREDITS BIT_0
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433/*
434 * qla2x00_execute_fw
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700435 * Start adapter firmware.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436 *
437 * Input:
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700438 * ha = adapter block pointer.
439 * TARGET_QUEUE_LOCK must be released.
440 * ADAPTER_STATE_LOCK must be released.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 *
442 * Returns:
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700443 * qla2x00 local function return status code.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 *
445 * Context:
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700446 * Kernel context.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 */
448int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800449qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450{
451 int rval;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800452 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 mbx_cmd_t mc;
454 mbx_cmd_t *mcp = &mc;
455
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400456 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1025,
457 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458
459 mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700460 mcp->out_mb = MBX_0;
461 mcp->in_mb = MBX_0;
Andrew Vasqueze4289242007-07-19 15:05:56 -0700462 if (IS_FWI2_CAPABLE(ha)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700463 mcp->mb[1] = MSW(risc_addr);
464 mcp->mb[2] = LSW(risc_addr);
465 mcp->mb[3] = 0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800466 if (IS_QLA81XX(ha) || IS_QLA83XX(ha)) {
Santosh Vernekarcad454b2010-03-19 16:59:16 -0700467 struct nvram_81xx *nv = ha->nvram;
468 mcp->mb[4] = (nv->enhanced_features &
469 EXTENDED_BB_CREDITS);
470 } else
471 mcp->mb[4] = 0;
Andrew Vasquez8b3253d2007-09-20 14:07:48 -0700472 mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700473 mcp->in_mb |= MBX_1;
474 } else {
475 mcp->mb[1] = LSW(risc_addr);
476 mcp->out_mb |= MBX_1;
477 if (IS_QLA2322(ha) || IS_QLA6322(ha)) {
478 mcp->mb[2] = 0;
479 mcp->out_mb |= MBX_2;
480 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481 }
482
Ravi Anandb93480e2008-04-03 13:13:25 -0700483 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800485 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700487 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700488 ql_dbg(ql_dbg_mbx, vha, 0x1026,
489 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700490 } else {
Andrew Vasqueze4289242007-07-19 15:05:56 -0700491 if (IS_FWI2_CAPABLE(ha)) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400492 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1027,
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700493 "Done exchanges=%x.\n", mcp->mb[1]);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700494 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400495 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1028,
496 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700497 }
498 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499
500 return rval;
501}
502
503/*
504 * qla2x00_get_fw_version
505 * Get firmware version.
506 *
507 * Input:
508 * ha: adapter state pointer.
509 * major: pointer for major number.
510 * minor: pointer for minor number.
511 * subminor: pointer for subminor number.
512 *
513 * Returns:
514 * qla2x00 local function return status code.
515 *
516 * Context:
517 * Kernel context.
518 */
Andrew Vasquezca9e9c32009-06-03 09:55:20 -0700519int
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800520qla2x00_get_fw_version(scsi_qla_host_t *vha)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521{
522 int rval;
523 mbx_cmd_t mc;
524 mbx_cmd_t *mcp = &mc;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800525 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400527 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1029,
528 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529
530 mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
531 mcp->out_mb = MBX_0;
532 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800533 if (IS_QLA81XX(vha->hw) || IS_QLA8031(ha))
Andrew Vasquez55a96152009-03-24 09:08:03 -0700534 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800535 if (IS_QLA83XX(vha->hw))
536 mcp->in_mb |= MBX_17|MBX_16|MBX_15;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 mcp->flags = 0;
Ravi Anandb93480e2008-04-03 13:13:25 -0700538 mcp->tov = MBX_TOV_SECONDS;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800539 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquezca9e9c32009-06-03 09:55:20 -0700540 if (rval != QLA_SUCCESS)
541 goto failed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542
543 /* Return mailbox data. */
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800544 ha->fw_major_version = mcp->mb[1];
545 ha->fw_minor_version = mcp->mb[2];
546 ha->fw_subminor_version = mcp->mb[3];
547 ha->fw_attributes = mcp->mb[6];
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800548 if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw))
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800549 ha->fw_memory_size = 0x1FFFF; /* Defaults to 128KB. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 else
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800551 ha->fw_memory_size = (mcp->mb[5] << 16) | mcp->mb[4];
552 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw)) {
553 ha->mpi_version[0] = mcp->mb[10] & 0xff;
554 ha->mpi_version[1] = mcp->mb[11] >> 8;
555 ha->mpi_version[2] = mcp->mb[11] & 0xff;
556 ha->mpi_capabilities = (mcp->mb[12] << 16) | mcp->mb[13];
557 ha->phy_version[0] = mcp->mb[8] & 0xff;
558 ha->phy_version[1] = mcp->mb[9] >> 8;
559 ha->phy_version[2] = mcp->mb[9] & 0xff;
Andrew Vasquez3a03eb72009-01-05 11:18:11 -0800560 }
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800561 if (IS_QLA83XX(ha)) {
562 if (mcp->mb[6] & BIT_15) {
563 ha->fw_attributes_h = mcp->mb[15];
564 ha->fw_attributes_ext[0] = mcp->mb[16];
565 ha->fw_attributes_ext[1] = mcp->mb[17];
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400566 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1139,
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800567 "%s: FW_attributes Upper: 0x%x, Lower: 0x%x.\n",
568 __func__, mcp->mb[15], mcp->mb[6]);
569 } else
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400570 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x112f,
Giridhar Malavali6246b8a2012-02-09 11:15:34 -0800571 "%s: FwAttributes [Upper] invalid, MB6:%04x\n",
572 __func__, mcp->mb[6]);
573 }
574
Andrew Vasquezca9e9c32009-06-03 09:55:20 -0700575failed:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 if (rval != QLA_SUCCESS) {
577 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700578 ql_dbg(ql_dbg_mbx, vha, 0x102a, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 } else {
580 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400581 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102b,
582 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583 }
Andrew Vasquezca9e9c32009-06-03 09:55:20 -0700584 return rval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585}
586
587/*
588 * qla2x00_get_fw_options
589 * Set firmware options.
590 *
591 * Input:
592 * ha = adapter block pointer.
593 * fwopt = pointer for firmware options.
594 *
595 * Returns:
596 * qla2x00 local function return status code.
597 *
598 * Context:
599 * Kernel context.
600 */
601int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800602qla2x00_get_fw_options(scsi_qla_host_t *vha, uint16_t *fwopts)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603{
604 int rval;
605 mbx_cmd_t mc;
606 mbx_cmd_t *mcp = &mc;
607
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400608 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102c,
609 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610
611 mcp->mb[0] = MBC_GET_FIRMWARE_OPTION;
612 mcp->out_mb = MBX_0;
613 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -0700614 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800616 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617
618 if (rval != QLA_SUCCESS) {
619 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700620 ql_dbg(ql_dbg_mbx, vha, 0x102d, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 } else {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700622 fwopts[0] = mcp->mb[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 fwopts[1] = mcp->mb[1];
624 fwopts[2] = mcp->mb[2];
625 fwopts[3] = mcp->mb[3];
626
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400627 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102e,
628 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 }
630
631 return rval;
632}
633
634
635/*
636 * qla2x00_set_fw_options
637 * Set firmware options.
638 *
639 * Input:
640 * ha = adapter block pointer.
641 * fwopt = pointer for firmware options.
642 *
643 * Returns:
644 * qla2x00 local function return status code.
645 *
646 * Context:
647 * Kernel context.
648 */
649int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800650qla2x00_set_fw_options(scsi_qla_host_t *vha, uint16_t *fwopts)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651{
652 int rval;
653 mbx_cmd_t mc;
654 mbx_cmd_t *mcp = &mc;
655
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400656 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x102f,
657 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658
659 mcp->mb[0] = MBC_SET_FIRMWARE_OPTION;
660 mcp->mb[1] = fwopts[1];
661 mcp->mb[2] = fwopts[2];
662 mcp->mb[3] = fwopts[3];
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700663 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 mcp->in_mb = MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800665 if (IS_FWI2_CAPABLE(vha->hw)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700666 mcp->in_mb |= MBX_1;
667 } else {
668 mcp->mb[10] = fwopts[10];
669 mcp->mb[11] = fwopts[11];
670 mcp->mb[12] = 0; /* Undocumented, but used */
671 mcp->out_mb |= MBX_12|MBX_11|MBX_10;
672 }
Ravi Anandb93480e2008-04-03 13:13:25 -0700673 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800675 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700677 fwopts[0] = mcp->mb[0];
678
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 if (rval != QLA_SUCCESS) {
680 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700681 ql_dbg(ql_dbg_mbx, vha, 0x1030,
682 "Failed=%x (%x/%x).\n", rval, mcp->mb[0], mcp->mb[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 } else {
684 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400685 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1031,
686 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687 }
688
689 return rval;
690}
691
692/*
693 * qla2x00_mbx_reg_test
694 * Mailbox register wrap test.
695 *
696 * Input:
697 * ha = adapter block pointer.
698 * TARGET_QUEUE_LOCK must be released.
699 * ADAPTER_STATE_LOCK must be released.
700 *
701 * Returns:
702 * qla2x00 local function return status code.
703 *
704 * Context:
705 * Kernel context.
706 */
707int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800708qla2x00_mbx_reg_test(scsi_qla_host_t *vha)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709{
710 int rval;
711 mbx_cmd_t mc;
712 mbx_cmd_t *mcp = &mc;
713
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400714 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1032,
715 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716
717 mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
718 mcp->mb[1] = 0xAAAA;
719 mcp->mb[2] = 0x5555;
720 mcp->mb[3] = 0xAA55;
721 mcp->mb[4] = 0x55AA;
722 mcp->mb[5] = 0xA5A5;
723 mcp->mb[6] = 0x5A5A;
724 mcp->mb[7] = 0x2525;
725 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
726 mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -0700727 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800729 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730
731 if (rval == QLA_SUCCESS) {
732 if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
733 mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA)
734 rval = QLA_FUNCTION_FAILED;
735 if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
736 mcp->mb[7] != 0x2525)
737 rval = QLA_FUNCTION_FAILED;
738 }
739
740 if (rval != QLA_SUCCESS) {
741 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700742 ql_dbg(ql_dbg_mbx, vha, 0x1033, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 } else {
744 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400745 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1034,
746 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 }
748
749 return rval;
750}
751
752/*
753 * qla2x00_verify_checksum
754 * Verify firmware checksum.
755 *
756 * Input:
757 * ha = adapter block pointer.
758 * TARGET_QUEUE_LOCK must be released.
759 * ADAPTER_STATE_LOCK must be released.
760 *
761 * Returns:
762 * qla2x00 local function return status code.
763 *
764 * Context:
765 * Kernel context.
766 */
767int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800768qla2x00_verify_checksum(scsi_qla_host_t *vha, uint32_t risc_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769{
770 int rval;
771 mbx_cmd_t mc;
772 mbx_cmd_t *mcp = &mc;
773
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400774 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1035,
775 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776
777 mcp->mb[0] = MBC_VERIFY_CHECKSUM;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700778 mcp->out_mb = MBX_0;
779 mcp->in_mb = MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800780 if (IS_FWI2_CAPABLE(vha->hw)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -0700781 mcp->mb[1] = MSW(risc_addr);
782 mcp->mb[2] = LSW(risc_addr);
783 mcp->out_mb |= MBX_2|MBX_1;
784 mcp->in_mb |= MBX_2|MBX_1;
785 } else {
786 mcp->mb[1] = LSW(risc_addr);
787 mcp->out_mb |= MBX_1;
788 mcp->in_mb |= MBX_1;
789 }
790
Ravi Anandb93480e2008-04-03 13:13:25 -0700791 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800793 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794
795 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700796 ql_dbg(ql_dbg_mbx, vha, 0x1036,
797 "Failed=%x chm sum=%x.\n", rval, IS_FWI2_CAPABLE(vha->hw) ?
798 (mcp->mb[2] << 16) | mcp->mb[1] : mcp->mb[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400800 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1037,
801 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 }
803
804 return rval;
805}
806
807/*
808 * qla2x00_issue_iocb
809 * Issue IOCB using mailbox command
810 *
811 * Input:
812 * ha = adapter state pointer.
813 * buffer = buffer pointer.
814 * phys_addr = physical address of buffer.
815 * size = size of buffer.
816 * TARGET_QUEUE_LOCK must be released.
817 * ADAPTER_STATE_LOCK must be released.
818 *
819 * Returns:
820 * qla2x00 local function return status code.
821 *
822 * Context:
823 * Kernel context.
824 */
Giridhar Malavali6e980162010-03-19 17:03:58 -0700825int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800826qla2x00_issue_iocb_timeout(scsi_qla_host_t *vha, void *buffer,
Harihara Kadayam4d4df192008-04-03 13:13:26 -0700827 dma_addr_t phys_addr, size_t size, uint32_t tov)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828{
829 int rval;
830 mbx_cmd_t mc;
831 mbx_cmd_t *mcp = &mc;
832
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400833 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1038,
834 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700835
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836 mcp->mb[0] = MBC_IOCB_COMMAND_A64;
837 mcp->mb[1] = 0;
838 mcp->mb[2] = MSW(phys_addr);
839 mcp->mb[3] = LSW(phys_addr);
840 mcp->mb[6] = MSW(MSD(phys_addr));
841 mcp->mb[7] = LSW(MSD(phys_addr));
842 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
843 mcp->in_mb = MBX_2|MBX_0;
Harihara Kadayam4d4df192008-04-03 13:13:26 -0700844 mcp->tov = tov;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800846 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847
848 if (rval != QLA_SUCCESS) {
849 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700850 ql_dbg(ql_dbg_mbx, vha, 0x1039, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 } else {
Andrew Vasquez8c958a92005-07-06 10:30:47 -0700852 sts_entry_t *sts_entry = (sts_entry_t *) buffer;
853
854 /* Mask reserved bits. */
855 sts_entry->entry_status &=
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800856 IS_FWI2_CAPABLE(vha->hw) ? RF_MASK_24XX : RF_MASK;
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400857 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103a,
858 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 }
860
861 return rval;
862}
863
Harihara Kadayam4d4df192008-04-03 13:13:26 -0700864int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800865qla2x00_issue_iocb(scsi_qla_host_t *vha, void *buffer, dma_addr_t phys_addr,
Harihara Kadayam4d4df192008-04-03 13:13:26 -0700866 size_t size)
867{
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800868 return qla2x00_issue_iocb_timeout(vha, buffer, phys_addr, size,
Harihara Kadayam4d4df192008-04-03 13:13:26 -0700869 MBX_TOV_SECONDS);
870}
871
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872/*
873 * qla2x00_abort_command
874 * Abort command aborts a specified IOCB.
875 *
876 * Input:
877 * ha = adapter block pointer.
878 * sp = SB structure pointer.
879 *
880 * Returns:
881 * qla2x00 local function return status code.
882 *
883 * Context:
884 * Kernel context.
885 */
886int
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -0700887qla2x00_abort_command(srb_t *sp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888{
889 unsigned long flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890 int rval;
Anirban Chakraborty73208df2008-12-09 16:45:39 -0800891 uint32_t handle = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 mbx_cmd_t mc;
893 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -0700894 fc_port_t *fcport = sp->fcport;
895 scsi_qla_host_t *vha = fcport->vha;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800896 struct qla_hw_data *ha = vha->hw;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -0700897 struct req_que *req = vha->req;
Giridhar Malavali9ba56b92012-02-09 11:15:36 -0800898 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400900 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103b,
901 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902
Andrew Vasquezc9c5ced2008-07-24 08:31:49 -0700903 spin_lock_irqsave(&ha->hardware_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800905 if (req->outstanding_cmds[handle] == sp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 break;
907 }
Andrew Vasquezc9c5ced2008-07-24 08:31:49 -0700908 spin_unlock_irqrestore(&ha->hardware_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909
910 if (handle == MAX_OUTSTANDING_COMMANDS) {
911 /* command not found */
912 return QLA_FUNCTION_FAILED;
913 }
914
915 mcp->mb[0] = MBC_ABORT_COMMAND;
916 if (HAS_EXTENDED_IDS(ha))
917 mcp->mb[1] = fcport->loop_id;
918 else
919 mcp->mb[1] = fcport->loop_id << 8;
920 mcp->mb[2] = (uint16_t)handle;
921 mcp->mb[3] = (uint16_t)(handle >> 16);
Giridhar Malavali9ba56b92012-02-09 11:15:36 -0800922 mcp->mb[6] = (uint16_t)cmd->device->lun;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
924 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -0700925 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800927 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928
929 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700930 ql_dbg(ql_dbg_mbx, vha, 0x103c, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400932 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103d,
933 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934 }
935
936 return rval;
937}
938
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939int
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -0700940qla2x00_abort_target(struct fc_port *fcport, unsigned int l, int tag)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941{
Andrew Vasquez523ec772008-04-03 13:13:24 -0700942 int rval, rval2;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 mbx_cmd_t mc;
944 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800945 scsi_qla_host_t *vha;
Anirban Chakraborty73208df2008-12-09 16:45:39 -0800946 struct req_que *req;
947 struct rsp_que *rsp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948
Andrew Vasquez523ec772008-04-03 13:13:24 -0700949 l = l;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800950 vha = fcport->vha;
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700951
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400952 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103e,
953 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700954
Giridhar Malavali7e2b8952010-05-28 15:08:17 -0700955 req = vha->hw->req_q_map[0];
956 rsp = req->rsp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 mcp->mb[0] = MBC_ABORT_TARGET;
Andrew Vasquez523ec772008-04-03 13:13:24 -0700958 mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800959 if (HAS_EXTENDED_IDS(vha->hw)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960 mcp->mb[1] = fcport->loop_id;
961 mcp->mb[10] = 0;
962 mcp->out_mb |= MBX_10;
963 } else {
964 mcp->mb[1] = fcport->loop_id << 8;
965 }
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800966 mcp->mb[2] = vha->hw->loop_reset_delay;
967 mcp->mb[9] = vha->vp_idx;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700968
969 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -0700970 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800972 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 if (rval != QLA_SUCCESS) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400974 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103f,
975 "Failed=%x.\n", rval);
Andrew Vasquez523ec772008-04-03 13:13:24 -0700976 }
977
978 /* Issue marker IOCB. */
Anirban Chakraborty73208df2008-12-09 16:45:39 -0800979 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, 0,
980 MK_SYNC_ID);
Andrew Vasquez523ec772008-04-03 13:13:24 -0700981 if (rval2 != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -0700982 ql_dbg(ql_dbg_mbx, vha, 0x1040,
983 "Failed to issue marker IOCB (%x).\n", rval2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -0400985 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1041,
986 "Done %s.\n", __func__);
Andrew Vasquez523ec772008-04-03 13:13:24 -0700987 }
988
989 return rval;
990}
991
992int
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -0700993qla2x00_lun_reset(struct fc_port *fcport, unsigned int l, int tag)
Andrew Vasquez523ec772008-04-03 13:13:24 -0700994{
995 int rval, rval2;
996 mbx_cmd_t mc;
997 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -0800998 scsi_qla_host_t *vha;
Anirban Chakraborty73208df2008-12-09 16:45:39 -0800999 struct req_que *req;
1000 struct rsp_que *rsp;
Andrew Vasquez523ec772008-04-03 13:13:24 -07001001
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001002 vha = fcport->vha;
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001003
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001004 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1042,
1005 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001006
Giridhar Malavali7e2b8952010-05-28 15:08:17 -07001007 req = vha->hw->req_q_map[0];
1008 rsp = req->rsp;
Andrew Vasquez523ec772008-04-03 13:13:24 -07001009 mcp->mb[0] = MBC_LUN_RESET;
1010 mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001011 if (HAS_EXTENDED_IDS(vha->hw))
Andrew Vasquez523ec772008-04-03 13:13:24 -07001012 mcp->mb[1] = fcport->loop_id;
1013 else
1014 mcp->mb[1] = fcport->loop_id << 8;
1015 mcp->mb[2] = l;
1016 mcp->mb[3] = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001017 mcp->mb[9] = vha->vp_idx;
Andrew Vasquez523ec772008-04-03 13:13:24 -07001018
1019 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07001020 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquez523ec772008-04-03 13:13:24 -07001021 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001022 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquez523ec772008-04-03 13:13:24 -07001023 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001024 ql_dbg(ql_dbg_mbx, vha, 0x1043, "Failed=%x.\n", rval);
Andrew Vasquez523ec772008-04-03 13:13:24 -07001025 }
1026
1027 /* Issue marker IOCB. */
Anirban Chakraborty73208df2008-12-09 16:45:39 -08001028 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l,
1029 MK_SYNC_ID_LUN);
Andrew Vasquez523ec772008-04-03 13:13:24 -07001030 if (rval2 != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001031 ql_dbg(ql_dbg_mbx, vha, 0x1044,
1032 "Failed to issue marker IOCB (%x).\n", rval2);
Andrew Vasquez523ec772008-04-03 13:13:24 -07001033 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001034 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1045,
1035 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 }
1037
1038 return rval;
1039}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040
1041/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042 * qla2x00_get_adapter_id
1043 * Get adapter ID and topology.
1044 *
1045 * Input:
1046 * ha = adapter block pointer.
1047 * id = pointer for loop ID.
1048 * al_pa = pointer for AL_PA.
1049 * area = pointer for area.
1050 * domain = pointer for domain.
1051 * top = pointer for topology.
1052 * TARGET_QUEUE_LOCK must be released.
1053 * ADAPTER_STATE_LOCK must be released.
1054 *
1055 * Returns:
1056 * qla2x00 local function return status code.
1057 *
1058 * Context:
1059 * Kernel context.
1060 */
1061int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001062qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07001063 uint8_t *area, uint8_t *domain, uint16_t *top, uint16_t *sw_cap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064{
1065 int rval;
1066 mbx_cmd_t mc;
1067 mbx_cmd_t *mcp = &mc;
1068
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001069 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1046,
1070 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071
1072 mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001073 mcp->mb[9] = vha->vp_idx;
Andrew Vasquezeb66dc62007-11-12 10:30:58 -08001074 mcp->out_mb = MBX_9|MBX_0;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07001075 mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08001076 if (IS_CNA_CAPABLE(vha->hw))
Andrew Vasquezbad70012009-04-06 22:33:38 -07001077 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
Ravi Anandb93480e2008-04-03 13:13:25 -07001078 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001080 rval = qla2x00_mailbox_command(vha, mcp);
Ravi Anand33135aa2005-11-08 14:37:20 -08001081 if (mcp->mb[0] == MBS_COMMAND_ERROR)
1082 rval = QLA_COMMAND_ERROR;
Andrew Vasquez42e421b2008-07-10 16:56:01 -07001083 else if (mcp->mb[0] == MBS_INVALID_COMMAND)
1084 rval = QLA_INVALID_COMMAND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085
1086 /* Return data. */
1087 *id = mcp->mb[1];
1088 *al_pa = LSB(mcp->mb[2]);
1089 *area = MSB(mcp->mb[2]);
1090 *domain = LSB(mcp->mb[3]);
1091 *top = mcp->mb[6];
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07001092 *sw_cap = mcp->mb[7];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093
1094 if (rval != QLA_SUCCESS) {
1095 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001096 ql_dbg(ql_dbg_mbx, vha, 0x1047, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001098 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1048,
1099 "Done %s.\n", __func__);
Andrew Vasquezbad70012009-04-06 22:33:38 -07001100
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08001101 if (IS_CNA_CAPABLE(vha->hw)) {
Andrew Vasquezbad70012009-04-06 22:33:38 -07001102 vha->fcoe_vlan_id = mcp->mb[9] & 0xfff;
1103 vha->fcoe_fcf_idx = mcp->mb[10];
1104 vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8;
1105 vha->fcoe_vn_port_mac[4] = mcp->mb[11] & 0xff;
1106 vha->fcoe_vn_port_mac[3] = mcp->mb[12] >> 8;
1107 vha->fcoe_vn_port_mac[2] = mcp->mb[12] & 0xff;
1108 vha->fcoe_vn_port_mac[1] = mcp->mb[13] >> 8;
1109 vha->fcoe_vn_port_mac[0] = mcp->mb[13] & 0xff;
1110 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 }
1112
1113 return rval;
1114}
1115
1116/*
1117 * qla2x00_get_retry_cnt
1118 * Get current firmware login retry count and delay.
1119 *
1120 * Input:
1121 * ha = adapter block pointer.
1122 * retry_cnt = pointer to login retry count.
1123 * tov = pointer to login timeout value.
1124 *
1125 * Returns:
1126 * qla2x00 local function return status code.
1127 *
1128 * Context:
1129 * Kernel context.
1130 */
1131int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001132qla2x00_get_retry_cnt(scsi_qla_host_t *vha, uint8_t *retry_cnt, uint8_t *tov,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 uint16_t *r_a_tov)
1134{
1135 int rval;
1136 uint16_t ratov;
1137 mbx_cmd_t mc;
1138 mbx_cmd_t *mcp = &mc;
1139
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001140 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1049,
1141 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142
1143 mcp->mb[0] = MBC_GET_RETRY_COUNT;
1144 mcp->out_mb = MBX_0;
1145 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07001146 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001148 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149
1150 if (rval != QLA_SUCCESS) {
1151 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001152 ql_dbg(ql_dbg_mbx, vha, 0x104a,
1153 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 } else {
1155 /* Convert returned data and check our values. */
1156 *r_a_tov = mcp->mb[3] / 2;
1157 ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */
1158 if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) {
1159 /* Update to the larger values */
1160 *retry_cnt = (uint8_t)mcp->mb[1];
1161 *tov = ratov;
1162 }
1163
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001164 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104b,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001165 "Done %s mb3=%d ratov=%d.\n", __func__, mcp->mb[3], ratov);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166 }
1167
1168 return rval;
1169}
1170
1171/*
1172 * qla2x00_init_firmware
1173 * Initialize adapter firmware.
1174 *
1175 * Input:
1176 * ha = adapter block pointer.
1177 * dptr = Initialization control block pointer.
1178 * size = size of initialization control block.
1179 * TARGET_QUEUE_LOCK must be released.
1180 * ADAPTER_STATE_LOCK must be released.
1181 *
1182 * Returns:
1183 * qla2x00 local function return status code.
1184 *
1185 * Context:
1186 * Kernel context.
1187 */
1188int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001189qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190{
1191 int rval;
1192 mbx_cmd_t mc;
1193 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001194 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001196 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104c,
1197 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198
Giridhar Malavalia9083012010-04-12 17:59:55 -07001199 if (IS_QLA82XX(ha) && ql2xdbwr)
1200 qla82xx_wr_32(ha, ha->nxdb_wr_ptr,
1201 (0x04 | (ha->portnum << 5) | (0 << 8) | (0 << 16)));
1202
Andrew Vasqueze6e074f2008-01-31 12:33:53 -08001203 if (ha->flags.npiv_supported)
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07001204 mcp->mb[0] = MBC_MID_INITIALIZE_FIRMWARE;
1205 else
1206 mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
1207
Andrew Vasquezb64b0e82009-03-24 09:08:01 -07001208 mcp->mb[1] = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 mcp->mb[2] = MSW(ha->init_cb_dma);
1210 mcp->mb[3] = LSW(ha->init_cb_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
1212 mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
Andrew Vasquezb64b0e82009-03-24 09:08:01 -07001213 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08001214 if ((IS_QLA81XX(ha) || IS_QLA83XX(ha)) && ha->ex_init_cb->ex_version) {
Andrew Vasquezb64b0e82009-03-24 09:08:01 -07001215 mcp->mb[1] = BIT_0;
1216 mcp->mb[10] = MSW(ha->ex_init_cb_dma);
1217 mcp->mb[11] = LSW(ha->ex_init_cb_dma);
1218 mcp->mb[12] = MSW(MSD(ha->ex_init_cb_dma));
1219 mcp->mb[13] = LSW(MSD(ha->ex_init_cb_dma));
1220 mcp->mb[14] = sizeof(*ha->ex_init_cb);
1221 mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10;
1222 }
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08001223 /* 1 and 2 should normally be captured. */
1224 mcp->in_mb = MBX_2|MBX_1|MBX_0;
1225 if (IS_QLA83XX(ha))
1226 /* mb3 is additional info about the installed SFP. */
1227 mcp->in_mb |= MBX_3;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 mcp->buf_size = size;
1229 mcp->flags = MBX_DMA_OUT;
Ravi Anandb93480e2008-04-03 13:13:25 -07001230 mcp->tov = MBX_TOV_SECONDS;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001231 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232
1233 if (rval != QLA_SUCCESS) {
1234 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001235 ql_dbg(ql_dbg_mbx, vha, 0x104d,
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08001236 "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x,.\n",
1237 rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 } else {
1239 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001240 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104e,
1241 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242 }
1243
1244 return rval;
1245}
1246
1247/*
1248 * qla2x00_get_port_database
1249 * Issue normal/enhanced get port database mailbox command
1250 * and copy device name as necessary.
1251 *
1252 * Input:
1253 * ha = adapter state pointer.
1254 * dev = structure pointer.
1255 * opt = enhanced cmd option byte.
1256 *
1257 * Returns:
1258 * qla2x00 local function return status code.
1259 *
1260 * Context:
1261 * Kernel context.
1262 */
1263int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001264qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265{
1266 int rval;
1267 mbx_cmd_t mc;
1268 mbx_cmd_t *mcp = &mc;
1269 port_database_t *pd;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001270 struct port_database_24xx *pd24;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271 dma_addr_t pd_dma;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001272 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001274 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104f,
1275 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001277 pd24 = NULL;
1278 pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 if (pd == NULL) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001280 ql_log(ql_log_warn, vha, 0x1050,
1281 "Failed to allocate port database structure.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 return QLA_MEMORY_ALLOC_FAILED;
1283 }
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001284 memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001286 mcp->mb[0] = MBC_GET_PORT_DATABASE;
Andrew Vasqueze4289242007-07-19 15:05:56 -07001287 if (opt != 0 && !IS_FWI2_CAPABLE(ha))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 mcp->mb[2] = MSW(pd_dma);
1290 mcp->mb[3] = LSW(pd_dma);
1291 mcp->mb[6] = MSW(MSD(pd_dma));
1292 mcp->mb[7] = LSW(MSD(pd_dma));
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001293 mcp->mb[9] = vha->vp_idx;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07001294 mcp->out_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 mcp->in_mb = MBX_0;
Andrew Vasqueze4289242007-07-19 15:05:56 -07001296 if (IS_FWI2_CAPABLE(ha)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001297 mcp->mb[1] = fcport->loop_id;
1298 mcp->mb[10] = opt;
1299 mcp->out_mb |= MBX_10|MBX_1;
1300 mcp->in_mb |= MBX_1;
1301 } else if (HAS_EXTENDED_IDS(ha)) {
1302 mcp->mb[1] = fcport->loop_id;
1303 mcp->mb[10] = opt;
1304 mcp->out_mb |= MBX_10|MBX_1;
1305 } else {
1306 mcp->mb[1] = fcport->loop_id << 8 | opt;
1307 mcp->out_mb |= MBX_1;
1308 }
Andrew Vasqueze4289242007-07-19 15:05:56 -07001309 mcp->buf_size = IS_FWI2_CAPABLE(ha) ?
1310 PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001311 mcp->flags = MBX_DMA_IN;
1312 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001313 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001314 if (rval != QLA_SUCCESS)
1315 goto gpd_error_out;
1316
Andrew Vasqueze4289242007-07-19 15:05:56 -07001317 if (IS_FWI2_CAPABLE(ha)) {
Arun Easi0eba25d2012-02-09 11:15:58 -08001318 uint64_t zero = 0;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001319 pd24 = (struct port_database_24xx *) pd;
1320
1321 /* Check for logged in state. */
1322 if (pd24->current_login_state != PDS_PRLI_COMPLETE &&
1323 pd24->last_login_state != PDS_PRLI_COMPLETE) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001324 ql_dbg(ql_dbg_mbx, vha, 0x1051,
1325 "Unable to verify login-state (%x/%x) for "
1326 "loop_id %x.\n", pd24->current_login_state,
1327 pd24->last_login_state, fcport->loop_id);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001328 rval = QLA_FUNCTION_FAILED;
1329 goto gpd_error_out;
1330 }
1331
Arun Easi0eba25d2012-02-09 11:15:58 -08001332 if (fcport->loop_id == FC_NO_LOOP_ID ||
1333 (memcmp(fcport->port_name, (uint8_t *)&zero, 8) &&
1334 memcmp(fcport->port_name, pd24->port_name, 8))) {
1335 /* We lost the device mid way. */
1336 rval = QLA_NOT_LOGGED_IN;
1337 goto gpd_error_out;
1338 }
1339
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001340 /* Names are little-endian. */
1341 memcpy(fcport->node_name, pd24->node_name, WWN_SIZE);
1342 memcpy(fcport->port_name, pd24->port_name, WWN_SIZE);
1343
1344 /* Get port_id of device. */
1345 fcport->d_id.b.domain = pd24->port_id[0];
1346 fcport->d_id.b.area = pd24->port_id[1];
1347 fcport->d_id.b.al_pa = pd24->port_id[2];
1348 fcport->d_id.b.rsvd_1 = 0;
1349
1350 /* If not target must be initiator or unknown type. */
1351 if ((pd24->prli_svc_param_word_3[0] & BIT_4) == 0)
1352 fcport->port_type = FCT_INITIATOR;
1353 else
1354 fcport->port_type = FCT_TARGET;
1355 } else {
Arun Easi0eba25d2012-02-09 11:15:58 -08001356 uint64_t zero = 0;
1357
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001358 /* Check for logged in state. */
1359 if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
1360 pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001361 ql_dbg(ql_dbg_mbx, vha, 0x100a,
1362 "Unable to verify login-state (%x/%x) - "
1363 "portid=%02x%02x%02x.\n", pd->master_state,
1364 pd->slave_state, fcport->d_id.b.domain,
1365 fcport->d_id.b.area, fcport->d_id.b.al_pa);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001366 rval = QLA_FUNCTION_FAILED;
1367 goto gpd_error_out;
1368 }
1369
Arun Easi0eba25d2012-02-09 11:15:58 -08001370 if (fcport->loop_id == FC_NO_LOOP_ID ||
1371 (memcmp(fcport->port_name, (uint8_t *)&zero, 8) &&
1372 memcmp(fcport->port_name, pd->port_name, 8))) {
1373 /* We lost the device mid way. */
1374 rval = QLA_NOT_LOGGED_IN;
1375 goto gpd_error_out;
1376 }
1377
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001378 /* Names are little-endian. */
1379 memcpy(fcport->node_name, pd->node_name, WWN_SIZE);
1380 memcpy(fcport->port_name, pd->port_name, WWN_SIZE);
1381
1382 /* Get port_id of device. */
1383 fcport->d_id.b.domain = pd->port_id[0];
1384 fcport->d_id.b.area = pd->port_id[3];
1385 fcport->d_id.b.al_pa = pd->port_id[2];
1386 fcport->d_id.b.rsvd_1 = 0;
1387
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001388 /* If not target must be initiator or unknown type. */
1389 if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
1390 fcport->port_type = FCT_INITIATOR;
1391 else
1392 fcport->port_type = FCT_TARGET;
Andrew Vasquezad3e0ed2005-08-26 19:08:10 -07001393
1394 /* Passback COS information. */
1395 fcport->supported_classes = (pd->options & BIT_4) ?
1396 FC_COS_CLASS2: FC_COS_CLASS3;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397 }
1398
Linus Torvalds1da177e2005-04-16 15:20:36 -07001399gpd_error_out:
1400 dma_pool_free(ha->s_dma_pool, pd, pd_dma);
1401
1402 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001403 ql_dbg(ql_dbg_mbx, vha, 0x1052,
1404 "Failed=%x mb[0]=%x mb[1]=%x.\n", rval,
1405 mcp->mb[0], mcp->mb[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001407 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1053,
1408 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409 }
1410
1411 return rval;
1412}
1413
1414/*
1415 * qla2x00_get_firmware_state
1416 * Get adapter firmware state.
1417 *
1418 * Input:
1419 * ha = adapter block pointer.
1420 * dptr = pointer for firmware state.
1421 * TARGET_QUEUE_LOCK must be released.
1422 * ADAPTER_STATE_LOCK must be released.
1423 *
1424 * Returns:
1425 * qla2x00 local function return status code.
1426 *
1427 * Context:
1428 * Kernel context.
1429 */
1430int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001431qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432{
1433 int rval;
1434 mbx_cmd_t mc;
1435 mbx_cmd_t *mcp = &mc;
1436
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001437 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1054,
1438 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439
1440 mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
1441 mcp->out_mb = MBX_0;
Andrew Vasquez9d2683c2009-06-17 10:30:30 -07001442 if (IS_FWI2_CAPABLE(vha->hw))
1443 mcp->in_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
1444 else
1445 mcp->in_mb = MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07001446 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001448 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449
Harihara Kadayam4d4df192008-04-03 13:13:26 -07001450 /* Return firmware states. */
1451 states[0] = mcp->mb[1];
Andrew Vasquez9d2683c2009-06-17 10:30:30 -07001452 if (IS_FWI2_CAPABLE(vha->hw)) {
1453 states[1] = mcp->mb[2];
1454 states[2] = mcp->mb[3];
1455 states[3] = mcp->mb[4];
1456 states[4] = mcp->mb[5];
1457 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458
1459 if (rval != QLA_SUCCESS) {
1460 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001461 ql_dbg(ql_dbg_mbx, vha, 0x1055, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 } else {
1463 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001464 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1056,
1465 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 }
1467
1468 return rval;
1469}
1470
1471/*
1472 * qla2x00_get_port_name
1473 * Issue get port name mailbox command.
1474 * Returned name is in big endian format.
1475 *
1476 * Input:
1477 * ha = adapter block pointer.
1478 * loop_id = loop ID of device.
1479 * name = pointer for name.
1480 * TARGET_QUEUE_LOCK must be released.
1481 * ADAPTER_STATE_LOCK must be released.
1482 *
1483 * Returns:
1484 * qla2x00 local function return status code.
1485 *
1486 * Context:
1487 * Kernel context.
1488 */
1489int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001490qla2x00_get_port_name(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t *name,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491 uint8_t opt)
1492{
1493 int rval;
1494 mbx_cmd_t mc;
1495 mbx_cmd_t *mcp = &mc;
1496
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001497 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1057,
1498 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499
1500 mcp->mb[0] = MBC_GET_PORT_NAME;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001501 mcp->mb[9] = vha->vp_idx;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07001502 mcp->out_mb = MBX_9|MBX_1|MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001503 if (HAS_EXTENDED_IDS(vha->hw)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 mcp->mb[1] = loop_id;
1505 mcp->mb[10] = opt;
1506 mcp->out_mb |= MBX_10;
1507 } else {
1508 mcp->mb[1] = loop_id << 8 | opt;
1509 }
1510
1511 mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07001512 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001514 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515
1516 if (rval != QLA_SUCCESS) {
1517 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001518 ql_dbg(ql_dbg_mbx, vha, 0x1058, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519 } else {
1520 if (name != NULL) {
1521 /* This function returns name in big endian. */
Richard Lary1196ae02007-03-22 10:53:19 -05001522 name[0] = MSB(mcp->mb[2]);
1523 name[1] = LSB(mcp->mb[2]);
1524 name[2] = MSB(mcp->mb[3]);
1525 name[3] = LSB(mcp->mb[3]);
1526 name[4] = MSB(mcp->mb[6]);
1527 name[5] = LSB(mcp->mb[6]);
1528 name[6] = MSB(mcp->mb[7]);
1529 name[7] = LSB(mcp->mb[7]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530 }
1531
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001532 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1059,
1533 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 }
1535
1536 return rval;
1537}
1538
1539/*
1540 * qla2x00_lip_reset
1541 * Issue LIP reset mailbox command.
1542 *
1543 * Input:
1544 * ha = adapter block pointer.
1545 * TARGET_QUEUE_LOCK must be released.
1546 * ADAPTER_STATE_LOCK must be released.
1547 *
1548 * Returns:
1549 * qla2x00 local function return status code.
1550 *
1551 * Context:
1552 * Kernel context.
1553 */
1554int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001555qla2x00_lip_reset(scsi_qla_host_t *vha)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556{
1557 int rval;
1558 mbx_cmd_t mc;
1559 mbx_cmd_t *mcp = &mc;
1560
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001561 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105a,
1562 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08001564 if (IS_CNA_CAPABLE(vha->hw)) {
Andrew Vasquez3a03eb72009-01-05 11:18:11 -08001565 /* Logout across all FCFs. */
1566 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
1567 mcp->mb[1] = BIT_1;
1568 mcp->mb[2] = 0;
1569 mcp->out_mb = MBX_2|MBX_1|MBX_0;
1570 } else if (IS_FWI2_CAPABLE(vha->hw)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001571 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
Andrew Vasquez0c8c39a2006-12-13 19:20:30 -08001572 mcp->mb[1] = BIT_6;
1573 mcp->mb[2] = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001574 mcp->mb[3] = vha->hw->loop_reset_delay;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001575 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 } else {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001577 mcp->mb[0] = MBC_LIP_RESET;
1578 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001579 if (HAS_EXTENDED_IDS(vha->hw)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001580 mcp->mb[1] = 0x00ff;
1581 mcp->mb[10] = 0;
1582 mcp->out_mb |= MBX_10;
1583 } else {
1584 mcp->mb[1] = 0xff00;
1585 }
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001586 mcp->mb[2] = vha->hw->loop_reset_delay;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001587 mcp->mb[3] = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07001590 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001592 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593
1594 if (rval != QLA_SUCCESS) {
1595 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001596 ql_dbg(ql_dbg_mbx, vha, 0x105b, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597 } else {
1598 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001599 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105c,
1600 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601 }
1602
1603 return rval;
1604}
1605
1606/*
1607 * qla2x00_send_sns
1608 * Send SNS command.
1609 *
1610 * Input:
1611 * ha = adapter block pointer.
1612 * sns = pointer for command.
1613 * cmd_size = command size.
1614 * buf_size = response/command size.
1615 * TARGET_QUEUE_LOCK must be released.
1616 * ADAPTER_STATE_LOCK must be released.
1617 *
1618 * Returns:
1619 * qla2x00 local function return status code.
1620 *
1621 * Context:
1622 * Kernel context.
1623 */
1624int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001625qla2x00_send_sns(scsi_qla_host_t *vha, dma_addr_t sns_phys_address,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001626 uint16_t cmd_size, size_t buf_size)
1627{
1628 int rval;
1629 mbx_cmd_t mc;
1630 mbx_cmd_t *mcp = &mc;
1631
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001632 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105d,
1633 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001635 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105e,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001636 "Retry cnt=%d ratov=%d total tov=%d.\n",
1637 vha->hw->retry_count, vha->hw->login_timeout, mcp->tov);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638
1639 mcp->mb[0] = MBC_SEND_SNS_COMMAND;
1640 mcp->mb[1] = cmd_size;
1641 mcp->mb[2] = MSW(sns_phys_address);
1642 mcp->mb[3] = LSW(sns_phys_address);
1643 mcp->mb[6] = MSW(MSD(sns_phys_address));
1644 mcp->mb[7] = LSW(MSD(sns_phys_address));
1645 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1646 mcp->in_mb = MBX_0|MBX_1;
1647 mcp->buf_size = buf_size;
1648 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001649 mcp->tov = (vha->hw->login_timeout * 2) + (vha->hw->login_timeout / 2);
1650 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651
1652 if (rval != QLA_SUCCESS) {
1653 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001654 ql_dbg(ql_dbg_mbx, vha, 0x105f,
1655 "Failed=%x mb[0]=%x mb[1]=%x.\n",
1656 rval, mcp->mb[0], mcp->mb[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657 } else {
1658 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001659 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1060,
1660 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661 }
1662
1663 return rval;
1664}
1665
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001666int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001667qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001668 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
1669{
1670 int rval;
1671
1672 struct logio_entry_24xx *lg;
1673 dma_addr_t lg_dma;
1674 uint32_t iop[2];
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001675 struct qla_hw_data *ha = vha->hw;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07001676 struct req_que *req;
1677 struct rsp_que *rsp;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001678
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001679 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1061,
1680 "Entered %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001681
Anirban Chakraborty7163ea82009-08-05 09:18:40 -07001682 if (ha->flags.cpu_affinity_enabled)
Anirban Chakraborty68ca9492009-04-06 22:33:41 -07001683 req = ha->req_q_map[0];
1684 else
1685 req = vha->req;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07001686 rsp = req->rsp;
1687
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001688 lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);
1689 if (lg == NULL) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001690 ql_log(ql_log_warn, vha, 0x1062,
1691 "Failed to allocate login IOCB.\n");
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001692 return QLA_MEMORY_ALLOC_FAILED;
1693 }
1694 memset(lg, 0, sizeof(struct logio_entry_24xx));
1695
1696 lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1697 lg->entry_count = 1;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07001698 lg->handle = MAKE_HANDLE(req->id, lg->handle);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001699 lg->nport_handle = cpu_to_le16(loop_id);
1700 lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI);
1701 if (opt & BIT_0)
1702 lg->control_flags |= __constant_cpu_to_le16(LCF_COND_PLOGI);
Andrew Vasquez8baa51a2006-06-23 16:10:44 -07001703 if (opt & BIT_1)
1704 lg->control_flags |= __constant_cpu_to_le16(LCF_SKIP_PRLI);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001705 lg->port_id[0] = al_pa;
1706 lg->port_id[1] = area;
1707 lg->port_id[2] = domain;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001708 lg->vp_index = vha->vp_idx;
Andrew Vasquez7f45dd02012-02-09 11:15:45 -08001709 rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0,
1710 (ha->r_a_tov / 10 * 2) + 2);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001711 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001712 ql_dbg(ql_dbg_mbx, vha, 0x1063,
1713 "Failed to issue login IOCB (%x).\n", rval);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001714 } else if (lg->entry_status != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001715 ql_dbg(ql_dbg_mbx, vha, 0x1064,
1716 "Failed to complete IOCB -- error status (%x).\n",
1717 lg->entry_status);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001718 rval = QLA_FUNCTION_FAILED;
1719 } else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
1720 iop[0] = le32_to_cpu(lg->io_parameter[0]);
1721 iop[1] = le32_to_cpu(lg->io_parameter[1]);
1722
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001723 ql_dbg(ql_dbg_mbx, vha, 0x1065,
1724 "Failed to complete IOCB -- completion status (%x) "
1725 "ioparam=%x/%x.\n", le16_to_cpu(lg->comp_status),
1726 iop[0], iop[1]);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001727
1728 switch (iop[0]) {
1729 case LSC_SCODE_PORTID_USED:
1730 mb[0] = MBS_PORT_ID_USED;
1731 mb[1] = LSW(iop[1]);
1732 break;
1733 case LSC_SCODE_NPORT_USED:
1734 mb[0] = MBS_LOOP_ID_USED;
1735 break;
1736 case LSC_SCODE_NOLINK:
1737 case LSC_SCODE_NOIOCB:
1738 case LSC_SCODE_NOXCB:
1739 case LSC_SCODE_CMD_FAILED:
1740 case LSC_SCODE_NOFABRIC:
1741 case LSC_SCODE_FW_NOT_READY:
1742 case LSC_SCODE_NOT_LOGGED_IN:
1743 case LSC_SCODE_NOPCB:
1744 case LSC_SCODE_ELS_REJECT:
1745 case LSC_SCODE_CMD_PARAM_ERR:
1746 case LSC_SCODE_NONPORT:
1747 case LSC_SCODE_LOGGED_IN:
1748 case LSC_SCODE_NOFLOGI_ACC:
1749 default:
1750 mb[0] = MBS_COMMAND_ERROR;
1751 break;
1752 }
1753 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001754 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1066,
1755 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001756
1757 iop[0] = le32_to_cpu(lg->io_parameter[0]);
1758
1759 mb[0] = MBS_COMMAND_COMPLETE;
1760 mb[1] = 0;
1761 if (iop[0] & BIT_4) {
1762 if (iop[0] & BIT_8)
1763 mb[1] |= BIT_1;
1764 } else
1765 mb[1] = BIT_0;
Andrew Vasquezad3e0ed2005-08-26 19:08:10 -07001766
1767 /* Passback COS information. */
1768 mb[10] = 0;
1769 if (lg->io_parameter[7] || lg->io_parameter[8])
1770 mb[10] |= BIT_0; /* Class 2. */
1771 if (lg->io_parameter[9] || lg->io_parameter[10])
1772 mb[10] |= BIT_1; /* Class 3. */
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001773 }
1774
1775 dma_pool_free(ha->s_dma_pool, lg, lg_dma);
1776
1777 return rval;
1778}
1779
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780/*
1781 * qla2x00_login_fabric
1782 * Issue login fabric port mailbox command.
1783 *
1784 * Input:
1785 * ha = adapter block pointer.
1786 * loop_id = device loop ID.
1787 * domain = device domain.
1788 * area = device area.
1789 * al_pa = device AL_PA.
1790 * status = pointer for return status.
1791 * opt = command options.
1792 * TARGET_QUEUE_LOCK must be released.
1793 * ADAPTER_STATE_LOCK must be released.
1794 *
1795 * Returns:
1796 * qla2x00 local function return status code.
1797 *
1798 * Context:
1799 * Kernel context.
1800 */
1801int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001802qla2x00_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001803 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
1804{
1805 int rval;
1806 mbx_cmd_t mc;
1807 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001808 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001809
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001810 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1067,
1811 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812
1813 mcp->mb[0] = MBC_LOGIN_FABRIC_PORT;
1814 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
1815 if (HAS_EXTENDED_IDS(ha)) {
1816 mcp->mb[1] = loop_id;
1817 mcp->mb[10] = opt;
1818 mcp->out_mb |= MBX_10;
1819 } else {
1820 mcp->mb[1] = (loop_id << 8) | opt;
1821 }
1822 mcp->mb[2] = domain;
1823 mcp->mb[3] = area << 8 | al_pa;
1824
1825 mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0;
1826 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1827 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001828 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001829
1830 /* Return mailbox statuses. */
1831 if (mb != NULL) {
1832 mb[0] = mcp->mb[0];
1833 mb[1] = mcp->mb[1];
1834 mb[2] = mcp->mb[2];
1835 mb[6] = mcp->mb[6];
1836 mb[7] = mcp->mb[7];
Andrew Vasquezad3e0ed2005-08-26 19:08:10 -07001837 /* COS retrieved from Get-Port-Database mailbox command. */
1838 mb[10] = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001839 }
1840
1841 if (rval != QLA_SUCCESS) {
1842 /* RLU tmp code: need to change main mailbox_command function to
1843 * return ok even when the mailbox completion value is not
1844 * SUCCESS. The caller needs to be responsible to interpret
1845 * the return values of this mailbox command if we're not
1846 * to change too much of the existing code.
1847 */
1848 if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||
1849 mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||
1850 mcp->mb[0] == 0x4006)
1851 rval = QLA_SUCCESS;
1852
1853 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001854 ql_dbg(ql_dbg_mbx, vha, 0x1068,
1855 "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
1856 rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001857 } else {
1858 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001859 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1069,
1860 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861 }
1862
1863 return rval;
1864}
1865
1866/*
1867 * qla2x00_login_local_device
1868 * Issue login loop port mailbox command.
Andrew Vasquezfa2a1ce2005-07-06 10:32:07 -07001869 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001870 * Input:
1871 * ha = adapter block pointer.
1872 * loop_id = device loop ID.
1873 * opt = command options.
Andrew Vasquezfa2a1ce2005-07-06 10:32:07 -07001874 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875 * Returns:
1876 * Return status code.
Andrew Vasquezfa2a1ce2005-07-06 10:32:07 -07001877 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 * Context:
1879 * Kernel context.
Andrew Vasquezfa2a1ce2005-07-06 10:32:07 -07001880 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001881 */
1882int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001883qla2x00_login_local_device(scsi_qla_host_t *vha, fc_port_t *fcport,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 uint16_t *mb_ret, uint8_t opt)
1885{
1886 int rval;
1887 mbx_cmd_t mc;
1888 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001889 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001890
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001891 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x106a,
1892 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001893
Andrew Vasqueze4289242007-07-19 15:05:56 -07001894 if (IS_FWI2_CAPABLE(ha))
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001895 return qla24xx_login_fabric(vha, fcport->loop_id,
andrew.vasquez@qlogic.com9a52a572006-03-09 14:27:44 -08001896 fcport->d_id.b.domain, fcport->d_id.b.area,
1897 fcport->d_id.b.al_pa, mb_ret, opt);
1898
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899 mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
1900 if (HAS_EXTENDED_IDS(ha))
andrew.vasquez@qlogic.com9a52a572006-03-09 14:27:44 -08001901 mcp->mb[1] = fcport->loop_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902 else
andrew.vasquez@qlogic.com9a52a572006-03-09 14:27:44 -08001903 mcp->mb[1] = fcport->loop_id << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001904 mcp->mb[2] = opt;
1905 mcp->out_mb = MBX_2|MBX_1|MBX_0;
1906 mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
1907 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
1908 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001909 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910
1911 /* Return mailbox statuses. */
1912 if (mb_ret != NULL) {
1913 mb_ret[0] = mcp->mb[0];
1914 mb_ret[1] = mcp->mb[1];
1915 mb_ret[6] = mcp->mb[6];
1916 mb_ret[7] = mcp->mb[7];
1917 }
1918
1919 if (rval != QLA_SUCCESS) {
1920 /* AV tmp code: need to change main mailbox_command function to
1921 * return ok even when the mailbox completion value is not
1922 * SUCCESS. The caller needs to be responsible to interpret
1923 * the return values of this mailbox command if we're not
1924 * to change too much of the existing code.
1925 */
1926 if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006)
1927 rval = QLA_SUCCESS;
1928
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001929 ql_dbg(ql_dbg_mbx, vha, 0x106b,
1930 "Failed=%x mb[0]=%x mb[1]=%x mb[6]=%x mb[7]=%x.\n",
1931 rval, mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932 } else {
1933 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001934 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x106c,
1935 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 }
1937
1938 return (rval);
1939}
1940
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001941int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001942qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001943 uint8_t area, uint8_t al_pa)
1944{
1945 int rval;
1946 struct logio_entry_24xx *lg;
1947 dma_addr_t lg_dma;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001948 struct qla_hw_data *ha = vha->hw;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07001949 struct req_que *req;
1950 struct rsp_que *rsp;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001951
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001952 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x106d,
1953 "Entered %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001954
1955 lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);
1956 if (lg == NULL) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001957 ql_log(ql_log_warn, vha, 0x106e,
1958 "Failed to allocate logout IOCB.\n");
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001959 return QLA_MEMORY_ALLOC_FAILED;
1960 }
1961 memset(lg, 0, sizeof(struct logio_entry_24xx));
1962
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07001963 if (ql2xmaxqueues > 1)
1964 req = ha->req_q_map[0];
1965 else
1966 req = vha->req;
1967 rsp = req->rsp;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001968 lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1969 lg->entry_count = 1;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07001970 lg->handle = MAKE_HANDLE(req->id, lg->handle);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001971 lg->nport_handle = cpu_to_le16(loop_id);
1972 lg->control_flags =
Andrew Vasquezc8d66912011-03-30 11:46:21 -07001973 __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO|
1974 LCF_FREE_NPORT);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001975 lg->port_id[0] = al_pa;
1976 lg->port_id[1] = area;
1977 lg->port_id[2] = domain;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08001978 lg->vp_index = vha->vp_idx;
Andrew Vasquez7f45dd02012-02-09 11:15:45 -08001979 rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0,
1980 (ha->r_a_tov / 10 * 2) + 2);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001981 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001982 ql_dbg(ql_dbg_mbx, vha, 0x106f,
1983 "Failed to issue logout IOCB (%x).\n", rval);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001984 } else if (lg->entry_status != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001985 ql_dbg(ql_dbg_mbx, vha, 0x1070,
1986 "Failed to complete IOCB -- error status (%x).\n",
1987 lg->entry_status);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001988 rval = QLA_FUNCTION_FAILED;
1989 } else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001990 ql_dbg(ql_dbg_mbx, vha, 0x1071,
1991 "Failed to complete IOCB -- completion status (%x) "
1992 "ioparam=%x/%x.\n", le16_to_cpu(lg->comp_status),
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001993 le32_to_cpu(lg->io_parameter[0]),
Saurav Kashyap7c3df132011-07-14 12:00:13 -07001994 le32_to_cpu(lg->io_parameter[1]));
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001995 } else {
1996 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04001997 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1072,
1998 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07001999 }
2000
2001 dma_pool_free(ha->s_dma_pool, lg, lg_dma);
2002
2003 return rval;
2004}
2005
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006/*
2007 * qla2x00_fabric_logout
2008 * Issue logout fabric port mailbox command.
2009 *
2010 * Input:
2011 * ha = adapter block pointer.
2012 * loop_id = device loop ID.
2013 * TARGET_QUEUE_LOCK must be released.
2014 * ADAPTER_STATE_LOCK must be released.
2015 *
2016 * Returns:
2017 * qla2x00 local function return status code.
2018 *
2019 * Context:
2020 * Kernel context.
2021 */
2022int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002023qla2x00_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002024 uint8_t area, uint8_t al_pa)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025{
2026 int rval;
2027 mbx_cmd_t mc;
2028 mbx_cmd_t *mcp = &mc;
2029
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002030 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1073,
2031 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032
2033 mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
2034 mcp->out_mb = MBX_1|MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002035 if (HAS_EXTENDED_IDS(vha->hw)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 mcp->mb[1] = loop_id;
2037 mcp->mb[10] = 0;
2038 mcp->out_mb |= MBX_10;
2039 } else {
2040 mcp->mb[1] = loop_id << 8;
2041 }
2042
2043 mcp->in_mb = MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002044 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002046 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002047
2048 if (rval != QLA_SUCCESS) {
2049 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002050 ql_dbg(ql_dbg_mbx, vha, 0x1074,
2051 "Failed=%x mb[1]=%x.\n", rval, mcp->mb[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 } else {
2053 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002054 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1075,
2055 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056 }
2057
2058 return rval;
2059}
2060
2061/*
2062 * qla2x00_full_login_lip
2063 * Issue full login LIP mailbox command.
2064 *
2065 * Input:
2066 * ha = adapter block pointer.
2067 * TARGET_QUEUE_LOCK must be released.
2068 * ADAPTER_STATE_LOCK must be released.
2069 *
2070 * Returns:
2071 * qla2x00 local function return status code.
2072 *
2073 * Context:
2074 * Kernel context.
2075 */
2076int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002077qla2x00_full_login_lip(scsi_qla_host_t *vha)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078{
2079 int rval;
2080 mbx_cmd_t mc;
2081 mbx_cmd_t *mcp = &mc;
2082
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002083 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1076,
2084 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085
2086 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002087 mcp->mb[1] = IS_FWI2_CAPABLE(vha->hw) ? BIT_3 : 0;
Andrew Vasquez0c8c39a2006-12-13 19:20:30 -08002088 mcp->mb[2] = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089 mcp->mb[3] = 0;
2090 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2091 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002092 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002094 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095
2096 if (rval != QLA_SUCCESS) {
2097 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002098 ql_dbg(ql_dbg_mbx, vha, 0x1077, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002099 } else {
2100 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002101 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1078,
2102 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002103 }
2104
2105 return rval;
2106}
2107
2108/*
2109 * qla2x00_get_id_list
2110 *
2111 * Input:
2112 * ha = adapter block pointer.
2113 *
2114 * Returns:
2115 * qla2x00 local function return status code.
2116 *
2117 * Context:
2118 * Kernel context.
2119 */
2120int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002121qla2x00_get_id_list(scsi_qla_host_t *vha, void *id_list, dma_addr_t id_list_dma,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122 uint16_t *entries)
2123{
2124 int rval;
2125 mbx_cmd_t mc;
2126 mbx_cmd_t *mcp = &mc;
2127
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002128 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1079,
2129 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130
2131 if (id_list == NULL)
2132 return QLA_FUNCTION_FAILED;
2133
2134 mcp->mb[0] = MBC_GET_ID_LIST;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002135 mcp->out_mb = MBX_0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002136 if (IS_FWI2_CAPABLE(vha->hw)) {
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002137 mcp->mb[2] = MSW(id_list_dma);
2138 mcp->mb[3] = LSW(id_list_dma);
2139 mcp->mb[6] = MSW(MSD(id_list_dma));
2140 mcp->mb[7] = LSW(MSD(id_list_dma));
andrew.vasquez@qlogic.com247ec452006-02-07 08:45:40 -08002141 mcp->mb[8] = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002142 mcp->mb[9] = vha->vp_idx;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07002143 mcp->out_mb |= MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002144 } else {
2145 mcp->mb[1] = MSW(id_list_dma);
2146 mcp->mb[2] = LSW(id_list_dma);
2147 mcp->mb[3] = MSW(MSD(id_list_dma));
2148 mcp->mb[6] = LSW(MSD(id_list_dma));
2149 mcp->out_mb |= MBX_6|MBX_3|MBX_2|MBX_1;
2150 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 mcp->in_mb = MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002152 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002154 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155
2156 if (rval != QLA_SUCCESS) {
2157 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002158 ql_dbg(ql_dbg_mbx, vha, 0x107a, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159 } else {
2160 *entries = mcp->mb[1];
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002161 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107b,
2162 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163 }
2164
2165 return rval;
2166}
2167
2168/*
2169 * qla2x00_get_resource_cnts
2170 * Get current firmware resource counts.
2171 *
2172 * Input:
2173 * ha = adapter block pointer.
2174 *
2175 * Returns:
2176 * qla2x00 local function return status code.
2177 *
2178 * Context:
2179 * Kernel context.
2180 */
2181int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002182qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt,
Seokmann Ju4d0ea242007-09-20 14:07:43 -07002183 uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt,
Andrew Vasquezf3a0a772009-10-13 15:16:49 -07002184 uint16_t *orig_iocb_cnt, uint16_t *max_npiv_vports, uint16_t *max_fcfs)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185{
2186 int rval;
2187 mbx_cmd_t mc;
2188 mbx_cmd_t *mcp = &mc;
2189
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002190 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107c,
2191 "Entered %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192
2193 mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
2194 mcp->out_mb = MBX_0;
Seokmann Ju4d0ea242007-09-20 14:07:43 -07002195 mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08002196 if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw))
Andrew Vasquezf3a0a772009-10-13 15:16:49 -07002197 mcp->in_mb |= MBX_12;
Ravi Anandb93480e2008-04-03 13:13:25 -07002198 mcp->tov = MBX_TOV_SECONDS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002199 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002200 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201
2202 if (rval != QLA_SUCCESS) {
2203 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002204 ql_dbg(ql_dbg_mbx, vha, 0x107d,
2205 "Failed mb[0]=%x.\n", mcp->mb[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002207 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107e,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002208 "Done %s mb1=%x mb2=%x mb3=%x mb6=%x mb7=%x mb10=%x "
2209 "mb11=%x mb12=%x.\n", __func__, mcp->mb[1], mcp->mb[2],
2210 mcp->mb[3], mcp->mb[6], mcp->mb[7], mcp->mb[10],
2211 mcp->mb[11], mcp->mb[12]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212
2213 if (cur_xchg_cnt)
2214 *cur_xchg_cnt = mcp->mb[3];
2215 if (orig_xchg_cnt)
2216 *orig_xchg_cnt = mcp->mb[6];
2217 if (cur_iocb_cnt)
2218 *cur_iocb_cnt = mcp->mb[7];
2219 if (orig_iocb_cnt)
2220 *orig_iocb_cnt = mcp->mb[10];
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002221 if (vha->hw->flags.npiv_supported && max_npiv_vports)
Seokmann Ju4d0ea242007-09-20 14:07:43 -07002222 *max_npiv_vports = mcp->mb[11];
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08002223 if ((IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw)) && max_fcfs)
Andrew Vasquezf3a0a772009-10-13 15:16:49 -07002224 *max_fcfs = mcp->mb[12];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225 }
2226
2227 return (rval);
2228}
2229
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230/*
2231 * qla2x00_get_fcal_position_map
2232 * Get FCAL (LILP) position map using mailbox command
2233 *
2234 * Input:
2235 * ha = adapter state pointer.
2236 * pos_map = buffer pointer (can be NULL).
2237 *
2238 * Returns:
2239 * qla2x00 local function return status code.
2240 *
2241 * Context:
2242 * Kernel context.
2243 */
2244int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002245qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246{
2247 int rval;
2248 mbx_cmd_t mc;
2249 mbx_cmd_t *mcp = &mc;
2250 char *pmap;
2251 dma_addr_t pmap_dma;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002252 struct qla_hw_data *ha = vha->hw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002254 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x107f,
2255 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002256
Andrew Vasquez4b892582008-09-11 21:22:48 -07002257 pmap = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pmap_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002258 if (pmap == NULL) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002259 ql_log(ql_log_warn, vha, 0x1080,
2260 "Memory alloc failed.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 return QLA_MEMORY_ALLOC_FAILED;
2262 }
2263 memset(pmap, 0, FCAL_MAP_SIZE);
2264
2265 mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP;
2266 mcp->mb[2] = MSW(pmap_dma);
2267 mcp->mb[3] = LSW(pmap_dma);
2268 mcp->mb[6] = MSW(MSD(pmap_dma));
2269 mcp->mb[7] = LSW(MSD(pmap_dma));
2270 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2271 mcp->in_mb = MBX_1|MBX_0;
2272 mcp->buf_size = FCAL_MAP_SIZE;
2273 mcp->flags = MBX_DMA_IN;
2274 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002275 rval = qla2x00_mailbox_command(vha, mcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276
2277 if (rval == QLA_SUCCESS) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002278 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1081,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002279 "mb0/mb1=%x/%X FC/AL position map size (%x).\n",
2280 mcp->mb[0], mcp->mb[1], (unsigned)pmap[0]);
2281 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111d,
2282 pmap, pmap[0] + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002283
2284 if (pos_map)
2285 memcpy(pos_map, pmap, FCAL_MAP_SIZE);
2286 }
2287 dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);
2288
2289 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002290 ql_dbg(ql_dbg_mbx, vha, 0x1082, "Failed=%x.\n", rval);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002292 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1083,
2293 "Done %s.\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294 }
2295
2296 return rval;
2297}
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002298
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002299/*
2300 * qla2x00_get_link_status
2301 *
2302 * Input:
2303 * ha = adapter block pointer.
2304 * loop_id = device loop ID.
2305 * ret_buf = pointer to link status return buffer.
2306 *
2307 * Returns:
2308 * 0 = success.
2309 * BIT_0 = mem alloc error.
2310 * BIT_1 = mailbox error.
2311 */
2312int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002313qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id,
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002314 struct link_statistics *stats, dma_addr_t stats_dma)
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002315{
2316 int rval;
2317 mbx_cmd_t mc;
2318 mbx_cmd_t *mcp = &mc;
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002319 uint32_t *siter, *diter, dwords;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002320 struct qla_hw_data *ha = vha->hw;
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002321
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002322 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1084,
2323 "Entered %s.\n", __func__);
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002324
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002325 mcp->mb[0] = MBC_GET_LINK_STATUS;
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002326 mcp->mb[2] = MSW(stats_dma);
2327 mcp->mb[3] = LSW(stats_dma);
2328 mcp->mb[6] = MSW(MSD(stats_dma));
2329 mcp->mb[7] = LSW(MSD(stats_dma));
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002330 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
2331 mcp->in_mb = MBX_0;
Andrew Vasqueze4289242007-07-19 15:05:56 -07002332 if (IS_FWI2_CAPABLE(ha)) {
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002333 mcp->mb[1] = loop_id;
2334 mcp->mb[4] = 0;
2335 mcp->mb[10] = 0;
2336 mcp->out_mb |= MBX_10|MBX_4|MBX_1;
2337 mcp->in_mb |= MBX_1;
2338 } else if (HAS_EXTENDED_IDS(ha)) {
2339 mcp->mb[1] = loop_id;
2340 mcp->mb[10] = 0;
2341 mcp->out_mb |= MBX_10|MBX_1;
2342 } else {
2343 mcp->mb[1] = loop_id << 8;
2344 mcp->out_mb |= MBX_1;
2345 }
Ravi Anandb93480e2008-04-03 13:13:25 -07002346 mcp->tov = MBX_TOV_SECONDS;
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002347 mcp->flags = IOCTL_CMD;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002348 rval = qla2x00_mailbox_command(vha, mcp);
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002349
2350 if (rval == QLA_SUCCESS) {
2351 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002352 ql_dbg(ql_dbg_mbx, vha, 0x1085,
2353 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002354 rval = QLA_FUNCTION_FAILED;
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002355 } else {
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002356 /* Copy over data -- firmware data is LE. */
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002357 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1086,
2358 "Done %s.\n", __func__);
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002359 dwords = offsetof(struct link_statistics, unused1) / 4;
2360 siter = diter = &stats->link_fail_cnt;
2361 while (dwords--)
2362 *diter++ = le32_to_cpu(*siter++);
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002363 }
2364 } else {
2365 /* Failed. */
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002366 ql_dbg(ql_dbg_mbx, vha, 0x1087, "Failed=%x.\n", rval);
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002367 }
2368
andrew.vasquez@qlogic.com392e2f62006-01-31 16:05:02 -08002369 return rval;
2370}
2371
2372int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002373qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats,
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002374 dma_addr_t stats_dma)
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002375{
2376 int rval;
2377 mbx_cmd_t mc;
2378 mbx_cmd_t *mcp = &mc;
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002379 uint32_t *siter, *diter, dwords;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002380
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002381 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1088,
2382 "Entered %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002383
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002384 mcp->mb[0] = MBC_GET_LINK_PRIV_STATS;
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002385 mcp->mb[2] = MSW(stats_dma);
2386 mcp->mb[3] = LSW(stats_dma);
2387 mcp->mb[6] = MSW(MSD(stats_dma));
2388 mcp->mb[7] = LSW(MSD(stats_dma));
2389 mcp->mb[8] = sizeof(struct link_statistics) / 4;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002390 mcp->mb[9] = vha->vp_idx;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002391 mcp->mb[10] = 0;
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002392 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002393 mcp->in_mb = MBX_2|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002394 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002395 mcp->flags = IOCTL_CMD;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002396 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002397
2398 if (rval == QLA_SUCCESS) {
2399 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002400 ql_dbg(ql_dbg_mbx, vha, 0x1089,
2401 "Failed mb[0]=%x.\n", mcp->mb[0]);
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002402 rval = QLA_FUNCTION_FAILED;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002403 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002404 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x108a,
2405 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002406 /* Copy over data -- firmware data is LE. */
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002407 dwords = sizeof(struct link_statistics) / 4;
2408 siter = diter = &stats->link_fail_cnt;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002409 while (dwords--)
Andrew Vasquez43ef0582008-01-17 09:02:08 -08002410 *diter++ = le32_to_cpu(*siter++);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002411 }
2412 } else {
2413 /* Failed. */
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002414 ql_dbg(ql_dbg_mbx, vha, 0x108b, "Failed=%x.\n", rval);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002415 }
2416
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002417 return rval;
2418}
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002419
2420int
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002421qla24xx_abort_command(srb_t *sp)
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002422{
2423 int rval;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002424 unsigned long flags = 0;
2425
2426 struct abort_entry_24xx *abt;
2427 dma_addr_t abt_dma;
2428 uint32_t handle;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002429 fc_port_t *fcport = sp->fcport;
2430 struct scsi_qla_host *vha = fcport->vha;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002431 struct qla_hw_data *ha = vha->hw;
Anirban Chakraborty67c2e932009-04-06 22:33:42 -07002432 struct req_que *req = vha->req;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002433
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002434 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x108c,
2435 "Entered %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002436
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002437 spin_lock_irqsave(&ha->hardware_lock, flags);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002438 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002439 if (req->outstanding_cmds[handle] == sp)
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002440 break;
2441 }
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002442 spin_unlock_irqrestore(&ha->hardware_lock, flags);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002443 if (handle == MAX_OUTSTANDING_COMMANDS) {
2444 /* Command not found. */
2445 return QLA_FUNCTION_FAILED;
2446 }
2447
2448 abt = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &abt_dma);
2449 if (abt == NULL) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002450 ql_log(ql_log_warn, vha, 0x108d,
2451 "Failed to allocate abort IOCB.\n");
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002452 return QLA_MEMORY_ALLOC_FAILED;
2453 }
2454 memset(abt, 0, sizeof(struct abort_entry_24xx));
2455
2456 abt->entry_type = ABORT_IOCB_TYPE;
2457 abt->entry_count = 1;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002458 abt->handle = MAKE_HANDLE(req->id, abt->handle);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002459 abt->nport_handle = cpu_to_le16(fcport->loop_id);
Mike Hernandeza74ec142011-03-30 11:46:20 -07002460 abt->handle_to_abort = MAKE_HANDLE(req->id, handle);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002461 abt->port_id[0] = fcport->d_id.b.al_pa;
2462 abt->port_id[1] = fcport->d_id.b.area;
2463 abt->port_id[2] = fcport->d_id.b.domain;
Joe Carnuccioc6d39e22012-05-15 14:34:20 -04002464 abt->vp_index = fcport->vha->vp_idx;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08002465
2466 abt->req_que_no = cpu_to_le16(req->id);
2467
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002468 rval = qla2x00_issue_iocb(vha, abt, abt_dma, 0);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002469 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002470 ql_dbg(ql_dbg_mbx, vha, 0x108e,
2471 "Failed to issue IOCB (%x).\n", rval);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002472 } else if (abt->entry_status != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002473 ql_dbg(ql_dbg_mbx, vha, 0x108f,
2474 "Failed to complete IOCB -- error status (%x).\n",
2475 abt->entry_status);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002476 rval = QLA_FUNCTION_FAILED;
2477 } else if (abt->nport_handle != __constant_cpu_to_le16(0)) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002478 ql_dbg(ql_dbg_mbx, vha, 0x1090,
2479 "Failed to complete IOCB -- completion status (%x).\n",
2480 le16_to_cpu(abt->nport_handle));
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002481 rval = QLA_FUNCTION_FAILED;
2482 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002483 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1091,
2484 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002485 }
2486
2487 dma_pool_free(ha->s_dma_pool, abt, abt_dma);
2488
2489 return rval;
2490}
2491
2492struct tsk_mgmt_cmd {
2493 union {
2494 struct tsk_mgmt_entry tsk;
2495 struct sts_entry_24xx sts;
2496 } p;
2497};
2498
Andrew Vasquez523ec772008-04-03 13:13:24 -07002499static int
2500__qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002501 unsigned int l, int tag)
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002502{
Andrew Vasquez523ec772008-04-03 13:13:24 -07002503 int rval, rval2;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002504 struct tsk_mgmt_cmd *tsk;
Andrew Vasquez9ca1d012009-10-13 15:16:50 -07002505 struct sts_entry_24xx *sts;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002506 dma_addr_t tsk_dma;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002507 scsi_qla_host_t *vha;
2508 struct qla_hw_data *ha;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08002509 struct req_que *req;
2510 struct rsp_que *rsp;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002511
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002512 vha = fcport->vha;
2513 ha = vha->hw;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002514 req = vha->req;
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002515
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002516 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1092,
2517 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002518
Anirban Chakraborty7163ea82009-08-05 09:18:40 -07002519 if (ha->flags.cpu_affinity_enabled)
Anirban Chakraborty68ca9492009-04-06 22:33:41 -07002520 rsp = ha->rsp_q_map[tag + 1];
2521 else
2522 rsp = req->rsp;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002523 tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002524 if (tsk == NULL) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002525 ql_log(ql_log_warn, vha, 0x1093,
2526 "Failed to allocate task management IOCB.\n");
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002527 return QLA_MEMORY_ALLOC_FAILED;
2528 }
2529 memset(tsk, 0, sizeof(struct tsk_mgmt_cmd));
2530
2531 tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE;
2532 tsk->p.tsk.entry_count = 1;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002533 tsk->p.tsk.handle = MAKE_HANDLE(req->id, tsk->p.tsk.handle);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002534 tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id);
Andrew Vasquez00a537b2008-02-28 14:06:11 -08002535 tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
Andrew Vasquez523ec772008-04-03 13:13:24 -07002536 tsk->p.tsk.control_flags = cpu_to_le32(type);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002537 tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa;
2538 tsk->p.tsk.port_id[1] = fcport->d_id.b.area;
2539 tsk->p.tsk.port_id[2] = fcport->d_id.b.domain;
Joe Carnuccioc6d39e22012-05-15 14:34:20 -04002540 tsk->p.tsk.vp_index = fcport->vha->vp_idx;
Andrew Vasquez523ec772008-04-03 13:13:24 -07002541 if (type == TCF_LUN_RESET) {
2542 int_to_scsilun(l, &tsk->p.tsk.lun);
2543 host_to_fcp_swap((uint8_t *)&tsk->p.tsk.lun,
2544 sizeof(tsk->p.tsk.lun));
2545 }
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07002546
Andrew Vasquez9ca1d012009-10-13 15:16:50 -07002547 sts = &tsk->p.sts;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002548 rval = qla2x00_issue_iocb(vha, tsk, tsk_dma, 0);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002549 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002550 ql_dbg(ql_dbg_mbx, vha, 0x1094,
2551 "Failed to issue %s reset IOCB (%x).\n", name, rval);
Andrew Vasquez9ca1d012009-10-13 15:16:50 -07002552 } else if (sts->entry_status != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002553 ql_dbg(ql_dbg_mbx, vha, 0x1095,
2554 "Failed to complete IOCB -- error status (%x).\n",
2555 sts->entry_status);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002556 rval = QLA_FUNCTION_FAILED;
Andrew Vasquez9ca1d012009-10-13 15:16:50 -07002557 } else if (sts->comp_status !=
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002558 __constant_cpu_to_le16(CS_COMPLETE)) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002559 ql_dbg(ql_dbg_mbx, vha, 0x1096,
2560 "Failed to complete IOCB -- completion status (%x).\n",
2561 le16_to_cpu(sts->comp_status));
Andrew Vasquez9ca1d012009-10-13 15:16:50 -07002562 rval = QLA_FUNCTION_FAILED;
Andrew Vasquez97dec562011-02-23 15:27:14 -08002563 } else if (le16_to_cpu(sts->scsi_status) &
2564 SS_RESPONSE_INFO_LEN_VALID) {
2565 if (le32_to_cpu(sts->rsp_data_len) < 4) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002566 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1097,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002567 "Ignoring inconsistent data length -- not enough "
2568 "response info (%d).\n",
2569 le32_to_cpu(sts->rsp_data_len));
Andrew Vasquez97dec562011-02-23 15:27:14 -08002570 } else if (sts->data[3]) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002571 ql_dbg(ql_dbg_mbx, vha, 0x1098,
2572 "Failed to complete IOCB -- response (%x).\n",
2573 sts->data[3]);
Andrew Vasquez97dec562011-02-23 15:27:14 -08002574 rval = QLA_FUNCTION_FAILED;
2575 }
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002576 }
2577
2578 /* Issue marker IOCB. */
Anirban Chakraborty73208df2008-12-09 16:45:39 -08002579 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l,
Andrew Vasquez523ec772008-04-03 13:13:24 -07002580 type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID);
2581 if (rval2 != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002582 ql_dbg(ql_dbg_mbx, vha, 0x1099,
2583 "Failed to issue marker IOCB (%x).\n", rval2);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002584 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002585 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109a,
2586 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002587 }
2588
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002589 dma_pool_free(ha->s_dma_pool, tsk, tsk_dma);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002590
2591 return rval;
2592}
2593
Andrew Vasquez523ec772008-04-03 13:13:24 -07002594int
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002595qla24xx_abort_target(struct fc_port *fcport, unsigned int l, int tag)
Andrew Vasquez523ec772008-04-03 13:13:24 -07002596{
Madhuranath Iyengar38222632010-05-04 15:01:29 -07002597 struct qla_hw_data *ha = fcport->vha->hw;
2598
2599 if ((ql2xasynctmfenable) && IS_FWI2_CAPABLE(ha))
2600 return qla2x00_async_tm_cmd(fcport, TCF_TARGET_RESET, l, tag);
2601
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002602 return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l, tag);
Andrew Vasquez523ec772008-04-03 13:13:24 -07002603}
2604
2605int
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002606qla24xx_lun_reset(struct fc_port *fcport, unsigned int l, int tag)
Andrew Vasquez523ec772008-04-03 13:13:24 -07002607{
Madhuranath Iyengar38222632010-05-04 15:01:29 -07002608 struct qla_hw_data *ha = fcport->vha->hw;
2609
2610 if ((ql2xasynctmfenable) && IS_FWI2_CAPABLE(ha))
2611 return qla2x00_async_tm_cmd(fcport, TCF_LUN_RESET, l, tag);
2612
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07002613 return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l, tag);
Andrew Vasquez523ec772008-04-03 13:13:24 -07002614}
2615
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002616int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002617qla2x00_system_error(scsi_qla_host_t *vha)
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002618{
2619 int rval;
2620 mbx_cmd_t mc;
2621 mbx_cmd_t *mcp = &mc;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002622 struct qla_hw_data *ha = vha->hw;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002623
Andrew Vasquez68af0812008-05-12 22:21:13 -07002624 if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha))
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002625 return QLA_FUNCTION_FAILED;
2626
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002627 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109b,
2628 "Entered %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002629
2630 mcp->mb[0] = MBC_GEN_SYSTEM_ERROR;
2631 mcp->out_mb = MBX_0;
2632 mcp->in_mb = MBX_0;
2633 mcp->tov = 5;
2634 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002635 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002636
2637 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002638 ql_dbg(ql_dbg_mbx, vha, 0x109c, "Failed=%x.\n", rval);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002639 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002640 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109d,
2641 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002642 }
2643
2644 return rval;
2645}
2646
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002647/**
2648 * qla2x00_set_serdes_params() -
2649 * @ha: HA context
2650 *
2651 * Returns
2652 */
2653int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002654qla2x00_set_serdes_params(scsi_qla_host_t *vha, uint16_t sw_em_1g,
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002655 uint16_t sw_em_2g, uint16_t sw_em_4g)
2656{
2657 int rval;
2658 mbx_cmd_t mc;
2659 mbx_cmd_t *mcp = &mc;
2660
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002661 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x109e,
2662 "Entered %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002663
2664 mcp->mb[0] = MBC_SERDES_PARAMS;
2665 mcp->mb[1] = BIT_0;
andrew.vasquez@qlogic.comfdbc6832006-03-09 14:27:29 -08002666 mcp->mb[2] = sw_em_1g | BIT_15;
2667 mcp->mb[3] = sw_em_2g | BIT_15;
2668 mcp->mb[4] = sw_em_4g | BIT_15;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002669 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
2670 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002671 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002672 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002673 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002674
2675 if (rval != QLA_SUCCESS) {
2676 /*EMPTY*/
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002677 ql_dbg(ql_dbg_mbx, vha, 0x109f,
2678 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002679 } else {
2680 /*EMPTY*/
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002681 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a0,
2682 "Done %s.\n", __func__);
Andrew Vasquez1c7c6352005-07-06 10:30:57 -07002683 }
2684
2685 return rval;
2686}
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002687
2688int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002689qla2x00_stop_firmware(scsi_qla_host_t *vha)
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002690{
2691 int rval;
2692 mbx_cmd_t mc;
2693 mbx_cmd_t *mcp = &mc;
2694
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002695 if (!IS_FWI2_CAPABLE(vha->hw))
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002696 return QLA_FUNCTION_FAILED;
2697
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002698 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a1,
2699 "Entered %s.\n", __func__);
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002700
2701 mcp->mb[0] = MBC_STOP_FIRMWARE;
Andrew Vasquez4ba988d2012-02-09 11:14:06 -08002702 mcp->mb[1] = 0;
2703 mcp->out_mb = MBX_1|MBX_0;
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002704 mcp->in_mb = MBX_0;
2705 mcp->tov = 5;
2706 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002707 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002708
2709 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002710 ql_dbg(ql_dbg_mbx, vha, 0x10a2, "Failed=%x.\n", rval);
Andrew Vasquezb469a7c2009-04-06 22:33:48 -07002711 if (mcp->mb[0] == MBS_INVALID_COMMAND)
2712 rval = QLA_INVALID_COMMAND;
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002713 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002714 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a3,
2715 "Done %s.\n", __func__);
Andrew Vasquezf6ef3b12005-08-26 19:10:20 -07002716 }
2717
2718 return rval;
2719}
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002720
2721int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002722qla2x00_enable_eft_trace(scsi_qla_host_t *vha, dma_addr_t eft_dma,
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002723 uint16_t buffers)
2724{
2725 int rval;
2726 mbx_cmd_t mc;
2727 mbx_cmd_t *mcp = &mc;
2728
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002729 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a4,
2730 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002731
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002732 if (!IS_FWI2_CAPABLE(vha->hw))
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002733 return QLA_FUNCTION_FAILED;
2734
Andrew Vasquez85880802009-12-15 21:29:46 -08002735 if (unlikely(pci_channel_offline(vha->hw->pdev)))
2736 return QLA_FUNCTION_FAILED;
2737
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002738 mcp->mb[0] = MBC_TRACE_CONTROL;
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002739 mcp->mb[1] = TC_EFT_ENABLE;
2740 mcp->mb[2] = LSW(eft_dma);
2741 mcp->mb[3] = MSW(eft_dma);
2742 mcp->mb[4] = LSW(MSD(eft_dma));
2743 mcp->mb[5] = MSW(MSD(eft_dma));
2744 mcp->mb[6] = buffers;
2745 mcp->mb[7] = TC_AEN_DISABLE;
2746 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002747 mcp->in_mb = MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002748 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002749 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002750 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002751 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002752 ql_dbg(ql_dbg_mbx, vha, 0x10a5,
2753 "Failed=%x mb[0]=%x mb[1]=%x.\n",
2754 rval, mcp->mb[0], mcp->mb[1]);
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002755 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002756 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a6,
2757 "Done %s.\n", __func__);
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002758 }
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002759
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002760 return rval;
2761}
2762
2763int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002764qla2x00_disable_eft_trace(scsi_qla_host_t *vha)
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002765{
2766 int rval;
2767 mbx_cmd_t mc;
2768 mbx_cmd_t *mcp = &mc;
2769
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002770 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a7,
2771 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002772
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002773 if (!IS_FWI2_CAPABLE(vha->hw))
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002774 return QLA_FUNCTION_FAILED;
2775
Andrew Vasquez85880802009-12-15 21:29:46 -08002776 if (unlikely(pci_channel_offline(vha->hw->pdev)))
2777 return QLA_FUNCTION_FAILED;
2778
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002779 mcp->mb[0] = MBC_TRACE_CONTROL;
2780 mcp->mb[1] = TC_EFT_DISABLE;
2781 mcp->out_mb = MBX_1|MBX_0;
2782 mcp->in_mb = MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002783 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquez00b6bd22008-01-17 09:02:16 -08002784 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002785 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002786 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002787 ql_dbg(ql_dbg_mbx, vha, 0x10a8,
2788 "Failed=%x mb[0]=%x mb[1]=%x.\n",
2789 rval, mcp->mb[0], mcp->mb[1]);
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002790 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002791 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10a9,
2792 "Done %s.\n", __func__);
Andrew Vasqueza7a167b2006-06-23 16:10:29 -07002793 }
2794
2795 return rval;
2796}
2797
Andrew Vasquez88729e52006-06-23 16:10:50 -07002798int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002799qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma,
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002800 uint16_t buffers, uint16_t *mb, uint32_t *dwords)
2801{
2802 int rval;
2803 mbx_cmd_t mc;
2804 mbx_cmd_t *mcp = &mc;
2805
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002806 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10aa,
2807 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002808
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08002809 if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) &&
2810 !IS_QLA83XX(vha->hw))
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002811 return QLA_FUNCTION_FAILED;
2812
Andrew Vasquez85880802009-12-15 21:29:46 -08002813 if (unlikely(pci_channel_offline(vha->hw->pdev)))
2814 return QLA_FUNCTION_FAILED;
2815
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002816 mcp->mb[0] = MBC_TRACE_CONTROL;
2817 mcp->mb[1] = TC_FCE_ENABLE;
2818 mcp->mb[2] = LSW(fce_dma);
2819 mcp->mb[3] = MSW(fce_dma);
2820 mcp->mb[4] = LSW(MSD(fce_dma));
2821 mcp->mb[5] = MSW(MSD(fce_dma));
2822 mcp->mb[6] = buffers;
2823 mcp->mb[7] = TC_AEN_DISABLE;
2824 mcp->mb[8] = 0;
2825 mcp->mb[9] = TC_FCE_DEFAULT_RX_SIZE;
2826 mcp->mb[10] = TC_FCE_DEFAULT_TX_SIZE;
2827 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|
2828 MBX_1|MBX_0;
2829 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002830 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002831 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002832 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002833 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002834 ql_dbg(ql_dbg_mbx, vha, 0x10ab,
2835 "Failed=%x mb[0]=%x mb[1]=%x.\n",
2836 rval, mcp->mb[0], mcp->mb[1]);
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002837 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002838 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ac,
2839 "Done %s.\n", __func__);
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002840
2841 if (mb)
2842 memcpy(mb, mcp->mb, 8 * sizeof(*mb));
2843 if (dwords)
Andrew Vasquezfa0926d2008-05-12 22:21:12 -07002844 *dwords = buffers;
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002845 }
2846
2847 return rval;
2848}
2849
2850int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002851qla2x00_disable_fce_trace(scsi_qla_host_t *vha, uint64_t *wr, uint64_t *rd)
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002852{
2853 int rval;
2854 mbx_cmd_t mc;
2855 mbx_cmd_t *mcp = &mc;
2856
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002857 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ad,
2858 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002859
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002860 if (!IS_FWI2_CAPABLE(vha->hw))
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002861 return QLA_FUNCTION_FAILED;
2862
Andrew Vasquez85880802009-12-15 21:29:46 -08002863 if (unlikely(pci_channel_offline(vha->hw->pdev)))
2864 return QLA_FUNCTION_FAILED;
2865
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002866 mcp->mb[0] = MBC_TRACE_CONTROL;
2867 mcp->mb[1] = TC_FCE_DISABLE;
2868 mcp->mb[2] = TC_FCE_DISABLE_TRACE;
2869 mcp->out_mb = MBX_2|MBX_1|MBX_0;
2870 mcp->in_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|
2871 MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002872 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002873 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002874 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002875 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002876 ql_dbg(ql_dbg_mbx, vha, 0x10ae,
2877 "Failed=%x mb[0]=%x mb[1]=%x.\n",
2878 rval, mcp->mb[0], mcp->mb[1]);
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002879 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002880 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10af,
2881 "Done %s.\n", __func__);
Andrew Vasquezdf613b92008-01-17 09:02:17 -08002882
2883 if (wr)
2884 *wr = (uint64_t) mcp->mb[5] << 48 |
2885 (uint64_t) mcp->mb[4] << 32 |
2886 (uint64_t) mcp->mb[3] << 16 |
2887 (uint64_t) mcp->mb[2];
2888 if (rd)
2889 *rd = (uint64_t) mcp->mb[9] << 48 |
2890 (uint64_t) mcp->mb[8] << 32 |
2891 (uint64_t) mcp->mb[7] << 16 |
2892 (uint64_t) mcp->mb[6];
2893 }
2894
2895 return rval;
2896}
2897
2898int
Giridhar Malavali6e980162010-03-19 17:03:58 -07002899qla2x00_get_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
2900 uint16_t *port_speed, uint16_t *mb)
2901{
2902 int rval;
2903 mbx_cmd_t mc;
2904 mbx_cmd_t *mcp = &mc;
2905
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002906 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b0,
2907 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002908
Giridhar Malavali6e980162010-03-19 17:03:58 -07002909 if (!IS_IIDMA_CAPABLE(vha->hw))
2910 return QLA_FUNCTION_FAILED;
2911
Giridhar Malavali6e980162010-03-19 17:03:58 -07002912 mcp->mb[0] = MBC_PORT_PARAMS;
2913 mcp->mb[1] = loop_id;
2914 mcp->mb[2] = mcp->mb[3] = 0;
2915 mcp->mb[9] = vha->vp_idx;
2916 mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
2917 mcp->in_mb = MBX_3|MBX_1|MBX_0;
2918 mcp->tov = MBX_TOV_SECONDS;
2919 mcp->flags = 0;
2920 rval = qla2x00_mailbox_command(vha, mcp);
2921
2922 /* Return mailbox statuses. */
2923 if (mb != NULL) {
2924 mb[0] = mcp->mb[0];
2925 mb[1] = mcp->mb[1];
2926 mb[3] = mcp->mb[3];
2927 }
2928
2929 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002930 ql_dbg(ql_dbg_mbx, vha, 0x10b1, "Failed=%x.\n", rval);
Giridhar Malavali6e980162010-03-19 17:03:58 -07002931 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002932 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b2,
2933 "Done %s.\n", __func__);
Giridhar Malavali6e980162010-03-19 17:03:58 -07002934 if (port_speed)
2935 *port_speed = mcp->mb[3];
2936 }
2937
2938 return rval;
2939}
2940
2941int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002942qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002943 uint16_t port_speed, uint16_t *mb)
2944{
2945 int rval;
2946 mbx_cmd_t mc;
2947 mbx_cmd_t *mcp = &mc;
2948
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002949 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b3,
2950 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002951
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002952 if (!IS_IIDMA_CAPABLE(vha->hw))
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002953 return QLA_FUNCTION_FAILED;
2954
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002955 mcp->mb[0] = MBC_PORT_PARAMS;
2956 mcp->mb[1] = loop_id;
2957 mcp->mb[2] = BIT_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08002958 if (IS_CNA_CAPABLE(vha->hw))
Harish Zunjarrao1bb39542009-06-17 10:30:29 -07002959 mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
2960 else
2961 mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
2962 mcp->mb[9] = vha->vp_idx;
2963 mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
2964 mcp->in_mb = MBX_3|MBX_1|MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07002965 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002966 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002967 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002968
2969 /* Return mailbox statuses. */
2970 if (mb != NULL) {
2971 mb[0] = mcp->mb[0];
2972 mb[1] = mcp->mb[1];
2973 mb[3] = mcp->mb[3];
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002974 }
2975
2976 if (rval != QLA_SUCCESS) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002977 ql_dbg(ql_dbg_mbx, vha, 0x10b4,
2978 "Failed=%x.\n", rval);
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002979 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002980 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b5,
2981 "Done %s.\n", __func__);
Andrew Vasquezd8b45212006-10-02 12:00:43 -07002982 }
2983
2984 return rval;
2985}
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07002986
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07002987void
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002988qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07002989 struct vp_rpt_id_entry_24xx *rptid_entry)
2990{
2991 uint8_t vp_idx;
Seokmann Juc6852c42008-04-24 15:21:29 -07002992 uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08002993 struct qla_hw_data *ha = vha->hw;
2994 scsi_qla_host_t *vp;
Arun Easifeafb7b2010-09-03 14:57:00 -07002995 unsigned long flags;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07002996
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04002997 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b6,
2998 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07002999
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003000 if (rptid_entry->entry_status != 0)
3001 return;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003002
3003 if (rptid_entry->format == 0) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003004 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b7,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003005 "Format 0 : Number of VPs setup %d, number of "
3006 "VPs acquired %d.\n",
3007 MSB(le16_to_cpu(rptid_entry->vp_count)),
3008 LSB(le16_to_cpu(rptid_entry->vp_count)));
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003009 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b8,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003010 "Primary port id %02x%02x%02x.\n",
3011 rptid_entry->port_id[2], rptid_entry->port_id[1],
3012 rptid_entry->port_id[0]);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003013 } else if (rptid_entry->format == 1) {
Seokmann Juc6852c42008-04-24 15:21:29 -07003014 vp_idx = LSB(stat);
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003015 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10b9,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003016 "Format 1: VP[%d] enabled - status %d - with "
3017 "port id %02x%02x%02x.\n", vp_idx, MSB(stat),
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003018 rptid_entry->port_id[2], rptid_entry->port_id[1],
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003019 rptid_entry->port_id[0]);
Andrew Vasquez531a82d2009-10-13 15:16:51 -07003020
3021 vp = vha;
3022 if (vp_idx == 0 && (MSB(stat) != 1))
3023 goto reg_needed;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003024
Giridhar Malavali882a9172011-11-18 09:03:12 -08003025 if (MSB(stat) != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003026 ql_dbg(ql_dbg_mbx, vha, 0x10ba,
3027 "Could not acquire ID for VP[%d].\n", vp_idx);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003028 return;
Andrew Vasquez81eb9b42009-06-03 09:55:23 -07003029 }
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003030
Arun Easifeafb7b2010-09-03 14:57:00 -07003031 spin_lock_irqsave(&ha->vport_slock, flags);
3032 list_for_each_entry(vp, &ha->vp_list, list)
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003033 if (vp_idx == vp->vp_idx)
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003034 break;
Arun Easifeafb7b2010-09-03 14:57:00 -07003035 spin_unlock_irqrestore(&ha->vport_slock, flags);
3036
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003037 if (!vp)
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003038 return;
3039
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003040 vp->d_id.b.domain = rptid_entry->port_id[2];
3041 vp->d_id.b.area = rptid_entry->port_id[1];
3042 vp->d_id.b.al_pa = rptid_entry->port_id[0];
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003043
3044 /*
3045 * Cannot configure here as we are still sitting on the
3046 * response queue. Handle it in dpc context.
3047 */
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003048 set_bit(VP_IDX_ACQUIRED, &vp->vp_flags);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003049
Andrew Vasquez531a82d2009-10-13 15:16:51 -07003050reg_needed:
3051 set_bit(REGISTER_FC4_NEEDED, &vp->dpc_flags);
3052 set_bit(REGISTER_FDMI_NEEDED, &vp->dpc_flags);
3053 set_bit(VP_DPC_NEEDED, &vha->dpc_flags);
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003054 qla2xxx_wake_dpc(vha);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003055 }
3056}
3057
3058/*
3059 * qla24xx_modify_vp_config
3060 * Change VP configuration for vha
3061 *
3062 * Input:
3063 * vha = adapter block pointer.
3064 *
3065 * Returns:
3066 * qla2xxx local function return status code.
3067 *
3068 * Context:
3069 * Kernel context.
3070 */
3071int
3072qla24xx_modify_vp_config(scsi_qla_host_t *vha)
3073{
3074 int rval;
3075 struct vp_config_entry_24xx *vpmod;
3076 dma_addr_t vpmod_dma;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003077 struct qla_hw_data *ha = vha->hw;
3078 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003079
3080 /* This can be called by the parent */
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003081
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003082 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10bb,
3083 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003084
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003085 vpmod = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vpmod_dma);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003086 if (!vpmod) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003087 ql_log(ql_log_warn, vha, 0x10bc,
3088 "Failed to allocate modify VP IOCB.\n");
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003089 return QLA_MEMORY_ALLOC_FAILED;
3090 }
3091
3092 memset(vpmod, 0, sizeof(struct vp_config_entry_24xx));
3093 vpmod->entry_type = VP_CONFIG_IOCB_TYPE;
3094 vpmod->entry_count = 1;
3095 vpmod->command = VCT_COMMAND_MOD_ENABLE_VPS;
3096 vpmod->vp_count = 1;
3097 vpmod->vp_index1 = vha->vp_idx;
3098 vpmod->options_idx1 = BIT_3|BIT_4|BIT_5;
3099 memcpy(vpmod->node_name_idx1, vha->node_name, WWN_SIZE);
3100 memcpy(vpmod->port_name_idx1, vha->port_name, WWN_SIZE);
3101 vpmod->entry_count = 1;
3102
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003103 rval = qla2x00_issue_iocb(base_vha, vpmod, vpmod_dma, 0);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003104 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003105 ql_dbg(ql_dbg_mbx, vha, 0x10bd,
3106 "Failed to issue VP config IOCB (%x).\n", rval);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003107 } else if (vpmod->comp_status != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003108 ql_dbg(ql_dbg_mbx, vha, 0x10be,
3109 "Failed to complete IOCB -- error status (%x).\n",
3110 vpmod->comp_status);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003111 rval = QLA_FUNCTION_FAILED;
3112 } else if (vpmod->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003113 ql_dbg(ql_dbg_mbx, vha, 0x10bf,
3114 "Failed to complete IOCB -- completion status (%x).\n",
3115 le16_to_cpu(vpmod->comp_status));
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003116 rval = QLA_FUNCTION_FAILED;
3117 } else {
3118 /* EMPTY */
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003119 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c0,
3120 "Done %s.\n", __func__);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003121 fc_vport_set_state(vha->fc_vport, FC_VPORT_INITIALIZING);
3122 }
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003123 dma_pool_free(ha->s_dma_pool, vpmod, vpmod_dma);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003124
3125 return rval;
3126}
3127
3128/*
3129 * qla24xx_control_vp
3130 * Enable a virtual port for given host
3131 *
3132 * Input:
3133 * ha = adapter block pointer.
3134 * vhba = virtual adapter (unused)
3135 * index = index number for enabled VP
3136 *
3137 * Returns:
3138 * qla2xxx local function return status code.
3139 *
3140 * Context:
3141 * Kernel context.
3142 */
3143int
3144qla24xx_control_vp(scsi_qla_host_t *vha, int cmd)
3145{
3146 int rval;
3147 int map, pos;
3148 struct vp_ctrl_entry_24xx *vce;
3149 dma_addr_t vce_dma;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003150 struct qla_hw_data *ha = vha->hw;
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003151 int vp_index = vha->vp_idx;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003152 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003153
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003154 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c1,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003155 "Entered %s enabling index %d.\n", __func__, vp_index);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003156
Andrew Vasquezeb66dc62007-11-12 10:30:58 -08003157 if (vp_index == 0 || vp_index >= ha->max_npiv_vports)
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003158 return QLA_PARAMETER_ERROR;
3159
3160 vce = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vce_dma);
3161 if (!vce) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003162 ql_log(ql_log_warn, vha, 0x10c2,
3163 "Failed to allocate VP control IOCB.\n");
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003164 return QLA_MEMORY_ALLOC_FAILED;
3165 }
3166 memset(vce, 0, sizeof(struct vp_ctrl_entry_24xx));
3167
3168 vce->entry_type = VP_CTRL_IOCB_TYPE;
3169 vce->entry_count = 1;
3170 vce->command = cpu_to_le16(cmd);
3171 vce->vp_count = __constant_cpu_to_le16(1);
3172
3173 /* index map in firmware starts with 1; decrement index
3174 * this is ok as we never use index 0
3175 */
3176 map = (vp_index - 1) / 8;
3177 pos = (vp_index - 1) & 7;
matthias@kaehlcke.net6c2f5272008-05-12 22:21:11 -07003178 mutex_lock(&ha->vport_lock);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003179 vce->vp_idx_map[map] |= 1 << pos;
matthias@kaehlcke.net6c2f5272008-05-12 22:21:11 -07003180 mutex_unlock(&ha->vport_lock);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003181
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003182 rval = qla2x00_issue_iocb(base_vha, vce, vce_dma, 0);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003183 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003184 ql_dbg(ql_dbg_mbx, vha, 0x10c3,
3185 "Failed to issue VP control IOCB (%x).\n", rval);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003186 } else if (vce->entry_status != 0) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003187 ql_dbg(ql_dbg_mbx, vha, 0x10c4,
3188 "Failed to complete IOCB -- error status (%x).\n",
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003189 vce->entry_status);
3190 rval = QLA_FUNCTION_FAILED;
3191 } else if (vce->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003192 ql_dbg(ql_dbg_mbx, vha, 0x10c5,
3193 "Failed to complet IOCB -- completion status (%x).\n",
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003194 le16_to_cpu(vce->comp_status));
3195 rval = QLA_FUNCTION_FAILED;
3196 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003197 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c6,
3198 "Done %s.\n", __func__);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003199 }
3200
3201 dma_pool_free(ha->s_dma_pool, vce, vce_dma);
3202
3203 return rval;
3204}
3205
3206/*
3207 * qla2x00_send_change_request
3208 * Receive or disable RSCN request from fabric controller
3209 *
3210 * Input:
3211 * ha = adapter block pointer
3212 * format = registration format:
3213 * 0 - Reserved
3214 * 1 - Fabric detected registration
3215 * 2 - N_port detected registration
3216 * 3 - Full registration
3217 * FF - clear registration
3218 * vp_idx = Virtual port index
3219 *
3220 * Returns:
3221 * qla2x00 local function return status code.
3222 *
3223 * Context:
3224 * Kernel Context
3225 */
3226
3227int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003228qla2x00_send_change_request(scsi_qla_host_t *vha, uint16_t format,
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003229 uint16_t vp_idx)
3230{
3231 int rval;
3232 mbx_cmd_t mc;
3233 mbx_cmd_t *mcp = &mc;
3234
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003235 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c7,
3236 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003237
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003238 /*
3239 * This command is implicitly executed by firmware during login for the
3240 * physical hosts
3241 */
3242 if (vp_idx == 0)
3243 return QLA_FUNCTION_FAILED;
3244
3245 mcp->mb[0] = MBC_SEND_CHANGE_REQUEST;
3246 mcp->mb[1] = format;
3247 mcp->mb[9] = vp_idx;
3248 mcp->out_mb = MBX_9|MBX_1|MBX_0;
3249 mcp->in_mb = MBX_0|MBX_1;
3250 mcp->tov = MBX_TOV_SECONDS;
3251 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003252 rval = qla2x00_mailbox_command(vha, mcp);
Seokmann Ju2c3dfe32007-07-05 13:16:51 -07003253
3254 if (rval == QLA_SUCCESS) {
3255 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
3256 rval = BIT_1;
3257 }
3258 } else
3259 rval = BIT_1;
3260
3261 return rval;
3262}
Andrew Vasquez338c9162007-09-20 14:07:33 -07003263
3264int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003265qla2x00_dump_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr,
Andrew Vasquez338c9162007-09-20 14:07:33 -07003266 uint32_t size)
3267{
3268 int rval;
3269 mbx_cmd_t mc;
3270 mbx_cmd_t *mcp = &mc;
3271
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003272 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1009,
3273 "Entered %s.\n", __func__);
Andrew Vasquez338c9162007-09-20 14:07:33 -07003274
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003275 if (MSW(addr) || IS_FWI2_CAPABLE(vha->hw)) {
Andrew Vasquez338c9162007-09-20 14:07:33 -07003276 mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED;
3277 mcp->mb[8] = MSW(addr);
3278 mcp->out_mb = MBX_8|MBX_0;
3279 } else {
3280 mcp->mb[0] = MBC_DUMP_RISC_RAM;
3281 mcp->out_mb = MBX_0;
3282 }
3283 mcp->mb[1] = LSW(addr);
3284 mcp->mb[2] = MSW(req_dma);
3285 mcp->mb[3] = LSW(req_dma);
3286 mcp->mb[6] = MSW(MSD(req_dma));
3287 mcp->mb[7] = LSW(MSD(req_dma));
3288 mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003289 if (IS_FWI2_CAPABLE(vha->hw)) {
Andrew Vasquez338c9162007-09-20 14:07:33 -07003290 mcp->mb[4] = MSW(size);
3291 mcp->mb[5] = LSW(size);
3292 mcp->out_mb |= MBX_5|MBX_4;
3293 } else {
3294 mcp->mb[4] = LSW(size);
3295 mcp->out_mb |= MBX_4;
3296 }
3297
3298 mcp->in_mb = MBX_0;
Ravi Anandb93480e2008-04-03 13:13:25 -07003299 mcp->tov = MBX_TOV_SECONDS;
Andrew Vasquez338c9162007-09-20 14:07:33 -07003300 mcp->flags = 0;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003301 rval = qla2x00_mailbox_command(vha, mcp);
Andrew Vasquez338c9162007-09-20 14:07:33 -07003302
3303 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003304 ql_dbg(ql_dbg_mbx, vha, 0x1008,
3305 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez338c9162007-09-20 14:07:33 -07003306 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003307 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1007,
3308 "Done %s.\n", __func__);
Andrew Vasquez338c9162007-09-20 14:07:33 -07003309 }
3310
3311 return rval;
3312}
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003313
3314/* 84XX Support **************************************************************/
3315
3316struct cs84xx_mgmt_cmd {
3317 union {
3318 struct verify_chip_entry_84xx req;
3319 struct verify_chip_rsp_84xx rsp;
3320 } p;
3321};
3322
3323int
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003324qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status)
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003325{
3326 int rval, retry;
3327 struct cs84xx_mgmt_cmd *mn;
3328 dma_addr_t mn_dma;
3329 uint16_t options;
3330 unsigned long flags;
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003331 struct qla_hw_data *ha = vha->hw;
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003332
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003333 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10c8,
3334 "Entered %s.\n", __func__);
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003335
3336 mn = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &mn_dma);
3337 if (mn == NULL) {
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003338 return QLA_MEMORY_ALLOC_FAILED;
3339 }
3340
3341 /* Force Update? */
3342 options = ha->cs84xx->fw_update ? VCO_FORCE_UPDATE : 0;
3343 /* Diagnostic firmware? */
3344 /* options |= MENLO_DIAG_FW; */
3345 /* We update the firmware with only one data sequence. */
3346 options |= VCO_END_OF_DATA;
3347
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003348 do {
Andrew Vasquezc1ec1f12008-04-24 15:21:24 -07003349 retry = 0;
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003350 memset(mn, 0, sizeof(*mn));
3351 mn->p.req.entry_type = VERIFY_CHIP_IOCB_TYPE;
3352 mn->p.req.entry_count = 1;
3353 mn->p.req.options = cpu_to_le16(options);
3354
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003355 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111c,
3356 "Dump of Verify Request.\n");
3357 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111e,
3358 (uint8_t *)mn, sizeof(*mn));
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003359
Anirban Chakraborty7b867cf2008-11-06 10:40:19 -08003360 rval = qla2x00_issue_iocb_timeout(vha, mn, mn_dma, 0, 120);
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003361 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003362 ql_dbg(ql_dbg_mbx, vha, 0x10cb,
3363 "Failed to issue verify IOCB (%x).\n", rval);
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003364 goto verify_done;
3365 }
3366
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003367 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1110,
3368 "Dump of Verify Response.\n");
3369 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1118,
3370 (uint8_t *)mn, sizeof(*mn));
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003371
3372 status[0] = le16_to_cpu(mn->p.rsp.comp_status);
3373 status[1] = status[0] == CS_VCS_CHIP_FAILURE ?
3374 le16_to_cpu(mn->p.rsp.failure_code) : 0;
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003375 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ce,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003376 "cs=%x fc=%x.\n", status[0], status[1]);
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003377
3378 if (status[0] != CS_COMPLETE) {
3379 rval = QLA_FUNCTION_FAILED;
3380 if (!(options & VCO_DONT_UPDATE_FW)) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003381 ql_dbg(ql_dbg_mbx, vha, 0x10cf,
3382 "Firmware update failed. Retrying "
3383 "without update firmware.\n");
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003384 options |= VCO_DONT_UPDATE_FW;
3385 options &= ~VCO_FORCE_UPDATE;
3386 retry = 1;
3387 }
3388 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003389 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d0,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003390 "Firmware updated to %x.\n",
3391 le32_to_cpu(mn->p.rsp.fw_ver));
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003392
3393 /* NOTE: we only update OP firmware. */
3394 spin_lock_irqsave(&ha->cs84xx->access_lock, flags);
3395 ha->cs84xx->op_fw_version =
3396 le32_to_cpu(mn->p.rsp.fw_ver);
3397 spin_unlock_irqrestore(&ha->cs84xx->access_lock,
3398 flags);
3399 }
3400 } while (retry);
3401
3402verify_done:
3403 dma_pool_free(ha->s_dma_pool, mn, mn_dma);
3404
3405 if (rval != QLA_SUCCESS) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003406 ql_dbg(ql_dbg_mbx, vha, 0x10d1,
3407 "Failed=%x.\n", rval);
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003408 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003409 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d2,
3410 "Done %s.\n", __func__);
Harihara Kadayam4d4df192008-04-03 13:13:26 -07003411 }
3412
3413 return rval;
3414}
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003415
3416int
Anirban Chakraborty618a7522009-02-08 20:50:11 -08003417qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003418{
3419 int rval;
3420 unsigned long flags;
3421 mbx_cmd_t mc;
3422 mbx_cmd_t *mcp = &mc;
3423 struct device_reg_25xxmq __iomem *reg;
3424 struct qla_hw_data *ha = vha->hw;
3425
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003426 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3,
3427 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003428
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003429 mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
Anirban Chakraborty618a7522009-02-08 20:50:11 -08003430 mcp->mb[1] = req->options;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003431 mcp->mb[2] = MSW(LSD(req->dma));
3432 mcp->mb[3] = LSW(LSD(req->dma));
3433 mcp->mb[6] = MSW(MSD(req->dma));
3434 mcp->mb[7] = LSW(MSD(req->dma));
3435 mcp->mb[5] = req->length;
3436 if (req->rsp)
3437 mcp->mb[10] = req->rsp->id;
3438 mcp->mb[12] = req->qos;
3439 mcp->mb[11] = req->vp_idx;
3440 mcp->mb[13] = req->rid;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003441 if (IS_QLA83XX(ha))
3442 mcp->mb[15] = 0;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003443
3444 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) +
3445 QLA_QUE_PAGE * req->id);
3446
3447 mcp->mb[4] = req->id;
3448 /* que in ptr index */
3449 mcp->mb[8] = 0;
3450 /* que out ptr index */
3451 mcp->mb[9] = 0;
3452 mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7|
3453 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3454 mcp->in_mb = MBX_0;
3455 mcp->flags = MBX_DMA_OUT;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003456 mcp->tov = MBX_TOV_SECONDS * 2;
3457
3458 if (IS_QLA81XX(ha) || IS_QLA83XX(ha))
3459 mcp->in_mb |= MBX_1;
3460 if (IS_QLA83XX(ha)) {
3461 mcp->out_mb |= MBX_15;
3462 /* debug q create issue in SR-IOV */
3463 mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
3464 }
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003465
3466 spin_lock_irqsave(&ha->hardware_lock, flags);
Anirban Chakraborty618a7522009-02-08 20:50:11 -08003467 if (!(req->options & BIT_0)) {
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003468 WRT_REG_DWORD(&reg->req_q_in, 0);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003469 if (!IS_QLA83XX(ha))
3470 WRT_REG_DWORD(&reg->req_q_out, 0);
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003471 }
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07003472 req->req_q_in = &reg->req_q_in;
3473 req->req_q_out = &reg->req_q_out;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003474 spin_unlock_irqrestore(&ha->hardware_lock, flags);
3475
Anirban Chakraborty17d98632008-12-18 10:06:15 -08003476 rval = qla2x00_mailbox_command(vha, mcp);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003477 if (rval != QLA_SUCCESS) {
3478 ql_dbg(ql_dbg_mbx, vha, 0x10d4,
3479 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3480 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003481 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d5,
3482 "Done %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003483 }
3484
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003485 return rval;
3486}
3487
3488int
Anirban Chakraborty618a7522009-02-08 20:50:11 -08003489qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003490{
3491 int rval;
3492 unsigned long flags;
3493 mbx_cmd_t mc;
3494 mbx_cmd_t *mcp = &mc;
3495 struct device_reg_25xxmq __iomem *reg;
3496 struct qla_hw_data *ha = vha->hw;
3497
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003498 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6,
3499 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003500
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003501 mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
Anirban Chakraborty618a7522009-02-08 20:50:11 -08003502 mcp->mb[1] = rsp->options;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003503 mcp->mb[2] = MSW(LSD(rsp->dma));
3504 mcp->mb[3] = LSW(LSD(rsp->dma));
3505 mcp->mb[6] = MSW(MSD(rsp->dma));
3506 mcp->mb[7] = LSW(MSD(rsp->dma));
3507 mcp->mb[5] = rsp->length;
Andrew Vasquez444786d2009-01-05 11:18:10 -08003508 mcp->mb[14] = rsp->msix->entry;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003509 mcp->mb[13] = rsp->rid;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003510 if (IS_QLA83XX(ha))
3511 mcp->mb[15] = 0;
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003512
3513 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) +
3514 QLA_QUE_PAGE * rsp->id);
3515
3516 mcp->mb[4] = rsp->id;
3517 /* que in ptr index */
3518 mcp->mb[8] = 0;
3519 /* que out ptr index */
3520 mcp->mb[9] = 0;
Anirban Chakraborty2afa19a2009-04-06 22:33:40 -07003521 mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003522 |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3523 mcp->in_mb = MBX_0;
3524 mcp->flags = MBX_DMA_OUT;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003525 mcp->tov = MBX_TOV_SECONDS * 2;
3526
3527 if (IS_QLA81XX(ha)) {
3528 mcp->out_mb |= MBX_12|MBX_11|MBX_10;
3529 mcp->in_mb |= MBX_1;
3530 } else if (IS_QLA83XX(ha)) {
3531 mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10;
3532 mcp->in_mb |= MBX_1;
3533 /* debug q create issue in SR-IOV */
3534 mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
3535 }
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003536
3537 spin_lock_irqsave(&ha->hardware_lock, flags);
Anirban Chakraborty618a7522009-02-08 20:50:11 -08003538 if (!(rsp->options & BIT_0)) {
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003539 WRT_REG_DWORD(&reg->rsp_q_out, 0);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003540 if (!IS_QLA83XX(ha))
3541 WRT_REG_DWORD(&reg->rsp_q_in, 0);
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003542 }
3543
3544 spin_unlock_irqrestore(&ha->hardware_lock, flags);
3545
Anirban Chakraborty17d98632008-12-18 10:06:15 -08003546 rval = qla2x00_mailbox_command(vha, mcp);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003547 if (rval != QLA_SUCCESS) {
3548 ql_dbg(ql_dbg_mbx, vha, 0x10d7,
3549 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
3550 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003551 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d8,
3552 "Done %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003553 }
3554
Anirban Chakraborty73208df2008-12-09 16:45:39 -08003555 return rval;
3556}
3557
Andrew Vasquez8a659572009-02-08 20:50:12 -08003558int
3559qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb)
3560{
3561 int rval;
3562 mbx_cmd_t mc;
3563 mbx_cmd_t *mcp = &mc;
3564
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003565 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d9,
3566 "Entered %s.\n", __func__);
Andrew Vasquez8a659572009-02-08 20:50:12 -08003567
3568 mcp->mb[0] = MBC_IDC_ACK;
3569 memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
3570 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3571 mcp->in_mb = MBX_0;
3572 mcp->tov = MBX_TOV_SECONDS;
3573 mcp->flags = 0;
3574 rval = qla2x00_mailbox_command(vha, mcp);
3575
3576 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003577 ql_dbg(ql_dbg_mbx, vha, 0x10da,
3578 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez8a659572009-02-08 20:50:12 -08003579 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003580 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10db,
3581 "Done %s.\n", __func__);
Andrew Vasquez8a659572009-02-08 20:50:12 -08003582 }
3583
3584 return rval;
3585}
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003586
3587int
3588qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size)
3589{
3590 int rval;
3591 mbx_cmd_t mc;
3592 mbx_cmd_t *mcp = &mc;
3593
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003594 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10dc,
3595 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003596
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003597 if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw))
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003598 return QLA_FUNCTION_FAILED;
3599
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003600 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
3601 mcp->mb[1] = FAC_OPT_CMD_GET_SECTOR_SIZE;
3602 mcp->out_mb = MBX_1|MBX_0;
3603 mcp->in_mb = MBX_1|MBX_0;
3604 mcp->tov = MBX_TOV_SECONDS;
3605 mcp->flags = 0;
3606 rval = qla2x00_mailbox_command(vha, mcp);
3607
3608 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003609 ql_dbg(ql_dbg_mbx, vha, 0x10dd,
3610 "Failed=%x mb[0]=%x mb[1]=%x.\n",
3611 rval, mcp->mb[0], mcp->mb[1]);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003612 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003613 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10de,
3614 "Done %s.\n", __func__);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003615 *sector_size = mcp->mb[1];
3616 }
3617
3618 return rval;
3619}
3620
3621int
3622qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable)
3623{
3624 int rval;
3625 mbx_cmd_t mc;
3626 mbx_cmd_t *mcp = &mc;
3627
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003628 if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw))
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003629 return QLA_FUNCTION_FAILED;
3630
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003631 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10df,
3632 "Entered %s.\n", __func__);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003633
3634 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
3635 mcp->mb[1] = enable ? FAC_OPT_CMD_WRITE_ENABLE :
3636 FAC_OPT_CMD_WRITE_PROTECT;
3637 mcp->out_mb = MBX_1|MBX_0;
3638 mcp->in_mb = MBX_1|MBX_0;
3639 mcp->tov = MBX_TOV_SECONDS;
3640 mcp->flags = 0;
3641 rval = qla2x00_mailbox_command(vha, mcp);
3642
3643 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003644 ql_dbg(ql_dbg_mbx, vha, 0x10e0,
3645 "Failed=%x mb[0]=%x mb[1]=%x.\n",
3646 rval, mcp->mb[0], mcp->mb[1]);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003647 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003648 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e1,
3649 "Done %s.\n", __func__);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003650 }
3651
3652 return rval;
3653}
3654
3655int
3656qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish)
3657{
3658 int rval;
3659 mbx_cmd_t mc;
3660 mbx_cmd_t *mcp = &mc;
3661
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003662 if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw))
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003663 return QLA_FUNCTION_FAILED;
3664
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003665 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e2,
3666 "Entered %s.\n", __func__);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003667
3668 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
3669 mcp->mb[1] = FAC_OPT_CMD_ERASE_SECTOR;
3670 mcp->mb[2] = LSW(start);
3671 mcp->mb[3] = MSW(start);
3672 mcp->mb[4] = LSW(finish);
3673 mcp->mb[5] = MSW(finish);
3674 mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3675 mcp->in_mb = MBX_2|MBX_1|MBX_0;
3676 mcp->tov = MBX_TOV_SECONDS;
3677 mcp->flags = 0;
3678 rval = qla2x00_mailbox_command(vha, mcp);
3679
3680 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003681 ql_dbg(ql_dbg_mbx, vha, 0x10e3,
3682 "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
3683 rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003684 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003685 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e4,
3686 "Done %s.\n", __func__);
Joe Carnuccio1d2874d2009-03-24 09:08:06 -07003687 }
3688
3689 return rval;
3690}
Lalit Chandivade6e181be2009-03-26 08:49:17 -07003691
3692int
3693qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha)
3694{
3695 int rval = 0;
3696 mbx_cmd_t mc;
3697 mbx_cmd_t *mcp = &mc;
3698
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003699 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e5,
3700 "Entered %s.\n", __func__);
Lalit Chandivade6e181be2009-03-26 08:49:17 -07003701
3702 mcp->mb[0] = MBC_RESTART_MPI_FW;
3703 mcp->out_mb = MBX_0;
3704 mcp->in_mb = MBX_0|MBX_1;
3705 mcp->tov = MBX_TOV_SECONDS;
3706 mcp->flags = 0;
3707 rval = qla2x00_mailbox_command(vha, mcp);
3708
3709 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003710 ql_dbg(ql_dbg_mbx, vha, 0x10e6,
3711 "Failed=%x mb[0]=%x mb[1]=%x.\n",
3712 rval, mcp->mb[0], mcp->mb[1]);
Lalit Chandivade6e181be2009-03-26 08:49:17 -07003713 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003714 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e7,
3715 "Done %s.\n", __func__);
Lalit Chandivade6e181be2009-03-26 08:49:17 -07003716 }
3717
3718 return rval;
3719}
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003720
3721int
Joe Carnuccio6766df92011-05-10 11:30:15 -07003722qla2x00_read_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint8_t *sfp,
3723 uint16_t dev, uint16_t off, uint16_t len, uint16_t opt)
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003724{
3725 int rval;
3726 mbx_cmd_t mc;
3727 mbx_cmd_t *mcp = &mc;
Joe Carnuccio6766df92011-05-10 11:30:15 -07003728 struct qla_hw_data *ha = vha->hw;
3729
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003730 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e8,
3731 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003732
Joe Carnuccio6766df92011-05-10 11:30:15 -07003733 if (!IS_FWI2_CAPABLE(ha))
3734 return QLA_FUNCTION_FAILED;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003735
Joe Carnuccio6766df92011-05-10 11:30:15 -07003736 if (len == 1)
3737 opt |= BIT_0;
3738
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003739 mcp->mb[0] = MBC_READ_SFP;
3740 mcp->mb[1] = dev;
3741 mcp->mb[2] = MSW(sfp_dma);
3742 mcp->mb[3] = LSW(sfp_dma);
3743 mcp->mb[6] = MSW(MSD(sfp_dma));
3744 mcp->mb[7] = LSW(MSD(sfp_dma));
3745 mcp->mb[8] = len;
Joe Carnuccio6766df92011-05-10 11:30:15 -07003746 mcp->mb[9] = off;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003747 mcp->mb[10] = opt;
3748 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
Joe Carnuccio1bff6cc2011-05-10 11:30:11 -07003749 mcp->in_mb = MBX_1|MBX_0;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003750 mcp->tov = MBX_TOV_SECONDS;
3751 mcp->flags = 0;
3752 rval = qla2x00_mailbox_command(vha, mcp);
3753
3754 if (opt & BIT_0)
Joe Carnuccio6766df92011-05-10 11:30:15 -07003755 *sfp = mcp->mb[1];
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003756
3757 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003758 ql_dbg(ql_dbg_mbx, vha, 0x10e9,
3759 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003760 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003761 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ea,
3762 "Done %s.\n", __func__);
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003763 }
3764
3765 return rval;
3766}
3767
3768int
Joe Carnuccio6766df92011-05-10 11:30:15 -07003769qla2x00_write_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint8_t *sfp,
3770 uint16_t dev, uint16_t off, uint16_t len, uint16_t opt)
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003771{
3772 int rval;
3773 mbx_cmd_t mc;
3774 mbx_cmd_t *mcp = &mc;
Joe Carnuccio6766df92011-05-10 11:30:15 -07003775 struct qla_hw_data *ha = vha->hw;
3776
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003777 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10eb,
3778 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003779
Joe Carnuccio6766df92011-05-10 11:30:15 -07003780 if (!IS_FWI2_CAPABLE(ha))
3781 return QLA_FUNCTION_FAILED;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003782
Joe Carnuccio6766df92011-05-10 11:30:15 -07003783 if (len == 1)
3784 opt |= BIT_0;
3785
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003786 if (opt & BIT_0)
Joe Carnuccio6766df92011-05-10 11:30:15 -07003787 len = *sfp;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003788
3789 mcp->mb[0] = MBC_WRITE_SFP;
3790 mcp->mb[1] = dev;
3791 mcp->mb[2] = MSW(sfp_dma);
3792 mcp->mb[3] = LSW(sfp_dma);
3793 mcp->mb[6] = MSW(MSD(sfp_dma));
3794 mcp->mb[7] = LSW(MSD(sfp_dma));
3795 mcp->mb[8] = len;
Joe Carnuccio6766df92011-05-10 11:30:15 -07003796 mcp->mb[9] = off;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003797 mcp->mb[10] = opt;
3798 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
Joe Carnuccio6766df92011-05-10 11:30:15 -07003799 mcp->in_mb = MBX_1|MBX_0;
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003800 mcp->tov = MBX_TOV_SECONDS;
3801 mcp->flags = 0;
3802 rval = qla2x00_mailbox_command(vha, mcp);
3803
3804 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003805 ql_dbg(ql_dbg_mbx, vha, 0x10ec,
3806 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003807 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003808 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ed,
3809 "Done %s.\n", __func__);
Joe Carnuccioad0ecd62009-03-24 09:08:12 -07003810 }
3811
3812 return rval;
3813}
Andrew Vasquezce0423f2009-06-03 09:55:13 -07003814
3815int
3816qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma,
3817 uint16_t size_in_bytes, uint16_t *actual_size)
3818{
3819 int rval;
3820 mbx_cmd_t mc;
3821 mbx_cmd_t *mcp = &mc;
3822
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003823 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ee,
3824 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003825
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003826 if (!IS_CNA_CAPABLE(vha->hw))
Andrew Vasquezce0423f2009-06-03 09:55:13 -07003827 return QLA_FUNCTION_FAILED;
3828
Andrew Vasquezce0423f2009-06-03 09:55:13 -07003829 mcp->mb[0] = MBC_GET_XGMAC_STATS;
3830 mcp->mb[2] = MSW(stats_dma);
3831 mcp->mb[3] = LSW(stats_dma);
3832 mcp->mb[6] = MSW(MSD(stats_dma));
3833 mcp->mb[7] = LSW(MSD(stats_dma));
3834 mcp->mb[8] = size_in_bytes >> 2;
3835 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
3836 mcp->in_mb = MBX_2|MBX_1|MBX_0;
3837 mcp->tov = MBX_TOV_SECONDS;
3838 mcp->flags = 0;
3839 rval = qla2x00_mailbox_command(vha, mcp);
3840
3841 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003842 ql_dbg(ql_dbg_mbx, vha, 0x10ef,
3843 "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
3844 rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
Andrew Vasquezce0423f2009-06-03 09:55:13 -07003845 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003846 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f0,
3847 "Done %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003848
Andrew Vasquezce0423f2009-06-03 09:55:13 -07003849
3850 *actual_size = mcp->mb[2] << 2;
3851 }
3852
3853 return rval;
3854}
Andrew Vasquez11bbc1d2009-06-03 09:55:14 -07003855
3856int
3857qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma,
3858 uint16_t size)
3859{
3860 int rval;
3861 mbx_cmd_t mc;
3862 mbx_cmd_t *mcp = &mc;
3863
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003864 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f1,
3865 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003866
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003867 if (!IS_CNA_CAPABLE(vha->hw))
Andrew Vasquez11bbc1d2009-06-03 09:55:14 -07003868 return QLA_FUNCTION_FAILED;
3869
Andrew Vasquez11bbc1d2009-06-03 09:55:14 -07003870 mcp->mb[0] = MBC_GET_DCBX_PARAMS;
3871 mcp->mb[1] = 0;
3872 mcp->mb[2] = MSW(tlv_dma);
3873 mcp->mb[3] = LSW(tlv_dma);
3874 mcp->mb[6] = MSW(MSD(tlv_dma));
3875 mcp->mb[7] = LSW(MSD(tlv_dma));
3876 mcp->mb[8] = size;
3877 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
3878 mcp->in_mb = MBX_2|MBX_1|MBX_0;
3879 mcp->tov = MBX_TOV_SECONDS;
3880 mcp->flags = 0;
3881 rval = qla2x00_mailbox_command(vha, mcp);
3882
3883 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003884 ql_dbg(ql_dbg_mbx, vha, 0x10f2,
3885 "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n",
3886 rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]);
Andrew Vasquez11bbc1d2009-06-03 09:55:14 -07003887 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003888 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f3,
3889 "Done %s.\n", __func__);
Andrew Vasquez11bbc1d2009-06-03 09:55:14 -07003890 }
3891
3892 return rval;
3893}
Andrew Vasquez18e75552009-06-03 09:55:30 -07003894
3895int
3896qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data)
3897{
3898 int rval;
3899 mbx_cmd_t mc;
3900 mbx_cmd_t *mcp = &mc;
3901
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003902 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f4,
3903 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003904
Andrew Vasquez18e75552009-06-03 09:55:30 -07003905 if (!IS_FWI2_CAPABLE(vha->hw))
3906 return QLA_FUNCTION_FAILED;
3907
Andrew Vasquez18e75552009-06-03 09:55:30 -07003908 mcp->mb[0] = MBC_READ_RAM_EXTENDED;
3909 mcp->mb[1] = LSW(risc_addr);
3910 mcp->mb[8] = MSW(risc_addr);
3911 mcp->out_mb = MBX_8|MBX_1|MBX_0;
3912 mcp->in_mb = MBX_3|MBX_2|MBX_0;
3913 mcp->tov = 30;
3914 mcp->flags = 0;
3915 rval = qla2x00_mailbox_command(vha, mcp);
3916 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003917 ql_dbg(ql_dbg_mbx, vha, 0x10f5,
3918 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez18e75552009-06-03 09:55:30 -07003919 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003920 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f6,
3921 "Done %s.\n", __func__);
Andrew Vasquez18e75552009-06-03 09:55:30 -07003922 *data = mcp->mb[3] << 16 | mcp->mb[2];
3923 }
3924
3925 return rval;
3926}
3927
3928int
Giridhar Malavalia9083012010-04-12 17:59:55 -07003929qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3930 uint16_t *mresp)
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003931{
3932 int rval;
3933 mbx_cmd_t mc;
3934 mbx_cmd_t *mcp = &mc;
3935 uint32_t iter_cnt = 0x1;
3936
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003937 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f7,
3938 "Entered %s.\n", __func__);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003939
3940 memset(mcp->mb, 0 , sizeof(mcp->mb));
3941 mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK;
3942 mcp->mb[1] = mreq->options | BIT_6; // BIT_6 specifies 64 bit addressing
3943
3944 /* transfer count */
3945 mcp->mb[10] = LSW(mreq->transfer_size);
3946 mcp->mb[11] = MSW(mreq->transfer_size);
3947
3948 /* send data address */
3949 mcp->mb[14] = LSW(mreq->send_dma);
3950 mcp->mb[15] = MSW(mreq->send_dma);
3951 mcp->mb[20] = LSW(MSD(mreq->send_dma));
3952 mcp->mb[21] = MSW(MSD(mreq->send_dma));
3953
Lucas De Marchi25985ed2011-03-30 22:57:33 -03003954 /* receive data address */
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003955 mcp->mb[16] = LSW(mreq->rcv_dma);
3956 mcp->mb[17] = MSW(mreq->rcv_dma);
3957 mcp->mb[6] = LSW(MSD(mreq->rcv_dma));
3958 mcp->mb[7] = MSW(MSD(mreq->rcv_dma));
3959
3960 /* Iteration count */
3961 mcp->mb[18] = LSW(iter_cnt);
3962 mcp->mb[19] = MSW(iter_cnt);
3963
3964 mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15|
3965 MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08003966 if (IS_CNA_CAPABLE(vha->hw))
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003967 mcp->out_mb |= MBX_2;
3968 mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0;
3969
3970 mcp->buf_size = mreq->transfer_size;
3971 mcp->tov = MBX_TOV_SECONDS;
3972 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
3973
3974 rval = qla2x00_mailbox_command(vha, mcp);
3975
3976 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07003977 ql_dbg(ql_dbg_mbx, vha, 0x10f8,
3978 "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x mb[3]=%x mb[18]=%x "
3979 "mb[19]=%x.\n", rval, mcp->mb[0], mcp->mb[1], mcp->mb[2],
3980 mcp->mb[3], mcp->mb[18], mcp->mb[19]);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003981 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04003982 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10f9,
3983 "Done %s.\n", __func__);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003984 }
3985
3986 /* Copy mailbox information */
3987 memcpy( mresp, mcp->mb, 64);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003988 return rval;
3989}
3990
3991int
Giridhar Malavalia9083012010-04-12 17:59:55 -07003992qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3993 uint16_t *mresp)
Giridhar Malavali9a069e12010-01-12 13:02:47 -08003994{
3995 int rval;
3996 mbx_cmd_t mc;
3997 mbx_cmd_t *mcp = &mc;
3998 struct qla_hw_data *ha = vha->hw;
3999
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004000 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10fa,
4001 "Entered %s.\n", __func__);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004002
4003 memset(mcp->mb, 0 , sizeof(mcp->mb));
4004 mcp->mb[0] = MBC_DIAGNOSTIC_ECHO;
4005 mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004006 if (IS_CNA_CAPABLE(ha)) {
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004007 mcp->mb[1] |= BIT_15;
Giridhar Malavalia9083012010-04-12 17:59:55 -07004008 mcp->mb[2] = vha->fcoe_fcf_idx;
4009 }
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004010 mcp->mb[16] = LSW(mreq->rcv_dma);
4011 mcp->mb[17] = MSW(mreq->rcv_dma);
4012 mcp->mb[6] = LSW(MSD(mreq->rcv_dma));
4013 mcp->mb[7] = MSW(MSD(mreq->rcv_dma));
4014
4015 mcp->mb[10] = LSW(mreq->transfer_size);
4016
4017 mcp->mb[14] = LSW(mreq->send_dma);
4018 mcp->mb[15] = MSW(mreq->send_dma);
4019 mcp->mb[20] = LSW(MSD(mreq->send_dma));
4020 mcp->mb[21] = MSW(MSD(mreq->send_dma));
4021
4022 mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15|
4023 MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004024 if (IS_CNA_CAPABLE(ha))
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004025 mcp->out_mb |= MBX_2;
4026
4027 mcp->in_mb = MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004028 if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) ||
4029 IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004030 mcp->in_mb |= MBX_1;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004031 if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004032 mcp->in_mb |= MBX_3;
4033
4034 mcp->tov = MBX_TOV_SECONDS;
4035 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
4036 mcp->buf_size = mreq->transfer_size;
4037
4038 rval = qla2x00_mailbox_command(vha, mcp);
4039
4040 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004041 ql_dbg(ql_dbg_mbx, vha, 0x10fb,
4042 "Failed=%x mb[0]=%x mb[1]=%x.\n",
4043 rval, mcp->mb[0], mcp->mb[1]);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004044 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004045 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10fc,
4046 "Done %s.\n", __func__);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004047 }
4048
4049 /* Copy mailbox information */
Giridhar Malavali6dbdda42010-09-03 15:20:49 -07004050 memcpy(mresp, mcp->mb, 64);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004051 return rval;
4052}
Giridhar Malavali6dbdda42010-09-03 15:20:49 -07004053
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004054int
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004055qla84xx_reset_chip(scsi_qla_host_t *vha, uint16_t enable_diagnostic)
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004056{
4057 int rval;
4058 mbx_cmd_t mc;
4059 mbx_cmd_t *mcp = &mc;
4060
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004061 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10fd,
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004062 "Entered %s enable_diag=%d.\n", __func__, enable_diagnostic);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004063
4064 mcp->mb[0] = MBC_ISP84XX_RESET;
4065 mcp->mb[1] = enable_diagnostic;
4066 mcp->out_mb = MBX_1|MBX_0;
4067 mcp->in_mb = MBX_1|MBX_0;
4068 mcp->tov = MBX_TOV_SECONDS;
4069 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004070 rval = qla2x00_mailbox_command(vha, mcp);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004071
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004072 if (rval != QLA_SUCCESS)
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004073 ql_dbg(ql_dbg_mbx, vha, 0x10fe, "Failed=%x.\n", rval);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004074 else
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004075 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ff,
4076 "Done %s.\n", __func__);
Giridhar Malavali9a069e12010-01-12 13:02:47 -08004077
4078 return rval;
4079}
4080
4081int
Andrew Vasquez18e75552009-06-03 09:55:30 -07004082qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data)
4083{
4084 int rval;
4085 mbx_cmd_t mc;
4086 mbx_cmd_t *mcp = &mc;
4087
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004088 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1100,
4089 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004090
Andrew Vasquez18e75552009-06-03 09:55:30 -07004091 if (!IS_FWI2_CAPABLE(vha->hw))
Andrew Vasquez6c452a42010-03-19 17:04:02 -07004092 return QLA_FUNCTION_FAILED;
Andrew Vasquez18e75552009-06-03 09:55:30 -07004093
Andrew Vasquez18e75552009-06-03 09:55:30 -07004094 mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED;
4095 mcp->mb[1] = LSW(risc_addr);
4096 mcp->mb[2] = LSW(data);
4097 mcp->mb[3] = MSW(data);
4098 mcp->mb[8] = MSW(risc_addr);
4099 mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0;
4100 mcp->in_mb = MBX_0;
4101 mcp->tov = 30;
4102 mcp->flags = 0;
4103 rval = qla2x00_mailbox_command(vha, mcp);
4104 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004105 ql_dbg(ql_dbg_mbx, vha, 0x1101,
4106 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Andrew Vasquez18e75552009-06-03 09:55:30 -07004107 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004108 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1102,
4109 "Done %s.\n", __func__);
Andrew Vasquez18e75552009-06-03 09:55:30 -07004110 }
4111
4112 return rval;
4113}
Michael Hernandez3064ff32009-12-15 21:29:44 -08004114
4115int
Madhuranath Iyengarb1d46982010-09-03 15:20:54 -07004116qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb)
4117{
4118 int rval;
4119 uint32_t stat, timer;
4120 uint16_t mb0 = 0;
4121 struct qla_hw_data *ha = vha->hw;
4122 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
4123
4124 rval = QLA_SUCCESS;
4125
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004126 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1103,
4127 "Entered %s.\n", __func__);
Madhuranath Iyengarb1d46982010-09-03 15:20:54 -07004128
4129 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
4130
4131 /* Write the MBC data to the registers */
4132 WRT_REG_WORD(&reg->mailbox0, MBC_WRITE_MPI_REGISTER);
4133 WRT_REG_WORD(&reg->mailbox1, mb[0]);
4134 WRT_REG_WORD(&reg->mailbox2, mb[1]);
4135 WRT_REG_WORD(&reg->mailbox3, mb[2]);
4136 WRT_REG_WORD(&reg->mailbox4, mb[3]);
4137
4138 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
4139
4140 /* Poll for MBC interrupt */
4141 for (timer = 6000000; timer; timer--) {
4142 /* Check for pending interrupts. */
4143 stat = RD_REG_DWORD(&reg->host_status);
4144 if (stat & HSRX_RISC_INT) {
4145 stat &= 0xff;
4146
4147 if (stat == 0x1 || stat == 0x2 ||
4148 stat == 0x10 || stat == 0x11) {
4149 set_bit(MBX_INTERRUPT,
4150 &ha->mbx_cmd_flags);
4151 mb0 = RD_REG_WORD(&reg->mailbox0);
4152 WRT_REG_DWORD(&reg->hccr,
4153 HCCRX_CLR_RISC_INT);
4154 RD_REG_DWORD(&reg->hccr);
4155 break;
4156 }
4157 }
4158 udelay(5);
4159 }
4160
4161 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags))
4162 rval = mb0 & MBS_MASK;
4163 else
4164 rval = QLA_FUNCTION_FAILED;
4165
4166 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004167 ql_dbg(ql_dbg_mbx, vha, 0x1104,
4168 "Failed=%x mb[0]=%x.\n", rval, mb[0]);
Madhuranath Iyengarb1d46982010-09-03 15:20:54 -07004169 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004170 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1105,
4171 "Done %s.\n", __func__);
Madhuranath Iyengarb1d46982010-09-03 15:20:54 -07004172 }
4173
4174 return rval;
4175}
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004176
Madhuranath Iyengarb1d46982010-09-03 15:20:54 -07004177int
Michael Hernandez3064ff32009-12-15 21:29:44 -08004178qla2x00_get_data_rate(scsi_qla_host_t *vha)
4179{
4180 int rval;
4181 mbx_cmd_t mc;
4182 mbx_cmd_t *mcp = &mc;
4183 struct qla_hw_data *ha = vha->hw;
4184
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004185 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1106,
4186 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004187
Michael Hernandez3064ff32009-12-15 21:29:44 -08004188 if (!IS_FWI2_CAPABLE(ha))
4189 return QLA_FUNCTION_FAILED;
4190
Michael Hernandez3064ff32009-12-15 21:29:44 -08004191 mcp->mb[0] = MBC_DATA_RATE;
4192 mcp->mb[1] = 0;
4193 mcp->out_mb = MBX_1|MBX_0;
4194 mcp->in_mb = MBX_2|MBX_1|MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004195 if (IS_QLA83XX(ha))
4196 mcp->in_mb |= MBX_3;
Michael Hernandez3064ff32009-12-15 21:29:44 -08004197 mcp->tov = MBX_TOV_SECONDS;
4198 mcp->flags = 0;
4199 rval = qla2x00_mailbox_command(vha, mcp);
4200 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004201 ql_dbg(ql_dbg_mbx, vha, 0x1107,
4202 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Michael Hernandez3064ff32009-12-15 21:29:44 -08004203 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004204 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1108,
4205 "Done %s.\n", __func__);
Michael Hernandez3064ff32009-12-15 21:29:44 -08004206 if (mcp->mb[1] != 0x7)
4207 ha->link_data_rate = mcp->mb[1];
4208 }
4209
4210 return rval;
4211}
Sarang Radke09ff7012010-03-19 17:03:59 -07004212
4213int
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004214qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb)
4215{
4216 int rval;
4217 mbx_cmd_t mc;
4218 mbx_cmd_t *mcp = &mc;
4219 struct qla_hw_data *ha = vha->hw;
4220
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004221 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1109,
4222 "Entered %s.\n", __func__);
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004223
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004224 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004225 return QLA_FUNCTION_FAILED;
4226 mcp->mb[0] = MBC_GET_PORT_CONFIG;
4227 mcp->out_mb = MBX_0;
4228 mcp->in_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4229 mcp->tov = MBX_TOV_SECONDS;
4230 mcp->flags = 0;
4231
4232 rval = qla2x00_mailbox_command(vha, mcp);
4233
4234 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004235 ql_dbg(ql_dbg_mbx, vha, 0x110a,
4236 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004237 } else {
4238 /* Copy all bits to preserve original value */
4239 memcpy(mb, &mcp->mb[1], sizeof(uint16_t) * 4);
4240
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004241 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110b,
4242 "Done %s.\n", __func__);
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004243 }
4244 return rval;
4245}
4246
4247int
4248qla81xx_set_port_config(scsi_qla_host_t *vha, uint16_t *mb)
4249{
4250 int rval;
4251 mbx_cmd_t mc;
4252 mbx_cmd_t *mcp = &mc;
4253
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004254 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110c,
4255 "Entered %s.\n", __func__);
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004256
4257 mcp->mb[0] = MBC_SET_PORT_CONFIG;
4258 /* Copy all bits to preserve original setting */
4259 memcpy(&mcp->mb[1], mb, sizeof(uint16_t) * 4);
4260 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4261 mcp->in_mb = MBX_0;
4262 mcp->tov = MBX_TOV_SECONDS;
4263 mcp->flags = 0;
4264 rval = qla2x00_mailbox_command(vha, mcp);
4265
4266 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004267 ql_dbg(ql_dbg_mbx, vha, 0x110d,
4268 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004269 } else
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004270 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110e,
4271 "Done %s.\n", __func__);
Sarang Radke23f2ebd2010-05-28 15:08:21 -07004272
4273 return rval;
4274}
4275
4276
4277int
Sarang Radke09ff7012010-03-19 17:03:59 -07004278qla24xx_set_fcp_prio(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t priority,
4279 uint16_t *mb)
4280{
4281 int rval;
4282 mbx_cmd_t mc;
4283 mbx_cmd_t *mcp = &mc;
4284 struct qla_hw_data *ha = vha->hw;
4285
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004286 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x110f,
4287 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004288
Sarang Radke09ff7012010-03-19 17:03:59 -07004289 if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha))
4290 return QLA_FUNCTION_FAILED;
4291
Sarang Radke09ff7012010-03-19 17:03:59 -07004292 mcp->mb[0] = MBC_PORT_PARAMS;
4293 mcp->mb[1] = loop_id;
4294 if (ha->flags.fcp_prio_enabled)
4295 mcp->mb[2] = BIT_1;
4296 else
4297 mcp->mb[2] = BIT_2;
4298 mcp->mb[4] = priority & 0xf;
4299 mcp->mb[9] = vha->vp_idx;
4300 mcp->out_mb = MBX_9|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4301 mcp->in_mb = MBX_4|MBX_3|MBX_1|MBX_0;
4302 mcp->tov = 30;
4303 mcp->flags = 0;
4304 rval = qla2x00_mailbox_command(vha, mcp);
4305 if (mb != NULL) {
4306 mb[0] = mcp->mb[0];
4307 mb[1] = mcp->mb[1];
4308 mb[3] = mcp->mb[3];
4309 mb[4] = mcp->mb[4];
4310 }
4311
4312 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004313 ql_dbg(ql_dbg_mbx, vha, 0x10cd, "Failed=%x.\n", rval);
Sarang Radke09ff7012010-03-19 17:03:59 -07004314 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004315 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10cc,
4316 "Done %s.\n", __func__);
Sarang Radke09ff7012010-03-19 17:03:59 -07004317 }
4318
4319 return rval;
4320}
Giridhar Malavalia9083012010-04-12 17:59:55 -07004321
4322int
Andrew Vasquez794a5692010-12-21 16:00:21 -08004323qla2x00_get_thermal_temp(scsi_qla_host_t *vha, uint16_t *temp, uint16_t *frac)
4324{
4325 int rval;
Joe Carnuccio6ad11ea2011-05-10 11:30:16 -07004326 uint8_t byte;
Andrew Vasquez794a5692010-12-21 16:00:21 -08004327 struct qla_hw_data *ha = vha->hw;
4328
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004329 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ca,
4330 "Entered %s.\n", __func__);
Andrew Vasquez794a5692010-12-21 16:00:21 -08004331
Joe Carnuccio6ad11ea2011-05-10 11:30:16 -07004332 /* Integer part */
4333 rval = qla2x00_read_sfp(vha, 0, &byte, 0x98, 0x01, 1, BIT_13|BIT_0);
Andrew Vasquez794a5692010-12-21 16:00:21 -08004334 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004335 ql_dbg(ql_dbg_mbx, vha, 0x10c9, "Failed=%x.\n", rval);
Andrew Vasquez794a5692010-12-21 16:00:21 -08004336 ha->flags.thermal_supported = 0;
4337 goto fail;
4338 }
Joe Carnuccio6ad11ea2011-05-10 11:30:16 -07004339 *temp = byte;
Andrew Vasquez794a5692010-12-21 16:00:21 -08004340
Joe Carnuccio6ad11ea2011-05-10 11:30:16 -07004341 /* Fraction part */
4342 rval = qla2x00_read_sfp(vha, 0, &byte, 0x98, 0x10, 1, BIT_13|BIT_0);
Andrew Vasquez794a5692010-12-21 16:00:21 -08004343 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004344 ql_dbg(ql_dbg_mbx, vha, 0x1019, "Failed=%x.\n", rval);
Andrew Vasquez794a5692010-12-21 16:00:21 -08004345 ha->flags.thermal_supported = 0;
4346 goto fail;
4347 }
Joe Carnuccio6ad11ea2011-05-10 11:30:16 -07004348 *frac = (byte >> 6) * 25;
Andrew Vasquez794a5692010-12-21 16:00:21 -08004349
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004350 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1018,
4351 "Done %s.\n", __func__);
Andrew Vasquez794a5692010-12-21 16:00:21 -08004352fail:
4353 return rval;
4354}
4355
4356int
Giridhar Malavalia9083012010-04-12 17:59:55 -07004357qla82xx_mbx_intr_enable(scsi_qla_host_t *vha)
4358{
4359 int rval;
4360 struct qla_hw_data *ha = vha->hw;
4361 mbx_cmd_t mc;
4362 mbx_cmd_t *mcp = &mc;
4363
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004364 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1017,
4365 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004366
Giridhar Malavalia9083012010-04-12 17:59:55 -07004367 if (!IS_FWI2_CAPABLE(ha))
4368 return QLA_FUNCTION_FAILED;
4369
Giridhar Malavalia9083012010-04-12 17:59:55 -07004370 memset(mcp, 0, sizeof(mbx_cmd_t));
Giridhar Malavali37113332010-07-23 15:28:34 +05004371 mcp->mb[0] = MBC_TOGGLE_INTERRUPT;
Giridhar Malavalia9083012010-04-12 17:59:55 -07004372 mcp->mb[1] = 1;
4373
4374 mcp->out_mb = MBX_1|MBX_0;
4375 mcp->in_mb = MBX_0;
4376 mcp->tov = 30;
4377 mcp->flags = 0;
4378
4379 rval = qla2x00_mailbox_command(vha, mcp);
4380 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004381 ql_dbg(ql_dbg_mbx, vha, 0x1016,
4382 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Giridhar Malavalia9083012010-04-12 17:59:55 -07004383 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004384 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100e,
4385 "Done %s.\n", __func__);
Giridhar Malavalia9083012010-04-12 17:59:55 -07004386 }
4387
4388 return rval;
4389}
4390
4391int
4392qla82xx_mbx_intr_disable(scsi_qla_host_t *vha)
4393{
4394 int rval;
4395 struct qla_hw_data *ha = vha->hw;
4396 mbx_cmd_t mc;
4397 mbx_cmd_t *mcp = &mc;
4398
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004399 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100d,
4400 "Entered %s.\n", __func__);
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004401
Giridhar Malavalia9083012010-04-12 17:59:55 -07004402 if (!IS_QLA82XX(ha))
4403 return QLA_FUNCTION_FAILED;
4404
Giridhar Malavalia9083012010-04-12 17:59:55 -07004405 memset(mcp, 0, sizeof(mbx_cmd_t));
Giridhar Malavali37113332010-07-23 15:28:34 +05004406 mcp->mb[0] = MBC_TOGGLE_INTERRUPT;
Giridhar Malavalia9083012010-04-12 17:59:55 -07004407 mcp->mb[1] = 0;
4408
4409 mcp->out_mb = MBX_1|MBX_0;
4410 mcp->in_mb = MBX_0;
4411 mcp->tov = 30;
4412 mcp->flags = 0;
4413
4414 rval = qla2x00_mailbox_command(vha, mcp);
4415 if (rval != QLA_SUCCESS) {
Saurav Kashyap7c3df132011-07-14 12:00:13 -07004416 ql_dbg(ql_dbg_mbx, vha, 0x100c,
4417 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
Giridhar Malavalia9083012010-04-12 17:59:55 -07004418 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004419 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100b,
4420 "Done %s.\n", __func__);
Giridhar Malavalia9083012010-04-12 17:59:55 -07004421 }
4422
4423 return rval;
4424}
Giridhar Malavali08de2842011-08-16 11:31:44 -07004425
4426int
4427qla82xx_md_get_template_size(scsi_qla_host_t *vha)
4428{
4429 struct qla_hw_data *ha = vha->hw;
4430 mbx_cmd_t mc;
4431 mbx_cmd_t *mcp = &mc;
4432 int rval = QLA_FUNCTION_FAILED;
4433
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004434 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x111f,
4435 "Entered %s.\n", __func__);
Giridhar Malavali08de2842011-08-16 11:31:44 -07004436
4437 memset(mcp->mb, 0 , sizeof(mcp->mb));
4438 mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
4439 mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
4440 mcp->mb[2] = LSW(RQST_TMPLT_SIZE);
4441 mcp->mb[3] = MSW(RQST_TMPLT_SIZE);
4442
4443 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
4444 mcp->in_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|
4445 MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4446
4447 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
4448 mcp->tov = MBX_TOV_SECONDS;
4449 rval = qla2x00_mailbox_command(vha, mcp);
4450
4451 /* Always copy back return mailbox values. */
4452 if (rval != QLA_SUCCESS) {
4453 ql_dbg(ql_dbg_mbx, vha, 0x1120,
4454 "mailbox command FAILED=0x%x, subcode=%x.\n",
4455 (mcp->mb[1] << 16) | mcp->mb[0],
4456 (mcp->mb[3] << 16) | mcp->mb[2]);
4457 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004458 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1121,
4459 "Done %s.\n", __func__);
Giridhar Malavali08de2842011-08-16 11:31:44 -07004460 ha->md_template_size = ((mcp->mb[3] << 16) | mcp->mb[2]);
4461 if (!ha->md_template_size) {
4462 ql_dbg(ql_dbg_mbx, vha, 0x1122,
4463 "Null template size obtained.\n");
4464 rval = QLA_FUNCTION_FAILED;
4465 }
4466 }
4467 return rval;
4468}
4469
4470int
4471qla82xx_md_get_template(scsi_qla_host_t *vha)
4472{
4473 struct qla_hw_data *ha = vha->hw;
4474 mbx_cmd_t mc;
4475 mbx_cmd_t *mcp = &mc;
4476 int rval = QLA_FUNCTION_FAILED;
4477
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004478 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1123,
4479 "Entered %s.\n", __func__);
Giridhar Malavali08de2842011-08-16 11:31:44 -07004480
4481 ha->md_tmplt_hdr = dma_alloc_coherent(&ha->pdev->dev,
4482 ha->md_template_size, &ha->md_tmplt_hdr_dma, GFP_KERNEL);
4483 if (!ha->md_tmplt_hdr) {
4484 ql_log(ql_log_warn, vha, 0x1124,
4485 "Unable to allocate memory for Minidump template.\n");
4486 return rval;
4487 }
4488
4489 memset(mcp->mb, 0 , sizeof(mcp->mb));
4490 mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
4491 mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
4492 mcp->mb[2] = LSW(RQST_TMPLT);
4493 mcp->mb[3] = MSW(RQST_TMPLT);
4494 mcp->mb[4] = LSW(LSD(ha->md_tmplt_hdr_dma));
4495 mcp->mb[5] = MSW(LSD(ha->md_tmplt_hdr_dma));
4496 mcp->mb[6] = LSW(MSD(ha->md_tmplt_hdr_dma));
4497 mcp->mb[7] = MSW(MSD(ha->md_tmplt_hdr_dma));
4498 mcp->mb[8] = LSW(ha->md_template_size);
4499 mcp->mb[9] = MSW(ha->md_template_size);
4500
4501 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
4502 mcp->tov = MBX_TOV_SECONDS;
4503 mcp->out_mb = MBX_11|MBX_10|MBX_9|MBX_8|
4504 MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4505 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
4506 rval = qla2x00_mailbox_command(vha, mcp);
4507
4508 if (rval != QLA_SUCCESS) {
4509 ql_dbg(ql_dbg_mbx, vha, 0x1125,
4510 "mailbox command FAILED=0x%x, subcode=%x.\n",
4511 ((mcp->mb[1] << 16) | mcp->mb[0]),
4512 ((mcp->mb[3] << 16) | mcp->mb[2]));
4513 } else
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004514 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1126,
4515 "Done %s.\n", __func__);
Giridhar Malavali08de2842011-08-16 11:31:44 -07004516 return rval;
4517}
Saurav Kashyap999916d2011-08-16 11:31:45 -07004518
4519int
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004520qla81xx_set_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
4521{
4522 int rval;
4523 struct qla_hw_data *ha = vha->hw;
4524 mbx_cmd_t mc;
4525 mbx_cmd_t *mcp = &mc;
4526
4527 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
4528 return QLA_FUNCTION_FAILED;
4529
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004530 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1133,
4531 "Entered %s.\n", __func__);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004532
4533 memset(mcp, 0, sizeof(mbx_cmd_t));
4534 mcp->mb[0] = MBC_SET_LED_CONFIG;
4535 mcp->mb[1] = led_cfg[0];
4536 mcp->mb[2] = led_cfg[1];
4537 if (IS_QLA8031(ha)) {
4538 mcp->mb[3] = led_cfg[2];
4539 mcp->mb[4] = led_cfg[3];
4540 mcp->mb[5] = led_cfg[4];
4541 mcp->mb[6] = led_cfg[5];
4542 }
4543
4544 mcp->out_mb = MBX_2|MBX_1|MBX_0;
4545 if (IS_QLA8031(ha))
4546 mcp->out_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
4547 mcp->in_mb = MBX_0;
4548 mcp->tov = 30;
4549 mcp->flags = 0;
4550
4551 rval = qla2x00_mailbox_command(vha, mcp);
4552 if (rval != QLA_SUCCESS) {
4553 ql_dbg(ql_dbg_mbx, vha, 0x1134,
4554 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4555 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004556 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1135,
4557 "Done %s.\n", __func__);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004558 }
4559
4560 return rval;
4561}
4562
4563int
4564qla81xx_get_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
4565{
4566 int rval;
4567 struct qla_hw_data *ha = vha->hw;
4568 mbx_cmd_t mc;
4569 mbx_cmd_t *mcp = &mc;
4570
4571 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
4572 return QLA_FUNCTION_FAILED;
4573
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004574 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1136,
4575 "Entered %s.\n", __func__);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004576
4577 memset(mcp, 0, sizeof(mbx_cmd_t));
4578 mcp->mb[0] = MBC_GET_LED_CONFIG;
4579
4580 mcp->out_mb = MBX_0;
4581 mcp->in_mb = MBX_2|MBX_1|MBX_0;
4582 if (IS_QLA8031(ha))
4583 mcp->in_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
4584 mcp->tov = 30;
4585 mcp->flags = 0;
4586
4587 rval = qla2x00_mailbox_command(vha, mcp);
4588 if (rval != QLA_SUCCESS) {
4589 ql_dbg(ql_dbg_mbx, vha, 0x1137,
4590 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4591 } else {
4592 led_cfg[0] = mcp->mb[1];
4593 led_cfg[1] = mcp->mb[2];
4594 if (IS_QLA8031(ha)) {
4595 led_cfg[2] = mcp->mb[3];
4596 led_cfg[3] = mcp->mb[4];
4597 led_cfg[4] = mcp->mb[5];
4598 led_cfg[5] = mcp->mb[6];
4599 }
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004600 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1138,
4601 "Done %s.\n", __func__);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004602 }
4603
4604 return rval;
4605}
4606
4607int
Saurav Kashyap999916d2011-08-16 11:31:45 -07004608qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable)
4609{
4610 int rval;
4611 struct qla_hw_data *ha = vha->hw;
4612 mbx_cmd_t mc;
4613 mbx_cmd_t *mcp = &mc;
4614
4615 if (!IS_QLA82XX(ha))
4616 return QLA_FUNCTION_FAILED;
4617
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004618 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1127,
Saurav Kashyap999916d2011-08-16 11:31:45 -07004619 "Entered %s.\n", __func__);
4620
4621 memset(mcp, 0, sizeof(mbx_cmd_t));
4622 mcp->mb[0] = MBC_SET_LED_CONFIG;
4623 if (enable)
4624 mcp->mb[7] = 0xE;
4625 else
4626 mcp->mb[7] = 0xD;
4627
4628 mcp->out_mb = MBX_7|MBX_0;
4629 mcp->in_mb = MBX_0;
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004630 mcp->tov = MBX_TOV_SECONDS;
Saurav Kashyap999916d2011-08-16 11:31:45 -07004631 mcp->flags = 0;
4632
4633 rval = qla2x00_mailbox_command(vha, mcp);
4634 if (rval != QLA_SUCCESS) {
4635 ql_dbg(ql_dbg_mbx, vha, 0x1128,
4636 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4637 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004638 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1129,
Saurav Kashyap999916d2011-08-16 11:31:45 -07004639 "Done %s.\n", __func__);
4640 }
4641
4642 return rval;
4643}
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004644
4645int
4646qla83xx_write_remote_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data)
4647{
4648 int rval;
4649 struct qla_hw_data *ha = vha->hw;
4650 mbx_cmd_t mc;
4651 mbx_cmd_t *mcp = &mc;
4652
4653 if (!IS_QLA83XX(ha))
4654 return QLA_FUNCTION_FAILED;
4655
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004656 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1130,
4657 "Entered %s.\n", __func__);
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004658
4659 mcp->mb[0] = MBC_WRITE_REMOTE_REG;
4660 mcp->mb[1] = LSW(reg);
4661 mcp->mb[2] = MSW(reg);
4662 mcp->mb[3] = LSW(data);
4663 mcp->mb[4] = MSW(data);
4664 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4665
4666 mcp->in_mb = MBX_1|MBX_0;
4667 mcp->tov = MBX_TOV_SECONDS;
4668 mcp->flags = 0;
4669 rval = qla2x00_mailbox_command(vha, mcp);
4670
4671 if (rval != QLA_SUCCESS) {
4672 ql_dbg(ql_dbg_mbx, vha, 0x1131,
4673 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4674 } else {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004675 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1132,
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004676 "Done %s.\n", __func__);
4677 }
Andrew Vasquezaf11f642012-02-09 11:15:43 -08004678
Giridhar Malavali6246b8a2012-02-09 11:15:34 -08004679 return rval;
4680}
Andrew Vasquezaf11f642012-02-09 11:15:43 -08004681
4682int
4683qla2x00_port_logout(scsi_qla_host_t *vha, struct fc_port *fcport)
4684{
4685 int rval;
4686 struct qla_hw_data *ha = vha->hw;
4687 mbx_cmd_t mc;
4688 mbx_cmd_t *mcp = &mc;
4689
4690 if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004691 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x113b,
Andrew Vasquezaf11f642012-02-09 11:15:43 -08004692 "Implicit LOGO Unsupported.\n");
4693 return QLA_FUNCTION_FAILED;
4694 }
4695
4696
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004697 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x113c,
4698 "Entering %s.\n", __func__);
Andrew Vasquezaf11f642012-02-09 11:15:43 -08004699
4700 /* Perform Implicit LOGO. */
4701 mcp->mb[0] = MBC_PORT_LOGOUT;
4702 mcp->mb[1] = fcport->loop_id;
4703 mcp->mb[10] = BIT_15;
4704 mcp->out_mb = MBX_10|MBX_1|MBX_0;
4705 mcp->in_mb = MBX_0;
4706 mcp->tov = MBX_TOV_SECONDS;
4707 mcp->flags = 0;
4708 rval = qla2x00_mailbox_command(vha, mcp);
4709 if (rval != QLA_SUCCESS)
4710 ql_dbg(ql_dbg_mbx, vha, 0x113d,
4711 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4712 else
Saurav Kashyap5f28d2d2012-05-15 14:34:15 -04004713 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x113e,
4714 "Done %s.\n", __func__);
Andrew Vasquezaf11f642012-02-09 11:15:43 -08004715
4716 return rval;
4717}
4718