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