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