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